aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkwolekr <kwolekr@minetest.net>2014-02-15 19:46:57 -0500
committerkwolekr <kwolekr@minetest.net>2014-02-15 19:46:57 -0500
commitc1638590577d487e620f9a037727b91a0f62ceea (patch)
tree5a9dd3fa3bbf8c52a8ced6b99bd93c51c808f0e1
parent3570f3e396acad4a6b5381d06c2dae5cf4e95fbd (diff)
downloadminetest-c1638590577d487e620f9a037727b91a0f62ceea.tar.gz
minetest-c1638590577d487e620f9a037727b91a0f62ceea.tar.bz2
minetest-c1638590577d487e620f9a037727b91a0f62ceea.zip
Schematic: Add force_placement parameter to minetest.place_structure API
-rw-r--r--doc/lua_api.txt4
-rw-r--r--src/mapgen.cpp4
-rw-r--r--src/mapgen.h2
-rw-r--r--src/script/lua_api/l_mapgen.cpp9
4 files changed, 12 insertions, 7 deletions
diff --git a/doc/lua_api.txt b/doc/lua_api.txt
index 4e645ada3..0e2f6360e 100644
--- a/doc/lua_api.txt
+++ b/doc/lua_api.txt
@@ -1595,11 +1595,13 @@ minetest.create_schematic(p1, p2, probability_list, filename, slice_prob_list)
^ If slice probability list is nil, no slice probabilities are applied.
^ Saves schematic in the Minetest Schematic format to filename.
-minetest.place_schematic(pos, schematic, rotation, replacements)
+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"}, ...}
+^ force_placement is a boolean indicating whether nodes other than air and
+^ ignore are replaced by the schematic
Random:
minetest.get_connected_players() -> list of ObjectRefs
diff --git a/src/mapgen.cpp b/src/mapgen.cpp
index 95a2f4029..a7e9d2e04 100644
--- a/src/mapgen.cpp
+++ b/src/mapgen.cpp
@@ -652,7 +652,7 @@ void DecoSchematic::blitToVManip(v3s16 p, ManualMapVoxelManipulator *vm,
}
-void DecoSchematic::placeStructure(Map *map, v3s16 p) {
+void DecoSchematic::placeStructure(Map *map, v3s16 p, bool force_placement) {
assert(schematic != NULL);
ManualMapVoxelManipulator *vm = new ManualMapVoxelManipulator(map);
@@ -673,7 +673,7 @@ void DecoSchematic::placeStructure(Map *map, v3s16 p) {
v3s16 bp2 = getNodeBlockPos(p + s - v3s16(1,1,1));
vm->initialEmerge(bp1, bp2);
- blitToVManip(p, vm, rot, true);
+ blitToVManip(p, vm, rot, force_placement);
std::map<v3s16, MapBlock *> lighting_modified_blocks;
std::map<v3s16, MapBlock *> modified_blocks;
diff --git a/src/mapgen.h b/src/mapgen.h
index 037cdd1f9..9bc162fe0 100644
--- a/src/mapgen.h
+++ b/src/mapgen.h
@@ -313,7 +313,7 @@ public:
void saveSchematicFile(INodeDefManager *ndef);
bool getSchematicFromMap(Map *map, v3s16 p1, v3s16 p2);
- void placeStructure(Map *map, v3s16 p);
+ void placeStructure(Map *map, v3s16 p, bool force_placement);
void applyProbabilities(v3s16 p0,
std::vector<std::pair<v3s16, u8> > *plist,
std::vector<std::pair<s16, u8> > *splist);
diff --git a/src/script/lua_api/l_mapgen.cpp b/src/script/lua_api/l_mapgen.cpp
index a7af856de..d34620056 100644
--- a/src/script/lua_api/l_mapgen.cpp
+++ b/src/script/lua_api/l_mapgen.cpp
@@ -599,9 +599,8 @@ int ModApiMapgen::l_place_schematic(lua_State *L)
dschem.rotation = (Rotation)rot;
if (lua_istable(L, 4)) {
- int index = 4;
lua_pushnil(L);
- while (lua_next(L, index) != 0) {
+ 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);
@@ -615,6 +614,10 @@ int ModApiMapgen::l_place_schematic(lua_State *L)
}
}
+ bool force_placement = true;
+ if (lua_isboolean(L, 5))
+ force_placement = lua_toboolean(L, 5);
+
if (!dschem.filename.empty()) {
if (!dschem.loadSchematicFile()) {
errorstream << "place_schematic: failed to load schematic file '"
@@ -624,7 +627,7 @@ int ModApiMapgen::l_place_schematic(lua_State *L)
dschem.resolveNodeNames(ndef);
}
- dschem.placeStructure(map, p);
+ dschem.placeStructure(map, p, force_placement);
return 1;
}