00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "net/tmwserv/tradehandler.h"
00023
00024 #include "net/tmwserv/gameserver/internal.h"
00025 #include "net/tmwserv/gameserver/player.h"
00026
00027 #include "net/tmwserv/connection.h"
00028 #include "net/tmwserv/protocol.h"
00029
00030 #include "net/messagein.h"
00031 #include "net/messageout.h"
00032 #include "net/net.h"
00033
00034 #include "beingmanager.h"
00035 #include "item.h"
00036 #include "localplayer.h"
00037
00038 #include "gui/confirm_dialog.h"
00039 #include "gui/trade.h"
00040
00041 #include "gui/widgets/chattab.h"
00042
00043 std::string tradePartnerName;
00044 int tradePartnerID;
00045
00049 namespace {
00050 struct RequestTradeListener : public gcn::ActionListener
00051 {
00052 void action(const gcn::ActionEvent &event)
00053 {
00054 if (event.getId() == "yes")
00055 Net::GameServer::Player::requestTrade(tradePartnerID);
00056 else
00057 Net::getTradeHandler()->cancel();
00058 }
00059 } listener;
00060 }
00061
00062 Net::TradeHandler *tradeHandler;
00063
00064 namespace TmwServ {
00065
00066 TradeHandler::TradeHandler():
00067 mAcceptTradeRequests(true)
00068 {
00069 static const Uint16 _messages[] = {
00070 GPMSG_TRADE_REQUEST,
00071 GPMSG_TRADE_CANCEL,
00072 GPMSG_TRADE_START,
00073 GPMSG_TRADE_COMPLETE,
00074 GPMSG_TRADE_AGREED,
00075 GPMSG_TRADE_BOTH_CONFIRM,
00076 GPMSG_TRADE_CONFIRM,
00077 GPMSG_TRADE_ADD_ITEM,
00078 GPMSG_TRADE_SET_MONEY,
00079 0
00080 };
00081 handledMessages = _messages;
00082 tradeHandler = this;
00083
00084 }
00085
00086 void TradeHandler::setAcceptTradeRequests(bool acceptTradeRequests)
00087 {
00088 mAcceptTradeRequests = acceptTradeRequests;
00089 if (mAcceptTradeRequests) {
00090 localChatTab->chatLog("Accepting incoming trade requests", BY_SERVER);
00091 } else {
00092 localChatTab->chatLog("Ignoring incoming trade requests", BY_SERVER);
00093 }
00094 }
00095
00096 void TradeHandler::handleMessage(MessageIn &msg)
00097 {
00098 switch (msg.getId())
00099 {
00100 case GPMSG_TRADE_REQUEST:
00101 {
00102 Being *being = beingManager->findBeing(msg.readInt16());
00103 if (!being || !mAcceptTradeRequests)
00104 {
00105 Net::GameServer::Player::acceptTrade(false);
00106 break;
00107 }
00108 player_node->setTrading(true);
00109 tradePartnerName = being->getName();
00110 tradePartnerID = being->getId();
00111 ConfirmDialog *dlg = new ConfirmDialog("Request for trade",
00112 tradePartnerName + " wants to trade with you, do you accept?");
00113 dlg->addActionListener(&listener);
00114 } break;
00115
00116 case GPMSG_TRADE_ADD_ITEM:
00117 {
00118 int type = msg.readInt16();
00119 int amount = msg.readInt8();
00120 tradeWindow->addItem(type, false, amount);
00121 } break;
00122
00123 case GPMSG_TRADE_SET_MONEY:
00124 tradeWindow->setMoney(msg.readInt32());
00125 break;
00126
00127 case GPMSG_TRADE_START:
00128 tradeWindow->reset();
00129 tradeWindow->setCaption("Trading with " + tradePartnerName);
00130 tradeWindow->setVisible(true);
00131 break;
00132
00133 case GPMSG_TRADE_BOTH_CONFIRM:
00134 tradeWindow->receivedOk(false);
00135 break;
00136
00137 case GPMSG_TRADE_AGREED:
00138 tradeWindow->receivedOk(false);
00139 break;
00140
00141 case GPMSG_TRADE_CANCEL:
00142 localChatTab->chatLog("Trade canceled.", BY_SERVER);
00143 tradeWindow->setVisible(false);
00144 tradeWindow->reset();
00145 player_node->setTrading(false);
00146 break;
00147
00148 case GPMSG_TRADE_COMPLETE:
00149 localChatTab->chatLog("Trade completed.", BY_SERVER);
00150 tradeWindow->setVisible(false);
00151 tradeWindow->reset();
00152 player_node->setTrading(false);
00153 break;
00154 }
00155 }
00156
00157 void TradeHandler::request(Being *being)
00158 {
00159 tradePartnerName = being->getName();
00160 tradePartnerID = being->getId();
00161
00162 MessageOut msg(PGMSG_TRADE_REQUEST);
00163 msg.writeInt16(tradePartnerID);
00164 Net::GameServer::connection->send(msg);
00165 }
00166
00167 void TradeHandler::respond(bool accept)
00168 {
00169
00170 }
00171
00172 void TradeHandler::addItem(Item *item, int amount)
00173 {
00174 MessageOut msg(PGMSG_TRADE_ADD_ITEM);
00175 msg.writeInt8(item->getInvIndex());
00176 msg.writeInt8(amount);
00177 Net::GameServer::connection->send(msg);
00178
00179 tradeWindow->addItem(item->getId(), true, amount);
00180 item->increaseQuantity(-amount);
00181 }
00182
00183 void TradeHandler::removeItem(int slotNum, int amount)
00184 {
00185
00186 }
00187
00188 void TradeHandler::setMoney(int amount)
00189 {
00190 MessageOut msg(PGMSG_TRADE_SET_MONEY);
00191 msg.writeInt32(amount);
00192 Net::GameServer::connection->send(msg);
00193 }
00194
00195 void TradeHandler::confirm()
00196 {
00197 MessageOut msg(PGMSG_TRADE_CONFIRM);
00198 Net::GameServer::connection->send(msg);
00199 }
00200
00201 void TradeHandler::finish()
00202 {
00203 MessageOut msg(PGMSG_TRADE_AGREED);
00204 Net::GameServer::connection->send(msg);
00205 }
00206
00207 void TradeHandler::cancel()
00208 {
00209 MessageOut msg(PGMSG_TRADE_CANCEL);
00210 Net::GameServer::connection->send(msg);
00211 }
00212
00213 }