From b768ba5bd9ce778c3168ace02cbe8c7e09d2a3a5 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sun, 2 May 2021 23:56:20 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BE=D1=82=D0=BF=D1=80=D0=B0=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=BF=D1=83=D1=81=D1=82=D0=BE=D0=B3=D0=BE=20=D1=87?= =?UTF-8?q?=D0=B0=D0=BD=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- protocol/src/main/java/mc/protocol/State.java | 1 + .../packets/server/ChunkDataPacket.java | 70 +++++++++++++++++++ .../main/java/mc/server/PacketHandler.java | 6 ++ 3 files changed, 77 insertions(+) create mode 100644 protocol/src/main/java/mc/protocol/packets/server/ChunkDataPacket.java diff --git a/protocol/src/main/java/mc/protocol/State.java b/protocol/src/main/java/mc/protocol/State.java index 39d1dca..ea15576 100644 --- a/protocol/src/main/java/mc/protocol/State.java +++ b/protocol/src/main/java/mc/protocol/State.java @@ -53,6 +53,7 @@ public enum State { Map.of( JoinGamePacket.class, 0x23, SpawnPositionPacket.class, 0x46, + ChunkDataPacket.class, 0x20, PlayerAbilitiesPacket.class,0x2C, SPlayerPositionAndLookPacket.class, 0x2F ) diff --git a/protocol/src/main/java/mc/protocol/packets/server/ChunkDataPacket.java b/protocol/src/main/java/mc/protocol/packets/server/ChunkDataPacket.java new file mode 100644 index 0000000..b298f38 --- /dev/null +++ b/protocol/src/main/java/mc/protocol/packets/server/ChunkDataPacket.java @@ -0,0 +1,70 @@ +package mc.protocol.packets.server; + +import io.netty.buffer.Unpooled; +import lombok.Data; +import mc.protocol.io.NetByteBuf; +import mc.protocol.packets.ServerSidePacket; + +/** + * Данные чанка. + * + *

Структура пакета

+ *
+ * | FIELD                    | TYPE         | NOTES                                                                              |
+ * |--------------------------|------------- |------------------------------------------------------------------------------------|
+ * | Chunk X                  | Integer      | Координаты чанка (координата блока, делённая на 16, округленная в меньшую сторону) |
+ * | Chunk Z                  | Integer      | Координаты чанка (координата блока, делённая на 16, округленная в меньшую сторону) |
+ * | Ground-Up Continuous     | Boolean      | См. Chunk Format                                                                   |
+ * | Primary Bit Mask         | VarInt       | Битовая маска, где каждый бит - это часть чанка (0-15)                             |
+ * | Size of Data             | VarInt       | Размер поля "Data"                                                                 |
+ * | Data                     | Byte array   | Данные чанка. См. Chunk Format                                                     |
+ * | Number of block entities | VarInt       | Количество элементов в поле "Block entities"                                       |
+ * | Block entities           | Array of NBT | Все сущности в чанке                                                               |
+ * 
+ * + * @see Chunk Data + * @see Chunk Format + */ +@Data +public class ChunkDataPacket implements ServerSidePacket { + + private int x; + private int z; + + @Override + public void writeSelf(NetByteBuf netByteBuf) { + netByteBuf.writeInt(x); + netByteBuf.writeInt(z); + netByteBuf.writeBoolean(true); // Ground-Up Continuous + netByteBuf.writeVarInt(0b11111111); // Primary Bit Mask + + NetByteBuf data = new NetByteBuf(Unpooled.buffer()); + // + for (int i = 0; i < 16; i++) { + NetByteBuf dataBuff = new NetByteBuf(Unpooled.buffer(4096)); + NetByteBuf blockLight = new NetByteBuf(Unpooled.buffer(2048)); + NetByteBuf skyLight = new NetByteBuf(Unpooled.buffer(2048)); + NetByteBuf biomes = new NetByteBuf(Unpooled.buffer(256)); + + + // + data.writeUnsignedByte(13); // Bits Per Block + // + data.writeUnsignedByte(0); // Palette Length (for direct) + // + // + data.writeVarInt(dataBuff.readableBytes()); // Data Array Length + data.writeBytes(dataBuff); // Data Array + data.writeBytes(blockLight); // Block Light + data.writeBytes(skyLight); // Sky Light + // + data.writeBytes(biomes); // Biomes + } + // + + netByteBuf.writeVarInt(data.readableBytes()); // Size of Data + netByteBuf.writeBytes(data); // Data + netByteBuf.writeVarInt(0); // Number of block entities + /* write NBT's */ + } +} diff --git a/server/src/main/java/mc/server/PacketHandler.java b/server/src/main/java/mc/server/PacketHandler.java index ef7d8d0..641fd17 100644 --- a/server/src/main/java/mc/server/PacketHandler.java +++ b/server/src/main/java/mc/server/PacketHandler.java @@ -95,6 +95,12 @@ public class PacketHandler { channel.getCtx().flush(); + var chunkDataPacket = new ChunkDataPacket(); + chunkDataPacket.setX(0); + chunkDataPacket.setZ(0); + + channel.getCtx().writeAndFlush(chunkDataPacket); + var playerPositionAndLookPacket = new SPlayerPositionAndLookPacket(); playerPositionAndLookPacket.setPosition(spawnLocation); playerPositionAndLookPacket.setLook(new Look(0f, 0f));