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 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 & 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);