From 9985ffb2fcedf58e46944fc4485c911827037497 Mon Sep 17 00:00:00 2001 From: luk3yx Date: Sun, 11 Dec 2022 13:18:49 +1300 Subject: [PATCH] Fix metadata wiping when placing schematics --- src/mapgen/mg_schematic.cpp | 19 ++++++------------- src/mapgen/mg_schematic.h | 2 +- 2 files changed, 7 insertions(+), 14 deletions(-) diff --git a/src/mapgen/mg_schematic.cpp b/src/mapgen/mg_schematic.cpp index 53fcbe8f6..ebf211a84 100644 --- a/src/mapgen/mg_schematic.cpp +++ b/src/mapgen/mg_schematic.cpp @@ -119,7 +119,7 @@ void Schematic::resolveNodeNames() } -void Schematic::blitToVManip(MMVManip *vm, v3s16 p, Rotation rot, bool force_place) +void Schematic::blitToVManip(MMVManip *vm, v3s16 p, Rotation rot, bool force_place, ServerMap *map) { assert(schemdata && slice_probs); sanity_check(m_ndef != NULL); @@ -195,6 +195,10 @@ void Schematic::blitToVManip(MMVManip *vm, v3s16 p, Rotation rot, bool force_pla if (rot) vm->m_data[vi].rotateAlongYAxis(m_ndef, rot); + + // Wipe metadata if a map object was specified + if (map != nullptr && (force_place || force_place_node)) + map->removeNodeMetadata(pos); } } y_map++; @@ -263,23 +267,12 @@ void Schematic::placeOnMap(ServerMap *map, v3s16 p, u32 flags, MMVManip vm(map); vm.initialEmerge(bp1, bp2); - blitToVManip(&vm, p, rot, force_place); + blitToVManip(&vm, p, rot, force_place, map); voxalgo::blit_back_with_light(map, &vm, &modified_blocks); //// Carry out post-map-modification actions - if (force_place) { - v3s16 npos; - for (npos.X = p.X; npos.X < p.X + s.X; npos.X++) { - for (npos.Y = p.Y; npos.Y < p.Y + s.Y; npos.Y++) { - for (npos.Z = p.Z; npos.Z < p.Z + s.Z; npos.Z++) { - map->removeNodeMetadata(npos); - } - } - } - } - //// Create & dispatch map modification events to observers MapEditEvent event; event.type = MEET_OTHER; diff --git a/src/mapgen/mg_schematic.h b/src/mapgen/mg_schematic.h index 0d2a38876..95ccbc455 100644 --- a/src/mapgen/mg_schematic.h +++ b/src/mapgen/mg_schematic.h @@ -113,7 +113,7 @@ public: bool serializeToLua(std::ostream *os, const std::vector &names, bool use_comments, u32 indent_spaces) const; - void blitToVManip(MMVManip *vm, v3s16 p, Rotation rot, bool force_place); + void blitToVManip(MMVManip *vm, v3s16 p, Rotation rot, bool force_place, ServerMap *map = nullptr); bool placeOnVManip(MMVManip *vm, v3s16 p, u32 flags, Rotation rot, bool force_place); void placeOnMap(ServerMap *map, v3s16 p, u32 flags, Rotation rot, bool force_place);