TradeHandler.cpp
上传用户:jxpjxmjjw
上传日期:2009-12-07
资源大小:5877k
文件大小:6k
源码类别:

模拟服务器

开发平台:

Visual C++

  1. // Copyright (C) 2004 Team Python
  2. //  
  3. // This program is free software; you can redistribute it and/or modify
  4. // it under the terms of the GNU General Public License as published by
  5. // the Free Software Foundation; either version 2 of the License, or
  6. // (at your option) any later version.
  7. // 
  8. // This program is distributed in the hope that it will be useful,
  9. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11. // GNU General Public License for more details.
  12. // 
  13. // You should have received a copy of the GNU General Public License
  14. // along with this program; if not, write to the Free Software 
  15. // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  16. #include "NetworkInterface.h"
  17. #include "Opcodes.h"
  18. #include "Log.h"
  19. #include "Character.h"
  20. #include "WorldServer.h"
  21. #include "Database.h"
  22. #include "UpdateMask.h"
  23. #include "DatabaseInterface.h"
  24. #include "Sockets.h"
  25. #define world WorldServer::getSingleton()
  26. TradeHandler::TradeHandler()
  27. {
  28. }
  29. TradeHandler::~TradeHandler()
  30. {
  31. }
  32. void TradeHandler::HandleMsg( wowWData & recv_data, GameClient *pClient )
  33. {
  34. wowWData data;
  35.     char f[256];
  36.     sprintf(f, "WORLD: Trade Opcode: 0x%.4X", recv_data.opcode);
  37.     Log::getSingleton( ).outString( f );
  38. switch (recv_data.opcode)
  39. {
  40. case CMSG_INITIATE_TRADE: // Initiate trade
  41. {
  42. unsigned long targetguid;
  43. unsigned long templong;
  44. recv_data >> targetguid;
  45. recv_data >> templong;
  46. WorldServer::ClientSet::iterator itr;
  47. for (itr = world.mClients.begin(); itr != world.mClients.end(); itr++)
  48. {
  49. if ((((GameClient*)(*itr))->getCurrentChar()->getGUID() == targetguid) && (((GameClient*)(*itr))->IsInWorld()))
  50. {
  51. data.Initialise( 8, SMSG_TRADE_STATUS );
  52. data << (long) 0x02;
  53. ((GameClient*)(*itr))->SendMsg(&data); // sends selection
  54. pClient->SendMsg(&data); // sends to the player
  55. Log::getSingleton( ).outString( "WORLD: Player %s is trading", pClient->getCurrentChar()->getName());
  56. data.clear();
  57. }
  58. else
  59. {
  60. data.Initialise( 12, SMSG_TRADE_STATUS );
  61. data << (long) 0x01;
  62. data << (long) pClient->getCurrentChar()->getGUIDHigh();
  63. ((GameClient*)(*itr))->SendMsg(&data);
  64. pClient->SendMsg(&data);
  65. Log::getSingleton( ).outString( "WORLD: Player %s is requesting to trade", pClient->getCurrentChar()->getName());
  66. data.clear();
  67. }
  68. }
  69. }break;
  70. case CMSG_ACCEPT_TRADE: // Accept trade
  71. {
  72. /*
  73. CMSG_ACCEPT_TRADE 
  74.     dword // unknown (0x01) 
  75. */
  76. data.Initialise( 8, SMSG_TRADE_STATUS );
  77.       //data << uint8( 0x01 );
  78. pClient->SendMsg( &data );
  79. data.clear();
  80. Log::getSingleton( ).outString( "WORLD: Accepting Trade Request ...n" );
  81. }break;
  82. case CMSG_SET_TRADE_GOLD: // Set Cost of Trade
  83. {
  84. /*
  85. CMSG_SET_TRADE_GOLD 
  86.     dword     // coinage 
  87. */
  88. uint32 player_gold;
  89. player_gold = pClient->getCurrentChar( )->getUpdateValue( PLAYER_FIELD_COINAGE );
  90. data.Initialise( 8, SMSG_TRADE_STATUS );
  91.          
  92. data << uint32 ( player_gold );
  93.      
  94. pClient->SendMsg( &data );
  95. data.clear();
  96. Log::getSingleton( ).outString( "WORLD: Setting Cost of Trade ...n" );
  97. }break;
  98. case CMSG_CANCEL_TRADE: // Cancle trade
  99. {
  100. /*
  101. CMSG_CANCEL_TRADE 
  102. */
  103. data.Initialise( 8, SMSG_TRADE_STATUS );
  104.       pClient->SendMsg( &data );
  105. data.clear();
  106. Log::getSingleton( ).outString( "WORLD: Canceling Trade ...n" );
  107. }break;
  108. case CMSG_SET_TRADE_ITEM: // Set Trade Item
  109. {
  110. /*
  111. CMSG_SET_TRADE_ITEM 
  112. byte // trade window slot (0x00 - 0x05) 
  113. byte // source bag or 0xFF for backpack 
  114. byte // source slot (inventory slot, backpack, worn, etc...) 
  115. Something down the lines of this shit! i would imagine ...
  116. unsigned char tradeslot;
  117. unsigned char sourcebag;
  118. unsigned char invslot;
  119. data >> tradeslot;
  120. data >> sourcebag;
  121. data >> invslot;
  122. data.Initialise( 32, SMSG_TRADE_STATUS_EXTENDED );
  123. data << (char) 0x00;
  124. data << (long) 0x02;
  125. data << (long) 0x00;
  126. data << (long) 0x00;
  127. data << (long) 0x00;
  128. data << (char) 0x03;
  129. data << (long) 0x1131;  // might be id of item
  130. data << (long) 0x4098;  // might be id of item
  131. data << (long) 0x01;
  132. data << (long) 0x00;
  133. data << (long) 0x00;
  134. data << (long) 0x00;
  135. data << (long) 0x00;
  136. data << (long) pClient->getCurrentChar()->getGUID();  // guid of player (me)?
  137. data << (long) 0x00;
  138. data << (long) 0x00;
  139. data << (char) 0x60;
  140. data << (char) 0x74;
  141. data << (char) 0x35;
  142. data << (char) 0x1B;
  143. data << (long) 0x00;
  144. pClient->SendMsg( &data );
  145. */
  146. Log::getSingleton( ).outString( "WORLD: Set Trade Item ...n" );
  147. }break;
  148. case CMSG_CLEAR_TRADE_ITEM: // Clear Trade Item
  149. {
  150. /*
  151. CMSG_CLEAR_TRADE_ITEM 
  152.     byte // trade window slot (0x00 - 0x05) 
  153. */
  154. data.Initialise( 12, SMSG_TRADE_STATUS );
  155. data << uint32( 0x00 );
  156. pClient->SendMsg( &data );
  157. data.clear();
  158. Log::getSingleton( ).outString( "WORLD: Clearing Trade Item ...n" );
  159. }break;
  160. case CMSG_UNACCEPT_TRADE: // unaccept trade
  161. {
  162. /*
  163. no notes on this case .. 
  164. */
  165. data.Initialise( 8, SMSG_TRADE_STATUS );
  166. // unknown data strings!
  167. pClient->SendMsg( &data );
  168. data.clear();
  169. Log::getSingleton( ).outString( "WORLD: Stopping Trade ...n" );
  170. }break;
  171. case CMSG_BEGIN_TRADE: // begin the trade
  172. {
  173. /*
  174. no notes on this case .. 
  175. */
  176. uint32 guid;
  177.         recv_data >> guid;
  178.       
  179. WorldServer::ClientSet::iterator itr;
  180. for (itr = world.mClients.begin(); itr != world.mClients.end(); itr++)
  181. {
  182. if ((((GameClient*)(*itr))->getCurrentChar()->getGUID() == guid) && (((GameClient*)(*itr))->IsInWorld()))
  183. {
  184. //GAME SERVER:                                          @ 14.7328851222992 s
  185. //Length = 12
  186. //Opcode = SMSG_TRADE_STATUS[011e]
  187. //Data = 
  188. //01 00 00 00 07 0b 08 00 00 00 00 00                 ............
  189. data.Initialise( 8, SMSG_TRADE_STATUS );
  190. data << uint8(0x01);
  191. data << uint8(0x00);
  192. data << uint8(0x00);
  193. data << uint8(0x00);
  194. data << uint32(guid);
  195.      
  196. ((GameClient*)(*itr))->SendMsg(&data); //send initiate to the other play
  197. //then its suposed to send to both player status 2
  198. data.clear();
  199. Log::getSingleton( ).outString( "WORLD: Begin Trade ...n" );
  200. }
  201. }
  202. }break;
  203. }
  204. }