From e7d96fca2af741f83c4c73e187eb07f8417a9bca Mon Sep 17 00:00:00 2001 From: Jonas Herzig Date: Sat, 25 May 2019 19:35:17 +0200 Subject: [PATCH] Fix lack of hand when spectating player in replay on 1.13+ --- .../replay/mixin/MixinGameRenderer.java | 36 +++++++++++++++++++ .../resources/mixins.replay.replaymod.json | 4 ++- versions/1.14.1/mapping.txt | 1 + 3 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/replaymod/replay/mixin/MixinGameRenderer.java diff --git a/src/main/java/com/replaymod/replay/mixin/MixinGameRenderer.java b/src/main/java/com/replaymod/replay/mixin/MixinGameRenderer.java new file mode 100644 index 00000000..a89c0aeb --- /dev/null +++ b/src/main/java/com/replaymod/replay/mixin/MixinGameRenderer.java @@ -0,0 +1,36 @@ +//#if MC>=11300 +package com.replaymod.replay.mixin; + +import com.replaymod.replay.camera.CameraEntity; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.network.ClientPlayerEntity; +import net.minecraft.client.network.ClientPlayerInteractionManager; +import net.minecraft.client.render.GameRenderer; +import net.minecraft.world.GameMode; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(GameRenderer.class) +public abstract class MixinGameRenderer { + @Accessor + abstract MinecraftClient getClient(); + + @Redirect( + method = "renderHand", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/client/network/ClientPlayerInteractionManager;getCurrentGameMode()Lnet/minecraft/world/GameMode;" + ) + ) + private GameMode getGameMode(ClientPlayerInteractionManager interactionManager) { + ClientPlayerEntity camera = getClient().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 7abe6540..730a73be 100644 --- a/src/main/resources/mixins.replay.replaymod.json +++ b/src/main/resources/mixins.replay.replaymod.json @@ -9,7 +9,9 @@ "MixinInGameHud", //#endif "EntityLivingBaseAccessor", - //#if MC<11300 + //#if MC>=11300 + "MixinGameRenderer", + //#else //$$ "EntityOtherPlayerMPAccessor", //#endif "EntityPlayerAccessor", diff --git a/versions/1.14.1/mapping.txt b/versions/1.14.1/mapping.txt index 6ce18c53..4ee17d80 100644 --- a/versions/1.14.1/mapping.txt +++ b/versions/1.14.1/mapping.txt @@ -85,6 +85,7 @@ net.minecraft.client.network.ClientPlayerInteractionManager net.minecraft.client net.minecraft.client.network.ClientPlayerInteractionManager client mc net.minecraft.client.network.ClientPlayerInteractionManager networkHandler connection net.minecraft.client.network.ClientPlayerInteractionManager isFlyingLocked() isSpectatorMode() +net.minecraft.client.network.ClientPlayerInteractionManager getCurrentGameMode() getCurrentGameType() com.mojang.blaze3d.platform.GLX net.minecraft.client.renderer.OpenGlHelper com.mojang.blaze3d.platform.GLX isUsingFBOs() isFramebufferEnabled() net.minecraft.entity.data.TrackedData net.minecraft.network.datasync.DataParameter