From 9fa547bb8013e78991c362b73111a134216307a0 Mon Sep 17 00:00:00 2001 From: SmallJoker 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') 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