mirror of
https://github.com/Minestom/Minestom.git
synced 2024-12-29 04:28:21 +01:00
Passenger Fixes (#476)
Don't teleport player when entering/exiting vehicle + better height offset logic
This commit is contained in:
parent
36bcf69728
commit
26341005b1
@ -883,8 +883,10 @@ public class Entity implements Viewable, Tickable, TagHandler, PermissionHandler
|
|||||||
this.passengers.add(entity);
|
this.passengers.add(entity);
|
||||||
entity.vehicle = this;
|
entity.vehicle = this;
|
||||||
sendPacketToViewersAndSelf(getPassengersPacket());
|
sendPacketToViewersAndSelf(getPassengersPacket());
|
||||||
entity.refreshPosition(position);
|
|
||||||
entity.synchronizePosition(true);
|
// Updates the position of the new passenger, and then teleports the passenger
|
||||||
|
updatePassengerPosition(position, entity);
|
||||||
|
entity.synchronizePosition(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -900,11 +902,6 @@ public class Entity implements Viewable, Tickable, TagHandler, PermissionHandler
|
|||||||
entity.vehicle = null;
|
entity.vehicle = null;
|
||||||
sendPacketToViewersAndSelf(getPassengersPacket());
|
sendPacketToViewersAndSelf(getPassengersPacket());
|
||||||
entity.synchronizePosition(false);
|
entity.synchronizePosition(false);
|
||||||
if (entity instanceof Player) {
|
|
||||||
Player player = (Player) entity;
|
|
||||||
player.getPlayerConnection().sendPacket(new PlayerPositionAndLookPacket(player.getPosition(),
|
|
||||||
(byte) 0x00, player.getNextTeleportId(), true));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1179,6 +1176,36 @@ public class Entity implements Viewable, Tickable, TagHandler, PermissionHandler
|
|||||||
refreshPosition(newPosition, false);
|
refreshPosition(newPosition, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The height offset for passengers of this vehicle
|
||||||
|
*/
|
||||||
|
private double getPassengerHeightOffset() {
|
||||||
|
// TODO: Move this logic elsewhere
|
||||||
|
if (entityType == EntityType.BOAT) {
|
||||||
|
return -0.1;
|
||||||
|
} else if (entityType == EntityType.MINECART) {
|
||||||
|
return 0.0;
|
||||||
|
} else {
|
||||||
|
return entityType.height() * 0.75;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the X,Z coordinate of the passenger to the X,Z coordinate of this vehicle
|
||||||
|
* and sets the Y coordinate of the passenger to the Y coordinate of this vehicle + {@link #getPassengerHeightOffset()}
|
||||||
|
* @param newPosition The X,Y,Z position of this vehicle
|
||||||
|
* @param passenger The passenger to be moved
|
||||||
|
*/
|
||||||
|
private void updatePassengerPosition(Point newPosition, Entity passenger) {
|
||||||
|
final Pos oldPassengerPos = passenger.position;
|
||||||
|
final Pos newPassengerPos = oldPassengerPos.withCoord(newPosition.x(),
|
||||||
|
newPosition.y() + getPassengerHeightOffset(),
|
||||||
|
newPosition.z());
|
||||||
|
passenger.position = newPassengerPos;
|
||||||
|
passenger.previousPosition = oldPassengerPos;
|
||||||
|
passenger.refreshCoordinate(newPassengerPos);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Used to refresh the entity and its passengers position
|
* Used to refresh the entity and its passengers position
|
||||||
* - put the entity in the right instance chunk
|
* - put the entity in the right instance chunk
|
||||||
@ -1192,13 +1219,7 @@ public class Entity implements Viewable, Tickable, TagHandler, PermissionHandler
|
|||||||
private void refreshCoordinate(Point newPosition) {
|
private void refreshCoordinate(Point newPosition) {
|
||||||
if (hasPassenger()) {
|
if (hasPassenger()) {
|
||||||
for (Entity passenger : getPassengers()) {
|
for (Entity passenger : getPassengers()) {
|
||||||
final Pos oldPassengerPos = passenger.position;
|
updatePassengerPosition(newPosition, passenger);
|
||||||
final Pos newPassengerPos = oldPassengerPos.withCoord(newPosition.x(),
|
|
||||||
newPosition.y() + getEyeHeight(),
|
|
||||||
newPosition.z());
|
|
||||||
passenger.position = newPassengerPos;
|
|
||||||
passenger.previousPosition = oldPassengerPos;
|
|
||||||
passenger.refreshCoordinate(newPassengerPos);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final Instance instance = getInstance();
|
final Instance instance = getInstance();
|
||||||
|
Loading…
Reference in New Issue
Block a user