Skip to content

Commit

Permalink
Liquids: Preserve flow state if 'ignore' is a neighbour
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
MillersMan authored and paramat committed Dec 7, 2016
1 parent 2829742 commit cc36f5e
Showing 1 changed file with 15 additions and 4 deletions.
19 changes: 15 additions & 4 deletions src/map.cpp
Expand Up @@ -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
int num_neutrals = 0;
bool flowing_down = false;
bool ignored_sources = false;
for (u16 i = 0; i < 6; i++) {
NeighborType nt = NEIGHBOR_SAME_LEVEL;
switch (i) {
Expand Down Expand Up @@ -1336,10 +1337,15 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> &modified_blocks)
flowing_down = true;
} else {
neutrals[num_neutrals++] = nb;
// If neutral below is ignore prevent water spreading outwards
if (nb.t == NEIGHBOR_LOWER &&
nb.n.getContent() == CONTENT_IGNORE)
flowing_down = true;
if (nb.n.getContent() == CONTENT_IGNORE) {
// If node below is ignore prevent water from
// spreading outwards and otherwise prevent from
// flowing away as ignore node might be the source
if (nb.t == NEIGHBOR_LOWER)
flowing_down = true;
else
ignored_sources = true;
}
}
break;
case LIQUID_SOURCE:
Expand Down Expand Up @@ -1392,6 +1398,11 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> &modified_blocks)
new_node_content = liquid_kind;
else
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 {
// no surrounding sources, so get the maximum level that can flow into this node
for (u16 i = 0; i < num_flows; i++) {
Expand Down

0 comments on commit cc36f5e

Please sign in to comment.