Player.cpp
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:26k
源码类别:

模拟服务器

开发平台:

C/C++

  1. //******************************************************************************
  2. /*! file       Player.cpp
  3. *   brief      简要描述
  4. *
  5. * 详细描述
  6. *   author 作者
  7. *   version 版本号
  8. *   date 2003-6-4 11:49:24
  9. *   sa 参考内容
  10. *   todo 将要做的工作
  11. *******************************************************************************/
  12. #include "stdafx.h"
  13. #include <objbase.h>
  14. #include <initguid.h>
  15. #include "Player.h"
  16. #include "....Sword3PaySysS3AccServerAccountLoginDef.h"
  17. #include "....s3clientloginLoginDef.h"
  18. #include "..RobotManagerprotocol.h"
  19. #include "..RobotManagerstruct.h"
  20. //#include "....RoleDBManagerkroledbheader.h"
  21. #include "S3DBInterface.h"
  22. #include "KProtocolDef.h"
  23. #include "KProtocol.h"
  24. #include "Macro.h"
  25. #include "Inifile.h"
  26. #include "Utils.h"
  27. #include "tstring.h"
  28. #include "Library.h"
  29. #include "Console.h"
  30. #include "Robot.h"
  31. CCriticalSection g_csPlayerList;
  32. int g_nGameProtocolSize[MAX_PROTOCOL_NUM] = 
  33. {
  34. -1, // s2c_login,
  35. -1, // s2c_logout,
  36. sizeof(BYTE), // s2c_syncend,
  37. sizeof(CURPLAYER_SYNC), // s2c_synccurplayer,
  38. -1, // s2c_synccurplayerskill
  39. sizeof(CURPLAYER_NORMAL_SYNC),// s2c_synccurplayernormal
  40. -1, // s2c_newplayer,
  41. -1, // s2c_removeplayer,
  42. sizeof(WORLD_SYNC), // s2c_syncworld,
  43. sizeof(PLAYER_SYNC), // s2c_syncplayer,
  44. sizeof(PLAYER_NORMAL_SYNC), // s2c_syncplayermin,
  45. -1, //sizeof(NPC_SYNC), // s2c_syncnpc,
  46. sizeof(NPC_NORMAL_SYNC), // s2c_syncnpcmin,
  47. sizeof(NPC_PLAYER_TYPE_NORMAL_SYNC), // s2c_syncnpcminplayer,
  48. sizeof(OBJ_SYNC_ADD), // s2c_objadd,
  49. sizeof(OBJ_SYNC_STATE), // s2c_syncobjstate,
  50. sizeof(OBJ_SYNC_DIR), // s2c_syncobjdir,
  51. sizeof(OBJ_SYNC_REMOVE), // s2c_objremove,
  52. sizeof(OBJ_SYNC_TRAP_ACT), // s2c_objTrapAct,
  53. sizeof(NPC_REMOVE_SYNC), // s2c_npcremove,
  54. sizeof(NPC_WALK_SYNC), // s2c_npcwalk,
  55. sizeof(NPC_RUN_SYNC), // s2c_npcrun,
  56. -1, // s2c_npcattack,
  57. -1, // s2c_npcmagic,
  58. sizeof(NPC_JUMP_SYNC), // s2c_npcjump,
  59. -1, // s2c_npctalk,
  60. sizeof(NPC_HURT_SYNC), // s2c_npchurt,
  61. sizeof(NPC_DEATH_SYNC), // s2c_npcdeath,
  62. sizeof(NPC_CHGCURCAMP_SYNC),// s2c_npcchgcurcamp,
  63. sizeof(NPC_CHGCAMP_SYNC), // s2c_npcchgcamp,
  64. sizeof(NPC_SKILL_SYNC), // s2c_skillcast,
  65. -1, // s2c_playertalk,
  66. sizeof(PLAYER_EXP_SYNC), // s2c_playerexp,
  67. sizeof(PLAYER_SEND_TEAM_INFO), // s2c_teaminfo,
  68. sizeof(PLAYER_SEND_SELF_TEAM_INFO), // s2c_teamselfinfo,
  69. sizeof(PLAYER_APPLY_TEAM_INFO_FALSE), // s2c_teamapplyinfofalse,
  70. sizeof(PLAYER_SEND_CREATE_TEAM_SUCCESS),// s2c_teamcreatesuccess,
  71. sizeof(PLAYER_SEND_CREATE_TEAM_FALSE), // s2c_teamcreatefalse,
  72. sizeof(PLAYER_TEAM_OPEN_CLOSE), // s2c_teamopenclose,
  73. sizeof(PLAYER_APPLY_ADD_TEAM), // s2c_teamgetapply,
  74. sizeof(PLAYER_TEAM_ADD_MEMBER), // s2c_teamaddmember,
  75. sizeof(PLAYER_LEAVE_TEAM), // s2c_teamleave,
  76. sizeof(PLAYER_TEAM_CHANGE_CAPTAIN), // s2c_teamchangecaptain,
  77. sizeof(PLAYER_FACTION_DATA), // s2c_playerfactiondata,
  78. sizeof(PLAYER_LEAVE_FACTION), // s2c_playerleavefaction,
  79. sizeof(PLAYER_FACTION_SKILL_LEVEL), // s2c_playerfactionskilllevel,
  80. -1,//sizeof(PLAYER_SEND_CHAT_SYNC), // s2c_playersendchat,
  81. sizeof(PLAYER_LEAD_EXP_SYNC), // s2c_playersyncleadexp
  82. sizeof(PLAYER_LEVEL_UP_SYNC), // s2c_playerlevelup
  83. sizeof(PLAYER_TEAMMATE_LEVEL_SYNC), // s2c_teammatelevel
  84. sizeof(PLAYER_ATTRIBUTE_SYNC), // s2c_playersyncattribute
  85. sizeof(PLAYER_SKILL_LEVEL_SYNC), // s2c_playerskilllevel
  86. sizeof(ITEM_SYNC), // s2c_syncitem
  87. sizeof(ITEM_REMOVE_SYNC), // s2c_removeitem
  88. sizeof(PLAYER_MONEY_SYNC), // s2c_syncmoney
  89. sizeof(PLAYER_MOVE_ITEM_SYNC), // s2c_playermoveitem
  90. -1, // s2c_playershowui
  91. sizeof(CHAT_APPLY_ADD_FRIEND_SYNC), // s2c_chatapplyaddfriend
  92. sizeof(CHAT_ADD_FRIEND_SYNC), // s2c_chataddfriend
  93. -1,//sizeof(CHAT_REFUSE_FRIEND_SYNC), // s2c_chatrefusefriend
  94. sizeof(CHAT_ADD_FRIEND_FAIL_SYNC), // s2c_chataddfriendfail
  95. sizeof(CHAT_LOGIN_FRIEND_NONAME_SYNC), // s2c_chatloginfriendnoname
  96. -1,//sizeof(CHAT_LOGIN_FRIEND_NAME_SYNC), // s2c_chatloginfriendname
  97. sizeof(CHAT_ONE_FRIEND_DATA_SYNC), // s2c_chatonefrienddata
  98. sizeof(CHAT_FRIEND_ONLINE_SYNC), // s2c_chatfriendinline
  99. sizeof(CHAT_DELETE_FRIEND_SYNC), // s2c_chatdeletefriend
  100. sizeof(CHAT_FRIEND_OFFLINE_SYNC), // s2c_chatfriendoffline
  101. sizeof(ROLE_LIST_SYNC), // s2c_syncrolelist
  102. sizeof(TRADE_CHANGE_STATE_SYNC), // s2c_tradechangestate
  103. -1, // NPC_SET_MENU_STATE_SYNC    s2c_npcsetmenustate
  104. sizeof(TRADE_MONEY_SYNC), // s2c_trademoneysync
  105. sizeof(TRADE_DECISION_SYNC), // s2c_tradedecision
  106. -1, // sizeof(CHAT_SCREENSINGLE_ERROR_SYNC)s2c_chatscreensingleerror
  107. sizeof(NPC_SYNC_STATEINFO), // s2c_syncnpcstate,
  108. -1, // sizeof(TEAM_INVITE_ADD_SYNC)    s2c_teaminviteadd
  109. sizeof(TRADE_STATE_SYNC), // s2c_tradepressoksync
  110. sizeof(PING_COMMAND), // s2c_ping
  111. sizeof(NPC_SIT_SYNC), // s2c_npcsit
  112. sizeof(SALE_BOX_SYNC), // s2c_opensalebox
  113. sizeof(NPC_SKILL_SYNC), // s2cDirectlyCastSkill
  114. -1, // s2c_msgshow
  115. -1, // s2c_syncstateeffect
  116. sizeof(BYTE), // s2c_openstorebox
  117. sizeof(NPC_REVIVE_SYNC), // s2c_playerrevive
  118. sizeof(NPC_REQUEST_FAIL), // s2c_requestnpcfail
  119. sizeof(TRADE_APPLY_START_SYNC), // s2c_tradeapplystart
  120. sizeof(tagNewDelRoleResponse), // s3c_rolenewdelresponse
  121. };
  122. using OnlineGameLib::Win32::CPackager;
  123. using OnlineGameLib::Win32::CLibrary;
  124. using OnlineGameLib::Win32::_tstring;
  125. CLibrary CPlayer::s_theRainbowLib( "rainbow.dll" );
  126. // 跟踪角色的名字
  127. extern char *g_pRoleName;
  128. // 跟踪的角色的ID
  129. DWORD CPlayer::m_dwTargetID = ( DWORD )( -1 );
  130. const char *g_szText[] = {
  131. "%s, 你是谁?",
  132. "我们坚决拥护%s!",
  133. "%s, 我爱你! *^_^*",
  134. "%s, 我帅吧?",
  135. "我们去打猪吧? %s",
  136. "%s, 我以后就跟定你了!",
  137. "%s, 我们这是去哪?",
  138. "跟着%s走~~~",
  139. "今天的天气不错嘛! %s",
  140. "%s, 你还好吧?",
  141. "看气色不错啊! %s",
  142. "%s, 我和你去野外转转吧",
  143. "你们怎么这么多废话, 跟着%s走就行了",
  144. "%s, 你带我去哪?",
  145. "呵呵, 这么多人, 好爽啊! %s, 你好!",
  146. "%s, 我这是在哪? -_-b",
  147. "%s, 你觉得我漂亮吗?",
  148. "%s" };
  149. const int g_TextNumber = 17;
  150. struct tagRGB
  151. {
  152. char r;
  153. char g;
  154. char b;
  155. };
  156. #pragma warning( disable : 4305 4309 )
  157. const tagRGB g_rgbText[] = {
  158. { 140, 255, 206 },
  159. { 255, 227, 33 },
  160. { 255, 130, 41 },
  161. { 255, 0, 0 },
  162. { 255, 113, 206 },
  163. { 0, 134, 255 },
  164. { 255, 251, 181 },
  165. { 255, 255, 255 },
  166. { 0, 211, 33 }
  167. };
  168. const int g_rgbNumber = 9;
  169. CPlayer::CPlayer( const char *pSrvIP, unsigned short nPort, const char *pAccName )
  170. : m_hQuit( NULL, true, false, pAccName )
  171. , m_pClientToGateWay( NULL )
  172. , m_pClientToGameSvr(NULL)
  173. , m_sGatewayIP( pSrvIP )
  174. , m_nGatewayPort( nPort )
  175. , m_sAccName( pAccName )
  176. , m_nStatus( enumStartup ) 
  177. , m_dwID( ( DWORD )( -1 ) )
  178. {
  179. srand( (unsigned)time( NULL ) );
  180. m_ptCurPos.x = 0;
  181. m_ptCurPos.y = 0;
  182. m_ptTagPos.x = 0;
  183. m_ptTagPos.y = 0;
  184. }
  185. CPlayer::~CPlayer()
  186. {
  187. Free();
  188. }
  189. //******************************************************************************
  190. /*! fn     void CPlayer::Free()
  191. *   brief  释放和Server的连接
  192. *******************************************************************************/
  193. void CPlayer::Free()
  194. {
  195. // 关闭到网关的连接
  196. ShutdownGateway();
  197. // 关闭到游戏服务器的连接
  198. ShutdownGameSvr();
  199. NotifyRobotManager();
  200. // 退出工作线程
  201. m_hQuit.Set();
  202. if ( !Wait( 500000 ) )
  203. {
  204. Terminate();
  205. }
  206. }
  207. //******************************************************************************
  208. /*! fn     void CPlayer::NotifyRobotManager()
  209. *   brief  通知Robot Manager,Robot做帐号回收
  210. *******************************************************************************/
  211. void CPlayer::NotifyRobotManager()
  212. {
  213. tagRobotQuit RobotQuit;
  214. if(NULL == g_pClientToManager)
  215. return;
  216. RobotQuit.cProtocol = enumRobotQuit;
  217. strcpy(RobotQuit.szAccName, m_sAccName.c_str());
  218. g_pClientToManager->SendPackToServer( &RobotQuit, sizeof( RobotQuit ) );
  219. }
  220. //******************************************************************************
  221. /*! fn     bool CPlayer::ConnectToGateway()
  222. *   brief  连接到网关
  223. *******************************************************************************/
  224. bool CPlayer::ConnectToGateway()
  225. {
  226. pfnCreateClientInterface pClientFactroyFun = ( pfnCreateClientInterface )( s_theRainbowLib.GetProcAddress( _T( "CreateInterface" ) ) );
  227. IClientFactory *pClientFactory = NULL;
  228. if ( pClientFactroyFun && SUCCEEDED( pClientFactroyFun( IID_IClientFactory, reinterpret_cast< void ** >( &pClientFactory ) ) ) )
  229. {
  230. pClientFactory->SetEnvironment( 5, 1024 * 256 );
  231. pClientFactory->CreateClientInterface( IID_IESClient, reinterpret_cast< void ** >( &m_pClientToGateWay ) );
  232. SAFE_RELEASE( pClientFactory );
  233. }
  234. else
  235. return false;
  236. if ( m_pClientToGateWay )
  237. {
  238. m_pClientToGateWay->Startup();
  239. m_pClientToGateWay->RegisterMsgFilter( ( void * )this, ClientEventNotify );
  240. if ( FAILED( m_pClientToGateWay->ConnectTo( m_sGatewayIP.c_str(), m_nGatewayPort ) ) )
  241. {
  242. m_pClientToGateWay->Cleanup();
  243. SAFE_RELEASE( m_pClientToGateWay );
  244. return false;
  245. }
  246. }
  247. else
  248. return false;
  249. // 启动线程
  250. Start();
  251. SetStatus(enumStartup);
  252. return true;
  253. }
  254. //******************************************************************************
  255. /*! fn     bool CPlayer::ReConnectGateway()
  256. *   brief  断开与网关和游戏服务器的连接,并再次建立连接
  257. *******************************************************************************/
  258. bool CPlayer::ReConnectGateway()
  259. {
  260. // 关闭到网关的连接
  261. ShutdownGateway();
  262. // 关闭到游戏服务器的连接
  263. ShutdownGameSvr();
  264. pfnCreateClientInterface pClientFactroyFun = ( pfnCreateClientInterface )( s_theRainbowLib.GetProcAddress( _T( "CreateInterface" ) ) );
  265. IClientFactory *pClientFactory = NULL;
  266. if ( pClientFactroyFun && SUCCEEDED( pClientFactroyFun( IID_IClientFactory, reinterpret_cast< void ** >( &pClientFactory ) ) ) )
  267. {
  268. pClientFactory->SetEnvironment( 5, 1024 * 256 );
  269. pClientFactory->CreateClientInterface( IID_IESClient, reinterpret_cast< void ** >( &m_pClientToGateWay ) );
  270. SAFE_RELEASE( pClientFactory );
  271. }
  272. else
  273. return false;
  274. if ( m_pClientToGateWay )
  275. {
  276. m_pClientToGateWay->Startup();
  277. m_pClientToGateWay->RegisterMsgFilter( ( void * )this, ClientEventNotify );
  278. if ( FAILED( m_pClientToGateWay->ConnectTo( m_sGatewayIP.c_str(), m_nGatewayPort ) ) )
  279. {
  280. m_pClientToGateWay->Cleanup();
  281. SAFE_RELEASE( m_pClientToGateWay );
  282. return false;
  283. }
  284. }
  285. else
  286. return false;
  287. SetStatus(enumStartup);
  288. m_dwID = ( ( DWORD )( -1 ) );
  289. m_ptCurPos.x = 0;
  290. m_ptCurPos.y = 0;
  291. m_ptTagPos.x = 0;
  292. m_ptTagPos.y = 0;
  293. return true;
  294. }
  295. //******************************************************************************
  296. /*! fn     int CPlayer::Run()
  297. *   brief  线程的运行函数
  298. *******************************************************************************/
  299. int CPlayer::Run()
  300. {
  301. // CCriticalSection::Owner locker( g_csPlayerList );
  302. while ( !m_hQuit.Wait( 0 ) )
  303. {
  304. ProcessGateway();
  305. ProcessGameSvr();
  306. ::Sleep( 1 );
  307. }
  308. return 0;
  309. }
  310. //******************************************************************************
  311. /*! fn     void CPlayer::ProcessGateway()
  312. *   brief  处理和网关的通讯
  313. *******************************************************************************/
  314. void CPlayer::ProcessGateway()
  315. {
  316. if(NULL == m_pClientToGateWay)
  317. return;
  318. ProcessGatewayMsg();
  319. ProcessGatewayLoop();
  320. }
  321. //******************************************************************************
  322. /*! fn     void ProcessGatewayMsg()
  323. *   brief  处理网关发来的消息
  324. *******************************************************************************/
  325. void CPlayer::ProcessGatewayMsg()
  326. {
  327. size_t datalength = 0;
  328. const char *pData = ( const char * )( m_pClientToGateWay->GetPackFromServer( datalength ) );
  329. const char *pMsg = pData;
  330. int nMsgLen = 0;
  331. while ( pMsg < ( pData + datalength ) )
  332. {
  333. BYTE cProtocol = CPackager::Peek( pMsg );
  334. switch ( cProtocol )
  335. {
  336. case s2c_login:
  337.  // 需要错误处理
  338. /*
  339. if(!OnAccountLoginNotify(pMsg))
  340. {
  341. Free();
  342. return;
  343. }
  344. */
  345. OnAccountLoginNotify(pMsg);
  346. nMsgLen = *( unsigned short * )( pMsg + sizeof( BYTE ) );
  347. pMsg += sizeof( BYTE ) + nMsgLen;
  348. break;
  349. case s2c_roleserver_getrolelist_result:
  350. nMsgLen = OnGetRoleList(pMsg);
  351. pMsg += nMsgLen;
  352. break;
  353. case s2c_notifyplayerlogin:
  354. OnPlayerLoginNotify(pMsg);
  355. pMsg += sizeof(tagNotifyPlayerLogin);
  356. //ReConnectGateway();
  357. break;
  358. default:
  359. return;
  360. }
  361. }
  362. }
  363. //******************************************************************************
  364. /*! fn     void CPlayer::ProcessGatewayLoop()
  365. *   brief  向网关发送的命令
  366. *******************************************************************************/
  367. void CPlayer::ProcessGatewayLoop()
  368. {
  369. if ( m_nStatus == enumStartup )
  370. {
  371. LoginGateway();
  372. SetStatus(enumConnectToGateway);
  373. }
  374. }
  375. //******************************************************************************
  376. /*! fn     void CPlayer::ProcessGameSvr()
  377. *   brief  处理和GameSvr的通讯
  378. *******************************************************************************/
  379. void CPlayer::ProcessGameSvr()
  380. {
  381. if (NULL == m_pClientToGameSvr)
  382. return;
  383. ProcessGameSvrMsg();
  384. ProcessGameSvrLoop();
  385. }
  386. //******************************************************************************
  387. /*! fn     void CPlayer::ProcessGameSvrMsg()
  388. *   brief  处理和游戏Server发来的消息
  389. *******************************************************************************/
  390. void CPlayer::ProcessGameSvrMsg()
  391. {
  392. size_t datalength = 0;
  393. const char *pData = ( const char * )( m_pClientToGameSvr->GetPackFromServer( datalength ) );
  394. const char *pMsg = pData;
  395. while ( pMsg < ( pData + datalength ) )
  396. {
  397. BYTE cProtocol = CPackager::Peek( pMsg );
  398. switch ( cProtocol )
  399. {
  400. case s2c_syncend:
  401. SyncEnd();
  402. //ReConnectGateway();
  403. break;
  404. case s2c_syncplayer:
  405. break;
  406. case s2c_syncnpc:
  407. {
  408. NPC_SYNC *pPS = ( NPC_SYNC * )pMsg;
  409. if ( pPS && ( '' != g_pRoleName[0] ) )
  410. {
  411. if ( 0 == memcmp( ( const char * )pPS->m_szName, g_pRoleName, sizeof( g_pRoleName ) ) )
  412. {
  413. m_dwTargetID = pPS->ID;
  414. }
  415. }
  416. }
  417. break;
  418. case s2c_synccurplayer:
  419. {
  420. /*
  421. CURPLAYER_SYNC *pCS = (CURPLAYER_SYNC *)pMsg;
  422. if ( pCS )
  423. {
  424. m_dwID = pCS->m_dwID;
  425. }
  426. */
  427. //ReConnectGateway();
  428. }
  429. break;
  430. case s2c_syncnpcmin:
  431. {
  432. if ( ( DWORD )( -1 ) != m_dwID )
  433. {
  434. NPC_NORMAL_SYNC *pNS = (NPC_NORMAL_SYNC *)pMsg;
  435. if ( pNS && pNS->ID == m_dwID )
  436. {
  437. m_ptCurPos.x = pNS->MapX;
  438. m_ptCurPos.y = pNS->MapY;
  439. }
  440. else if ( pNS && pNS->ID == m_dwTargetID )
  441. {
  442. m_ptTagPos.x = pNS->MapX;
  443. m_ptTagPos.y = pNS->MapY;
  444. }
  445. if ( ( DWORD )( -1 ) == m_dwTargetID && '' != g_pRoleName[0] )
  446. {
  447. NPC_REQUEST_COMMAND nrc;
  448. nrc.ProtocolType = c2s_requestnpc;
  449. nrc.ID = pNS->ID;
  450. m_pClientToGameSvr->SendPackToServer( reinterpret_cast< char * >( &nrc ), 
  451. sizeof( NPC_REQUEST_COMMAND ) );
  452. }
  453. }
  454. }
  455. break;
  456. case s2c_syncnpcminplayer:
  457. {
  458. if ( ( DWORD )( -1 ) != m_dwID )
  459. {
  460. NPC_PLAYER_TYPE_NORMAL_SYNC *pNPTNS = (NPC_PLAYER_TYPE_NORMAL_SYNC *)pMsg;
  461. if ( pNPTNS && pNPTNS->m_dwNpcID == m_dwID )
  462. {
  463. m_ptCurPos.x = pNPTNS->m_dwMapX;
  464. m_ptCurPos.y = pNPTNS->m_dwMapY;
  465. }
  466. else if ( pNPTNS && pNPTNS->m_dwNpcID == m_dwTargetID )
  467. {
  468. m_ptTagPos.x = pNPTNS->m_dwMapX;
  469. m_ptTagPos.y = pNPTNS->m_dwMapY;
  470. }
  471. }
  472. }
  473. break;
  474. case s2c_playersendchat:
  475. break;
  476. default:
  477. break;
  478. }
  479. /*
  480.  * Get next protocol
  481.  */
  482. int nProtocolSize = g_nGameProtocolSize[ cProtocol - s2c_clientbegin - 1 ];
  483. if ( nProtocolSize >= 0 )
  484. {
  485. pMsg += nProtocolSize;
  486. }
  487. else
  488. {
  489. unsigned short usMsgSize = *( unsigned short * )( pMsg + sizeof( BYTE ) );
  490. pMsg += sizeof( BYTE ) + usMsgSize;
  491. }
  492. }
  493. }
  494. //******************************************************************************
  495. /*! fn     void CPlayer::ProcessGameSvrLoop()
  496. *   brief  处理向游戏世界发送消息
  497. *******************************************************************************/
  498. void CPlayer::ProcessGameSvrLoop()
  499. {
  500. if( NULL == m_pClientToGameSvr)
  501. return;
  502. if ( rand() % 100 < 5 )
  503. {
  504. char szSpeakText[128];
  505. int nIndex = rand() % g_TextNumber;
  506. sprintf( szSpeakText, ( const char * )g_szText[nIndex], g_pRoleName );
  507. SpeakWord( szSpeakText, strlen( szSpeakText ) );
  508. //ReConnectGateway();
  509. }
  510. else
  511. {
  512. WalkTo();
  513. }
  514. return;
  515. }
  516. //******************************************************************************
  517. /*! fn     void CPlayer::LoginGateway()
  518. *   brief  向网关发出登陆请求
  519. *******************************************************************************/
  520. void CPlayer::LoginGateway()
  521. {
  522. _tstring buffer;
  523. KLoginAccountInfo lai;
  524. ZeroMemory( &lai, sizeof( KLoginAccountInfo ) );
  525. // 填充帐号
  526. size_t used = sizeof( lai.Account );
  527. used = ( used > m_sAccName.length() ) ? m_sAccName.length() : used;
  528. memcpy( lai.Account, m_sAccName.c_str(), used );
  529. // 填充密码
  530. used = sizeof( lai.Password );
  531. used = ( used > m_sAccName.length() ) ? m_sAccName.length() : used;
  532. memcpy( lai.Password, m_sAccName.c_str(), used );
  533. // 其他信息
  534. lai.Param = LOGIN_A_LOGIN | LOGIN_R_REQUEST;
  535. lai.Size = sizeof( lai );
  536. buffer.resize( lai.Size + 1/* protocol id */ );
  537. BYTE bProtocol = c2s_login;
  538. memcpy( const_cast< char * >( buffer.c_str() ), &bProtocol, sizeof( BYTE ) );
  539. memcpy( const_cast< char * >( buffer.c_str() + 1 ), &lai, sizeof( lai ) );
  540. // 向网关发送请求
  541. m_pClientToGateWay->SendPackToServer( buffer.c_str(), buffer.size() );
  542. return;
  543. }
  544. // 
  545. //******************************************************************************
  546. /*! fn     bool CPlayer::OnAccountLoginNotify(const char* pMsg)
  547. *   brief  处理网关发回的帐号登陆请求的结果
  548. *******************************************************************************/
  549. bool CPlayer::OnAccountLoginNotify(const char* pMsg)
  550. {
  551. KLoginAccountInfo *pLAI = ( KLoginAccountInfo * )( ( const BYTE * )pMsg + 1 );
  552. bool bRet = false;
  553. if ( ( pLAI->Param | LOGIN_A_LOGIN ) &&
  554.  0 == m_sAccName.compare( pLAI->Account ) &&
  555.  0 == m_sAccName.compare( pLAI->Password ) )
  556. {
  557. if ( ( pLAI->Param & 0xFFFF ) == LOGIN_R_ACCOUNT_OR_PASSWORD_ERROR )
  558. {
  559. bRet = false;
  560. //::MessageBox(NULL, "An incorrect account or password!", "Error", MB_OK);
  561. }
  562. else if ( ( pLAI->Param & 0xFFFF ) == LOGIN_R_FAILED )
  563. {
  564. bRet = false;
  565. //::MessageBox(NULL, "Login failed!", "Error", MB_OK);
  566. }
  567. else if ( ( pLAI->Param & 0xFFFF ) == LOGIN_R_ACCOUNT_EXIST )
  568. {
  569. bRet = false;
  570. //::MessageBox(NULL, "Login failed! your accout was existed!", m_sAccName.c_str(), MB_OK);
  571. }
  572. else if ( ( pLAI->Param & 0xFFFF ) == LOGIN_R_TIMEOUT )
  573. {
  574. bRet = false;
  575. //::MessageBox(NULL, "Login failed! no money!", "Error", MB_OK);
  576. }
  577. else if ( ( pLAI->Param & 0xFFFF ) == LOGIN_R_SUCCESS )
  578. {
  579. bRet = true;
  580. }
  581. }
  582. return bRet;
  583. }
  584. //******************************************************************************
  585. /*! fn     int CPlayer::OnGetRoleListRole(const char* pMsg)
  586. *   brief  响应网关发来的消息,选择角色列表
  587. *******************************************************************************/
  588. int CPlayer::OnGetRoleList(const char* pMsg)
  589. {
  590. int nRoleCount = 0;
  591. int nSelRoleIndex = 0;
  592. const S3DBI_RoleBaseInfo *pRoleList = NULL;
  593. TProcessData *pPA = ( TProcessData * )pMsg;
  594. nRoleCount = *( char * )( pPA->pDataBuffer );
  595. if( nRoleCount > 0)
  596. {
  597. pRoleList = ( const S3DBI_RoleBaseInfo * )( ( const char * )( pPA->pDataBuffer ) + 1/* sizeof( char ) */ );
  598. const size_t datalength = sizeof( S3DBI_RoleBaseInfo ) * nRoleCount;
  599. /*
  600.  * Send this info to gateway
  601.  */
  602. tagDBSelPlayer tDBSP;
  603. tDBSP.cProtocol = c2s_dbplayerselect;
  604. size_t nRoleNameLen = strlen( pRoleList[nSelRoleIndex].szName );
  605. memcpy( tDBSP.szRoleName, pRoleList[nSelRoleIndex].szName, nRoleNameLen );
  606. tDBSP.szRoleName[nRoleNameLen] = '';
  607. m_pClientToGateWay->SendPackToServer( &tDBSP, sizeof( tagDBSelPlayer ) );
  608. }
  609. int nMsgLen = sizeof(TProcessData) + pPA->nDataLen - 1;
  610. return nMsgLen;
  611. }
  612. //******************************************************************************
  613. /*! fn     bool CPlayer::OnPlayerLoginNotify(const char* pMsg)
  614. *   brief  处理网关发来的消息,响应角色进入游戏的通告
  615. *******************************************************************************/
  616. bool CPlayer::OnPlayerLoginNotify(const char* pMsg)
  617. {
  618. tagNotifyPlayerLogin *pNPL = ( tagNotifyPlayerLogin * )pMsg;
  619. const char *pIPAddr = OnlineGameLib::Win32::net_ntoa( pNPL->nIPAddr );
  620. return ConnectToGameSvr( pIPAddr, pNPL->nPort, pNPL->guid );
  621. }
  622. //******************************************************************************
  623. /*! fn     bool CPlayer::ConnectToGameSvr( const char *pIPAddr, unsigned short nPort, GUID &guid )
  624. *   brief  处理网关发来的消息,客户连接到网关
  625. *******************************************************************************/
  626. bool CPlayer::ConnectToGameSvr( const char *pIPAddr, unsigned short nPort, GUID &guid )
  627. {
  628. pfnCreateClientInterface pFactroyFun = ( pfnCreateClientInterface )( s_theRainbowLib.GetProcAddress( "CreateInterface" ) );
  629. IClientFactory *pClientFactory = NULL;
  630. if ( pFactroyFun && SUCCEEDED( pFactroyFun( IID_IClientFactory, reinterpret_cast< void ** >( &pClientFactory ) ) ) )
  631. {
  632. pClientFactory->SetEnvironment( 50, 1024 * 16 );
  633. pClientFactory->CreateClientInterface( IID_IESClient, reinterpret_cast< void ** >( &m_pClientToGameSvr ) );
  634. pClientFactory->Release();
  635. }
  636. if ( !m_pClientToGameSvr )
  637. {
  638. ::MessageBox(NULL, "Initialization failed! Don't find a correct rainbow.dll", "Error", MB_OK);
  639. return false;
  640. }
  641. /*
  642.  * Create a connection
  643.  */
  644. m_pClientToGameSvr->Startup();
  645. //pGameSvrClient->RegisterMsgFilter( reinterpret_cast< void * >( pClient ), NULL );
  646. if ( FAILED( m_pClientToGameSvr->ConnectTo( pIPAddr, nPort ) ) )
  647. {
  648. //::MessageBox(NULL, "Connection failed! Don't connect to game server.", "Error", MB_OK);
  649. return false;
  650. }
  651. tagLogicLogin ll;
  652. ll.cProtocol = c2s_logiclogin;
  653. memcpy( &ll.guid, &guid, sizeof( GUID ) );
  654. m_pClientToGameSvr->SendPackToServer( &ll, sizeof( tagLogicLogin ) );
  655. ShutdownGateway();
  656. return true;
  657. }
  658. //******************************************************************************
  659. /*! fn     void CPlayer::SyncEnd()
  660. *   brief  响应游戏服务器发来的消息,初始同步结束
  661. * SyncWorld, SyncNpc, SyncPlayer, SyncCurPlayer, SyncCurPlayerSkill
  662. * SyncEnd, SyncNpcMinPlayer
  663. *******************************************************************************/
  664. void CPlayer::SyncEnd()
  665. {
  666. SetStatus( enumPlayGame );
  667. BYTE cSyscEndFlag = c2s_syncend;
  668. m_pClientToGameSvr->SendPackToServer( reinterpret_cast< char * >( &cSyscEndFlag ), sizeof( BYTE ) );
  669. }
  670. //******************************************************************************
  671. /*! fn     void CPlayer::WalkTo()
  672. *   brief  机器人行走
  673. *******************************************************************************/
  674. void CPlayer::WalkTo()
  675. {
  676. if ( ( DWORD )( -1 ) != m_dwTargetID && m_ptTagPos.x && m_ptTagPos.y )
  677. {
  678. if ( abs( m_ptCurPos.x - m_ptTagPos.x ) > 5 * 32 ||
  679. abs( m_ptCurPos.y - m_ptTagPos.y ) > 6 * 32 )
  680. {
  681. NPC_WALK_COMMAND nwc;
  682. nwc.ProtocolType = c2s_npcwalk;
  683. nwc.nMpsX = m_ptTagPos.x;
  684. nwc.nMpsY = m_ptTagPos.y;
  685. m_pClientToGameSvr->SendPackToServer( reinterpret_cast< BYTE * >( &nwc ), sizeof( nwc ) );
  686. }
  687. }
  688. }
  689. //******************************************************************************
  690. /*! fn     void CPlayer::SpeakWord( const char *pText, size_t size  )
  691. *   brief  随机聊天
  692. *******************************************************************************/
  693. void CPlayer::SpeakWord( const char *pText, size_t size /*0*/ )
  694. {
  695. if ( NULL == pText || 0 == size )
  696. {
  697. return;
  698. }
  699. size_t dataLength = size;
  700. if ( 0 == dataLength )
  701. {
  702. dataLength = strlen( pText );
  703. }
  704. PLAYER_SEND_CHAT_COMMAND pscc;
  705. pscc.ProtocolType = c2s_playersendchat;
  706. pscc.m_btCurChannel = 1; // To all
  707. pscc.m_btType = 0; // MSG_G_CHAT
  708. pscc.m_dwTargetID = 0;
  709. pscc.m_nTargetIdx = 0;
  710. pscc.m_btChatPrefixLen = 4;
  711. pscc.m_szSentence[0] = 0x2;
  712. int nIndex = rand() % g_rgbNumber;
  713. pscc.m_szSentence[1] = g_rgbText[nIndex].r;
  714. pscc.m_szSentence[2] = g_rgbText[nIndex].g;
  715. pscc.m_szSentence[3] = g_rgbText[nIndex].b;
  716. memcpy( &( pscc.m_szSentence[4] ), pText, strlen( pText ) );
  717. pscc.m_wSentenceLen = dataLength;
  718. pscc.m_wLength = 
  719. dataLength + 4 +
  720. sizeof( PLAYER_SEND_CHAT_COMMAND ) - 
  721. sizeof( pscc.m_szSentence ) - 
  722. sizeof( BYTE );
  723. m_pClientToGameSvr->SendPackToServer( &pscc, pscc.m_wLength + sizeof( BYTE ) );
  724. }
  725. //******************************************************************************
  726. /*! fn     void ShutdownGateway()
  727. *   brief  切断与网关的连接
  728. *******************************************************************************/
  729. void CPlayer::ShutdownGateway()
  730. {
  731. // 关闭到网关的连接
  732. if ( m_pClientToGateWay )
  733. {
  734. m_pClientToGateWay->Cleanup();
  735. SAFE_RELEASE( m_pClientToGateWay );
  736. }
  737. }
  738. //******************************************************************************
  739. /*! fn     void ShutdownGateway()
  740. *   brief  切断与网关的连接
  741. *******************************************************************************/
  742. void CPlayer::ShutdownGameSvr()
  743. {
  744. // 关闭到网关的连接
  745. if ( m_pClientToGameSvr )
  746. {
  747. m_pClientToGameSvr->Cleanup();
  748. SAFE_RELEASE( m_pClientToGameSvr );
  749. }
  750. }
  751. void __stdcall CPlayer::ClientEventNotify(
  752. LPVOID lpParam,
  753. const unsigned long &ulnEventType )
  754. {
  755. CPlayer *pPlayer = ( CPlayer * )lpParam;
  756. ASSERT( pPlayer );
  757. try
  758. {
  759. pPlayer->_ClientEventNotify( ulnEventType );
  760. }
  761. catch(...)
  762. {
  763. ::MessageBeep( -1 );
  764. }
  765. }
  766. void CPlayer::_ClientEventNotify( const unsigned long &ulnEventType )
  767. {
  768. switch( ulnEventType )
  769. {
  770. case enumServerConnectCreate:
  771. ::MessageBeep( -1 );
  772. break;
  773. case enumServerConnectClose:
  774. ::MessageBeep( -1 );
  775. break;
  776. }
  777. }