diff options
author | sfan5 <sfan5@live.de> | 2020-04-10 02:05:20 +0200 |
---|---|---|
committer | Loïc Blot <nerzhul@users.noreply.github.com> | 2020-05-05 19:26:59 +0200 |
commit | 3c65d1acec27366d88fc3686d3f820175673e203 (patch) | |
tree | f0de47610f7d5d2fe26862226cd63ddee5f5b309 /src/mapgen/mg_schematic.cpp | |
parent | 2062c80e21b657fed8e68aa48523fa12ad5ef095 (diff) | |
download | minetest-3c65d1acec27366d88fc3686d3f820175673e203.tar.gz minetest-3c65d1acec27366d88fc3686d3f820175673e203.tar.bz2 minetest-3c65d1acec27366d88fc3686d3f820175673e203.zip |
Give the Mapgen on each EmergeThread its own Biome/Ore/Deco/SchemManager copy
Diffstat (limited to 'src/mapgen/mg_schematic.cpp')
-rw-r--r-- | src/mapgen/mg_schematic.cpp | 27 |
1 files changed, 25 insertions, 2 deletions
diff --git a/src/mapgen/mg_schematic.cpp b/src/mapgen/mg_schematic.cpp index 2e04d30e6..c3bd89f3a 100644 --- a/src/mapgen/mg_schematic.cpp +++ b/src/mapgen/mg_schematic.cpp @@ -43,12 +43,21 @@ SchematicManager::SchematicManager(Server *server) : } +SchematicManager *SchematicManager::clone() const +{ + auto mgr = new SchematicManager(); + assert(mgr); + ObjDefManager::cloneTo(mgr); + return mgr; +} + + void SchematicManager::clear() { EmergeManager *emerge = m_server->getEmergeManager(); // Remove all dangling references in Decorations - DecorationManager *decomgr = emerge->decomgr; + DecorationManager *decomgr = emerge->getWritableDecorationManager(); for (size_t i = 0; i != decomgr->getNumObjects(); i++) { Decoration *deco = (Decoration *)decomgr->getRaw(i); @@ -79,7 +88,21 @@ Schematic::~Schematic() ObjDef *Schematic::clone() const { - FATAL_ERROR("not cloneable"); + auto def = new Schematic(); + ObjDef::cloneTo(def); + NodeResolver::cloneTo(def); + + def->c_nodes = c_nodes; + def->flags = flags; + def->size = size; + FATAL_ERROR_IF(!schemdata, "Schematic can only be cloned after loading"); + u32 nodecount = size.X * size.Y * size.Z; + def->schemdata = new MapNode[nodecount]; + memcpy(def->schemdata, schemdata, sizeof(MapNode) * nodecount); + def->slice_probs = new u8[size.Y]; + memcpy(def->slice_probs, slice_probs, sizeof(u8) * size.Y); + + return def; } |