diff options
author | Andrei Karas <akaras@inbox.ru> | 2017-08-24 23:08:40 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2017-08-24 23:08:40 +0300 |
commit | 50f4daf53d60cfb90107fd4989dd1869bc1f3e35 (patch) | |
tree | b86638cb85d3845d5186563315dd5af5d8e15c50 /src/net/eathena | |
parent | af5fde1f88bd5c8d0e11b59d73f6c76610c14acf (diff) | |
download | mv-50f4daf53d60cfb90107fd4989dd1869bc1f3e35.tar.gz mv-50f4daf53d60cfb90107fd4989dd1869bc1f3e35.tar.bz2 mv-50f4daf53d60cfb90107fd4989dd1869bc1f3e35.tar.xz mv-50f4daf53d60cfb90107fd4989dd1869bc1f3e35.zip |
Add support for removing item from mail.
Diffstat (limited to 'src/net/eathena')
-rw-r--r-- | src/net/eathena/mail2handler.cpp | 7 | ||||
-rw-r--r-- | src/net/eathena/mail2handler.h | 2 | ||||
-rw-r--r-- | src/net/eathena/mail2recv.cpp | 65 |
3 files changed, 63 insertions, 11 deletions
diff --git a/src/net/eathena/mail2handler.cpp b/src/net/eathena/mail2handler.cpp index 1b19e4823..bc749b0bf 100644 --- a/src/net/eathena/mail2handler.cpp +++ b/src/net/eathena/mail2handler.cpp @@ -85,11 +85,9 @@ void Mail2Handler::addItem(const Item *const item, outMsg.writeInt16(CAST_S16(amount), "amount"); } -void Mail2Handler::removeItem(const Item *const item, +void Mail2Handler::removeItem(const int index, const int amount) const { - if (item == nullptr) - return; if (packetVersion < 20140416 || (serverVersion < 19 && serverVersion != 0)) { @@ -97,8 +95,7 @@ void Mail2Handler::removeItem(const Item *const item, } createOutPacket(CMSG_MAIL2_REMOVE_ITEM_MAIL); - outMsg.writeInt16(CAST_S16( - item->getInvIndex() + INVENTORY_OFFSET), "index"); + outMsg.writeInt16(CAST_S16(index + INVENTORY_OFFSET), "index"); outMsg.writeInt16(CAST_S16(amount), "amount"); } diff --git a/src/net/eathena/mail2handler.h b/src/net/eathena/mail2handler.h index 0b7957375..f6f217579 100644 --- a/src/net/eathena/mail2handler.h +++ b/src/net/eathena/mail2handler.h @@ -40,7 +40,7 @@ class Mail2Handler final : public Net::Mail2Handler void addItem(const Item *const item, const int amount) const override final; - void removeItem(const Item *const item, + void removeItem(const int index, const int amount) const override final; void sendMail(const std::string &to, diff --git a/src/net/eathena/mail2recv.cpp b/src/net/eathena/mail2recv.cpp index 521abb8dc..ee9c6b6da 100644 --- a/src/net/eathena/mail2recv.cpp +++ b/src/net/eathena/mail2recv.cpp @@ -28,6 +28,8 @@ #include "const/resources/item/cards.h" +#include "being/playerinfo.h" + #include "enums/resources/notifytypes.h" #include "gui/windows/maileditwindow.h" @@ -47,6 +49,7 @@ #include "resources/item/itemoptionslist.h" #include "utils/checkutils.h" +#include "utils/gettext.h" #include "debug.h" @@ -116,8 +119,9 @@ void Mail2Recv::processAddItemResult(Net::MessageIn &msg) if (res != 0) { + Inventory *const inv = PlayerInfo::getInventory(); std::string itemName; - const Item *const item = inventory->getItem(index); + const Item *const item = inv->getItem(index); if (item == nullptr) { const ItemInfo &info = ItemDB::get(itemId); @@ -177,16 +181,67 @@ void Mail2Recv::processAddItemResult(Net::MessageIn &msg) } inventory->setCards(slot, cards, 4); inventory->setOptions(slot, options); + inventory->setTag(slot, index); delete options; } void Mail2Recv::processRemoveItemResult(Net::MessageIn &msg) { - UNIMPLEMENTEDPACKET; - msg.readUInt8("result"); - msg.readInt16("index"); - msg.readInt16("count"); + const int result = msg.readUInt8("result"); + const int index = msg.readInt16("index") - INVENTORY_OFFSET; + const int amount = msg.readInt16("count"); msg.readInt16("weight"); + + if (result == 0) + { + Inventory *const inv = PlayerInfo::getInventory(); + if (inv == nullptr) + { + reportAlways("Player inventory not exists"); + return; + } + std::string itemName; + const Item *const item = inv->getItem(index); + if (item != nullptr) + { + itemName = item->getName(); + } + else + { + // TRANSLATORS: unknown item name + itemName = _("Unknown item"); + } + + NotifyManager::notify( + NotifyTypes::MAIL_REMOVE_ITEM_ERROR, + itemName); + return; + } + if (mailEditWindow == nullptr) + { + reportAlways("Mail edit window not created"); + return; + } + Inventory *const inventory = mailEditWindow->getInventory(); + if (inventory == nullptr) + { + reportAlways("Mail edit window inventory not exists"); + return; + } + const int index2 = inventory->findIndexByTag(index); + if (index2 == -1) + { + reportAlways("Item not exists in mail edit window."); + return; + } + Item *const item = inventory->getItem(index2); + if (item == nullptr) + { + reportAlways("Item not exists."); + return; + } + + item->increaseQuantity(-amount); } void Mail2Recv::processCheckNameResult(Net::MessageIn &msg) |