Mapgen Flat: Fix and improve getSpawnLevelAtPoint() (#8756)

Previously, this wrongly returned ground level (a position containing
a solid node) as spawn level.
Return ground level + 2 (+ 2 to spawn above biome 'dust' nodes).
Improve codestyle and make more consistent with generateTerrain().
master
Paramat 2019-08-06 02:30:28 +01:00 committed by GitHub
parent ac856b20bf
commit 8da35c22d1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 18 additions and 13 deletions

View File

@ -143,26 +143,31 @@ void MapgenFlatParams::writeParams(Settings *settings) const
int MapgenFlat::getSpawnLevelAtPoint(v2s16 p) int MapgenFlat::getSpawnLevelAtPoint(v2s16 p)
{ {
s16 level_at_point = ground_level; s16 stone_level = ground_level;
float n_terrain = 0.0f; float n_terrain =
if ((spflags & MGFLAT_LAKES) || (spflags & MGFLAT_HILLS)) ((spflags & MGFLAT_LAKES) || (spflags & MGFLAT_HILLS)) ?
n_terrain = NoisePerlin2D(&noise_terrain->np, p.X, p.Y, seed); NoisePerlin2D(&noise_terrain->np, p.X, p.Y, seed) :
0.0f;
if ((spflags & MGFLAT_LAKES) && n_terrain < lake_threshold) { if ((spflags & MGFLAT_LAKES) && n_terrain < lake_threshold) {
level_at_point = ground_level - s16 depress = (lake_threshold - n_terrain) * lake_steepness;
(lake_threshold - n_terrain) * lake_steepness; stone_level = ground_level - depress;
} else if ((spflags & MGFLAT_HILLS) && n_terrain > hill_threshold) { } else if ((spflags & MGFLAT_HILLS) && n_terrain > hill_threshold) {
level_at_point = ground_level + s16 rise = (n_terrain - hill_threshold) * hill_steepness;
(n_terrain - hill_threshold) * hill_steepness; stone_level = ground_level + rise;
} }
if (ground_level < water_level) // Ocean world, allow spawn in water if (ground_level < water_level)
return MYMAX(level_at_point, water_level); // Ocean world, may not have islands so allow spawn in water
return MYMAX(stone_level + 2, water_level);
if (level_at_point > water_level) if (stone_level >= water_level)
return level_at_point; // Spawn on land // Spawn on land
// + 2 not + 1, to spawn above biome 'dust' nodes
return stone_level + 2;
return MAX_MAP_GENERATION_LIMIT; // Unsuitable spawn point // Unsuitable spawn point
return MAX_MAP_GENERATION_LIMIT;
} }