Inventory: Fix wrong stack size behaviour and item loss (#6039)

Also fix itemFits and remove constness-nonsense
This commit is contained in:
SmallJoker 2017-06-25 11:39:39 +02:00 committed by GitHub
parent cad10ce3b7
commit c08cc0533f
4 changed files with 8 additions and 13 deletions

@ -584,7 +584,7 @@ bool PlayerDatabasePostgreSQL::loadPlayer(RemotePlayer *player, PlayerSAO *sao)
if (itemStr.length() > 0) { if (itemStr.length() > 0) {
ItemStack stack; ItemStack stack;
stack.deSerialize(itemStr); stack.deSerialize(itemStr);
invList->addItem(pg_to_uint(results2, row2, 0), stack); invList->changeItem(pg_to_uint(results2, row2, 0), stack);
} }
} }
PQclear(results2); PQclear(results2);

@ -565,7 +565,7 @@ bool PlayerDatabaseSQLite3::loadPlayer(RemotePlayer *player, PlayerSAO *sao)
if (itemStr.length() > 0) { if (itemStr.length() > 0) {
ItemStack stack; ItemStack stack;
stack.deSerialize(itemStr); stack.deSerialize(itemStr);
invList->addItem(sqlite_to_uint(m_stmt_player_load_inventory_items, 0), stack); invList->changeItem(sqlite_to_uint(m_stmt_player_load_inventory_items, 0), stack);
} }
} }
sqlite3_reset(m_stmt_player_load_inventory_items); sqlite3_reset(m_stmt_player_load_inventory_items);

@ -254,11 +254,8 @@ std::string ItemStack::getItemString() const
} }
ItemStack ItemStack::addItem(const ItemStack &newitem_, ItemStack ItemStack::addItem(ItemStack newitem, IItemDefManager *itemdef)
IItemDefManager *itemdef)
{ {
ItemStack newitem = newitem_;
// If the item is empty or the position invalid, bail out // If the item is empty or the position invalid, bail out
if(newitem.empty()) if(newitem.empty())
{ {
@ -267,7 +264,7 @@ ItemStack ItemStack::addItem(const ItemStack &newitem_,
// If this is an empty item, it's an easy job. // If this is an empty item, it's an easy job.
else if(empty()) else if(empty())
{ {
const u16 stackMax = getStackMax(itemdef); const u16 stackMax = newitem.getStackMax(itemdef);
*this = newitem; *this = newitem;
@ -303,11 +300,10 @@ ItemStack ItemStack::addItem(const ItemStack &newitem_,
return newitem; return newitem;
} }
bool ItemStack::itemFits(const ItemStack &newitem_, bool ItemStack::itemFits(ItemStack newitem,
ItemStack *restitem, ItemStack *restitem,
IItemDefManager *itemdef) const IItemDefManager *itemdef) const
{ {
ItemStack newitem = newitem_;
// If the item is empty or the position invalid, bail out // If the item is empty or the position invalid, bail out
if(newitem.empty()) if(newitem.empty())
@ -317,7 +313,7 @@ bool ItemStack::itemFits(const ItemStack &newitem_,
// If this is an empty item, it's an easy job. // If this is an empty item, it's an easy job.
else if(empty()) else if(empty())
{ {
const u16 stackMax = getStackMax(itemdef); const u16 stackMax = newitem.getStackMax(itemdef);
// If the item fits fully, delete it // If the item fits fully, delete it
if (newitem.count <= stackMax) { if (newitem.count <= stackMax) {

@ -143,13 +143,12 @@ struct ItemStack
// If cannot be added at all, returns the item back. // If cannot be added at all, returns the item back.
// If can be added partly, decremented item is returned back. // If can be added partly, decremented item is returned back.
// If can be added fully, empty item is returned. // If can be added fully, empty item is returned.
ItemStack addItem(const ItemStack &newitem, ItemStack addItem(ItemStack newitem, IItemDefManager *itemdef);
IItemDefManager *itemdef);
// Checks whether newitem could be added. // Checks whether newitem could be added.
// If restitem is non-NULL, it receives the part of newitem that // If restitem is non-NULL, it receives the part of newitem that
// would be left over after adding. // would be left over after adding.
bool itemFits(const ItemStack &newitem, bool itemFits(ItemStack newitem,
ItemStack *restitem, // may be NULL ItemStack *restitem, // may be NULL
IItemDefManager *itemdef) const; IItemDefManager *itemdef) const;