summaryrefslogtreecommitdiff
path: root/src/net/eathena
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2017-08-24 23:08:40 +0300
committerAndrei Karas <akaras@inbox.ru>2017-08-24 23:08:40 +0300
commit50f4daf53d60cfb90107fd4989dd1869bc1f3e35 (patch)
treeb86638cb85d3845d5186563315dd5af5d8e15c50 /src/net/eathena
parentaf5fde1f88bd5c8d0e11b59d73f6c76610c14acf (diff)
downloadmv-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.cpp7
-rw-r--r--src/net/eathena/mail2handler.h2
-rw-r--r--src/net/eathena/mail2recv.cpp65
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)