Fix liquid_range
authorPilzAdam <pilzadam@minetest.net>
Mon, 9 Sep 2013 13:32:55 +0000 (15:32 +0200)
committerPilzAdam <pilzadam@minetest.net>
Sat, 2 Nov 2013 14:47:44 +0000 (15:47 +0100)
* Prevent graphical glitches on old servers
* Fix flowing of liquids with viscosity != 1 and range != 8
* Fix range = 0, no flowing nodes will appear

src/content_mapblock.cpp
src/map.cpp

index 3cded5bdb1119bae135df357723cfdbd50dda98a..cda1846a8f3b7626acb8bb89ca171eb15c4f2e35 100644 (file)
@@ -395,7 +395,7 @@ 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);
+                       u8 range = rangelim(nodedef->get(c_flowing).liquid_range, 1, 8);
 
                        // Neighbor liquid levels (key = relative position)
                        // Includes current node
@@ -429,7 +429,11 @@ 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){
-                                               u8 liquid_level = (n2.param2&LIQUID_LEVEL_MASK) - (LIQUID_LEVEL_MAX+1-range);
+                                               u8 liquid_level = (n2.param2&LIQUID_LEVEL_MASK);
+                                               if (liquid_level <= LIQUID_LEVEL_MAX+1-range)
+                                                       liquid_level = 0;
+                                               else
+                                                       liquid_level -= (LIQUID_LEVEL_MAX+1-range);
                                                level = (-0.5 + ((float)liquid_level+ 0.5) / (float)range * node_liquid_level) * BS;
                                        }
 
index e8115d39b8481e4c548f0709c65df975b80cee03..968897c0c53be88bdf02982b33f49b14d96ebf9f 100644 (file)
@@ -2136,6 +2136,7 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> & modified_blocks)
                content_t new_node_content;
                s8 new_node_level = -1;
                s8 max_node_level = -1;
+               u8 range = rangelim(nodemgr->get(liquid_kind).liquid_range, 0, LIQUID_LEVEL_MAX+1);
                if ((num_sources >= 2 && nodemgr->get(liquid_kind).liquid_renewable) || liquid_type == LIQUID_SOURCE) {
                        // liquid_kind will be set to either the flowing alternative of the node (if it's a liquid)
                        // or the flowing alternative of the first of the surrounding sources (if it's air), so
@@ -2145,6 +2146,8 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> & modified_blocks)
                        // liquid_kind is set properly, see above
                        new_node_content = liquid_kind;
                        max_node_level = new_node_level = LIQUID_LEVEL_MAX;
+                       if (new_node_level < (LIQUID_LEVEL_MAX+1-range))
+                               new_node_content = CONTENT_AIR;
                } else {
                        // no surrounding sources, so get the maximum level that can flow into this node
                        for (u16 i = 0; i < num_flows; i++) {
@@ -2185,8 +2188,7 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> & modified_blocks)
                        } else
                                new_node_level = max_node_level;
 
-                       u8 range = rangelim(nodemgr->get(liquid_kind).liquid_range, 0, LIQUID_LEVEL_MAX+1);
-                       if (new_node_level >= (LIQUID_LEVEL_MAX+1-range))
+                       if (max_node_level >= (LIQUID_LEVEL_MAX+1-range))
                                new_node_content = liquid_kind;
                        else
                                new_node_content = CONTENT_AIR;