diff --git a/src/pocketmine/Server.php b/src/pocketmine/Server.php index 1199f7be3..bc60936f9 100644 --- a/src/pocketmine/Server.php +++ b/src/pocketmine/Server.php @@ -1670,13 +1670,6 @@ class Server{ continue; } if(!$this->loadLevel($name)){ - $seed = $options["seed"] ?? time(); - if(is_string($seed) and !is_numeric($seed)){ - $seed = Utils::javaStringHash($seed); - }elseif(!is_int($seed)){ - $seed = (int) $seed; - } - if(isset($options["generator"])){ $generatorOptions = explode(":", $options["generator"]); $generator = GeneratorManager::getGenerator(array_shift($generatorOptions)); @@ -1687,7 +1680,7 @@ class Server{ $generator = GeneratorManager::getGenerator("default"); } - $this->generateLevel($name, $seed, $generator, $options); + $this->generateLevel($name, Generator::convertSeed((string) ($options["seed"] ?? "")), $generator, $options); } } @@ -1699,13 +1692,7 @@ class Server{ $this->setConfigString("level-name", "world"); } if(!$this->loadLevel($default)){ - $seed = $this->getConfigString("level-seed", (string) time()); - if(!is_numeric($seed) or bccomp($seed, "9223372036854775807") > 0){ - $seed = Utils::javaStringHash($seed); - }else{ - $seed = (int) $seed; - } - $this->generateLevel($default, $seed === 0 ? time() : $seed); + $this->generateLevel($default, Generator::convertSeed($this->getConfigString("level-seed"))); } $this->setDefaultLevel($this->getLevelByName($default)); diff --git a/src/pocketmine/level/generator/Generator.php b/src/pocketmine/level/generator/Generator.php index 0f1aafa19..dba8ca1f7 100644 --- a/src/pocketmine/level/generator/Generator.php +++ b/src/pocketmine/level/generator/Generator.php @@ -29,11 +29,32 @@ namespace pocketmine\level\generator; use pocketmine\level\ChunkManager; use pocketmine\math\Vector3; use pocketmine\utils\Random; +use pocketmine\utils\Utils; abstract class Generator{ + /** + * Converts a string level seed into an integer for use by the generator. + * + * @param string $seed + * + * @return int|null + */ + public static function convertSeed(string $seed) : ?int{ + if($seed === ""){ //empty seed should cause a random seed to be selected - can't use 0 here because 0 is a valid seed + $convertedSeed = null; + }elseif(ctype_digit($seed)){ //this avoids treating seeds like "404.4" as integer seeds + $convertedSeed = (int) $seed; + }else{ + $convertedSeed = Utils::javaStringHash($seed); + } + + return $convertedSeed; + } + abstract public function __construct(array $settings = []); + abstract public function init(ChunkManager $level, Random $random); abstract public function generateChunk(int $chunkX, int $chunkZ);