diff options
author | kwolekr <kwolekr@minetest.net> | 2013-08-04 22:59:22 -0400 |
---|---|---|
committer | kwolekr <kwolekr@minetest.net> | 2013-08-11 15:34:49 -0400 |
commit | c06caa14c31ffa480146a7dbb7094224a486c1bd (patch) | |
tree | aa647a832e856a9b71e5fed67a74cee52f405f6e /src | |
parent | 56b9377c1c55a08eb5ae09c058f9f1cb8e9e4a73 (diff) | |
download | minetest-c06caa14c31ffa480146a7dbb7094224a486c1bd.tar.gz minetest-c06caa14c31ffa480146a7dbb7094224a486c1bd.tar.bz2 minetest-c06caa14c31ffa480146a7dbb7094224a486c1bd.zip |
Decoration: Fix schematic probability mess with new MTS file version
Diffstat (limited to 'src')
-rw-r--r-- | src/environment.cpp | 1 | ||||
-rw-r--r-- | src/map.cpp | 1 | ||||
-rw-r--r-- | src/map.h | 2 | ||||
-rw-r--r-- | src/mapgen.cpp | 56 | ||||
-rw-r--r-- | src/mapgen.h | 5 | ||||
-rw-r--r-- | src/script/common/c_content.cpp | 20 | ||||
-rw-r--r-- | src/script/lua_api/luaapi.cpp | 11 |
7 files changed, 68 insertions, 28 deletions
diff --git a/src/environment.cpp b/src/environment.cpp index 76a8aab51..35983aaaf 100644 --- a/src/environment.cpp +++ b/src/environment.cpp @@ -28,7 +28,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "mapblock.h" #include "serverobject.h" #include "content_sao.h" -#include "mapgen.h" #include "settings.h" #include "log.h" #include "profiler.h" diff --git a/src/map.cpp b/src/map.cpp index 90cd498b7..da20b5b0e 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -24,7 +24,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "filesys.h" #include "voxel.h" #include "porting.h" -#include "mapgen.h" #include "nodemetadata.h" #include "settings.h" #include "log.h" @@ -33,7 +33,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "mapnode.h" #include "constants.h" #include "voxel.h" -#include "mapgen.h" //for BlockMakeData and EmergeManager +#include "mapgen.h" //for MapgenParams #include "modifiedstate.h" #include "util/container.h" #include "nodetimer.h" diff --git a/src/mapgen.cpp b/src/mapgen.cpp index 397e52f74..d3996de5f 100644 --- a/src/mapgen.cpp +++ b/src/mapgen.cpp @@ -507,16 +507,19 @@ void DecoSchematic::resolveNodeNames(INodeDefManager *ndef) { for (size_t i = 0; i != node_names->size(); i++) { std::string name = node_names->at(i); + std::map<std::string, std::string>::iterator it; it = replacements.find(name); if (it != replacements.end()) name = it->second; + content_t c = ndef->getId(name); if (c == CONTENT_IGNORE) { errorstream << "DecoSchematic::resolveNodeNames: node '" - << node_names->at(i) << "' not defined" << std::endl; + << name << "' not defined" << std::endl; c = CONTENT_AIR; } + c_nodes.push_back(c); } @@ -605,6 +608,9 @@ void DecoSchematic::blitToVManip(v3s16 p, ManualMapVoxelManipulator *vm, if (schematic[i].getContent() == CONTENT_IGNORE) continue; + + if (schematic[i].param1 == MTSCHEM_PROB_NEVER) + continue; if (!force_placement) { content_t c = vm->m_data[vi].getContent(); @@ -612,7 +618,8 @@ void DecoSchematic::blitToVManip(v3s16 p, ManualMapVoxelManipulator *vm, continue; } - if (schematic[i].param1 && myrand_range(1, 256) > schematic[i].param1) + if (schematic[i].param1 != MTSCHEM_PROB_ALWAYS && + myrand_range(1, 255) > schematic[i].param1) continue; vm->m_data[vi] = schematic[i]; @@ -668,6 +675,9 @@ void DecoSchematic::placeStructure(Map *map, v3s16 p) { bool DecoSchematic::loadSchematicFile() { + content_t cignore = CONTENT_IGNORE; + bool have_cignore = false; + std::ifstream is(filename.c_str(), std::ios_base::binary); u32 signature = readU32(is); @@ -678,7 +688,7 @@ bool DecoSchematic::loadSchematicFile() { } u16 version = readU16(is); - if (version != 1) { + if (version > 2) { errorstream << "loadSchematicFile: unsupported schematic " "file version" << std::endl; return false; @@ -692,6 +702,11 @@ bool DecoSchematic::loadSchematicFile() { node_names = new std::vector<std::string>; for (int i = 0; i != nidmapcount; i++) { std::string name = deSerializeString(is); + if (name == "ignore") { + name = "air"; + cignore = i; + have_cignore = true; + } node_names->push_back(name); } @@ -699,7 +714,16 @@ bool DecoSchematic::loadSchematicFile() { schematic = new MapNode[nodecount]; MapNode::deSerializeBulk(is, SER_FMT_VER_HIGHEST_READ, schematic, nodecount, 2, 2, true); - + + if (version == 1) { // fix up the probability values + for (int i = 0; i != nodecount; i++) { + if (schematic[i].param1 == 0) + schematic[i].param1 = MTSCHEM_PROB_ALWAYS; + if (have_cignore && schematic[i].getContent() == cignore) + schematic[i].param1 = MTSCHEM_PROB_NEVER; + } + } + return true; } @@ -709,7 +733,7 @@ bool DecoSchematic::loadSchematicFile() { All values are stored in big-endian byte order. [u32] signature: 'MTSM' - [u16] version: 1 + [u16] version: 2 [u16] size X [u16] size Y [u16] size Z @@ -726,12 +750,16 @@ bool DecoSchematic::loadSchematicFile() { For each node in schematic: [u8] param2 } + + Version changes: + 1 - Initial version + 2 - Fixed messy never/always place; 0 probability is now never, 0xFF is always */ void DecoSchematic::saveSchematicFile(INodeDefManager *ndef) { std::ofstream os(filename.c_str(), std::ios_base::binary); writeU32(os, MTSCHEM_FILE_SIGNATURE); // signature - writeU16(os, 1); // version + writeU16(os, 2); // version writeV3S16(os, size); // schematic size std::vector<content_t> usednodes; @@ -789,7 +817,7 @@ bool DecoSchematic::getSchematicFromMap(Map *map, v3s16 p1, v3s16 p2) { u32 vi = vm->m_area.index(p1.X, y, z); for (s16 x = p1.X; x <= p2.X; x++, i++, vi++) { schematic[i] = vm->m_data[vi]; - schematic[i].param1 = 0; + schematic[i].param1 = MTSCHEM_PROB_ALWAYS; } } @@ -798,16 +826,18 @@ bool DecoSchematic::getSchematicFromMap(Map *map, v3s16 p1, v3s16 p2) { } -void DecoSchematic::applyProbabilities(std::vector<std::pair<v3s16, s16> > *plist, v3s16 p0) { +void DecoSchematic::applyProbabilities(std::vector<std::pair<v3s16, u8> > *plist, + v3s16 p0) { for (size_t i = 0; i != plist->size(); i++) { v3s16 p = (*plist)[i].first - p0; int index = p.Z * (size.Y * size.X) + p.Y * size.X + p.X; if (index < size.Z * size.Y * size.X) { - s16 prob = (*plist)[i].second; - if (prob != -1) - schematic[index].param1 = prob; - else - schematic[index].setContent(CONTENT_IGNORE); + u8 prob = (*plist)[i].second; + schematic[index].param1 = prob; + + // trim unnecessary node names from schematic + if (prob == MTSCHEM_PROB_NEVER) + schematic[index].setContent(CONTENT_AIR); } } } diff --git a/src/mapgen.h b/src/mapgen.h index 7b8ff57ca..6ed2c0994 100644 --- a/src/mapgen.h +++ b/src/mapgen.h @@ -27,7 +27,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "mapnode.h" #include "noise.h" #include "settings.h" -#include <map> /////////////////// Mapgen flags #define MG_TREES 0x01 @@ -262,6 +261,8 @@ public: }; #define MTSCHEM_FILE_SIGNATURE 0x4d54534d // 'MTSM' +#define MTSCHEM_PROB_NEVER 0x00 +#define MTSCHEM_PROB_ALWAYS 0xFF class DecoSchematic : public Decoration { public: @@ -292,7 +293,7 @@ public: bool getSchematicFromMap(Map *map, v3s16 p1, v3s16 p2); void placeStructure(Map *map, v3s16 p); - void applyProbabilities(std::vector<std::pair<v3s16, s16> > *plist, v3s16 p0); + void applyProbabilities(std::vector<std::pair<v3s16, u8> > *plist, v3s16 p0); }; void build_nnlist_and_update_ids(MapNode *nodes, u32 nodecount, diff --git a/src/script/common/c_content.cpp b/src/script/common/c_content.cpp index f9765b655..ca7c7fde9 100644 --- a/src/script/common/c_content.cpp +++ b/src/script/common/c_content.cpp @@ -956,8 +956,24 @@ bool read_schematic(lua_State *L, int index, DecoSchematic *dschem, Server *serv lua_pushnil(L); while (lua_next(L, -2)) { - if (i < numnodes) - schemdata[i] = readnode(L, -1, ndef); + if (i < numnodes) { + // same as readnode, except param1 default is MTSCHEM_PROB_CONST + lua_getfield(L, -1, "name"); + const char *name = luaL_checkstring(L, -1); + lua_pop(L, 1); + + u8 param1; + lua_getfield(L, -1, "param1"); + param1 = !lua_isnil(L, -1) ? lua_tonumber(L, -1) : MTSCHEM_PROB_ALWAYS; + lua_pop(L, 1); + + u8 param2; + lua_getfield(L, -1, "param2"); + param2 = !lua_isnil(L, -1) ? lua_tonumber(L, -1) : 0; + lua_pop(L, 1); + + schemdata[i] = MapNode(ndef, name, param1, param2); + } i++; lua_pop(L, 1); diff --git a/src/script/lua_api/luaapi.cpp b/src/script/lua_api/luaapi.cpp index 929aa40d0..26fb0c318 100644 --- a/src/script/lua_api/luaapi.cpp +++ b/src/script/lua_api/luaapi.cpp @@ -867,7 +867,7 @@ int ModApiBasic::l_create_schematic(lua_State *L) v3s16 p2 = read_v3s16(L, 2); sortBoxVerticies(p1, p2); - std::vector<std::pair<v3s16, s16> > probability_list; + std::vector<std::pair<v3s16, u8> > probability_list; if (lua_istable(L, 3)) { lua_pushnil(L); while (lua_next(L, 3)) { @@ -876,13 +876,8 @@ int ModApiBasic::l_create_schematic(lua_State *L) v3s16 pos = read_v3s16(L, -1); lua_pop(L, 1); - s16 prob = getintfield_default(L, -1, "prob", 0); - if (prob < -1 || prob >= UCHAR_MAX) { - errorstream << "create_schematic: probability value of " - << prob << " at " << PP(pos) << " out of range" << std::endl; - } else { - probability_list.push_back(std::make_pair(pos, prob)); - } + u8 prob = getintfield_default(L, -1, "prob", 0xFF); + probability_list.push_back(std::make_pair(pos, prob)); } lua_pop(L, 1); |