From e462a8918902f29ea99afc96ae1581eca984dc4a Mon Sep 17 00:00:00 2001 From: Shoghi Cervantes Date: Wed, 13 Aug 2014 09:51:43 +0200 Subject: [PATCH] Order chunks to be generated --- src/pocketmine/Server.php | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/src/pocketmine/Server.php b/src/pocketmine/Server.php index 049c281fb7..fc5417ccca 100644 --- a/src/pocketmine/Server.php +++ b/src/pocketmine/Server.php @@ -1069,12 +1069,37 @@ class Server{ $this->getLogger()->notice("Spawn terrain for level \"$name\" is being generated in the background"); - for($Z = 0; $Z <= 16; ++$Z){ - for($X = 0; $X <= 16; ++$X){ - $level->generateChunk($X, $Z); + + $radiusSquared = ($this->getViewDistance() + 1) / M_PI; + $radius = ceil(sqrt($radiusSquared)); + + $centerX = $level->getSpawn()->getX() >> 4; + $centerZ = $level->getSpawn()->getZ() >> 4; + + $order = []; + + for($X = -$radius; $X <= $radius; ++$X){ + for($Z = -$radius; $Z <= $radius; ++$Z){ + $distance = ($X * $X) + ($Z * $Z); + if($distance > $radiusSquared){ + continue; + } + $chunkX = $X + $centerX; + $chunkZ = $Z + $centerZ; + $index = Level::chunkHash($chunkX, $chunkZ); + $order[$index] = $distance; } } + asort($order); + + $chunkX = $chunkZ = null; + + foreach($order as $index => $distance){ + Level::getXZ($index, $chunkX, $chunkZ); + $level->generateChunk($chunkX, $chunkZ); + } + return true; }