ChunkSerializer: Extract serializeSubChunk() from main serialize() routine

this will be used in the future for cache-based chunk sends.
This commit is contained in:
Dylan K. Taylor 2021-07-17 18:29:14 +01:00
parent 5fbc7681b0
commit e5327a0f3e
No known key found for this signature in database
GPG Key ID: 8927471A91CAFD3D
2 changed files with 25 additions and 20 deletions

View File

@ -71,7 +71,7 @@ class ChunkRequestTask extends AsyncTask{
$chunk = FastChunkSerializer::deserialize($this->chunk);
$subCount = ChunkSerializer::getSubChunkCount($chunk);
$encoderContext = new PacketSerializerContext(GlobalItemTypeDictionary::getInstance()->getDictionary());
$payload = ChunkSerializer::serialize($chunk, RuntimeBlockMapping::getInstance(), $encoderContext, $this->tiles);
$payload = ChunkSerializer::serializeFullChunk($chunk, RuntimeBlockMapping::getInstance(), $encoderContext, $this->tiles);
$this->setResult($this->compressor->compress(PacketBatch::fromPackets($encoderContext, LevelChunkPacket::withoutCache($this->chunkX, $this->chunkZ, $subCount, $payload))->getBuffer()));
}

View File

@ -30,6 +30,7 @@ use pocketmine\network\mcpe\protocol\serializer\PacketSerializerContext;
use pocketmine\utils\Binary;
use pocketmine\utils\BinaryStream;
use pocketmine\world\format\Chunk;
use pocketmine\world\format\SubChunk;
use function count;
final class ChunkSerializer{
@ -53,11 +54,26 @@ final class ChunkSerializer{
return 0;
}
public static function serialize(Chunk $chunk, RuntimeBlockMapping $blockMapper, PacketSerializerContext $encoderContext, ?string $tiles = null) : string{
public static function serializeFullChunk(Chunk $chunk, RuntimeBlockMapping $blockMapper, PacketSerializerContext $encoderContext, ?string $tiles = null) : string{
$stream = PacketSerializer::encoder($encoderContext);
$subChunkCount = self::getSubChunkCount($chunk);
for($y = 0; $y < $subChunkCount; ++$y){
$layers = $chunk->getSubChunk($y)->getBlockLayers();
self::serializeSubChunk($chunk->getSubChunk($y), $blockMapper, $stream);
}
$stream->put($chunk->getBiomeIdArray());
$stream->putByte(0); //border block array count
//Border block entry format: 1 byte (4 bits X, 4 bits Z). These are however useless since they crash the regular client.
if($tiles !== null){
$stream->put($tiles);
}else{
$stream->put(self::serializeTiles($chunk));
}
return $stream->getBuffer();
}
public static function serializeSubChunk(SubChunk $subChunk, RuntimeBlockMapping $blockMapper, PacketSerializer $stream) : void{
$layers = $subChunk->getBlockLayers();
$stream->putByte(8); //version
$stream->putByte(count($layers));
@ -76,17 +92,6 @@ final class ChunkSerializer{
}
}
}
$stream->put($chunk->getBiomeIdArray());
$stream->putByte(0); //border block array count
//Border block entry format: 1 byte (4 bits X, 4 bits Z). These are however useless since they crash the regular client.
if($tiles !== null){
$stream->put($tiles);
}else{
$stream->put(self::serializeTiles($chunk));
}
return $stream->getBuffer();
}
public static function serializeTiles(Chunk $chunk) : string{
$stream = new BinaryStream();