From 5b338638e0e5743d8acfb48b72e17b671968722f Mon Sep 17 00:00:00 2001 From: Paramat Date: Thu, 25 May 2017 11:46:34 +0100 Subject: [PATCH] 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. --- src/mapgen_v6.cpp | 26 +++++++++++++++++++------- 1 file 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