diff --git a/src/main/java/com/replaymod/replay/mixin/Mixin_FixHandOffsetTickDelta.java b/src/main/java/com/replaymod/replay/mixin/Mixin_FixHandOffsetTickDelta.java new file mode 100644 index 00000000..fca4cd6c --- /dev/null +++ b/src/main/java/com/replaymod/replay/mixin/Mixin_FixHandOffsetTickDelta.java @@ -0,0 +1 @@ +// 1.12.2 and below diff --git a/src/main/resources/mixins.replay.replaymod.json b/src/main/resources/mixins.replay.replaymod.json index f373ed49..356d50cc 100644 --- a/src/main/resources/mixins.replay.replaymod.json +++ b/src/main/resources/mixins.replay.replaymod.json @@ -17,6 +17,8 @@ //#if MC>=11400 "MixinCamera", "MixinInGameHud", + //#else + //$$ "Mixin_FixHandOffsetTickDelta", //#endif "ClientWorldAccessor", "EntityLivingBaseAccessor", diff --git a/versions/1.12.2/src/main/java/com/replaymod/replay/mixin/Mixin_FixHandOffsetTickDelta.java b/versions/1.12.2/src/main/java/com/replaymod/replay/mixin/Mixin_FixHandOffsetTickDelta.java new file mode 100644 index 00000000..6f447aed --- /dev/null +++ b/versions/1.12.2/src/main/java/com/replaymod/replay/mixin/Mixin_FixHandOffsetTickDelta.java @@ -0,0 +1,46 @@ +package com.replaymod.replay.mixin; + +import com.replaymod.replay.camera.CameraEntity; +import net.minecraft.client.entity.EntityPlayerSP; +import net.minecraft.client.renderer.ItemRenderer; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +/** + * In 1.12.2 and below, Vanilla does not respect the tickDelta value when getting the yaw/pitch of the player for + * computing the hand offset. + * This causes the hand movement to be jittery when spectating another player in a replay. + */ +@Mixin(ItemRenderer.class) +public abstract class Mixin_FixHandOffsetTickDelta { + @Redirect(method = "rotateArm", at = @At(value = "FIELD", target = "Lnet/minecraft/client/entity/EntityPlayerSP;rotationYaw:F")) + private float getYaw( + EntityPlayerSP instance, + //#if MC<10900 + //$$ EntityPlayerSP arg, + //#endif + float tickDelta + ) { + if (instance instanceof CameraEntity) { + return instance.prevRotationYaw + (instance.rotationYaw - instance.prevRotationYaw) * tickDelta; + } else { + return instance.rotationYaw; + } + } + + @Redirect(method = "rotateArm", at = @At(value = "FIELD", target = "Lnet/minecraft/client/entity/EntityPlayerSP;rotationPitch:F")) + private float getPitch( + EntityPlayerSP instance, + //#if MC<10900 + //$$ EntityPlayerSP arg, + //#endif + float tickDelta + ) { + if (instance instanceof CameraEntity) { + return instance.prevRotationPitch + (instance.rotationPitch - instance.prevRotationPitch) * tickDelta; + } else { + return instance.rotationPitch; + } + } +} diff --git a/versions/1.9.4/mapping.txt b/versions/1.9.4/mapping.txt index 66b70775..ea42a2f1 100644 --- a/versions/1.9.4/mapping.txt +++ b/versions/1.9.4/mapping.txt @@ -8,6 +8,7 @@ net.minecraft.util.text.TextFormatting net.minecraft.util.EnumChatFormatting net.minecraft.util.text.ITextComponent net.minecraft.util.IChatComponent net.minecraft.network.datasync.EntityDataManager net.minecraft.entity.DataWatcher net.minecraft.network.datasync.EntityDataManager.DataEntry net.minecraft.entity.DataWatcher.WatchableObject +net.minecraft.client.renderer.ItemRenderer rotateArm() rotateWithPlayerRotations() net.minecraft.client.renderer.VertexBuffer net.minecraft.client.renderer.WorldRenderer net.minecraft.client.particle.Particle net.minecraft.client.particle.EntityFX net.minecraft.util.math.MathHelper net.minecraft.util.MathHelper