diff options
author | kwolekr <kwolekr@minetest.net> | 2015-05-09 01:38:20 -0400 |
---|---|---|
committer | kwolekr <kwolekr@minetest.net> | 2015-05-09 18:44:00 -0400 |
commit | 2b99d904f6b8197931954772b6466d8ee56cafc9 (patch) | |
tree | b4d75968c5d0b4072c0110de82aa35d62a1e36df /src/script/lua_api | |
parent | d59e6ad004b64d37ac10dddd61a7b35e7baa1f89 (diff) | |
download | minetest-2b99d904f6b8197931954772b6466d8ee56cafc9.tar.gz minetest-2b99d904f6b8197931954772b6466d8ee56cafc9.tar.bz2 minetest-2b99d904f6b8197931954772b6466d8ee56cafc9.zip |
Schematics: Add per-node force placement option
Diffstat (limited to 'src/script/lua_api')
-rw-r--r-- | src/script/lua_api/l_mapgen.cpp | 57 |
1 files changed, 28 insertions, 29 deletions
diff --git a/src/script/lua_api/l_mapgen.cpp b/src/script/lua_api/l_mapgen.cpp index 5422447ed..3cb52eab4 100644 --- a/src/script/lua_api/l_mapgen.cpp +++ b/src/script/lua_api/l_mapgen.cpp @@ -237,36 +237,32 @@ bool read_schematic_def(lua_State *L, int index, lua_getfield(L, index, "data"); luaL_checktype(L, -1, LUA_TTABLE); - int numnodes = size.X * size.Y * size.Z; + u32 numnodes = size.X * size.Y * size.Z; schem->schemdata = new MapNode[numnodes]; - int i = 0; size_t names_base = names->size(); std::map<std::string, content_t> name_id_map; - lua_pushnil(L); - while (lua_next(L, -2)) { - if (i >= numnodes) { - i++; - lua_pop(L, 1); + u32 i = 0; + for (lua_pushnil(L); lua_next(L, -2); i++, lua_pop(L, 1)) { + if (i >= numnodes) continue; - } - // same as readnode, except param1 default is MTSCHEM_PROB_CONST - lua_getfield(L, -1, "name"); - std::string name = luaL_checkstring(L, -1); - lua_pop(L, 1); + //// Read name + std::string name; + if (!getstringfield(L, -1, "name", name)) + throw LuaError("Schematic data definition with missing name field"); + //// Read param1/prob u8 param1; - lua_getfield(L, -1, "param1"); - param1 = !lua_isnil(L, -1) ? lua_tonumber(L, -1) : MTSCHEM_PROB_ALWAYS; - lua_pop(L, 1); + if (!getintfield(L, -1, "param1", param1) && + !getintfield(L, -1, "prob", param1)) + param1 = MTSCHEM_PROB_ALWAYS_OLD; - u8 param2; - lua_getfield(L, -1, "param2"); - param2 = !lua_isnil(L, -1) ? lua_tonumber(L, -1) : 0; - lua_pop(L, 1); + //// Read param2 + u8 param2 = getintfield_default(L, -1, "param2", 0); + //// Find or add new nodename-to-ID mapping std::map<std::string, content_t>::iterator it = name_id_map.find(name); content_t name_index; if (it != name_id_map.end()) { @@ -277,10 +273,13 @@ bool read_schematic_def(lua_State *L, int index, names->push_back(name); } - schem->schemdata[i] = MapNode(name_index, param1, param2); + //// Perform probability/force_place fixup on param1 + param1 >>= 1; + if (getboolfield_default(L, -1, "force_place", false)) + param1 |= MTSCHEM_FORCE_PLACE; - i++; - lua_pop(L, 1); + //// Actually set the node in the schematic + schem->schemdata[i] = MapNode(name_index, param1, param2); } if (i != numnodes) { @@ -297,13 +296,13 @@ bool read_schematic_def(lua_State *L, int index, lua_getfield(L, index, "yslice_prob"); if (lua_istable(L, -1)) { - lua_pushnil(L); - while (lua_next(L, -2)) { - if (getintfield(L, -1, "ypos", i) && i >= 0 && i < size.Y) { - schem->slice_probs[i] = getintfield_default(L, -1, - "prob", MTSCHEM_PROB_ALWAYS); - } - lua_pop(L, 1); + for (lua_pushnil(L); lua_next(L, -2); lua_pop(L, 1)) { + u16 ypos; + if (!getintfield(L, -1, "ypos", ypos) || (ypos >= size.Y) || + !getintfield(L, -1, "prob", schem->slice_probs[ypos])) + continue; + + schem->slice_probs[ypos] >>= 1; } } |