Improve finite liquid distribution, fix small bug
authorproller <proller@github.com>
Thu, 4 Jul 2013 18:30:25 +0000 (22:30 +0400)
committerproller <proller@github.com>
Thu, 4 Jul 2013 20:11:11 +0000 (00:11 +0400)
src/map.cpp

index 272bc9322a99278f675b9ff84be9966a37c85fa7..f128aff6c99d863f57069cf06d97ec4daa67d906 100644 (file)
@@ -1653,6 +1653,8 @@ void Map::transformLiquidsFinite(std::map<v3s16, MapBlock*> & modified_blocks)
 
        u16 loop_max = g_settings->getU16("liquid_loop_max");
 
+       //if (m_transforming_liquid.size() > 0) errorstream << "Liquid queue size="<<m_transforming_liquid.size()<<std::endl;
+
        while (m_transforming_liquid.size() > 0)
        {
                // This should be done here so that it is done when continue is used
@@ -1771,7 +1773,7 @@ void Map::transformLiquidsFinite(std::map<v3s16, MapBlock*> & modified_blocks)
                }
 
                // prevent lakes in air above unloaded blocks
-               if (liquid_levels[D_TOP] == 0 && (p0.Y > water_level || !fast_flood) && neighbors[D_BOTTOM].n.getContent() == CONTENT_IGNORE) {
+               if (liquid_levels[D_TOP] == 0 && (p0.Y > water_level) && neighbors[D_BOTTOM].n.getContent() == CONTENT_IGNORE && !(loopcount % 3)) {
                        --total_level;
                }
 
@@ -1794,11 +1796,16 @@ void Map::transformLiquidsFinite(std::map<v3s16, MapBlock*> & modified_blocks)
                        if (!neighbors[ii].l)
                                continue;
                        liquid_levels_want[ii] = want_level;
-                       if (liquid_levels_want[ii] < LIQUID_LEVEL_SOURCE && total_level > 0
-                               && liquid_levels[ii] > liquid_levels_want[ii]
-                               ) {
-                               ++liquid_levels_want[ii];
-                               --total_level;
+                       if (liquid_levels_want[ii] < LIQUID_LEVEL_SOURCE && total_level > 0) {
+                               if (loopcount % 3 || liquid_levels[ii] <= 0){
+                                       if (liquid_levels[ii] > liquid_levels_want[ii]) {
+                                               ++liquid_levels_want[ii];
+                                               --total_level;
+                                       }
+                               } else if (neighbors[ii].l > 0){
+                                               ++liquid_levels_want[ii];
+                                               --total_level;
+                               }
                        }
                }