diff --git a/src/main/java/net/minestom/server/entity/Entity.java b/src/main/java/net/minestom/server/entity/Entity.java index 8d74a026e..d556419d4 100644 --- a/src/main/java/net/minestom/server/entity/Entity.java +++ b/src/main/java/net/minestom/server/entity/Entity.java @@ -597,82 +597,6 @@ public class Entity implements Viewable, Tickable, TagHandler, PermissionHandler } } - /** - * Sends the correct packets to update the entity's position, should be called - * every tick. The movement is checked inside the method! - *

- * The following packets are sent to viewers (check are performed in this order): - *

    - *
  1. {@link EntityTeleportPacket} if {@code distanceX > 8 || distanceY > 8 || distanceZ > 8} - * (performed using {@link #synchronizePosition(boolean)})
  2. - *
  3. {@link EntityPositionAndRotationPacket} if {@code positionChange && viewChange}
  4. - *
  5. {@link EntityPositionPacket} if {@code positionChange}
  6. - *
  7. {@link EntityRotationPacket} and {@link EntityHeadLookPacket} if {@code viewChange}
  8. - *
- * In case of a player's position and/or view change an additional {@link PlayerPositionAndLookPacket} - * is sent to self. - * - * @param clientSide {@code true} if the client triggered this action - */ - protected void sendPositionUpdate(final boolean clientSide) { - final boolean viewChange = !position.sameView(lastSyncedPosition); - final double distanceX = Math.abs(position.x() - lastSyncedPosition.x()); - final double distanceY = Math.abs(position.y() - lastSyncedPosition.y()); - final double distanceZ = Math.abs(position.z() - lastSyncedPosition.z()); - final boolean positionChange = (distanceX + distanceY + distanceZ) > 0; - - if (distanceX > 8 || distanceY > 8 || distanceZ > 8) { - synchronizePosition(true); - // #synchronizePosition sets sync fields, it's safe to return - return; - } else if (positionChange && viewChange) { - EntityPositionAndRotationPacket positionAndRotationPacket = EntityPositionAndRotationPacket - .getPacket(getEntityId(), position, lastSyncedPosition, isOnGround()); - sendPacketToViewers(positionAndRotationPacket); - - // Fix head rotation - final EntityHeadLookPacket entityHeadLookPacket = new EntityHeadLookPacket(); - entityHeadLookPacket.entityId = getEntityId(); - entityHeadLookPacket.yaw = position.yaw(); - sendPacketToViewersAndSelf(entityHeadLookPacket); - } else if (positionChange) { - final EntityPositionPacket entityPositionPacket = EntityPositionPacket - .getPacket(getEntityId(), position, lastSyncedPosition, onGround); - sendPacketToViewers(entityPositionPacket); - } else if (viewChange) { - final EntityRotationPacket entityRotationPacket = new EntityRotationPacket(); - entityRotationPacket.entityId = getEntityId(); - entityRotationPacket.yaw = position.yaw(); - entityRotationPacket.pitch = position.pitch(); - entityRotationPacket.onGround = onGround; - - final EntityHeadLookPacket entityHeadLookPacket = new EntityHeadLookPacket(); - entityHeadLookPacket.entityId = getEntityId(); - entityHeadLookPacket.yaw = position.yaw(); - - if (clientSide) { - sendPacketToViewers(entityHeadLookPacket); - sendPacketToViewers(entityRotationPacket); - } else { - sendPacketToViewersAndSelf(entityHeadLookPacket); - sendPacketToViewersAndSelf(entityRotationPacket); - } - } else { - // Nothing changed, return - return; - } - - if (PlayerUtils.isNettyClient(this) && !clientSide) { - final PlayerPositionAndLookPacket playerPositionAndLookPacket = new PlayerPositionAndLookPacket(); - playerPositionAndLookPacket.flags = 0b111; - playerPositionAndLookPacket.position = position.sub(lastSyncedPosition); - playerPositionAndLookPacket.teleportId = ((Player) this).getNextTeleportId(); - ((Player) this).getPlayerConnection().sendPacket(playerPositionAndLookPacket); - } - - this.lastSyncedPosition = position; - } - /** * Gets the number of ticks this entity has been active for. * @@ -1247,7 +1171,6 @@ public class Entity implements Viewable, Tickable, TagHandler, PermissionHandler * Updates internal fields and sends updates. * * @param position the new position - * @see #sendPositionUpdate(boolean) */ @ApiStatus.Internal public void refreshPosition(@NotNull final Pos position, boolean ignoreView) { @@ -1256,7 +1179,27 @@ public class Entity implements Viewable, Tickable, TagHandler, PermissionHandler if (!position.samePoint(previousPosition)) { refreshCoordinate(position); } - sendPositionUpdate(true); + final boolean viewChange = !position.sameView(lastSyncedPosition); + final double distanceX = Math.abs(position.x() - lastSyncedPosition.x()); + final double distanceY = Math.abs(position.y() - lastSyncedPosition.y()); + final double distanceZ = Math.abs(position.z() - lastSyncedPosition.z()); + final boolean positionChange = (distanceX + distanceY + distanceZ) > 0; + if (distanceX > 8 || distanceY > 8 || distanceZ > 8) { + synchronizePosition(true); + // #synchronizePosition sets sync fields, it's safe to return + return; + } else if (positionChange && viewChange) { + sendPacketToViewers(EntityPositionAndRotationPacket.getPacket(getEntityId(), position, + lastSyncedPosition, isOnGround())); + // Fix head rotation + sendPacketToViewers(new EntityHeadLookPacket(getEntityId(), position.yaw())); + } else if (positionChange) { + sendPacketToViewers(EntityPositionPacket.getPacket(getEntityId(), position, lastSyncedPosition, onGround)); + } else if (viewChange) { + sendPacketToViewers(new EntityHeadLookPacket(getEntityId(), position.yaw())); + sendPacketToViewers(new EntityRotationPacket(getEntityId(), position.yaw(), position.pitch(), onGround)); + } + this.lastSyncedPosition = position; } @ApiStatus.Internal @@ -1471,12 +1414,7 @@ public class Entity implements Viewable, Tickable, TagHandler, PermissionHandler */ @ApiStatus.Internal protected void synchronizePosition(boolean includeSelf) { - final EntityTeleportPacket entityTeleportPacket = new EntityTeleportPacket(); - entityTeleportPacket.entityId = getEntityId(); - entityTeleportPacket.position = position; - entityTeleportPacket.onGround = isOnGround(); - sendPacketToViewers(entityTeleportPacket); - + sendPacketToViewers(new EntityTeleportPacket(getEntityId(), position, isOnGround())); this.lastAbsoluteSynchronizationTime = System.currentTimeMillis(); this.lastSyncedPosition = position; } diff --git a/src/main/java/net/minestom/server/entity/Player.java b/src/main/java/net/minestom/server/entity/Player.java index 9422e34eb..e267d097f 100644 --- a/src/main/java/net/minestom/server/entity/Player.java +++ b/src/main/java/net/minestom/server/entity/Player.java @@ -1883,13 +1883,8 @@ public class Player extends LivingEntity implements CommandSender, Localizable, @ApiStatus.Internal protected void synchronizePosition(boolean includeSelf) { if (includeSelf) { - final PlayerPositionAndLookPacket positionAndLookPacket = new PlayerPositionAndLookPacket(); - positionAndLookPacket.position = position; - positionAndLookPacket.flags = 0x00; - positionAndLookPacket.teleportId = teleportId.incrementAndGet(); - playerConnection.sendPacket(positionAndLookPacket); + playerConnection.sendPacket(new PlayerPositionAndLookPacket(position, (byte) 0x00, teleportId.incrementAndGet(), false)); } - super.synchronizePosition(includeSelf); } diff --git a/src/main/java/net/minestom/server/network/packet/server/play/EntityHeadLookPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/EntityHeadLookPacket.java index 2628d0536..db0dbe883 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/EntityHeadLookPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/EntityHeadLookPacket.java @@ -11,7 +11,14 @@ public class EntityHeadLookPacket implements ServerPacket { public int entityId; public float yaw; - public EntityHeadLookPacket() {} + public EntityHeadLookPacket(int entityId, float yaw) { + this.entityId = entityId; + this.yaw = yaw; + } + + public EntityHeadLookPacket() { + this(0, 0); + } @Override public void write(@NotNull BinaryWriter writer) { diff --git a/src/main/java/net/minestom/server/network/packet/server/play/EntityRotationPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/EntityRotationPacket.java index 9983fc8aa..a5b074775 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/EntityRotationPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/EntityRotationPacket.java @@ -12,7 +12,16 @@ public class EntityRotationPacket implements ServerPacket { public float yaw, pitch; public boolean onGround; - public EntityRotationPacket() {} + public EntityRotationPacket(int entityId, float yaw, float pitch, boolean onGround) { + this.entityId = entityId; + this.yaw = yaw; + this.pitch = pitch; + this.onGround = onGround; + } + + public EntityRotationPacket() { + this(0, 0, 0, false); + } @Override public void write(@NotNull BinaryWriter writer) { diff --git a/src/main/java/net/minestom/server/network/packet/server/play/EntityTeleportPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/EntityTeleportPacket.java index 2be5eceee..8e0486a8e 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/EntityTeleportPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/EntityTeleportPacket.java @@ -1,10 +1,10 @@ package net.minestom.server.network.packet.server.play; +import net.minestom.server.coordinate.Pos; import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; -import net.minestom.server.coordinate.Pos; import org.jetbrains.annotations.NotNull; public class EntityTeleportPacket implements ServerPacket { @@ -13,8 +13,14 @@ public class EntityTeleportPacket implements ServerPacket { public Pos position; public boolean onGround; + public EntityTeleportPacket(int entityId, Pos position, boolean onGround) { + this.entityId = entityId; + this.position = position; + this.onGround = onGround; + } + public EntityTeleportPacket() { - position = Pos.ZERO; + this(0, Pos.ZERO, false); } @Override diff --git a/src/main/java/net/minestom/server/network/packet/server/play/PlayerPositionAndLookPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/PlayerPositionAndLookPacket.java index f888a9d49..8d7d01dbe 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/PlayerPositionAndLookPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/PlayerPositionAndLookPacket.java @@ -1,10 +1,10 @@ package net.minestom.server.network.packet.server.play; +import net.minestom.server.coordinate.Pos; import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacketIdentifier; import net.minestom.server.utils.binary.BinaryReader; import net.minestom.server.utils.binary.BinaryWriter; -import net.minestom.server.coordinate.Pos; import org.jetbrains.annotations.NotNull; public class PlayerPositionAndLookPacket implements ServerPacket { @@ -14,8 +14,15 @@ public class PlayerPositionAndLookPacket implements ServerPacket { public int teleportId; public boolean dismountVehicle; + public PlayerPositionAndLookPacket(Pos position, byte flags, int teleportId, boolean dismountVehicle) { + this.position = position; + this.flags = flags; + this.teleportId = teleportId; + this.dismountVehicle = dismountVehicle; + } + public PlayerPositionAndLookPacket() { - position = Pos.ZERO; + this(Pos.ZERO, (byte) 0, 0, false); } @Override