Caverns: Remove unnecessary liquid excavation

Also disable CavesRandomWalk at a safer distance from caverns.

Excavating liquids in cavern code is unnecessary as in practice we are already
successfully disabling the generation of liquid caves that could intersect
with caverns and cause excessive amounts of spreading liquids in caverns.

However to be safer this commit now disables liquid caves at a larger distance
from caverns, to compensate for liquid caves being able to generate up to a
mapblock beyond a mapchunk border.

Not excavating liquids in cavern code also allows a feature i am working on in
experimental new core mapgens, but also allows for more flexibility in future.
This commit is contained in:
paramat 2017-05-11 03:39:43 +01:00
parent 582ee15d8e
commit fd32005b0f
3 changed files with 20 additions and 18 deletions

@ -160,9 +160,9 @@ CavernsNoise::CavernsNoise(
{ {
assert(nodedef); assert(nodedef);
m_ndef = nodedef; m_ndef = nodedef;
m_csize = chunksize; m_csize = chunksize;
m_cavern_limit = cavern_limit; m_cavern_limit = cavern_limit;
m_cavern_taper = cavern_taper; m_cavern_taper = cavern_taper;
m_cavern_threshold = cavern_threshold; m_cavern_threshold = cavern_threshold;
@ -207,7 +207,7 @@ bool CavernsNoise::generateCaverns(MMVManip *vm, v3s16 nmin, v3s16 nmax)
} }
//// Place nodes //// Place nodes
bool has_cavern = false; bool near_cavern = false;
v3s16 em = vm->m_area.getExtent(); v3s16 em = vm->m_area.getExtent();
u32 index2d = 0; u32 index2d = 0;
@ -229,20 +229,22 @@ bool CavernsNoise::generateCaverns(MMVManip *vm, v3s16 nmin, v3s16 nmax)
vm->m_area.add_y(em, vi, -1), vm->m_area.add_y(em, vi, -1),
cavern_amp_index++) { cavern_amp_index++) {
content_t c = vm->m_data[vi].getContent(); content_t c = vm->m_data[vi].getContent();
float nabs_cavern = fabs(noise_cavern->result[index3d]); float n_absamp_cavern = fabs(noise_cavern->result[index3d]) *
// Caverns generate first but still remove lava and water in case cavern_amp[cavern_amp_index];
// of overgenerated classic caves. // Disable CavesRandomWalk at a safe distance from caverns
if (nabs_cavern * cavern_amp[cavern_amp_index] > m_cavern_threshold && // to avoid excessively spreading liquids in caverns.
(m_ndef->get(c).is_ground_content || if (n_absamp_cavern > m_cavern_threshold - 0.1f) {
c == c_lava_source || c == c_water_source)) { near_cavern = true;
vm->m_data[vi] = MapNode(CONTENT_AIR); if (n_absamp_cavern > m_cavern_threshold &&
has_cavern = true; m_ndef->get(c).is_ground_content)
vm->m_data[vi] = MapNode(CONTENT_AIR);
} }
} }
} }
delete[] cavern_amp; delete[] cavern_amp;
return has_cavern;
return near_cavern;
} }

@ -204,12 +204,12 @@ void MapgenV5::makeChunk(BlockMakeData *data)
// Generate caverns, tunnels and classic caves // Generate caverns, tunnels and classic caves
if (flags & MG_CAVES) { if (flags & MG_CAVES) {
bool has_cavern = false; bool near_cavern = false;
// Generate caverns // Generate caverns
if (spflags & MGV5_CAVERNS) if (spflags & MGV5_CAVERNS)
has_cavern = generateCaverns(stone_surface_max_y); near_cavern = generateCaverns(stone_surface_max_y);
// Generate tunnels and classic caves // Generate tunnels and classic caves
if (has_cavern) if (near_cavern)
// Disable classic caves in this mapchunk by setting // Disable classic caves in this mapchunk by setting
// 'large cave depth' to world base. Avoids excessive liquid in // 'large cave depth' to world base. Avoids excessive liquid in
// large caverns and floating blobs of overgenerated liquid. // large caverns and floating blobs of overgenerated liquid.

@ -292,12 +292,12 @@ void MapgenV7::makeChunk(BlockMakeData *data)
// Generate caverns, tunnels and classic caves // Generate caverns, tunnels and classic caves
if (flags & MG_CAVES) { if (flags & MG_CAVES) {
bool has_cavern = false; bool near_cavern = false;
// Generate caverns // Generate caverns
if (spflags & MGV7_CAVERNS) if (spflags & MGV7_CAVERNS)
has_cavern = generateCaverns(stone_surface_max_y); near_cavern = generateCaverns(stone_surface_max_y);
// Generate tunnels and classic caves // Generate tunnels and classic caves
if (has_cavern) if (near_cavern)
// Disable classic caves in this mapchunk by setting // Disable classic caves in this mapchunk by setting
// 'large cave depth' to world base. Avoids excessive liquid in // 'large cave depth' to world base. Avoids excessive liquid in
// large caverns and floating blobs of overgenerated liquid. // large caverns and floating blobs of overgenerated liquid.