diff --git a/src/pocketmine/network/mcpe/NetworkSession.php b/src/pocketmine/network/mcpe/NetworkSession.php index 5e54db62a..6f91972d4 100644 --- a/src/pocketmine/network/mcpe/NetworkSession.php +++ b/src/pocketmine/network/mcpe/NetworkSession.php @@ -77,6 +77,7 @@ use pocketmine\utils\TextFormat; use pocketmine\utils\Utils; use pocketmine\world\Position; use function array_map; +use function assert; use function base64_encode; use function bin2hex; use function count; @@ -744,13 +745,19 @@ class NetworkSession{ public function startUsingChunk(int $chunkX, int $chunkZ, \Closure $onCompletion) : void{ Utils::validateCallableSignature(function(int $chunkX, int $chunkZ){}, $onCompletion); - ChunkCache::getInstance($this->player->getWorld())->request($chunkX, $chunkZ)->onResolve( + $world = $this->player->getWorld(); + assert($world !== null); + ChunkCache::getInstance($world)->request($chunkX, $chunkZ)->onResolve( //this callback may be called synchronously or asynchronously, depending on whether the promise is resolved yet - function(CompressBatchPromise $promise) use ($chunkX, $chunkZ, $onCompletion){ + function(CompressBatchPromise $promise) use ($world, $chunkX, $chunkZ, $onCompletion){ if(!$this->isConnected()){ return; } + if($world !== $this->player->getWorld() or !$this->player->isUsingChunk($chunkX, $chunkZ)){ + $this->logger->debug("Tried to send no-longer-active chunk $chunkX $chunkZ in world " . $world->getFolderName()); + return; + } $this->player->world->timings->syncChunkSendTimer->startTiming(); try{ $this->queueCompressed($promise); diff --git a/src/pocketmine/player/Player.php b/src/pocketmine/player/Player.php index 0ba07f1e0..9429e51c5 100644 --- a/src/pocketmine/player/Player.php +++ b/src/pocketmine/player/Player.php @@ -1039,6 +1039,10 @@ class Player extends Human implements CommandSender, ChunkLoader, ChunkListener, Timings::$playerChunkOrderTimer->stopTiming(); } + public function isUsingChunk(int $chunkX, int $chunkZ) : bool{ + return isset($this->usedChunks[World::chunkHash($chunkX, $chunkZ)]); + } + public function doChunkRequests(){ if($this->nextChunkOrderRun !== PHP_INT_MAX and $this->nextChunkOrderRun-- <= 0){ $this->nextChunkOrderRun = PHP_INT_MAX;