From 36c95660e696da0be91dce55993c138b141e6fdd Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 19 May 2017 11:30:23 +0100 Subject: [PATCH] Fixed some logic issues with async compression --- src/pocketmine/Server.php | 12 ++++---- .../network/CompressBatchedTask.php | 29 +++++++++---------- 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/src/pocketmine/Server.php b/src/pocketmine/Server.php index 8022dd668..0ec48e5b1 100644 --- a/src/pocketmine/Server.php +++ b/src/pocketmine/Server.php @@ -1787,8 +1787,8 @@ class Server{ $pk->addPacket($p); } - if(!$forceSync and $this->networkCompressionAsync){ - $task = new CompressBatchedTask($pk, $targets, $this->networkCompressionLevel, $immediate); + if(!$forceSync and !$immediate and $this->networkCompressionAsync){ + $task = new CompressBatchedTask($pk, $targets, $this->networkCompressionLevel); $this->getScheduler()->scheduleAsyncTask($task); }else{ $pk->compress($this->networkCompressionLevel); @@ -1799,9 +1799,11 @@ class Server{ Timings::$playerNetworkTimer->stopTiming(); } - public function broadcastPacketsCallback(BatchPacket $pk, array $identifiers, bool $immediate){ - $pk->encode(); - $pk->isEncoded = true; + public function broadcastPacketsCallback(BatchPacket $pk, array $identifiers, bool $immediate = false){ + if(!$pk->isEncoded){ + $pk->encode(); + $pk->isEncoded = true; + } if($immediate){ foreach($identifiers as $i){ diff --git a/src/pocketmine/network/CompressBatchedTask.php b/src/pocketmine/network/CompressBatchedTask.php index ba06c168f..8b660fdcd 100644 --- a/src/pocketmine/network/CompressBatchedTask.php +++ b/src/pocketmine/network/CompressBatchedTask.php @@ -29,30 +29,29 @@ class CompressBatchedTask extends AsyncTask{ public $level = 7; public $data; - public $final; public $targets; - public $immediate = false; - public function __construct(BatchPacket $data, array $targets, $level = 7, bool $sendImmediate = false){ - $this->data = serialize($data); - $this->targets = $targets; + public function __construct(BatchPacket $batch, array $targets, $level = 7){ + $this->data = $batch->payload; + $this->targets = serialize($targets); $this->level = $level; - $this->immediate = $sendImmediate; } public function onRun(){ - try{ - /** @var BatchPacket $pk */ - $pk = unserialize($this->data); - $pk->compress($this->level); - $this->final = serialize($pk); - $this->data = null; - }catch(\Throwable $e){ + $batch = new BatchPacket(); + $batch->payload = $this->data; + $this->data = null; - } + $batch->compress($this->level); + $batch->encode(); + + $this->setResult($batch->buffer, false); } public function onCompletion(Server $server){ - $server->broadcastPacketsCallback(unserialize($this->final), (array) $this->targets, $this->immediate); + $pk = new BatchPacket($this->getResult()); + $pk->isEncoded = true; + $pk->compressed = true; + $server->broadcastPacketsCallback($pk, unserialize($this->targets)); } }