From 84a5fa01fff2b81fae12411c31502a49f152ed1d Mon Sep 17 00:00:00 2001 From: Treer Date: Wed, 3 Oct 2018 09:50:21 +1000 Subject: Fix Mapgen Valleys getSpawnLevelAtPoint() (#7756) --- src/mapgen/mapgen_valleys.cpp | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/src/mapgen/mapgen_valleys.cpp b/src/mapgen/mapgen_valleys.cpp index 404ec585a..5f9267875 100644 --- a/src/mapgen/mapgen_valleys.cpp +++ b/src/mapgen/mapgen_valleys.cpp @@ -393,18 +393,27 @@ float MapgenValleys::terrainLevelFromNoise(TerrainNoise *tn) float MapgenValleys::adjustedTerrainLevelFromNoise(TerrainNoise *tn) { float mount = terrainLevelFromNoise(tn); + float result = mount; s16 y_start = myround(mount); - - for (s16 y = y_start; y <= y_start + 1000; y++) { - float fill = + float fill = + NoisePerlin3D(&noise_inter_valley_fill->np, tn->x, y_start, tn->z, seed); + bool is_ground = fill * *tn->slope >= y_start - mount; + s16 search_direction = is_ground ? 1 : -1; + + for (s16 i = 1; i <= 1000; i++) { + s16 y = y_start + i * search_direction; + fill = NoisePerlin3D(&noise_inter_valley_fill->np, tn->x, y, tn->z, seed); - if (fill * *tn->slope < y - mount) { - mount = std::fmax((float)(y - 1), mount); + + bool was_ground = is_ground; + is_ground = fill * *tn->slope >= y - mount; + if (is_ground) + result = y; + if (is_ground != was_ground) break; - } } - return mount; + return result; } @@ -420,7 +429,8 @@ int MapgenValleys::getSpawnLevelAtPoint(v2s16 p) level_at_point > water_level + 16) return MAX_MAP_GENERATION_LIMIT; // Unsuitable spawn point - return level_at_point; + // +1 to account for biome dust that can be 1 node deep + return level_at_point + 1; } -- cgit v1.2.3