From fb7900d80502b93c18188a0d3a4f03527a23f2a2 Mon Sep 17 00:00:00 2001 From: Jonas Herzig Date: Mon, 28 Feb 2022 16:29:57 +0100 Subject: [PATCH] Fix missing hand with Iris 1.1.3 and above (fixes #638) --- .../core/ReplayModMixinConfigPlugin.java | 10 ++++++ .../mixin/Mixin_ShowSpectatedHand_Iris.java | 35 +++++++++++++++++++ .../resources/mixins.replay.replaymod.json | 1 + 3 files changed, 46 insertions(+) create mode 100644 src/main/java/com/replaymod/replay/mixin/Mixin_ShowSpectatedHand_Iris.java diff --git a/src/main/java/com/replaymod/core/ReplayModMixinConfigPlugin.java b/src/main/java/com/replaymod/core/ReplayModMixinConfigPlugin.java index 08259e21..443a21e0 100644 --- a/src/main/java/com/replaymod/core/ReplayModMixinConfigPlugin.java +++ b/src/main/java/com/replaymod/core/ReplayModMixinConfigPlugin.java @@ -9,6 +9,10 @@ import java.io.IOException; import java.util.List; import java.util.Set; +//#if FABRIC +import net.fabricmc.loader.api.FabricLoader; +//#endif + //#if MC>=11400 import java.io.InputStream; //#else @@ -34,6 +38,9 @@ public class ReplayModMixinConfigPlugin implements IMixinConfigPlugin { private final Logger logger = LogManager.getLogger("replaymod/mixin"); private final boolean hasOF = hasClass("optifine.OptiFineForgeTweaker") || hasClass("me.modmuss50.optifabric.mod.Optifabric"); + //#if FABRIC + private final boolean hasIris = FabricLoader.getInstance().isModLoaded("iris"); + //#endif { logger.debug("hasOF: " + hasOF); @@ -49,6 +56,9 @@ public class ReplayModMixinConfigPlugin implements IMixinConfigPlugin { } if (mixinClassName.endsWith("_OF")) return hasOF; if (mixinClassName.endsWith("_NoOF")) return !hasOF; + //#if FABRIC + if (mixinClassName.endsWith("_Iris")) return hasIris; + //#endif return true; } diff --git a/src/main/java/com/replaymod/replay/mixin/Mixin_ShowSpectatedHand_Iris.java b/src/main/java/com/replaymod/replay/mixin/Mixin_ShowSpectatedHand_Iris.java new file mode 100644 index 00000000..48e8c8a3 --- /dev/null +++ b/src/main/java/com/replaymod/replay/mixin/Mixin_ShowSpectatedHand_Iris.java @@ -0,0 +1,35 @@ +//#if MC>=11400 +package com.replaymod.replay.mixin; + +import com.replaymod.replay.camera.CameraEntity; +import net.minecraft.client.network.ClientPlayerEntity; +import net.minecraft.client.network.ClientPlayerInteractionManager; +import net.minecraft.world.GameMode; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Pseudo; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +import static com.replaymod.core.versions.MCVer.getMinecraft; + +@Pseudo +@Mixin(targets = "net.coderbot.iris.pipeline.HandRenderer", remap = false) +public abstract class Mixin_ShowSpectatedHand_Iris { + @Redirect( + method = "*", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/client/network/ClientPlayerInteractionManager;getCurrentGameMode()Lnet/minecraft/world/GameMode;", + remap = true + ) + ) + private GameMode getGameMode(ClientPlayerInteractionManager interactionManager) { + ClientPlayerEntity camera = getMinecraft().player; + if (camera instanceof CameraEntity) { + // alternative doesn't really matter, the caller only checks for equality to SPECTATOR + return camera.isSpectator() ? GameMode.SPECTATOR : GameMode.SURVIVAL; + } + return interactionManager.getCurrentGameMode(); + } +} +//#endif diff --git a/src/main/resources/mixins.replay.replaymod.json b/src/main/resources/mixins.replay.replaymod.json index 356d50cc..f4205619 100644 --- a/src/main/resources/mixins.replay.replaymod.json +++ b/src/main/resources/mixins.replay.replaymod.json @@ -23,6 +23,7 @@ "ClientWorldAccessor", "EntityLivingBaseAccessor", //#if MC>=11400 + "Mixin_ShowSpectatedHand_Iris", "Mixin_ShowSpectatedHand_NoOF", "Mixin_ShowSpectatedHand_OF", //#else