summaryrefslogtreecommitdiff
path: root/src/mapgen/cavegen.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mapgen/cavegen.cpp')
-rw-r--r--src/mapgen/cavegen.cpp24
1 files changed, 19 insertions, 5 deletions
diff --git a/src/mapgen/cavegen.cpp b/src/mapgen/cavegen.cpp
index 6f571ba1f..a54d5139d 100644
--- a/src/mapgen/cavegen.cpp
+++ b/src/mapgen/cavegen.cpp
@@ -279,7 +279,8 @@ CavesRandomWalk::CavesRandomWalk(
int water_level,
content_t water_source,
content_t lava_source,
- int lava_depth)
+ int lava_depth,
+ BiomeGen *biomegen)
{
assert(ndef);
@@ -289,6 +290,7 @@ CavesRandomWalk::CavesRandomWalk(
this->water_level = water_level;
this->np_caveliquids = &nparams_caveliquids;
this->lava_depth = lava_depth;
+ this->bmgn = biomegen;
c_water_source = water_source;
if (c_water_source == CONTENT_IGNORE)
@@ -495,10 +497,22 @@ void CavesRandomWalk::carveRoute(v3f vec, float f, bool randomize_xz)
v3s16 startp(orp.X, orp.Y, orp.Z);
startp += of;
- float nval = NoisePerlin3D(np_caveliquids, startp.X,
- startp.Y, startp.Z, seed);
- MapNode liquidnode = (nval < 0.40f && node_max.Y < lava_depth) ?
- lavanode : waternode;
+ // Get biome at 'startp', use 'node_cave_liquid' if stated, otherwise
+ // fallback to classic behaviour.
+ MapNode liquidnode = CONTENT_IGNORE;
+
+ if (bmgn) {
+ Biome *biome = (Biome *)bmgn->calcBiomeAtPoint(startp);
+ if (biome->c_cave_liquid != CONTENT_IGNORE)
+ liquidnode = biome->c_cave_liquid;
+ }
+
+ if (liquidnode == CONTENT_IGNORE) {
+ float nval = NoisePerlin3D(np_caveliquids, startp.X,
+ startp.Y, startp.Z, seed);
+ liquidnode = (nval < 0.40f && node_max.Y < lava_depth) ?
+ lavanode : waternode;
+ }
v3f fp = orp + vec * f;
fp.X += 0.1f * ps->range(-10, 10);