diff --git a/src/pocketmine/level/format/Chunk.php b/src/pocketmine/level/format/Chunk.php index 4c3349c15..dd6fa64ec 100644 --- a/src/pocketmine/level/format/Chunk.php +++ b/src/pocketmine/level/format/Chunk.php @@ -887,20 +887,31 @@ class Chunk{ $stream = new BinaryStream(); $stream->putInt($this->x); $stream->putInt($this->z); - $count = 0; - $subChunks = ""; - foreach($this->subChunks as $y => $subChunk){ - if($subChunk instanceof EmptySubChunk){ - continue; + $stream->putByte(($this->lightPopulated ? 4 : 0) | ($this->terrainPopulated ? 2 : 0) | ($this->terrainGenerated ? 1 : 0)); + if($this->terrainGenerated){ + //subchunks + $count = 0; + $subChunks = ""; + foreach($this->subChunks as $y => $subChunk){ + if($subChunk instanceof EmptySubChunk){ + continue; + } + ++$count; + $subChunks .= chr($y) . $subChunk->getBlockIdArray() . $subChunk->getBlockDataArray(); + if($this->lightPopulated){ + $subChunks .= $subChunk->getBlockSkyLightArray() . $subChunk->getBlockLightArray(); + } + } + $stream->putByte($count); + $stream->put($subChunks); + + //biomes + $stream->put($this->biomeIds); + if($this->lightPopulated){ + $stream->put(pack("v*", ...$this->heightMap)); } - ++$count; - $subChunks .= chr($y) . $subChunk->fastSerialize(); } - $stream->putByte($count); - $stream->put($subChunks); - $stream->put(pack("v*", ...$this->heightMap) . - $this->biomeIds . - chr(($this->lightPopulated ? 4 : 0) | ($this->terrainPopulated ? 2 : 0) | ($this->terrainGenerated ? 1 : 0))); + return $stream->getBuffer(); } @@ -916,19 +927,36 @@ class Chunk{ $x = $stream->getInt(); $z = $stream->getInt(); + $flags = $stream->getByte(); + $lightPopulated = (bool) ($flags & 4); + $terrainPopulated = (bool) ($flags & 2); + $terrainGenerated = (bool) ($flags & 1); + $subChunks = []; - $count = $stream->getByte(); - for($y = 0; $y < $count; ++$y){ - $subChunks[$stream->getByte()] = SubChunk::fastDeserialize($stream->get(10240)); + $biomeIds = ""; + $heightMap = []; + if($terrainGenerated){ + $count = $stream->getByte(); + for($y = 0; $y < $count; ++$y){ + $subChunks[$stream->getByte()] = new SubChunk( + $stream->get(4096), //blockids + $stream->get(2048), //blockdata + $lightPopulated ? $stream->get(2048) : "", //skylight + $lightPopulated ? $stream->get(2048) : "" //blocklight + ); + } + + $biomeIds = $stream->get(256); + if($lightPopulated){ + $heightMap = array_values(unpack("v*", $stream->get(512))); + } } - $heightMap = array_values(unpack("v*", $stream->get(512))); - $biomeIds = $stream->get(256); $chunk = new Chunk($x, $z, $subChunks, [], [], $biomeIds, $heightMap); - $flags = $stream->getByte(); - $chunk->lightPopulated = (bool) ($flags & 4); - $chunk->terrainPopulated = (bool) ($flags & 2); - $chunk->terrainGenerated = (bool) ($flags & 1); + $chunk->setGenerated($terrainGenerated); + $chunk->setPopulated($terrainPopulated); + $chunk->setLightPopulated($lightPopulated); + return $chunk; } } diff --git a/src/pocketmine/level/format/EmptySubChunk.php b/src/pocketmine/level/format/EmptySubChunk.php index 7d8c22544..1e137ae05 100644 --- a/src/pocketmine/level/format/EmptySubChunk.php +++ b/src/pocketmine/level/format/EmptySubChunk.php @@ -126,8 +126,4 @@ class EmptySubChunk implements SubChunkInterface{ public function networkSerialize() : string{ return "\x00" . str_repeat("\x00", 6144); } - - public function fastSerialize() : string{ - throw new \BadMethodCallException("Should not try to serialize empty subchunks"); - } } diff --git a/src/pocketmine/level/format/SubChunk.php b/src/pocketmine/level/format/SubChunk.php index 33ce57d6b..650a566c5 100644 --- a/src/pocketmine/level/format/SubChunk.php +++ b/src/pocketmine/level/format/SubChunk.php @@ -222,23 +222,6 @@ class SubChunk implements SubChunkInterface{ return "\x00" . $this->ids . $this->data; } - public function fastSerialize() : string{ - return - $this->ids . - $this->data . - $this->skyLight . - $this->blockLight; - } - - public static function fastDeserialize(string $data) : SubChunk{ - return new SubChunk( - substr($data, 0, 4096), //ids - substr($data, 4096, 2048), //data - substr($data, 6144, 2048), //sky light - substr($data, 8192, 2048) //block light - ); - } - public function __debugInfo(){ return []; } diff --git a/src/pocketmine/level/format/SubChunkInterface.php b/src/pocketmine/level/format/SubChunkInterface.php index f777b67ec..e7d4cde8b 100644 --- a/src/pocketmine/level/format/SubChunkInterface.php +++ b/src/pocketmine/level/format/SubChunkInterface.php @@ -202,9 +202,4 @@ interface SubChunkInterface{ * @return string */ public function networkSerialize() : string; - - /** - * @return string - */ - public function fastSerialize() : string; }