From 11f548068b7ac05220437f595403ac41cc222a1e Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Sun, 30 Aug 2015 19:17:09 +0300 Subject: Move receive code from tradehandler into separate file. --- src/CMakeLists.txt | 6 ++ src/Makefile.am | 10 ++- src/net/ea/tradehandler.cpp | 129 --------------------------- src/net/ea/tradehandler.h | 11 --- src/net/ea/traderecv.cpp | 187 +++++++++++++++++++++++++++++++++++++++ src/net/ea/traderecv.h | 45 ++++++++++ src/net/eathena/tradehandler.cpp | 139 ++++------------------------- src/net/eathena/tradehandler.h | 14 --- src/net/eathena/traderecv.cpp | 162 +++++++++++++++++++++++++++++++++ src/net/eathena/traderecv.h | 45 ++++++++++ src/net/tmwa/tradehandler.cpp | 130 +++------------------------ src/net/tmwa/tradehandler.h | 9 -- src/net/tmwa/traderecv.cpp | 168 +++++++++++++++++++++++++++++++++++ src/net/tmwa/traderecv.h | 41 +++++++++ 14 files changed, 689 insertions(+), 407 deletions(-) create mode 100644 src/net/ea/traderecv.cpp create mode 100644 src/net/ea/traderecv.h create mode 100644 src/net/eathena/traderecv.cpp create mode 100644 src/net/eathena/traderecv.h create mode 100644 src/net/tmwa/traderecv.cpp create mode 100644 src/net/tmwa/traderecv.h (limited to 'src') 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 . + */ + +#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 . + */ + +#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(mItemIndex + INVENTORY_OFFSET), + outMsg.writeInt16(static_cast( + 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 . + */ + +#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 . + */ + +#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 . + */ + +#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 . + */ + +#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 -- cgit v1.2.3-70-g09d2