summaryrefslogtreecommitdiff
path: root/src/mapgen/cavegen.cpp
diff options
context:
space:
mode:
authorParamat <paramat@users.noreply.github.com>2018-04-05 17:21:41 +0100
committerGitHub <noreply@github.com>2018-04-05 17:21:41 +0100
commit32d456bd2d4dda50f77c01c702d1b5a5ff26134b (patch)
tree5f70367cacdc3901d3a9746563aad5ed3b3054c4 /src/mapgen/cavegen.cpp
parent077f231111082272359a916c3e41049aaf699151 (diff)
downloadminetest-32d456bd2d4dda50f77c01c702d1b5a5ff26134b.tar.gz
minetest-32d456bd2d4dda50f77c01c702d1b5a5ff26134b.tar.bz2
minetest-32d456bd2d4dda50f77c01c702d1b5a5ff26134b.zip
Biome API / cavegen: Add definable cave liquid for a biome (#7192)
Add 'node_cave_liquid' as a new field in biome registration. If field is absent cave liquids fall back to classic behaviour.
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);