diff --git a/src/main/java/fr/themode/minestom/entity/Player.java b/src/main/java/fr/themode/minestom/entity/Player.java index 9b13dfe91..993848fdb 100644 --- a/src/main/java/fr/themode/minestom/entity/Player.java +++ b/src/main/java/fr/themode/minestom/entity/Player.java @@ -1,7 +1,9 @@ package fr.themode.minestom.entity; import fr.themode.minestom.Main; +import fr.themode.minestom.instance.Chunk; import fr.themode.minestom.net.packet.server.play.EntityTeleportPacket; +import fr.themode.minestom.net.packet.server.play.PlayerPositionAndLookPacket; import fr.themode.minestom.net.packet.server.play.UpdateViewPositionPacket; import fr.themode.minestom.net.player.PlayerConnection; @@ -42,6 +44,23 @@ public class Player extends LivingEntity { playerConnection.sendPacket(new UpdateViewPositionPacket(Math.floorDiv((int) x, 16), Math.floorDiv((int) z, 16))); } + public boolean chunkTest(double x, double z) { + Chunk newChunk = getInstance().getChunk((int) Math.floor(x / 16), (int) Math.floor(z / 16)); + if (newChunk == null) { + PlayerPositionAndLookPacket positionAndLookPacket = new PlayerPositionAndLookPacket(); + positionAndLookPacket.x = getX(); + positionAndLookPacket.y = getY(); + positionAndLookPacket.z = getZ(); + positionAndLookPacket.yaw = getYaw(); + positionAndLookPacket.pitch = getPitch(); + positionAndLookPacket.flags = 0x00; + positionAndLookPacket.teleportId = 67; + getPlayerConnection().sendPacket(positionAndLookPacket); + return true; + } + return false; + } + public String getUsername() { return username; } diff --git a/src/main/java/fr/themode/minestom/instance/Instance.java b/src/main/java/fr/themode/minestom/instance/Instance.java index 25f3e3add..d54a7f64c 100644 --- a/src/main/java/fr/themode/minestom/instance/Instance.java +++ b/src/main/java/fr/themode/minestom/instance/Instance.java @@ -8,15 +8,16 @@ import fr.themode.minestom.utils.GroupedCollections; import java.util.Collections; import java.util.HashSet; import java.util.Set; +import java.util.UUID; public class Instance { - private int id; + private UUID uniqueId; private Set chunksSet = Collections.synchronizedSet(new HashSet<>()); - public Instance(int id) { - this.id = id; + public Instance(UUID uniqueId) { + this.uniqueId = uniqueId; } // TODO BlockBatch with pool @@ -98,8 +99,8 @@ public class Instance { return players; } - public int getId() { - return id; + public UUID getUniqueId() { + return uniqueId; } private Chunk createChunk(int chunkX, int chunkZ) { diff --git a/src/main/java/fr/themode/minestom/instance/InstanceManager.java b/src/main/java/fr/themode/minestom/instance/InstanceManager.java index 7343e81ec..58a530280 100644 --- a/src/main/java/fr/themode/minestom/instance/InstanceManager.java +++ b/src/main/java/fr/themode/minestom/instance/InstanceManager.java @@ -3,19 +3,14 @@ package fr.themode.minestom.instance; import java.util.Collections; import java.util.HashSet; import java.util.Set; +import java.util.UUID; public class InstanceManager { - private static volatile int lastInstanceId; - private Set instances = Collections.synchronizedSet(new HashSet<>()); - private static int generateId() { - return ++lastInstanceId; - } - public Instance createInstance() { - Instance instance = new Instance(generateId()); + Instance instance = new Instance(UUID.randomUUID()); this.instances.add(instance); return instance; } diff --git a/src/main/java/fr/themode/minestom/net/packet/client/play/ClientPlayerPositionAndLookPacket.java b/src/main/java/fr/themode/minestom/net/packet/client/play/ClientPlayerPositionAndLookPacket.java index 665e75cbd..4176a6940 100644 --- a/src/main/java/fr/themode/minestom/net/packet/client/play/ClientPlayerPositionAndLookPacket.java +++ b/src/main/java/fr/themode/minestom/net/packet/client/play/ClientPlayerPositionAndLookPacket.java @@ -12,6 +12,10 @@ public class ClientPlayerPositionAndLookPacket implements ClientPlayPacket { @Override public void process(Player player) { + boolean chunkTest = player.chunkTest(x, z); + if (chunkTest) + return; + player.refreshPosition(x, y, z); player.refreshView(yaw, pitch); player.refreshOnGround(onGround); diff --git a/src/main/java/fr/themode/minestom/net/packet/client/play/ClientPlayerPositionPacket.java b/src/main/java/fr/themode/minestom/net/packet/client/play/ClientPlayerPositionPacket.java index 563e8cf67..c31afcc7b 100644 --- a/src/main/java/fr/themode/minestom/net/packet/client/play/ClientPlayerPositionPacket.java +++ b/src/main/java/fr/themode/minestom/net/packet/client/play/ClientPlayerPositionPacket.java @@ -11,6 +11,10 @@ public class ClientPlayerPositionPacket implements ClientPlayPacket { @Override public void process(Player player) { + boolean chunkTest = player.chunkTest(x, z); + if (chunkTest) + return; + player.refreshPosition(x, y, z); player.refreshOnGround(onGround); }