From 55ef6eec6650d8053a1ea12a414e4c41036ec0df Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Thu, 2 Aug 2018 15:59:11 +0300 Subject: [PATCH] stash 3 --- .../proto_1_12_2/packets/ChunkDataPacket.java | 94 +++++++++++++++---- 1 file changed, 78 insertions(+), 16 deletions(-) diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/ChunkDataPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/ChunkDataPacket.java index f1e9f98..af8789f 100644 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/ChunkDataPacket.java +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/ChunkDataPacket.java @@ -11,6 +11,7 @@ import lombok.extern.slf4j.Slf4j; import mc.core.network.NetOutputStream; import mc.core.network.SCPacket; import mc.core.network.proto_1_12_2.ByteArrayOutputNetStream; +import mc.core.world.Block; import mc.core.world.Chunk; import java.io.ByteArrayOutputStream; @@ -40,7 +41,7 @@ Packet structure | +------------------------------------------------+ | | | Chunk Section | Byte array | | - https://wiki.vg/Chunk_Format#Chunk_Section_structure | | +------------------------------------------+ | | -| | | Bits Per Block | Unsigned Byte | | | +| | | Bits Per Block | Unsigned Byte | | | (we use 4 bits per block) | | |--------------------|---------------------| | | | | | Palette | Byte array | | | - https://wiki.vg/Chunk_Format#Palettes | | | +------------------------------------+ | | | (we use Indirect type palette) @@ -53,9 +54,9 @@ Packet structure | | |--------------------|---------------------| | | | | | Data Array | Array of Long | | | | | |--------------------|---------------------| | | -| | | Block Light | Byte Array | | | +| | | Block Light | Byte Array | | | (Half byte per block) | | |--------------------|---------------------| | | -| | | Sky Light | Optional Byte Array | | | +| | | Sky Light | Optional Byte Array | | | (Only if in the Overworld; half byte per block) | | +------------------------------------------+ | | | |-----------------------|------------------------| | | | Biomes | Optional Byte array | | @@ -79,25 +80,86 @@ public class ChunkDataPacket implements SCPacket { @Getter private List chunks = new ArrayList<>(); + private long serializeBlockState(Block block) { + return (block.getId() << 4) | block.getState(); + } + @Override public void writeSelf(NetOutputStream netStream) { - netStream.writeInt(x); - netStream.writeInt(z); - netStream.writeBoolean(initChunk); + netStream.writeInt(x); // Chunk X + netStream.writeInt(z); // Chunk Y + netStream.writeBoolean(initChunk); // Init Chunk netStream.writeVarInt(0b11111111); // Primary Bit Mask - ByteArrayOutputNetStream baos = new ByteArrayOutputNetStream(); + final ByteArrayOutputNetStream data = new ByteArrayOutputNetStream(); + for (Chunk chunk : chunks) { - // - // - // - // - // - // + final List palette = new ArrayList<>(); + final ByteArrayOutputNetStream dataArray = new ByteArrayOutputNetStream(); + final ByteArrayOutputNetStream blockLight = new ByteArrayOutputNetStream(); + final ByteArrayOutputNetStream skyLight = new ByteArrayOutputNetStream(); + final ByteArrayOutputNetStream biomes = new ByteArrayOutputNetStream(); + + int blockLightCompacted = 0; + boolean flagFirstHalf = true; + + for (int y = 0; y < 16; y++) { + for (int z = 0; z < 16; z++) { + for (int x = 0; x < 16; x++) { + Block block = chunk.getBlock(x, y, z); + long blockState = serializeBlockState(block); + + int currentIndexPaletteBlock; + if (!palette.contains(blockState)) { + palette.add(blockState); + currentIndexPaletteBlock = palette.size()-1; + } else { + currentIndexPaletteBlock = palette.indexOf(blockState); + } + + dataArray.writeLong(currentIndexPaletteBlock); + if (flagFirstHalf) { + blockLightCompacted = block.getLight(); + flagFirstHalf = false; + } else { + blockLightCompacted = (blockLightCompacted << 4) | block.getLight(); + blockLight.writeByte(blockLightCompacted); + flagFirstHalf = true; + skyLight.writeByte(0b11111111); //FIXME + } + + biomes.writeByte(chunk.getBiome(x, z)); + } + } + } + + // + // + data.writeUnsignedByte(4); // Bits Per Block + data.writeVarInt(palette.size()); // Size of palette + palette.stream() + .mapToInt(Long::intValue) + .forEach(data::writeVarInt); // Palette + // + // + data.writeVarInt(dataArray.size()); // Size of Data Array + data.writeBytes(dataArray.toByteArray()); // Data Array + // + // + data.writeBytes(blockLight.toByteArray()); + // + // + data.writeBytes(skyLight.toByteArray()); + // + // + // + data.writeBytes(biomes.toByteArray()); + // } - netStream.writeVarInt(baos.size()); // Size of Data in bytes - netStream.writeBytes(baos.toByteArray()); // Data chunks - netStream.writeVarInt(0); // size NBT + + netStream.writeVarInt(data.size()); // Size of Data + netStream.writeBytes(data.toByteArray()); // Data + netStream.writeVarInt(0); // Number of block entities /* writeNBT */ } }