Fix Mapgen Valleys getSpawnLevelAtPoint() (#7756)

master
Treer 2018-10-03 09:50:21 +10:00 committed by Paramat
parent dc948382f5
commit 84a5fa01ff
1 changed files with 17 additions and 7 deletions

View File

@ -393,18 +393,27 @@ float MapgenValleys::terrainLevelFromNoise(TerrainNoise *tn)
float MapgenValleys::adjustedTerrainLevelFromNoise(TerrainNoise *tn) float MapgenValleys::adjustedTerrainLevelFromNoise(TerrainNoise *tn)
{ {
float mount = terrainLevelFromNoise(tn); float mount = terrainLevelFromNoise(tn);
float result = mount;
s16 y_start = myround(mount); s16 y_start = myround(mount);
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 y = y_start; y <= y_start + 1000; y++) { for (s16 i = 1; i <= 1000; i++) {
float fill = s16 y = y_start + i * search_direction;
fill =
NoisePerlin3D(&noise_inter_valley_fill->np, tn->x, y, tn->z, seed); 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; break;
}
} }
return mount; return result;
} }
@ -420,7 +429,8 @@ int MapgenValleys::getSpawnLevelAtPoint(v2s16 p)
level_at_point > water_level + 16) level_at_point > water_level + 16)
return MAX_MAP_GENERATION_LIMIT; // Unsuitable spawn point 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;
} }