diff options
author | Treer <treer.git+github@the-bordello.com> | 2018-10-03 09:50:21 +1000 |
---|---|---|
committer | Paramat <paramat@users.noreply.github.com> | 2018-10-03 00:50:21 +0100 |
commit | 84a5fa01fff2b81fae12411c31502a49f152ed1d (patch) | |
tree | c4345b8f1fd967ce1e559651d12924af0554819f /src/mapgen | |
parent | dc948382f57c34a7da358bba85c04513877fe2c3 (diff) | |
download | minetest-84a5fa01fff2b81fae12411c31502a49f152ed1d.tar.gz minetest-84a5fa01fff2b81fae12411c31502a49f152ed1d.tar.bz2 minetest-84a5fa01fff2b81fae12411c31502a49f152ed1d.zip |
Fix Mapgen Valleys getSpawnLevelAtPoint() (#7756)
Diffstat (limited to 'src/mapgen')
-rw-r--r-- | src/mapgen/mapgen_valleys.cpp | 26 |
1 files 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; } |