Inventory: Make addItem for empty ItemStacks respect max stack size

When adding items to an empty ItemStack, limit the number of items taken
based on the maximum stack size in the item description.
Likewise, when checking whether items will fit into an empty ItemStack,
only absorb as many items as are allowed in a single stack and return the rest.
This commit is contained in:
Jesse McDonald 2017-05-18 22:56:49 -05:00 committed by paramat
parent 16938adfc0
commit e6a9e6066a

@ -267,8 +267,17 @@ 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);
*this = newitem; *this = newitem;
newitem.clear();
// If the item fits fully, delete it
if (count <= stackMax) {
newitem.clear();
} else { // Else the item does not fit fully. Return the rest.
count = stackMax;
newitem.remove(count);
}
} }
// If item name or metadata differs, bail out // If item name or metadata differs, bail out
else if (name != newitem.name else if (name != newitem.name
@ -308,7 +317,14 @@ 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())
{ {
newitem.clear(); const u16 stackMax = getStackMax(itemdef);
// If the item fits fully, delete it
if (newitem.count <= stackMax) {
newitem.clear();
} else { // Else the item does not fit fully. Return the rest.
newitem.remove(stackMax);
}
} }
// If item name or metadata differs, bail out // If item name or metadata differs, bail out
else if (name != newitem.name else if (name != newitem.name
@ -322,7 +338,6 @@ bool ItemStack::itemFits(const ItemStack &newitem_,
newitem.clear(); newitem.clear();
} }
// Else the item does not fit fully. Return the rest. // Else the item does not fit fully. Return the rest.
// the rest.
else else
{ {
u16 freespace = freeSpace(itemdef); u16 freespace = freeSpace(itemdef);