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