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)); + + + //