From f3eefeb7948b8b8d1a98f2f89baa39abc807f72d Mon Sep 17 00:00:00 2001
From: kwolekr <kwolekr@minetest.net>
Date: Mon, 1 Sep 2014 17:33:21 -0400
Subject: [PATCH] Add LuaVoxelManip methods: get_node_at() and set_node_at()

---
 doc/lua_api.txt                 |  2 ++
 src/script/lua_api/l_env.cpp    |  3 +--
 src/script/lua_api/l_vmanip.cpp | 39 +++++++++++++++++++++++++++++----
 src/script/lua_api/l_vmanip.h   |  3 +++
 4 files changed, 41 insertions(+), 6 deletions(-)

diff --git a/doc/lua_api.txt b/doc/lua_api.txt
index 46b789526..5fd10d418 100644
--- a/doc/lua_api.txt
+++ b/doc/lua_api.txt
@@ -2077,6 +2077,8 @@ methods:
   ^ returns actual emerged pmin, actual emerged pmax
 - write_to_map():  Writes the data loaded from the VoxelManip back to the map.
   ^ important: data must be set using VoxelManip:set_data before calling this
+- get_node_at(pos): Returns a MapNode table of the node currently loaded in the VoxelManip at that position
+- set_node_at(pos, node): Sets a specific MapNode in the VoxelManip at that position
 - get_data():  Gets the data read into the VoxelManip object
   ^ returns raw node data is in the form of an array of node content ids
 - set_data(data):  Sets the data contents of the VoxelManip object
diff --git a/src/script/lua_api/l_env.cpp b/src/script/lua_api/l_env.cpp
index deeb5966f..fedaccd0f 100644
--- a/src/script/lua_api/l_env.cpp
+++ b/src/script/lua_api/l_env.cpp
@@ -35,10 +35,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "treegen.h"
 #include "pathfinder.h"
 
-
 #define GET_ENV_PTR ServerEnvironment* env =                                   \
 				dynamic_cast<ServerEnvironment*>(getEnv(L));                   \
-				if( env == NULL) return 0
+				if (env == NULL) return 0
 
 ///////////////////////////////////////////////////////////////////////////////
 
diff --git a/src/script/lua_api/l_vmanip.cpp b/src/script/lua_api/l_vmanip.cpp
index 2a3cfcafa..554a57343 100644
--- a/src/script/lua_api/l_vmanip.cpp
+++ b/src/script/lua_api/l_vmanip.cpp
@@ -20,6 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 
 #include "lua_api/l_vmanip.h"
 #include "lua_api/l_internal.h"
+#include "common/c_content.h"
 #include "common/c_converter.h"
 #include "emerge.h"
 #include "environment.h"
@@ -27,6 +28,10 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "server.h"
 #include "mapgen.h"
 
+#define GET_ENV_PTR ServerEnvironment* env =                                   \
+				dynamic_cast<ServerEnvironment*>(getEnv(L));                   \
+				if (env == NULL) return 0
+
 // garbage collector
 int LuaVoxelManip::gc_object(lua_State *L)
 {
@@ -105,13 +110,37 @@ int LuaVoxelManip::l_write_to_map(lua_State *L)
 	return 0;
 }
 
-int LuaVoxelManip::l_update_liquids(lua_State *L)
+int LuaVoxelManip::l_get_node_at(lua_State *L)
 {
+	NO_MAP_LOCK_REQUIRED;
+	GET_ENV_PTR;
+
 	LuaVoxelManip *o = checkobject(L, 1);
+	v3s16 pos        = read_v3s16(L, 2);
 
-	Environment *env = getEnv(L);
-	if (!env)
-		return 0;
+	pushnode(L, o->vm->getNodeNoExNoEmerge(pos), env->getGameDef()->ndef());
+	return 1;
+}
+
+int LuaVoxelManip::l_set_node_at(lua_State *L)
+{
+	NO_MAP_LOCK_REQUIRED;
+	GET_ENV_PTR;
+
+	LuaVoxelManip *o = checkobject(L, 1);
+	v3s16 pos        = read_v3s16(L, 2);
+	MapNode n        = readnode(L, 3, env->getGameDef()->ndef());
+
+	o->vm->setNodeNoEmerge(pos, n);
+
+	return 0;
+}
+
+int LuaVoxelManip::l_update_liquids(lua_State *L)
+{
+	GET_ENV_PTR;
+
+	LuaVoxelManip *o = checkobject(L, 1);
 
 	Map *map = &(env->getMap());
 	INodeDefManager *ndef = getServer(L)->getNodeDefManager();
@@ -399,6 +428,8 @@ const luaL_reg LuaVoxelManip::methods[] = {
 	luamethod(LuaVoxelManip, read_from_map),
 	luamethod(LuaVoxelManip, get_data),
 	luamethod(LuaVoxelManip, set_data),
+	luamethod(LuaVoxelManip, get_node_at),
+	luamethod(LuaVoxelManip, set_node_at),
 	luamethod(LuaVoxelManip, write_to_map),
 	luamethod(LuaVoxelManip, update_map),
 	luamethod(LuaVoxelManip, update_liquids),
diff --git a/src/script/lua_api/l_vmanip.h b/src/script/lua_api/l_vmanip.h
index 70468b344..608b55556 100644
--- a/src/script/lua_api/l_vmanip.h
+++ b/src/script/lua_api/l_vmanip.h
@@ -47,6 +47,9 @@ class LuaVoxelManip : public ModApiBase {
 	static int l_set_data(lua_State *L);
 	static int l_write_to_map(lua_State *L);
 
+	static int l_get_node_at(lua_State *L);
+	static int l_set_node_at(lua_State *L);
+
 	static int l_update_map(lua_State *L);
 	static int l_update_liquids(lua_State *L);
 
-- 
GitLab