aboutsummaryrefslogtreecommitdiff
path: root/src/script/lua_api
diff options
context:
space:
mode:
authorkwolekr <kwolekr@minetest.net>2015-11-04 03:33:12 -0500
committerkwolekr <kwolekr@minetest.net>2015-11-05 01:18:32 -0500
commit1384108f8c32f309852c1d1665a613f2a3e3fcc2 (patch)
treea5a2c9295db4d31ed1e17ec5845a24b54a911ef0 /src/script/lua_api
parent732cabee193c101fb59c9f3a6c181b32d77fe37d (diff)
downloadminetest-1384108f8c32f309852c1d1665a613f2a3e3fcc2.tar.gz
minetest-1384108f8c32f309852c1d1665a613f2a3e3fcc2.tar.bz2
minetest-1384108f8c32f309852c1d1665a613f2a3e3fcc2.zip
Schematics: Add core.place_schematic_on_vmanip API
Fix memory leak in minetest.place_schematic Slightly refactor Schematic code
Diffstat (limited to 'src/script/lua_api')
-rw-r--r--src/script/lua_api/l_mapgen.cpp45
-rw-r--r--src/script/lua_api/l_mapgen.h6
2 files changed, 49 insertions, 2 deletions
diff --git a/src/script/lua_api/l_mapgen.cpp b/src/script/lua_api/l_mapgen.cpp
index 7adb6a534..d5cf54f24 100644
--- a/src/script/lua_api/l_mapgen.cpp
+++ b/src/script/lua_api/l_mapgen.cpp
@@ -1271,12 +1271,54 @@ int ModApiMapgen::l_place_schematic(lua_State *L)
return 0;
}
- schem->placeStructure(map, p, 0, (Rotation)rot, force_placement);
+ schem->placeOnMap(map, p, 0, (Rotation)rot, force_placement);
lua_pushboolean(L, true);
return 1;
}
+int ModApiMapgen::l_place_schematic_on_vmanip(lua_State *L)
+{
+ NO_MAP_LOCK_REQUIRED;
+
+ SchematicManager *schemmgr = getServer(L)->getEmergeManager()->schemmgr;
+
+ //// Read VoxelManip object
+ MMVManip *vm = LuaVoxelManip::checkobject(L, 1)->vm;
+
+ //// Read position
+ v3s16 p = check_v3s16(L, 2);
+
+ //// Read rotation
+ int rot = ROTATE_0;
+ const char *enumstr = lua_tostring(L, 4);
+ if (enumstr)
+ string_to_enum(es_Rotation, rot, std::string(enumstr));
+
+ //// Read force placement
+ bool force_placement = true;
+ if (lua_isboolean(L, 6))
+ force_placement = lua_toboolean(L, 6);
+
+ //// Read node replacements
+ StringMap replace_names;
+ if (lua_istable(L, 5))
+ read_schematic_replacements(L, 5, &replace_names);
+
+ //// Read schematic
+ Schematic *schem = get_or_load_schematic(L, 3, schemmgr, &replace_names);
+ if (!schem) {
+ errorstream << "place_schematic: failed to get schematic" << std::endl;
+ return 0;
+ }
+
+ bool schematic_did_fit = schem->placeOnVManip(
+ vm, p, 0, (Rotation)rot, force_placement);
+
+ lua_pushboolean(L, schematic_did_fit);
+ return 1;
+}
+
// serialize_schematic(schematic, format, options={...})
int ModApiMapgen::l_serialize_schematic(lua_State *L)
{
@@ -1355,5 +1397,6 @@ void ModApiMapgen::Initialize(lua_State *L, int top)
API_FCT(generate_decorations);
API_FCT(create_schematic);
API_FCT(place_schematic);
+ API_FCT(place_schematic_on_vmanip);
API_FCT(serialize_schematic);
}
diff --git a/src/script/lua_api/l_mapgen.h b/src/script/lua_api/l_mapgen.h
index 4768f934d..9751c0db6 100644
--- a/src/script/lua_api/l_mapgen.h
+++ b/src/script/lua_api/l_mapgen.h
@@ -85,9 +85,13 @@ private:
// create_schematic(p1, p2, probability_list, filename)
static int l_create_schematic(lua_State *L);
- // place_schematic(p, schematic, rotation, replacement)
+ // place_schematic(p, schematic, rotation, replacements, force_placement)
static int l_place_schematic(lua_State *L);
+ // place_schematic_on_vmanip(vm, p, schematic,
+ // rotation, replacements, force_placement)
+ static int l_place_schematic_on_vmanip(lua_State *L);
+
// serialize_schematic(schematic, format, options={...})
static int l_serialize_schematic(lua_State *L);