From 931ad1e7f69f88ee20bd06b6e283e0d5628a9582 Mon Sep 17 00:00:00 2001 From: ImplicitSaber Date: Wed, 23 Oct 2024 18:48:20 -0500 Subject: [PATCH] More Connector compatibility --- gradle.properties | 2 +- .../forkcart/ForkcartClient.java | 10 ++++ .../entity/TrackTiesBlockEntityRenderer.java | 11 ++++ .../ForkcartClientMixinPlugin.java | 53 +++++++++++++++++++ .../mixin/client/CameraMixinForge.java | 50 +++++++++++++++++ .../mixin/client/GameRendererMixin.java | 7 ++- .../resources/forkcart.client.mixins.json | 8 +-- .../implicitsaber/forkcart/Forkcart.java | 4 +- .../{ForgeFixes.java => ForgeHelper.java} | 4 +- .../resources/assets/forkcart/lang/en_us.json | 4 +- 10 files changed, 139 insertions(+), 14 deletions(-) create mode 100644 src/client/java/io/github/implicitsaber/forkcart/clientmixinconfig/ForkcartClientMixinPlugin.java create mode 100644 src/client/java/io/github/implicitsaber/forkcart/mixin/client/CameraMixinForge.java rename src/main/java/io/github/implicitsaber/forkcart/util/{ForgeFixes.java => ForgeHelper.java} (90%) diff --git a/gradle.properties b/gradle.properties index 11ed8db..6e31d94 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,7 +9,7 @@ yarn_mappings=1.20.1+build.10 loader_version=0.15.11 # Mod Properties -mod_version=1.20.1-1.1.0-fix1 +mod_version=1.20.1-1.1.0-fix2 maven_group=io.github.implicitsaber archives_base_name=forkcart diff --git a/src/client/java/io/github/implicitsaber/forkcart/ForkcartClient.java b/src/client/java/io/github/implicitsaber/forkcart/ForkcartClient.java index d1c642d..37affc7 100644 --- a/src/client/java/io/github/implicitsaber/forkcart/ForkcartClient.java +++ b/src/client/java/io/github/implicitsaber/forkcart/ForkcartClient.java @@ -4,15 +4,19 @@ import io.github.implicitsaber.forkcart.block.entity.TrackTiesBlockEntityRenderer; import io.github.implicitsaber.forkcart.config.Config; import io.github.implicitsaber.forkcart.config.ConfigOption; +import io.github.implicitsaber.forkcart.util.ForgeHelper; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap; import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents; import net.fabricmc.fabric.api.client.rendering.v1.EntityRendererRegistry; import net.fabricmc.loader.api.FabricLoader; import net.minecraft.client.render.RenderLayer; import net.minecraft.client.render.block.entity.BlockEntityRendererFactories; import net.minecraft.client.render.entity.EmptyEntityRenderer; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; import java.io.IOException; @@ -47,5 +51,11 @@ public void onInitializeClient() { .then(CONFIG.command(LiteralArgumentBuilder.literal("config"), FabricClientCommandSource::sendFeedback)) )); + + ClientPlayConnectionEvents.JOIN.register((handler, sender, client) -> { + if(ForgeHelper.isConnector()) { + client.inGameHud.getChatHud().addMessage(Text.translatable("forkcart.msg.connector").formatted(Formatting.RED)); + } + }); } } \ No newline at end of file diff --git a/src/client/java/io/github/implicitsaber/forkcart/block/entity/TrackTiesBlockEntityRenderer.java b/src/client/java/io/github/implicitsaber/forkcart/block/entity/TrackTiesBlockEntityRenderer.java index 259b8c5..8446cd9 100644 --- a/src/client/java/io/github/implicitsaber/forkcart/block/entity/TrackTiesBlockEntityRenderer.java +++ b/src/client/java/io/github/implicitsaber/forkcart/block/entity/TrackTiesBlockEntityRenderer.java @@ -16,6 +16,7 @@ import net.minecraft.util.Hand; import net.minecraft.util.Identifier; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Box; import net.minecraft.util.math.MathHelper; import net.minecraft.world.World; import org.joml.Matrix3d; @@ -23,6 +24,10 @@ import org.joml.Vector3f; public class TrackTiesBlockEntityRenderer implements BlockEntityRenderer { + + // Required for Connector on NeoForge to render this BE properly + public static final Box INFINITE_BOX = new Box(Double.NEGATIVE_INFINITY, Double.NEGATIVE_INFINITY, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, Double.POSITIVE_INFINITY, Double.POSITIVE_INFINITY); + public static final int WHITE = 0xFFFFFFFF; public static final Identifier CHAIN_TRACK_TEXTURE = Forkcart.id("textures/chain_track.png"); public static final Identifier STATION_TRACK_TEXTURE = Forkcart.id("textures/station_track.png"); @@ -159,6 +164,12 @@ public boolean rendersOutsideBoundingBox(TrackTiesBlockEntity blockEntity) { return true; } + // Required for Connector on NeoForge to render this BE properly + @SuppressWarnings("unused") + public Box getRenderBoundingBox(TrackTiesBlockEntity be) { + return INFINITE_BOX; + } + @Override public int getRenderDistance() { return ForkcartClient.CFG_TRACK_RENDER_DISTANCE.get() * 16; diff --git a/src/client/java/io/github/implicitsaber/forkcart/clientmixinconfig/ForkcartClientMixinPlugin.java b/src/client/java/io/github/implicitsaber/forkcart/clientmixinconfig/ForkcartClientMixinPlugin.java new file mode 100644 index 0000000..4ea6055 --- /dev/null +++ b/src/client/java/io/github/implicitsaber/forkcart/clientmixinconfig/ForkcartClientMixinPlugin.java @@ -0,0 +1,53 @@ +package io.github.implicitsaber.forkcart.clientmixinconfig; + +import net.fabricmc.loader.api.FabricLoader; +import org.objectweb.asm.tree.ClassNode; +import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; +import org.spongepowered.asm.mixin.extensibility.IMixinInfo; + +import java.util.List; +import java.util.Set; + +public class ForkcartClientMixinPlugin implements IMixinConfigPlugin { + + @Override + public void onLoad(String mixinPackage) { + + } + + @Override + public String getRefMapperConfig() { + return null; + } + + @Override + public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { + return switch(mixinClassName) { + case "io.github.implicitsaber.forkcart.mixin.client.GameRendererMixin", + "io.github.implicitsaber.forkcart.mixin.client.CameraMixin" -> !FabricLoader.getInstance().isModLoaded("connectormod"); + case "io.github.implicitsaber.forkcart.mixin.client.CameraMixinForge" -> FabricLoader.getInstance().isModLoaded("connectormod"); + default -> true; + }; + } + + @Override + public void acceptTargets(Set myTargets, Set otherTargets) { + + } + + @Override + public List getMixins() { + return null; + } + + @Override + public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { + + } + + @Override + public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { + + } + +} diff --git a/src/client/java/io/github/implicitsaber/forkcart/mixin/client/CameraMixinForge.java b/src/client/java/io/github/implicitsaber/forkcart/mixin/client/CameraMixinForge.java new file mode 100644 index 0000000..561a54e --- /dev/null +++ b/src/client/java/io/github/implicitsaber/forkcart/mixin/client/CameraMixinForge.java @@ -0,0 +1,50 @@ +package io.github.implicitsaber.forkcart.mixin.client; + +import com.llamalad7.mixinextras.sugar.Local; +import io.github.implicitsaber.forkcart.ForkcartClient; +import io.github.implicitsaber.forkcart.entity.TrackFollowerEntity; +import net.minecraft.client.render.Camera; +import net.minecraft.entity.Entity; +import net.minecraft.util.math.RotationAxis; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.BlockView; +import org.joml.Quaternionf; +import org.joml.Vector3d; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(Camera.class) +public abstract class CameraMixinForge { + @Shadow protected abstract void setPos(Vec3d pos); + + @Shadow @Final private Quaternionf rotation; + + @Inject(method = "update(Lnet/minecraft/world/BlockView;Lnet/minecraft/entity/Entity;ZZF)V", + at = @At(value = "INVOKE", shift = At.Shift.AFTER, ordinal = 0, target = "Lnet/minecraft/client/render/Camera;setPos(DDD)V")) + private void forkcart$updateCamPosWhileRiding(BlockView area, Entity self, boolean thirdPerson, boolean inverseView, float tickDelta, CallbackInfo info) { + var vehicle = self.getVehicle(); + if (vehicle != null) { + var tf = vehicle.getVehicle(); + if (tf instanceof TrackFollowerEntity trackFollower) { + var world = self.getWorld(); + var diff = self.getPos().add(0, self.getStandingEyeHeight(), 0).subtract(trackFollower.getPos()); + var camPos = new Vector3d(diff.getX(), diff.getY(), diff.getZ()); + if (world.isClient()) { + var rot = new Quaternionf(); + trackFollower.getClientOrientation(rot, tickDelta); + rot.transform(camPos); + + this.setPos(new Vec3d(camPos.x(), camPos.y(), camPos.z()).add(trackFollower.getLerpedPos(tickDelta))); + + // camera rotation is disabled due to glitches + } + } + } + } + +} diff --git a/src/client/java/io/github/implicitsaber/forkcart/mixin/client/GameRendererMixin.java b/src/client/java/io/github/implicitsaber/forkcart/mixin/client/GameRendererMixin.java index dcfd3db..c6215ae 100644 --- a/src/client/java/io/github/implicitsaber/forkcart/mixin/client/GameRendererMixin.java +++ b/src/client/java/io/github/implicitsaber/forkcart/mixin/client/GameRendererMixin.java @@ -1,7 +1,6 @@ package io.github.implicitsaber.forkcart.mixin.client; import com.llamalad7.mixinextras.sugar.Local; -import io.github.implicitsaber.forkcart.util.ForgeFixes; import net.minecraft.client.render.Camera; import net.minecraft.client.render.GameRenderer; import net.minecraft.client.util.math.MatrixStack; @@ -18,17 +17,17 @@ public class GameRendererMixin { @Inject(method = "renderWorld", at = @At(value = "INVOKE", shift = At.Shift.AFTER, target = "Lnet/minecraft/client/render/Camera;update(Lnet/minecraft/world/BlockView;Lnet/minecraft/entity/Entity;ZZF)V")) public void forkcart$quaternionRotate(float tickDelta, long limitTime, MatrixStack matrices, CallbackInfo ci, @Local Camera cam) { - if(!ForgeFixes.isConnector()) matrices.peek().getPositionMatrix().set(new Matrix4f().rotate(cam.getRotation().conjugate(new Quaternionf()))); + matrices.peek().getPositionMatrix().set(new Matrix4f().rotate(cam.getRotation().conjugate(new Quaternionf()))); } @Redirect(method = "renderWorld", at = @At(value = "INVOKE", ordinal = 2, target = "Lnet/minecraft/client/util/math/MatrixStack;multiply(Lorg/joml/Quaternionf;)V")) public void forkcart$noPitchYaw1(MatrixStack instance, Quaternionf quaternion) { - if(ForgeFixes.isConnector()) instance.multiply(quaternion); + // no-op } @Redirect(method = "renderWorld", at = @At(value = "INVOKE", ordinal = 3, target = "Lnet/minecraft/client/util/math/MatrixStack;multiply(Lorg/joml/Quaternionf;)V")) public void forkcart$noPitchYaw2(MatrixStack instance, Quaternionf quaternion) { - if(ForgeFixes.isConnector()) instance.multiply(quaternion); + // no-op } } diff --git a/src/client/resources/forkcart.client.mixins.json b/src/client/resources/forkcart.client.mixins.json index 23faea6..5e2504f 100644 --- a/src/client/resources/forkcart.client.mixins.json +++ b/src/client/resources/forkcart.client.mixins.json @@ -4,17 +4,17 @@ "compatibilityLevel": "JAVA_17", "client": [ "CameraMixin", + "CameraMixinForge", "ClientPlayNetworkHandlerMixin", "EntityRenderDispatcherMixin", + "GameRendererMixin", "InGameOverlayRendererMixin", "MinecartInsideSoundInstanceMixin", "MovingMinecartSoundInstanceMixin", "WorldRendererMixin" ], + "plugin": "io.github.implicitsaber.forkcart.clientmixinconfig.ForkcartClientMixinPlugin", "injectors": { "defaultRequire": 1 - }, - "mixins": [ - "GameRendererMixin" - ] + } } \ No newline at end of file diff --git a/src/main/java/io/github/implicitsaber/forkcart/Forkcart.java b/src/main/java/io/github/implicitsaber/forkcart/Forkcart.java index 97be13e..01d4b31 100644 --- a/src/main/java/io/github/implicitsaber/forkcart/Forkcart.java +++ b/src/main/java/io/github/implicitsaber/forkcart/Forkcart.java @@ -7,7 +7,7 @@ import io.github.implicitsaber.forkcart.entity.TrackFollowerEntity; import io.github.implicitsaber.forkcart.item.LoreBlockItem; import io.github.implicitsaber.forkcart.item.TrackItem; -import io.github.implicitsaber.forkcart.util.ForgeFixes; +import io.github.implicitsaber.forkcart.util.ForgeHelper; import net.fabricmc.api.ModInitializer; import net.fabricmc.fabric.api.itemgroup.v1.FabricItemGroup; import net.fabricmc.fabric.api.itemgroup.v1.ItemGroupEvents; @@ -81,7 +81,7 @@ public BlockRenderType getRenderType(BlockState state) { @Override public void onInitialize() { - if(ForgeFixes.isConnector()) LOGGER.warn("Forkcart is running on Sinytra Connector. Be prepared for unexpected behavior!"); + if(ForgeHelper.isConnector()) LOGGER.warn("Forkcart is running on Sinytra Connector. Be prepared for unexpected behavior!"); BlockItem tieItem = Registry.register(Registries.ITEM, id("track_ties"), new LoreBlockItem(TRACK_TIES, new Item.Settings(), List.of( diff --git a/src/main/java/io/github/implicitsaber/forkcart/util/ForgeFixes.java b/src/main/java/io/github/implicitsaber/forkcart/util/ForgeHelper.java similarity index 90% rename from src/main/java/io/github/implicitsaber/forkcart/util/ForgeFixes.java rename to src/main/java/io/github/implicitsaber/forkcart/util/ForgeHelper.java index 0ca3237..4ce1fb5 100644 --- a/src/main/java/io/github/implicitsaber/forkcart/util/ForgeFixes.java +++ b/src/main/java/io/github/implicitsaber/forkcart/util/ForgeHelper.java @@ -2,14 +2,14 @@ import net.fabricmc.loader.api.FabricLoader; -public class ForgeFixes { +public class ForgeHelper { private static boolean connector = false; private static boolean checked = false; public static boolean isConnector() { if(checked) return connector; - connector = FabricLoader.getInstance().isModLoaded("connector"); + connector = FabricLoader.getInstance().isModLoaded("connectormod"); checked = true; return connector; } diff --git a/src/main/resources/assets/forkcart/lang/en_us.json b/src/main/resources/assets/forkcart/lang/en_us.json index 3f251d8..6215815 100644 --- a/src/main/resources/assets/forkcart/lang/en_us.json +++ b/src/main/resources/assets/forkcart/lang/en_us.json @@ -33,5 +33,7 @@ "tag.item.forkcart.track": "Track", - "itemGroup.forkcart": "Forkcart" + "itemGroup.forkcart": "Forkcart", + + "forkcart.msg.connector": "Forkcart has detected that it is running in a Sinytra Connector instance pre-1.21. Camera rotation on tracks is disabled." } \ No newline at end of file