diff --git a/src/main/java/net/minestom/server/entity/EntityManager.java b/src/main/java/net/minestom/server/entity/EntityManager.java index a38fbec48..05af5b7a8 100644 --- a/src/main/java/net/minestom/server/entity/EntityManager.java +++ b/src/main/java/net/minestom/server/entity/EntityManager.java @@ -57,7 +57,6 @@ public final class EntityManager { private void waitingPlayersTick() { Player waitingPlayer; while ((waitingPlayer = waitingPlayers.poll()) != null) { - waitingPlayer.init(); PlayerLoginEvent loginEvent = new PlayerLoginEvent(waitingPlayer); waitingPlayer.callEvent(PlayerLoginEvent.class, loginEvent); @@ -65,6 +64,8 @@ public final class EntityManager { Check.notNull(spawningInstance, "You need to specify a spawning instance in the PlayerLoginEvent"); + waitingPlayer.init(); + spawningInstance.scheduleNextTick(waitingPlayer::setInstance); } } diff --git a/src/main/java/net/minestom/server/entity/Player.java b/src/main/java/net/minestom/server/entity/Player.java index a5ce26e36..dbd70552c 100644 --- a/src/main/java/net/minestom/server/entity/Player.java +++ b/src/main/java/net/minestom/server/entity/Player.java @@ -702,7 +702,7 @@ public class Player extends LivingEntity implements CommandSender { sendDimension(instanceDimensionType); } - final long[] visibleChunks = ChunkUtils.getChunksInRange(firstSpawn ? getRespawnPoint() : position, getChunkRange()); + final long[] visibleChunks = ChunkUtils.getChunksInRange(position, getChunkRange()); final int length = visibleChunks.length; AtomicInteger counter = new AtomicInteger(0); @@ -714,8 +714,9 @@ public class Player extends LivingEntity implements CommandSender { if (chunk != null) { chunk.addViewer(this); if (chunk.getChunkX() == ChunkUtils.getChunkCoordinate((int) getPosition().getX()) && - chunk.getChunkZ() == ChunkUtils.getChunkCoordinate((int) getPosition().getZ())) + chunk.getChunkZ() == ChunkUtils.getChunkCoordinate((int) getPosition().getZ())) { updateViewPosition(chunk); + } } final boolean isLast = counter.get() == length - 1; if (isLast) { @@ -747,15 +748,12 @@ public class Player extends LivingEntity implements CommandSender { private void spawnPlayer(Instance instance, boolean firstSpawn) { this.viewableEntities.forEach(entity -> entity.removeViewer(this)); + super.setInstance(instance); + if (firstSpawn) { - this.position = getRespawnPoint(); - this.cacheX = position.getX(); - this.cacheY = position.getY(); - this.cacheZ = position.getZ(); - updatePlayerPosition(); + teleport(getRespawnPoint()); } - super.setInstance(instance); PlayerSpawnEvent spawnEvent = new PlayerSpawnEvent(this, instance, firstSpawn); callEvent(PlayerSpawnEvent.class, spawnEvent);