44 private const FLAG_POPULATED = 1 << 1;
46 private function __construct(){
50 private static function serializePalettedArray(ByteBufferWriter $stream, PalettedBlockArray $array) :
void{
51 $wordArray = $array->getWordArray();
52 $palette = $array->getPalette();
54 Byte::writeUnsigned($stream, $array->getBitsPerBlock());
55 $stream->writeByteArray($wordArray);
56 $serialPalette = pack(
"L*", ...$palette);
57 BE::writeUnsignedInt($stream, strlen($serialPalette));
58 $stream->writeByteArray($serialPalette);
66 $stream = new ByteBufferWriter();
67 Byte::writeUnsigned($stream, ($chunk->isPopulated() ? self::FLAG_POPULATED : 0));
71 $count = count($subChunks);
72 Byte::writeUnsigned($stream, $count);
74 foreach($subChunks as $y => $subChunk){
75 Byte::writeSigned($stream, $y);
76 BE::writeUnsignedInt($stream, $subChunk->getEmptyBlockId());
78 $layers = $subChunk->getBlockLayers();
79 Byte::writeUnsigned($stream, count($layers));
80 foreach($layers as $blocks){
81 self::serializePalettedArray($stream, $blocks);
83 self::serializePalettedArray($stream, $subChunk->getBiomeArray());
87 return $stream->getData();
90 private static function deserializePalettedArray(ByteBufferReader $stream) : PalettedBlockArray{
91 $bitsPerBlock = Byte::readUnsigned($stream);
92 $words = $stream->readByteArray(PalettedBlockArray::getExpectedWordArraySize($bitsPerBlock));
93 $paletteSize = BE::readUnsignedInt($stream);
95 $unpackedPalette = unpack(
"L*", $stream->readByteArray($paletteSize));
96 $palette = array_values($unpackedPalette);
98 return PalettedBlockArray::fromData($bitsPerBlock, $words, $palette);
105 $stream = new ByteBufferReader($data);
107 $flags = Byte::readUnsigned($stream);
108 $terrainPopulated = (bool) ($flags & self::FLAG_POPULATED);
112 $count = Byte::readUnsigned($stream);
113 for($subCount = 0; $subCount < $count; ++$subCount){
114 $y = Byte::readSigned($stream);
116 $airBlockId = BE::readUnsignedInt($stream);
119 for($i = 0, $layerCount = Byte::readUnsigned($stream); $i < $layerCount; ++$i){
120 $layers[] = self::deserializePalettedArray($stream);
122 $biomeArray = self::deserializePalettedArray($stream);
123 $subChunks[$y] =
new SubChunk($airBlockId, $layers, $biomeArray);
126 return new Chunk($subChunks, $terrainPopulated);