aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShadowNinja <shadowninja@minetest.net>2014-09-11 22:25:06 -0400
committerShadowNinja <shadowninja@minetest.net>2014-09-11 22:25:06 -0400
commit2f170a63c6df9bff7fcf819226f5937a902bf335 (patch)
tree1c3e5a3a57ab62ef5b9581e5ff2b013745889b1a
parentb8ba6318d6ed9edd59455674d39ff1d5018393df (diff)
downloadminetest-2f170a63c6df9bff7fcf819226f5937a902bf335.tar.gz
minetest-2f170a63c6df9bff7fcf819226f5937a902bf335.tar.bz2
minetest-2f170a63c6df9bff7fcf819226f5937a902bf335.zip
Simplify and optimize schematic replacements
-rw-r--r--doc/lua_api.txt4
-rw-r--r--src/script/lua_api/l_mapgen.cpp54
2 files changed, 29 insertions, 29 deletions
diff --git a/doc/lua_api.txt b/doc/lua_api.txt
index 5fd10d418..37477b60a 100644
--- a/doc/lua_api.txt
+++ b/doc/lua_api.txt
@@ -1719,7 +1719,7 @@ minetest.place_schematic(pos, schematic, rotation, replacements, force_placement
^ Place the schematic specified by schematic (see: Schematic specifier) at pos.
^ Rotation can be "0", "90", "180", "270", or "random".
^ If the rotation parameter is omitted, the schematic is not rotated.
-^ replacements = {{"oldname", "convert_to"}, ...}
+^ replacements = {["old_name"] = "convert_to", ...}
^ force_placement is a boolean indicating whether nodes other than air and
^ ignore are replaced by the schematic
@@ -2634,7 +2634,7 @@ Decoration definition (register_decoration)
},
},
^ See 'Schematic specifier' for details.
- replacements = {{"oldname", "convert_to"}, ...},
+ replacements = {["oldname"] = "convert_to", ...},
flags = "place_center_x, place_center_z",
^ Flags for schematic decorations. See 'Schematic attributes'.
rotation = "90" -- rotate schematic 90 degrees on placement
diff --git a/src/script/lua_api/l_mapgen.cpp b/src/script/lua_api/l_mapgen.cpp
index 287faade9..c6d41050b 100644
--- a/src/script/lua_api/l_mapgen.cpp
+++ b/src/script/lua_api/l_mapgen.cpp
@@ -78,6 +78,31 @@ struct EnumString ModApiMapgen::es_Rotation[] =
};
+static void read_schematic_replacements(lua_State *L, DecoSchematic *dschem, int index)
+{
+ lua_pushnil(L);
+ while (lua_next(L, index)) {
+ // key at index -2 and value at index -1
+ std::string replace_from;
+ std::string replace_to;
+ if (lua_istable(L, -1)) { // Old {{"x", "y"}, ...} format
+ lua_rawgeti(L, -1, 1);
+ replace_from = lua_tostring(L, -1);
+ lua_pop(L, 1);
+ lua_rawgeti(L, -1, 2);
+ replace_to = lua_tostring(L, -1);
+ lua_pop(L, 1);
+ } else { // New {x = "y", ...} format
+ replace_from = lua_tostring(L, -2);
+ replace_to = lua_tostring(L, -1);
+ }
+ dschem->replacements[replace_from] = replace_to;
+ // removes value, keeps key for next iteration
+ lua_pop(L, 1);
+ }
+}
+
+
// get_mapgen_object(objectname)
// returns the requested object used during map generation
int ModApiMapgen::l_get_mapgen_object(lua_State *L)
@@ -414,20 +439,7 @@ int ModApiMapgen::l_register_decoration(lua_State *L)
lua_getfield(L, index, "replacements");
if (lua_istable(L, -1)) {
- int i = lua_gettop(L);
- lua_pushnil(L);
- while (lua_next(L, i) != 0) {
- // key at index -2 and value at index -1
- lua_rawgeti(L, -1, 1);
- std::string replace_from = lua_tostring(L, -1);
- lua_pop(L, 1);
- lua_rawgeti(L, -1, 2);
- std::string replace_to = lua_tostring(L, -1);
- lua_pop(L, 1);
- dschem->replacements[replace_from] = replace_to;
- // removes value, keeps key for next iteration
- lua_pop(L, 1);
- }
+ read_schematic_replacements(L, dschem, lua_gettop(L));
}
lua_pop(L, 1);
@@ -602,19 +614,7 @@ int ModApiMapgen::l_place_schematic(lua_State *L)
dschem.rotation = (Rotation)rot;
if (lua_istable(L, 4)) {
- lua_pushnil(L);
- while (lua_next(L, 4) != 0) {
- // key at index -2 and value at index -1
- lua_rawgeti(L, -1, 1);
- std::string replace_from = lua_tostring(L, -1);
- lua_pop(L, 1);
- lua_rawgeti(L, -1, 2);
- std::string replace_to = lua_tostring(L, -1);
- lua_pop(L, 1);
- dschem.replacements[replace_from] = replace_to;
- // removes value, keeps key for next iteration
- lua_pop(L, 1);
- }
+ read_schematic_replacements(L, &dschem, 4);
}
bool force_placement = true;