diff --git a/src/player/Player.php b/src/player/Player.php index 8b871bf3e..11e7ba3b0 100644 --- a/src/player/Player.php +++ b/src/player/Player.php @@ -894,6 +894,31 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ } } + /** + * @param true[] $oldTickingChunks + * @param true[] $newTickingChunks + * + * @phpstan-param array $oldTickingChunks + * @phpstan-param array $newTickingChunks + */ + private function updateTickingChunkRegistrations(array $oldTickingChunks, array $newTickingChunks) : void{ + $world = $this->getWorld(); + foreach($oldTickingChunks as $hash => $_){ + if(!isset($newTickingChunks[$hash]) && !isset($this->loadQueue[$hash])){ + //we are (probably) still using this chunk, but it's no longer within ticking range + World::getXZ($hash, $tickingChunkX, $tickingChunkZ); + $world->unregisterTickingChunk($this->chunkTicker, $tickingChunkX, $tickingChunkZ); + } + } + foreach($newTickingChunks as $hash => $_){ + if(!isset($oldTickingChunks[$hash]) && !isset($this->loadQueue[$hash])){ + //we were already using this chunk, but it is now within ticking range + World::getXZ($hash, $tickingChunkX, $tickingChunkZ); + $world->registerTickingChunk($this->chunkTicker, $tickingChunkX, $tickingChunkZ); + } + } + } + /** * Calculates which new chunks this player needs to use, and which currently-used chunks it needs to stop using. * This is based on factors including the player's current render radius and current position. @@ -930,15 +955,10 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ World::getXZ($index, $X, $Z); $this->unloadChunk($X, $Z); } - foreach($this->tickingChunks as $hash => $_){ - //any chunks we encounter here are still used by the player, but may no longer be within ticking range - if(!isset($tickingChunks[$hash]) && !isset($newOrder[$hash])){ - World::getXZ($hash, $tickingChunkX, $tickingChunkZ); - $world->unregisterTickingChunk($this->chunkTicker, $tickingChunkX, $tickingChunkZ); - } - } $this->loadQueue = $newOrder; + + $this->updateTickingChunkRegistrations($this->tickingChunks, $tickingChunks); $this->tickingChunks = $tickingChunks; if(count($this->loadQueue) > 0 || count($unloadChunks) > 0){