Skip to content

Commit

Permalink
Fix inventory replace bug
Browse files Browse the repository at this point in the history
  • Loading branch information
est31 committed Aug 19, 2015
1 parent c2d23ff commit 1fadf7f
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 7 deletions.
12 changes: 8 additions & 4 deletions src/inventory.cpp
Expand Up @@ -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
Expand Down Expand Up @@ -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++)
Expand Down Expand Up @@ -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
*/
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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.
Expand Down
2 changes: 1 addition & 1 deletion src/inventory.h
Expand Up @@ -246,7 +246,7 @@ class InventoryList
// 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
Expand Down
5 changes: 3 additions & 2 deletions src/inventorymanager.cpp
Expand Up @@ -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) {
Expand All @@ -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);
}
Expand Down

0 comments on commit 1fadf7f

Please sign in to comment.