From 9fa547bb8013e78991c362b73111a134216307a0 Mon Sep 17 00:00:00 2001
From: SmallJoker <mk939@ymail.com>
Date: Sat, 31 Mar 2018 13:47:19 +0200
Subject: Run callback in IDropAction, refactor function arguments

---
 src/script/cpp_api/s_inventory.cpp | 114 ++++++++++++++--------------------
 src/script/cpp_api/s_inventory.h   |  25 +++-----
 src/script/cpp_api/s_nodemeta.cpp  | 122 ++++++++++++++++++-------------------
 src/script/cpp_api/s_nodemeta.h    |  31 +++++-----
 src/script/cpp_api/s_player.cpp    |  52 +++++++---------
 src/script/cpp_api/s_player.h      |  29 +++------
 6 files changed, 162 insertions(+), 211 deletions(-)

(limited to 'src/script/cpp_api')

diff --git a/src/script/cpp_api/s_inventory.cpp b/src/script/cpp_api/s_inventory.cpp
index 251ddb221..e9c09f72e 100644
--- a/src/script/cpp_api/s_inventory.cpp
+++ b/src/script/cpp_api/s_inventory.cpp
@@ -26,33 +26,29 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 
 // Return number of accepted items to be moved
 int ScriptApiDetached::detached_inventory_AllowMove(
-		const std::string &name,
-		const std::string &from_list, int from_index,
-		const std::string &to_list, int to_index,
-		int count, ServerActiveObject *player)
+		const MoveAction &ma, int count,
+		ServerActiveObject *player)
 {
 	SCRIPTAPI_PRECHECKHEADER
 
 	int error_handler = PUSH_ERROR_HANDLER(L);
 
 	// Push callback function on stack
-	if (!getDetachedInventoryCallback(name, "allow_move"))
+	if (!getDetachedInventoryCallback(ma.from_inv.name, "allow_move"))
 		return count;
 
 	// function(inv, from_list, from_index, to_list, to_index, count, player)
 	// inv
-	InventoryLocation loc;
-	loc.setDetached(name);
-	InvRef::create(L, loc);
-	lua_pushstring(L, from_list.c_str()); // from_list
-	lua_pushinteger(L, from_index + 1);   // from_index
-	lua_pushstring(L, to_list.c_str());   // to_list
-	lua_pushinteger(L, to_index + 1);     // to_index
-	lua_pushinteger(L, count);            // count
-	objectrefGetOrCreate(L, player);      // player
+	InvRef::create(L, ma.from_inv);
+	lua_pushstring(L, ma.from_list.c_str()); // from_list
+	lua_pushinteger(L, ma.from_i + 1);       // from_index
+	lua_pushstring(L, ma.to_list.c_str());   // to_list
+	lua_pushinteger(L, ma.to_i + 1);         // to_index
+	lua_pushinteger(L, count);               // count
+	objectrefGetOrCreate(L, player);         // player
 	PCALL_RES(lua_pcall(L, 7, 1, error_handler));
 	if(!lua_isnumber(L, -1))
-		throw LuaError("allow_move should return a number. name=" + name);
+		throw LuaError("allow_move should return a number. name=" + ma.from_inv.name);
 	int ret = luaL_checkinteger(L, -1);
 	lua_pop(L, 2); // Pop integer and error handler
 	return ret;
@@ -60,8 +56,7 @@ int ScriptApiDetached::detached_inventory_AllowMove(
 
 // Return number of accepted items to be put
 int ScriptApiDetached::detached_inventory_AllowPut(
-		const std::string &name,
-		const std::string &listname, int index, ItemStack &stack,
+		const MoveAction &ma, const ItemStack &stack,
 		ServerActiveObject *player)
 {
 	SCRIPTAPI_PRECHECKHEADER
@@ -69,20 +64,18 @@ int ScriptApiDetached::detached_inventory_AllowPut(
 	int error_handler = PUSH_ERROR_HANDLER(L);
 
 	// Push callback function on stack
-	if (!getDetachedInventoryCallback(name, "allow_put"))
+	if (!getDetachedInventoryCallback(ma.to_inv.name, "allow_put"))
 		return stack.count; // All will be accepted
 
 	// Call function(inv, listname, index, stack, player)
-	InventoryLocation loc;
-	loc.setDetached(name);
-	InvRef::create(L, loc);              // inv
-	lua_pushstring(L, listname.c_str()); // listname
-	lua_pushinteger(L, index + 1);       // index
+	InvRef::create(L, ma.to_inv);          // inv
+	lua_pushstring(L, ma.to_list.c_str()); // listname
+	lua_pushinteger(L, ma.to_i + 1);       // index
 	LuaItemStack::create(L, stack);      // stack
 	objectrefGetOrCreate(L, player);     // player
 	PCALL_RES(lua_pcall(L, 5, 1, error_handler));
 	if (!lua_isnumber(L, -1))
-		throw LuaError("allow_put should return a number. name=" + name);
+		throw LuaError("allow_put should return a number. name=" + ma.to_inv.name);
 	int ret = luaL_checkinteger(L, -1);
 	lua_pop(L, 2); // Pop integer and error handler
 	return ret;
@@ -90,8 +83,7 @@ int ScriptApiDetached::detached_inventory_AllowPut(
 
 // Return number of accepted items to be taken
 int ScriptApiDetached::detached_inventory_AllowTake(
-		const std::string &name,
-		const std::string &listname, int index, ItemStack &stack,
+		const MoveAction &ma, const ItemStack &stack,
 		ServerActiveObject *player)
 {
 	SCRIPTAPI_PRECHECKHEADER
@@ -99,20 +91,18 @@ int ScriptApiDetached::detached_inventory_AllowTake(
 	int error_handler = PUSH_ERROR_HANDLER(L);
 
 	// Push callback function on stack
-	if (!getDetachedInventoryCallback(name, "allow_take"))
+	if (!getDetachedInventoryCallback(ma.from_inv.name, "allow_take"))
 		return stack.count; // All will be accepted
 
 	// Call function(inv, listname, index, stack, player)
-	InventoryLocation loc;
-	loc.setDetached(name);
-	InvRef::create(L, loc);              // inv
-	lua_pushstring(L, listname.c_str()); // listname
-	lua_pushinteger(L, index + 1);       // index
+	InvRef::create(L, ma.from_inv);          // inv
+	lua_pushstring(L, ma.from_list.c_str()); // listname
+	lua_pushinteger(L, ma.from_i + 1);       // index
 	LuaItemStack::create(L, stack);      // stack
 	objectrefGetOrCreate(L, player);     // player
 	PCALL_RES(lua_pcall(L, 5, 1, error_handler));
 	if (!lua_isnumber(L, -1))
-		throw LuaError("allow_take should return a number. name=" + name);
+		throw LuaError("allow_take should return a number. name=" + ma.from_inv.name);
 	int ret = luaL_checkinteger(L, -1);
 	lua_pop(L, 2); // Pop integer and error handler
 	return ret;
@@ -120,38 +110,33 @@ int ScriptApiDetached::detached_inventory_AllowTake(
 
 // Report moved items
 void ScriptApiDetached::detached_inventory_OnMove(
-		const std::string &name,
-		const std::string &from_list, int from_index,
-		const std::string &to_list, int to_index,
-		int count, ServerActiveObject *player)
+		const MoveAction &ma, int count,
+		ServerActiveObject *player)
 {
 	SCRIPTAPI_PRECHECKHEADER
 
 	int error_handler = PUSH_ERROR_HANDLER(L);
 
 	// Push callback function on stack
-	if (!getDetachedInventoryCallback(name, "on_move"))
+	if (!getDetachedInventoryCallback(ma.from_inv.name, "on_move"))
 		return;
 
 	// function(inv, from_list, from_index, to_list, to_index, count, player)
 	// inv
-	InventoryLocation loc;
-	loc.setDetached(name);
-	InvRef::create(L, loc);
-	lua_pushstring(L, from_list.c_str()); // from_list
-	lua_pushinteger(L, from_index + 1);   // from_index
-	lua_pushstring(L, to_list.c_str());   // to_list
-	lua_pushinteger(L, to_index + 1);     // to_index
-	lua_pushinteger(L, count);            // count
-	objectrefGetOrCreate(L, player);      // player
+	InvRef::create(L, ma.from_inv);
+	lua_pushstring(L, ma.from_list.c_str()); // from_list
+	lua_pushinteger(L, ma.from_i + 1);       // from_index
+	lua_pushstring(L, ma.to_list.c_str());   // to_list
+	lua_pushinteger(L, ma.to_i + 1);         // to_index
+	lua_pushinteger(L, count);               // count
+	objectrefGetOrCreate(L, player);         // player
 	PCALL_RES(lua_pcall(L, 7, 0, error_handler));
 	lua_pop(L, 1);  // Pop error handler
 }
 
 // Report put items
 void ScriptApiDetached::detached_inventory_OnPut(
-		const std::string &name,
-		const std::string &listname, int index, ItemStack &stack,
+		const MoveAction &ma, const ItemStack &stack,
 		ServerActiveObject *player)
 {
 	SCRIPTAPI_PRECHECKHEADER
@@ -159,26 +144,23 @@ void ScriptApiDetached::detached_inventory_OnPut(
 	int error_handler = PUSH_ERROR_HANDLER(L);
 
 	// Push callback function on stack
-	if (!getDetachedInventoryCallback(name, "on_put"))
+	if (!getDetachedInventoryCallback(ma.to_inv.name, "on_put"))
 		return;
 
 	// Call function(inv, listname, index, stack, player)
 	// inv
-	InventoryLocation loc;
-	loc.setDetached(name);
-	InvRef::create(L, loc);
-	lua_pushstring(L, listname.c_str()); // listname
-	lua_pushinteger(L, index + 1);       // index
-	LuaItemStack::create(L, stack);      // stack
-	objectrefGetOrCreate(L, player);     // player
+	InvRef::create(L, ma.to_inv);
+	lua_pushstring(L, ma.to_list.c_str()); // listname
+	lua_pushinteger(L, ma.to_i + 1);       // index
+	LuaItemStack::create(L, stack);        // stack
+	objectrefGetOrCreate(L, player);       // player
 	PCALL_RES(lua_pcall(L, 5, 0, error_handler));
 	lua_pop(L, 1);  // Pop error handler
 }
 
 // Report taken items
 void ScriptApiDetached::detached_inventory_OnTake(
-		const std::string &name,
-		const std::string &listname, int index, ItemStack &stack,
+		const MoveAction &ma, const ItemStack &stack,
 		ServerActiveObject *player)
 {
 	SCRIPTAPI_PRECHECKHEADER
@@ -186,18 +168,16 @@ void ScriptApiDetached::detached_inventory_OnTake(
 	int error_handler = PUSH_ERROR_HANDLER(L);
 
 	// Push callback function on stack
-	if (!getDetachedInventoryCallback(name, "on_take"))
+	if (!getDetachedInventoryCallback(ma.from_inv.name, "on_take"))
 		return;
 
 	// Call function(inv, listname, index, stack, player)
 	// inv
-	InventoryLocation loc;
-	loc.setDetached(name);
-	InvRef::create(L, loc);
-	lua_pushstring(L, listname.c_str()); // listname
-	lua_pushinteger(L, index + 1);       // index
-	LuaItemStack::create(L, stack);      // stack
-	objectrefGetOrCreate(L, player);     // player
+	InvRef::create(L, ma.from_inv);
+	lua_pushstring(L, ma.from_list.c_str()); // listname
+	lua_pushinteger(L, ma.from_i + 1);       // index
+	LuaItemStack::create(L, stack);          // stack
+	objectrefGetOrCreate(L, player);         // player
 	PCALL_RES(lua_pcall(L, 5, 0, error_handler));
 	lua_pop(L, 1);  // Pop error handler
 }
diff --git a/src/script/cpp_api/s_inventory.h b/src/script/cpp_api/s_inventory.h
index 93ec7fd42..e79b3d18b 100644
--- a/src/script/cpp_api/s_inventory.h
+++ b/src/script/cpp_api/s_inventory.h
@@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 
 #include "cpp_api/s_base.h"
 
+struct MoveAction;
 struct ItemStack;
 
 class ScriptApiDetached
@@ -30,35 +31,27 @@ public:
 	/* Detached inventory callbacks */
 	// Return number of accepted items to be moved
 	int detached_inventory_AllowMove(
-			const std::string &name,
-			const std::string &from_list, int from_index,
-			const std::string &to_list, int to_index,
-			int count, ServerActiveObject *player);
+			const MoveAction &ma, int count,
+			ServerActiveObject *player);
 	// Return number of accepted items to be put
 	int detached_inventory_AllowPut(
-			const std::string &name,
-			const std::string &listname, int index, ItemStack &stack,
+			const MoveAction &ma, const ItemStack &stack,
 			ServerActiveObject *player);
 	// Return number of accepted items to be taken
 	int detached_inventory_AllowTake(
-			const std::string &name,
-			const std::string &listname, int index, ItemStack &stack,
+			const MoveAction &ma, const ItemStack &stack,
 			ServerActiveObject *player);
 	// Report moved items
 	void detached_inventory_OnMove(
-			const std::string &name,
-			const std::string &from_list, int from_index,
-			const std::string &to_list, int to_index,
-			int count, ServerActiveObject *player);
+			const MoveAction &ma, int count,
+			ServerActiveObject *player);
 	// Report put items
 	void detached_inventory_OnPut(
-			const std::string &name,
-			const std::string &listname, int index, ItemStack &stack,
+			const MoveAction &ma, const ItemStack &stack,
 			ServerActiveObject *player);
 	// Report taken items
 	void detached_inventory_OnTake(
-			const std::string &name,
-			const std::string &listname, int index, ItemStack &stack,
+			const MoveAction &ma, const ItemStack &stack,
 			ServerActiveObject *player);
 private:
 	bool getDetachedInventoryCallback(
diff --git a/src/script/cpp_api/s_nodemeta.cpp b/src/script/cpp_api/s_nodemeta.cpp
index 5a95d208a..b49bb8170 100644
--- a/src/script/cpp_api/s_nodemeta.cpp
+++ b/src/script/cpp_api/s_nodemeta.cpp
@@ -27,10 +27,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "lua_api/l_item.h"
 
 // Return number of accepted items to be moved
-int ScriptApiNodemeta::nodemeta_inventory_AllowMove(v3s16 p,
-		const std::string &from_list, int from_index,
-		const std::string &to_list, int to_index,
-		int count, ServerActiveObject *player)
+int ScriptApiNodemeta::nodemeta_inventory_AllowMove(
+		const MoveAction &ma, int count,
+		ServerActiveObject *player)
 {
 	SCRIPTAPI_PRECHECKHEADER
 
@@ -39,23 +38,23 @@ int ScriptApiNodemeta::nodemeta_inventory_AllowMove(v3s16 p,
 	const NodeDefManager *ndef = getServer()->ndef();
 
 	// If node doesn't exist, we don't know what callback to call
-	MapNode node = getEnv()->getMap().getNodeNoEx(p);
+	MapNode node = getEnv()->getMap().getNodeNoEx(ma.to_inv.p);
 	if (node.getContent() == CONTENT_IGNORE)
 		return 0;
 
 	// Push callback function on stack
 	std::string nodename = ndef->get(node).name;
-	if (!getItemCallback(nodename.c_str(), "allow_metadata_inventory_move", &p))
+	if (!getItemCallback(nodename.c_str(), "allow_metadata_inventory_move", &ma.to_inv.p))
 		return count;
 
 	// function(pos, from_list, from_index, to_list, to_index, count, player)
-	push_v3s16(L, p);                     // pos
-	lua_pushstring(L, from_list.c_str()); // from_list
-	lua_pushinteger(L, from_index + 1);   // from_index
-	lua_pushstring(L, to_list.c_str());   // to_list
-	lua_pushinteger(L, to_index + 1);     // to_index
-	lua_pushinteger(L, count);            // count
-	objectrefGetOrCreate(L, player);      // player
+	push_v3s16(L, ma.to_inv.p);              // pos
+	lua_pushstring(L, ma.from_list.c_str()); // from_list
+	lua_pushinteger(L, ma.from_i + 1);       // from_index
+	lua_pushstring(L, ma.to_list.c_str());   // to_list
+	lua_pushinteger(L, ma.to_i + 1);         // to_index
+	lua_pushinteger(L, count);               // count
+	objectrefGetOrCreate(L, player);         // player
 	PCALL_RES(lua_pcall(L, 7, 1, error_handler));
 	if (!lua_isnumber(L, -1))
 		throw LuaError("allow_metadata_inventory_move should"
@@ -66,8 +65,8 @@ int ScriptApiNodemeta::nodemeta_inventory_AllowMove(v3s16 p,
 }
 
 // Return number of accepted items to be put
-int ScriptApiNodemeta::nodemeta_inventory_AllowPut(v3s16 p,
-		const std::string &listname, int index, ItemStack &stack,
+int ScriptApiNodemeta::nodemeta_inventory_AllowPut(
+		const MoveAction &ma, const ItemStack &stack,
 		ServerActiveObject *player)
 {
 	SCRIPTAPI_PRECHECKHEADER
@@ -77,21 +76,21 @@ int ScriptApiNodemeta::nodemeta_inventory_AllowPut(v3s16 p,
 	const NodeDefManager *ndef = getServer()->ndef();
 
 	// If node doesn't exist, we don't know what callback to call
-	MapNode node = getEnv()->getMap().getNodeNoEx(p);
+	MapNode node = getEnv()->getMap().getNodeNoEx(ma.to_inv.p);
 	if (node.getContent() == CONTENT_IGNORE)
 		return 0;
 
 	// Push callback function on stack
 	std::string nodename = ndef->get(node).name;
-	if (!getItemCallback(nodename.c_str(), "allow_metadata_inventory_put", &p))
+	if (!getItemCallback(nodename.c_str(), "allow_metadata_inventory_put", &ma.to_inv.p))
 		return stack.count;
 
 	// Call function(pos, listname, index, stack, player)
-	push_v3s16(L, p);                    // pos
-	lua_pushstring(L, listname.c_str()); // listname
-	lua_pushinteger(L, index + 1);       // index
-	LuaItemStack::create(L, stack);      // stack
-	objectrefGetOrCreate(L, player);     // player
+	push_v3s16(L, ma.to_inv.p);            // pos
+	lua_pushstring(L, ma.to_list.c_str()); // listname
+	lua_pushinteger(L, ma.to_i + 1);       // index
+	LuaItemStack::create(L, stack);        // stack
+	objectrefGetOrCreate(L, player);       // player
 	PCALL_RES(lua_pcall(L, 5, 1, error_handler));
 	if(!lua_isnumber(L, -1))
 		throw LuaError("allow_metadata_inventory_put should"
@@ -102,8 +101,8 @@ int ScriptApiNodemeta::nodemeta_inventory_AllowPut(v3s16 p,
 }
 
 // Return number of accepted items to be taken
-int ScriptApiNodemeta::nodemeta_inventory_AllowTake(v3s16 p,
-		const std::string &listname, int index, ItemStack &stack,
+int ScriptApiNodemeta::nodemeta_inventory_AllowTake(
+		const MoveAction &ma, const ItemStack &stack,
 		ServerActiveObject *player)
 {
 	SCRIPTAPI_PRECHECKHEADER
@@ -113,21 +112,21 @@ int ScriptApiNodemeta::nodemeta_inventory_AllowTake(v3s16 p,
 	const NodeDefManager *ndef = getServer()->ndef();
 
 	// If node doesn't exist, we don't know what callback to call
-	MapNode node = getEnv()->getMap().getNodeNoEx(p);
+	MapNode node = getEnv()->getMap().getNodeNoEx(ma.from_inv.p);
 	if (node.getContent() == CONTENT_IGNORE)
 		return 0;
 
 	// Push callback function on stack
 	std::string nodename = ndef->get(node).name;
-	if (!getItemCallback(nodename.c_str(), "allow_metadata_inventory_take", &p))
+	if (!getItemCallback(nodename.c_str(), "allow_metadata_inventory_take", &ma.from_inv.p))
 		return stack.count;
 
 	// Call function(pos, listname, index, count, player)
-	push_v3s16(L, p);                    // pos
-	lua_pushstring(L, listname.c_str()); // listname
-	lua_pushinteger(L, index + 1);       // index
-	LuaItemStack::create(L, stack);      // stack
-	objectrefGetOrCreate(L, player);     // player
+	push_v3s16(L, ma.from_inv.p);            // pos
+	lua_pushstring(L, ma.from_list.c_str()); // listname
+	lua_pushinteger(L, ma.from_i + 1);       // index
+	LuaItemStack::create(L, stack);          // stack
+	objectrefGetOrCreate(L, player);         // player
 	PCALL_RES(lua_pcall(L, 5, 1, error_handler));
 	if (!lua_isnumber(L, -1))
 		throw LuaError("allow_metadata_inventory_take should"
@@ -138,10 +137,9 @@ int ScriptApiNodemeta::nodemeta_inventory_AllowTake(v3s16 p,
 }
 
 // Report moved items
-void ScriptApiNodemeta::nodemeta_inventory_OnMove(v3s16 p,
-		const std::string &from_list, int from_index,
-		const std::string &to_list, int to_index,
-		int count, ServerActiveObject *player)
+void ScriptApiNodemeta::nodemeta_inventory_OnMove(
+		const MoveAction &ma, int count,
+		ServerActiveObject *player)
 {
 	SCRIPTAPI_PRECHECKHEADER
 
@@ -150,30 +148,30 @@ void ScriptApiNodemeta::nodemeta_inventory_OnMove(v3s16 p,
 	const NodeDefManager *ndef = getServer()->ndef();
 
 	// If node doesn't exist, we don't know what callback to call
-	MapNode node = getEnv()->getMap().getNodeNoEx(p);
+	MapNode node = getEnv()->getMap().getNodeNoEx(ma.from_inv.p);
 	if (node.getContent() == CONTENT_IGNORE)
 		return;
 
 	// Push callback function on stack
 	std::string nodename = ndef->get(node).name;
-	if (!getItemCallback(nodename.c_str(), "on_metadata_inventory_move", &p))
+	if (!getItemCallback(nodename.c_str(), "on_metadata_inventory_move", &ma.from_inv.p))
 		return;
 
 	// function(pos, from_list, from_index, to_list, to_index, count, player)
-	push_v3s16(L, p);                     // pos
-	lua_pushstring(L, from_list.c_str()); // from_list
-	lua_pushinteger(L, from_index + 1);   // from_index
-	lua_pushstring(L, to_list.c_str());   // to_list
-	lua_pushinteger(L, to_index + 1);     // to_index
-	lua_pushinteger(L, count);            // count
-	objectrefGetOrCreate(L, player);      // player
+	push_v3s16(L, ma.from_inv.p);            // pos
+	lua_pushstring(L, ma.from_list.c_str()); // from_list
+	lua_pushinteger(L, ma.from_i + 1);       // from_index
+	lua_pushstring(L, ma.to_list.c_str());   // to_list
+	lua_pushinteger(L, ma.to_i + 1);         // to_index
+	lua_pushinteger(L, count);               // count
+	objectrefGetOrCreate(L, player);         // player
 	PCALL_RES(lua_pcall(L, 7, 0, error_handler));
 	lua_pop(L, 1);  // Pop error handler
 }
 
 // Report put items
-void ScriptApiNodemeta::nodemeta_inventory_OnPut(v3s16 p,
-		const std::string &listname, int index, ItemStack &stack,
+void ScriptApiNodemeta::nodemeta_inventory_OnPut(
+		const MoveAction &ma, const ItemStack &stack,
 		ServerActiveObject *player)
 {
 	SCRIPTAPI_PRECHECKHEADER
@@ -183,28 +181,28 @@ void ScriptApiNodemeta::nodemeta_inventory_OnPut(v3s16 p,
 	const NodeDefManager *ndef = getServer()->ndef();
 
 	// If node doesn't exist, we don't know what callback to call
-	MapNode node = getEnv()->getMap().getNodeNoEx(p);
+	MapNode node = getEnv()->getMap().getNodeNoEx(ma.to_inv.p);
 	if (node.getContent() == CONTENT_IGNORE)
 		return;
 
 	// Push callback function on stack
 	std::string nodename = ndef->get(node).name;
-	if (!getItemCallback(nodename.c_str(), "on_metadata_inventory_put", &p))
+	if (!getItemCallback(nodename.c_str(), "on_metadata_inventory_put", &ma.to_inv.p))
 		return;
 
 	// Call function(pos, listname, index, stack, player)
-	push_v3s16(L, p);                    // pos
-	lua_pushstring(L, listname.c_str()); // listname
-	lua_pushinteger(L, index + 1);       // index
-	LuaItemStack::create(L, stack);      // stack
-	objectrefGetOrCreate(L, player);     // player
+	push_v3s16(L, ma.to_inv.p);            // pos
+	lua_pushstring(L, ma.to_list.c_str()); // listname
+	lua_pushinteger(L, ma.to_i + 1);       // index
+	LuaItemStack::create(L, stack);        // stack
+	objectrefGetOrCreate(L, player);       // player
 	PCALL_RES(lua_pcall(L, 5, 0, error_handler));
 	lua_pop(L, 1);  // Pop error handler
 }
 
 // Report taken items
-void ScriptApiNodemeta::nodemeta_inventory_OnTake(v3s16 p,
-		const std::string &listname, int index, ItemStack &stack,
+void ScriptApiNodemeta::nodemeta_inventory_OnTake(
+		const MoveAction &ma, const ItemStack &stack,
 		ServerActiveObject *player)
 {
 	SCRIPTAPI_PRECHECKHEADER
@@ -214,21 +212,21 @@ void ScriptApiNodemeta::nodemeta_inventory_OnTake(v3s16 p,
 	const NodeDefManager *ndef = getServer()->ndef();
 
 	// If node doesn't exist, we don't know what callback to call
-	MapNode node = getEnv()->getMap().getNodeNoEx(p);
+	MapNode node = getEnv()->getMap().getNodeNoEx(ma.from_inv.p);
 	if (node.getContent() == CONTENT_IGNORE)
 		return;
 
 	// Push callback function on stack
 	std::string nodename = ndef->get(node).name;
-	if (!getItemCallback(nodename.c_str(), "on_metadata_inventory_take", &p))
+	if (!getItemCallback(nodename.c_str(), "on_metadata_inventory_take", &ma.from_inv.p))
 		return;
 
 	// Call function(pos, listname, index, stack, player)
-	push_v3s16(L, p);                    // pos
-	lua_pushstring(L, listname.c_str()); // listname
-	lua_pushinteger(L, index + 1);       // index
-	LuaItemStack::create(L, stack);      // stack
-	objectrefGetOrCreate(L, player);     // player
+	push_v3s16(L, ma.from_inv.p);            // pos
+	lua_pushstring(L, ma.from_list.c_str()); // listname
+	lua_pushinteger(L, ma.from_i + 1);       // index
+	LuaItemStack::create(L, stack);          // stack
+	objectrefGetOrCreate(L, player);         // player
 	PCALL_RES(lua_pcall(L, 5, 0, error_handler));
 	lua_pop(L, 1);  // Pop error handler
 }
diff --git a/src/script/cpp_api/s_nodemeta.h b/src/script/cpp_api/s_nodemeta.h
index 4d3257dcf..8c7cdd93e 100644
--- a/src/script/cpp_api/s_nodemeta.h
+++ b/src/script/cpp_api/s_nodemeta.h
@@ -23,6 +23,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "cpp_api/s_item.h"
 #include "irr_v3d.h"
 
+struct MoveAction;
 struct ItemStack;
 
 class ScriptApiNodemeta
@@ -34,30 +35,28 @@ public:
 	virtual ~ScriptApiNodemeta() = default;
 
 	// Return number of accepted items to be moved
-	int nodemeta_inventory_AllowMove(v3s16 p,
-			const std::string &from_list, int from_index,
-			const std::string &to_list, int to_index,
-			int count, ServerActiveObject *player);
+	int nodemeta_inventory_AllowMove(
+			const MoveAction &ma, int count,
+			ServerActiveObject *player);
 	// Return number of accepted items to be put
-	int nodemeta_inventory_AllowPut(v3s16 p,
-			const std::string &listname, int index, ItemStack &stack,
+	int nodemeta_inventory_AllowPut(
+			const MoveAction &ma, const ItemStack &stack,
 			ServerActiveObject *player);
 	// Return number of accepted items to be taken
-	int nodemeta_inventory_AllowTake(v3s16 p,
-			const std::string &listname, int index, ItemStack &stack,
+	int nodemeta_inventory_AllowTake(
+			const MoveAction &ma, const ItemStack &stack,
 			ServerActiveObject *player);
 	// Report moved items
-	void nodemeta_inventory_OnMove(v3s16 p,
-			const std::string &from_list, int from_index,
-			const std::string &to_list, int to_index,
-			int count, ServerActiveObject *player);
+	void nodemeta_inventory_OnMove(
+			const MoveAction &ma, int count,
+			ServerActiveObject *player);
 	// Report put items
-	void nodemeta_inventory_OnPut(v3s16 p,
-			const std::string &listname, int index, ItemStack &stack,
+	void nodemeta_inventory_OnPut(
+			const MoveAction &ma, const ItemStack &stack,
 			ServerActiveObject *player);
 	// Report taken items
-	void nodemeta_inventory_OnTake(v3s16 p,
-			const std::string &listname, int index, ItemStack &stack,
+	void nodemeta_inventory_OnTake(
+			const MoveAction &ma, const ItemStack &stack,
 			ServerActiveObject *player);
 private:
 
diff --git a/src/script/cpp_api/s_player.cpp b/src/script/cpp_api/s_player.cpp
index 8c01f9b1f..0097177c4 100644
--- a/src/script/cpp_api/s_player.cpp
+++ b/src/script/cpp_api/s_player.cpp
@@ -230,26 +230,24 @@ void ScriptApiPlayer::on_auth_failure(const std::string &name, const std::string
 }
 
 void ScriptApiPlayer::pushMoveArguments(
-		const InventoryLocation &loc,
-		const std::string &from_list, int from_index,
-		const std::string &to_list, int to_index,
-		int count, ServerActiveObject *player)
+		const MoveAction &ma, int count,
+		ServerActiveObject *player)
 {
 	lua_State *L = getStack();
 	objectrefGetOrCreate(L, player); // player
 	lua_pushstring(L, "move");       // action
-	InvRef::create(L, loc);          // inventory
+	InvRef::create(L, ma.from_inv);  // inventory
 	lua_newtable(L);
 	{
 		// Table containing the action information
-		lua_pushstring(L, from_list.c_str());
+		lua_pushstring(L, ma.from_list.c_str());
 		lua_setfield(L, -2, "from_list");
-		lua_pushstring(L, to_list.c_str());
+		lua_pushstring(L, ma.to_list.c_str());
 		lua_setfield(L, -2, "to_list");
 
-		lua_pushinteger(L, from_index + 1);
+		lua_pushinteger(L, ma.from_i + 1);
 		lua_setfield(L, -2, "from_index");
-		lua_pushinteger(L, to_index + 1);
+		lua_pushinteger(L, ma.to_i + 1);
 		lua_setfield(L, -2, "to_index");
 
 		lua_pushinteger(L, count);
@@ -282,16 +280,14 @@ void ScriptApiPlayer::pushPutTakeArguments(
 
 // Return number of accepted items to be moved
 int ScriptApiPlayer::player_inventory_AllowMove(
-		const InventoryLocation &loc,
-		const std::string &from_list, int from_index,
-		const std::string &to_list, int to_index,
-		int count, ServerActiveObject *player)
+		const MoveAction &ma, int count,
+		ServerActiveObject *player)
 {
 	SCRIPTAPI_PRECHECKHEADER
 
 	lua_getglobal(L, "core");
 	lua_getfield(L, -1, "registered_allow_player_inventory_actions");
-	pushMoveArguments(loc, from_list, from_index, to_list, to_index, count, player);
+	pushMoveArguments(ma, count, player);
 	runCallbacks(4, RUN_CALLBACKS_MODE_OR_SC);
 
 	return lua_type(L, -1) == LUA_TNUMBER ? lua_tonumber(L, -1) : count;
@@ -299,15 +295,14 @@ int ScriptApiPlayer::player_inventory_AllowMove(
 
 // Return number of accepted items to be put
 int ScriptApiPlayer::player_inventory_AllowPut(
-		const InventoryLocation &loc,
-		const std::string &listname, int index, const ItemStack &stack,
+		const MoveAction &ma, const ItemStack &stack,
 		ServerActiveObject *player)
 {
 	SCRIPTAPI_PRECHECKHEADER
 
 	lua_getglobal(L, "core");
 	lua_getfield(L, -1, "registered_allow_player_inventory_actions");
-	pushPutTakeArguments("put", loc, listname, index, stack, player);
+	pushPutTakeArguments("put", ma.to_inv, ma.to_list, ma.to_i, stack, player);
 	runCallbacks(4, RUN_CALLBACKS_MODE_OR_SC);
 
 	return lua_type(L, -1) == LUA_TNUMBER ? lua_tonumber(L, -1) : stack.count;
@@ -315,15 +310,14 @@ int ScriptApiPlayer::player_inventory_AllowPut(
 
 // Return number of accepted items to be taken
 int ScriptApiPlayer::player_inventory_AllowTake(
-		const InventoryLocation &loc,
-		const std::string &listname, int index, const ItemStack &stack,
+		const MoveAction &ma, const ItemStack &stack,
 		ServerActiveObject *player)
 {
 	SCRIPTAPI_PRECHECKHEADER
 
 	lua_getglobal(L, "core");
 	lua_getfield(L, -1, "registered_allow_player_inventory_actions");
-	pushPutTakeArguments("take", loc, listname, index, stack, player);
+	pushPutTakeArguments("take", ma.from_inv, ma.from_list, ma.from_i, stack, player);
 	runCallbacks(4, RUN_CALLBACKS_MODE_OR_SC);
 
 	return lua_type(L, -1) == LUA_TNUMBER ? lua_tonumber(L, -1) : stack.count;
@@ -331,43 +325,39 @@ int ScriptApiPlayer::player_inventory_AllowTake(
 
 // Report moved items
 void ScriptApiPlayer::player_inventory_OnMove(
-		const InventoryLocation &loc,
-		const std::string &from_list, int from_index,
-		const std::string &to_list, int to_index,
-		int count, ServerActiveObject *player)
+		const MoveAction &ma, int count,
+		ServerActiveObject *player)
 {
 	SCRIPTAPI_PRECHECKHEADER
 
 	lua_getglobal(L, "core");
 	lua_getfield(L, -1, "registered_on_player_inventory_actions");
-	pushMoveArguments(loc, from_list, from_index, to_list, to_index, count, player);
+	pushMoveArguments(ma, count, player);
 	runCallbacks(4, RUN_CALLBACKS_MODE_FIRST);
 }
 
 // Report put items
 void ScriptApiPlayer::player_inventory_OnPut(
-		const InventoryLocation &loc,
-		const std::string &listname, int index, const ItemStack &stack,
+		const MoveAction &ma, const ItemStack &stack,
 		ServerActiveObject *player)
 {
 	SCRIPTAPI_PRECHECKHEADER
 
 	lua_getglobal(L, "core");
 	lua_getfield(L, -1, "registered_on_player_inventory_actions");
-	pushPutTakeArguments("put", loc, listname, index, stack, player);
+	pushPutTakeArguments("put", ma.to_inv, ma.to_list, ma.to_i, stack, player);
 	runCallbacks(4, RUN_CALLBACKS_MODE_FIRST);
 }
 
 // Report taken items
 void ScriptApiPlayer::player_inventory_OnTake(
-		const InventoryLocation &loc,
-		const std::string &listname, int index, const ItemStack &stack,
+		const MoveAction &ma, const ItemStack &stack,
 		ServerActiveObject *player)
 {
 	SCRIPTAPI_PRECHECKHEADER
 
 	lua_getglobal(L, "core");
 	lua_getfield(L, -1, "registered_on_player_inventory_actions");
-	pushPutTakeArguments("take", loc, listname, index, stack, player);
+	pushPutTakeArguments("take", ma.from_inv, ma.from_list, ma.from_i, stack, player);
 	runCallbacks(4, RUN_CALLBACKS_MODE_FIRST);
 }
diff --git a/src/script/cpp_api/s_player.h b/src/script/cpp_api/s_player.h
index d60dfcaf4..764455a53 100644
--- a/src/script/cpp_api/s_player.h
+++ b/src/script/cpp_api/s_player.h
@@ -23,6 +23,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "irr_v3d.h"
 #include "util/string.h"
 
+struct MoveAction;
 struct InventoryLocation;
 struct ItemStack;
 struct ToolCapabilities;
@@ -54,43 +55,33 @@ public:
 	// Player inventory callbacks
 	// Return number of accepted items to be moved
 	int player_inventory_AllowMove(
-		const InventoryLocation &loc,
-		const std::string &from_list, int from_index,
-		const std::string &to_list, int to_index,
-		int count, ServerActiveObject *player);
+		const MoveAction &ma, int count,
+		ServerActiveObject *player);
 	// Return number of accepted items to be put
 	int player_inventory_AllowPut(
-		const InventoryLocation &loc,
-		const std::string &listname, int index, const ItemStack &stack,
+		const MoveAction &ma, const ItemStack &stack,
 		ServerActiveObject *player);
 	// Return number of accepted items to be taken
 	int player_inventory_AllowTake(
-		const InventoryLocation &loc,
-		const std::string &listname, int index, const ItemStack &stack,
+		const MoveAction &ma, const ItemStack &stack,
 		ServerActiveObject *player);
 	// Report moved items
 	void player_inventory_OnMove(
-		const InventoryLocation &loc,
-		const std::string &from_list, int from_index,
-		const std::string &to_list, int to_index,
-		int count, ServerActiveObject *player);
+		const MoveAction &ma, int count,
+		ServerActiveObject *player);
 	// Report put items
 	void player_inventory_OnPut(
-		const InventoryLocation &loc,
-		const std::string &listname, int index, const ItemStack &stack,
+		const MoveAction &ma, const ItemStack &stack,
 		ServerActiveObject *player);
 	// Report taken items
 	void player_inventory_OnTake(
-		const InventoryLocation &loc,
-		const std::string &listname, int index, const ItemStack &stack,
+		const MoveAction &ma, const ItemStack &stack,
 		ServerActiveObject *player);
 private:
 	void pushPutTakeArguments(
 		const char *method, const InventoryLocation &loc,
 		const std::string &listname, int index, const ItemStack &stack,
 		ServerActiveObject *player);
-	void pushMoveArguments(const InventoryLocation &loc,
-		const std::string &from_list, int from_index,
-		const std::string &to_list, int to_index,
+	void pushMoveArguments(const MoveAction &ma,
 		int count, ServerActiveObject *player);
 };
-- 
cgit v1.2.3