Lock camel rotation if stationary

This commit is contained in:
AJ Ferguson 2024-05-20 04:25:25 -04:00
parent 30a37fa8a5
commit 16d766dfd1
3 changed files with 26 additions and 13 deletions

View file

@ -26,6 +26,7 @@
package org.geysermc.geyser.entity.vehicle;
import lombok.Setter;
import org.cloudburstmc.math.vector.Vector2f;
import org.cloudburstmc.math.vector.Vector3f;
import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag;
import org.geysermc.geyser.entity.type.living.animal.horse.CamelEntity;
@ -112,6 +113,14 @@ public class CamelVehicleComponent extends VehicleComponent<CamelEntity> {
return inputVelocity;
}
@Override
protected Vector2f getVehicleRotation() {
if (isStationary()) {
return Vector2f.from(vehicle.getYaw(), vehicle.getPitch());
}
return super.getVehicleRotation();
}
/**
* Checks if the camel is sitting
* or transitioning to standing pose.

View file

@ -636,10 +636,14 @@ public class VehicleComponent<T extends LivingEntity & ClientVehicle> {
return Vector3f.from(input.getX() * cos - input.getY() * sin, 0, input.getY() * cos + input.getX() * sin);
}
protected Vector2f getVehicleRotation() {
LivingEntity player = vehicle.getSession().getPlayerEntity();
return Vector2f.from(player.getYaw(), player.getPitch() * 0.5f);
}
protected void moveVehicle(Vector3d javaPos, boolean isOnGround) {
Vector3f bedrockPos = javaPos.toFloat();
float yaw = vehicle.getSession().getPlayerEntity().getYaw();
float pitch = vehicle.getSession().getPlayerEntity().getPitch() * 0.5f;
Vector2f rotation = getVehicleRotation();
MoveEntityDeltaPacket moveEntityDeltaPacket = new MoveEntityDeltaPacket();
moveEntityDeltaPacket.setRuntimeEntityId(vehicle.getGeyserId());
@ -663,27 +667,27 @@ public class VehicleComponent<T extends LivingEntity & ClientVehicle> {
}
vehicle.setPosition(bedrockPos);
if (vehicle.getYaw() != yaw) {
if (vehicle.getYaw() != rotation.getX()) {
moveEntityDeltaPacket.getFlags().add(MoveEntityDeltaPacket.Flag.HAS_YAW);
moveEntityDeltaPacket.setYaw(yaw);
vehicle.setYaw(yaw);
moveEntityDeltaPacket.setYaw(rotation.getX());
vehicle.setYaw(rotation.getX());
}
if (vehicle.getPitch() != pitch) {
if (vehicle.getPitch() != rotation.getY()) {
moveEntityDeltaPacket.getFlags().add(MoveEntityDeltaPacket.Flag.HAS_PITCH);
moveEntityDeltaPacket.setPitch(pitch);
vehicle.setPitch(pitch);
moveEntityDeltaPacket.setPitch(rotation.getY());
vehicle.setPitch(rotation.getY());
}
if (vehicle.getHeadYaw() != yaw) { // Same as yaw
if (vehicle.getHeadYaw() != rotation.getX()) { // Same as yaw
moveEntityDeltaPacket.getFlags().add(MoveEntityDeltaPacket.Flag.HAS_HEAD_YAW);
moveEntityDeltaPacket.setHeadYaw(yaw);
vehicle.setHeadYaw(yaw);
moveEntityDeltaPacket.setHeadYaw(rotation.getX());
vehicle.setHeadYaw(rotation.getX());
}
if (!moveEntityDeltaPacket.getFlags().isEmpty()) {
vehicle.getSession().sendUpstreamPacket(moveEntityDeltaPacket);
}
ServerboundMoveVehiclePacket moveVehiclePacket = new ServerboundMoveVehiclePacket(javaPos.getX(), javaPos.getY(), javaPos.getZ(), yaw, pitch);
ServerboundMoveVehiclePacket moveVehiclePacket = new ServerboundMoveVehiclePacket(javaPos.getX(), javaPos.getY(), javaPos.getZ(), rotation.getX(), rotation.getY());
vehicle.getSession().sendDownstreamPacket(moveVehiclePacket);
vehicle.getSession().setLastVehicleMoveTimestamp(System.currentTimeMillis());
}

@ -1 +1 @@
Subproject commit 6b661f0d517d895aebc1f55a25d2c86f033beb1d
Subproject commit 968a22bbab02d7d003c5b451a40d8bb2439b0d97