// If mountains are disabled, terrain level is base terrain level.
// Avoids mid-air spawn where mountain terrain would have been.
if (!(spflags & MGV7_MOUNTAINS)) {
- if (y <= water_level || y > max_spawn_y)
+ if (y < water_level || y > max_spawn_y)
return MAX_MAP_GENERATION_LIMIT; // Unsuitable spawn point
else
- // + 1 to not be half-buried in a potential node-deep biome 'dust'
- return y + 1;
+ // y + 2 because y is surface level and due to biome 'dust'
+ return y + 2;
}
// Search upwards for first node without mountain terrain
int iters = 256;
while (iters > 0 && y <= max_spawn_y) {
- if (!getMountainTerrainAtPoint(p.X, y + 1, p.Y)) { // If air above
+ if (!getMountainTerrainAtPoint(p.X, y + 1, p.Y)) {
if (y <= water_level || y > max_spawn_y)
return MAX_MAP_GENERATION_LIMIT; // Unsuitable spawn point
else
+ // y + 1 due to biome 'dust'
return y + 1;
}
y++;
// Init biome generator, place biome-specific nodes, and build biomemap
biomegen->calcBiomeNoise(node_min);
- MgStoneType stone_type = generateBiomes(biome_zero_level);
+
+ MgStoneType mgstone_type;
+ content_t biome_stone;
+ generateBiomes(&mgstone_type, &biome_stone, water_level - 1);
// Generate caverns, tunnels and classic caves
if (flags & MG_CAVES) {
// Generate dungeons
if (flags & MG_DUNGEONS)
- generateDungeons(stone_surface_max_y, stone_type);
+ generateDungeons(stone_surface_max_y, mgstone_type, biome_stone);
// Generate the registered decorations
if (flags & MG_DECORATIONS)
}
//// Place nodes
- v3s16 em = vm->m_area.getExtent();
+ const v3s16 &em = vm->m_area.getExtent();
s16 stone_surface_max_y = -MAX_MAP_GENERATION_LIMIT;
u32 index2d = 0;