summaryrefslogtreecommitdiff
path: root/src/mg_schematic.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mg_schematic.cpp')
-rw-r--r--src/mg_schematic.cpp64
1 files changed, 28 insertions, 36 deletions
diff --git a/src/mg_schematic.cpp b/src/mg_schematic.cpp
index 71884c3d8..2b9c7faeb 100644
--- a/src/mg_schematic.cpp
+++ b/src/mg_schematic.cpp
@@ -56,22 +56,16 @@ Schematic::~Schematic()
}
-void Schematic::resolveNodeNames(NodeResolveInfo *nri)
+void Schematic::resolveNodeNames()
{
- m_ndef->getIdsFromResolveInfo(nri, c_nodes);
-}
-
-
-void Schematic::updateContentIds()
-{
- if (flags & SCHEM_CIDS_UPDATED)
- return;
-
- flags |= SCHEM_CIDS_UPDATED;
+ getIdsFromNrBacklog(&c_nodes, true, CONTENT_AIR);
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()]);
+ for (size_t i = 0; i != bufsize; i++) {
+ content_t c_original = schemdata[i].getContent();
+ content_t c_new = c_nodes[c_original];
+ schemdata[i].setContent(c_new);
+ }
}
@@ -82,8 +76,6 @@ void Schematic::blitToVManip(v3s16 p, MMVManip *vm, Rotation rot,
int ystride = size.X;
int zstride = size.X * size.Y;
- updateContentIds();
-
s16 sx = size.X;
s16 sy = size.Y;
s16 sz = size.Z;
@@ -198,8 +190,7 @@ void Schematic::placeStructure(Map *map, v3s16 p, u32 flags, Rotation rot,
}
-bool Schematic::deserializeFromMts(std::istream *is,
- INodeDefManager *ndef, std::vector<std::string> *names)
+bool Schematic::deserializeFromMts(std::istream *is, std::vector<std::string> *names)
{
std::istream &ss = *is;
content_t cignore = CONTENT_IGNORE;
@@ -263,7 +254,7 @@ bool Schematic::deserializeFromMts(std::istream *is,
}
-bool Schematic::serializeToMts(std::ostream *os, INodeDefManager *ndef)
+bool Schematic::serializeToMts(std::ostream *os)
{
std::ostream &ss = *os;
@@ -281,7 +272,7 @@ bool Schematic::serializeToMts(std::ostream *os, INodeDefManager *ndef)
u16 numids = usednodes.size();
writeU16(ss, numids); // name count
for (int i = 0; i != numids; i++)
- ss << serializeString(ndef->get(usednodes[i]).name); // node names
+ ss << serializeString(getNodeName(usednodes[i])); // node names
// compressed bulk node data
MapNode::serializeBulk(ss, SER_FMT_VER_HIGHEST_WRITE,
@@ -291,8 +282,7 @@ bool Schematic::serializeToMts(std::ostream *os, INodeDefManager *ndef)
}
-bool Schematic::serializeToLua(std::ostream *os,
- INodeDefManager *ndef, bool use_comments)
+bool Schematic::serializeToLua(std::ostream *os, bool use_comments)
{
std::ostream &ss = *os;
@@ -335,7 +325,7 @@ bool Schematic::serializeToLua(std::ostream *os,
for (u16 x = 0; x != size.X; x++, i++) {
ss << "\t\t{"
- << "name=\"" << ndef->get(schemdata[i]).name
+ << "name=\"" << getNodeName(schemdata[i].getContent())
<< "\", param1=" << (u16)schemdata[i].param1
<< ", param2=" << (u16)schemdata[i].param2
<< "}," << std::endl;
@@ -351,8 +341,9 @@ bool Schematic::serializeToLua(std::ostream *os,
}
-bool Schematic::loadSchematicFromFile(const char *filename,
- INodeDefManager *ndef, StringMap *replace_names)
+bool Schematic::loadSchematicFromFile(const std::string &filename,
+ INodeDefManager *ndef, StringMap *replace_names,
+ NodeResolveMethod resolve_method)
{
std::ifstream is(filename, std::ios_base::binary);
if (!is.good()) {
@@ -361,30 +352,31 @@ bool Schematic::loadSchematicFromFile(const char *filename,
return false;
}
- std::vector<std::string> names;
- if (!deserializeFromMts(&is, ndef, &names))
+ size_t origsize = m_nodenames.size();
+ if (!deserializeFromMts(&is, &m_nodenames))
return false;
- NodeResolveInfo *nri = new NodeResolveInfo(this);
- for (size_t i = 0; i != names.size(); i++) {
- if (replace_names) {
- StringMap::iterator it = replace_names->find(names[i]);
+ if (replace_names) {
+ for (size_t i = origsize; i != m_nodenames.size(); i++) {
+ std::string &name = m_nodenames[i];
+ StringMap::iterator it = replace_names->find(name);
if (it != replace_names->end())
- names[i] = it->second;
+ name = it->second;
}
- nri->nodenames.push_back(names[i]);
}
- nri->nodelistinfo.push_back(NodeListInfo(names.size(), CONTENT_AIR));
- ndef->pendNodeResolve(nri);
+
+ m_nnlistsizes.push_back(m_nodenames.size() - origsize);
+
+ ndef->pendNodeResolve(this, resolve_method);
return true;
}
-bool Schematic::saveSchematicToFile(const char *filename, INodeDefManager *ndef)
+bool Schematic::saveSchematicToFile(const std::string &filename)
{
std::ostringstream os(std::ios_base::binary);
- serializeToMts(&os, ndef);
+ serializeToMts(&os);
return fs::safeWriteToFile(filename, os.str());
}