aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorred-001 <red-001@outlook.ie>2017-01-30 19:10:37 +0000
committerLoïc Blot <nerzhul@users.noreply.github.com>2017-03-13 23:56:05 +0100
commit37df9cb7d764891f29b433e80a0d5663fee1a94f (patch)
treeefed423ad2021439267eb5e1e8719fb8514ea6d7
parent073f5cf03d95ce1cdf04ce8a0adcaf1fc571d95f (diff)
downloadminetest-37df9cb7d764891f29b433e80a0d5663fee1a94f.tar.gz
minetest-37df9cb7d764891f29b433e80a0d5663fee1a94f.tar.bz2
minetest-37df9cb7d764891f29b433e80a0d5663fee1a94f.zip
[CSM] Add `get_node` and `get_node_or_nil`
-rw-r--r--clientmods/preview/init.lua10
-rw-r--r--doc/client_lua_api.txt8
-rw-r--r--src/client.cpp5
-rw-r--r--src/client.h1
-rw-r--r--src/script/lua_api/l_client.cpp37
-rw-r--r--src/script/lua_api/l_client.h8
6 files changed, 67 insertions, 2 deletions
diff --git a/clientmods/preview/init.lua b/clientmods/preview/init.lua
index 3085eda24..91b12d810 100644
--- a/clientmods/preview/init.lua
+++ b/clientmods/preview/init.lua
@@ -39,6 +39,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("[PREVIEW] loaded " .. modname .. " mod")
end)
@@ -47,4 +55,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 886dbc6e1..7b24452e8 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 4bb63fef1..049616c63 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 9b7130268..dc4469350 100644
--- a/src/client.h
+++ b/src/client.h
@@ -441,6 +441,7 @@ public:
// 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 9a04bd02f..41e33889c 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 d0e230630..207a5bca0 100644
--- a/src/script/lua_api/l_client.h
+++ b/src/script/lua_api/l_client.h
@@ -47,6 +47,14 @@ private:
// 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);
};