diff --git a/protocol/src/main/java/mc/protocol/model/Location.java b/protocol/src/main/java/mc/protocol/model/Location.java index 697f64b..483db15 100644 --- a/protocol/src/main/java/mc/protocol/model/Location.java +++ b/protocol/src/main/java/mc/protocol/model/Location.java @@ -9,4 +9,16 @@ public class Location { private double x; private double y; private double z; + + public int getIntX() { + return (int) x; + } + + public int getIntZ() { + return (int) z; + } + + public Location toChunkXZ() { + return new Location(this.getIntX() >> 4, 0d, this.getIntZ() >> 4); + } } diff --git a/server/src/main/java/mc/server/PacketHandler.java b/server/src/main/java/mc/server/PacketHandler.java index 8a97201..11ae54f 100644 --- a/server/src/main/java/mc/server/PacketHandler.java +++ b/server/src/main/java/mc/server/PacketHandler.java @@ -15,7 +15,8 @@ import mc.protocol.packets.server.*; import mc.protocol.serializer.TextSerializer; import mc.protocol.utils.Difficulty; import mc.protocol.utils.GameMode; -import mc.protocol.utils.LevelType; +import mc.protocol.world.Chunk; +import mc.protocol.world.World; import mc.server.config.Config; import org.apache.commons.io.IOUtils; @@ -34,6 +35,7 @@ public class PacketHandler { private final Random random = new Random(System.currentTimeMillis()); private final Config config; + private final World world; public void onHandshake(ConnectionContext context, HandshakePacket packet) { context.setState(packet.getNextState()); @@ -75,6 +77,7 @@ public class PacketHandler { context.sendNow(response); } + @SuppressWarnings("java:S2589") public void onLoginStart(ConnectionContext context, LoginStartPacket loginStartPacket) { var loginSuccessPacket = new LoginSuccessPacket(); loginSuccessPacket.setUuid(UUID.randomUUID()); @@ -88,14 +91,12 @@ public class PacketHandler { joinGamePacket.setGameMode(GameMode.SURVIVAL); joinGamePacket.setDimension(0/*Overworld*/); joinGamePacket.setDifficulty(Difficulty.PEACEFUL); - joinGamePacket.setLevelType(LevelType.FLAT); + joinGamePacket.setLevelType(world.getLevelType()); context.send(joinGamePacket); - Location spawnLocation = new Location(7d, 130d, 7d); - var spawnPositionPacket = new SpawnPositionPacket(); - spawnPositionPacket.setSpawn(spawnLocation); + spawnPositionPacket.setSpawn(world.getSpawn()); context.send(spawnPositionPacket); @@ -111,14 +112,38 @@ public class PacketHandler { context.flushSending(); - var chunkDataPacket = new ChunkDataPacket(); - chunkDataPacket.setX(0); - chunkDataPacket.setZ(0); + Location chunkLocation = world.getSpawn().toChunkXZ(); + Chunk chunk = world.getChunk(chunkLocation.getIntX(), chunkLocation.getIntZ()); - context.sendNow(chunkDataPacket); + var chunkDataPacket = new ChunkDataPacket(); + chunkDataPacket.setX(chunk.getX()); + chunkDataPacket.setZ(chunk.getZ()); + + context.send(chunkDataPacket); + + for (int i = 1; i <= config.world().viewDistance(); i++) { + int minX = chunkLocation.getIntX() - i; + int minZ = chunkLocation.getIntZ() - i; + int maxX = chunkLocation.getIntX() + i; + int maxZ = chunkLocation.getIntZ() + i; + + for (int z = minZ; z <= maxZ; z++) { + for (int x = minX; x <= maxX; x++) { + if ((z == minZ || z == maxZ) || (x == minX || x == maxX)) { + chunkDataPacket = new ChunkDataPacket(); + chunkDataPacket.setX(x); + chunkDataPacket.setZ(z); + + context.send(chunkDataPacket); + } + } + } + } + + context.flushSending(); var playerPositionAndLookPacket = new SPlayerPositionAndLookPacket(); - playerPositionAndLookPacket.setPosition(spawnLocation); + playerPositionAndLookPacket.setPosition(world.getSpawn()); playerPositionAndLookPacket.setLook(new Look(0f, 0f)); playerPositionAndLookPacket.setTeleportId(random.nextInt()); diff --git a/server/src/main/java/mc/server/di/PacketHandlerModule.java b/server/src/main/java/mc/server/di/PacketHandlerModule.java index d90f3a7..750652c 100644 --- a/server/src/main/java/mc/server/di/PacketHandlerModule.java +++ b/server/src/main/java/mc/server/di/PacketHandlerModule.java @@ -2,6 +2,7 @@ package mc.server.di; import dagger.Module; import dagger.Provides; +import mc.protocol.world.World; import mc.server.PacketHandler; import mc.server.config.Config; @@ -9,7 +10,7 @@ import mc.server.config.Config; public class PacketHandlerModule { @Provides - public PacketHandler providePacketHandler(Config config) { - return new PacketHandler(config); + public PacketHandler providePacketHandler(Config config, World world) { + return new PacketHandler(config, world); } } diff --git a/server/src/main/java/mc/server/di/ServerComponent.java b/server/src/main/java/mc/server/di/ServerComponent.java index 9b7ec2e..ad89a4d 100644 --- a/server/src/main/java/mc/server/di/ServerComponent.java +++ b/server/src/main/java/mc/server/di/ServerComponent.java @@ -1,12 +1,14 @@ package mc.server.di; import dagger.Component; +import mc.protocol.di.ServerScope; import mc.server.PacketHandler; import mc.server.config.Config; @Component(modules = { - ConfigModule.class, PacketHandlerModule.class + ConfigModule.class, PacketHandlerModule.class, WorldModule.class }) +@ServerScope public interface ServerComponent { Config getConfig(); diff --git a/server/src/main/java/mc/server/di/WorldModule.java b/server/src/main/java/mc/server/di/WorldModule.java new file mode 100644 index 0000000..b2ecf19 --- /dev/null +++ b/server/src/main/java/mc/server/di/WorldModule.java @@ -0,0 +1,17 @@ +package mc.server.di; + +import dagger.Module; +import dagger.Provides; +import mc.protocol.di.ServerScope; +import mc.protocol.world.World; +import mc.server.world.VoidWorld; + +@Module +public class WorldModule { + + @Provides + @ServerScope + public World provideWorld() { + return new VoidWorld(); + } +}