summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2015-08-30 19:17:09 +0300
committerAndrei Karas <akaras@inbox.ru>2015-08-30 19:17:09 +0300
commit11f548068b7ac05220437f595403ac41cc222a1e (patch)
tree92146ed4308b7eceacf0da327789831a2d3b48e2
parent42a9e7b1eeced8503f909b0276ee251a2bfe75c6 (diff)
downloadmv-11f548068b7ac05220437f595403ac41cc222a1e.tar.gz
mv-11f548068b7ac05220437f595403ac41cc222a1e.tar.bz2
mv-11f548068b7ac05220437f595403ac41cc222a1e.tar.xz
mv-11f548068b7ac05220437f595403ac41cc222a1e.zip
Move receive code from tradehandler into separate file.
-rw-r--r--src/CMakeLists.txt6
-rw-r--r--src/Makefile.am10
-rw-r--r--src/net/ea/tradehandler.cpp129
-rw-r--r--src/net/ea/tradehandler.h11
-rw-r--r--src/net/ea/traderecv.cpp187
-rw-r--r--src/net/ea/traderecv.h45
-rw-r--r--src/net/eathena/tradehandler.cpp139
-rw-r--r--src/net/eathena/tradehandler.h14
-rw-r--r--src/net/eathena/traderecv.cpp162
-rw-r--r--src/net/eathena/traderecv.h45
-rw-r--r--src/net/tmwa/tradehandler.cpp130
-rw-r--r--src/net/tmwa/tradehandler.h9
-rw-r--r--src/net/tmwa/traderecv.cpp168
-rw-r--r--src/net/tmwa/traderecv.h41
14 files changed, 689 insertions, 407 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 5f1e45331..515e5f781 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1402,6 +1402,8 @@ SET(SRCS_EVOL
net/ea/token.h
net/ea/tradehandler.cpp
net/ea/tradehandler.h
+ net/ea/traderecv.cpp
+ net/ea/traderecv.h
)
SET(SRCS_TMWA
@@ -1488,6 +1490,8 @@ SET(SRCS_TMWA
net/tmwa/sprite.h
net/tmwa/tradehandler.cpp
net/tmwa/tradehandler.h
+ net/tmwa/traderecv.cpp
+ net/tmwa/traderecv.h
)
SET(SRCS_TMWAEATHENA
@@ -1717,6 +1721,8 @@ SET(SRCS_EATHENA
net/eathena/sprite.h
net/eathena/tradehandler.cpp
net/eathena/tradehandler.h
+ net/eathena/traderecv.cpp
+ net/eathena/traderecv.h
net/eathena/vendinghandler.cpp
net/eathena/vendinghandler.h
)
diff --git a/src/Makefile.am b/src/Makefile.am
index 26a9960a9..c9f26ae83 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1243,7 +1243,9 @@ manaplus_SOURCES += main.cpp \
net/ea/skillrecv.h \
net/ea/token.h \
net/ea/tradehandler.cpp \
- net/ea/tradehandler.h
+ net/ea/tradehandler.h \
+ net/ea/traderecv.cpp \
+ net/ea/traderecv.h
if ENABLE_TMWA
manaplus_CXXFLAGS += -DTMWA_SUPPORT
@@ -1330,7 +1332,9 @@ manaplus_SOURCES += \
net/tmwa/skillrecv.h \
net/tmwa/sprite.h \
net/tmwa/tradehandler.cpp \
- net/tmwa/tradehandler.h
+ net/tmwa/tradehandler.h \
+ net/tmwa/traderecv.cpp \
+ net/tmwa/traderecv.h
endif
if ENABLE_EATHENA
@@ -1563,6 +1567,8 @@ manaplus_SOURCES += gui/windows/bankwindow.cpp \
net/eathena/sprite.h \
net/eathena/tradehandler.cpp \
net/eathena/tradehandler.h \
+ net/eathena/traderecv.cpp \
+ net/eathena/traderecv.h \
net/eathena/vendinghandler.cpp \
net/eathena/vendinghandler.h
endif
diff --git a/src/net/ea/tradehandler.cpp b/src/net/ea/tradehandler.cpp
index e7bd9e86f..9329844c9 100644
--- a/src/net/ea/tradehandler.cpp
+++ b/src/net/ea/tradehandler.cpp
@@ -43,7 +43,6 @@
#include "debug.h"
extern std::string tradePartnerName;
-ConfirmDialog *confirmDlg = nullptr;
/**
* Listener for request trade dialogs
@@ -66,132 +65,4 @@ void TradeHandler::removeItem(const int slotNum A_UNUSED,
{
}
-void TradeHandler::processTradeResponseContinue(const uint8_t type)
-{
- switch (type)
- {
- case 0: // Too far away
- NotifyManager::notify(NotifyTypes::TRADE_FAIL_FAR_AWAY,
- tradePartnerName);
- break;
- case 1: // Character doesn't exist
- NotifyManager::notify(NotifyTypes::TRADE_FAIL_CHAR_NOT_EXISTS,
- tradePartnerName);
- break;
- case 2: // Invite request check failed...
- NotifyManager::notify(NotifyTypes::TRADE_CANCELLED_ERROR);
- break;
- case 3: // Trade accepted
- if (tradeWindow)
- {
- tradeWindow->reset();
- // TRANSLATORS: trade header
- tradeWindow->setCaption(strprintf(_("Trade: You and %s"),
- tradePartnerName.c_str()));
- tradeWindow->initTrade(tradePartnerName);
- tradeWindow->setVisible(Visible_true);
- }
- break;
- case 4: // Trade cancelled
- if (player_relations.hasPermission(tradePartnerName,
- PlayerRelation::SPEECH_LOG))
- {
- NotifyManager::notify(NotifyTypes::TRADE_CANCELLED_NAME,
- tradePartnerName);
- }
- // otherwise ignore silently
-
- if (tradeWindow)
- {
- tradeWindow->setVisible(Visible_false);
-// tradeWindow->clear();
- }
- PlayerInfo::setTrading(Trading_false);
- break;
- case 5:
- NotifyManager::notify(NotifyTypes::TRADE_CANCELLED_BUSY,
- tradePartnerName);
- break;
- default: // Shouldn't happen as well, but to be sure
- NotifyManager::notify(NotifyTypes::TRADE_ERROR_UNKNOWN,
- tradePartnerName);
- if (tradeWindow)
- tradeWindow->clear();
- break;
- }
-}
-
-void TradeHandler::processTradeOk(Net::MessageIn &msg)
-{
- // 0 means ok from myself, 1 means ok from other;
- if (tradeWindow)
- tradeWindow->receivedOk(msg.readUInt8("status") == 0U);
- else
- msg.readUInt8("status");
-}
-
-void TradeHandler::processTradeCancel(Net::MessageIn &msg A_UNUSED)
-{
- NotifyManager::notify(NotifyTypes::TRADE_CANCELLED);
- if (tradeWindow)
- {
- tradeWindow->setVisible(Visible_false);
- tradeWindow->reset();
- }
- PlayerInfo::setTrading(Trading_false);
-}
-
-void TradeHandler::processTradeComplete(Net::MessageIn &msg A_UNUSED)
-{
- NotifyManager::notify(NotifyTypes::TRADE_COMPLETE);
- if (tradeWindow)
- {
- tradeWindow->setVisible(Visible_false);
- tradeWindow->reset();
- }
- PlayerInfo::setTrading(Trading_false);
-}
-
-void TradeHandler::processTradeRequestContinue(const std::string &partner)
-{
- if (player_relations.hasPermission(partner,
- PlayerRelation::TRADE))
- {
- if (PlayerInfo::isTrading() == Trading_true || confirmDlg)
- {
- tradeHandler->respond(false);
- return;
- }
-
- tradePartnerName = partner;
- PlayerInfo::setTrading(Trading_true);
- if (tradeWindow)
- {
- if (tradePartnerName.empty() || tradeWindow->getAutoTradeNick()
- != tradePartnerName)
- {
- tradeWindow->clear();
- CREATEWIDGETV(confirmDlg, ConfirmDialog,
- // TRANSLATORS: trade message
- _("Request for Trade"),
- // TRANSLATORS: trade message
- strprintf(_("%s wants to trade with you, do"
- " you accept?"), tradePartnerName.c_str()),
- SOUND_REQUEST,
- true);
- confirmDlg->addActionListener(&listener);
- }
- else
- {
- tradeHandler->respond(true);
- }
- }
- }
- else
- {
- tradeHandler->respond(false);
- return;
- }
-}
-
} // namespace Ea
diff --git a/src/net/ea/tradehandler.h b/src/net/ea/tradehandler.h
index 38c2bca4a..9540f19ee 100644
--- a/src/net/ea/tradehandler.h
+++ b/src/net/ea/tradehandler.h
@@ -42,17 +42,6 @@ class TradeHandler notfinal : public Net::TradeHandler
void removeItem(const int slotNum,
const int amount) const override final;
-
- protected:
- static void processTradeOk(Net::MessageIn &msg);
-
- static void processTradeCancel(Net::MessageIn &msg);
-
- static void processTradeComplete(Net::MessageIn &msg);
-
- static void processTradeRequestContinue(const std::string &partner);
-
- static void processTradeResponseContinue(const uint8_t type);
};
} // namespace Ea
diff --git a/src/net/ea/traderecv.cpp b/src/net/ea/traderecv.cpp
new file mode 100644
index 000000000..006c3a41f
--- /dev/null
+++ b/src/net/ea/traderecv.cpp
@@ -0,0 +1,187 @@
+/*
+ * The ManaPlus Client
+ * Copyright (C) 2004-2009 The Mana World Development Team
+ * Copyright (C) 2009-2010 The Mana Developers
+ * Copyright (C) 2011-2015 The ManaPlus Developers
+ *
+ * This file is part of The ManaPlus Client.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "net/ea/traderecv.h"
+
+#include "notifymanager.h"
+
+#include "being/playerinfo.h"
+#include "being/playerrelation.h"
+
+#include "enums/resources/notifytypes.h"
+
+#include "gui/windows/tradewindow.h"
+
+#include "gui/widgets/createwidget.h"
+
+#include "net/messagein.h"
+
+#include "utils/gettext.h"
+#include "utils/stringutils.h"
+
+#include "listeners/requesttradelistener.h"
+
+#include "debug.h"
+
+extern std::string tradePartnerName;
+ConfirmDialog *confirmDlg = nullptr;
+
+/**
+ * Listener for request trade dialogs
+ */
+namespace
+{
+ RequestTradeListener listener;
+} // namespace
+
+namespace Ea
+{
+
+void TradeRecv::processTradeResponseContinue(const uint8_t type)
+{
+ switch (type)
+ {
+ case 0: // Too far away
+ NotifyManager::notify(NotifyTypes::TRADE_FAIL_FAR_AWAY,
+ tradePartnerName);
+ break;
+ case 1: // Character doesn't exist
+ NotifyManager::notify(NotifyTypes::TRADE_FAIL_CHAR_NOT_EXISTS,
+ tradePartnerName);
+ break;
+ case 2: // Invite request check failed...
+ NotifyManager::notify(NotifyTypes::TRADE_CANCELLED_ERROR);
+ break;
+ case 3: // Trade accepted
+ if (tradeWindow)
+ {
+ tradeWindow->reset();
+ // TRANSLATORS: trade header
+ tradeWindow->setCaption(strprintf(_("Trade: You and %s"),
+ tradePartnerName.c_str()));
+ tradeWindow->initTrade(tradePartnerName);
+ tradeWindow->setVisible(Visible_true);
+ }
+ break;
+ case 4: // Trade cancelled
+ if (player_relations.hasPermission(tradePartnerName,
+ PlayerRelation::SPEECH_LOG))
+ {
+ NotifyManager::notify(NotifyTypes::TRADE_CANCELLED_NAME,
+ tradePartnerName);
+ }
+ // otherwise ignore silently
+
+ if (tradeWindow)
+ {
+ tradeWindow->setVisible(Visible_false);
+// tradeWindow->clear();
+ }
+ PlayerInfo::setTrading(Trading_false);
+ break;
+ case 5:
+ NotifyManager::notify(NotifyTypes::TRADE_CANCELLED_BUSY,
+ tradePartnerName);
+ break;
+ default: // Shouldn't happen as well, but to be sure
+ NotifyManager::notify(NotifyTypes::TRADE_ERROR_UNKNOWN,
+ tradePartnerName);
+ if (tradeWindow)
+ tradeWindow->clear();
+ break;
+ }
+}
+
+void TradeRecv::processTradeOk(Net::MessageIn &msg)
+{
+ // 0 means ok from myself, 1 means ok from other;
+ if (tradeWindow)
+ tradeWindow->receivedOk(msg.readUInt8("status") == 0U);
+ else
+ msg.readUInt8("status");
+}
+
+void TradeRecv::processTradeCancel(Net::MessageIn &msg A_UNUSED)
+{
+ NotifyManager::notify(NotifyTypes::TRADE_CANCELLED);
+ if (tradeWindow)
+ {
+ tradeWindow->setVisible(Visible_false);
+ tradeWindow->reset();
+ }
+ PlayerInfo::setTrading(Trading_false);
+}
+
+void TradeRecv::processTradeComplete(Net::MessageIn &msg A_UNUSED)
+{
+ NotifyManager::notify(NotifyTypes::TRADE_COMPLETE);
+ if (tradeWindow)
+ {
+ tradeWindow->setVisible(Visible_false);
+ tradeWindow->reset();
+ }
+ PlayerInfo::setTrading(Trading_false);
+}
+
+void TradeRecv::processTradeRequestContinue(const std::string &partner)
+{
+ if (player_relations.hasPermission(partner,
+ PlayerRelation::TRADE))
+ {
+ if (PlayerInfo::isTrading() == Trading_true || confirmDlg)
+ {
+ tradeHandler->respond(false);
+ return;
+ }
+
+ tradePartnerName = partner;
+ PlayerInfo::setTrading(Trading_true);
+ if (tradeWindow)
+ {
+ if (tradePartnerName.empty() || tradeWindow->getAutoTradeNick()
+ != tradePartnerName)
+ {
+ tradeWindow->clear();
+ CREATEWIDGETV(confirmDlg, ConfirmDialog,
+ // TRANSLATORS: trade message
+ _("Request for Trade"),
+ // TRANSLATORS: trade message
+ strprintf(_("%s wants to trade with you, do"
+ " you accept?"), tradePartnerName.c_str()),
+ SOUND_REQUEST,
+ true);
+ confirmDlg->addActionListener(&listener);
+ }
+ else
+ {
+ tradeHandler->respond(true);
+ }
+ }
+ }
+ else
+ {
+ tradeHandler->respond(false);
+ return;
+ }
+}
+
+} // namespace Ea
diff --git a/src/net/ea/traderecv.h b/src/net/ea/traderecv.h
new file mode 100644
index 000000000..2d388a135
--- /dev/null
+++ b/src/net/ea/traderecv.h
@@ -0,0 +1,45 @@
+/*
+ * The ManaPlus Client
+ * Copyright (C) 2004-2009 The Mana World Development Team
+ * Copyright (C) 2009-2010 The Mana Developers
+ * Copyright (C) 2011-2015 The ManaPlus Developers
+ *
+ * This file is part of The ManaPlus Client.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef NET_EA_TRADERECV_H
+#define NET_EA_TRADERECV_H
+
+#include "net/tradehandler.h"
+
+namespace Net
+{
+ class MessageIn;
+}
+
+namespace Ea
+{
+ namespace TradeRecv
+ {
+ void processTradeOk(Net::MessageIn &msg);
+ void processTradeCancel(Net::MessageIn &msg);
+ void processTradeComplete(Net::MessageIn &msg);
+ void processTradeRequestContinue(const std::string &partner);
+ void processTradeResponseContinue(const uint8_t type);
+ } // namespace TradeRecv
+} // namespace Ea
+
+#endif // NET_EA_TRADERECV_H
diff --git a/src/net/eathena/tradehandler.cpp b/src/net/eathena/tradehandler.cpp
index 537e205f9..082b3bf60 100644
--- a/src/net/eathena/tradehandler.cpp
+++ b/src/net/eathena/tradehandler.cpp
@@ -33,8 +33,11 @@
#include "gui/windows/tradewindow.h"
+#include "net/ea/traderecv.h"
+
#include "net/eathena/messageout.h"
#include "net/eathena/protocol.h"
+#include "net/eathena/traderecv.h"
#include "net/ea/eaprotocol.h"
@@ -44,9 +47,6 @@ extern Net::TradeHandler *tradeHandler;
namespace EAthena
{
-int TradeHandler::mQuantity = 0;
-int TradeHandler::mItemIndex = -1;
-
TradeHandler::TradeHandler() :
MessageHandler(),
Ea::TradeHandler()
@@ -65,8 +65,8 @@ TradeHandler::TradeHandler() :
};
handledMessages = _messages;
tradeHandler = this;
- mItemIndex = -1;
- mQuantity = 0;
+ TradeRecv::mItemIndex = -1;
+ TradeRecv::mQuantity = 0;
}
@@ -75,35 +75,35 @@ void TradeHandler::handleMessage(Net::MessageIn &msg)
switch (msg.getId())
{
case SMSG_TRADE_REQUEST:
- processTradeRequest(msg);
+ TradeRecv::processTradeRequest(msg);
break;
case SMSG_TRADE_RESPONSE:
- processTradeResponse(msg);
+ TradeRecv::processTradeResponse(msg);
break;
case SMSG_TRADE_ITEM_ADD:
- processTradeItemAdd(msg);
+ TradeRecv::processTradeItemAdd(msg);
break;
case SMSG_TRADE_ITEM_ADD_RESPONSE:
- processTradeItemAddResponse(msg);
+ TradeRecv::processTradeItemAddResponse(msg);
break;
case SMSG_TRADE_OK:
- processTradeOk(msg);
+ Ea::TradeRecv::processTradeOk(msg);
break;
case SMSG_TRADE_CANCEL:
- processTradeCancel(msg);
+ Ea::TradeRecv::processTradeCancel(msg);
break;
case SMSG_TRADE_COMPLETE:
- processTradeComplete(msg);
+ Ea::TradeRecv::processTradeComplete(msg);
break;
case SMSG_TRADE_UNDO:
- processTradeUndo(msg);
+ TradeRecv::processTradeUndo(msg);
break;
default:
@@ -134,10 +134,11 @@ void TradeHandler::addItem(const Item *const item, const int amount) const
if (!item)
return;
- mItemIndex = item->getInvIndex();
- mQuantity = amount;
+ TradeRecv::mItemIndex = item->getInvIndex();
+ TradeRecv::mQuantity = amount;
createOutPacket(CMSG_TRADE_ITEM_ADD_REQUEST);
- outMsg.writeInt16(static_cast<int16_t>(mItemIndex + INVENTORY_OFFSET),
+ outMsg.writeInt16(static_cast<int16_t>(
+ TradeRecv::mItemIndex + INVENTORY_OFFSET),
"index");
outMsg.writeInt32(amount, "amount");
}
@@ -164,110 +165,4 @@ void TradeHandler::cancel() const
createOutPacket(CMSG_TRADE_CANCEL_REQUEST);
}
-void TradeHandler::processTradeRequest(Net::MessageIn &msg)
-{
- const std::string &partner = msg.readString(24, "name");
- msg.readInt32("char id");
- msg.readInt16("base level");
- processTradeRequestContinue(partner);
-}
-
-void TradeHandler::processTradeResponse(Net::MessageIn &msg)
-{
- const uint8_t type = msg.readUInt8("type");
- msg.readInt32("char id");
- msg.readInt16("base level");
- processTradeResponseContinue(type);
-}
-
-void TradeHandler::processTradeItemAdd(Net::MessageIn &msg)
-{
- const int type = msg.readInt16("type");
- const int itemType = msg.readUInt8("item type");
- const int amount = msg.readInt32("amount");
- const uint8_t identify = msg.readUInt8("identify");
- const Damaged damaged = fromBool(msg.readUInt8("attribute"), Damaged);
- const uint8_t refine = msg.readUInt8("refine");
- int cards[4];
- for (int f = 0; f < 4; f++)
- cards[f] = msg.readInt16("card");
-
- if (tradeWindow)
- {
- if (type == 0)
- {
- tradeWindow->setMoney(amount);
- }
- else
- {
- tradeWindow->addItem2(type,
- itemType,
- cards,
- 4,
- false,
- amount,
- refine,
- ItemColorManager::getColorFromCards(&cards[0]),
- fromBool(identify, Identified),
- damaged,
- Favorite_false,
- Equipm_false);
- }
- }
-}
-
-void TradeHandler::processTradeItemAddResponse(Net::MessageIn &msg)
-{
- msg.readInt16("index");
- const uint8_t res = msg.readUInt8("fail");
- switch (res)
- {
- case 0: // Successfully added item
- case 9: // silent added item
- {
- Item *const item = PlayerInfo::getInventory()->getItem(
- mItemIndex);
- if (!item)
- return;
- if (tradeWindow)
- {
- tradeWindow->addItem2(item->getId(),
- item->getType(),
- item->getCards(),
- 4,
- true,
- mQuantity,
- item->getRefine(),
- item->getColor(),
- item->getIdentified(),
- item->getDamaged(),
- item->getFavorite(),
- item->isEquipment());
- }
- item->increaseQuantity(-mQuantity);
- mItemIndex = -1;
- mQuantity = 0;
- break;
- }
- case 1:
- // Add item failed - player overweighted
- NotifyManager::notify(NotifyTypes::
- TRADE_ADD_PARTNER_OVER_WEIGHT);
- break;
- case 2:
- NotifyManager::notify(NotifyTypes::TRADE_ADD_ERROR);
- break;
- default:
- NotifyManager::notify(NotifyTypes::TRADE_ADD_ERROR);
- UNIMPLIMENTEDPACKET;
- break;
- }
-}
-
-void TradeHandler::processTradeUndo(Net::MessageIn &msg)
-{
- UNIMPLIMENTEDPACKET;
- // +++ here need clear trade window from partner side?
-}
-
} // namespace EAthena
diff --git a/src/net/eathena/tradehandler.h b/src/net/eathena/tradehandler.h
index 111b47547..de35eb9dd 100644
--- a/src/net/eathena/tradehandler.h
+++ b/src/net/eathena/tradehandler.h
@@ -53,20 +53,6 @@ class TradeHandler final : public MessageHandler, public Ea::TradeHandler
void finish() const override final;
void cancel() const override final;
-
- protected:
- static void processTradeRequest(Net::MessageIn &msg);
-
- static void processTradeResponse(Net::MessageIn &msg);
-
- static void processTradeUndo(Net::MessageIn &msg);
-
- static void processTradeItemAdd(Net::MessageIn &msg);
-
- static void processTradeItemAddResponse(Net::MessageIn &msg);
-
- static int mQuantity;
- static int mItemIndex;
};
} // namespace EAthena
diff --git a/src/net/eathena/traderecv.cpp b/src/net/eathena/traderecv.cpp
new file mode 100644
index 000000000..6f19302a8
--- /dev/null
+++ b/src/net/eathena/traderecv.cpp
@@ -0,0 +1,162 @@
+/*
+ * The ManaPlus Client
+ * Copyright (C) 2004-2009 The Mana World Development Team
+ * Copyright (C) 2009-2010 The Mana Developers
+ * Copyright (C) 2011-2015 The ManaPlus Developers
+ *
+ * This file is part of The ManaPlus Client.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "net/eathena/traderecv.h"
+
+#include "inventory.h"
+#include "item.h"
+#include "itemcolormanager.h"
+#include "notifymanager.h"
+
+#include "being/playerinfo.h"
+
+#include "enums/resources/notifytypes.h"
+
+#include "gui/windows/tradewindow.h"
+
+#include "net/ea/traderecv.h"
+
+#include "net/eathena/messageout.h"
+#include "net/eathena/protocol.h"
+
+#include "net/ea/eaprotocol.h"
+
+#include "debug.h"
+
+extern Net::TradeHandler *tradeHandler;
+
+namespace EAthena
+{
+
+namespace TradeRecv
+{
+ int mQuantity = 0;
+ int mItemIndex = -1;
+} // namespace TradeRecv
+
+void TradeRecv::processTradeRequest(Net::MessageIn &msg)
+{
+ const std::string &partner = msg.readString(24, "name");
+ msg.readInt32("char id");
+ msg.readInt16("base level");
+ Ea::TradeRecv::processTradeRequestContinue(partner);
+}
+
+void TradeRecv::processTradeResponse(Net::MessageIn &msg)
+{
+ const uint8_t type = msg.readUInt8("type");
+ msg.readInt32("char id");
+ msg.readInt16("base level");
+ Ea::TradeRecv::processTradeResponseContinue(type);
+}
+
+void TradeRecv::processTradeItemAdd(Net::MessageIn &msg)
+{
+ const int type = msg.readInt16("type");
+ const int itemType = msg.readUInt8("item type");
+ const int amount = msg.readInt32("amount");
+ const uint8_t identify = msg.readUInt8("identify");
+ const Damaged damaged = fromBool(msg.readUInt8("attribute"), Damaged);
+ const uint8_t refine = msg.readUInt8("refine");
+ int cards[4];
+ for (int f = 0; f < 4; f++)
+ cards[f] = msg.readInt16("card");
+
+ if (tradeWindow)
+ {
+ if (type == 0)
+ {
+ tradeWindow->setMoney(amount);
+ }
+ else
+ {
+ tradeWindow->addItem2(type,
+ itemType,
+ cards,
+ 4,
+ false,
+ amount,
+ refine,
+ ItemColorManager::getColorFromCards(&cards[0]),
+ fromBool(identify, Identified),
+ damaged,
+ Favorite_false,
+ Equipm_false);
+ }
+ }
+}
+
+void TradeRecv::processTradeItemAddResponse(Net::MessageIn &msg)
+{
+ msg.readInt16("index");
+ const uint8_t res = msg.readUInt8("fail");
+ switch (res)
+ {
+ case 0: // Successfully added item
+ case 9: // silent added item
+ {
+ Item *const item = PlayerInfo::getInventory()->getItem(
+ mItemIndex);
+ if (!item)
+ return;
+ if (tradeWindow)
+ {
+ tradeWindow->addItem2(item->getId(),
+ item->getType(),
+ item->getCards(),
+ 4,
+ true,
+ mQuantity,
+ item->getRefine(),
+ item->getColor(),
+ item->getIdentified(),
+ item->getDamaged(),
+ item->getFavorite(),
+ item->isEquipment());
+ }
+ item->increaseQuantity(-mQuantity);
+ mItemIndex = -1;
+ mQuantity = 0;
+ break;
+ }
+ case 1:
+ // Add item failed - player overweighted
+ NotifyManager::notify(NotifyTypes::
+ TRADE_ADD_PARTNER_OVER_WEIGHT);
+ break;
+ case 2:
+ NotifyManager::notify(NotifyTypes::TRADE_ADD_ERROR);
+ break;
+ default:
+ NotifyManager::notify(NotifyTypes::TRADE_ADD_ERROR);
+ UNIMPLIMENTEDPACKET;
+ break;
+ }
+}
+
+void TradeRecv::processTradeUndo(Net::MessageIn &msg)
+{
+ UNIMPLIMENTEDPACKET;
+ // +++ here need clear trade window from partner side?
+}
+
+} // namespace EAthena
diff --git a/src/net/eathena/traderecv.h b/src/net/eathena/traderecv.h
new file mode 100644
index 000000000..dfbeff737
--- /dev/null
+++ b/src/net/eathena/traderecv.h
@@ -0,0 +1,45 @@
+/*
+ * The ManaPlus Client
+ * Copyright (C) 2004-2009 The Mana World Development Team
+ * Copyright (C) 2009-2010 The Mana Developers
+ * Copyright (C) 2011-2015 The ManaPlus Developers
+ *
+ * This file is part of The ManaPlus Client.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef NET_EATHENA_TRADERECV_H
+#define NET_EATHENA_TRADERECV_H
+
+#include "net/ea/tradehandler.h"
+
+#include "net/eathena/messagehandler.h"
+
+namespace EAthena
+{
+ namespace TradeRecv
+ {
+ extern int mQuantity;
+ extern int mItemIndex;
+
+ void processTradeRequest(Net::MessageIn &msg);
+ void processTradeResponse(Net::MessageIn &msg);
+ void processTradeUndo(Net::MessageIn &msg);
+ void processTradeItemAdd(Net::MessageIn &msg);
+ void processTradeItemAddResponse(Net::MessageIn &msg);
+ } // namespace TradeRecv
+} // namespace EAthena
+
+#endif // NET_EATHENA_TRADERECV_H
diff --git a/src/net/tmwa/tradehandler.cpp b/src/net/tmwa/tradehandler.cpp
index 845a7af6b..35a1c06eb 100644
--- a/src/net/tmwa/tradehandler.cpp
+++ b/src/net/tmwa/tradehandler.cpp
@@ -34,8 +34,11 @@
#include "gui/windows/tradewindow.h"
+#include "net/ea/traderecv.h"
+
#include "net/tmwa/messageout.h"
#include "net/tmwa/protocol.h"
+#include "net/tmwa/traderecv.h"
#include "net/ea/eaprotocol.h"
@@ -76,31 +79,31 @@ void TradeHandler::handleMessage(Net::MessageIn &msg)
switch (msg.getId())
{
case SMSG_TRADE_REQUEST:
- processTradeRequest(msg);
+ TradeRecv::processTradeRequest(msg);
break;
case SMSG_TRADE_RESPONSE:
- processTradeResponse(msg);
+ TradeRecv::processTradeResponse(msg);
break;
case SMSG_TRADE_ITEM_ADD:
- processTradeItemAdd(msg);
+ TradeRecv::processTradeItemAdd(msg);
break;
case SMSG_TRADE_ITEM_ADD_RESPONSE:
- processTradeItemAddResponse(msg);
+ TradeRecv::processTradeItemAddResponse(msg);
break;
case SMSG_TRADE_OK:
- processTradeOk(msg);
+ Ea::TradeRecv::processTradeOk(msg);
break;
case SMSG_TRADE_CANCEL:
- processTradeCancel(msg);
+ Ea::TradeRecv::processTradeCancel(msg);
break;
case SMSG_TRADE_COMPLETE:
- processTradeComplete(msg);
+ Ea::TradeRecv::processTradeComplete(msg);
break;
default:
@@ -160,117 +163,4 @@ void TradeHandler::cancel() const
createOutPacket(CMSG_TRADE_CANCEL_REQUEST);
}
-void TradeHandler::processTradeRequest(Net::MessageIn &msg)
-{
- processTradeRequestContinue(msg.readString(24, "name"));
-}
-
-void TradeHandler::processTradeItemAdd(Net::MessageIn &msg)
-{
- const int amount = msg.readInt32("amount");
- const int type = msg.readInt16("type");
- const uint8_t identify = msg.readUInt8("identify");
- msg.readUInt8("attribute");
- const uint8_t refine = msg.readUInt8("refine");
- int cards[4];
- for (int f = 0; f < 4; f++)
- cards[f] = msg.readInt16("card");
-
- if (tradeWindow)
- {
- if (type == 0)
- {
- tradeWindow->setMoney(amount);
- }
- else
- {
- tradeWindow->addItem2(type,
- 0,
- cards,
- 4,
- false,
- amount,
- refine,
- ItemColor_one,
- fromBool(identify, Identified),
- Damaged_false,
- Favorite_false,
- Equipm_false);
- }
- }
-}
-
-void TradeHandler::processTradeItemAddResponse(Net::MessageIn &msg)
-{
- // Trade: New Item add response (was 0x00ea, now 01b1)
- const int index = msg.readInt16("index") - INVENTORY_OFFSET;
- Item *item = nullptr;
- if (PlayerInfo::getInventory())
- item = PlayerInfo::getInventory()->getItem(index);
-
- if (!item)
- {
- if (tradeWindow)
- tradeWindow->receivedOk(true);
- return;
- }
- const int quantity = msg.readInt16("amount");
-
- const uint8_t res = msg.readUInt8("status");
- switch (res)
- {
- case 0:
- // Successfully added item
- if (tradeWindow)
- {
- tradeWindow->addItem2(item->getId(),
- item->getType(),
- item->getCards(),
- 4,
- true,
- quantity,
- item->getRefine(),
- item->getColor(),
- item->getIdentified(),
- item->getDamaged(),
- item->getFavorite(),
- item->isEquipment());
- }
- item->increaseQuantity(-quantity);
- break;
- case 1:
- // Add item failed - player overweighted
- NotifyManager::notify(NotifyTypes::
- TRADE_ADD_PARTNER_OVER_WEIGHT);
- break;
- case 2:
- // Add item failed - player has no free slot
- NotifyManager::notify(NotifyTypes::TRADE_ADD_PARTNER_NO_SLOTS);
- break;
- case 3:
- // Add item failed - non tradable item
- NotifyManager::notify(NotifyTypes::TRADE_ADD_UNTRADABLE_ITEM);
- break;
- default:
- NotifyManager::notify(NotifyTypes::TRADE_ADD_ERROR);
- UNIMPLIMENTEDPACKET;
- logger->log("QQQ SMSG_TRADE_ITEM_ADD_RESPONSE: "
- + toString(res));
- break;
- }
-}
-
-void TradeHandler::processTradeResponse(Net::MessageIn &msg)
-{
- if (tradePartnerName.empty() ||
- !player_relations.hasPermission(tradePartnerName,
- PlayerRelation::TRADE))
- {
- tradeHandler->respond(false);
- return;
- }
- const uint8_t type = msg.readUInt8("type");
- processTradeResponseContinue(type);
-}
-
} // namespace TmwAthena
diff --git a/src/net/tmwa/tradehandler.h b/src/net/tmwa/tradehandler.h
index 40ee13334..125131204 100644
--- a/src/net/tmwa/tradehandler.h
+++ b/src/net/tmwa/tradehandler.h
@@ -53,15 +53,6 @@ class TradeHandler final : public MessageHandler, public Ea::TradeHandler
void finish() const override final;
void cancel() const override final;
-
- protected:
- static void processTradeRequest(Net::MessageIn &msg);
-
- static void processTradeItemAdd(Net::MessageIn &msg);
-
- static void processTradeItemAddResponse(Net::MessageIn &msg);
-
- static void processTradeResponse(Net::MessageIn &msg);
};
} // namespace TmwAthena
diff --git a/src/net/tmwa/traderecv.cpp b/src/net/tmwa/traderecv.cpp
new file mode 100644
index 000000000..fce1576cb
--- /dev/null
+++ b/src/net/tmwa/traderecv.cpp
@@ -0,0 +1,168 @@
+/*
+ * The ManaPlus Client
+ * Copyright (C) 2004-2009 The Mana World Development Team
+ * Copyright (C) 2009-2010 The Mana Developers
+ * Copyright (C) 2011-2015 The ManaPlus Developers
+ *
+ * This file is part of The ManaPlus Client.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "net/tmwa/traderecv.h"
+
+#include "inventory.h"
+#include "item.h"
+#include "notifymanager.h"
+
+#include "being/playerinfo.h"
+#include "being/playerrelation.h"
+#include "being/playerrelations.h"
+
+#include "enums/resources/notifytypes.h"
+
+#include "gui/windows/tradewindow.h"
+
+#include "net/ea/traderecv.h"
+
+#include "net/tmwa/messageout.h"
+#include "net/tmwa/protocol.h"
+
+#include "net/ea/eaprotocol.h"
+
+#include "utils/stringutils.h"
+
+#include "debug.h"
+
+extern Net::TradeHandler *tradeHandler;
+
+extern std::string tradePartnerName;
+
+namespace TmwAthena
+{
+
+void TradeRecv::processTradeRequest(Net::MessageIn &msg)
+{
+ Ea::TradeRecv::processTradeRequestContinue(msg.readString(24, "name"));
+}
+
+void TradeRecv::processTradeItemAdd(Net::MessageIn &msg)
+{
+ const int amount = msg.readInt32("amount");
+ const int type = msg.readInt16("type");
+ const uint8_t identify = msg.readUInt8("identify");
+ msg.readUInt8("attribute");
+ const uint8_t refine = msg.readUInt8("refine");
+ int cards[4];
+ for (int f = 0; f < 4; f++)
+ cards[f] = msg.readInt16("card");
+
+ if (tradeWindow)
+ {
+ if (type == 0)
+ {
+ tradeWindow->setMoney(amount);
+ }
+ else
+ {
+ tradeWindow->addItem2(type,
+ 0,
+ cards,
+ 4,
+ false,
+ amount,
+ refine,
+ ItemColor_one,
+ fromBool(identify, Identified),
+ Damaged_false,
+ Favorite_false,
+ Equipm_false);
+ }
+ }
+}
+
+void TradeRecv::processTradeItemAddResponse(Net::MessageIn &msg)
+{
+ // Trade: New Item add response (was 0x00ea, now 01b1)
+ const int index = msg.readInt16("index") - INVENTORY_OFFSET;
+ Item *item = nullptr;
+ if (PlayerInfo::getInventory())
+ item = PlayerInfo::getInventory()->getItem(index);
+
+ if (!item)
+ {
+ if (tradeWindow)
+ tradeWindow->receivedOk(true);
+ return;
+ }
+ const int quantity = msg.readInt16("amount");
+
+ const uint8_t res = msg.readUInt8("status");
+ switch (res)
+ {
+ case 0:
+ // Successfully added item
+ if (tradeWindow)
+ {
+ tradeWindow->addItem2(item->getId(),
+ item->getType(),
+ item->getCards(),
+ 4,
+ true,
+ quantity,
+ item->getRefine(),
+ item->getColor(),
+ item->getIdentified(),
+ item->getDamaged(),
+ item->getFavorite(),
+ item->isEquipment());
+ }
+ item->increaseQuantity(-quantity);
+ break;
+ case 1:
+ // Add item failed - player overweighted
+ NotifyManager::notify(NotifyTypes::
+ TRADE_ADD_PARTNER_OVER_WEIGHT);
+ break;
+ case 2:
+ // Add item failed - player has no free slot
+ NotifyManager::notify(NotifyTypes::TRADE_ADD_PARTNER_NO_SLOTS);
+ break;
+ case 3:
+ // Add item failed - non tradable item
+ NotifyManager::notify(NotifyTypes::TRADE_ADD_UNTRADABLE_ITEM);
+ break;
+ default:
+ NotifyManager::notify(NotifyTypes::TRADE_ADD_ERROR);
+ UNIMPLIMENTEDPACKET;
+ logger->log("QQQ SMSG_TRADE_ITEM_ADD_RESPONSE: "
+ + toString(res));
+ break;
+ }
+}
+
+void TradeRecv::processTradeResponse(Net::MessageIn &msg)
+{
+ if (tradePartnerName.empty() ||
+ !player_relations.hasPermission(tradePartnerName,
+ PlayerRelation::TRADE))
+ {
+ tradeHandler->respond(false);
+ return;
+ }
+ const uint8_t type = msg.readUInt8("type");
+ Ea::TradeRecv::processTradeResponseContinue(type);
+}
+
+} // namespace TmwAthena
diff --git a/src/net/tmwa/traderecv.h b/src/net/tmwa/traderecv.h
new file mode 100644
index 000000000..8702478d7
--- /dev/null
+++ b/src/net/tmwa/traderecv.h
@@ -0,0 +1,41 @@
+/*
+ * The ManaPlus Client
+ * Copyright (C) 2004-2009 The Mana World Development Team
+ * Copyright (C) 2009-2010 The Mana Developers
+ * Copyright (C) 2011-2015 The ManaPlus Developers
+ *
+ * This file is part of The ManaPlus Client.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef NET_TMWA_TRADERECV_H
+#define NET_TMWA_TRADERECV_H
+
+#include "net/ea/tradehandler.h"
+
+#include "net/tmwa/messagehandler.h"
+
+namespace TmwAthena
+{
+ namespace TradeRecv
+ {
+ void processTradeRequest(Net::MessageIn &msg);
+ void processTradeItemAdd(Net::MessageIn &msg);
+ void processTradeItemAddResponse(Net::MessageIn &msg);
+ void processTradeResponse(Net::MessageIn &msg);
+ } // namespace TradeRecv
+} // namespace TmwAthena
+
+#endif // NET_TMWA_TRADERECV_H