use pocketmine\network\mcpe\handler\PacketHandler; use function count; class LevelChunkPacket extends DataPacket implements ClientboundPacket{ public const NETWORK_ID = ProtocolInfo::LEVEL_CHUNK_PACKET; /** @var int */ private $chunkX; /** @var int */ private $chunkZ; /** @var int */ private $subChunkCount; /** @var bool */ private $cacheEnabled; /** @var int[] */ private $usedBlobHashes = []; /** @var string */ private $extraPayload; public static function withoutCache(int $chunkX, int $chunkZ, int $subChunkCount, string $payload) : self{ $result = new self; $result->chunkX = $chunkX; $result->chunkZ = $chunkZ; $result->subChunkCount = $subChunkCount; $result->extraPayload = $payload; $result->cacheEnabled = false; return $result; } /** * @param int[] $usedBlobHashes */ public static function withCache(int $chunkX, int $chunkZ, int $subChunkCount, array $usedBlobHashes, string $extraPayload) : self{ (static function(int ...$hashes){})(...$usedBlobHashes); $result = new self; $result->chunkX = $chunkX; $result->chunkZ = $chunkZ; $result->subChunkCount = $subChunkCount; $result->extraPayload = $extraPayload; $result->cacheEnabled = true; $result->usedBlobHashes = $usedBlobHashes; return $result; } public function getChunkX() : int{ return $this->chunkX; } public function getChunkZ() : int{ return $this->chunkZ; } public function getSubChunkCount() : int{ return $this->subChunkCount; } public function isCacheEnabled() : bool{ return $this->cacheEnabled; } /** * @return int[] */ public function getUsedBlobHashes() : array{ return $this->usedBlobHashes; } public function getExtraPayload() : string{ return $this->extraPayload; } protected function decodePayload() : void{ $this->chunkX = $this->getVarInt(); $this->chunkZ = $this->getVarInt(); $this->subChunkCount = $this->getUnsignedVarInt(); $this->cacheEnabled = $this->getBool(); if($this->cacheEnabled){ for($i = 0, $count = $this->getUnsignedVarInt(); $i < $count; ++$i){ $this->usedBlobHashes[] = $this->getLLong(); } } $this->extraPayload = $this->getString(); } protected function encodePayload() : void{ $this->putVarInt($this->chunkX); $this->putVarInt($this->chunkZ); $this->putUnsignedVarInt($this->subChunkCount); $this->putBool($this->cacheEnabled); if($this->cacheEnabled){ $this->putUnsignedVarInt(count($this->usedBlobHashes)); foreach($this->usedBlobHashes as $hash){ $this->putLLong($hash); } } $this->putString($this->extraPayload); } public function handle(PacketHandler $handler) : bool{ return $handler->handleLevelChunk($this); } }