Liquids: Preserve flow state if 'ignore' is a neighbour

Prevent waterfalls from falling down or streams from flowing away when the
source node is in an unloaded block - Nodes near a CONTENT_IGNORE node will
be interpreted as if the ignored node is a liquid node that just supports
the current state of the nodes in question.
This commit is contained in:
MillersMan 2016-11-27 21:46:14 +01:00 committed by paramat
parent 2829742ae8
commit cc36f5e99a

@ -1309,6 +1309,7 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> &modified_blocks)
NodeNeighbor neutrals[6]; // nodes that are solid or another kind of liquid NodeNeighbor neutrals[6]; // nodes that are solid or another kind of liquid
int num_neutrals = 0; int num_neutrals = 0;
bool flowing_down = false; bool flowing_down = false;
bool ignored_sources = false;
for (u16 i = 0; i < 6; i++) { for (u16 i = 0; i < 6; i++) {
NeighborType nt = NEIGHBOR_SAME_LEVEL; NeighborType nt = NEIGHBOR_SAME_LEVEL;
switch (i) { switch (i) {
@ -1336,10 +1337,15 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> &modified_blocks)
flowing_down = true; flowing_down = true;
} else { } else {
neutrals[num_neutrals++] = nb; neutrals[num_neutrals++] = nb;
// If neutral below is ignore prevent water spreading outwards if (nb.n.getContent() == CONTENT_IGNORE) {
if (nb.t == NEIGHBOR_LOWER && // If node below is ignore prevent water from
nb.n.getContent() == CONTENT_IGNORE) // spreading outwards and otherwise prevent from
flowing_down = true; // flowing away as ignore node might be the source
if (nb.t == NEIGHBOR_LOWER)
flowing_down = true;
else
ignored_sources = true;
}
} }
break; break;
case LIQUID_SOURCE: case LIQUID_SOURCE:
@ -1392,6 +1398,11 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> &modified_blocks)
new_node_content = liquid_kind; new_node_content = liquid_kind;
else else
new_node_content = floodable_node; new_node_content = floodable_node;
} else if (ignored_sources && liquid_level >= 0) {
// Maybe there are neighbouring sources that aren't loaded yet
// so prevent flowing away.
new_node_level = liquid_level;
new_node_content = liquid_kind;
} else { } else {
// no surrounding sources, so get the maximum level that can flow into this node // no surrounding sources, so get the maximum level that can flow into this node
for (u16 i = 0; i < num_flows; i++) { for (u16 i = 0; i < num_flows; i++) {