*/ private static $biomes; /** @var int */ private $id; /** @var bool */ private $registered = false; /** @var Populator[] */ private $populators = []; /** @var int */ private $minElevation; /** @var int */ private $maxElevation; /** @var Block[] */ private $groundCover = []; /** @var float */ protected $rainfall = 0.5; /** @var float */ protected $temperature = 0.5; /** * @return void */ protected static function register(int $id, Biome $biome){ self::$biomes[$id] = $biome; $biome->setId($id); } /** * @return void */ public static function init(){ self::$biomes = new \SplFixedArray(self::MAX_BIOMES); self::register(self::OCEAN, new OceanBiome()); self::register(self::PLAINS, new PlainBiome()); self::register(self::DESERT, new DesertBiome()); self::register(self::MOUNTAINS, new MountainsBiome()); self::register(self::FOREST, new ForestBiome()); self::register(self::TAIGA, new TaigaBiome()); self::register(self::SWAMP, new SwampBiome()); self::register(self::RIVER, new RiverBiome()); self::register(self::ICE_PLAINS, new IcePlainsBiome()); self::register(self::SMALL_MOUNTAINS, new SmallMountainsBiome()); self::register(self::BIRCH_FOREST, new ForestBiome(ForestBiome::TYPE_BIRCH)); } public static function getBiome(int $id) : Biome{ if(self::$biomes[$id] === null){ self::register($id, new UnknownBiome()); } return self::$biomes[$id]; } /** * @return void */ public function clearPopulators(){ $this->populators = []; } /** * @return void */ public function addPopulator(Populator $populator){ $this->populators[] = $populator; } /** * @return void */ public function populateChunk(ChunkManager $level, int $chunkX, int $chunkZ, Random $random){ foreach($this->populators as $populator){ $populator->populate($level, $chunkX, $chunkZ, $random); } } /** * @return Populator[] */ public function getPopulators() : array{ return $this->populators; } /** * @return void */ public function setId(int $id){ if(!$this->registered){ $this->registered = true; $this->id = $id; } } public function getId() : int{ return $this->id; } abstract public function getName() : string; public function getMinElevation() : int{ return $this->minElevation; } public function getMaxElevation() : int{ return $this->maxElevation; } /** * @return void */ public function setElevation(int $min, int $max){ $this->minElevation = $min; $this->maxElevation = $max; } /** * @return Block[] */ public function getGroundCover() : array{ return $this->groundCover; } /** * @param Block[] $covers * * @return void */ public function setGroundCover(array $covers){ $this->groundCover = $covers; } public function getTemperature() : float{ return $this->temperature; } public function getRainfall() : float{ return $this->rainfall; } }