aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/lua_api.txt1
-rw-r--r--src/content_mapblock.cpp9
-rw-r--r--src/map.cpp3
-rw-r--r--src/nodedef.cpp3
-rw-r--r--src/nodedef.h2
-rw-r--r--src/script/common/c_content.cpp2
6 files changed, 16 insertions, 4 deletions
diff --git a/doc/lua_api.txt b/doc/lua_api.txt
index 891a807c5..1e6d3ffc6 100644
--- a/doc/lua_api.txt
+++ b/doc/lua_api.txt
@@ -1947,6 +1947,7 @@ Node definition (register_node)
liquid_alternative_source = "", -- Source version of flowing liquid
liquid_viscosity = 0, -- Higher viscosity = slower flow (max. 7)
liquid_renewable = true, -- Can new liquid source be created by placing
+ liquid_range = 8, -- number of flowing nodes arround source (max. 8)
drowning = true, -- Player will drown in these
two or more sources nearly?
light_source = 0, -- Amount of light emitted by node
diff --git a/src/content_mapblock.cpp b/src/content_mapblock.cpp
index bc17e19aa..d2509ad5a 100644
--- a/src/content_mapblock.cpp
+++ b/src/content_mapblock.cpp
@@ -395,6 +395,8 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
l = getInteriorLight(n, 0, data);
video::SColor c = MapBlock_LightColor(f.alpha, l, decode_light(f.light_source));
+ u8 range = rangelim(nodedef->get(c_flowing).liquid_range, 0, 8);
+
// Neighbor liquid levels (key = relative position)
// Includes current node
std::map<v3s16, f32> neighbor_levels;
@@ -426,9 +428,10 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
if(n2.getContent() == c_source)
level = (-0.5+node_liquid_level) * BS;
- else if(n2.getContent() == c_flowing)
- level = (-0.5 + ((float)(n2.param2&LIQUID_LEVEL_MASK)
- + 0.5) / (float)LIQUID_LEVEL_SOURCE * node_liquid_level) * BS;
+ else if(n2.getContent() == c_flowing){
+ u8 liquid_level = (n2.param2&LIQUID_LEVEL_MASK) - (LIQUID_LEVEL_MAX+1-range);
+ level = (-0.5 + ((float)liquid_level+ 0.5) / (float)range * node_liquid_level) * BS;
+ }
// Check node above neighbor.
// NOTE: This doesn't get executed if neighbor
diff --git a/src/map.cpp b/src/map.cpp
index e458f3376..11f5d6483 100644
--- a/src/map.cpp
+++ b/src/map.cpp
@@ -2166,7 +2166,8 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> & modified_blocks)
} else
new_node_level = max_node_level;
- if (new_node_level >= 0)
+ u8 range = rangelim(nodemgr->get(liquid_kind).liquid_range, 0, LIQUID_LEVEL_MAX+1);
+ if (new_node_level >= (LIQUID_LEVEL_MAX+1-range))
new_node_content = liquid_kind;
else
new_node_content = CONTENT_AIR;
diff --git a/src/nodedef.cpp b/src/nodedef.cpp
index b26415168..b1ce7bbc8 100644
--- a/src/nodedef.cpp
+++ b/src/nodedef.cpp
@@ -213,6 +213,7 @@ void ContentFeatures::reset()
liquid_alternative_source = "";
liquid_viscosity = 0;
liquid_renewable = true;
+ liquid_range = LIQUID_LEVEL_MAX+1;
drowning = true;
light_source = 0;
damage_per_second = 0;
@@ -284,6 +285,7 @@ void ContentFeatures::serialize(std::ostream &os, u16 protocol_version)
// the protocol version
writeU8(os, drowning);
writeU8(os, leveled);
+ writeU8(os, liquid_range);
}
void ContentFeatures::deSerialize(std::istream &is)
@@ -350,6 +352,7 @@ void ContentFeatures::deSerialize(std::istream &is)
// otherwise changes the protocol version
drowning = readU8(is);
leveled = readU8(is);
+ liquid_range = readU8(is);
}catch(SerializationError &e) {};
}
diff --git a/src/nodedef.h b/src/nodedef.h
index e9ac24727..3a8210304 100644
--- a/src/nodedef.h
+++ b/src/nodedef.h
@@ -224,6 +224,8 @@ struct ContentFeatures
u8 liquid_viscosity;
// Is liquid renewable (new liquid source will be created between 2 existing)
bool liquid_renewable;
+ // Number of flowing liquids surrounding source
+ u8 liquid_range;
bool drowning;
// Amount of light the node emits
u8 light_source;
diff --git a/src/script/common/c_content.cpp b/src/script/common/c_content.cpp
index 7b80cc5ee..7d18454fd 100644
--- a/src/script/common/c_content.cpp
+++ b/src/script/common/c_content.cpp
@@ -391,6 +391,8 @@ ContentFeatures read_content_features(lua_State *L, int index)
// the slowest possible
f.liquid_viscosity = getintfield_default(L, index,
"liquid_viscosity", f.liquid_viscosity);
+ f.liquid_range = getintfield_default(L, index,
+ "liquid_range", f.liquid_range);
f.leveled = getintfield_default(L, index, "leveled", f.leveled);
getboolfield(L, index, "liquid_renewable", f.liquid_renewable);