diff options
author | kwolekr <kwolekr@minetest.net> | 2015-11-04 03:33:12 -0500 |
---|---|---|
committer | kwolekr <kwolekr@minetest.net> | 2015-11-05 01:18:32 -0500 |
commit | 1384108f8c32f309852c1d1665a613f2a3e3fcc2 (patch) | |
tree | a5a2c9295db4d31ed1e17ec5845a24b54a911ef0 /src/script/lua_api | |
parent | 732cabee193c101fb59c9f3a6c181b32d77fe37d (diff) | |
download | minetest-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.cpp | 45 | ||||
-rw-r--r-- | src/script/lua_api/l_mapgen.h | 6 |
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); |