From 612e9e162ca4f7be67c62eef33ffe3d2737e359d Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 6 Apr 2019 15:17:36 +0100 Subject: [PATCH] Fixed worlds with unknown generators silently getting wrong generator, closes #2860 --- src/pocketmine/Server.php | 14 ++++++++++++-- src/pocketmine/level/Level.php | 2 +- .../level/generator/GeneratorManager.php | 7 ++++++- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/pocketmine/Server.php b/src/pocketmine/Server.php index acdc1bc4b..c5911d8b8 100644 --- a/src/pocketmine/Server.php +++ b/src/pocketmine/Server.php @@ -1091,9 +1091,19 @@ class Server{ return false; } + /** + * @var LevelProvider $provider + * @see LevelProvider::__construct() + */ + $provider = new $providerClass($path); + try{ + GeneratorManager::getGenerator($provider->getGenerator(), true); + }catch(\InvalidArgumentException $e){ + $this->logger->error($this->getLanguage()->translateString("pocketmine.level.loadError", [$name, "Unknown generator \"" . $provider->getGenerator() . "\""])); + return false; + } - /** @see LevelProvider::__construct() */ - $level = new Level($this, $name, new $providerClass($path)); + $level = new Level($this, $name, $provider); $this->levels[$level->getId()] = $level; diff --git a/src/pocketmine/level/Level.php b/src/pocketmine/level/Level.php index 306733035..70285fb62 100644 --- a/src/pocketmine/level/Level.php +++ b/src/pocketmine/level/Level.php @@ -383,7 +383,7 @@ class Level implements ChunkManager, Metadatable{ $this->worldHeight = $this->provider->getWorldHeight(); $this->server->getLogger()->info($this->server->getLanguage()->translateString("pocketmine.level.preparing", [$this->displayName])); - $this->generator = GeneratorManager::getGenerator($this->provider->getGenerator()); + $this->generator = GeneratorManager::getGenerator($this->provider->getGenerator(), true); //TODO: validate generator options $this->folderName = $name; diff --git a/src/pocketmine/level/generator/GeneratorManager.php b/src/pocketmine/level/generator/GeneratorManager.php index 5e24b1faa..013fe9031 100644 --- a/src/pocketmine/level/generator/GeneratorManager.php +++ b/src/pocketmine/level/generator/GeneratorManager.php @@ -74,14 +74,19 @@ final class GeneratorManager{ * Returns a class name of a registered Generator matching the given name. * * @param string $name + * @param bool $throwOnMissing @deprecated this is for backwards compatibility only * * @return string|Generator Name of class that extends Generator (not an actual Generator object) + * @throws \InvalidArgumentException if the generator type isn't registered */ - public static function getGenerator(string $name){ + public static function getGenerator(string $name, bool $throwOnMissing = false){ if(isset(self::$list[$name = strtolower($name)])){ return self::$list[$name]; } + if($throwOnMissing){ + throw new \InvalidArgumentException("Alias \"$name\" does not map to any known generator"); + } return Normal::class; }