diff --git a/src/pocketmine/level/Level.php b/src/pocketmine/level/Level.php index d40b5e604..b337b4277 100644 --- a/src/pocketmine/level/Level.php +++ b/src/pocketmine/level/Level.php @@ -239,10 +239,8 @@ class Level implements ChunkManager, Metadatable{ /** @var int */ public $tickRateCounter = 0; - /** @var Generator */ + /** @var string|Generator */ private $generator; - /** @var Generator */ - private $generatorInstance; /** @var bool */ private $closed = false; @@ -379,17 +377,14 @@ class Level implements ChunkManager, Metadatable{ } public function initLevel(){ - $generator = $this->generator; - $this->generatorInstance = new $generator($this->provider->getGeneratorOptions()); - $this->generatorInstance->init($this, new Random($this->getSeed())); - $this->registerGenerator(); } public function registerGenerator(){ $pool = $this->server->getAsyncPool(); for($i = 0, $size = $pool->getSize(); $i < $size; ++$i){ - $pool->submitTaskToWorker(new GeneratorRegisterTask($this, $this->generatorInstance), $i); + $pool->submitTaskToWorker(new GeneratorRegisterTask($this, $this->generator, $this->provider->getGeneratorOptions()), $i); + } } diff --git a/src/pocketmine/level/format/io/BaseLevelProvider.php b/src/pocketmine/level/format/io/BaseLevelProvider.php index ee1e8fda0..513ee2940 100644 --- a/src/pocketmine/level/format/io/BaseLevelProvider.php +++ b/src/pocketmine/level/format/io/BaseLevelProvider.php @@ -60,7 +60,7 @@ abstract class BaseLevelProvider implements LevelProvider{ protected function fixLevelData() : void{ if(!$this->levelData->hasTag("generatorName", StringTag::class)){ - $this->levelData->setString("generatorName", (string) Generator::getGenerator("DEFAULT"), true); + $this->levelData->setString("generatorName", Generator::getGenerator("DEFAULT"), true); } if(!$this->levelData->hasTag("generatorOptions", StringTag::class)){ diff --git a/src/pocketmine/level/format/io/leveldb/LevelDB.php b/src/pocketmine/level/format/io/leveldb/LevelDB.php index ac1334cc0..a63f58a43 100644 --- a/src/pocketmine/level/format/io/leveldb/LevelDB.php +++ b/src/pocketmine/level/format/io/leveldb/LevelDB.php @@ -121,7 +121,7 @@ class LevelDB extends BaseLevelProvider{ if($this->levelData->hasTag("Generator", IntTag::class)){ switch($this->levelData->getInt("Generator")){ //Detect correct generator from MCPE data case self::GENERATOR_FLAT: - $this->levelData->setString("generatorName", (string) Generator::getGenerator("FLAT")); + $this->levelData->setString("generatorName", Generator::getGenerator("FLAT")); if(($layers = $db->get(self::ENTRY_FLAT_WORLD_LAYERS)) !== false){ //Detect existing custom flat layers $layers = trim($layers, "[]"); }else{ @@ -131,7 +131,7 @@ class LevelDB extends BaseLevelProvider{ break; case self::GENERATOR_INFINITE: //TODO: add a null generator which does not generate missing chunks (to allow importing back to MCPE and generating more normal terrain without PocketMine messing things up) - $this->levelData->setString("generatorName", (string) Generator::getGenerator("DEFAULT")); + $this->levelData->setString("generatorName", Generator::getGenerator("DEFAULT")); $this->levelData->setString("generatorOptions", ""); break; case self::GENERATOR_LIMITED: @@ -140,7 +140,7 @@ class LevelDB extends BaseLevelProvider{ throw new LevelException("Unknown LevelDB world format type, this level cannot be loaded"); } }else{ - $this->levelData->setString("generatorName", (string) Generator::getGenerator("DEFAULT")); + $this->levelData->setString("generatorName", Generator::getGenerator("DEFAULT")); } } diff --git a/src/pocketmine/level/generator/Generator.php b/src/pocketmine/level/generator/Generator.php index 47427dce4..ad588682c 100644 --- a/src/pocketmine/level/generator/Generator.php +++ b/src/pocketmine/level/generator/Generator.php @@ -64,7 +64,7 @@ abstract class Generator{ /** * @param $name * - * @return Generator + * @return string|Generator Name of class that extends Generator (not an actual Generator object) */ public static function getGenerator($name){ if(isset(Generator::$list[$name = strtolower($name)])){ diff --git a/src/pocketmine/level/generator/GeneratorRegisterTask.php b/src/pocketmine/level/generator/GeneratorRegisterTask.php index 6c7172fe0..1c608a7e1 100644 --- a/src/pocketmine/level/generator/GeneratorRegisterTask.php +++ b/src/pocketmine/level/generator/GeneratorRegisterTask.php @@ -32,15 +32,15 @@ use pocketmine\utils\Random; class GeneratorRegisterTask extends AsyncTask{ - public $generator; + public $generatorClass; public $settings; public $seed; public $levelId; public $worldHeight = Level::Y_MAX; - public function __construct(Level $level, Generator $generator){ - $this->generator = get_class($generator); - $this->settings = serialize($generator->getSettings()); + public function __construct(Level $level, string $generatorClass, array $generatorSettings = []){ + $this->generatorClass = $generatorClass; + $this->settings = serialize($generatorSettings); $this->seed = $level->getSeed(); $this->levelId = $level->getId(); $this->worldHeight = $level->getWorldHeight(); @@ -51,9 +51,9 @@ class GeneratorRegisterTask extends AsyncTask{ Biome::init(); $manager = new SimpleChunkManager($this->seed, $this->worldHeight); $this->saveToThreadStore("generation.level{$this->levelId}.manager", $manager); + /** @var Generator $generator */ - $generator = $this->generator; - $generator = new $generator(unserialize($this->settings)); + $generator = new $this->generatorClass(unserialize($this->settings)); $generator->init($manager, new Random($manager->getSeed())); $this->saveToThreadStore("generation.level{$this->levelId}.generator", $generator); } diff --git a/src/pocketmine/scheduler/AsyncWorker.php b/src/pocketmine/scheduler/AsyncWorker.php index cd9908804..934f457a2 100644 --- a/src/pocketmine/scheduler/AsyncWorker.php +++ b/src/pocketmine/scheduler/AsyncWorker.php @@ -33,7 +33,7 @@ class AsyncWorker extends Worker{ /** @var int */ private $memoryLimit; - public function __construct(\AttachableThreadedLogger $logger, int $id, int $memoryLimit){ + public function __construct(\ThreadedLogger $logger, int $id, int $memoryLimit){ $this->logger = $logger; $this->id = $id; $this->memoryLimit = $memoryLimit;