diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 1ae81ff35..df021acf2 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -102,6 +102,7 @@ use pocketmine\permission\DefaultPermissions; use pocketmine\player\GameMode; use pocketmine\player\Player; use pocketmine\player\PlayerInfo; +use pocketmine\player\UsedChunkStatus; use pocketmine\player\XboxLivePlayerInfo; use pocketmine\Server; use pocketmine\timings\Timings; @@ -919,10 +920,17 @@ class NetworkSession{ return; } $currentWorld = $this->player->getLocation()->getWorld(); - if($world !== $currentWorld or !$this->player->isUsingChunk($chunkX, $chunkZ)){ + if($world !== $currentWorld or ($status = $this->player->getUsedChunkStatus($chunkX, $chunkZ)) === null){ $this->logger->debug("Tried to send no-longer-active chunk $chunkX $chunkZ in world " . $world->getFolderName()); return; } + if(!$status->equals(UsedChunkStatus::REQUESTED())){ + //TODO: make this an error + //this could be triggered due to the shitty way that chunk resends are handled + //right now - not because of the spammy re-requesting, but because the chunk status reverts + //to NEEDED if they want to be resent. + return; + } $world->timings->syncChunkSend->startTiming(); try{ $this->queueCompressed($promise); diff --git a/src/player/Player.php b/src/player/Player.php index 6d459b8d4..4036944ab 100644 --- a/src/player/Player.php +++ b/src/player/Player.php @@ -744,13 +744,6 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ $this->usedChunks[$index] = UsedChunkStatus::REQUESTED(); $this->getNetworkSession()->startUsingChunk($X, $Z, function() use ($X, $Z, $index) : void{ - if(!$this->usedChunks[$index]->equals(UsedChunkStatus::REQUESTED())){ - //TODO: make this an error - //this could be triggered due to the shitty way that chunk resends are handled - //right now - not because of the spammy re-requesting, but because the chunk status reverts - //to NEEDED if they want to be resent. - return; - } $this->usedChunks[$index] = UsedChunkStatus::SENT(); if($this->spawnChunkLoadCount === -1){ $this->spawnEntitiesOnChunk($X, $Z); @@ -876,6 +869,13 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ return $this->usedChunks; } + /** + * Returns a usage status of the given chunk, or null if the player is not using the given chunk. + */ + public function getUsedChunkStatus(int $chunkX, int $chunkZ) : ?UsedChunkStatus{ + return $this->usedChunks[World::chunkHash($chunkX, $chunkZ)] ?? null; + } + /** * Returns whether the target chunk has been sent to this player. */ diff --git a/tests/phpstan/configs/l8-baseline.neon b/tests/phpstan/configs/l8-baseline.neon index e0249525f..2ee289468 100644 --- a/tests/phpstan/configs/l8-baseline.neon +++ b/tests/phpstan/configs/l8-baseline.neon @@ -101,12 +101,12 @@ parameters: path: ../../../src/network/mcpe/NetworkSession.php - - message: "#^Cannot call method getWorld\\(\\) on pocketmine\\\\player\\\\Player\\|null\\.$#" + message: "#^Cannot call method getUsedChunkStatus\\(\\) on pocketmine\\\\player\\\\Player\\|null\\.$#" count: 1 path: ../../../src/network/mcpe/NetworkSession.php - - message: "#^Cannot call method isUsingChunk\\(\\) on pocketmine\\\\player\\\\Player\\|null\\.$#" + message: "#^Cannot call method getWorld\\(\\) on pocketmine\\\\player\\\\Player\\|null\\.$#" count: 1 path: ../../../src/network/mcpe/NetworkSession.php