diff --git a/src/pocketmine/Server.php b/src/pocketmine/Server.php index 2c1f1cdbd..49b77c6e2 100644 --- a/src/pocketmine/Server.php +++ b/src/pocketmine/Server.php @@ -1061,12 +1061,8 @@ class Server{ if($generator !== null and class_exists($generator) and is_subclass_of($generator, "pocketmine\\level\\generator\\Generator")){ $generator = new $generator($options); }else{ - if(strtoupper($this->getLevelType()) == "FLAT"){ - $generator = Generator::getGenerator("flat"); - $options["preset"] = $this->getConfigString("generator-settings", ""); - }else{ - $generator = Generator::getGenerator("normal"); - } + $options["preset"] = $this->getConfigString("generator-settings", ""); + $generator = Generator::getGenerator($this->getLevelType()); } if(($provider = LevelProviderManager::getProviderByName($providerName = $this->getProperty("level-settings.default-format", "mcregion"))) === null){ @@ -2051,6 +2047,8 @@ class Server{ foreach($this->interfaces as $interface){ $interface->process(); } + + Timings::$connectionTimer->stopTiming(); Timings::$schedulerTimer->startTiming(); diff --git a/src/pocketmine/level/generator/GenerationChunkManager.php b/src/pocketmine/level/generator/GenerationChunkManager.php index 5c8e7898d..4a8f275ea 100644 --- a/src/pocketmine/level/generator/GenerationChunkManager.php +++ b/src/pocketmine/level/generator/GenerationChunkManager.php @@ -44,14 +44,13 @@ class GenerationChunkManager implements ChunkManager{ protected $changes = []; public function __construct(GenerationManager $manager, $levelID, $seed, $class, array $options){ - if(!is_subclass_of($class, "pocketmine\\level\\generator\\Generator")){ - throw new \Exception("Class is not a subclass of Generator"); + if(!class_exists($class, true) or !is_subclass_of($class, "pocketmine\\level\\generator\\Generator")){ + throw new \Exception("Class $class does not exists or is not a subclass of Generator"); } $this->levelID = $levelID; $this->seed = $seed; $this->manager = $manager; - $this->generator = new $class($options); $this->generator->init($this, new Random($seed)); } @@ -116,9 +115,11 @@ class GenerationChunkManager implements ChunkManager{ } public function generateChunk($chunkX, $chunkZ){ - $this->getChunk($chunkX, $chunkZ); - $this->generator->generateChunk($chunkX, $chunkZ); - $this->setChunkGenerated($chunkX, $chunkZ); + try{ + $this->getChunk($chunkX, $chunkZ); + $this->generator->generateChunk($chunkX, $chunkZ); + $this->setChunkGenerated($chunkX, $chunkZ); + }catch(\Exception $e){} } public function populateChunk($chunkX, $chunkZ){ diff --git a/src/pocketmine/level/generator/GenerationManager.php b/src/pocketmine/level/generator/GenerationManager.php index 694d2b020..9be9290cd 100644 --- a/src/pocketmine/level/generator/GenerationManager.php +++ b/src/pocketmine/level/generator/GenerationManager.php @@ -122,18 +122,22 @@ class GenerationManager{ $chunkX = $chunkZ = null; while($this->shutdown !== true){ - if(count($this->requestQueue) > 0){ - foreach($this->requestQueue as $levelID => $chunks){ - if(count($chunks) === 0){ - unset($this->requestQueue[$levelID]); - }else{ - Level::getXZ($key = key($chunks), $chunkX, $chunkZ); - unset($this->requestQueue[$levelID][$key]); - $this->generateChunk($levelID, $chunkX, $chunkZ); + try{ + if(count($this->requestQueue) > 0){ + foreach($this->requestQueue as $levelID => $chunks){ + if(count($chunks) === 0){ + unset($this->requestQueue[$levelID]); + }else{ + Level::getXZ($key = key($chunks), $chunkX, $chunkZ); + unset($this->requestQueue[$levelID][$key]); + $this->generateChunk($levelID, $chunkX, $chunkZ); + } } + }else{ + $this->readPacket(); } - }else{ - $this->readPacket(); + }catch(\Exception $e){ + $this->logger->warning("[Generator Thread] Exception: ".$e->getMessage() . " on file \"".$e->getFile()."\" line ".$e->getLine()); } } }