Fix spectator hand jumping when rotating across 0 yaw boundary

The `yaw` value of non-client-players is constraint to [0; 360), so when that
boundary is crossed, the `renderYaw` starts interpolating to its goal the
incorrect way round (instead of crossing the 360 boundary as well).

Instead we now use the `headYaw` value, which does not wrap around and as such
does not have this issue.
This commit is contained in:
Jonas Herzig
2021-08-17 19:10:48 +02:00
parent 6428416bc4
commit 411eaa4ca8

View File

@@ -22,6 +22,7 @@ import net.minecraft.client.MinecraftClient;
import net.minecraft.client.network.AbstractClientPlayerEntity; import net.minecraft.client.network.AbstractClientPlayerEntity;
import net.minecraft.client.network.ClientPlayNetworkHandler; import net.minecraft.client.network.ClientPlayNetworkHandler;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.mob.MobEntity; import net.minecraft.entity.mob.MobEntity;
import net.minecraft.entity.decoration.ItemFrameEntity; import net.minecraft.entity.decoration.ItemFrameEntity;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
@@ -248,6 +249,14 @@ public class CameraEntity
this.lastRenderX = to.lastRenderX; this.lastRenderX = to.lastRenderX;
this.lastRenderY = to.lastRenderY + yOffset; this.lastRenderY = to.lastRenderY + yOffset;
this.lastRenderZ = to.lastRenderZ; this.lastRenderZ = to.lastRenderZ;
if (to instanceof LivingEntity) {
LivingEntity toLiving = (LivingEntity) to;
this.headYaw = toLiving.headYaw;
this.prevHeadYaw = toLiving.prevHeadYaw;
} else {
this.headYaw = to.yaw;
this.prevHeadYaw = to.prevYaw;
}
updateBoundingBox(); updateBoundingBox();
} }
@@ -256,7 +265,7 @@ public class CameraEntity
public float getYaw(float tickDelta) { public float getYaw(float tickDelta) {
Entity view = this.client.getCameraEntity(); Entity view = this.client.getCameraEntity();
if (view != null && view != this) { if (view != null && view != this) {
return this.prevYaw + (this.yaw - this.prevYaw) * tickDelta; return this.prevHeadYaw + (this.headYaw - this.prevHeadYaw) * tickDelta;
} }
return super.getYaw(tickDelta); return super.getYaw(tickDelta);
} }
@@ -698,7 +707,7 @@ public class CameraEntity
this.lastRenderYaw = this.renderYaw; this.lastRenderYaw = this.renderYaw;
this.lastRenderPitch = this.renderPitch; this.lastRenderPitch = this.renderPitch;
this.renderPitch = this.renderPitch + (this.pitch - this.renderPitch) * 0.5f; this.renderPitch = this.renderPitch + (this.pitch - this.renderPitch) * 0.5f;
this.renderYaw = this.renderYaw + (this.yaw - this.renderYaw) * 0.5f; this.renderYaw = this.renderYaw + (this.headYaw - this.renderYaw) * 0.5f;
} }
public boolean canSpectate(Entity e) { public boolean canSpectate(Entity e) {