Fix 360 camera stabilization on 1.13+

This commit is contained in:
Jonas Herzig
2019-07-19 20:23:48 +02:00
parent 5bd9b0cb6b
commit 1245f38267

View File

@@ -5,6 +5,7 @@ import com.replaymod.render.capturer.CubicOpenGlFrameCapturer;
import com.replaymod.render.hooks.EntityRendererHandler; import com.replaymod.render.hooks.EntityRendererHandler;
import com.replaymod.replay.camera.CameraEntity; import com.replaymod.replay.camera.CameraEntity;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.LivingEntity;
import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL11;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
@@ -36,6 +37,10 @@ public abstract class MixinCamera {
private float orgPrevPitch; private float orgPrevPitch;
private float orgRoll; private float orgRoll;
// Only relevant on 1.13+ (previously MC always used the non-head yaw) and only for LivingEntity view entities.
private float orgHeadYaw;
private float orgPrevHeadYaw;
//#if MC>=11400 //#if MC>=11400
@Inject(method = "update", at = @At("HEAD")) @Inject(method = "update", at = @At("HEAD"))
//#else //#else
@@ -63,6 +68,10 @@ public abstract class MixinCamera {
orgPrevYaw = entity.prevYaw; orgPrevYaw = entity.prevYaw;
orgPrevPitch = entity.prevPitch; orgPrevPitch = entity.prevPitch;
orgRoll = entity instanceof CameraEntity ? ((CameraEntity) entity).roll : 0; orgRoll = entity instanceof CameraEntity ? ((CameraEntity) entity).roll : 0;
if (entity instanceof LivingEntity) {
orgHeadYaw = ((LivingEntity) entity).headYaw;
orgPrevHeadYaw = ((LivingEntity) entity).prevHeadYaw;
}
} }
//#if MC<11400 //#if MC<11400
//$$ } //$$ }
@@ -77,6 +86,9 @@ public abstract class MixinCamera {
RenderSettings settings = getHandler().getSettings(); RenderSettings settings = getHandler().getSettings();
if (settings.isStabilizeYaw()) { if (settings.isStabilizeYaw()) {
entity.prevYaw = entity.yaw = 0; entity.prevYaw = entity.yaw = 0;
if (entity instanceof LivingEntity) {
((LivingEntity) entity).prevHeadYaw = ((LivingEntity) entity).headYaw = 0;
}
} }
if (settings.isStabilizePitch()) { if (settings.isStabilizePitch()) {
entity.prevPitch = entity.pitch = 0; entity.prevPitch = entity.pitch = 0;
@@ -116,6 +128,10 @@ public abstract class MixinCamera {
if (entity instanceof CameraEntity) { if (entity instanceof CameraEntity) {
((CameraEntity) entity).roll = orgRoll; ((CameraEntity) entity).roll = orgRoll;
} }
if (entity instanceof LivingEntity) {
((LivingEntity) entity).headYaw = orgHeadYaw;
((LivingEntity) entity).prevHeadYaw = orgPrevHeadYaw;
}
} }
} }