/gist:051520b509f2e939184c Secret
Last active
August 29, 2015 14:06
Star
You must be signed in to star a gist
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/doc/lua_api.txt b/doc/lua_api.txt | |
index 5fd10d4..37477b6 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 287faad..c6d4105 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; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment