diff options
author | Paramat <paramat@users.noreply.github.com> | 2017-05-25 11:46:34 +0100 |
---|---|---|
committer | Loïc Blot <nerzhul@users.noreply.github.com> | 2017-05-25 12:46:34 +0200 |
commit | 5b338638e0e5743d8acfb48b72e17b671968722f (patch) | |
tree | 5a2af7debe37c80924160473cf8a53671e730d6b /src/mapgen_v6.cpp | |
parent | 2f291e6685e8d1866184460d547d089b5b3125fd (diff) | |
download | minetest-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/mapgen_v6.cpp')
-rw-r--r-- | src/mapgen_v6.cpp | 26 |
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 |