From 9736548720a96c9c7f739edb0435d9ba4ad80652 Mon Sep 17 00:00:00 2001 From: kwolekr Date: Thu, 15 Jan 2015 16:20:05 -0500 Subject: Add ability to delete MapBlocks from map Also add a Lua API and chatcommand for this --- src/script/lua_api/l_env.cpp | 35 ++++++++++++++++++++++++++++++++++- src/script/lua_api/l_env.h | 13 ++++++++----- 2 files changed, 42 insertions(+), 6 deletions(-) (limited to 'src/script') diff --git a/src/script/lua_api/l_env.cpp b/src/script/lua_api/l_env.cpp index c8c1ca0e1..cd5d253ac 100644 --- a/src/script/lua_api/l_env.cpp +++ b/src/script/lua_api/l_env.cpp @@ -657,7 +657,8 @@ int ModApiEnvMod::l_clear_objects(lua_State *L) } // line_of_sight(pos1, pos2, stepsize) -> true/false, pos -int ModApiEnvMod::l_line_of_sight(lua_State *L) { +int ModApiEnvMod::l_line_of_sight(lua_State *L) +{ float stepsize = 1.0; GET_ENV_PTR; @@ -681,6 +682,37 @@ int ModApiEnvMod::l_line_of_sight(lua_State *L) { return 1; } +// delete_area(p1, p2) +// delete mapblocks in area p1..p2 +int ModApiEnvMod::l_delete_area(lua_State *L) +{ + GET_ENV_PTR; + + v3s16 bpmin = getNodeBlockPos(read_v3s16(L, 1)); + v3s16 bpmax = getNodeBlockPos(read_v3s16(L, 2)); + sortBoxVerticies(bpmin, bpmax); + + ServerMap &map = env->getServerMap(); + + MapEditEvent event; + event.type = MEET_OTHER; + + bool success = true; + for (s16 z = bpmin.Z; z <= bpmax.Z; z++) + for (s16 y = bpmin.Y; y <= bpmax.Y; y++) + for (s16 x = bpmin.X; x <= bpmax.X; x++) { + v3s16 bp(x, y, z); + if (map.deleteBlock(bp)) + event.modified_blocks.insert(bp); + else + success = false; + } + + map.dispatchEvent(&event); + lua_pushboolean(L, success); + return 1; +} + // find_path(pos1, pos2, searchdistance, // max_jump, max_drop, algorithm) -> table containing path int ModApiEnvMod::l_find_path(lua_State *L) @@ -849,6 +881,7 @@ void ModApiEnvMod::Initialize(lua_State *L, int top) API_FCT(get_gametime); API_FCT(find_node_near); API_FCT(find_nodes_in_area); + API_FCT(delete_area); API_FCT(get_perlin); API_FCT(get_perlin_map); API_FCT(get_voxel_manip); diff --git a/src/script/lua_api/l_env.h b/src/script/lua_api/l_env.h index 76c6594ab..bfaea1c4d 100644 --- a/src/script/lua_api/l_env.h +++ b/src/script/lua_api/l_env.h @@ -34,7 +34,7 @@ private: // remove_node(pos) // pos = {x=num, y=num, z=num} static int l_remove_node(lua_State *L); - + // swap_node(pos, node) // pos = {x=num, y=num, z=num} static int l_swap_node(lua_State *L); @@ -119,6 +119,9 @@ private: // nodenames: eg. {"ignore", "group:tree"} or "default:dirt" static int l_find_nodes_in_area(lua_State *L); + // delete_area(p1, p2) -> true/false + static int l_delete_area(lua_State *L); + // get_perlin(seeddiff, octaves, persistence, scale) // returns world-specific PerlinNoise static int l_get_perlin(lua_State *L); @@ -126,11 +129,11 @@ private: // get_perlin_map(noiseparams, size) // returns world-specific PerlinNoiseMap static int l_get_perlin_map(lua_State *L); - + // get_voxel_manip() // returns world-specific voxel manipulator static int l_get_voxel_manip(lua_State *L); - + // clear_objects() // clear all objects in the environment static int l_clear_objects(lua_State *L); @@ -151,11 +154,11 @@ private: // forceload_block(blockpos) // forceloads a block static int l_forceload_block(lua_State *L); - + // forceload_free_block(blockpos) // stops forceloading a position static int l_forceload_free_block(lua_State *L); - + // get us precision time static int l_get_us_time(lua_State *L); -- cgit v1.2.3