Inventory: Make addItem for empty ItemStacks respect max stack size
authorJesse McDonald <nybble41@gmail.com>
Fri, 19 May 2017 03:56:49 +0000 (22:56 -0500)
committerparamat <mat.gregory@virginmedia.com>
Wed, 21 Jun 2017 00:53:57 +0000 (01:53 +0100)
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.

src/inventory.cpp

index 5ce82737a940ae52d402940e7b10bf81839962f0..24eebba808c156f6d21f39484101386b0ab9196d 100644 (file)
@@ -267,8 +267,17 @@ ItemStack ItemStack::addItem(const ItemStack &newitem_,
        // If this is an empty item, it's an easy job.
        else if(empty())
        {
+               const u16 stackMax = getStackMax(itemdef);
+
                *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
        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.
        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
        else if (name != newitem.name
@@ -322,7 +338,6 @@ bool ItemStack::itemFits(const ItemStack &newitem_,
                newitem.clear();
        }
        // Else the item does not fit fully. Return the rest.
-       // the rest.
        else
        {
                u16 freespace = freeSpace(itemdef);