Properly handle dropping of items from nodes, and disallow moving items directly...
authorPerttu Ahola <celeron55@gmail.com>
Fri, 1 Jun 2012 21:42:56 +0000 (00:42 +0300)
committerPerttu Ahola <celeron55@gmail.com>
Sun, 3 Jun 2012 19:31:01 +0000 (22:31 +0300)
src/inventorymanager.cpp

index 46f744f8b77b660cf395f4915d10be5da7758432..b6740f1ba9fc54b9ec195754d8683ff471864520 100644 (file)
@@ -202,6 +202,14 @@ void IMoveAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame
        
        // Handle node metadata move
        if(from_inv.type == InventoryLocation::NODEMETA &&
+                       to_inv.type == InventoryLocation::NODEMETA &&
+                       from_inv.p != to_inv.p)
+       {
+               errorstream<<"Directly moving items between two nodes is "
+                               <<"disallowed."<<std::endl;
+               return;
+       }
+       else if(from_inv.type == InventoryLocation::NODEMETA &&
                        to_inv.type == InventoryLocation::NODEMETA &&
                        from_inv.p == to_inv.p)
        {
@@ -354,12 +362,31 @@ void IDropAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame
                return;
        }
 
-       // Take item from source list
        ItemStack item1;
-       if(count == 0)
-               item1 = list_from->changeItem(from_i, ItemStack());
+
+       // Handle node metadata take
+       if(from_inv.type == InventoryLocation::NODEMETA)
+       {
+               lua_State *L = player->getEnv()->getLua();
+               int count0 = count;
+               if(count0 == 0)
+                       count0 = list_from->getItem(from_i).count;
+               infostream<<player->getDescription()<<" dropping "<<count0
+                               <<" items from node at "<<PP(from_inv.p)<<std::endl;
+               ItemStack return_stack = scriptapi_node_on_metadata_inventory_take(
+                               L, from_inv.p, from_list, from_i, count0, player);
+               if(return_stack.count == 0)
+                       infostream<<"Node metadata gave no items"<<std::endl;
+               item1 = return_stack;
+       }
        else
-               item1 = list_from->takeItem(from_i, count);
+       {
+               // Take item from source list
+               if(count == 0)
+                       item1 = list_from->changeItem(from_i, ItemStack());
+               else
+                       item1 = list_from->takeItem(from_i, count);
+       }
 
        // Drop the item and apply the returned ItemStack
        ItemStack item2 = item1;