]> git.lizzy.rs Git - minetest.git/blobdiff - src/mg_schematic.cpp
Deduplicate code and use stdlib in string functions
[minetest.git] / src / mg_schematic.cpp
index d203a7105b45975e77b0a6826c5f91e4ee420ddb..0ecbd70834d3b6a102052aa6a42fe268bbbce3dd 100644 (file)
@@ -30,6 +30,14 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 
 const char *SchematicManager::ELEMENT_TITLE = "schematic";
 
+///////////////////////////////////////////////////////////////////////////////
+
+
+SchematicManager::SchematicManager(IGameDef *gamedef) :
+       GenElementManager(gamedef)
+{
+}
+
 
 ///////////////////////////////////////////////////////////////////////////////
 
@@ -50,6 +58,12 @@ Schematic::~Schematic()
 }
 
 
+void Schematic::resolveNodeNames(NodeResolveInfo *nri)
+{
+       m_ndef->getIdsFromResolveInfo(nri, c_nodes);
+}
+
+
 void Schematic::updateContentIds()
 {
        if (flags & SCHEM_CIDS_UPDATED)
@@ -57,7 +71,8 @@ void Schematic::updateContentIds()
 
        flags |= SCHEM_CIDS_UPDATED;
 
-       for (size_t i = 0; i != size.X * size.Y * size.Z; i++)
+       size_t bufsize = size.X * size.Y * size.Z;
+       for (size_t i = 0; i != bufsize; i++)
                schemdata[i].setContent(c_nodes[schemdata[i].getContent()]);
 }
 
@@ -186,8 +201,7 @@ void Schematic::placeStructure(Map *map, v3s16 p, u32 flags,
 
 
 bool Schematic::loadSchematicFromFile(const char *filename,
-       NodeResolver *resolver,
-       std::map<std::string, std::string> &replace_names)
+       INodeDefManager *ndef, std::map<std::string, std::string> &replace_names)
 {
        content_t cignore = CONTENT_IGNORE;
        bool have_cignore = false;
@@ -215,10 +229,9 @@ bool Schematic::loadSchematicFromFile(const char *filename,
        for (int y = 0; y != size.Y; y++)
                slice_probs[y] = (version >= 3) ? readU8(is) : MTSCHEM_PROB_ALWAYS;
 
-       int nodecount = size.X * size.Y * size.Z;
+       NodeResolveInfo *nri = new NodeResolveInfo(this);
 
        u16 nidmapcount = readU16(is);
-
        for (int i = 0; i != nidmapcount; i++) {
                std::string name = deSerializeString(is);
                if (name == "ignore") {
@@ -232,16 +245,22 @@ bool Schematic::loadSchematicFromFile(const char *filename,
                if (it != replace_names.end())
                        name = it->second;
 
-               resolver->addNodeList(name.c_str(), &c_nodes);
+               nri->nodenames.push_back(name);
        }
 
+       nri->nodelistinfo.push_back(NodeListInfo(nidmapcount, CONTENT_AIR));
+       ndef->pendNodeResolve(nri);
+
+       size_t nodecount = size.X * size.Y * size.Z;
+
        delete []schemdata;
        schemdata = new MapNode[nodecount];
+
        MapNode::deSerializeBulk(is, SER_FMT_VER_HIGHEST_READ, schemdata,
-                               nodecount, 2, 2, true);
+               nodecount, 2, 2, true);
 
        if (version == 1) { // fix up the probability values
-               for (int i = 0; i != nodecount; i++) {
+               for (size_t i = 0; i != nodecount; i++) {
                        if (schemdata[i].param1 == 0)
                                schemdata[i].param1 = MTSCHEM_PROB_ALWAYS;
                        if (have_cignore && schemdata[i].getContent() == cignore)