summaryrefslogtreecommitdiff
path: root/src/net/tmwa/tradehandler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/net/tmwa/tradehandler.cpp')
-rw-r--r--src/net/tmwa/tradehandler.cpp230
1 files changed, 7 insertions, 223 deletions
diff --git a/src/net/tmwa/tradehandler.cpp b/src/net/tmwa/tradehandler.cpp
index 083ff5154..108b544a0 100644
--- a/src/net/tmwa/tradehandler.cpp
+++ b/src/net/tmwa/tradehandler.cpp
@@ -22,50 +22,18 @@
#include "net/tmwa/tradehandler.h"
-#include "event.h"
-#include "inventory.h"
#include "item.h"
-#include "localplayer.h"
#include "log.h"
#include "playerinfo.h"
-#include "playerrelations.h"
-#include "gui/confirmdialog.h"
-#include "gui/tradewindow.h"
-
-#include "net/inventoryhandler.h"
#include "net/messagein.h"
-#include "net/messageout.h"
#include "net/tmwa/protocol.h"
#include "net/ea/eaprotocol.h"
-#include "utils/gettext.h"
-#include "utils/stringutils.h"
-
#include "debug.h"
-extern std::string tradePartnerName;
-ConfirmDialog *confirmDlg;
-
-/**
- * Listener for request trade dialogs
- */
-namespace
-{
- struct RequestTradeListener : public gcn::ActionListener
- {
- void action(const gcn::ActionEvent &event)
- {
- confirmDlg = 0;
- if (event.getId() == "ignore")
- player_relations.ignoreTrade(tradePartnerName);
- Net::getTradeHandler()->respond(event.getId() == "yes");
- }
- } listener;
-}
-
extern Net::TradeHandler *tradeHandler;
namespace TmwAthena
@@ -86,7 +54,6 @@ TradeHandler::TradeHandler()
};
handledMessages = _messages;
tradeHandler = this;
- confirmDlg = 0;
}
@@ -95,209 +62,31 @@ void TradeHandler::handleMessage(Net::MessageIn &msg)
switch (msg.getId())
{
case SMSG_TRADE_REQUEST:
- {
- // If a trade window or request window is already open, send a
- // trade cancel to any other trade request.
- //
- // Note that it would be nice if the server would prevent this
- // situation, and that the requesting player would get a
- // special message about the player being occupied.
- std::string tradePartnerNameTemp = msg.readString(24);
-
- if (player_relations.hasPermission(tradePartnerName,
- PlayerRelation::TRADE))
- {
- if (PlayerInfo::isTrading() || confirmDlg)
- {
- Net::getTradeHandler()->respond(false);
- break;
- }
-
- tradePartnerName = tradePartnerNameTemp;
- PlayerInfo::setTrading(true);
- if (tradeWindow)
- {
- if (tradePartnerName.empty()
- || tradeWindow->getAutoTradeNick()
- != tradePartnerName)
- {
- tradeWindow->clear();
- confirmDlg = new ConfirmDialog(
- _("Request for Trade"),
- strprintf(_("%s wants to trade with you, do"
- " you accept?"), tradePartnerName.c_str()),
- true);
- confirmDlg->addActionListener(&listener);
- }
- else
- {
- Net::getTradeHandler()->respond(true);
- }
- }
- }
- else
- {
- Net::getTradeHandler()->respond(false);
- break;
- }
- }
+ processTradeRequest(msg);
break;
case SMSG_TRADE_RESPONSE:
- switch (msg.readInt8())
- {
- case 0: // Too far away
- SERVER_NOTICE(_("Trading isn't possible. Trade "
- "partner is too far away."))
- break;
- case 1: // Character doesn't exist
- SERVER_NOTICE(_("Trading isn't possible. Character "
- "doesn't exist."))
- break;
- case 2: // Invite request check failed...
- SERVER_NOTICE(_("Trade cancelled due to an unknown "
- "reason."))
- break;
- case 3: // Trade accepted
- if (tradeWindow)
- {
- tradeWindow->reset();
- tradeWindow->setCaption(strprintf(
- _("Trade: You and %s"),
- tradePartnerName.c_str()));
- tradeWindow->initTrade(tradePartnerName);
- tradeWindow->setVisible(true);
- }
- break;
- case 4: // Trade cancelled
- if (player_relations.hasPermission(tradePartnerName,
- PlayerRelation::SPEECH_LOG))
- {
- SERVER_NOTICE(strprintf(_("Trade with %s cancelled."),
- tradePartnerName.c_str()))
- }
- // otherwise ignore silently
-
- if (tradeWindow)
- {
- tradeWindow->setVisible(false);
-// tradeWindow->clear();
- }
- PlayerInfo::setTrading(false);
- break;
- default: // Shouldn't happen as well, but to be sure
- SERVER_NOTICE(_("Unhandled trade cancel packet."))
- if (tradeWindow)
- tradeWindow->clear();
- break;
- }
+ processTradeResponse(msg);
break;
case SMSG_TRADE_ITEM_ADD:
- {
- int amount = msg.readInt32();
- int type = msg.readInt16();
- int identify = msg.readInt8(); // identified flag
- msg.readInt8(); // attribute
- int refine = msg.readInt8(); // refine
- msg.skip(8); // card (4 shorts)
-
- // TODO: handle also identified, etc
- if (tradeWindow)
- {
- if (type == 0)
- {
- tradeWindow->setMoney(amount);
- }
- else
- {
- tradeWindow->addItem2(type, false, amount, refine,
- static_cast<unsigned char>(identify), false);
- }
- }
- }
+ processTradeItemAdd(msg);
break;
case SMSG_TRADE_ITEM_ADD_RESPONSE:
- // Trade: New Item add response (was 0x00ea, now 01b1)
- {
- const int index = msg.readInt16() - INVENTORY_OFFSET;
- Item *item = PlayerInfo::getInventory()->getItem(index);
- if (!item)
- {
- if (tradeWindow)
- tradeWindow->receivedOk(true);
- return;
- }
- int quantity = msg.readInt16();
-
- int res = msg.readInt8();
- switch (res)
- {
- case 0:
- // Successfully added item
- if (item->isEquipment() && item->isEquipped())
- Net::getInventoryHandler()->unequipItem(item);
-
- if (tradeWindow)
- {
- tradeWindow->addItem2(item->getId(), true,
- quantity, item->getRefine(), item->getColor(),
- item->isEquipment());
- }
- item->increaseQuantity(-quantity);
- break;
- case 1:
- // Add item failed - player overweighted
- SERVER_NOTICE(_("Failed adding item. Trade "
- "partner is over weighted."))
- break;
- case 2:
- // Add item failed - player has no free slot
- SERVER_NOTICE(_("Failed adding item. Trade "
- "partner has no free slot."))
- break;
- case 3:
- // Add item failed - non tradable item
- SERVER_NOTICE(_("Failed adding item. You "
- "can't trade this item."))
- break;
- default:
- SERVER_NOTICE(_("Failed adding item for "
- "unknown reason."))
- logger->log("QQQ SMSG_TRADE_ITEM_ADD_RESPONSE: "
- + toString(res));
- break;
- }
- }
+ processTradeItemAddResponse(msg);
break;
case SMSG_TRADE_OK:
- // 0 means ok from myself, 1 means ok from other;
- if (tradeWindow)
- tradeWindow->receivedOk(msg.readInt8() == 0);
- else
- msg.readInt8();
+ processTradeOk(msg);
break;
case SMSG_TRADE_CANCEL:
- SERVER_NOTICE(_("Trade canceled."))
- if (tradeWindow)
- {
- tradeWindow->setVisible(false);
- tradeWindow->reset();
- }
- PlayerInfo::setTrading(false);
+ processTradeCancel(msg);
break;
case SMSG_TRADE_COMPLETE:
- SERVER_NOTICE(_("Trade completed."))
- if (tradeWindow)
- {
- tradeWindow->setVisible(false);
- tradeWindow->reset();
- }
- PlayerInfo::setTrading(false);
+ processTradeComplete(msg);
break;
default:
@@ -334,11 +123,6 @@ void TradeHandler::addItem(Item *item, int amount)
outMsg.writeInt32(amount);
}
-void TradeHandler::removeItem(int slotNum A_UNUSED, int amount A_UNUSED)
-{
- // TODO
-}
-
void TradeHandler::setMoney(int amount)
{
MessageOut outMsg(CMSG_TRADE_ITEM_ADD_REQUEST);