From af430ebc3f1a87c1a08e90e73fc15040c61cee00 Mon Sep 17 00:00:00 2001 From: Felix Cravic Date: Wed, 27 May 2020 22:06:22 +0200 Subject: [PATCH] Entity#getPosition is now fully synchronized with the entity position --- src/main/java/fr/themode/demo/MainDemo.java | 71 +++++++++++++++++++ .../demo/generator/ChunkGeneratorDemo.java | 2 +- .../net/minestom/server/entity/Entity.java | 10 +++ 3 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 src/main/java/fr/themode/demo/MainDemo.java diff --git a/src/main/java/fr/themode/demo/MainDemo.java b/src/main/java/fr/themode/demo/MainDemo.java new file mode 100644 index 000000000..08c86e761 --- /dev/null +++ b/src/main/java/fr/themode/demo/MainDemo.java @@ -0,0 +1,71 @@ +package fr.themode.demo; + +import net.minestom.server.MinecraftServer; +import net.minestom.server.event.player.PlayerLoginEvent; +import net.minestom.server.event.player.PlayerSpawnEvent; +import net.minestom.server.instance.*; +import net.minestom.server.instance.batch.ChunkBatch; +import net.minestom.server.instance.block.Block; +import net.minestom.server.network.ConnectionManager; +import net.minestom.server.utils.Position; + +import java.util.Arrays; +import java.util.List; + +public class MainDemo { + + public static void main(String[] args) { + // Initialization + MinecraftServer minecraftServer = MinecraftServer.init(); + + InstanceManager instanceManager = MinecraftServer.getInstanceManager(); + // Create the instance + InstanceContainer instanceContainer = instanceManager.createInstanceContainer(); + // Set the ChunkGenerator + instanceContainer.setChunkGenerator(new GeneratorDemo()); + // Enable the auto chunk loading (when players come close) + instanceContainer.enableAutoChunkLoad(true); + + // Add event listeners + ConnectionManager connectionManager = MinecraftServer.getConnectionManager(); + connectionManager.addPlayerInitialization(player -> { + // Set the spawning instance + player.addEventCallback(PlayerLoginEvent.class, event -> { + event.setSpawningInstance(instanceContainer); + }); + + // Teleport the player at spawn + player.addEventCallback(PlayerSpawnEvent.class, event -> { + player.teleport(new Position(0, 45, 0)); + }); + }); + + // Start the server + minecraftServer.start("localhost", 55555); + } + + private static class GeneratorDemo extends ChunkGenerator { + + @Override + public void generateChunkData(ChunkBatch batch, int chunkX, int chunkZ) { + // Set chunk blocks + for (byte x = 0; x < Chunk.CHUNK_SIZE_X; x++) + for (byte z = 0; z < Chunk.CHUNK_SIZE_Z; z++) { + for (byte y = 0; y < 40; y++) { + batch.setBlock(x, y, z, Block.STONE); + } + } + } + + @Override + public void fillBiomes(Biome[] biomes, int chunkX, int chunkZ) { + Arrays.fill(biomes, Biome.PLAINS); + } + + @Override + public List getPopulators() { + return null; + } + } + +} diff --git a/src/main/java/fr/themode/demo/generator/ChunkGeneratorDemo.java b/src/main/java/fr/themode/demo/generator/ChunkGeneratorDemo.java index 6a2d064c8..4beae2907 100644 --- a/src/main/java/fr/themode/demo/generator/ChunkGeneratorDemo.java +++ b/src/main/java/fr/themode/demo/generator/ChunkGeneratorDemo.java @@ -16,7 +16,7 @@ public class ChunkGeneratorDemo extends ChunkGenerator { public void generateChunkData(ChunkBatch batch, int chunkX, int chunkZ) { for (byte x = 0; x < Chunk.CHUNK_SIZE_X; x++) for (byte z = 0; z < Chunk.CHUNK_SIZE_Z; z++) { - for (byte y = 0; y < 65; y++) { + for (byte y = 0; y < 40; y++) { batch.setBlock(x, y, z, Block.STONE); } } diff --git a/src/main/java/net/minestom/server/entity/Entity.java b/src/main/java/net/minestom/server/entity/Entity.java index 12c9e9c61..f02acddcc 100644 --- a/src/main/java/net/minestom/server/entity/Entity.java +++ b/src/main/java/net/minestom/server/entity/Entity.java @@ -55,6 +55,7 @@ public abstract class Entity implements Viewable, EventHandler, DataContainer { protected Instance instance; protected Position position; protected float lastX, lastY, lastZ; + protected float cacheX, cacheY, cacheZ; // Used to synchronize with #getPosition protected float lastYaw, lastPitch; private int id; @@ -286,6 +287,12 @@ public abstract class Entity implements Viewable, EventHandler, DataContainer { return; } + if (cacheX != position.getX() || + cacheY != position.getY() || + cacheZ != position.getZ()) { + teleport(position); + } + if (shouldUpdate(time)) { this.lastUpdate = time; @@ -689,6 +696,9 @@ public abstract class Entity implements Viewable, EventHandler, DataContainer { position.setX(x); position.setY(y); position.setZ(z); + this.cacheX = x; + this.cacheY = y; + this.cacheZ = z; if (hasPassenger()) { for (Entity passenger : getPassengers()) {