From 534b988a1ce9f25b09e4c128b5688c23a1ac46b1 Mon Sep 17 00:00:00 2001 From: Shoghi Cervantes Date: Sun, 9 Aug 2015 00:38:23 +0200 Subject: [PATCH] Added basic Nether generator --- src/pocketmine/Server.php | 3 + src/pocketmine/level/Level.php | 11 +- .../level/generator/biome/Biome.php | 5 +- .../level/generator/hell/HellBiome.php | 35 ++++ .../level/generator/hell/Nether.php | 184 ++++++++++++++++++ .../level/generator/normal/Normal.php | 2 - 6 files changed, 233 insertions(+), 7 deletions(-) create mode 100644 src/pocketmine/level/generator/hell/HellBiome.php create mode 100644 src/pocketmine/level/generator/hell/Nether.php diff --git a/src/pocketmine/Server.php b/src/pocketmine/Server.php index e38119b28..e588f559d 100644 --- a/src/pocketmine/Server.php +++ b/src/pocketmine/Server.php @@ -66,6 +66,7 @@ use pocketmine\level\format\mcregion\McRegion; use pocketmine\level\generator\biome\Biome; use pocketmine\level\generator\Flat; use pocketmine\level\generator\Generator; +use pocketmine\level\generator\hell\Nether; use pocketmine\level\generator\normal\Normal; use pocketmine\level\Level; use pocketmine\metadata\EntityMetadataStore; @@ -1646,6 +1647,8 @@ class Server{ Generator::addGenerator(Flat::class, "flat"); Generator::addGenerator(Normal::class, "normal"); Generator::addGenerator(Normal::class, "default"); + Generator::addGenerator(Nether::class, "hell"); + Generator::addGenerator(Nether::class, "nether"); foreach((array) $this->getProperty("worlds", []) as $name => $worldSetting){ if($this->loadLevel($name) === false){ diff --git a/src/pocketmine/level/Level.php b/src/pocketmine/level/Level.php index 6e4a0971c..e08ace66b 100644 --- a/src/pocketmine/level/Level.php +++ b/src/pocketmine/level/Level.php @@ -2664,13 +2664,18 @@ class Level implements ChunkManager, Metadatable{ $x = $v->x & 0x0f; $z = $v->z & 0x0f; if($chunk !== null){ - $y = (int) min(127, $v->y); + $y = (int) min(126, $v->y); + $wasAir = ($chunk->getBlockId($x, $y - 1, $z) === 0); for(; $y > 0; --$y){ $b = $chunk->getFullBlock($x, $y, $z); $block = Block::get($b >> 4, $b & 0x0f); if($this->isFullBlock($block)){ - $y++; - break; + if($wasAir){ + $y++; + break; + } + }else{ + $wasAir = true; } } diff --git a/src/pocketmine/level/generator/biome/Biome.php b/src/pocketmine/level/generator/biome/Biome.php index a4d5e1caf..2b38fd03b 100644 --- a/src/pocketmine/level/generator/biome/Biome.php +++ b/src/pocketmine/level/generator/biome/Biome.php @@ -47,6 +47,8 @@ abstract class Biome{ const SWAMP = 6; const RIVER = 7; + const HELL = 8; + const ICE_PLAINS = 12; @@ -88,12 +90,11 @@ abstract class Biome{ 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::SWAMP, new SwampBiome()); self::register(self::SMALL_MOUNTAINS, new SmallMountainsBiome()); diff --git a/src/pocketmine/level/generator/hell/HellBiome.php b/src/pocketmine/level/generator/hell/HellBiome.php new file mode 100644 index 000000000..5fb717e92 --- /dev/null +++ b/src/pocketmine/level/generator/hell/HellBiome.php @@ -0,0 +1,35 @@ +level = $level; + $this->random = $random; + $this->random->setSeed($this->level->getSeed()); + $this->noiseBase = new Simplex($this->random, 4, 1 / 4, 1 / 64); + $this->random->setSeed($this->level->getSeed()); + + /*$ores = new Ore(); + $ores->setOreTypes([ + new OreType(new CoalOre(), 20, 16, 0, 128), + new OreType(New IronOre(), 20, 8, 0, 64), + new OreType(new RedstoneOre(), 8, 7, 0, 16), + new OreType(new LapisOre(), 1, 6, 0, 32), + new OreType(new GoldOre(), 2, 8, 0, 32), + new OreType(new DiamondOre(), 1, 7, 0, 16), + new OreType(new Dirt(), 20, 32, 0, 128), + new OreType(new Gravel(), 10, 16, 0, 128) + ]); + $this->populators[] = $ores;*/ + } + + public function generateChunk($chunkX, $chunkZ){ + $this->random->setSeed(0xdeadbeef ^ ($chunkX << 8) ^ $chunkZ ^ $this->level->getSeed()); + + $noise = Generator::getFastNoise3D($this->noiseBase, 16, 128, 16, 4, 8, 4, $chunkX * 16, 0, $chunkZ * 16); + + $chunk = $this->level->getChunk($chunkX, $chunkZ); + + for($x = 0; $x < 16; ++$x){ + for($z = 0; $z < 16; ++$z){ + + $biome = Biome::getBiome(Biome::HELL); + $chunk->setBiomeId($x, $z, $biome->getId()); + $color = [0, 0, 0]; + $bColor = $biome->getColor(); + $color[0] += (($bColor >> 16) ** 2); + $color[1] += ((($bColor >> 8) & 0xff) ** 2); + $color[2] += (($bColor & 0xff) ** 2); + + $chunk->setBiomeColor($x, $z, $color[0], $color[1], $color[2]); + + for($y = 0; $y < 128; ++$y){ + if($y === 0 or $y === 127){ + $chunk->setBlockId($x, $y, $z, Block::BEDROCK); + continue; + } + $noiseValue = (abs($this->emptyHeight - $y) / $this->emptyHeight) * $this->emptyAmplitude - $noise[$x][$z][$y]; + $noiseValue -= 1 - $this->density; + + if($noiseValue > 0){ + $chunk->setBlockId($x, $y, $z, Block::NETHERRACK); + }elseif($y <= $this->waterHeight){ + $chunk->setBlockId($x, $y, $z, Block::STILL_LAVA); + } + } + } + } + + foreach($this->generationPopulators as $populator){ + $populator->populate($this->level, $chunkX, $chunkZ, $this->random); + } + } + + public function populateChunk($chunkX, $chunkZ){ + $this->random->setSeed(0xdeadbeef ^ ($chunkX << 8) ^ $chunkZ ^ $this->level->getSeed()); + foreach($this->populators as $populator){ + $populator->populate($this->level, $chunkX, $chunkZ, $this->random); + } + + $chunk = $this->level->getChunk($chunkX, $chunkZ); + $biome = Biome::getBiome($chunk->getBiomeId(7, 7)); + $biome->populateChunk($this->level, $chunkX, $chunkZ, $this->random); + } + + public function getSpawn(){ + return new Vector3(127.5, 128, 127.5); + } + +} \ No newline at end of file diff --git a/src/pocketmine/level/generator/normal/Normal.php b/src/pocketmine/level/generator/normal/Normal.php index c2c91084b..1cc445814 100644 --- a/src/pocketmine/level/generator/normal/Normal.php +++ b/src/pocketmine/level/generator/normal/Normal.php @@ -33,8 +33,6 @@ use pocketmine\block\RedstoneOre; use pocketmine\level\ChunkManager; use pocketmine\level\generator\biome\Biome; use pocketmine\level\generator\biome\BiomeSelector; -use pocketmine\level\generator\GenerationChunkManager; -use pocketmine\level\generator\GenerationManager; use pocketmine\level\generator\Generator; use pocketmine\level\generator\noise\Simplex;