diff options
-rw-r--r-- | src/inventory.cpp | 12 | ||||
-rw-r--r-- | src/inventory.h | 2 | ||||
-rw-r--r-- | src/inventorymanager.cpp | 5 |
3 files changed, 12 insertions, 7 deletions
diff --git a/src/inventory.cpp b/src/inventory.cpp index 6c7c8cdd1..af8b1b301 100644 --- a/src/inventory.cpp +++ b/src/inventory.cpp @@ -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. diff --git a/src/inventory.h b/src/inventory.h index e3c994fc3..a690eb5ae 100644 --- a/src/inventory.h +++ b/src/inventory.h @@ -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 diff --git a/src/inventorymanager.cpp b/src/inventorymanager.cpp index bf5a7dd9d..476768b8c 100644 --- a/src/inventorymanager.cpp +++ b/src/inventorymanager.cpp @@ -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); } |