From 8da35c22d1c8933090330b2f3c44b4cf2c6e6760 Mon Sep 17 00:00:00 2001 From: Paramat Date: Tue, 6 Aug 2019 02:30:28 +0100 Subject: [PATCH] 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(). --- src/mapgen/mapgen_flat.cpp | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/src/mapgen/mapgen_flat.cpp b/src/mapgen/mapgen_flat.cpp index d859fa973..773b7b10f 100644 --- a/src/mapgen/mapgen_flat.cpp +++ b/src/mapgen/mapgen_flat.cpp @@ -143,26 +143,31 @@ void MapgenFlatParams::writeParams(Settings *settings) const int MapgenFlat::getSpawnLevelAtPoint(v2s16 p) { - s16 level_at_point = ground_level; - float n_terrain = 0.0f; - if ((spflags & MGFLAT_LAKES) || (spflags & MGFLAT_HILLS)) - n_terrain = NoisePerlin2D(&noise_terrain->np, p.X, p.Y, seed); + s16 stone_level = ground_level; + float n_terrain = + ((spflags & MGFLAT_LAKES) || (spflags & MGFLAT_HILLS)) ? + NoisePerlin2D(&noise_terrain->np, p.X, p.Y, seed) : + 0.0f; if ((spflags & MGFLAT_LAKES) && n_terrain < lake_threshold) { - level_at_point = ground_level - - (lake_threshold - n_terrain) * lake_steepness; + s16 depress = (lake_threshold - n_terrain) * lake_steepness; + stone_level = ground_level - depress; } else if ((spflags & MGFLAT_HILLS) && n_terrain > hill_threshold) { - level_at_point = ground_level + - (n_terrain - hill_threshold) * hill_steepness; + s16 rise = (n_terrain - hill_threshold) * hill_steepness; + stone_level = ground_level + rise; } - if (ground_level < water_level) // Ocean world, allow spawn in water - return MYMAX(level_at_point, water_level); + if (ground_level < 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) - return level_at_point; // Spawn on land + if (stone_level >= water_level) + // 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; }