From 9e48f292f14fe96c98b5cfe18a32bcb1bc3d7c24 Mon Sep 17 00:00:00 2001
From: Andrei Karas <akaras@inbox.ru>
Date: Tue, 5 Sep 2017 01:03:01 +0300
Subject: Fix adding stackable items to mail.

---
 src/net/eathena/mail2recv.cpp         | 42 ++++++++++++++++++++++-------------
 src/resources/inventory/inventory.cpp | 15 +++++++++++++
 src/resources/inventory/inventory.h   |  2 ++
 3 files changed, 43 insertions(+), 16 deletions(-)

(limited to 'src')

diff --git a/src/net/eathena/mail2recv.cpp b/src/net/eathena/mail2recv.cpp
index d3537a48a..b2e435bee 100644
--- a/src/net/eathena/mail2recv.cpp
+++ b/src/net/eathena/mail2recv.cpp
@@ -145,24 +145,34 @@ void Mail2Recv::processAddItemResult(Net::MessageIn &msg)
         delete options;
         return;
     }
-    const int slot = inventory->addItem(itemId,
-        itemType,
-        amount,
-        refine,
-        ItemColorManager::getColorFromCards(&cards[0]),
-        fromBool(identify, Identified),
-        damaged,
-        Favorite_false,
-        Equipm_false,
-        Equipped_false);
-    if (slot == -1)
+
+    Item *const item = inventory->findItemByTag(index);
+    if (item == nullptr)
     {
-        delete options;
-        return;
+        const int slot = inventory->addItem(itemId,
+            itemType,
+            amount,
+            refine,
+            ItemColorManager::getColorFromCards(&cards[0]),
+            fromBool(identify, Identified),
+            damaged,
+            Favorite_false,
+            Equipm_false,
+            Equipped_false);
+        if (slot == -1)
+        {
+            delete options;
+            return;
+        }
+        inventory->setCards(slot, cards, maxCards);
+        inventory->setOptions(slot, options);
+        inventory->setTag(slot, index);
     }
-    inventory->setCards(slot, cards, maxCards);
-    inventory->setOptions(slot, options);
-    inventory->setTag(slot, index);
+    else
+    {
+        item->increaseQuantity(amount);
+    }
+
     mailEditWindow->updateItems();
     delete options;
 }
diff --git a/src/resources/inventory/inventory.cpp b/src/resources/inventory/inventory.cpp
index 7363bdd30..d256ea9ac 100644
--- a/src/resources/inventory/inventory.cpp
+++ b/src/resources/inventory/inventory.cpp
@@ -420,6 +420,21 @@ int Inventory::findIndexByTag(const int tag) const
     return -1;
 }
 
+Item *Inventory::findItemByTag(const int tag) const
+{
+    for (unsigned i = 0; i < mSize; i++)
+    {
+        Item *const item = mItems[i];
+        if (item != nullptr &&
+            item->mTag == tag)
+        {
+            return item;
+        }
+    }
+
+    return nullptr;
+}
+
 bool Inventory::addVirtualItem(const Item *const item,
                                int index,
                                const int amount)
diff --git a/src/resources/inventory/inventory.h b/src/resources/inventory/inventory.h
index a7b1e8e73..573a0f5c0 100644
--- a/src/resources/inventory/inventory.h
+++ b/src/resources/inventory/inventory.h
@@ -189,6 +189,8 @@ class Inventory notfinal
 
         int findIndexByTag(const int tag) const;
 
+        Item *findItemByTag(const int tag) const;
+
         virtual bool addVirtualItem(const Item *const item,
                                     int index,
                                     const int amount);
-- 
cgit v1.2.3-70-g09d2