diff --git a/src/inventorymanager.cpp b/src/inventorymanager.cpp index 0243bd3c..5c2163db 100644 --- a/src/inventorymanager.cpp +++ b/src/inventorymanager.cpp @@ -266,8 +266,7 @@ void IMoveAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame to_inv.type == InventoryLocation::DETACHED && from_inv.name == to_inv.name) { src_can_take_count = PLAYER_TO_SA(player)->detached_inventory_AllowMove( - from_inv.name, from_list, from_i, - to_list, to_i, try_take_count, player); + *this, try_take_count, player); dst_can_put_count = src_can_take_count; } else { // Destination is detached @@ -275,14 +274,14 @@ void IMoveAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame ItemStack src_item = list_from->getItem(from_i); src_item.count = try_take_count; dst_can_put_count = PLAYER_TO_SA(player)->detached_inventory_AllowPut( - to_inv.name, to_list, to_i, src_item, player); + *this, src_item, player); } // Source is detached if (from_inv.type == InventoryLocation::DETACHED) { ItemStack src_item = list_from->getItem(from_i); src_item.count = try_take_count; src_can_take_count = PLAYER_TO_SA(player)->detached_inventory_AllowTake( - from_inv.name, from_list, from_i, src_item, player); + *this, src_item, player); } } @@ -294,8 +293,7 @@ void IMoveAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame to_inv.type == InventoryLocation::NODEMETA && from_inv.p == to_inv.p) { src_can_take_count = PLAYER_TO_SA(player)->nodemeta_inventory_AllowMove( - from_inv.p, from_list, from_i, - to_list, to_i, try_take_count, player); + *this, try_take_count, player); dst_can_put_count = src_can_take_count; } else { // Destination is nodemeta @@ -303,14 +301,14 @@ void IMoveAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame ItemStack src_item = list_from->getItem(from_i); src_item.count = try_take_count; dst_can_put_count = PLAYER_TO_SA(player)->nodemeta_inventory_AllowPut( - to_inv.p, to_list, to_i, src_item, player); + *this, src_item, player); } // Source is nodemeta if (from_inv.type == InventoryLocation::NODEMETA) { ItemStack src_item = list_from->getItem(from_i); src_item.count = try_take_count; src_can_take_count = PLAYER_TO_SA(player)->nodemeta_inventory_AllowTake( - from_inv.p, from_list, from_i, src_item, player); + *this, src_item, player); } } @@ -321,8 +319,7 @@ void IMoveAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame to_inv.type == InventoryLocation::PLAYER && from_inv.name == to_inv.name) { src_can_take_count = PLAYER_TO_SA(player)->player_inventory_AllowMove( - from_inv, from_list, from_i, - to_list, to_i, try_take_count, player); + *this, try_take_count, player); dst_can_put_count = src_can_take_count; } else { // Destination is a player @@ -330,14 +327,14 @@ void IMoveAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame ItemStack src_item = list_from->getItem(from_i); src_item.count = try_take_count; dst_can_put_count = PLAYER_TO_SA(player)->player_inventory_AllowPut( - to_inv, to_list, to_i, src_item, player); + *this, src_item, player); } // Source is a player if (from_inv.type == InventoryLocation::PLAYER) { ItemStack src_item = list_from->getItem(from_i); src_item.count = try_take_count; src_can_take_count = PLAYER_TO_SA(player)->player_inventory_AllowTake( - from_inv, from_list, from_i, src_item, player); + *this, src_item, player); } } @@ -478,18 +475,17 @@ void IMoveAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame to_inv.type == InventoryLocation::DETACHED && from_inv.name == to_inv.name) { PLAYER_TO_SA(player)->detached_inventory_OnMove( - from_inv.name, from_list, from_i, - to_list, to_i, count, player); + *this, count, player); } else { // Destination is detached if (to_inv.type == InventoryLocation::DETACHED) { PLAYER_TO_SA(player)->detached_inventory_OnPut( - to_inv.name, to_list, to_i, src_item, player); + *this, src_item, player); } // Source is detached if (from_inv.type == InventoryLocation::DETACHED) { PLAYER_TO_SA(player)->detached_inventory_OnTake( - from_inv.name, from_list, from_i, src_item, player); + *this, src_item, player); } } @@ -500,18 +496,17 @@ void IMoveAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame to_inv.type == InventoryLocation::NODEMETA && from_inv.p == to_inv.p) { PLAYER_TO_SA(player)->nodemeta_inventory_OnMove( - from_inv.p, from_list, from_i, - to_list, to_i, count, player); + *this, count, player); } else { // Destination is nodemeta if (to_inv.type == InventoryLocation::NODEMETA) { PLAYER_TO_SA(player)->nodemeta_inventory_OnPut( - to_inv.p, to_list, to_i, src_item, player); + *this, src_item, player); } // Source is nodemeta if (from_inv.type == InventoryLocation::NODEMETA) { PLAYER_TO_SA(player)->nodemeta_inventory_OnTake( - from_inv.p, from_list, from_i, src_item, player); + *this, src_item, player); } } @@ -522,18 +517,17 @@ void IMoveAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame to_inv.type == InventoryLocation::PLAYER && from_inv.name == to_inv.name) { PLAYER_TO_SA(player)->player_inventory_OnMove( - from_inv, from_list, from_i, - to_list, to_i, count, player); + *this, count, player); } else { // Destination is player inventory if (to_inv.type == InventoryLocation::PLAYER) { PLAYER_TO_SA(player)->player_inventory_OnPut( - to_inv, to_list, to_i, src_item, player); + *this, src_item, player); } // Source is player inventory if (from_inv.type == InventoryLocation::PLAYER) { PLAYER_TO_SA(player)->player_inventory_OnTake( - from_inv, from_list, from_i, src_item, player); + *this, src_item, player); } } @@ -635,20 +629,25 @@ void IDropAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame take_count = count; int src_can_take_count = take_count; - // Source is detached - if (from_inv.type == InventoryLocation::DETACHED) { - ItemStack src_item = list_from->getItem(from_i); - src_item.count = take_count; - src_can_take_count = PLAYER_TO_SA(player)->detached_inventory_AllowTake( - from_inv.name, from_list, from_i, src_item, player); - } + ItemStack src_item = list_from->getItem(from_i); + src_item.count = take_count; - // Source is nodemeta - if (from_inv.type == InventoryLocation::NODEMETA) { - ItemStack src_item = list_from->getItem(from_i); - src_item.count = take_count; + // Run callbacks depending on source inventory + switch (from_inv.type) { + case InventoryLocation::DETACHED: + src_can_take_count = PLAYER_TO_SA(player)->detached_inventory_AllowTake( + *this, src_item, player); + break; + case InventoryLocation::NODEMETA: src_can_take_count = PLAYER_TO_SA(player)->nodemeta_inventory_AllowTake( - from_inv.p, from_list, from_i, src_item, player); + *this, src_item, player); + break; + case InventoryLocation::PLAYER: + src_can_take_count = PLAYER_TO_SA(player)->player_inventory_AllowTake( + *this, src_item, player); + break; + default: + break; } if (src_can_take_count != -1 && src_can_take_count < take_count) @@ -656,7 +655,8 @@ void IDropAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame int actually_dropped_count = 0; - ItemStack src_item = list_from->getItem(from_i); + // Update item due executed callbacks + src_item = list_from->getItem(from_i); // Drop the item ItemStack item1 = list_from->getItem(from_i); @@ -694,16 +694,21 @@ void IDropAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame Report drop to endpoints */ - // Source is detached - if (from_inv.type == InventoryLocation::DETACHED) { + switch (from_inv.type) { + case InventoryLocation::DETACHED: PLAYER_TO_SA(player)->detached_inventory_OnTake( - from_inv.name, from_list, from_i, src_item, player); - } - - // Source is nodemeta - if (from_inv.type == InventoryLocation::NODEMETA) { + *this, src_item, player); + break; + case InventoryLocation::NODEMETA: PLAYER_TO_SA(player)->nodemeta_inventory_OnTake( - from_inv.p, from_list, from_i, src_item, player); + *this, src_item, player); + break; + case InventoryLocation::PLAYER: + PLAYER_TO_SA(player)->player_inventory_OnTake( + *this, src_item, player); + break; + default: + break; } /* diff --git a/src/inventorymanager.h b/src/inventorymanager.h index 9ae92e5f..30a82d4b 100644 --- a/src/inventorymanager.h +++ b/src/inventorymanager.h @@ -134,16 +134,20 @@ struct InventoryAction virtual ~InventoryAction() = default;; }; -struct IMoveAction : public InventoryAction +struct MoveAction { - // count=0 means "everything" - u16 count = 0; InventoryLocation from_inv; std::string from_list; s16 from_i = -1; InventoryLocation to_inv; std::string to_list; s16 to_i = -1; +}; + +struct IMoveAction : public InventoryAction, public MoveAction +{ + // count=0 means "everything" + u16 count = 0; bool move_somewhere = false; // treat these as private @@ -181,13 +185,10 @@ struct IMoveAction : public InventoryAction void clientApply(InventoryManager *mgr, IGameDef *gamedef); }; -struct IDropAction : public InventoryAction +struct IDropAction : public InventoryAction, public MoveAction { // count=0 means "everything" u16 count = 0; - InventoryLocation from_inv; - std::string from_list; - s16 from_i = -1; IDropAction() = default; diff --git a/src/script/cpp_api/s_inventory.cpp b/src/script/cpp_api/s_inventory.cpp index 251ddb22..e9c09f72 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 93ec7fd4..e79b3d18 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 5a95d208..b49bb817 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 4d3257dc..8c7cdd93 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 8c01f9b1..0097177c 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 d60dfcaf..764455a5 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); };