From e734b3f0d8055ff3ae710f3632726a711603bf84 Mon Sep 17 00:00:00 2001 From: sfan5 Date: Sat, 24 Feb 2024 09:49:42 +0100 Subject: [PATCH] Fix core.get_node_or_nil in emerge env "ignore" does not mean unloaded, we have to properly check it. --- builtin/emerge/env.lua | 5 ----- src/script/lua_api/l_env.cpp | 14 ++++++++++++++ src/script/lua_api/l_env.h | 3 +++ 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/builtin/emerge/env.lua b/builtin/emerge/env.lua index 43848082a..2b32a0339 100644 --- a/builtin/emerge/env.lua +++ b/builtin/emerge/env.lua @@ -31,11 +31,6 @@ function core.get_node(pos) return core.vmanip:get_node_at(pos) end -function core.get_node_or_nil(pos) - local node = core.vmanip:get_node_at(pos) - return node.name ~= "ignore" and node -end - function core.get_perlin(seed, octaves, persist, spread) local params if type(seed) == "table" then diff --git a/src/script/lua_api/l_env.cpp b/src/script/lua_api/l_env.cpp index 3b9be8314..1fc640d23 100644 --- a/src/script/lua_api/l_env.cpp +++ b/src/script/lua_api/l_env.cpp @@ -1534,6 +1534,19 @@ void ModApiEnv::InitializeClient(lua_State *L, int top) if (!vm) \ return 0 +// get_node_or_nil(pos) +int ModApiEnvVM::l_get_node_or_nil(lua_State *L) +{ + GET_VM_PTR; + + v3s16 pos = read_v3s16(L, 1); + if (vm->exists(pos)) + pushnode(L, vm->getNodeRefUnsafe(pos)); + else + lua_pushnil(L); + return 1; +} + // get_node_max_level(pos) int ModApiEnvVM::l_get_node_max_level(lua_State *L) { @@ -1703,6 +1716,7 @@ MMVManip *ModApiEnvVM::getVManip(lua_State *L) void ModApiEnvVM::InitializeEmerge(lua_State *L, int top) { // other, more trivial functions are in builtin/emerge/env.lua + API_FCT(get_node_or_nil); API_FCT(get_node_max_level); API_FCT(get_node_level); API_FCT(set_node_level); diff --git a/src/script/lua_api/l_env.h b/src/script/lua_api/l_env.h index ad4ac2d73..f657424d0 100644 --- a/src/script/lua_api/l_env.h +++ b/src/script/lua_api/l_env.h @@ -247,6 +247,9 @@ public: class ModApiEnvVM : public ModApiEnvBase { private: + // get_node_or_nil(pos) + static int l_get_node_or_nil(lua_State *L); + // get_node_max_level(pos) static int l_get_node_max_level(lua_State *L);