mirror of
https://github.com/minetest/minetest.git
synced 2024-11-23 16:13:46 +01:00
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.
This commit is contained in:
parent
077f231111
commit
32d456bd2d
@ -5662,6 +5662,10 @@ Definition tables
|
|||||||
node_riverbed = "default:gravel",
|
node_riverbed = "default:gravel",
|
||||||
depth_riverbed = 2,
|
depth_riverbed = 2,
|
||||||
-- ^ Node placed under river water and thickness of this layer.
|
-- ^ 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_max = 31000,
|
||||||
y_min = 1,
|
y_min = 1,
|
||||||
-- ^ Upper and lower limits for biome.
|
-- ^ Upper and lower limits for biome.
|
||||||
|
@ -279,7 +279,8 @@ CavesRandomWalk::CavesRandomWalk(
|
|||||||
int water_level,
|
int water_level,
|
||||||
content_t water_source,
|
content_t water_source,
|
||||||
content_t lava_source,
|
content_t lava_source,
|
||||||
int lava_depth)
|
int lava_depth,
|
||||||
|
BiomeGen *biomegen)
|
||||||
{
|
{
|
||||||
assert(ndef);
|
assert(ndef);
|
||||||
|
|
||||||
@ -289,6 +290,7 @@ CavesRandomWalk::CavesRandomWalk(
|
|||||||
this->water_level = water_level;
|
this->water_level = water_level;
|
||||||
this->np_caveliquids = &nparams_caveliquids;
|
this->np_caveliquids = &nparams_caveliquids;
|
||||||
this->lava_depth = lava_depth;
|
this->lava_depth = lava_depth;
|
||||||
|
this->bmgn = biomegen;
|
||||||
|
|
||||||
c_water_source = water_source;
|
c_water_source = water_source;
|
||||||
if (c_water_source == CONTENT_IGNORE)
|
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);
|
v3s16 startp(orp.X, orp.Y, orp.Z);
|
||||||
startp += of;
|
startp += of;
|
||||||
|
|
||||||
float nval = NoisePerlin3D(np_caveliquids, startp.X,
|
// Get biome at 'startp', use 'node_cave_liquid' if stated, otherwise
|
||||||
startp.Y, startp.Z, seed);
|
// fallback to classic behaviour.
|
||||||
MapNode liquidnode = (nval < 0.40f && node_max.Y < lava_depth) ?
|
MapNode liquidnode = CONTENT_IGNORE;
|
||||||
lavanode : waternode;
|
|
||||||
|
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;
|
v3f fp = orp + vec * f;
|
||||||
fp.X += 0.1f * ps->range(-10, 10);
|
fp.X += 0.1f * ps->range(-10, 10);
|
||||||
|
@ -114,6 +114,7 @@ public:
|
|||||||
const NodeDefManager *ndef;
|
const NodeDefManager *ndef;
|
||||||
GenerateNotifier *gennotify;
|
GenerateNotifier *gennotify;
|
||||||
s16 *heightmap;
|
s16 *heightmap;
|
||||||
|
BiomeGen *bmgn;
|
||||||
|
|
||||||
// configurable parameters
|
// configurable parameters
|
||||||
s32 seed;
|
s32 seed;
|
||||||
@ -153,10 +154,11 @@ public:
|
|||||||
|
|
||||||
// ndef is a mandatory parameter.
|
// ndef is a mandatory parameter.
|
||||||
// If gennotify is NULL, generation events are not logged.
|
// If gennotify is NULL, generation events are not logged.
|
||||||
|
// If biomegen is NULL, cave liquids have classic behaviour.
|
||||||
CavesRandomWalk(const NodeDefManager *ndef, GenerateNotifier *gennotify =
|
CavesRandomWalk(const NodeDefManager *ndef, GenerateNotifier *gennotify =
|
||||||
NULL, s32 seed = 0, int water_level = 1, content_t water_source =
|
NULL, s32 seed = 0, int water_level = 1, content_t water_source =
|
||||||
CONTENT_IGNORE, content_t lava_source = CONTENT_IGNORE,
|
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.
|
// vm and ps are mandatory parameters.
|
||||||
// If heightmap is NULL, the surface level at all points is assumed to
|
// If heightmap is NULL, the surface level at all points is assumed to
|
||||||
|
@ -858,9 +858,10 @@ void MapgenBasic::generateCaves(s16 max_stone_y, s16 large_cave_depth)
|
|||||||
u32 bruises_count = ps.range(0, 2);
|
u32 bruises_count = ps.range(0, 2);
|
||||||
for (u32 i = 0; i < bruises_count; i++) {
|
for (u32 i = 0; i < bruises_count; i++) {
|
||||||
CavesRandomWalk cave(ndef, &gennotify, seed, water_level,
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -744,9 +744,10 @@ void MapgenValleys::generateCaves(s16 max_stone_y, s16 large_cave_depth)
|
|||||||
u32 bruises_count = ps.range(0, 2);
|
u32 bruises_count = ps.range(0, 2);
|
||||||
for (u32 i = 0; i < bruises_count; i++) {
|
for (u32 i = 0; i < bruises_count; i++) {
|
||||||
CavesRandomWalk cave(ndef, &gennotify, seed, water_level,
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -62,6 +62,7 @@ BiomeManager::BiomeManager(Server *server) :
|
|||||||
b->m_nodenames.emplace_back("mapgen_river_water_source");
|
b->m_nodenames.emplace_back("mapgen_river_water_source");
|
||||||
b->m_nodenames.emplace_back("mapgen_stone");
|
b->m_nodenames.emplace_back("mapgen_stone");
|
||||||
b->m_nodenames.emplace_back("ignore");
|
b->m_nodenames.emplace_back("ignore");
|
||||||
|
b->m_nodenames.emplace_back("ignore");
|
||||||
m_ndef->pendNodeResolve(b);
|
m_ndef->pendNodeResolve(b);
|
||||||
|
|
||||||
add(b);
|
add(b);
|
||||||
@ -321,4 +322,5 @@ void Biome::resolveNodeNames()
|
|||||||
getIdFromNrBacklog(&c_river_water, "mapgen_river_water_source", CONTENT_AIR);
|
getIdFromNrBacklog(&c_river_water, "mapgen_river_water_source", CONTENT_AIR);
|
||||||
getIdFromNrBacklog(&c_riverbed, "mapgen_stone", CONTENT_AIR);
|
getIdFromNrBacklog(&c_riverbed, "mapgen_stone", CONTENT_AIR);
|
||||||
getIdFromNrBacklog(&c_dust, "ignore", CONTENT_IGNORE);
|
getIdFromNrBacklog(&c_dust, "ignore", CONTENT_IGNORE);
|
||||||
|
getIdFromNrBacklog(&c_cave_liquid, "ignore", CONTENT_IGNORE);
|
||||||
}
|
}
|
||||||
|
@ -52,6 +52,7 @@ public:
|
|||||||
content_t c_river_water;
|
content_t c_river_water;
|
||||||
content_t c_riverbed;
|
content_t c_riverbed;
|
||||||
content_t c_dust;
|
content_t c_dust;
|
||||||
|
content_t c_cave_liquid;
|
||||||
|
|
||||||
s16 depth_top;
|
s16 depth_top;
|
||||||
s16 depth_filler;
|
s16 depth_filler;
|
||||||
|
@ -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->vertical_blend = getintfield_default(L, index, "vertical_blend", 0);
|
||||||
b->flags = 0; // reserved
|
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);
|
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);
|
getintfield(L, index, "y_max", b->max_pos.Y);
|
||||||
|
|
||||||
std::vector<std::string> &nn = b->m_nodenames;
|
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_river_water", ""));
|
||||||
nn.push_back(getstringfield_default(L, index, "node_riverbed", ""));
|
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_dust", ""));
|
||||||
|
nn.push_back(getstringfield_default(L, index, "node_cave_liquid", ""));
|
||||||
ndef->pendNodeResolve(b);
|
ndef->pendNodeResolve(b);
|
||||||
|
|
||||||
return b;
|
return b;
|
||||||
|
Loading…
Reference in New Issue
Block a user