Fix inventory replace bug
authorest31 <MTest31@outlook.com>
Wed, 19 Aug 2015 00:28:37 +0000 (02:28 +0200)
committerest31 <MTest31@outlook.com>
Wed, 19 Aug 2015 01:42:00 +0000 (03:42 +0200)
src/inventory.cpp
src/inventory.h
src/inventorymanager.cpp

index 6c7c8cdd19ee6dc75240efd538c4b3f20e6dd20f..af8b1b301db85b4231250c1910da03373208e12d 100644 (file)
@@ -163,7 +163,7 @@ void ItemStack::deSerialize(std::istream &is, IItemDefManager *itemdef)
        std::getline(is, tmp, ' ');
        if(!tmp.empty())
                throw SerializationError("Unexpected text after item name");
-       
+
        if(name == "MaterialItem")
        {
                // Obsoleted on 2011-07-30
@@ -478,7 +478,7 @@ void InventoryList::setName(const std::string &name)
 void InventoryList::serialize(std::ostream &os) const
 {
        //os.imbue(std::locale("C"));
-       
+
        os<<"Width "<<m_width<<"\n";
 
        for(u32 i=0; i<m_items.size(); i++)
@@ -653,7 +653,7 @@ ItemStack InventoryList::addItem(const ItemStack &newitem_)
 
        if(newitem.empty())
                return newitem;
-       
+
        /*
                First try to find if it could be added to some existing items
        */
@@ -818,7 +818,7 @@ void InventoryList::moveItemSomewhere(u32 i, InventoryList *dest, u32 count)
 }
 
 u32 InventoryList::moveItem(u32 i, InventoryList *dest, u32 dest_i,
-               u32 count, bool swap_if_needed)
+               u32 count, bool swap_if_needed, bool *did_swap)
 {
        if(this == dest && i == dest_i)
                return count;
@@ -850,6 +850,10 @@ u32 InventoryList::moveItem(u32 i, InventoryList *dest, u32 dest_i,
                // If olditem is returned, nothing was added.
                // Swap the items
                if (nothing_added && swap_if_needed) {
+                       // Tell that we swapped
+                       if (did_swap != NULL) {
+                               *did_swap = true;
+                       }
                        // Take item from source list
                        item1 = changeItem(i, ItemStack());
                        // Adding was not possible, swap the items.
index e3c994fc3db9f8eb6f97379c1b5b62cc4ec17b4e..a690eb5ae29d825b4635888d23d1a0aa407fb738 100644 (file)
@@ -246,7 +246,7 @@ public:
        // count is the maximum number of items to move (0 for everything)
        // returns number of moved items
        u32 moveItem(u32 i, InventoryList *dest, u32 dest_i,
-               u32 count = 0, bool swap_if_needed = true);
+               u32 count = 0, bool swap_if_needed = true, bool *did_swap = NULL);
 
        // like moveItem, but without a fixed destination index
        // also with optional rollback recording
index bf5a7dd9d3fde94d12c5dccda203d03bd834e09e..476768b8c8828752513755359c0794aefa7014ff 100644 (file)
@@ -375,8 +375,9 @@ void IMoveAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame
                If something is wrong (source item is empty, destination is the
                same as source), nothing happens
        */
+       bool did_swap = false;
        move_count = list_from->moveItem(from_i,
-               list_to, to_i, count, !caused_by_move_somewhere);
+               list_to, to_i, count, !caused_by_move_somewhere, &did_swap);
 
        // If source is infinite, reset it's stack
        if (src_can_take_count == -1) {
@@ -397,7 +398,7 @@ void IMoveAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame
                                }
                        }
                }
-               if (move_count > 0) {
+               if (move_count > 0 || did_swap) {
                        list_from->deleteItem(from_i);
                        list_from->addItem(from_i, from_stack_was);
                }