diff --git a/src/main/java/net/minestom/server/entity/Player.java b/src/main/java/net/minestom/server/entity/Player.java index 52654567c..4e3dc128e 100644 --- a/src/main/java/net/minestom/server/entity/Player.java +++ b/src/main/java/net/minestom/server/entity/Player.java @@ -749,11 +749,19 @@ public class Player extends LivingEntity implements CommandSender { super.setInstance(instance); + // runnable used to send newly visible chunks to player once spawned in the instance + final Runnable refreshRunnable = () -> { + final Chunk chunk = getChunk(); + if (chunk != null) { + refreshVisibleChunks(chunk); + } + }; + if (spawnPosition != null && !position.isSimilar(spawnPosition)) { teleport(spawnPosition, - position.inSameChunk(spawnPosition) ? () -> refreshVisibleChunks(getChunk()) : null); + position.inSameChunk(spawnPosition) ? refreshRunnable : null); } else { - refreshVisibleChunks(getChunk()); + refreshRunnable.run(); } PlayerSpawnEvent spawnEvent = new PlayerSpawnEvent(this, instance, firstSpawn); diff --git a/src/main/java/net/minestom/server/utils/Position.java b/src/main/java/net/minestom/server/utils/Position.java index 88ddfe913..3a79a167b 100644 --- a/src/main/java/net/minestom/server/utils/Position.java +++ b/src/main/java/net/minestom/server/utils/Position.java @@ -264,11 +264,11 @@ public class Position implements PublicCloneable { * @return true if 'this' is in the same chunk as {@code position} */ public boolean inSameChunk(@NotNull Position position) { - final int chunkX1 = ChunkUtils.getChunkCoordinate((int) Math.floor(getX())); - final int chunkZ1 = ChunkUtils.getChunkCoordinate((int) Math.floor(getZ())); + final int chunkX1 = ChunkUtils.getChunkCoordinate((int) getX()); + final int chunkZ1 = ChunkUtils.getChunkCoordinate((int) getZ()); - final int chunkX2 = ChunkUtils.getChunkCoordinate((int) Math.floor(position.getX())); - final int chunkZ2 = ChunkUtils.getChunkCoordinate((int) Math.floor(position.getZ())); + final int chunkX2 = ChunkUtils.getChunkCoordinate((int) position.getX()); + final int chunkZ2 = ChunkUtils.getChunkCoordinate((int) position.getZ()); return chunkX1 == chunkX2 && chunkZ1 == chunkZ2; }