Fix liquids refusing to flow in X+ or Z+ in some cases (#9874)

Applies when a different:
- falling liquid is neighboring
- liquid is below
This commit is contained in:
sfan5 2020-05-27 00:17:23 +02:00 committed by GitHub
parent ba553e22e4
commit 58f523e363
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 21 additions and 8 deletions

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