|
@@ -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 { |
|
|