Improve inventory callbacks a bit
authorPerttu Ahola <celeron55@gmail.com>
Wed, 25 Jul 2012 11:35:59 +0000 (14:35 +0300)
committerPerttu Ahola <celeron55@gmail.com>
Wed, 25 Jul 2012 12:39:39 +0000 (15:39 +0300)
doc/lua_api.txt
games/minimal/mods/default/init.lua
games/minimal/mods/experimental/init.lua
src/inventorymanager.cpp
src/scriptapi.cpp
src/scriptapi.h

index 5fb2c34e38144960fd230f381a8620da714c6d45..4dcb0af877f26f8acb218d4855a2b59561ecfe8b 100644 (file)
@@ -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
 }
index fe7ab955ec26f199784af79b837ef2f1a41c7971..133b9ed2287c446563b43853a8fc18d83bab936e 100644 (file)
@@ -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,
index 0b45aeb62fc8bbffeb4cc0002f4b7a1a4a0de89e..2edfd0f67e04696eed8d01be81137120a9cc60b5 100644 (file)
@@ -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,
 })
index 35e986b56ee94aa0eb5b7b7c55a6668b379744f3..02b887ac2e857805efb62d5a690716ad841d6e5b 100644 (file)
@@ -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=\""<<from_list<<"\""
                        <<" i="<<from_i
                        <<std::endl;
+       
+       src_item.count = actually_dropped_count;
 
        /*
                Report drop to endpoints
@@ -538,7 +545,7 @@ void IDropAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame
        {
                lua_State *L = player->getEnv()->getLua();
                scriptapi_detached_inventory_on_take(
-                               L, from_inv.name, from_list, from_i, actually_dropped_count, player);
+                               L, from_inv.name, from_list, from_i, src_item, player);
        }
 
        // Source is nodemeta
@@ -546,7 +553,7 @@ void IDropAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame
        {
                lua_State *L = player->getEnv()->getLua();
                scriptapi_nodemeta_inventory_on_take(
-                               L, from_inv.p, from_list, from_i, actually_dropped_count, player);
+                               L, from_inv.p, from_list, from_i, src_item, player);
        }
 }
 
index 18a7c6a273db83e7a1496909e3a67040fce65c87..e1d9185420235113059c0cce5ef285e5fd7aaffc 100644 (file)
@@ -5762,6 +5762,8 @@ int scriptapi_nodemeta_inventory_allow_move(lua_State *L, v3s16 p,
        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_metadata_inventory_move should return a number");
        return luaL_checkinteger(L, -1);
 }
 
@@ -5799,12 +5801,14 @@ int scriptapi_nodemeta_inventory_allow_put(lua_State *L, v3s16 p,
        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_put should return a number");
        return luaL_checkinteger(L, -1);
 }
 
 // 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)
 {
        realitycheck(L);
@@ -5821,7 +5825,7 @@ int scriptapi_nodemeta_inventory_allow_take(lua_State *L, v3s16 p,
        // Push callback function on stack
        if(!get_item_callback(L, ndef->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))
index f695e5263f47391a420edddf972121b70a844f19..0ae3591122530c57d53c2a4630d510e6b108345c 100644 (file)
@@ -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 */