Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions src/muqsit/vanillagenerator/Loader.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@

use muqsit\vanillagenerator\generator\nether\NetherGenerator;
use muqsit\vanillagenerator\generator\overworld\OverworldGenerator;
use muqsit\vanillagenerator\generator\test\StoneWaterTestGenerator;
use muqsit\vanillagenerator\generator\test\TestGenerator;
use pocketmine\plugin\PluginBase;
use pocketmine\world\generator\GeneratorManager;

Expand All @@ -15,5 +17,7 @@ public function onLoad() : void{
$generator_manager = GeneratorManager::getInstance();
$generator_manager->addGenerator(NetherGenerator::class, "vanilla_nether", fn() => null);
$generator_manager->addGenerator(OverworldGenerator::class, "vanilla_overworld", fn() => null);
$generator_manager->addGenerator(TestGenerator::class, "test", fn() => null);
$generator_manager->addGenerator(StoneWaterTestGenerator::class, "lol", fn() => null);
}
}
27 changes: 25 additions & 2 deletions src/muqsit/vanillagenerator/generator/VanillaBiomeGrid.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,36 @@ class VanillaBiomeGrid implements BiomeGrid{

/** @var int[] */
public array $biomes = [];

/** @var int[] */
private array $biomes_3d = [];

public function getBiome(int $x, int $z) : ?int{
public function getBiome(int $x, int $z): ?int {
// upcasting is very important to get extended biomes
return array_key_exists($hash = $x | $z << Chunk::COORD_BIT_SIZE, $this->biomes) ? $this->biomes[$hash] & 0xFF : null;
}

public function setBiome(int $x, int $z, int $biome_id) : void{
public function getBiome3D(int $x, int $y, int $z): ?int {
// For 3D biomes, we use a different hash that includes Y coordinate
// We sample biomes every 4 blocks in Y (like 1.18+) to save memory
$sample_y = $y >> 2; // Sample every 4 blocks in Y direction
$hash = ($x) | ($z << 4) | ($sample_y << 8);

if(array_key_exists($hash, $this->biomes_3d)) {
return $this->biomes_3d[$hash] & 0xFF;
}

// Fall back to surface biome if no 3D biome is set
return $this->getBiome($x, $z);
}

public function setBiome(int $x, int $z, int $biome_id): void {
$this->biomes[$x | $z << Chunk::COORD_BIT_SIZE] = $biome_id;
}

public function setBiome3D(int $x, int $y, int $z, int $biome_id): void {
$sample_y = $y >> 2;
$hash = ($x) | ($z << 4) | ($sample_y << 8);
$this->biomes_3d[$hash] = $biome_id;
}
}
9 changes: 6 additions & 3 deletions src/muqsit/vanillagenerator/generator/VanillaGenerator.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
use pocketmine\world\ChunkManager;
use pocketmine\world\format\Chunk;
use pocketmine\world\generator\Generator;
use pocketmine\world\World;

/**
* @template T of WorldOctaves
Expand Down Expand Up @@ -97,7 +96,11 @@ public function populateChunk(ChunkManager $world, int $chunk_x, int $chunk_z) :
}
}

public function getMaxY() : int{
return World::Y_MAX;
public function getMaxY(): int {
return 319;
}

public function getMinY(): int {
return -64;
}
}
24 changes: 22 additions & 2 deletions src/muqsit/vanillagenerator/generator/biomegrid/BiomeGrid.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
interface BiomeGrid{

/**
* Get biome at x, z within chunk being generated
* Get biome at x, z within chunk being generated (2D surface biome)
*
* @param int $x - 0-15
* @param int $z - 0-15
Expand All @@ -16,11 +16,31 @@ interface BiomeGrid{
public function getBiome(int $x, int $z) : ?int;

/**
* Set biome at x, z within chunk being generated
* Get biome at x, y, z within chunk being generated (3D biome support for 1.18+)
*
* @param int $x - 0-15
* @param int $y - world min to world max
* @param int $z - 0-15
* @return int|null
*/
public function getBiome3D(int $x, int $y, int $z) : ?int;

/**
* Set biome at x, z within chunk being generated (2D surface biome)
*
* @param int $x - 0-15
* @param int $z - 0-15
* @param int $biome_id
*/
public function setBiome(int $x, int $z, int $biome_id) : void;

/**
* Set biome at x, y, z within chunk being generated (3D biome support for 1.18+)
*
* @param int $x - 0-15
* @param int $y - world min to world max
* @param int $z - 0-15
* @param int $biome_id
*/
public function setBiome3D(int $x, int $y, int $z, int $biome_id) : void;
}
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,8 @@ public function generateValues(int $x, int $z, int $size_x, int $size_z) : array
$this->setCoordsSeed($x + $j, $z + $i);

$final_values[$j + $i * $size_x] = match(true){
$center_val !== 0 && ($upper_left_val === 0 || $upper_right_val === 0 || $lower_left_val === 0 || $lower_right_val === 0) => $this->nextInt(5) === 0 ? 0 : $center_val,
$center_val === 0 && ($upper_left_val !== 0 || $upper_right_val !== 0 || $lower_left_val !== 0 || $lower_right_val !== 0) => $this->nextInt(3) === 0 ? $upper_left_val : 0,
$center_val !== 0 && ($upper_left_val === 0 || $upper_right_val === 0 || $lower_left_val === 0 || $lower_right_val === 0) => $this->nextInt(8) === 0 ? 0 : $center_val,
$center_val === 0 && ($upper_left_val !== 0 || $upper_right_val !== 0 || $lower_left_val !== 0 || $lower_right_val !== 0) => $this->nextInt(2) === 0 ? $upper_left_val : 0,
default => $center_val
};
}
Expand Down
20 changes: 5 additions & 15 deletions src/muqsit/vanillagenerator/generator/biomegrid/NoiseMapLayer.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,32 +13,22 @@ class NoiseMapLayer extends MapLayer{

public function __construct(int $seed){
parent::__construct($seed);
$this->noise_gen = new SimplexOctaveGenerator(new Random($seed), 2);
$this->noise_gen = new SimplexOctaveGenerator(new Random($seed), 3);
}

public function generateValues(int $x, int $z, int $size_x, int $size_z) : array{
$values = [];
for($i = 0; $i < $size_z; ++$i){
for($j = 0; $j < $size_x; ++$j){
$noise = $this->noise_gen->octaveNoise($x + $j, $z + $i, 0, 0.175, 0.8, true) * 4.0;
$noise = $this->noise_gen->octaveNoise($x + $j, $z + $i, 0, 0.2, 0.75, true) * 3.5;
$val = 0;
if($noise >= 0.05){
$val = $noise <= 0.2 ? 3 : 2;
if($noise >= -0.1){
$val = $noise <= 0.15 ? 3 : 2;
}else{
$this->setCoordsSeed($x + $j, $z + $i);
$val = $this->nextInt(2) === 0 ? 3 : 0;
$val = $this->nextInt(10) < 3 ? 0 : 3;
}
$values[$j + $i * $size_x] = $val;
//$values[$j + $i * $size_x] =
// $noise >= -0.5
// ? (float) $noise >= 0.57
// ? 2
// : $noise <= 0.2
// ? 3
// : 2
// : $this->nextInt(2) === 0
// ? 3
// : 0;
}
}
return $values;
Expand Down
Loading