/** * @param int $chunkX * @param int $chunkZ * @param string $payload * @param int $ordering * * @return DataPacket */ public static function getChunkCacheFromData($chunkX, $chunkZ, $payload, $ordering = FullChunkDataPacket::ORDER_COLUMNS) { $pk = new FullChunkDataPacket(); $pk->chunkX = $chunkX; $pk->chunkZ = $chunkZ; $pk->order = $ordering; $pk->data = $payload; $pk->encode(); $batch = new BatchPacket(); $batch->payload = zlib_encode(Binary::writeUnsignedVarInt(strlen($pk->getBuffer())) . $pk->getBuffer(), ZLIB_ENCODING_DEFLATE, Server::getInstance()->networkCompressionLevel); $batch->encode(); $batch->isEncoded = true; return $batch; }
/** * Writes an unsigned varint32 to the stream. */ public function putUnsignedVarInt($v) { $this->put(Binary::writeUnsignedVarInt($v)); }
/** * Broadcasts a list of packets in a batch to a list of players * * @param Player[] $players * @param DataPacket[]|string $packets * @param bool $forceSync */ public function batchPackets(array $players, array $packets, $forceSync = false) { Timings::$playerNetworkTimer->startTiming(); $str = ""; foreach ($packets as $p) { if ($p instanceof DataPacket) { if (!$p->isEncoded) { $p->encode(); } $str .= Binary::writeUnsignedVarInt(strlen($p->buffer)) . $p->buffer; } else { $str .= Binary::writeUnsignedVarInt(strlen($p)) . $p; } } $targets = []; foreach ($players as $p) { if ($p->isConnected()) { $targets[] = $this->identifiers[spl_object_hash($p)]; } } if (!$forceSync and $this->networkCompressionAsync) { $task = new CompressBatchedTask($str, $targets, $this->networkCompressionLevel); $this->getScheduler()->scheduleAsyncTask($task); } else { $this->broadcastPacketsCallback(zlib_encode($str, ZLIB_ENCODING_DEFLATE, $this->networkCompressionLevel), $targets); } Timings::$playerNetworkTimer->stopTiming(); }