Backport fixes for head position when riding/sitting

This commit is contained in:
Sollace 2024-12-15 17:19:18 +01:00
parent 7988da222f
commit 7328d0c43d
No known key found for this signature in database
GPG key ID: E52FACE7B5C773DB
2 changed files with 22 additions and 5 deletions

View file

@ -24,12 +24,11 @@ abstract class MixinPlayerEntity implements RegistrationHandler {
@ModifyReturnValue(method = "getBaseDimensions(Lnet/minecraft/entity/EntityPose;)Lnet/minecraft/entity/EntityDimensions;", @ModifyReturnValue(method = "getBaseDimensions(Lnet/minecraft/entity/EntityPose;)Lnet/minecraft/entity/EntityDimensions;",
at = @At("RETURN")) at = @At("RETURN"))
private EntityDimensions modifyEyeHeight(EntityDimensions dimensions, EntityPose pose) { private EntityDimensions modifyEyeHeight(EntityDimensions dimensions, EntityPose pose) {
float factor = syncedPony.getCachedPonyData().size().eyeHeightFactor(); return getSyncedPony().modifyEyeHeight((PlayerEntity)(Object)this, dimensions, pose);
return factor == 1 ? dimensions : dimensions.withEyeHeight(dimensions.eyeHeight() * factor);
} }
@Inject(method = "tick()V", at = @At("TAIL")) @Inject(method = "tick()V", at = @At("TAIL"))
private void onTick(CallbackInfo info) { private void onTick(CallbackInfo info) {
syncedPony.synchronize((PlayerEntity)(Object)this); getSyncedPony().synchronize((PlayerEntity)(Object)this);
} }
} }

View file

@ -21,7 +21,7 @@ import net.minecraft.client.MinecraftClient;
import net.minecraft.client.render.Frustum; import net.minecraft.client.render.Frustum;
import net.minecraft.client.render.entity.model.EntityModel; import net.minecraft.client.render.entity.model.EntityModel;
import net.minecraft.client.util.math.MatrixStack; import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.entity.LivingEntity; import net.minecraft.entity.*;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@ -154,6 +154,7 @@ public class EquineRenderManager<T extends LivingEntity, M extends EntityModel<T
private Supplier<Optional<PonyData>> lastPonyData = PonyDataLoader.NULL; private Supplier<Optional<PonyData>> lastPonyData = PonyDataLoader.NULL;
@Nullable @Nullable
private Pony lastTransmittedPony; private Pony lastTransmittedPony;
private boolean seated;
public Pony getCachedPony() { public Pony getCachedPony() {
return lastRenderedPony; return lastRenderedPony;
@ -163,15 +164,32 @@ public class EquineRenderManager<T extends LivingEntity, M extends EntityModel<T
return lastPonyData.get().orElse(PonyData.NULL); return lastPonyData.get().orElse(PonyData.NULL);
} }
public EntityDimensions modifyEyeHeight(PlayerEntity player, EntityDimensions dimensions, EntityPose pose) {
float factor = lastRenderedPony == null ? 1 : lastRenderedPony.size().eyeHeightFactor();
if (factor == 1) {
return dimensions;
}
float eyeHeight = dimensions.eyeHeight() * factor;
if (player.hasVehicle()) {
eyeHeight += player.getVehicleAttachmentPos(player.getVehicle()).getY();
}
return dimensions.withEyeHeight(eyeHeight);
}
public void synchronize(PlayerEntity player) { public void synchronize(PlayerEntity player) {
Pony pony = Pony.getManager().getPony(player); Pony pony = Pony.getManager().getPony(player);
boolean changed = pony.compareTo(lastRenderedPony) != 0; boolean changed = pony.compareTo(lastRenderedPony) != 0;
boolean seated = player.hasVehicle();
if (changed) { if (changed || seated != this.seated) {
lastRenderedPony = pony; lastRenderedPony = pony;
lastPonyData = pony.metadataGetter(); lastPonyData = pony.metadataGetter();
player.calculateDimensions(); player.calculateDimensions();
} }
this.seated = seated;
if (!(player instanceof PreviewModel)) { if (!(player instanceof PreviewModel)) {
@Nullable @Nullable