From 54bfbd217905bd58aeb1a0f3e0bf12f3942be557 Mon Sep 17 00:00:00 2001 From: red-001 Date: Mon, 30 Jan 2017 19:10:37 +0000 Subject: [PATCH] [CSM] Add `get_node` and `get_node_or_nil` --- clientmods/preview/init.lua | 10 ++++++++- doc/client_lua_api.txt | 8 ++++++- src/client.cpp | 5 +++++ src/client.h | 1 + src/script/lua_api/l_client.cpp | 37 +++++++++++++++++++++++++++++++++ src/script/lua_api/l_client.h | 8 +++++++ 6 files changed, 67 insertions(+), 2 deletions(-) diff --git a/clientmods/preview/init.lua b/clientmods/preview/init.lua index 77fb8ba2675f..5557b68333d7 100644 --- a/clientmods/preview/init.lua +++ b/clientmods/preview/init.lua @@ -37,6 +37,14 @@ core.register_chatcommand("dump", { end, }) +core.register_chatcommand("test_node", { + func = function(param) + core.display_chat_message(dump(core.get_node({x=0, y=0, z=0}))) + core.display_chat_message(dump(core.get_node_or_nil({x=0, y=0, z=0}))) + end, +}) + + core.after(2, function() print("After 2") end) @@ -45,4 +53,4 @@ core.register_on_dignode(function(pos, node) print("pos:" .. dump(pos)) print("node:" .. dump(node)) return false -end) \ No newline at end of file +end) diff --git a/doc/client_lua_api.txt b/doc/client_lua_api.txt index 886dbc6e1ce4..7b24452e83eb 100644 --- a/doc/client_lua_api.txt +++ b/doc/client_lua_api.txt @@ -717,7 +717,13 @@ Call these functions only at load time! * `minetest.after(time, func, ...)` * Call the function `func` after `time` seconds, may be fractional * Optional: Variable number of arguments that are passed to `func` - +### Map +* `minetest.get_node(pos)` + * Returns the node at the given position as table in the format + `{name="node_name", param1=0, param2=0}`, returns `{name="ignore", param1=0, param2=0}` + for unloaded areas. +* `minetest.get_node_or_nil(pos)` + * Same as `get_node` but returns `nil` for unloaded areas. ### Misc. * `minetest.parse_json(string[, nullvalue])`: returns something * Convert a string containing JSON data into the Lua equivalent diff --git a/src/client.cpp b/src/client.cpp index 4bb63fef1302..049616c63c9d 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -1447,6 +1447,11 @@ void Client::removeNode(v3s16 p) } } +MapNode Client::getNode(v3s16 p, bool *is_valid_position) +{ + return m_env.getMap().getNodeNoEx(p, is_valid_position); +} + void Client::addNode(v3s16 p, MapNode n, bool remove_metadata) { //TimeTaker timer1("Client::addNode()"); diff --git a/src/client.h b/src/client.h index 9b7130268be5..dc4469350283 100644 --- a/src/client.h +++ b/src/client.h @@ -441,6 +441,7 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef // Causes urgent mesh updates (unlike Map::add/removeNodeWithEvent) void removeNode(v3s16 p); + MapNode getNode(v3s16 p, bool *is_valid_position); void addNode(v3s16 p, MapNode n, bool remove_metadata = true); void setPlayerControl(PlayerControl &control); diff --git a/src/script/lua_api/l_client.cpp b/src/script/lua_api/l_client.cpp index 9a04bd02ff9a..41e33889cc45 100644 --- a/src/script/lua_api/l_client.cpp +++ b/src/script/lua_api/l_client.cpp @@ -23,6 +23,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "util/string.h" #include "cpp_api/s_base.h" #include "gettext.h" +#include "common/c_converter.h" +#include "common/c_content.h" int ModApiClient::l_get_current_modname(lua_State *L) { @@ -97,6 +99,39 @@ int ModApiClient::l_gettext(lua_State *L) return 1; } +// get_node(pos) +// pos = {x=num, y=num, z=num} +int ModApiClient::l_get_node(lua_State *L) +{ + // pos + v3s16 pos = read_v3s16(L, 1); + // Do it + bool pos_ok; + MapNode n = getClient(L)->getNode(pos, &pos_ok); + // Return node + pushnode(L, n, getClient(L)->ndef()); + return 1; +} + +// get_node_or_nil(pos) +// pos = {x=num, y=num, z=num} +int ModApiClient::l_get_node_or_nil(lua_State *L) +{ + // pos + v3s16 pos = read_v3s16(L, 1); + // Do it + bool pos_ok; + MapNode n = getClient(L)->getNode(pos, &pos_ok); + if (pos_ok) { + // Return node + pushnode(L, n, getClient(L)->ndef()); + } + else { + lua_pushnil(L); + } + return 1; +} + void ModApiClient::Initialize(lua_State *L, int top) { API_FCT(get_current_modname); @@ -106,4 +141,6 @@ void ModApiClient::Initialize(lua_State *L, int top) API_FCT(show_formspec); API_FCT(send_respawn); API_FCT(gettext); + API_FCT(get_node); + API_FCT(get_node_or_nil); } diff --git a/src/script/lua_api/l_client.h b/src/script/lua_api/l_client.h index 14ef5aecce94..3bb11505e0fc 100644 --- a/src/script/lua_api/l_client.h +++ b/src/script/lua_api/l_client.h @@ -48,6 +48,14 @@ class ModApiClient: // set_last_run_mod(modname) static int l_set_last_run_mod(lua_State *L); + // get_node(pos) + static int l_get_node(lua_State *L); + + // get_node_or_nil(pos) + static int l_get_node_or_nil(lua_State *L); + + + public: static void Initialize(lua_State *L, int top); };