aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorParamat <paramat@users.noreply.github.com>2017-05-25 11:46:34 +0100
committerLoïc Blot <nerzhul@users.noreply.github.com>2017-05-25 12:46:34 +0200
commit5b338638e0e5743d8acfb48b72e17b671968722f (patch)
tree5a2af7debe37c80924160473cf8a53671e730d6b /src
parent2f291e6685e8d1866184460d547d089b5b3125fd (diff)
downloadminetest-5b338638e0e5743d8acfb48b72e17b671968722f.tar.gz
minetest-5b338638e0e5743d8acfb48b72e17b671968722f.tar.bz2
minetest-5b338638e0e5743d8acfb48b72e17b671968722f.zip
Mgv6 mudflow: Remove decoration if 'dirt with grass' below flows away (#5798)
Mudflow of a neighbouring mapchunk extends into a mapchunk's edge, and could remove 'dirt with grass' from under a decoration, creating unsupported decorations. Remove any decoration above if a 'dirt with grass' node is removed by mudflow.
Diffstat (limited to 'src')
-rw-r--r--src/mapgen_v6.cpp26
1 files changed, 19 insertions, 7 deletions
diff --git a/src/mapgen_v6.cpp b/src/mapgen_v6.cpp
index f3e893f58..ff0d93496 100644
--- a/src/mapgen_v6.cpp
+++ b/src/mapgen_v6.cpp
@@ -836,13 +836,17 @@ void MapgenV6::flowMud(s16 &mudflow_minpos, s16 &mudflow_maxpos)
v3s16(-1, 0, 0), // left
};
- // Check that upper is air or doesn't exist.
- // Cancel dropping if upper keeps it in place
+ // Check that upper is walkable. Cancel
+ // dropping if upper keeps it in place.
u32 i3 = i;
vm->m_area.add_y(em, i3, 1);
- if (vm->m_area.contains(i3) == true &&
- ndef->get(vm->m_data[i3]).walkable)
- continue;
+ MapNode *n3 = NULL;
+
+ if (vm->m_area.contains(i3)) {
+ n3 = &vm->m_data[i3];
+ if (ndef->get(*n3).walkable)
+ continue;
+ }
// Drop mud on side
for (u32 di = 0; di < 4; di++) {
@@ -885,10 +889,18 @@ void MapgenV6::flowMud(s16 &mudflow_minpos, s16 &mudflow_maxpos)
if (!dropped_to_unknown) {
*n2 = *n;
// Set old place to be air (or water)
- if (old_is_water)
+ if (old_is_water) {
*n = MapNode(c_water_source);
- else
+ } else {
*n = MapNode(CONTENT_AIR);
+ // Upper (n3) is not walkable or is NULL. If it is
+ // not NULL and not air and not water it is a
+ // decoration that needs removing, to avoid
+ // unsupported decorations.
+ if (n3 && n3->getContent() != CONTENT_AIR &&
+ n3->getContent() != c_water_source)
+ *n3 = MapNode(CONTENT_AIR);
+ }
}
// Done