Add liquid_range to nodedef
authorPilzAdam <pilzadam@minetest.net>
Tue, 16 Jul 2013 14:28:18 +0000 (16:28 +0200)
committerRealBadAngel <mk@realbadangel.pl>
Sat, 20 Jul 2013 18:41:17 +0000 (20:41 +0200)
doc/lua_api.txt
src/content_mapblock.cpp
src/map.cpp
src/nodedef.cpp
src/nodedef.h
src/script/common/c_content.cpp

index 891a807c524c5e02916e7632b7f55648085ff0a9..1e6d3ffc6884e58c497b16e0a9dd267f25a5a3a9 100644 (file)
@@ -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
index bc17e19aa07754d49f55a1ed4288ec62efede909..d2509ad5ab2849574796fa39fb65b811b6519b97 100644 (file)
@@ -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
index e458f3376b5f44fccfa6daabe146658b12521a4d..11f5d6483092002c4f2c2a6cb50f625a412eb361 100644 (file)
@@ -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;
index b264151684a471e1357807951b28d618d6a63dd8..b1ce7bbc8435b2caa1597ba3b25ba4a4ac2b8d39 100644 (file)
@@ -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) {};
 }
 
index e9ac2472702f6bff20773e98b985f7a7a897f295..3a8210304ec4a92d79bc65a47665da95377ce50a 100644 (file)
@@ -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;
index 7b80cc5ee9086c0a9c87a14002bd6ab5fa7dfd45..7d18454fd724b681f9fa2fffaae9ac0ee8bbe350 100644 (file)
@@ -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);