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