Merge branch 'master' into scheduler-nuke

# Conflicts:
#	src/pocketmine/level/Level.php
This commit is contained in:
Dylan K. Taylor 2018-05-31 10:40:10 +01:00
commit 05ef13b23a
6 changed files with 15 additions and 20 deletions

View File

@ -239,10 +239,8 @@ class Level implements ChunkManager, Metadatable{
/** @var int */ /** @var int */
public $tickRateCounter = 0; public $tickRateCounter = 0;
/** @var Generator */ /** @var string|Generator */
private $generator; private $generator;
/** @var Generator */
private $generatorInstance;
/** @var bool */ /** @var bool */
private $closed = false; private $closed = false;
@ -379,17 +377,14 @@ class Level implements ChunkManager, Metadatable{
} }
public function initLevel(){ public function initLevel(){
$generator = $this->generator;
$this->generatorInstance = new $generator($this->provider->getGeneratorOptions());
$this->generatorInstance->init($this, new Random($this->getSeed()));
$this->registerGenerator(); $this->registerGenerator();
} }
public function registerGenerator(){ public function registerGenerator(){
$pool = $this->server->getAsyncPool(); $pool = $this->server->getAsyncPool();
for($i = 0, $size = $pool->getSize(); $i < $size; ++$i){ 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);
} }
} }

View File

@ -60,7 +60,7 @@ abstract class BaseLevelProvider implements LevelProvider{
protected function fixLevelData() : void{ protected function fixLevelData() : void{
if(!$this->levelData->hasTag("generatorName", StringTag::class)){ 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)){ if(!$this->levelData->hasTag("generatorOptions", StringTag::class)){

View File

@ -121,7 +121,7 @@ class LevelDB extends BaseLevelProvider{
if($this->levelData->hasTag("Generator", IntTag::class)){ if($this->levelData->hasTag("Generator", IntTag::class)){
switch($this->levelData->getInt("Generator")){ //Detect correct generator from MCPE data switch($this->levelData->getInt("Generator")){ //Detect correct generator from MCPE data
case self::GENERATOR_FLAT: 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 if(($layers = $db->get(self::ENTRY_FLAT_WORLD_LAYERS)) !== false){ //Detect existing custom flat layers
$layers = trim($layers, "[]"); $layers = trim($layers, "[]");
}else{ }else{
@ -131,7 +131,7 @@ class LevelDB extends BaseLevelProvider{
break; break;
case self::GENERATOR_INFINITE: 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) //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", ""); $this->levelData->setString("generatorOptions", "");
break; break;
case self::GENERATOR_LIMITED: 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"); throw new LevelException("Unknown LevelDB world format type, this level cannot be loaded");
} }
}else{ }else{
$this->levelData->setString("generatorName", (string) Generator::getGenerator("DEFAULT")); $this->levelData->setString("generatorName", Generator::getGenerator("DEFAULT"));
} }
} }

View File

@ -64,7 +64,7 @@ abstract class Generator{
/** /**
* @param $name * @param $name
* *
* @return Generator * @return string|Generator Name of class that extends Generator (not an actual Generator object)
*/ */
public static function getGenerator($name){ public static function getGenerator($name){
if(isset(Generator::$list[$name = strtolower($name)])){ if(isset(Generator::$list[$name = strtolower($name)])){

View File

@ -32,15 +32,15 @@ use pocketmine\utils\Random;
class GeneratorRegisterTask extends AsyncTask{ class GeneratorRegisterTask extends AsyncTask{
public $generator; public $generatorClass;
public $settings; public $settings;
public $seed; public $seed;
public $levelId; public $levelId;
public $worldHeight = Level::Y_MAX; public $worldHeight = Level::Y_MAX;
public function __construct(Level $level, Generator $generator){ public function __construct(Level $level, string $generatorClass, array $generatorSettings = []){
$this->generator = get_class($generator); $this->generatorClass = $generatorClass;
$this->settings = serialize($generator->getSettings()); $this->settings = serialize($generatorSettings);
$this->seed = $level->getSeed(); $this->seed = $level->getSeed();
$this->levelId = $level->getId(); $this->levelId = $level->getId();
$this->worldHeight = $level->getWorldHeight(); $this->worldHeight = $level->getWorldHeight();
@ -51,9 +51,9 @@ class GeneratorRegisterTask extends AsyncTask{
Biome::init(); Biome::init();
$manager = new SimpleChunkManager($this->seed, $this->worldHeight); $manager = new SimpleChunkManager($this->seed, $this->worldHeight);
$this->saveToThreadStore("generation.level{$this->levelId}.manager", $manager); $this->saveToThreadStore("generation.level{$this->levelId}.manager", $manager);
/** @var Generator $generator */ /** @var Generator $generator */
$generator = $this->generator; $generator = new $this->generatorClass(unserialize($this->settings));
$generator = new $generator(unserialize($this->settings));
$generator->init($manager, new Random($manager->getSeed())); $generator->init($manager, new Random($manager->getSeed()));
$this->saveToThreadStore("generation.level{$this->levelId}.generator", $generator); $this->saveToThreadStore("generation.level{$this->levelId}.generator", $generator);
} }

View File

@ -33,7 +33,7 @@ class AsyncWorker extends Worker{
/** @var int */ /** @var int */
private $memoryLimit; private $memoryLimit;
public function __construct(\AttachableThreadedLogger $logger, int $id, int $memoryLimit){ public function __construct(\ThreadedLogger $logger, int $id, int $memoryLimit){
$this->logger = $logger; $this->logger = $logger;
$this->id = $id; $this->id = $id;
$this->memoryLimit = $memoryLimit; $this->memoryLimit = $memoryLimit;