diff options
author | kwolekr <kwolekr@minetest.net> | 2015-05-08 00:05:08 -0400 |
---|---|---|
committer | kwolekr <kwolekr@minetest.net> | 2015-05-08 00:55:42 -0400 |
commit | 2dba29ebf20e95068872b758a9c16daeb4c74440 (patch) | |
tree | 67a202271b962916f43e4e110ce0a269865c8718 /src/mg_schematic.cpp | |
parent | 33c11415bf9f05192c104c4bb38f579824addfa5 (diff) | |
download | minetest-2dba29ebf20e95068872b758a9c16daeb4c74440.tar.gz minetest-2dba29ebf20e95068872b758a9c16daeb4c74440.tar.bz2 minetest-2dba29ebf20e95068872b758a9c16daeb4c74440.zip |
Tests: Add schematic unittests
Improve schematic file-saving interface
Add ability to create temporary test files
Diffstat (limited to 'src/mg_schematic.cpp')
-rw-r--r-- | src/mg_schematic.cpp | 28 |
1 files changed, 16 insertions, 12 deletions
diff --git a/src/mg_schematic.cpp b/src/mg_schematic.cpp index bea08ef12..33f82a74c 100644 --- a/src/mg_schematic.cpp +++ b/src/mg_schematic.cpp @@ -94,8 +94,7 @@ void Schematic::resolveNodeNames() } -void Schematic::blitToVManip(v3s16 p, MMVManip *vm, - Rotation rot, bool force_placement) +void Schematic::blitToVManip(v3s16 p, MMVManip *vm, Rotation rot, bool force_place) { sanity_check(m_ndef != NULL); @@ -151,7 +150,7 @@ void Schematic::blitToVManip(v3s16 p, MMVManip *vm, if (schemdata[i].param1 == MTSCHEM_PROB_NEVER) continue; - if (!force_placement) { + if (!force_place) { content_t c = vm->m_data[vi].getContent(); if (c != CONTENT_AIR && c != CONTENT_IGNORE) continue; @@ -174,7 +173,7 @@ void Schematic::blitToVManip(v3s16 p, MMVManip *vm, void Schematic::placeStructure(Map *map, v3s16 p, u32 flags, - Rotation rot, bool force_placement) + Rotation rot, bool force_place) { assert(schemdata != NULL); // Pre-condition sanity_check(m_ndef != NULL); @@ -198,7 +197,7 @@ void Schematic::placeStructure(Map *map, v3s16 p, u32 flags, v3s16 bp2 = getNodeBlockPos(p + s - v3s16(1,1,1)); vm->initialEmerge(bp1, bp2); - blitToVManip(p, vm, rot, force_placement); + blitToVManip(p, vm, rot, force_place); std::map<v3s16, MapBlock *> lighting_modified_blocks; std::map<v3s16, MapBlock *> modified_blocks; @@ -405,15 +404,17 @@ bool Schematic::loadSchematicFromFile(const std::string &filename, } -bool Schematic::saveSchematicToFile(const std::string &filename) +bool Schematic::saveSchematicToFile(const std::string &filename, + INodeDefManager *ndef) { MapNode *orig_schemdata = schemdata; std::vector<std::string> ndef_nodenames; std::vector<std::string> *names; - // Only carry out the modification if we know the nodes - // were resolved at this point - if (m_resolve_done) { + if (m_resolve_done && ndef == NULL) + ndef = m_ndef; + + if (ndef) { names = &ndef_nodenames; u32 volume = size.X * size.Y * size.Z; @@ -421,19 +422,22 @@ bool Schematic::saveSchematicToFile(const std::string &filename) for (u32 i = 0; i != volume; i++) schemdata[i] = orig_schemdata[i]; - generate_nodelist_and_update_ids(schemdata, volume, names, m_ndef); + generate_nodelist_and_update_ids(schemdata, volume, names, ndef); } else { // otherwise, use the names we have on hand in the list names = &m_nodenames; } std::ostringstream os(std::ios_base::binary); - serializeToMts(&os, *names); + bool status = serializeToMts(&os, *names); - if (m_resolve_done) { + if (ndef) { delete []schemdata; schemdata = orig_schemdata; } + if (!status) + return false; + return fs::safeWriteToFile(filename, os.str()); } |