Skip to content

Commit 979ca23

Browse files
author
kwolekr
committedFeb 26, 2013
Merge pull request #482 from proller/liquid
finite liquid
2 parents 9b5f182 + b90e431 commit 979ca23

File tree

10 files changed

+384
-8
lines changed

10 files changed

+384
-8
lines changed
 

‎games/minimal/mods/default/mapgen.lua

+8-2
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ minetest.register_alias("mapgen_mese", "default:mese")
2727
-- Ore generation
2828
--
2929

30-
local function generate_ore(name, wherein, minp, maxp, seed, chunks_per_volume, ore_per_chunk, height_min, height_max)
30+
local function generate_ore(name, wherein, minp, maxp, seed, chunks_per_volume, ore_per_chunk, height_min, height_max, param2)
3131
if maxp.y < height_min or minp.y > height_max then
3232
return
3333
end
@@ -57,7 +57,7 @@ local function generate_ore(name, wherein, minp, maxp, seed, chunks_per_volume,
5757
local z2 = z0+z1
5858
local p2 = {x=x2, y=y2, z=z2}
5959
if minetest.env:get_node(p2).name == wherein then
60-
minetest.env:set_node(p2, {name=name})
60+
minetest.env:set_node(p2, {name=name, param2=param2})
6161
end
6262
end
6363
end
@@ -110,5 +110,11 @@ minetest.register_on_generated(function(minp, maxp, seed)
110110
end
111111
end
112112
end
113+
if minetest.setting_get("liquid_finite") then
114+
generate_ore("default:water_source", "default:stone", minp, maxp, seed+42, 1/24/24/24, 4, -100, -10, 128)
115+
generate_ore("default:water_source", "default:stone", minp, maxp, seed+42, 1/28/28/28, 3, -10000, -101, 128)
116+
generate_ore("default:lava_source", "default:stone", minp, maxp, seed+43, 1/38/38/38, 2, -500, -100, 128)
117+
generate_ore("default:lava_source", "default:stone", minp, maxp, seed+43, 1/30/30/30, 4, -31000, -501, 128)
118+
end
113119
end)
114120

‎minetest.conf.example

+8
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,14 @@
9090
#enable_fog = true
9191
# Enable a bit lower water surface; disable for speed (not quite optimized)
9292
#new_style_water = false
93+
# Constant volume liquids
94+
#liquid_finite = false
95+
# Update liquids every .. recommend for finite: 0.2
96+
#liquid_update = 1.0
97+
# When finite liquid: relax flowing blocks to source if level near max and N nearby source blocks, more realistic, but not true constant. values: 0,1,2,3,4 : 0 - disable, 1 - most aggresive
98+
#liquid_relax = 1
99+
# optimization: faster cave flood (and not true constant)
100+
#liquid_fast_flood = 1
93101
# Enable nice leaves; disable for speed
94102
#new_style_leaves = true
95103
# Enable smooth lighting with simple ambient occlusion;

‎src/content_abm.cpp

+34-2
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
2626
#include "settings.h"
2727
#include "mapblock.h" // For getNodeBlockPos
2828
#include "treegen.h" // For treegen::make_tree
29+
#include "main.h" // for g_settings
2930
#include "map.h"
3031

3132
#define PP(x) "("<<(x).X<<","<<(x).Y<<","<<(x).Z<<")"
@@ -146,11 +147,42 @@ class MakeTreesFromSaplingsABM : public ActiveBlockModifier
146147
}
147148
};
148149

150+
class LiquidFlowABM : public ActiveBlockModifier
151+
{
152+
private:
153+
std::set<std::string> contents;
154+
155+
public:
156+
LiquidFlowABM(ServerEnvironment *env, INodeDefManager *nodemgr)
157+
{
158+
std::set<content_t> liquids;
159+
nodemgr->getIds("group:liquid", liquids);
160+
for(std::set<content_t>::const_iterator k = liquids.begin(); k != liquids.end(); k++)
161+
contents.insert(nodemgr->get(*k).liquid_alternative_flowing);
162+
163+
}
164+
virtual std::set<std::string> getTriggerContents()
165+
{
166+
return contents;
167+
}
168+
virtual float getTriggerInterval()
169+
{ return 10.0; }
170+
virtual u32 getTriggerChance()
171+
{ return 10; }
172+
virtual void trigger(ServerEnvironment *env, v3s16 p, MapNode n)
173+
{
174+
ServerMap *map = &env->getServerMap();
175+
if (map->transforming_liquid_size() < 500)
176+
map->transforming_liquid_add(p);
177+
//if ((*map).m_transforming_liquid.size() < 500) (*map).m_transforming_liquid.push_back(p);
178+
}
179+
};
180+
149181
void add_legacy_abms(ServerEnvironment *env, INodeDefManager *nodedef)
150182
{
151183
env->addActiveBlockModifier(new GrowGrassABM());
152184
env->addActiveBlockModifier(new RemoveGrassABM());
153185
env->addActiveBlockModifier(new MakeTreesFromSaplingsABM());
186+
if (g_settings->getBool("liquid_finite"))
187+
env->addActiveBlockModifier(new LiquidFlowABM(env, nodedef));
154188
}
155-
156-

‎src/content_mapblock.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,7 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
261261
level = (-0.5+node_liquid_level) * BS;
262262
else if(n2.getContent() == c_flowing)
263263
level = (-0.5 + ((float)(n2.param2&LIQUID_LEVEL_MASK)
264-
+ 0.5) / 8.0 * node_liquid_level) * BS;
264+
+ 0.5) / (float)LIQUID_LEVEL_SOURCE * node_liquid_level) * BS;
265265

266266
// Check node above neighbor.
267267
// NOTE: This doesn't get executed if neighbor
@@ -324,7 +324,7 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
324324
}
325325
}
326326
if(air_count >= 2)
327-
cornerlevel = -0.5*BS;
327+
cornerlevel = -0.5*BS+0.1;
328328
else if(valid_count > 0)
329329
cornerlevel /= valid_count;
330330
corner_levels[i] = cornerlevel;

‎src/defaultsettings.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,11 @@ void set_default_settings(Settings *settings)
206206
//mapgen related things
207207
settings->setDefault("mg_name", "v6");
208208
settings->setDefault("water_level", "1");
209+
settings->setDefault("liquid_finite", "false");
210+
settings->setDefault("liquid_update", "1.0");
211+
settings->setDefault("liquid_relax", "1");
212+
settings->setDefault("liquid_fast_flood", "1");
213+
209214
settings->setDefault("chunksize", "5");
210215
settings->setDefault("mg_flags", "trees, caves, v6_biome_blend");
211216
settings->setDefault("mgv6_freq_desert", "0.45");

0 commit comments

Comments
 (0)
Please sign in to comment.