Add replacements to schematics
parent
5e433fa913
commit
45589fae58
|
@ -1439,10 +1439,11 @@ minetest.create_schematic(p1, p2, probability_list, filename)
|
||||||
^ If probability_list is nil, no probabilities are applied.
|
^ If probability_list is nil, no probabilities are applied.
|
||||||
^ Saves schematic in the Minetest Schematic format to filename.
|
^ Saves schematic in the Minetest Schematic format to filename.
|
||||||
|
|
||||||
minetest.place_schematic(pos, schematic, rotation)
|
minetest.place_schematic(pos, schematic, rotation, replacements)
|
||||||
^ 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"}, ...}
|
||||||
|
|
||||||
Random:
|
Random:
|
||||||
minetest.get_connected_players() -> list of ObjectRefs
|
minetest.get_connected_players() -> list of ObjectRefs
|
||||||
|
@ -2129,6 +2130,7 @@ Ore definition (register_ore)
|
||||||
ore_type = "scatter", -- See "Ore types"
|
ore_type = "scatter", -- See "Ore types"
|
||||||
ore = "default:stone_with_coal",
|
ore = "default:stone_with_coal",
|
||||||
wherein = "default:stone",
|
wherein = "default:stone",
|
||||||
|
^ a list of nodenames is supported too
|
||||||
clust_scarcity = 8*8*8,
|
clust_scarcity = 8*8*8,
|
||||||
^ Ore has a 1 out of clust_scarcity chance of spawning in a node
|
^ Ore has a 1 out of clust_scarcity chance of spawning in a node
|
||||||
^ This value should be *MUCH* higher than your intuition might tell you!
|
^ This value should be *MUCH* higher than your intuition might tell you!
|
||||||
|
@ -2196,6 +2198,7 @@ Decoration definition (register_decoration)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
^ See 'Schematic specifier' for details.
|
^ See 'Schematic specifier' for details.
|
||||||
|
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
|
||||||
|
|
|
@ -506,7 +506,12 @@ void DecoSchematic::resolveNodeNames(INodeDefManager *ndef) {
|
||||||
}
|
}
|
||||||
|
|
||||||
for (size_t i = 0; i != node_names->size(); i++) {
|
for (size_t i = 0; i != node_names->size(); i++) {
|
||||||
content_t c = ndef->getId(node_names->at(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) {
|
if (c == CONTENT_IGNORE) {
|
||||||
errorstream << "DecoSchematic::resolveNodeNames: node '"
|
errorstream << "DecoSchematic::resolveNodeNames: node '"
|
||||||
<< node_names->at(i) << "' not defined" << std::endl;
|
<< node_names->at(i) << "' not defined" << std::endl;
|
||||||
|
|
|
@ -269,6 +269,7 @@ public:
|
||||||
|
|
||||||
std::vector<std::string> *node_names;
|
std::vector<std::string> *node_names;
|
||||||
std::vector<content_t> c_nodes;
|
std::vector<content_t> c_nodes;
|
||||||
|
std::map<std::string, std::string> replacements;
|
||||||
|
|
||||||
u32 flags;
|
u32 flags;
|
||||||
Rotation rotation;
|
Rotation rotation;
|
||||||
|
|
|
@ -808,7 +808,26 @@ int ModApiBasic::l_register_decoration(lua_State *L)
|
||||||
dschem->flags = getflagsfield(L, index, "flags", flagdesc_deco_schematic);
|
dschem->flags = getflagsfield(L, index, "flags", flagdesc_deco_schematic);
|
||||||
dschem->rotation = (Rotation)getenumfield(L, index,
|
dschem->rotation = (Rotation)getenumfield(L, index,
|
||||||
"rotation", es_Rotation, ROTATE_0);
|
"rotation", es_Rotation, ROTATE_0);
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
lua_pop(L, 1);
|
||||||
|
|
||||||
lua_getfield(L, index, "schematic");
|
lua_getfield(L, index, "schematic");
|
||||||
if (!read_schematic(L, -1, dschem, getServer(L))) {
|
if (!read_schematic(L, -1, dschem, getServer(L))) {
|
||||||
delete dschem;
|
delete dschem;
|
||||||
|
@ -888,7 +907,7 @@ int ModApiBasic::l_create_schematic(lua_State *L)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// place_schematic(p, schematic, rotation)
|
// place_schematic(p, schematic, rotation, replacement)
|
||||||
int ModApiBasic::l_place_schematic(lua_State *L)
|
int ModApiBasic::l_place_schematic(lua_State *L)
|
||||||
{
|
{
|
||||||
DecoSchematic dschem;
|
DecoSchematic dschem;
|
||||||
|
@ -906,6 +925,23 @@ int ModApiBasic::l_place_schematic(lua_State *L)
|
||||||
|
|
||||||
dschem.rotation = rot;
|
dschem.rotation = rot;
|
||||||
|
|
||||||
|
if (lua_istable(L, 4)) {
|
||||||
|
int index = 4;
|
||||||
|
lua_pushnil(L);
|
||||||
|
while (lua_next(L, index) != 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!dschem.filename.empty()) {
|
if (!dschem.filename.empty()) {
|
||||||
if (!dschem.loadSchematicFile()) {
|
if (!dschem.loadSchematicFile()) {
|
||||||
errorstream << "place_schematic: failed to load schematic file '"
|
errorstream << "place_schematic: failed to load schematic file '"
|
||||||
|
|
Loading…
Reference in New Issue