X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fscript%2Flua_api%2Fl_env.cpp;h=7ea8b64b5be4d334170b9c9367c17da37ca85281;hb=3face01a202040e4feff3b0936b4aa89c051c98d;hp=1d0716484c67cac0e1d4e28537cd9c55e9312284;hpb=17fd5fe9358615633a04d7a3941b444a8ce5f199;p=dragonfireclient.git diff --git a/src/script/lua_api/l_env.cpp b/src/script/lua_api/l_env.cpp index 1d0716484..7ea8b64b5 100644 --- a/src/script/lua_api/l_env.cpp +++ b/src/script/lua_api/l_env.cpp @@ -34,7 +34,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "daynightratio.h" #include "util/pointedthing.h" #include "content_sao.h" -#include "treegen.h" +#include "mapgen/treegen.h" #include "emerge.h" #include "pathfinder.h" #include "face_position_cache.h" @@ -263,7 +263,7 @@ int ModApiEnvMod::l_set_node(lua_State *L) { GET_ENV_PTR; - INodeDefManager *ndef = env->getGameDef()->ndef(); + const NodeDefManager *ndef = env->getGameDef()->ndef(); // parameters v3s16 pos = read_v3s16(L, 1); MapNode n = readnode(L, 2, ndef); @@ -273,6 +273,39 @@ int ModApiEnvMod::l_set_node(lua_State *L) return 1; } +// bulk_set_node([pos1, pos2, ...], node) +// pos = {x=num, y=num, z=num} +int ModApiEnvMod::l_bulk_set_node(lua_State *L) +{ + GET_ENV_PTR; + + const NodeDefManager *ndef = env->getGameDef()->ndef(); + // parameters + if (!lua_istable(L, 1)) { + return 0; + } + + s32 len = lua_objlen(L, 1); + if (len == 0) { + lua_pushboolean(L, true); + return 1; + } + + MapNode n = readnode(L, 2, ndef); + + // Do it + bool succeeded = true; + for (s32 i = 1; i <= len; i++) { + lua_rawgeti(L, 1, i); + if (!env->setNode(read_v3s16(L, -1), n)) + succeeded = false; + lua_pop(L, 1); + } + + lua_pushboolean(L, succeeded); + return 1; +} + int ModApiEnvMod::l_add_node(lua_State *L) { return l_set_node(L); @@ -298,7 +331,7 @@ int ModApiEnvMod::l_swap_node(lua_State *L) { GET_ENV_PTR; - INodeDefManager *ndef = env->getGameDef()->ndef(); + const NodeDefManager *ndef = env->getGameDef()->ndef(); // parameters v3s16 pos = read_v3s16(L, 1); MapNode n = readnode(L, 2, ndef); @@ -361,7 +394,7 @@ int ModApiEnvMod::l_get_node_light(lua_State *L) bool is_position_ok; MapNode n = env->getMap().getNodeNoEx(pos, &is_position_ok); if (is_position_ok) { - INodeDefManager *ndef = env->getGameDef()->ndef(); + const NodeDefManager *ndef = env->getGameDef()->ndef(); lua_pushinteger(L, n.getLightBlend(dnr, ndef)); } else { lua_pushnil(L); @@ -377,7 +410,7 @@ int ModApiEnvMod::l_place_node(lua_State *L) ScriptApiItem *scriptIfaceItem = getScriptApi(L); Server *server = getServer(L); - INodeDefManager *ndef = server->ndef(); + const NodeDefManager *ndef = server->ndef(); IItemDefManager *idef = server->idef(); v3s16 pos = read_v3s16(L, 1); @@ -396,9 +429,8 @@ int ModApiEnvMod::l_place_node(lua_State *L) pointed.type = POINTEDTHING_NODE; pointed.node_abovesurface = pos; pointed.node_undersurface = pos + v3s16(0,-1,0); - // Place it with a NULL placer (appears in Lua as a non-functional - // ObjectRef) - bool success = scriptIfaceItem->item_OnPlace(item, NULL, pointed); + // Place it with a NULL placer (appears in Lua as nil) + bool success = scriptIfaceItem->item_OnPlace(item, nullptr, pointed); lua_pushboolean(L, success); return 1; } @@ -642,7 +674,7 @@ int ModApiEnvMod::l_get_objects_inside_radius(lua_State *L) std::vector::const_iterator iter = ids.begin(); for(u32 i = 0; iter != ids.end(); ++iter) { ServerActiveObject *obj = env->getActiveObject(*iter); - if (!obj->m_removed) { + if (!obj->isGone()) { // Insert object reference into table script->objectrefGetOrCreate(L, obj); lua_rawseti(L, -2, ++i); @@ -716,7 +748,7 @@ int ModApiEnvMod::l_find_node_near(lua_State *L) return 0; } - INodeDefManager *ndef = getGameDef(L)->ndef(); + const NodeDefManager *ndef = getGameDef(L)->ndef(); v3s16 pos = read_v3s16(L, 1); int radius = luaL_checkinteger(L, 2); std::vector filter; @@ -763,7 +795,7 @@ int ModApiEnvMod::l_find_nodes_in_area(lua_State *L) { GET_ENV_PTR; - INodeDefManager *ndef = getServer(L)->ndef(); + const NodeDefManager *ndef = getServer(L)->ndef(); v3s16 minp = read_v3s16(L, 1); v3s16 maxp = read_v3s16(L, 2); sortBoxVerticies(minp, maxp); @@ -835,7 +867,7 @@ int ModApiEnvMod::l_find_nodes_in_area_under_air(lua_State *L) GET_ENV_PTR; - INodeDefManager *ndef = getServer(L)->ndef(); + const NodeDefManager *ndef = getServer(L)->ndef(); v3s16 minp = read_v3s16(L, 1); v3s16 maxp = read_v3s16(L, 2); sortBoxVerticies(minp, maxp); @@ -957,7 +989,7 @@ int ModApiEnvMod::l_clear_objects(lua_State *L) { GET_ENV_PTR; - ClearObjectsMode mode = CLEAR_OBJECTS_MODE_FULL; + ClearObjectsMode mode = CLEAR_OBJECTS_MODE_QUICK; if (lua_istable(L, 1)) { mode = (ClearObjectsMode)getenumfield(L, 1, "mode", ModApiEnvMod::es_ClearObjectsMode, mode); @@ -967,24 +999,19 @@ int ModApiEnvMod::l_clear_objects(lua_State *L) return 0; } -// line_of_sight(pos1, pos2, stepsize) -> true/false, pos +// line_of_sight(pos1, pos2) -> true/false, pos int ModApiEnvMod::l_line_of_sight(lua_State *L) { - float stepsize = 1.0; - GET_ENV_PTR; // read position 1 from lua v3f pos1 = checkFloatPos(L, 1); // read position 2 from lua v3f pos2 = checkFloatPos(L, 2); - //read step size from lua - if (lua_isnumber(L, 3)) { - stepsize = lua_tonumber(L, 3); - } v3s16 p; - bool success = env->line_of_sight(pos1, pos2, stepsize, &p); + + bool success = env->line_of_sight(pos1, pos2, &p); lua_pushboolean(L, success); if (!success) { push_v3s16(L, p); @@ -1155,7 +1182,7 @@ int ModApiEnvMod::l_spawn_tree(lua_State *L) treegen::TreeDef tree_def; std::string trunk,leaves,fruit; - INodeDefManager *ndef = env->getGameDef()->ndef(); + const NodeDefManager *ndef = env->getGameDef()->ndef(); if(lua_istable(L, 2)) { @@ -1238,6 +1265,7 @@ int ModApiEnvMod::l_forceload_free_block(lua_State *L) void ModApiEnvMod::Initialize(lua_State *L, int top) { API_FCT(set_node); + API_FCT(bulk_set_node); API_FCT(add_node); API_FCT(swap_node); API_FCT(add_item);