From 983e45ae928fe295fcdd30b33544fda156df240a Mon Sep 17 00:00:00 2001 From: Perttu Ahola Date: Wed, 25 Jul 2012 14:35:59 +0300 Subject: [PATCH] Improve inventory callbacks a bit --- doc/lua_api.txt | 8 ++--- games/minimal/mods/default/init.lua | 6 ++-- games/minimal/mods/experimental/init.lua | 4 +-- src/inventorymanager.cpp | 39 +++++++++++--------- src/scriptapi.cpp | 46 +++++++++++++++--------- src/scriptapi.h | 8 ++--- 6 files changed, 65 insertions(+), 46 deletions(-) diff --git a/doc/lua_api.txt b/doc/lua_api.txt index 5fb2c34e3..4dcb0af87 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -1371,14 +1371,14 @@ Node definition (register_node) ^ Called when a player wants to put something into the inventory ^ Return value: number of items allowed to put - allow_metadata_inventory_take = func(pos, listname, index, count, player), + allow_metadata_inventory_take = func(pos, listname, index, stack, player), ^ Called when a player wants to take something out of the inventory ^ Return value: number of items allowed to take on_metadata_inventory_move = func(pos, from_list, from_index, to_list, to_index, count, player), on_metadata_inventory_put = func(pos, listname, index, stack, player), - on_metadata_inventory_take = func(pos, listname, index, count, player), + on_metadata_inventory_take = func(pos, listname, index, stack, player), ^ Called after the actual action has happened, according to what was allowed. ^ No return value } @@ -1447,13 +1447,13 @@ Detached inventory callbacks ^ Called when a player wants to put something into the inventory ^ Return value: number of items allowed to put - allow_take = func(inv, listname, index, count, player), + allow_take = func(inv, listname, index, stack, player), ^ Called when a player wants to take something out of the inventory ^ Return value: number of items allowed to take on_move = func(inv, from_list, from_index, to_list, to_index, count, player), on_put = func(inv, listname, index, stack, player), - on_take = func(inv, listname, index, count, player), + on_take = func(inv, listname, index, stack, player), ^ Called after the actual action has happened, according to what was allowed. ^ No return value } diff --git a/games/minimal/mods/default/init.lua b/games/minimal/mods/default/init.lua index fe7ab955e..133b9ed22 100644 --- a/games/minimal/mods/default/init.lua +++ b/games/minimal/mods/default/init.lua @@ -1223,7 +1223,7 @@ minetest.register_node("default:chest_locked", { end return stack:get_count() end, - allow_metadata_inventory_take = function(pos, listname, index, count, player) + allow_metadata_inventory_take = function(pos, listname, index, stack, player) local meta = minetest.env:get_meta(pos) if not has_locked_chest_privilege(meta, player) then minetest.log("action", player:get_player_name().. @@ -1232,7 +1232,7 @@ minetest.register_node("default:chest_locked", { minetest.pos_to_string(pos)) return 0 end - return count + return stack:get_count() end, on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) minetest.log("action", player:get_player_name().. @@ -1242,7 +1242,7 @@ minetest.register_node("default:chest_locked", { minetest.log("action", player:get_player_name().. " moves stuff to locked chest at "..minetest.pos_to_string(pos)) end, - on_metadata_inventory_take = function(pos, listname, index, count, player) + on_metadata_inventory_take = function(pos, listname, index, stack, player) minetest.log("action", player:get_player_name().. " takes stuff from locked chest at "..minetest.pos_to_string(pos)) end, diff --git a/games/minimal/mods/experimental/init.lua b/games/minimal/mods/experimental/init.lua index 0b45aeb62..2edfd0f67 100644 --- a/games/minimal/mods/experimental/init.lua +++ b/games/minimal/mods/experimental/init.lua @@ -534,7 +534,7 @@ local inv = minetest.create_detached_inventory("test_inventory", { experimental.print_to_everything("allow put asked") return 1 -- Allow only 1 end, - allow_take = function(inv, listname, index, count, player) + allow_take = function(inv, listname, index, stack, player) experimental.print_to_everything("allow take asked") return 4 -- Allow 4 at max end, @@ -544,7 +544,7 @@ local inv = minetest.create_detached_inventory("test_inventory", { on_put = function(inv, listname, index, stack, player) experimental.print_to_everything(player:get_player_name().." put items") end, - on_take = function(inv, listname, index, count, player) + on_take = function(inv, listname, index, stack, player) experimental.print_to_everything(player:get_player_name().." took items") end, }) diff --git a/src/inventorymanager.cpp b/src/inventorymanager.cpp index 35e986b56..02b887ac2 100644 --- a/src/inventorymanager.cpp +++ b/src/inventorymanager.cpp @@ -238,8 +238,10 @@ void IMoveAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame if(from_inv.type == InventoryLocation::DETACHED) { lua_State *L = player->getEnv()->getLua(); + ItemStack src_item = list_from->getItem(from_i); + src_item.count = try_take_count; src_can_take_count = scriptapi_detached_inventory_allow_take( - L, from_inv.name, from_list, from_i, try_take_count, player); + L, from_inv.name, from_list, from_i, src_item, player); } } @@ -272,8 +274,10 @@ void IMoveAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame if(from_inv.type == InventoryLocation::NODEMETA) { lua_State *L = player->getEnv()->getLua(); + ItemStack src_item = list_from->getItem(from_i); + src_item.count = try_take_count; src_can_take_count = scriptapi_nodemeta_inventory_allow_take( - L, from_inv.p, from_list, from_i, try_take_count, player); + L, from_inv.p, from_list, from_i, src_item, player); } } @@ -300,6 +304,9 @@ void IMoveAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame } count = new_count; + + ItemStack src_item = list_from->getItem(from_i); + src_item.count = count; /* Perform actual move @@ -341,8 +348,6 @@ void IMoveAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame if(to_inv.type == InventoryLocation::DETACHED) { lua_State *L = player->getEnv()->getLua(); - ItemStack src_item = list_from->getItem(from_i); - src_item.count = count; scriptapi_detached_inventory_on_put( L, to_inv.name, to_list, to_i, src_item, player); } @@ -350,10 +355,8 @@ void IMoveAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame if(from_inv.type == InventoryLocation::DETACHED) { lua_State *L = player->getEnv()->getLua(); - ItemStack src_item = list_from->getItem(from_i); - src_item.count = count; scriptapi_detached_inventory_on_take( - L, from_inv.name, from_list, from_i, src_item.count, player); + L, from_inv.name, from_list, from_i, src_item, player); } } @@ -374,8 +377,6 @@ void IMoveAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame if(to_inv.type == InventoryLocation::NODEMETA) { lua_State *L = player->getEnv()->getLua(); - ItemStack src_item = list_from->getItem(from_i); - src_item.count = count; scriptapi_nodemeta_inventory_on_put( L, to_inv.p, to_list, to_i, src_item, player); } @@ -383,10 +384,8 @@ void IMoveAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame else if(from_inv.type == InventoryLocation::NODEMETA) { lua_State *L = player->getEnv()->getLua(); - ItemStack src_item = list_from->getItem(from_i); - src_item.count = count; scriptapi_nodemeta_inventory_on_take( - L, from_inv.p, from_list, from_i, src_item.count, player); + L, from_inv.p, from_list, from_i, src_item, player); } } @@ -485,16 +484,20 @@ void IDropAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame if(from_inv.type == InventoryLocation::DETACHED) { lua_State *L = player->getEnv()->getLua(); + ItemStack src_item = list_from->getItem(from_i); + src_item.count = take_count; src_can_take_count = scriptapi_detached_inventory_allow_take( - L, from_inv.name, from_list, from_i, take_count, player); + L, from_inv.name, from_list, from_i, src_item, player); } // Source is nodemeta if(from_inv.type == InventoryLocation::NODEMETA) { lua_State *L = player->getEnv()->getLua(); + ItemStack src_item = list_from->getItem(from_i); + src_item.count = take_count; src_can_take_count = scriptapi_nodemeta_inventory_allow_take( - L, from_inv.p, from_list, from_i, take_count, player); + L, from_inv.p, from_list, from_i, src_item, player); } if(src_can_take_count < take_count) @@ -502,6 +505,8 @@ void IDropAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame int actually_dropped_count = 0; + ItemStack src_item = list_from->getItem(from_i); + // Drop the item ItemStack item1 = list_from->getItem(from_i); if(scriptapi_item_on_drop(player->getEnv()->getLua(), item1, player, @@ -528,6 +533,8 @@ void IDropAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame <<" list=\""<get(node).name.c_str(), "allow_metadata_inventory_take")) - return count; + return stack.count; // Call function(pos, listname, index, count, player) // pos @@ -5830,12 +5834,14 @@ int scriptapi_nodemeta_inventory_allow_take(lua_State *L, v3s16 p, lua_pushstring(L, listname.c_str()); // index lua_pushinteger(L, index + 1); - // count - lua_pushinteger(L, count); + // stack + LuaItemStack::create(L, stack); // player objectref_get_or_create(L, player); if(lua_pcall(L, 5, 1, 0)) script_error(L, "error: %s", lua_tostring(L, -1)); + if(!lua_isnumber(L, -1)) + throw LuaError(L, "allow_metadata_inventory_take should return a number"); return luaL_checkinteger(L, -1); } @@ -5918,7 +5924,7 @@ void scriptapi_nodemeta_inventory_on_put(lua_State *L, v3s16 p, // Report taken items void scriptapi_nodemeta_inventory_on_take(lua_State *L, v3s16 p, - const std::string &listname, int index, int count, + const std::string &listname, int index, ItemStack &stack, ServerActiveObject *player) { realitycheck(L); @@ -5937,15 +5943,15 @@ void scriptapi_nodemeta_inventory_on_take(lua_State *L, v3s16 p, "on_metadata_inventory_take")) return; - // Call function(pos, listname, index, count, player) + // Call function(pos, listname, index, stack, player) // pos push_v3s16(L, p); // listname lua_pushstring(L, listname.c_str()); // index lua_pushinteger(L, index + 1); - // count - lua_pushinteger(L, count); + // stack + LuaItemStack::create(L, stack); // player objectref_get_or_create(L, player); if(lua_pcall(L, 5, 0, 0)) @@ -6031,6 +6037,8 @@ int scriptapi_detached_inventory_allow_move(lua_State *L, objectref_get_or_create(L, player); if(lua_pcall(L, 7, 1, 0)) script_error(L, "error: %s", lua_tostring(L, -1)); + if(!lua_isnumber(L, -1)) + throw LuaError(L, "allow_move should return a number"); return luaL_checkinteger(L, -1); } @@ -6063,13 +6071,15 @@ int scriptapi_detached_inventory_allow_put(lua_State *L, objectref_get_or_create(L, player); if(lua_pcall(L, 5, 1, 0)) script_error(L, "error: %s", lua_tostring(L, -1)); + if(!lua_isnumber(L, -1)) + throw LuaError(L, "allow_put should return a number"); return luaL_checkinteger(L, -1); } // Return number of accepted items to be taken int scriptapi_detached_inventory_allow_take(lua_State *L, const std::string &name, - const std::string &listname, int index, int count, + const std::string &listname, int index, ItemStack &stack, ServerActiveObject *player) { realitycheck(L); @@ -6078,9 +6088,9 @@ int scriptapi_detached_inventory_allow_take(lua_State *L, // Push callback function on stack if(!get_detached_inventory_callback(L, name, "allow_take")) - return count; // All will be accepted + return stack.count; // All will be accepted - // Call function(inv, listname, index, count, player) + // Call function(inv, listname, index, stack, player) // inv InventoryLocation loc; loc.setDetached(name); @@ -6089,12 +6099,14 @@ int scriptapi_detached_inventory_allow_take(lua_State *L, lua_pushstring(L, listname.c_str()); // index lua_pushinteger(L, index + 1); - // count - lua_pushinteger(L, count); + // stack + LuaItemStack::create(L, stack); // player objectref_get_or_create(L, player); if(lua_pcall(L, 5, 1, 0)) script_error(L, "error: %s", lua_tostring(L, -1)); + if(!lua_isnumber(L, -1)) + throw LuaError(L, "allow_take should return a number"); return luaL_checkinteger(L, -1); } @@ -6168,7 +6180,7 @@ void scriptapi_detached_inventory_on_put(lua_State *L, // Report taken items void scriptapi_detached_inventory_on_take(lua_State *L, const std::string &name, - const std::string &listname, int index, int count, + const std::string &listname, int index, ItemStack &stack, ServerActiveObject *player) { realitycheck(L); @@ -6179,7 +6191,7 @@ void scriptapi_detached_inventory_on_take(lua_State *L, if(!get_detached_inventory_callback(L, name, "on_take")) return; - // Call function(inv, listname, index, count, player) + // Call function(inv, listname, index, stack, player) // inv InventoryLocation loc; loc.setDetached(name); @@ -6188,8 +6200,8 @@ void scriptapi_detached_inventory_on_take(lua_State *L, lua_pushstring(L, listname.c_str()); // index lua_pushinteger(L, index + 1); - // count - lua_pushinteger(L, count); + // stack + LuaItemStack::create(L, stack); // player objectref_get_or_create(L, player); if(lua_pcall(L, 5, 0, 0)) diff --git a/src/scriptapi.h b/src/scriptapi.h index f695e5263..0ae359112 100644 --- a/src/scriptapi.h +++ b/src/scriptapi.h @@ -113,7 +113,7 @@ int scriptapi_nodemeta_inventory_allow_put(lua_State *L, v3s16 p, ServerActiveObject *player); // Return number of accepted items to be taken int scriptapi_nodemeta_inventory_allow_take(lua_State *L, v3s16 p, - const std::string &listname, int index, int count, + const std::string &listname, int index, ItemStack &stack, ServerActiveObject *player); // Report moved items void scriptapi_nodemeta_inventory_on_move(lua_State *L, v3s16 p, @@ -126,7 +126,7 @@ void scriptapi_nodemeta_inventory_on_put(lua_State *L, v3s16 p, ServerActiveObject *player); // Report taken items void scriptapi_nodemeta_inventory_on_take(lua_State *L, v3s16 p, - const std::string &listname, int index, int count, + const std::string &listname, int index, ItemStack &stack, ServerActiveObject *player); /* Detached inventory callbacks */ @@ -144,7 +144,7 @@ int scriptapi_detached_inventory_allow_put(lua_State *L, // Return number of accepted items to be taken int scriptapi_detached_inventory_allow_take(lua_State *L, const std::string &name, - const std::string &listname, int index, int count, + const std::string &listname, int index, ItemStack &stack, ServerActiveObject *player); // Report moved items void scriptapi_detached_inventory_on_move(lua_State *L, @@ -160,7 +160,7 @@ void scriptapi_detached_inventory_on_put(lua_State *L, // Report taken items void scriptapi_detached_inventory_on_take(lua_State *L, const std::string &name, - const std::string &listname, int index, int count, + const std::string &listname, int index, ItemStack &stack, ServerActiveObject *player); /* luaentity */