From b56b35b10d643f0b1b98b259daa1b9f888291638 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 17 Feb 2023 20:14:38 +0000 Subject: [PATCH 01/11] ItemEntity: fixed a bunch of suspicious logic in entityBaseTick() closes #5580 --- src/entity/object/ItemEntity.php | 44 +++++++++++++++++++------------- 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/src/entity/object/ItemEntity.php b/src/entity/object/ItemEntity.php index 4a58620f7..08dea0659 100644 --- a/src/entity/object/ItemEntity.php +++ b/src/entity/object/ItemEntity.php @@ -113,33 +113,42 @@ class ItemEntity extends Entity{ $hasUpdate = parent::entityBaseTick($tickDiff); - if(!$this->isFlaggedForDespawn() && $this->pickupDelay !== self::NEVER_DESPAWN){ //Infinite delay + if($this->isFlaggedForDespawn()){ + return $hasUpdate; + } + + if($this->pickupDelay !== self::NEVER_DESPAWN && $this->pickupDelay > 0){ //Infinite delay + $hasUpdate = true; $this->pickupDelay -= $tickDiff; if($this->pickupDelay < 0){ $this->pickupDelay = 0; } - if($this->hasMovementUpdate() && $this->despawnDelay % self::MERGE_CHECK_PERIOD === 0){ - $mergeable = [$this]; //in case the merge target ends up not being this - $mergeTarget = $this; - foreach($this->getWorld()->getNearbyEntities($this->boundingBox->expandedCopy(0.5, 0.5, 0.5), $this) as $entity){ - if(!$entity instanceof ItemEntity || $entity->isFlaggedForDespawn()){ - continue; - } + } - if($entity->isMergeable($this)){ - $mergeable[] = $entity; - if($entity->item->getCount() > $mergeTarget->item->getCount()){ - $mergeTarget = $entity; - } - } + if($this->hasMovementUpdate() && $this->despawnDelay % self::MERGE_CHECK_PERIOD === 0){ + $mergeable = [$this]; //in case the merge target ends up not being this + $mergeTarget = $this; + foreach($this->getWorld()->getNearbyEntities($this->boundingBox->expandedCopy(0.5, 0.5, 0.5), $this) as $entity){ + if(!$entity instanceof ItemEntity || $entity->isFlaggedForDespawn()){ + continue; } - foreach($mergeable as $itemEntity){ - if($itemEntity !== $mergeTarget){ - $itemEntity->tryMergeInto($mergeTarget); + + if($entity->isMergeable($this)){ + $mergeable[] = $entity; + if($entity->item->getCount() > $mergeTarget->item->getCount()){ + $mergeTarget = $entity; } } } + foreach($mergeable as $itemEntity){ + if($itemEntity !== $mergeTarget){ + $itemEntity->tryMergeInto($mergeTarget); + } + } + } + if(!$this->isFlaggedForDespawn() && $this->despawnDelay !== self::NEVER_DESPAWN){ + $hasUpdate = true; $this->despawnDelay -= $tickDiff; if($this->despawnDelay <= 0){ $ev = new ItemDespawnEvent($this); @@ -148,7 +157,6 @@ class ItemEntity extends Entity{ $this->despawnDelay = self::DEFAULT_DESPAWN_DELAY; }else{ $this->flagForDespawn(); - $hasUpdate = true; } } } From 9cdb6419367d41f46bc51aabeb75c93ae5b0cd27 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 19 Feb 2023 16:47:20 +0000 Subject: [PATCH 02/11] Added encode packet timings these changes required some new APIs in BedrockProtocol. --- composer.json | 2 +- composer.lock | 14 +++++----- src/network/mcpe/NetworkSession.php | 28 ++++++++++++++++--- .../mcpe/StandardPacketBroadcaster.php | 9 ++++-- src/timings/Timings.php | 11 ++++++++ 5 files changed, 49 insertions(+), 15 deletions(-) diff --git a/composer.json b/composer.json index 0b5a1b69f..6c0641918 100644 --- a/composer.json +++ b/composer.json @@ -37,7 +37,7 @@ "pocketmine/bedrock-block-upgrade-schema": "^1.0.0", "pocketmine/bedrock-data": "~1.14.0+bedrock-1.19.60", "pocketmine/bedrock-item-upgrade-schema": "^1.0.0", - "pocketmine/bedrock-protocol": "~19.2.0+bedrock-1.19.62", + "pocketmine/bedrock-protocol": "~19.3.0+bedrock-1.19.62", "pocketmine/binaryutils": "^0.2.1", "pocketmine/callback-validator": "^1.0.2", "pocketmine/classloader": "^0.2.0", diff --git a/composer.lock b/composer.lock index 99ef44d62..b070d7fc0 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "4c3c6f98f5d9eb34c3c5dab3a2f59282", + "content-hash": "7e0991461c05ed03067e19ed52f4579b", "packages": [ { "name": "adhocore/json-comment", @@ -328,16 +328,16 @@ }, { "name": "pocketmine/bedrock-protocol", - "version": "19.2.0+bedrock-1.19.62", + "version": "19.3.0+bedrock-1.19.62", "source": { "type": "git", "url": "https://github.com/pmmp/BedrockProtocol.git", - "reference": "a156db582d0b1a6c20c9d9cc9b1df7ef907efd0b" + "reference": "a5bf4753c7f30f781c4541918e238f5bb637e7ad" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/a156db582d0b1a6c20c9d9cc9b1df7ef907efd0b", - "reference": "a156db582d0b1a6c20c9d9cc9b1df7ef907efd0b", + "url": "https://api.github.com/repos/pmmp/BedrockProtocol/zipball/a5bf4753c7f30f781c4541918e238f5bb637e7ad", + "reference": "a5bf4753c7f30f781c4541918e238f5bb637e7ad", "shasum": "" }, "require": { @@ -369,9 +369,9 @@ "description": "An implementation of the Minecraft: Bedrock Edition protocol in PHP", "support": { "issues": "https://github.com/pmmp/BedrockProtocol/issues", - "source": "https://github.com/pmmp/BedrockProtocol/tree/19.2.0+bedrock-1.19.62" + "source": "https://github.com/pmmp/BedrockProtocol/tree/19.3.0+bedrock-1.19.62" }, - "time": "2023-02-17T16:32:49+00:00" + "time": "2023-02-19T16:11:03+00:00" }, { "name": "pocketmine/binaryutils", diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index ebc943960..7dc9680f2 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -120,6 +120,7 @@ use pocketmine\player\XboxLivePlayerInfo; use pocketmine\Server; use pocketmine\timings\Timings; use pocketmine\utils\AssumptionFailedError; +use pocketmine\utils\BinaryStream; use pocketmine\utils\ObjectSet; use pocketmine\utils\TextFormat; use pocketmine\utils\Utils; @@ -176,7 +177,7 @@ class NetworkSession{ private ?EncryptionContext $cipher = null; - /** @var Packet[] */ + /** @var ClientboundPacket[] */ private array $sendBuffer = []; /** @@ -263,6 +264,23 @@ class NetworkSession{ ); } + /** + * @param ClientboundPacket[] $packets + */ + public static function encodePacketBatchTimed(BinaryStream $stream, PacketSerializerContext $context, array $packets) : void{ + PacketBatch::encodeRaw($stream, array_map(function(ClientboundPacket $packet) use ($context) : string{ + $timings = Timings::getEncodeDataPacketTimings($packet); + $timings->startTiming(); + try{ + $stream = PacketSerializer::encoder($this->packetSerializerContext); + $packet->encode($stream); + return $stream->getBuffer(); + }finally{ + $timings->stopTiming(); + } + }, $packets)); + } + private function onPlayerCreated(Player $player) : void{ if(!$this->isConnected()){ //the remote player might have disconnected before spawn terrain generation was finished @@ -502,12 +520,14 @@ class NetworkSession{ $syncMode = false; } - $batch = PacketBatch::fromPackets($this->packetSerializerContext, ...$this->sendBuffer); + $stream = new BinaryStream(); + self::encodePacketBatchTimed($stream, $this->packetSerializerContext, $this->sendBuffer); + if($this->enableCompression){ - $promise = $this->server->prepareBatch($batch, $this->compressor, $syncMode); + $promise = $this->server->prepareBatch(new PacketBatch($stream->getBuffer()), $this->compressor, $syncMode); }else{ $promise = new CompressBatchPromise(); - $promise->resolve($batch->getBuffer()); + $promise->resolve($stream->getBuffer()); } $this->sendBuffer = []; $this->queueCompressedNoBufferFlush($promise, $immediate); diff --git a/src/network/mcpe/StandardPacketBroadcaster.php b/src/network/mcpe/StandardPacketBroadcaster.php index 9cba70739..73848ccae 100644 --- a/src/network/mcpe/StandardPacketBroadcaster.php +++ b/src/network/mcpe/StandardPacketBroadcaster.php @@ -25,6 +25,7 @@ namespace pocketmine\network\mcpe; use pocketmine\network\mcpe\protocol\serializer\PacketBatch; use pocketmine\Server; +use pocketmine\utils\BinaryStream; use function spl_object_id; final class StandardPacketBroadcaster implements PacketBroadcaster{ @@ -38,7 +39,9 @@ final class StandardPacketBroadcaster implements PacketBroadcaster{ $serializerContext = $recipient->getPacketSerializerContext(); $bufferId = spl_object_id($serializerContext); if(!isset($buffers[$bufferId])){ - $buffers[$bufferId] = PacketBatch::fromPackets($serializerContext, ...$packets); + $stream = new BinaryStream(); + NetworkSession::encodePacketBatchTimed($stream, $serializerContext, $packets); + $buffers[$bufferId] = $stream->getBuffer(); } //TODO: different compressors might be compatible, it might not be necessary to split them up by object @@ -52,14 +55,14 @@ final class StandardPacketBroadcaster implements PacketBroadcaster{ $buffer = $buffers[$bufferId]; foreach($compressorMap as $compressorId => $compressorTargets){ $compressor = $compressors[$compressorId]; - if(!$compressor->willCompress($buffer->getBuffer())){ + if(!$compressor->willCompress($buffer)){ foreach($compressorTargets as $target){ foreach($packets as $pk){ $target->addToSendBuffer($pk); } } }else{ - $promise = $this->server->prepareBatch($buffer, $compressor); + $promise = $this->server->prepareBatch(new PacketBatch($buffer), $compressor); foreach($compressorTargets as $target){ $target->queueCompressed($promise); } diff --git a/src/timings/Timings.php b/src/timings/Timings.php index 1f8426969..426e9ab61 100644 --- a/src/timings/Timings.php +++ b/src/timings/Timings.php @@ -127,6 +127,9 @@ abstract class Timings{ /** @var TimingsHandler[] */ private static array $packetHandleTimingMap = []; + /** @var TimingsHandler[] */ + private static array $packetEncodeTimingMap = []; + /** @var TimingsHandler[] */ public static $packetSendTimingMap = []; /** @var TimingsHandler[] */ @@ -254,6 +257,14 @@ abstract class Timings{ ); } + public static function getEncodeDataPacketTimings(ClientboundPacket $pk) : TimingsHandler{ + $pid = $pk->pid(); + return self::$packetEncodeTimingMap[$pid] ??= new TimingsHandler( + self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Encode - " . $pk->getName() . " [0x" . dechex($pid) . "]", + self::getSendDataPacketTimings($pk) + ); + } + public static function getSendDataPacketTimings(ClientboundPacket $pk) : TimingsHandler{ $pid = $pk->pid(); if(!isset(self::$packetSendTimingMap[$pid])){ From 2a3288c4f98aae9a685cd43226c42c18bb5c4e3f Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 19 Feb 2023 16:50:03 +0000 Subject: [PATCH 03/11] Avoid useless throwaway PacketBatch objects --- src/network/mcpe/ChunkRequestTask.php | 6 +++++- src/network/mcpe/NetworkSession.php | 8 +++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/network/mcpe/ChunkRequestTask.php b/src/network/mcpe/ChunkRequestTask.php index f66614099..b1d18eb2b 100644 --- a/src/network/mcpe/ChunkRequestTask.php +++ b/src/network/mcpe/ChunkRequestTask.php @@ -33,6 +33,7 @@ use pocketmine\network\mcpe\protocol\serializer\PacketSerializerContext; use pocketmine\network\mcpe\protocol\types\ChunkPosition; use pocketmine\network\mcpe\serializer\ChunkSerializer; use pocketmine\scheduler\AsyncTask; +use pocketmine\utils\BinaryStream; use pocketmine\world\format\Chunk; use pocketmine\world\format\io\FastChunkSerializer; @@ -72,7 +73,10 @@ class ChunkRequestTask extends AsyncTask{ $subCount = ChunkSerializer::getSubChunkCount($chunk) + ChunkSerializer::LOWER_PADDING_SIZE; $encoderContext = new PacketSerializerContext(GlobalItemTypeDictionary::getInstance()->getDictionary()); $payload = ChunkSerializer::serializeFullChunk($chunk, RuntimeBlockMapping::getInstance(), $encoderContext, $this->tiles); - $this->setResult($this->compressor->compress(PacketBatch::fromPackets($encoderContext, LevelChunkPacket::create(new ChunkPosition($this->chunkX, $this->chunkZ), $subCount, false, null, $payload))->getBuffer())); + + $stream = new BinaryStream(); + PacketBatch::encodePackets($stream, $encoderContext, [LevelChunkPacket::create(new ChunkPosition($this->chunkX, $this->chunkZ), $subCount, false, null, $payload)]); + $this->setResult($this->compressor->compress($stream->getBuffer())); } public function onError() : void{ diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 7dc9680f2..96020f405 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -411,7 +411,13 @@ class NetworkSession{ } try{ - foreach((new PacketBatch($decompressed))->getPackets($this->packetPool, $this->packetSerializerContext, 1300) as [$packet, $buffer]){ + $stream = new BinaryStream($decompressed); + $count = 0; + foreach(PacketBatch::decodeRaw($stream) as $buffer){ + if(++$count > 1300){ + throw new PacketHandlingException("Too many packets in batch"); + } + $packet = $this->packetPool->getPacket($buffer); if($packet === null){ $this->logger->debug("Unknown packet: " . base64_encode($buffer)); throw new PacketHandlingException("Unknown packet received"); From d5e92b4ae69f6e10188167828e82a69c64f6fd5c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 19 Feb 2023 16:53:04 +0000 Subject: [PATCH 04/11] ... --- src/network/mcpe/NetworkSession.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 96020f405..771d231e6 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -272,7 +272,7 @@ class NetworkSession{ $timings = Timings::getEncodeDataPacketTimings($packet); $timings->startTiming(); try{ - $stream = PacketSerializer::encoder($this->packetSerializerContext); + $stream = PacketSerializer::encoder($context); $packet->encode($stream); return $stream->getBuffer(); }finally{ From 4dbcd714bdf52c6c8eaffbe95255409e2dca1a67 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 19 Feb 2023 17:21:10 +0000 Subject: [PATCH 05/11] =?UTF-8?q?NetworkSession:=20fixed=20some=20segments?= =?UTF-8?q?=20of=20recv/send=20logic=20not=20being=20covered=20by=20their?= =?UTF-8?q?=20respective=20network=20timings=C3=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/network/mcpe/NetworkSession.php | 200 +++++++++++++++------------- 1 file changed, 110 insertions(+), 90 deletions(-) diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 771d231e6..2b995ef8f 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -376,62 +376,67 @@ class NetworkSession{ return; } - if($this->incomingPacketBatchBudget <= 0){ - $this->updatePacketBudget(); - if($this->incomingPacketBatchBudget <= 0){ - throw new PacketHandlingException("Receiving packets too fast"); - } - } - $this->incomingPacketBatchBudget--; - - if($this->cipher !== null){ - Timings::$playerNetworkReceiveDecrypt->startTiming(); - try{ - $payload = $this->cipher->decrypt($payload); - }catch(DecryptionException $e){ - $this->logger->debug("Encrypted packet: " . base64_encode($payload)); - throw PacketHandlingException::wrap($e, "Packet decryption error"); - }finally{ - Timings::$playerNetworkReceiveDecrypt->stopTiming(); - } - } - - if($this->enableCompression){ - Timings::$playerNetworkReceiveDecompress->startTiming(); - try{ - $decompressed = $this->compressor->decompress($payload); - }catch(DecompressionException $e){ - $this->logger->debug("Failed to decompress packet: " . base64_encode($payload)); - throw PacketHandlingException::wrap($e, "Compressed packet batch decode error"); - }finally{ - Timings::$playerNetworkReceiveDecompress->stopTiming(); - } - }else{ - $decompressed = $payload; - } - + Timings::$playerNetworkReceive->startTiming(); try{ - $stream = new BinaryStream($decompressed); - $count = 0; - foreach(PacketBatch::decodeRaw($stream) as $buffer){ - if(++$count > 1300){ - throw new PacketHandlingException("Too many packets in batch"); - } - $packet = $this->packetPool->getPacket($buffer); - if($packet === null){ - $this->logger->debug("Unknown packet: " . base64_encode($buffer)); - throw new PacketHandlingException("Unknown packet received"); - } - try{ - $this->handleDataPacket($packet, $buffer); - }catch(PacketHandlingException $e){ - $this->logger->debug($packet->getName() . ": " . base64_encode($buffer)); - throw PacketHandlingException::wrap($e, "Error processing " . $packet->getName()); + if($this->incomingPacketBatchBudget <= 0){ + $this->updatePacketBudget(); + if($this->incomingPacketBatchBudget <= 0){ + throw new PacketHandlingException("Receiving packets too fast"); } } - }catch(PacketDecodeException $e){ - $this->logger->logException($e); - throw PacketHandlingException::wrap($e, "Packet batch decode error"); + $this->incomingPacketBatchBudget--; + + if($this->cipher !== null){ + Timings::$playerNetworkReceiveDecrypt->startTiming(); + try{ + $payload = $this->cipher->decrypt($payload); + }catch(DecryptionException $e){ + $this->logger->debug("Encrypted packet: " . base64_encode($payload)); + throw PacketHandlingException::wrap($e, "Packet decryption error"); + }finally{ + Timings::$playerNetworkReceiveDecrypt->stopTiming(); + } + } + + if($this->enableCompression){ + Timings::$playerNetworkReceiveDecompress->startTiming(); + try{ + $decompressed = $this->compressor->decompress($payload); + }catch(DecompressionException $e){ + $this->logger->debug("Failed to decompress packet: " . base64_encode($payload)); + throw PacketHandlingException::wrap($e, "Compressed packet batch decode error"); + }finally{ + Timings::$playerNetworkReceiveDecompress->stopTiming(); + } + }else{ + $decompressed = $payload; + } + + try{ + $stream = new BinaryStream($decompressed); + $count = 0; + foreach(PacketBatch::decodeRaw($stream) as $buffer){ + if(++$count > 1300){ + throw new PacketHandlingException("Too many packets in batch"); + } + $packet = $this->packetPool->getPacket($buffer); + if($packet === null){ + $this->logger->debug("Unknown packet: " . base64_encode($buffer)); + throw new PacketHandlingException("Unknown packet received"); + } + try{ + $this->handleDataPacket($packet, $buffer); + }catch(PacketHandlingException $e){ + $this->logger->debug($packet->getName() . ": " . base64_encode($buffer)); + throw PacketHandlingException::wrap($e, "Error processing " . $packet->getName()); + } + } + }catch(PacketDecodeException $e){ + $this->logger->logException($e); + throw PacketHandlingException::wrap($e, "Packet batch decode error"); + } + }finally{ + Timings::$playerNetworkReceive->stopTiming(); } } @@ -519,24 +524,29 @@ class NetworkSession{ private function flushSendBuffer(bool $immediate = false) : void{ if(count($this->sendBuffer) > 0){ - $syncMode = null; //automatic - if($immediate){ - $syncMode = true; - }elseif($this->forceAsyncCompression){ - $syncMode = false; - } + Timings::$playerNetworkSend->startTiming(); + try{ + $syncMode = null; //automatic + if($immediate){ + $syncMode = true; + }elseif($this->forceAsyncCompression){ + $syncMode = false; + } - $stream = new BinaryStream(); - self::encodePacketBatchTimed($stream, $this->packetSerializerContext, $this->sendBuffer); + $stream = new BinaryStream(); + self::encodePacketBatchTimed($stream, $this->packetSerializerContext, $this->sendBuffer); - if($this->enableCompression){ - $promise = $this->server->prepareBatch(new PacketBatch($stream->getBuffer()), $this->compressor, $syncMode); - }else{ - $promise = new CompressBatchPromise(); - $promise->resolve($stream->getBuffer()); + if($this->enableCompression){ + $promise = $this->server->prepareBatch(new PacketBatch($stream->getBuffer()), $this->compressor, $syncMode); + }else{ + $promise = new CompressBatchPromise(); + $promise->resolve($stream->getBuffer()); + } + $this->sendBuffer = []; + $this->queueCompressedNoBufferFlush($promise, $immediate); + }finally{ + Timings::$playerNetworkSend->stopTiming(); } - $this->sendBuffer = []; - $this->queueCompressedNoBufferFlush($promise, $immediate); } } @@ -549,35 +559,45 @@ class NetworkSession{ } public function queueCompressed(CompressBatchPromise $payload, bool $immediate = false) : void{ - $this->flushSendBuffer($immediate); //Maintain ordering if possible - $this->queueCompressedNoBufferFlush($payload, $immediate); + Timings::$playerNetworkSend->startTiming(); + try{ + $this->flushSendBuffer($immediate); //Maintain ordering if possible + $this->queueCompressedNoBufferFlush($payload, $immediate); + }finally{ + Timings::$playerNetworkSend->stopTiming(); + } } private function queueCompressedNoBufferFlush(CompressBatchPromise $payload, bool $immediate = false) : void{ - if($immediate){ - //Skips all queues - $this->sendEncoded($payload->getResult(), true); - }else{ - $this->compressedQueue->enqueue($payload); - $payload->onResolve(function(CompressBatchPromise $payload) : void{ - if($this->connected && $this->compressedQueue->bottom() === $payload){ - $this->compressedQueue->dequeue(); //result unused - $this->sendEncoded($payload->getResult()); + Timings::$playerNetworkSend->startTiming(); + try{ + if($immediate){ + //Skips all queues + $this->sendEncoded($payload->getResult(), true); + }else{ + $this->compressedQueue->enqueue($payload); + $payload->onResolve(function(CompressBatchPromise $payload) : void{ + if($this->connected && $this->compressedQueue->bottom() === $payload){ + $this->compressedQueue->dequeue(); //result unused + $this->sendEncoded($payload->getResult()); - while(!$this->compressedQueue->isEmpty()){ - /** @var CompressBatchPromise $current */ - $current = $this->compressedQueue->bottom(); - if($current->hasResult()){ - $this->compressedQueue->dequeue(); + while(!$this->compressedQueue->isEmpty()){ + /** @var CompressBatchPromise $current */ + $current = $this->compressedQueue->bottom(); + if($current->hasResult()){ + $this->compressedQueue->dequeue(); - $this->sendEncoded($current->getResult()); - }else{ - //can't send any more queued until this one is ready - break; + $this->sendEncoded($current->getResult()); + }else{ + //can't send any more queued until this one is ready + break; + } } } - } - }); + }); + } + }finally{ + Timings::$playerNetworkSend->stopTiming(); } } From 871bd169a882ee1ba3fac716456ee16ecaad0e01 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 19 Feb 2023 17:58:12 +0000 Subject: [PATCH 06/11] Timings: remove unnecessary code --- src/timings/Timings.php | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/timings/Timings.php b/src/timings/Timings.php index 426e9ab61..7d3942d3c 100644 --- a/src/timings/Timings.php +++ b/src/timings/Timings.php @@ -234,8 +234,7 @@ abstract class Timings{ public static function getReceiveDataPacketTimings(ServerboundPacket $pk) : TimingsHandler{ $pid = $pk->pid(); if(!isset(self::$packetReceiveTimingMap[$pid])){ - $pkName = (new \ReflectionClass($pk))->getShortName(); - self::$packetReceiveTimingMap[$pid] = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "receivePacket - " . $pkName . " [0x" . dechex($pid) . "]", self::$playerNetworkReceive); + self::$packetReceiveTimingMap[$pid] = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "receivePacket - " . $pk->getName() . " [0x" . dechex($pid) . "]", self::$playerNetworkReceive); } return self::$packetReceiveTimingMap[$pid]; @@ -268,8 +267,7 @@ abstract class Timings{ public static function getSendDataPacketTimings(ClientboundPacket $pk) : TimingsHandler{ $pid = $pk->pid(); if(!isset(self::$packetSendTimingMap[$pid])){ - $pkName = (new \ReflectionClass($pk))->getShortName(); - self::$packetSendTimingMap[$pid] = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "sendPacket - " . $pkName . " [0x" . dechex($pid) . "]", self::$playerNetworkSend); + self::$packetSendTimingMap[$pid] = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "sendPacket - " . $pk->getName() . " [0x" . dechex($pid) . "]", self::$playerNetworkSend); } return self::$packetSendTimingMap[$pid]; From 168af31fd7cd096fe42e606ce904f8f6780eb302 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Feb 2023 18:39:29 +0000 Subject: [PATCH 07/11] Bump phpstan/phpstan from 1.9.17 to 1.9.18 (#5585) Bumps [phpstan/phpstan](https://github.com/phpstan/phpstan) from 1.9.17 to 1.9.18. - [Release notes](https://github.com/phpstan/phpstan/releases) - [Changelog](https://github.com/phpstan/phpstan/blob/1.10.x/CHANGELOG.md) - [Commits](https://github.com/phpstan/phpstan/compare/1.9.17...1.9.18) --- updated-dependencies: - dependency-name: phpstan/phpstan dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- composer.json | 2 +- composer.lock | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/composer.json b/composer.json index 159e007be..9da2cb8bf 100644 --- a/composer.json +++ b/composer.json @@ -54,7 +54,7 @@ "webmozart/path-util": "^2.3" }, "require-dev": { - "phpstan/phpstan": "1.9.17", + "phpstan/phpstan": "1.9.18", "phpstan/phpstan-phpunit": "^1.1.0", "phpstan/phpstan-strict-rules": "^1.2.0", "phpunit/phpunit": "^9.2" diff --git a/composer.lock b/composer.lock index 9bd452dca..f82fd893b 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "56a1e8facd8fd7d56d6c7d2eb390e842", + "content-hash": "a6622fa16daeb7ba4d9a792579db468f", "packages": [ { "name": "adhocore/json-comment", @@ -1832,16 +1832,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.9.17", + "version": "1.9.18", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "204e459e7822f2c586463029f5ecec31bb45a1f2" + "reference": "f2d5cf71be91172a57c649770b73c20ebcffb0bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/204e459e7822f2c586463029f5ecec31bb45a1f2", - "reference": "204e459e7822f2c586463029f5ecec31bb45a1f2", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/f2d5cf71be91172a57c649770b73c20ebcffb0bf", + "reference": "f2d5cf71be91172a57c649770b73c20ebcffb0bf", "shasum": "" }, "require": { @@ -1871,7 +1871,7 @@ ], "support": { "issues": "https://github.com/phpstan/phpstan/issues", - "source": "https://github.com/phpstan/phpstan/tree/1.9.17" + "source": "https://github.com/phpstan/phpstan/tree/1.9.18" }, "funding": [ { @@ -1887,7 +1887,7 @@ "type": "tidelift" } ], - "time": "2023-02-08T12:25:00+00:00" + "time": "2023-02-17T15:01:27+00:00" }, { "name": "phpstan/phpstan-phpunit", From 59a04c971fdd177e565fb2cb398626546a773e92 Mon Sep 17 00:00:00 2001 From: Armen Deroian Date: Tue, 21 Feb 2023 10:01:22 -0500 Subject: [PATCH 08/11] Getter and setter for gravity (#5584) closes #5525 --- src/entity/Entity.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/entity/Entity.php b/src/entity/Entity.php index bdcd088a5..46e60feaa 100644 --- a/src/entity/Entity.php +++ b/src/entity/Entity.php @@ -803,6 +803,15 @@ abstract class Entity{ $this->server->broadcastPackets($this->hasSpawned, [SetActorMotionPacket::create($this->id, $this->getMotion())]); } + public function getGravity() : float{ + return $this->gravity; + } + + public function setGravity(float $gravity) : void{ + Utils::checkFloatNotInfOrNaN("gravity", $gravity); + $this->gravity = $gravity; + } + public function hasGravity() : bool{ return $this->gravityEnabled; } From 799739fe86194f81caf443eaf8f01887c7d66561 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 21 Feb 2023 15:22:38 +0000 Subject: [PATCH 09/11] Updated build/php submodule to pmmp/PHP-Binaries@b2207cf70d3fc5b81f50a655aba4730fcf40a37c --- build/php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/php b/build/php index fb297eb51..b2207cf70 160000 --- a/build/php +++ b/build/php @@ -1 +1 @@ -Subproject commit fb297eb511862ef3d4ca0aff5256a8caf5513cb4 +Subproject commit b2207cf70d3fc5b81f50a655aba4730fcf40a37c From 47e9ecd2578b8232f8f3f7f9b7a469fed46e8332 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 21 Feb 2023 15:23:25 +0000 Subject: [PATCH 10/11] Release 4.15.1 --- changelogs/4.15.md | 8 ++++++++ src/VersionInfo.php | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/changelogs/4.15.md b/changelogs/4.15.md index b80115e88..c8543a0f1 100644 --- a/changelogs/4.15.md +++ b/changelogs/4.15.md @@ -12,3 +12,11 @@ Released 17th February 2023. ## General - Added support for Minecraft: Bedrock Edition 1.19.62. - Removed support for older versions. + +# 4.15.1 +Released 21st February 2023. + +## Fixes +- Fixed dropped items not despawning when in non-ticking chunks. +- Fixed dropped items not despawning if an infinite pickup delay is set. +- Fixed infinite despawn delay (never despawn) being ignored for dropped items. diff --git a/src/VersionInfo.php b/src/VersionInfo.php index a763bf070..4f3f19490 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -32,7 +32,7 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; public const BASE_VERSION = "4.15.1"; - public const IS_DEVELOPMENT_BUILD = true; + public const IS_DEVELOPMENT_BUILD = false; public const BUILD_CHANNEL = "stable"; private function __construct(){ From b574d49d361d9f38a33df12bfc0f4812107a91e7 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 21 Feb 2023 15:23:25 +0000 Subject: [PATCH 11/11] 4.15.2 is next --- src/VersionInfo.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VersionInfo.php b/src/VersionInfo.php index 4f3f19490..8f62b9718 100644 --- a/src/VersionInfo.php +++ b/src/VersionInfo.php @@ -31,8 +31,8 @@ use function str_repeat; final class VersionInfo{ public const NAME = "PocketMine-MP"; - public const BASE_VERSION = "4.15.1"; - public const IS_DEVELOPMENT_BUILD = false; + public const BASE_VERSION = "4.15.2"; + public const IS_DEVELOPMENT_BUILD = true; public const BUILD_CHANNEL = "stable"; private function __construct(){