1
0
mirror of https://github.com/GeyserMC/Geyser.git synced 2026-01-06 15:41:50 +00:00

Small vehicle fixes

This commit is contained in:
AJ Ferguson
2025-06-26 07:28:42 -04:00
parent 868fed172e
commit a2bdfa9eaf
5 changed files with 25 additions and 22 deletions

View File

@@ -180,7 +180,7 @@ public class HappyGhastEntity extends AnimalEntity implements ClientVehicle {
@Override
public float getVehicleSpeed() {
return 1; // TODO this doesnt seem right?
return 0.0f; // Not used
}
@Override

View File

@@ -68,8 +68,6 @@ public class CamelEntity extends AbstractHorseEntity implements ClientVehicle {
public void setHorseFlags(ByteEntityMetadata entityMetadata) {
byte xd = entityMetadata.getPrimitiveValue();
boolean saddled = (xd & 0x04) == 0x04;
setFlag(EntityFlag.SADDLED, saddled);
setFlag(EntityFlag.EATING, (xd & 0x10) == 0x10);
setFlag(EntityFlag.STANDING, (xd & 0x20) == 0x20);
@@ -98,7 +96,7 @@ public class CamelEntity extends AbstractHorseEntity implements ClientVehicle {
}
// Shows the dash meter
setFlag(EntityFlag.CAN_DASH, saddled);
// setFlag(EntityFlag.CAN_DASH, saddled);
}
@Override

View File

@@ -56,8 +56,9 @@ public class HappyGhastVehicleComponent extends VehicleComponent<HappyGhastEntit
@Override
protected void updateRotation() {
float addYaw = MathUtils.wrapDegrees(getRiddenRotation().getX() - vehicle.getYaw()) * 0.08f;
vehicle.setYaw(vehicle.getYaw() + addYaw);
float yaw = vehicle.getYaw() + MathUtils.wrapDegrees(getRiddenRotation().getX() - vehicle.getYaw()) * 0.08f;
vehicle.setYaw(yaw);
vehicle.setHeadYaw(yaw);
}
@Override

View File

@@ -68,7 +68,6 @@ public class VehicleComponent<T extends LivingEntity & ClientVehicle> {
protected final T vehicle;
@Getter
protected final BoundingBox boundingBox;
protected Vector2f lastSentRotation; // (yaw, pitch)
protected float stepHeight;
@Getter @Setter
@@ -82,7 +81,6 @@ public class VehicleComponent<T extends LivingEntity & ClientVehicle> {
public VehicleComponent(T vehicle, float stepHeight) {
this.vehicle = vehicle;
this.lastSentRotation = Vector2f.from(vehicle.getYaw(), vehicle.getPitch());
this.stepHeight = stepHeight;
this.moveSpeed = (float) AttributeType.Builtin.MOVEMENT_SPEED.getDef();
this.gravity = AttributeType.Builtin.GRAVITY.getDef();
@@ -190,6 +188,9 @@ public class VehicleComponent<T extends LivingEntity & ClientVehicle> {
}
}
/**
* Update the rotation of the vehicle. Should be called once per tick, and before getInputVector.
*/
protected void updateRotation() {
Vector2f rot = getRiddenRotation();
vehicle.setYaw(rot.getX());
@@ -596,16 +597,15 @@ public class VehicleComponent<T extends LivingEntity & ClientVehicle> {
protected boolean travel(VehicleContext ctx, float speed) {
Vector3f motion = vehicle.getMotion();
// Java only does this client side
motion = motion.mul(0.98f);
motion = Vector3f.from(
Math.abs(motion.getX()) < MIN_VELOCITY ? 0 : motion.getX(),
Math.abs(motion.getY()) < MIN_VELOCITY ? 0 : motion.getY(),
Math.abs(motion.getZ()) < MIN_VELOCITY ? 0 : motion.getZ()
);
Vector3f lastRotation = vehicle.getBedrockRotation();
updateRotation();
Vector2f playerInput = vehicle.getSession().getPlayerEntity().getVehicleInput();
Vector3f riddenInput = vehicle.getRiddenInput(playerInput.mul(0.98f));
@@ -666,7 +666,7 @@ public class VehicleComponent<T extends LivingEntity & ClientVehicle> {
}
// Send the new position to the bedrock client and java server
moveVehicle(ctx.centerPos());
moveVehicle(ctx.centerPos(), lastRotation);
vehicle.setMotion(motion);
applyBlockCollisionEffects(ctx);
@@ -730,8 +730,9 @@ public class VehicleComponent<T extends LivingEntity & ClientVehicle> {
* <p>
* This also updates the session's last vehicle move timestamp.
* @param javaPos the new java position of the vehicle
* @param lastRotation the previous rotation of the vehicle (pitch, yaw, headYaw)
*/
protected void moveVehicle(Vector3d javaPos) {
protected void moveVehicle(Vector3d javaPos, Vector3f lastRotation) {
Vector3f bedrockPos = javaPos.toFloat();
MoveEntityDeltaPacket moveEntityDeltaPacket = new MoveEntityDeltaPacket();
@@ -755,19 +756,18 @@ public class VehicleComponent<T extends LivingEntity & ClientVehicle> {
}
vehicle.setPosition(bedrockPos);
if (vehicle.getYaw() != lastSentRotation.getX()) {
moveEntityDeltaPacket.getFlags().add(MoveEntityDeltaPacket.Flag.HAS_YAW);
moveEntityDeltaPacket.setYaw(vehicle.getYaw());
}
if (vehicle.getPitch() != lastSentRotation.getY()) {
if (vehicle.getPitch() != lastRotation.getX()) {
moveEntityDeltaPacket.getFlags().add(MoveEntityDeltaPacket.Flag.HAS_PITCH);
moveEntityDeltaPacket.setPitch(vehicle.getPitch());
}
if (vehicle.getHeadYaw() != lastSentRotation.getX()) { // Same as yaw
moveEntityDeltaPacket.getFlags().add(MoveEntityDeltaPacket.Flag.HAS_HEAD_YAW);
moveEntityDeltaPacket.setHeadYaw(vehicle.getYaw());
if (vehicle.getYaw() != lastRotation.getY()) {
moveEntityDeltaPacket.getFlags().add(MoveEntityDeltaPacket.Flag.HAS_YAW);
moveEntityDeltaPacket.setYaw(vehicle.getYaw());
}
if (vehicle.getHeadYaw() != lastRotation.getZ()) {
moveEntityDeltaPacket.getFlags().add(MoveEntityDeltaPacket.Flag.HAS_HEAD_YAW);
moveEntityDeltaPacket.setHeadYaw(vehicle.getHeadYaw());
}
lastSentRotation = Vector2f.from(vehicle.getYaw(), vehicle.getPitch());
if (!moveEntityDeltaPacket.getFlags().isEmpty()) {
vehicle.getSession().sendUpstreamPacket(moveEntityDeltaPacket);

View File

@@ -44,6 +44,10 @@ public class JavaEntityPositionSyncTranslator extends PacketTranslator<Clientbou
Vector3d pos = packet.getPosition();
if (entity instanceof ClientVehicle clientVehicle) {
// Ignore if player is controlling
if (clientVehicle.isClientControlled()) {
return;
}
clientVehicle.getVehicleComponent().moveAbsolute(pos.getX(), pos.getY(), pos.getZ());
}