From c1638590577d487e620f9a037727b91a0f62ceea Mon Sep 17 00:00:00 2001 From: kwolekr Date: Sat, 15 Feb 2014 19:46:57 -0500 Subject: [PATCH] Schematic: Add force_placement parameter to minetest.place_structure API --- doc/lua_api.txt | 4 +++- src/mapgen.cpp | 4 ++-- src/mapgen.h | 2 +- src/script/lua_api/l_mapgen.cpp | 9 ++++++--- 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/doc/lua_api.txt b/doc/lua_api.txt index 4e645ada..0e2f6360 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 95a2f402..a7e9d2e0 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 lighting_modified_blocks; std::map modified_blocks; diff --git a/src/mapgen.h b/src/mapgen.h index 037cdd1f..9bc162fe 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 > *plist, std::vector > *splist); diff --git a/src/script/lua_api/l_mapgen.cpp b/src/script/lua_api/l_mapgen.cpp index a7af856d..d3462005 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; }