diff --git a/src/pocketmine/level/Level.php b/src/pocketmine/level/Level.php index e6cc73f4b0..b8acb37770 100644 --- a/src/pocketmine/level/Level.php +++ b/src/pocketmine/level/Level.php @@ -367,6 +367,7 @@ class Level implements ChunkManager, Metadatable{ $this->server->getLogger()->info($this->server->getLanguage()->translateString("pocketmine.level.preparing", [$this->displayName])); $this->generator = GeneratorManager::getGenerator($this->provider->getLevelData()->getGenerator()); + //TODO: validate generator options $this->folderName = $name; diff --git a/src/pocketmine/level/generator/Flat.php b/src/pocketmine/level/generator/Flat.php index 17ccf7a5a3..2c488b74c6 100644 --- a/src/pocketmine/level/generator/Flat.php +++ b/src/pocketmine/level/generator/Flat.php @@ -32,10 +32,11 @@ use pocketmine\level\generator\object\OreType; use pocketmine\level\generator\populator\Ore; use pocketmine\level\generator\populator\Populator; use pocketmine\math\Vector3; +use function array_map; use function count; use function explode; +use function preg_match; use function preg_match_all; -use function str_replace; class Flat extends Generator{ /** @var Chunk */ @@ -55,6 +56,13 @@ class Flat extends Generator{ return "flat"; } + /** + * @param ChunkManager $level + * @param int $seed + * @param array $options + * + * @throws InvalidGeneratorOptionsException + */ public function __construct(ChunkManager $level, int $seed, array $options = []){ parent::__construct($level, $seed, $options); @@ -85,13 +93,28 @@ class Flat extends Generator{ $this->generateBaseChunk(); } + /** + * @param string $layers + * + * @return int[][] + * @throws InvalidGeneratorOptionsException + */ public static function parseLayers(string $layers) : array{ $result = []; - preg_match_all('#^(([0-9]*x|)([0-9]{1,3})(|:[0-9]{0,2}))$#m', str_replace(",", "\n", $layers), $matches); + $split = array_map('\trim', explode(',', $layers)); $y = 0; - foreach($matches[3] as $i => $b){ - $b = ItemFactory::fromString($b . $matches[4][$i])->getBlock(); - $cnt = $matches[2][$i] === "" ? 1 : (int) $matches[2][$i]; + foreach($split as $line){ + preg_match('#^(?:(\d+)x)?(.+)$#', $line, $matches); + if(count($matches) !== 3){ + throw new InvalidGeneratorOptionsException("Invalid preset layer \"$line\""); + } + + $cnt = $matches[1] !== "" ? (int) $matches[1] : 1; + try{ + $b = ItemFactory::fromString($matches[2])->getBlock(); + }catch(\InvalidArgumentException $e){ + throw new InvalidGeneratorOptionsException("Invalid preset layer \"$line\": " . $e->getMessage(), 0, $e); + } for($cY = $y, $y += $cnt; $cY < $y; ++$cY){ $result[$cY] = [$b->getId(), $b->getDamage()]; } @@ -109,6 +132,7 @@ class Flat extends Generator{ $this->floorLevel = count($this->structure); + //TODO: more error checking preg_match_all('#(([0-9a-z_]{1,})\(?([0-9a-z_ =:]{0,})\)?),?#', $options, $matches); foreach($matches[2] as $i => $option){ $params = true; diff --git a/src/pocketmine/level/generator/Generator.php b/src/pocketmine/level/generator/Generator.php index b84644a9b5..4143c98f06 100644 --- a/src/pocketmine/level/generator/Generator.php +++ b/src/pocketmine/level/generator/Generator.php @@ -63,6 +63,13 @@ abstract class Generator{ /** @var Random */ protected $random; + /** + * @param ChunkManager $level + * @param int $seed + * @param array $options + * + * @throws InvalidGeneratorOptionsException + */ public function __construct(ChunkManager $level, int $seed, array $options = []){ $this->level = $level; $this->seed = $seed; diff --git a/src/pocketmine/level/generator/InvalidGeneratorOptionsException.php b/src/pocketmine/level/generator/InvalidGeneratorOptionsException.php new file mode 100644 index 0000000000..9489589f0d --- /dev/null +++ b/src/pocketmine/level/generator/InvalidGeneratorOptionsException.php @@ -0,0 +1,28 @@ +