forked from Mirrorlandia_minetest/minetest
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:
parent
2829742ae8
commit
cc36f5e99a
19
src/map.cpp
19
src/map.cpp
@ -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++) {
|
||||||
|
Loading…
Reference in New Issue
Block a user