forked from Mirrorlandia_minetest/minetest
Simplify and optimize schematic replacements
This commit is contained in:
parent
b8ba6318d6
commit
2f170a63c6
@ -1719,7 +1719,7 @@ minetest.place_schematic(pos, schematic, rotation, replacements, force_placement
|
|||||||
^ Place the schematic specified by schematic (see: Schematic specifier) at pos.
|
^ Place the schematic specified by schematic (see: Schematic specifier) at pos.
|
||||||
^ Rotation can be "0", "90", "180", "270", or "random".
|
^ Rotation can be "0", "90", "180", "270", or "random".
|
||||||
^ If the rotation parameter is omitted, the schematic is not rotated.
|
^ 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
|
^ force_placement is a boolean indicating whether nodes other than air and
|
||||||
^ ignore are replaced by the schematic
|
^ ignore are replaced by the schematic
|
||||||
|
|
||||||
@ -2634,7 +2634,7 @@ Decoration definition (register_decoration)
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
^ See 'Schematic specifier' for details.
|
^ See 'Schematic specifier' for details.
|
||||||
replacements = {{"oldname", "convert_to"}, ...},
|
replacements = {["oldname"] = "convert_to", ...},
|
||||||
flags = "place_center_x, place_center_z",
|
flags = "place_center_x, place_center_z",
|
||||||
^ Flags for schematic decorations. See 'Schematic attributes'.
|
^ Flags for schematic decorations. See 'Schematic attributes'.
|
||||||
rotation = "90" -- rotate schematic 90 degrees on placement
|
rotation = "90" -- rotate schematic 90 degrees on placement
|
||||||
|
@ -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)
|
// get_mapgen_object(objectname)
|
||||||
// returns the requested object used during map generation
|
// returns the requested object used during map generation
|
||||||
int ModApiMapgen::l_get_mapgen_object(lua_State *L)
|
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");
|
lua_getfield(L, index, "replacements");
|
||||||
if (lua_istable(L, -1)) {
|
if (lua_istable(L, -1)) {
|
||||||
int i = lua_gettop(L);
|
read_schematic_replacements(L, dschem, 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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
lua_pop(L, 1);
|
lua_pop(L, 1);
|
||||||
|
|
||||||
@ -602,19 +614,7 @@ int ModApiMapgen::l_place_schematic(lua_State *L)
|
|||||||
dschem.rotation = (Rotation)rot;
|
dschem.rotation = (Rotation)rot;
|
||||||
|
|
||||||
if (lua_istable(L, 4)) {
|
if (lua_istable(L, 4)) {
|
||||||
lua_pushnil(L);
|
read_schematic_replacements(L, &dschem, 4);
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool force_placement = true;
|
bool force_placement = true;
|
||||||
|
Loading…
Reference in New Issue
Block a user