Fix liquids refusing to flow in X+ or Z+ in some cases (#9874)
authorsfan5 <sfan5@live.de>
Tue, 26 May 2020 22:17:23 +0000 (00:17 +0200)
committerGitHub <noreply@github.com>
Tue, 26 May 2020 22:17:23 +0000 (23:17 +0100)
Applies when a different:
- falling liquid is neighboring
- liquid is below

src/map.cpp

index 677cbc869a785f8d381a663aeff5d16d86196ef9..7c776b0709e85874b471238abcbf46f8ff3dac26 100644 (file)
@@ -478,6 +478,16 @@ void Map::PrintInfo(std::ostream &out)
 
 #define WATER_DROP_BOOST 4
 
+const static v3s16 liquid_6dirs[6] = {
+       // order: upper before same level before lower
+       v3s16( 0, 1, 0),
+       v3s16( 0, 0, 1),
+       v3s16( 1, 0, 0),
+       v3s16( 0, 0,-1),
+       v3s16(-1, 0, 0),
+       v3s16( 0,-1, 0)
+};
+
 enum NeighborType : u8 {
        NEIGHBOR_UPPER,
        NEIGHBOR_SAME_LEVEL,
@@ -587,7 +597,6 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> &modified_blocks,
                /*
                        Collect information about the environment
                 */
-               const v3s16 *dirs = g_6dirs;
                NodeNeighbor sources[6]; // surrounding sources
                int num_sources = 0;
                NodeNeighbor flows[6]; // surrounding flowing liquid nodes
@@ -601,16 +610,16 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> &modified_blocks,
                for (u16 i = 0; i < 6; i++) {
                        NeighborType nt = NEIGHBOR_SAME_LEVEL;
                        switch (i) {
-                               case 1:
+                               case 0:
                                        nt = NEIGHBOR_UPPER;
                                        break;
-                               case 4:
+                               case 5:
                                        nt = NEIGHBOR_LOWER;
                                        break;
                                default:
                                        break;
                        }
-                       v3s16 npos = p0 + dirs[i];
+                       v3s16 npos = p0 + liquid_6dirs[i];
                        NodeNeighbor nb(getNode(npos), nt, npos);
                        const ContentFeatures &cfnb = m_nodedef->get(nb.n);
                        switch (m_nodedef->get(nb.n.getContent()).liquid_type) {
@@ -646,14 +655,18 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> &modified_blocks,
                                                neutrals[num_neutrals++] = nb;
                                        } else {
                                                // Do not count bottom source, it will screw things up
-                                               if(dirs[i].Y != -1)
+                                               if(nt != NEIGHBOR_LOWER)
                                                        sources[num_sources++] = nb;
                                        }
                                        break;
                                case LIQUID_FLOWING:
-                                       // if this node is not (yet) of a liquid type, choose the first liquid type we encounter
-                                       if (liquid_kind == CONTENT_AIR)
-                                               liquid_kind = cfnb.liquid_alternative_flowing_id;
+                                       if (nb.t != NEIGHBOR_SAME_LEVEL ||
+                                               (nb.n.param2 & LIQUID_FLOW_DOWN_MASK) != LIQUID_FLOW_DOWN_MASK) {
+                                               // if this node is not (yet) of a liquid type, choose the first liquid type we encounter
+                                               // but exclude falling liquids on the same level, they cannot flow here anyway
+                                               if (liquid_kind == CONTENT_AIR)
+                                                       liquid_kind = cfnb.liquid_alternative_flowing_id;
+                                       }
                                        if (cfnb.liquid_alternative_flowing_id != liquid_kind) {
                                                neutrals[num_neutrals++] = nb;
                                        } else {