Biome API / cavegen: Add definable cave liquid for a biome (#7192)
authorParamat <paramat@users.noreply.github.com>
Thu, 5 Apr 2018 16:21:41 +0000 (17:21 +0100)
committerGitHub <noreply@github.com>
Thu, 5 Apr 2018 16:21:41 +0000 (17:21 +0100)
Add 'node_cave_liquid' as a new field in biome registration.
If field is absent cave liquids fall back to classic behaviour.

doc/lua_api.txt
src/mapgen/cavegen.cpp
src/mapgen/cavegen.h
src/mapgen/mapgen.cpp
src/mapgen/mapgen_valleys.cpp
src/mapgen/mg_biome.cpp
src/mapgen/mg_biome.h
src/script/lua_api/l_mapgen.cpp

index 0c995b54eeea48876456c70af618ded62cf9c0d9..ea8e8b254647a96e3345e6abf80087bcffbe0305 100644 (file)
@@ -5662,6 +5662,10 @@ Definition tables
         node_riverbed = "default:gravel",
         depth_riverbed = 2,
     --  ^ Node placed under river water and thickness of this layer.
+        node_cave_liquid = "default:water_source",
+    --  ^ Nodes placed as a blob of liquid in 50% of large caves.
+    --  ^ If absent, cave liquids fall back to classic behaviour of lava or
+    --  ^ water distributed according to a hardcoded 3D noise.
         y_max = 31000,
         y_min = 1,
     --  ^ Upper and lower limits for biome.
index 6f571ba1fced1933cbc40bbda560db858ce27cc3..a54d5139df5fd82aed0214fb7adff4924d431a25 100644 (file)
@@ -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);
index 871ef3bcfaa77faf4146f68748e353bac8e553de..ff2923dc4582c4cab1a165f83d8abe880de1a29f 100644 (file)
@@ -114,6 +114,7 @@ public:
        const NodeDefManager *ndef;
        GenerateNotifier *gennotify;
        s16 *heightmap;
+       BiomeGen *bmgn;
 
        // configurable parameters
        s32 seed;
@@ -153,10 +154,11 @@ public:
 
        // ndef is a mandatory parameter.
        // If gennotify is NULL, generation events are not logged.
+       // If biomegen is NULL, cave liquids have classic behaviour.
        CavesRandomWalk(const NodeDefManager *ndef, GenerateNotifier *gennotify =
                NULL, s32 seed = 0, int water_level = 1, content_t water_source =
                CONTENT_IGNORE, content_t lava_source = CONTENT_IGNORE,
-               int lava_depth = -256);
+               int lava_depth = -256, BiomeGen *biomegen = NULL);
 
        // vm and ps are mandatory parameters.
        // If heightmap is NULL, the surface level at all points is assumed to
index 078d6c486df4a1f9b1280de87e96af2c8e67774b..67dbee3f5414d9c03c0dccf41426f6be7be1a851 100644 (file)
@@ -858,9 +858,10 @@ void MapgenBasic::generateCaves(s16 max_stone_y, s16 large_cave_depth)
        u32 bruises_count = ps.range(0, 2);
        for (u32 i = 0; i < bruises_count; i++) {
                CavesRandomWalk cave(ndef, &gennotify, seed, water_level,
-                       c_water_source, CONTENT_IGNORE, lava_depth);
+                       c_water_source, c_lava_source, lava_depth, biomegen);
 
-               cave.makeCave(vm, node_min, node_max, &ps, true, max_stone_y, heightmap);
+               cave.makeCave(vm, node_min, node_max, &ps, true, max_stone_y,
+                       heightmap);
        }
 }
 
index bef4629a8019a40c39b5abae1d33946de91cc1db..f4c3c7b79a0513173f5b9c56dff6ceee1098bc91 100644 (file)
@@ -744,9 +744,10 @@ void MapgenValleys::generateCaves(s16 max_stone_y, s16 large_cave_depth)
                u32 bruises_count = ps.range(0, 2);
                for (u32 i = 0; i < bruises_count; i++) {
                        CavesRandomWalk cave(ndef, &gennotify, seed, water_level,
-                               c_water_source, c_lava_source, lava_max_height);
+                               c_water_source, c_lava_source, lava_max_height, biomegen);
 
-                       cave.makeCave(vm, node_min, node_max, &ps, true, max_stone_y, heightmap);
+                       cave.makeCave(vm, node_min, node_max, &ps, true, max_stone_y,
+                               heightmap);
                }
        }
 }
index 7f091f31380170417ca0a9d0e10a25ad03d51591..584dea9c4580fa1402bfb55adaa899d1a90306a8 100644 (file)
@@ -62,6 +62,7 @@ BiomeManager::BiomeManager(Server *server) :
        b->m_nodenames.emplace_back("mapgen_river_water_source");
        b->m_nodenames.emplace_back("mapgen_stone");
        b->m_nodenames.emplace_back("ignore");
+       b->m_nodenames.emplace_back("ignore");
        m_ndef->pendNodeResolve(b);
 
        add(b);
@@ -321,4 +322,5 @@ void Biome::resolveNodeNames()
        getIdFromNrBacklog(&c_river_water, "mapgen_river_water_source", CONTENT_AIR);
        getIdFromNrBacklog(&c_riverbed,    "mapgen_stone",              CONTENT_AIR);
        getIdFromNrBacklog(&c_dust,        "ignore",                    CONTENT_IGNORE);
+       getIdFromNrBacklog(&c_cave_liquid, "ignore",                    CONTENT_IGNORE);
 }
index 086cf56fe9313bb5452622f5f3e6afa0f8ce98eb..27b6ebf95678cc1fd283d8748cd561713ff8ddce 100644 (file)
@@ -52,6 +52,7 @@ public:
        content_t c_river_water;
        content_t c_riverbed;
        content_t c_dust;
+       content_t c_cave_liquid;
 
        s16 depth_top;
        s16 depth_filler;
index d7bb96086800b13c0144b0deb33d64898a7d230f..03a2b3eea8a3445220b7c71f5276512d146e68b8 100644 (file)
@@ -389,9 +389,11 @@ Biome *read_biome_def(lua_State *L, int index, const NodeDefManager *ndef)
        b->vertical_blend  = getintfield_default(L,    index, "vertical_blend",  0);
        b->flags           = 0; // reserved
 
-       b->min_pos = getv3s16field_default(L, index, "min_pos", v3s16(-31000, -31000, -31000));
+       b->min_pos = getv3s16field_default(
+               L, index, "min_pos", v3s16(-31000, -31000, -31000));
        getintfield(L, index, "y_min", b->min_pos.Y);
-       b->max_pos = getv3s16field_default(L, index, "max_pos", v3s16(31000, 31000, 31000));
+       b->max_pos = getv3s16field_default(
+               L, index, "max_pos", v3s16(31000, 31000, 31000));
        getintfield(L, index, "y_max", b->max_pos.Y);
 
        std::vector<std::string> &nn = b->m_nodenames;
@@ -403,6 +405,7 @@ Biome *read_biome_def(lua_State *L, int index, const NodeDefManager *ndef)
        nn.push_back(getstringfield_default(L, index, "node_river_water", ""));
        nn.push_back(getstringfield_default(L, index, "node_riverbed",    ""));
        nn.push_back(getstringfield_default(L, index, "node_dust",        ""));
+       nn.push_back(getstringfield_default(L, index, "node_cave_liquid", ""));
        ndef->pendNodeResolve(b);
 
        return b;