diff --git a/src/pocketmine/Server.php b/src/pocketmine/Server.php index 7aaae93d8..526d7db65 100644 --- a/src/pocketmine/Server.php +++ b/src/pocketmine/Server.php @@ -1064,8 +1064,10 @@ class Server{ $this->getPluginManager()->callEvent(new LevelLoadEvent($level)); - for($Z = 5; $Z <= 11; ++$Z){ - for($X = 5; $X <= 11; ++$X){ + $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); } } diff --git a/src/pocketmine/level/Level.php b/src/pocketmine/level/Level.php index 10fd571c5..626a5c831 100644 --- a/src/pocketmine/level/Level.php +++ b/src/pocketmine/level/Level.php @@ -129,6 +129,8 @@ class Level implements ChunkManager, Metadatable{ private $chunkSendQueue = []; private $chunkSendTasks = []; + private $chunkGenerationQueue = []; + private $autoSave = true; /** @var BlockMetadataStore */ @@ -1273,6 +1275,11 @@ class Level implements ChunkManager, Metadatable{ } } + public function generateChunkCallback($x, $z, SimpleChunk $chunk){ + unset($this->chunkGenerationQueue["$x:$z"]); + $this->setChunk($x, $z, $chunk); + } + public function setChunk($x, $z, SimpleChunk $chunk){ $index = Level::chunkHash($x, $z); foreach($this->getUsingChunk($x, $z) as $player){ @@ -1693,7 +1700,10 @@ class Level implements ChunkManager, Metadatable{ public function generateChunk($x, $z){ - $this->server->getGenerationManager()->requestChunk($this, $x, $z); + if(!isset($this->chunkGenerationQueue["$x:$z"])){ + $this->chunkGenerationQueue["$x:$z"] = true; + $this->server->getGenerationManager()->requestChunk($this, $x, $z); + } } public function regenerateChunk($x, $z){ diff --git a/src/pocketmine/level/generator/GenerationRequestManager.php b/src/pocketmine/level/generator/GenerationRequestManager.php index c46040273..378f5b0b9 100644 --- a/src/pocketmine/level/generator/GenerationRequestManager.php +++ b/src/pocketmine/level/generator/GenerationRequestManager.php @@ -98,7 +98,7 @@ class GenerationRequestManager{ protected function receiveChunk($levelID, SimpleChunk $chunk){ if(($level = $this->server->getLevel($levelID)) instanceof Level){ - $level->setChunk($chunk->getX(), $chunk->getZ(), $chunk); + $level->generateChunkCallback($chunk->getX(), $chunk->getZ(), $chunk); }else{ $buffer = chr(GenerationManager::PACKET_CLOSE_LEVEL) . Binary::writeInt($levelID); @socket_write($this->socket, Binary::writeInt(strlen($buffer)) . $buffer);