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

模拟服务器

开发平台:

C/C++

  1. #include "Stdafx.h"
  2. #include "GamePlayer.h"
  3. #include "AccountLoginDef.h"
  4. #include "LoginDef.h"
  5. #include "S3DBInterface.h"
  6. #include "KProtocol.h"
  7. #include "KProtocolDef.h"
  8. #include "Utils.h"
  9. #include "Macro.h"
  10. #include "Exception.h"
  11. #include "Buffer.h"
  12. #include "SmartClient.h"
  13. using OnlineGameLib::Win32::Output;
  14. using OnlineGameLib::Win32::CException;
  15. using OnlineGameLib::Win32::CCriticalSection;
  16. using OnlineGameLib::Win32::ToString;
  17. using OnlineGameLib::Win32::Trace;
  18. using OnlineGameLib::Win32::_tstring;
  19. using OnlineGameLib::Win32::CBuffer;
  20. using OnlineGameLib::Win32::CPackager;
  21. using OnlineGameLib::Win32::net_aton;
  22. CBuffer::Allocator CGamePlayer::m_theGlobalAllocator( 1024 * 64, 1000 );
  23. LONG CGamePlayer::m_slnIdentityCounts = 0;
  24. LONG CGamePlayer::m_lnWorkingCounts = 0;
  25. const int CGamePlayer::s_nRoleListCount  = 3;
  26. const int CGamePlayer::s_nLoginTimeoutTimer  = 60 * 1000;
  27. const int CGamePlayer::s_nProcessTimeoutTimer  = 200 * 1000;
  28. CCriticalSection CGamePlayer::m_csMapSP;
  29. CGamePlayer::stdMapSP CGamePlayer::m_sthePlayerTable;
  30. CPlayerCreator CGamePlayer::m_thePlayerCreator;
  31. //IClient * CGamePlayer::m_pAccSvrClient = NULL;
  32. IServer * CGamePlayer::m_pPlayerServer = NULL;
  33. IClient * CGamePlayer::m_pDBRoleClient = NULL;
  34. /*
  35.  * CGamePlayer Global Function
  36.  */
  37. bool CGamePlayer::SetupGlobalAllocator( size_t bufferSize, size_t maxFreeBuffers )
  38. {
  39. return CGamePlayer::m_theGlobalAllocator.ReSet( bufferSize, maxFreeBuffers );
  40. }
  41. /*
  42.  * CGamePlayer::CTask
  43.  */
  44. CGamePlayer::CTask::CTask()
  45. {
  46. ASSERT( FALSE );
  47. }
  48. CGamePlayer::CTask::~CTask()
  49. {
  50. //CCriticalSection::Owner lock( m_csTask );
  51. stdVector::iterator theIterator;
  52. for ( theIterator = m_stdCommand.begin(); theIterator != m_stdCommand.end(); theIterator ++ )
  53. {
  54. ICommand *pCmd = reinterpret_cast< ICommand * >( *theIterator );
  55. SAFE_DELETE( pCmd );
  56. }
  57. m_stdCommand.clear();
  58. }
  59. CGamePlayer::CTask::CTask( CGamePlayer *pReceiver, UINT nTaskID )
  60. : m_pReceiver( pReceiver )
  61. , m_indexCmd( 0 )
  62. , m_nTaskProgID( nTaskID )
  63. {
  64. }
  65. size_t CGamePlayer::CTask::AddCmd( Action pFun )
  66. {
  67. //CCriticalSection::Owner lock( m_csTask );
  68. /*
  69.  * Convert a status to the other status
  70.  */
  71. /*
  72.  * Generate a command and push it into the task queue
  73.  */
  74. ICommand *pCmd = new CTaskCommand< CGamePlayer >( m_pReceiver, pFun );
  75. m_stdCommand.push_back( pCmd );
  76. size_t id = m_stdCommand.size();
  77. return id;
  78. }
  79. UINT CGamePlayer::CTask::Execute()
  80. {
  81. //CCriticalSection::Owner lock( m_csTask );
  82. if ( m_indexCmd < m_stdCommand.size() )
  83. {
  84. ICommand *pCmd = m_stdCommand[ m_indexCmd ];
  85. ASSERT( pCmd );
  86. UINT nResult = pCmd->Execute();
  87. switch ( nResult )
  88. {
  89. case enumSelAddDelRole:
  90. case enumLoginCreateRole:
  91. case enumLoginDeleteRole:
  92. case enumLoginSelectRole:
  93. case enumCompleted:
  94. Reset();
  95. case enumError:
  96. case enumNone:
  97. return nResult;
  98. break;
  99. case enumRepeat:
  100. return m_nTaskProgID;
  101. break;
  102. case enumToNextTask:
  103. default:
  104. break;
  105. }
  106. m_indexCmd ++;
  107. return m_nTaskProgID;
  108. }
  109. Reset();
  110. return enumCompleted;
  111. }
  112. /*
  113.  * CGamePlayer class
  114.  */
  115. CGamePlayer::CDataQueue::CDataQueue( size_t bufferSize /*= 1024 * 64*/, size_t maxFreeBuffers /*= 1*/ )
  116. : m_theDQAllocator( bufferSize, maxFreeBuffers )
  117. {
  118. }
  119. CGamePlayer::CDataQueue::~CDataQueue()
  120. {
  121. Empty();
  122. }
  123. void CGamePlayer::CDataQueue::Empty()
  124. {
  125. CCriticalSection::Owner locker( m_csQueue );
  126. stdDataMap::iterator it;
  127. for ( it = m_theData.begin(); it != m_theData.end(); it ++ )
  128. {
  129. LONG id = ( *it ).first;
  130. CBuffer *pBuffer = (*it).second;
  131. SAFE_RELEASE( pBuffer );
  132. }
  133. m_theData.erase( m_theData.begin(), m_theData.end() );
  134. }
  135. bool CGamePlayer::CDataQueue::AddData( LONG lnID, const BYTE *pData, size_t datalength )
  136. {
  137. bool ok = false;
  138. ASSERT( pData && datalength );
  139. CBuffer *pBuffer = m_theDQAllocator.Allocate();
  140. ASSERT( pBuffer );
  141. pBuffer->AddData( pData, datalength );
  142. {
  143. CCriticalSection::Owner locker( m_csQueue );
  144. pBuffer->AddRef();
  145. stdDataMap::iterator it;
  146. if ( m_theData.end() != ( it = m_theData.find( lnID ) ) )
  147. {
  148. CBuffer *pTemp = ( *it ).second;
  149. SAFE_RELEASE( pTemp );
  150. m_theData.erase( it );
  151. }
  152. std::pair< stdDataMap::iterator, bool > result = 
  153. m_theData.insert( stdDataMap::value_type( lnID, pBuffer ) );
  154. if ( !( ok = result.second ) )
  155. {
  156. SAFE_RELEASE( pBuffer );
  157. }
  158. }
  159. SAFE_RELEASE( pBuffer );
  160. return ok;
  161. }
  162. CBuffer *CGamePlayer::CDataQueue::Attach( LONG lnID )
  163. {
  164. CCriticalSection::Owner locker( m_csQueue );
  165. stdDataMap::iterator it;
  166. if ( m_theData.end() != ( it = m_theData.find( lnID ) ) )
  167. {
  168. CBuffer *pBuffer = ( *it ).second;
  169. m_theData.erase( it );
  170. return pBuffer;
  171. }
  172. return NULL;
  173. }
  174. void CGamePlayer::CDataQueue::Detach( LONG lnID )
  175. {
  176. // Clear( lnID );
  177. }
  178. void CGamePlayer::CDataQueue::Clear( LONG lnID )
  179. {
  180. CCriticalSection::Owner locker( m_csQueue );
  181. stdDataMap::iterator it;
  182. if ( m_theData.end() != ( it = m_theData.find( lnID ) ) )
  183. {
  184. CBuffer *pBuffer = ( *it ).second;
  185. SAFE_RELEASE( pBuffer );
  186. m_theData.erase( it );
  187. }
  188. }
  189. /*
  190.  * CGamePlayer class
  191.  */
  192. CGamePlayer::CGamePlayer( UINT nIdentityID /*  = ( UINT )( -1 ) */ )
  193. : m_lnIdentityID( nIdentityID )
  194. , m_theLoginTask( this, enumLogin )
  195. , m_theSelAddDelTask( this, enumSelAddDelRole )
  196. , m_theLoginCreateRoleTask( this, enumLoginCreateRole )
  197. , m_theLoginSelectRoleTask( this, enumLoginSelectRole )
  198. , m_theLoginDeleteRoleTask( this, enumLoginDeleteRole )
  199. , m_theSafeCloseTask( this, enumSafeClose )
  200. , m_nCurrentTaskID( 0 )
  201. , m_nAttachServerID( -1 )
  202. , m_bActiveStatus( false )
  203. , m_dwTaskBeginTimer( 0 )
  204. , m_dwTaskTotalTimer( 0 )
  205. , m_bAutoUnlockAccount( false )
  206.                 , m_bUseSuperPassword( false )
  207. , m_nExtPoint(-1)
  208. {
  209. SetCurrentTask( enumNone );
  210. LONG lnID = ::InterlockedExchangeAdd( &m_slnIdentityCounts, 1 );
  211. m_lnIdentityID = ( ( UINT )( -1 ) == m_lnIdentityID ) ? lnID : m_lnIdentityID;
  212. InitTaskProcessor();
  213. }
  214. CGamePlayer::~CGamePlayer()
  215. {
  216. {
  217. CCriticalSection::Owner locker( CGamePlayer::m_csMapSP );
  218. m_sthePlayerTable.erase( m_sthePlayerTable.begin(), m_sthePlayerTable.end() );
  219. }
  220. ::InterlockedExchangeAdd( &m_slnIdentityCounts, -1 );
  221. }
  222. bool CGamePlayer::Active()
  223. {
  224. SetCurrentTask( enumNone );
  225. m_nAttachServerID = -1;
  226. m_bActiveStatus = true;
  227. m_dwTaskBeginTimer = ::GetTickCount();
  228. m_dwTaskTotalTimer = s_nLoginTimeoutTimer;
  229. ::InterlockedExchangeAdd( &m_lnWorkingCounts, 1 );
  230. return true;
  231. }
  232. bool CGamePlayer::Inactive()
  233. {
  234. m_bActiveStatus = false;
  235. SetCurrentTask( enumNone );
  236. Del( m_sRoleName.c_str() );
  237. m_dwTaskBeginTimer = 0;
  238. m_dwTaskTotalTimer = s_nLoginTimeoutTimer;
  239. if ( m_bAutoUnlockAccount )
  240. {
  241. _UnlockAccount();
  242. m_bAutoUnlockAccount = false;
  243. }
  244. _ClearTaskQueue();
  245. /* IGServer *pGServer = CGameServer::GetServer( m_nAttachServerID );
  246. if ( pGServer )
  247. {
  248. pGServer->DispatchTask( CGameServer::enumPlayerLogicLogout, m_sRoleName.c_str(), m_sRoleName.size() );
  249. }
  250. */
  251. m_nAttachServerID = -1;
  252. /*
  253. * Clear this role info
  254. */
  255. m_sAccountName = "";
  256. m_sPassword = "";
  257.     m_sSuperPassword = "";
  258.     m_sDelRoleName   = "";
  259.     m_bUseSuperPassword = false;
  260. m_sRoleName = "";
  261. ::InterlockedExchangeAdd( &m_lnWorkingCounts, -1 );
  262. return true;
  263. }
  264. UINT CGamePlayer::SafeClose()
  265. {
  266. ASSERT( FALSE );
  267. return enumToNextTask;
  268. }
  269. bool CGamePlayer::_UnlockAccount()
  270. {
  271. const char *pAccountName = m_sAccountName.c_str();
  272. if ( !pAccountName || !pAccountName[0] )
  273. {
  274. return false;
  275. }
  276. if ( _NAME_LEN <= strlen( pAccountName ) )
  277. {
  278. return false;
  279. }
  280. CBuffer *pBuffer = m_theGlobalAllocator.Allocate();
  281. BYTE *pData = const_cast< BYTE * >( pBuffer->GetBuffer() );
  282. const size_t datalength = sizeof( KAccountUserLogout ) + 1;
  283. KAccountUserLogout user;
  284. user.Size = sizeof( KAccountUserLogout );
  285. user.Type = AccountUserLogout;
  286. user.Version = ACCOUNT_CURRENT_VERSION;
  287. user.nExtPoint = 0;
  288. size_t length = strlen( pAccountName );
  289. length = ( length > LOGIN_USER_ACCOUNT_MAX_LEN ) ? LOGIN_USER_ACCOUNT_MAX_LEN : length;
  290. memcpy( user.Account, pAccountName, length );
  291. user.Account[length] = '';
  292. *pData = c2s_accountlogout;
  293. memcpy( pData + 1, &user, sizeof( KAccountUserLogout ) );
  294. g_theSmartClient.Send( ( const void * )pData, datalength );
  295. // m_pAccSvrClient->SendPackToServer( ( const void * )pData, datalength );
  296. SAFE_RELEASE( pBuffer );
  297. return true;
  298. }
  299. void CGamePlayer::ATTACH_NETWORK( IClient *pAccSvrClient, 
  300. IServer *pPlayerServer, 
  301. IClient *pDBRoleClient )
  302. {
  303. ASSERT( m_slnIdentityCounts == 0 );
  304. // m_pAccSvrClient = pAccSvrClient;
  305. m_pPlayerServer = pPlayerServer;
  306. m_pDBRoleClient = pDBRoleClient;
  307. }
  308. void CGamePlayer::DETACH_NETWORK()
  309. {
  310. ASSERT( m_slnIdentityCounts == 0 );
  311. // SAFE_RELEASE( m_pAccSvrClient );
  312. SAFE_RELEASE( m_pPlayerServer );
  313. SAFE_RELEASE( m_pDBRoleClient );
  314. }
  315. bool CGamePlayer::DispatchTask( UINT nTaskID )
  316. {
  317. /*
  318.  * This player is processing a special tasks
  319.  */
  320. /*
  321. if ( IsWorking() )
  322. {
  323. return false;
  324. }
  325. */
  326. m_theLoginTask.Reset();
  327. m_theSelAddDelTask.Reset();
  328. m_theLoginCreateRoleTask.Reset();
  329. m_theLoginSelectRoleTask.Reset();
  330. m_theLoginDeleteRoleTask.Reset();
  331. SetCurrentTask( nTaskID );
  332. return true;
  333. }
  334. bool CGamePlayer::IsWorking()
  335. {
  336. return ( GetCurrentTask() != enumNone );
  337. }
  338. bool CGamePlayer::Run()
  339. {
  340. LONG lnNextTask = enumNone;
  341. if ( m_bActiveStatus && m_dwTaskBeginTimer )
  342. {
  343. DWORD dwCurTimer = ::GetTickCount();
  344. if ( dwCurTimer - m_dwTaskBeginTimer > m_dwTaskTotalTimer )
  345. {
  346. m_pPlayerServer->ShutdownClient( m_lnIdentityID );
  347. return false;
  348. }
  349. }
  350. switch ( GetCurrentTask() )
  351. {
  352. case enumNone:
  353. return true;
  354. break;
  355. case enumLogin:
  356. lnNextTask = m_theLoginTask.Execute();
  357. SetCurrentTask( lnNextTask );
  358. break;
  359. case enumSelAddDelRole:
  360. lnNextTask = m_theSelAddDelTask.Execute();
  361. SetCurrentTask( lnNextTask );
  362. break;
  363. case enumLoginCreateRole:
  364. lnNextTask = m_theLoginCreateRoleTask.Execute();
  365. SetCurrentTask( lnNextTask );
  366. break;
  367. case enumLoginSelectRole:
  368. lnNextTask = m_theLoginSelectRoleTask.Execute();
  369. SetCurrentTask( lnNextTask );
  370. break;
  371. case enumLoginDeleteRole:
  372. lnNextTask = m_theLoginDeleteRoleTask.Execute();
  373. SetCurrentTask( lnNextTask );
  374. break;
  375. case enumSafeClose:
  376. lnNextTask = m_theSafeCloseTask.Execute();
  377. SetCurrentTask( lnNextTask );
  378. break;
  379. case enumCompleted:
  380. lnNextTask = TaskCompleted() ? enumNone : enumCompleted;
  381. SetCurrentTask( lnNextTask );
  382. break;
  383. case enumError:
  384. SetCurrentTask( enumNone );
  385. break;
  386. default:
  387. break;
  388. }
  389. return true;
  390. }
  391. bool CGamePlayer::AppendData( UINT nOwner, const void *pData, size_t dataLength )
  392. {
  393. if ( nOwner >= enumOwnerTotal || !m_bActiveStatus )
  394. {
  395. return false;
  396. }
  397. BYTE cProtocol = CPackager::Peek( pData );
  398. if ( cProtocol < g_nGlobalProtocolType )
  399. {
  400. return LargePackProcess( nOwner, pData, dataLength );
  401. }
  402. else if ( cProtocol > g_nGlobalProtocolType )
  403. {
  404. return SmallPackProcess( nOwner, pData, dataLength );
  405. }
  406. return true;
  407. }
  408. bool CGamePlayer::SmallPackProcess( UINT nOwner, const void *pData, size_t dataLength )
  409. {
  410. switch ( nOwner )
  411. {
  412. case enumOwnerAccSvr:
  413. return DispatchTaskForAccount( pData, dataLength );
  414. break;
  415. case enumOwnerRoleSvr:
  416. return DispatchTaskForDBRole( pData, dataLength );
  417. break;
  418. case enumOwnerPlayer:
  419. return DispatchTaskForPlayer( pData, dataLength );
  420. break;
  421. default:
  422. break;
  423. }
  424. return false;
  425. }
  426. bool CGamePlayer::LargePackProcess( UINT nOwner, const void *pData, size_t dataLength )
  427. {
  428. switch ( nOwner )
  429. {
  430. case enumOwnerAccSvr:
  431. ASSERT( FALSE );
  432. break;
  433. case enumOwnerRoleSvr:
  434. {
  435. bool ok = true;
  436. CBuffer *pBuffer = m_thePackager.PackUp( pData, dataLength );
  437. if ( pBuffer )
  438. {
  439. ok = DispatchTaskForDBRole( pBuffer->GetBuffer(), pBuffer->GetUsed() );
  440. SAFE_RELEASE( pBuffer );
  441. }
  442. return ok;
  443. }
  444. break;
  445. case enumOwnerPlayer:
  446. ASSERT( FALSE );
  447. break;
  448. default:
  449. break;
  450. }
  451. return false;
  452. }
  453. bool CGamePlayer::DispatchTaskForAccount( const void *pData, size_t dataLength )
  454. {
  455. if ( NULL == pData || 0 == dataLength )
  456. {
  457. return false;
  458. }
  459. BYTE cProtocol = CPackager::Peek( pData );
  460. m_theDataQueue[enumOwnerAccSvr].AddData( cProtocol, ( const BYTE * )pData, dataLength );
  461. return true;
  462. }
  463. bool CGamePlayer::DispatchTaskForDBRole( const void *pData, size_t dataLength )
  464. {
  465. if ( NULL == pData || 0 == dataLength )
  466. {
  467. return false;
  468. }
  469. BYTE cProtocol = CPackager::Peek( pData );
  470. m_theDataQueue[enumOwnerRoleSvr].AddData( cProtocol, ( const BYTE * )pData, dataLength );
  471. return true;
  472. }
  473. bool CGamePlayer::DispatchTaskForPlayer( const void *pData, size_t dataLength )
  474. {
  475. if ( NULL == pData || 0 == dataLength )
  476. {
  477. return false;
  478. }
  479. BYTE cProtocol = CPackager::Peek( pData );
  480. m_theDataQueue[enumOwnerPlayer].AddData( cProtocol, ( const BYTE * )pData, dataLength );
  481. return true;
  482. }
  483. void CGamePlayer::_ClearTaskQueue()
  484. {
  485. for ( int i=0; i<enumOwnerTotal; i++ )
  486. {
  487. m_theDataQueue[i].Empty();
  488. }
  489. m_thePackager.Empty();
  490. }
  491. void CGamePlayer::InitTaskProcessor()
  492. {
  493. /*
  494.  * Login main task
  495.  */
  496. m_theLoginTask.AddCmd( &CGamePlayer::WaitForAccPwd );
  497. m_theLoginTask.AddCmd( &CGamePlayer::QueryAccPwd );
  498. m_theLoginTask.AddCmd( &CGamePlayer::VerifyAccount );
  499. m_theLoginTask.AddCmd( &CGamePlayer::QueryRoleList );
  500. m_theLoginTask.AddCmd( &CGamePlayer::ProcessRoleList );
  501. /*
  502.  * Login branch task
  503.  */
  504. {
  505. /*
  506.  * m_theSelAddDelTask::SelAddDelRole
  507.  *
  508.  * switch( result )
  509.  * case m_theLoginCreateRoleTask
  510.  * case m_theLoginDeleteRoleTask
  511.  * case m_theLoginSelectRoleTask
  512.  */
  513. m_theSelAddDelTask.AddCmd( &CGamePlayer::SelAddDelRole );
  514. m_theSelAddDelTask.AddCmd( &CGamePlayer::QueryAccPwd );
  515. m_theSelAddDelTask.AddCmd( &CGamePlayer::DelRole_WaitForVerify );
  516. /*
  517.  * m_theLoginCreateRoleTask::WaitForCreateResult
  518.  *
  519.  * successed : m_theLoginCreateRoleTask::ProcessRoleInfo
  520.  * failed  : m_theSelAddDelTask::SelAddDelRole
  521.  */
  522. m_theLoginCreateRoleTask.AddCmd( &CGamePlayer::WaitForCreateResult ); 
  523. m_theLoginCreateRoleTask.AddCmd( &CGamePlayer::ProcessRoleInfo );
  524. m_theLoginCreateRoleTask.AddCmd( &CGamePlayer::WaitForGameSvrPermit );
  525. m_theLoginDeleteRoleTask.AddCmd( &CGamePlayer::WaitForDeleteResult );
  526. m_theLoginSelectRoleTask.AddCmd( &CGamePlayer::ProcessRoleInfo );
  527. m_theLoginSelectRoleTask.AddCmd( &CGamePlayer::WaitForGameSvrPermit );
  528. }
  529. m_theSafeCloseTask.AddCmd( &CGamePlayer::SafeClose );
  530. /*
  531.  * Logout
  532.  */
  533. m_nExtPoint = -1;
  534. }
  535. bool CGamePlayer::TaskCompleted()
  536. {
  537. Trace( ToString( m_lnIdentityID ), "CGamePlayer::TaskCompleted" );
  538. /*
  539.  * Clear some data
  540.  */
  541. return true;
  542. }
  543. UINT CGamePlayer::WaitForAccPwd()
  544. {
  545. #ifdef CONSOLE_DEBUG
  546. cprintf( "CGamePlayer::WaitForAccPwd...n" );
  547. #endif
  548. CBuffer *pRetBuffer = m_theDataQueue[enumOwnerPlayer].Attach( c2s_login );
  549.  
  550. if ( pRetBuffer )
  551. {
  552. KLoginAccountInfo* pLAI = ( KLoginAccountInfo * )( pRetBuffer->GetBuffer() + 1/* size of a protocol byte */ );
  553. UINT nNextTask = enumError;
  554. const char *pAccName = pLAI->Account;
  555. const char *pAccPwd = pLAI->Password.szPassword;
  556. #ifdef CONSOLE_DEBUG
  557. cprintf( "CGamePlayer::WaitForAccPwd [AccountName:%s]n", pAccName );
  558. #endif
  559.             
  560.         // modify by Freeway Chen in 2003.7.1
  561.         if (pLAI)
  562.         {
  563.             int nCheckProtocolVersion = true;
  564.             #ifdef USE_KPROTOCOL_VERSION
  565.              nCheckProtocolVersion = (pLAI->ProtocolVersion == KPROTOCOL_VERSION);
  566.             #endif
  567.             if (nCheckProtocolVersion)
  568.             {
  569.                 // 如果协议版本相同,继续判断账号
  570.                 if (pAccName[0]) 
  571.         {
  572.         nNextTask = enumToNextTask;
  573.         
  574.         m_sAccountName = pAccName;
  575.         m_sPassword = pAccPwd ? pAccPwd : "";
  576.                     m_bUseSuperPassword = false;
  577.         }
  578.             }
  579.             else
  580.             {
  581.                 // 如果协议版本不同,就提示用户出错,需要升级到新版本
  582.            UINT nQueryResult = LOGIN_A_LOGIN | LOGIN_R_INVALID_PROTOCOLVERSION;
  583.                 _VerifyAccount_ToPlayer(nQueryResult, 0);
  584.                 // 是否需要玩家断开? 需要进一步确认
  585.      //m_pPlayerServer->ShutdownClient( m_lnIdentityID ); // 断开玩家
  586.             }
  587.         }
  588. SAFE_RELEASE( pRetBuffer );
  589. m_theDataQueue[enumOwnerPlayer].Detach( c2s_login );
  590. return nNextTask;
  591. }
  592. return enumRepeat;
  593. }
  594. UINT CGamePlayer::QueryAccPwd()
  595. {
  596. #ifdef CONSOLE_DEBUG
  597. cprintf( "CGamePlayer::QueryAccPwd...n" );
  598. #endif
  599. /* if ( !m_pAccSvrClient )
  600. {
  601. return enumError;
  602. }
  603. */
  604. m_dwTaskTotalTimer = s_nProcessTimeoutTimer;
  605. CBuffer *pBuffer = m_theGlobalAllocator.Allocate();
  606. BYTE *pData = const_cast< BYTE * >( pBuffer->GetBuffer() );
  607. const size_t datalength = sizeof( KAccountUserLoginInfo ) + 1;
  608. KAccountUserLoginInfo userlogin;
  609. userlogin.Size = sizeof( KAccountUserLoginInfo );
  610.     if (m_bUseSuperPassword)
  611.     {
  612.      userlogin.Type = AccountUserVerify;
  613.     }
  614.     else
  615.     {
  616.      userlogin.Type = AccountUserLoginInfo;
  617.     }
  618. userlogin.Version = ACCOUNT_CURRENT_VERSION;
  619. userlogin.Operate = m_lnIdentityID;
  620. int nMinLen = sizeof( userlogin.Account );
  621. nMinLen = m_sAccountName.size() > nMinLen ? nMinLen: m_sAccountName.size();
  622. memcpy( userlogin.Account, m_sAccountName.c_str(), nMinLen );
  623. userlogin.Account[nMinLen] = '';
  624.     if (m_bUseSuperPassword)
  625.     {
  626.     nMinLen = sizeof( userlogin.Password );
  627.     nMinLen = m_sSuperPassword.size() > nMinLen ? nMinLen: m_sSuperPassword.size();
  628.     memcpy( userlogin.Password, m_sSuperPassword.c_str(), nMinLen );
  629.     userlogin.Password[nMinLen] = '';
  630.     }
  631.     else
  632.     {
  633.     nMinLen = sizeof( userlogin.Password );
  634.     nMinLen = m_sPassword.size() > nMinLen ? nMinLen: m_sPassword.size();
  635.     memcpy( userlogin.Password, m_sPassword.c_str(), nMinLen );
  636.     userlogin.Password[nMinLen] = '';
  637.     }
  638. *pData = c2s_accountlogin;
  639. memcpy( pData + 1, &userlogin, sizeof( KAccountUserLoginInfo ) );
  640. m_bAutoUnlockAccount = true;
  641. m_theDataQueue[enumOwnerAccSvr].Empty();
  642. g_theSmartClient.Send( ( const void * )pData, datalength );
  643. // m_pAccSvrClient->SendPackToServer( ( const void * )pData, datalength );
  644. SAFE_RELEASE( pBuffer );
  645. return enumToNextTask;
  646. }
  647. UINT CGamePlayer::VerifyAccount()
  648. {
  649. #ifdef CONSOLE_DEBUG
  650. cprintf( "CGamePlayer::VerifyAccount...n" );
  651. #endif
  652. m_nExtPoint = -1;
  653. CBuffer *pRetBuffer = m_theDataQueue[enumOwnerAccSvr].Attach( s2c_accountlogin );
  654. if ( pRetBuffer )
  655. {
  656. KAccountUserReturnExt* pReturn = ( KAccountUserReturnExt * )( pRetBuffer->GetBuffer() + 1/* size of a protocol byte */ );
  657. int nResult = pReturn->nReturn;
  658. UINT nQueryResult = LOGIN_A_LOGIN;
  659. UINT nNextTask = enumError;
  660. switch ( nResult )
  661. {
  662. case ACTION_SUCCESS: /* Login Success ! */
  663. #ifdef CONSOLE_DEBUG
  664. cprintf( "CGamePlayer::VerifyAccount Successful!n" );
  665. #endif
  666. // pReturn->Account;
  667. nQueryResult |= LOGIN_R_SUCCESS;
  668. nNextTask = enumToNextTask;
  669. m_nExtPoint = pReturn->nExtPoint;
  670. break;
  671. case E_ACCOUNT_OR_PASSWORD: /* Login Failed ! --- Name, Password */
  672. #ifdef CONSOLE_DEBUG
  673. cprintf( "CGamePlayer::VerifyAccount Failed! [name or pwd error]n" );
  674. #endif
  675. nQueryResult |= LOGIN_R_ACCOUNT_OR_PASSWORD_ERROR;
  676. m_bAutoUnlockAccount = false;
  677. break;
  678. case E_ACCOUNT_EXIST: /* Login Failed ! --- Already login */
  679. #ifdef CONSOLE_DEBUG
  680. cprintf( "CGamePlayer::VerifyAccount Failed! [Already login]n" );
  681. #endif
  682. nQueryResult |= LOGIN_R_ACCOUNT_EXIST;
  683. m_bAutoUnlockAccount = false;
  684. break;
  685. case E_ACCOUNT_FREEZE: /* Login Failed ! --- Account Freeze */
  686. #ifdef CONSOLE_DEBUG
  687. cprintf( "CGamePlayer::VerifyAccount Failed! [Account Freeze]n" );
  688. #endif
  689. nQueryResult |= LOGIN_R_FREEZE;
  690. m_bAutoUnlockAccount = false;
  691. break;
  692. case E_ACCOUNT_NODEPOSIT: /* Login Failed ! --- No Money */
  693. #ifdef CONSOLE_DEBUG
  694. cprintf( "CGamePlayer::VerifyAccount Failed! [No Money]n" );
  695. #endif
  696. nQueryResult |= LOGIN_R_TIMEOUT;
  697. m_bAutoUnlockAccount = false;
  698. break;
  699. default: /* Login Failed ! */
  700. #ifdef CONSOLE_DEBUG
  701. cprintf( "CGamePlayer::VerifyAccount Failed!n" );
  702. #endif
  703. nQueryResult |= LOGIN_R_FAILED;
  704. m_bAutoUnlockAccount = false;
  705. break;
  706. }
  707. /*
  708.  * Notify the result to player
  709.  */
  710. _VerifyAccount_ToPlayer( nQueryResult, pReturn->nLeftTime );
  711. SAFE_RELEASE( pRetBuffer );
  712. m_theDataQueue[enumOwnerAccSvr].Detach( s2c_accountlogin );
  713. return nNextTask;
  714. }
  715. return enumRepeat;
  716. }
  717. bool CGamePlayer::_VerifyAccount_ToPlayer( UINT nQueryResult, unsigned long nLeftTime)
  718. {
  719. KLoginAccountInfo lai;
  720. ZeroMemory( &lai, sizeof( KLoginAccountInfo ) );
  721. /*
  722.  * Account
  723.  */
  724. size_t used = sizeof( lai.Account );
  725. used = ( used > m_sAccountName.length() ) ? m_sAccountName.length() : ( used - 1 );
  726. memcpy( lai.Account, m_sAccountName.c_str(), used );
  727. lai.Account[used] = '';
  728. /*
  729.  * Password
  730.  */
  731. used = sizeof( lai.Password.szPassword );
  732. used = ( used > m_sPassword.length() ) ? m_sPassword.length() : ( used - 1 );
  733. memcpy( lai.Password.szPassword, m_sPassword.c_str(), used );
  734. lai.Password.szPassword[used] = '';
  735. lai.nLeftTime = nLeftTime;
  736. /*
  737.  * The other info
  738.  */
  739. lai.Param = nQueryResult;
  740. lai.Size = sizeof( lai );
  741. CBuffer *pBuffer = m_theGlobalAllocator.Allocate();
  742. BYTE *pData = const_cast< BYTE * >( pBuffer->GetBuffer() );
  743. BYTE bProtocol = s2c_login;
  744. size_t sizeProtocol = sizeof( BYTE );
  745. memcpy( pData, &bProtocol, sizeProtocol );
  746. memcpy( pData + sizeProtocol, ( BYTE * )( &lai ), sizeof( lai ) );
  747. m_pPlayerServer->SendData( m_lnIdentityID, pData, ( sizeof( KLoginAccountInfo ) + sizeof( BYTE )/* protocol id */ ) );
  748. pBuffer->Release();
  749. return true;
  750. }
  751. UINT CGamePlayer::QueryRoleList()
  752. {
  753. #ifdef CONSOLE_DEBUG
  754. cprintf( "CGamePlayer::QueryRoleList...n" );
  755. #endif
  756. const size_t lenAN = strlen( m_sAccountName.c_str() );
  757. const size_t lenPL = lenAN + sizeof( TProcessData );
  758. CBuffer *pBuffer = m_theGlobalAllocator.Allocate();
  759. TProcessData *pPlayerList = reinterpret_cast< TProcessData * >( const_cast< BYTE * >( pBuffer->GetBuffer() ) );
  760. ASSERT( pPlayerList );
  761. pPlayerList->nProtoId = c2s_roleserver_getrolelist;
  762. pPlayerList->nDataLen = lenAN + 1;
  763. pPlayerList->ulIdentity = m_lnIdentityID;
  764. pPlayerList->pDataBuffer[0] = s_nRoleListCount;
  765. memcpy( &pPlayerList->pDataBuffer[1], m_sAccountName.c_str(), lenAN );
  766. pPlayerList->pDataBuffer[lenAN + 1] = '';
  767. m_theDataQueue[enumOwnerRoleSvr].Empty();
  768. m_pDBRoleClient->SendPackToServer( ( const void * )pPlayerList, lenPL );
  769. SAFE_RELEASE( pBuffer );
  770. return enumToNextTask;
  771. }
  772. UINT CGamePlayer::ProcessRoleList()
  773. {
  774. #ifdef CONSOLE_DEBUG
  775. cprintf( "CGamePlayer::ProcessRoleList...n" );
  776. #endif
  777. CBuffer *pRetBuffer = m_theDataQueue[enumOwnerRoleSvr].Attach( s2c_roleserver_getrolelist_result );
  778. if ( pRetBuffer )
  779. {
  780. UINT nNextTask = enumError;
  781. const TProcessData *pPD = ( const TProcessData * )pRetBuffer->GetBuffer();
  782. int nRoleCount = CPackager::Peek( ( const char * )pPD->pDataBuffer );
  783. #ifdef CONSOLE_DEBUG
  784. cprintf( "CGamePlayer::ProcessRoleList find %d role in listn", nRoleCount );
  785. #endif
  786. if ( nRoleCount >= 0 )
  787. {
  788. m_theDataQueue[enumOwnerPlayer].Empty();
  789. m_pPlayerServer->SendData( m_lnIdentityID, pRetBuffer->GetBuffer(), pRetBuffer->GetUsed() );
  790. nNextTask = enumSelAddDelRole;
  791. }
  792. SAFE_RELEASE( pRetBuffer );
  793. m_theDataQueue[enumOwnerRoleSvr].Detach( s2c_roleserver_getrolelist_result );
  794. return nNextTask;
  795. }
  796. return enumRepeat;
  797. }
  798. UINT CGamePlayer::SelAddDelRole()
  799. {
  800. CBuffer *pRetBuffer = NULL;
  801. #ifdef CONSOLE_DEBUG
  802. cprintf( "CGamePlayer::SelAddDelRole...n" );
  803. #endif
  804. /*
  805.  * Select a role
  806.  */
  807. pRetBuffer = m_theDataQueue[enumOwnerPlayer].Attach( c2s_dbplayerselect );
  808. if ( pRetBuffer )
  809. {
  810. UINT nNextTask = enumError;
  811. const tagDBSelPlayer *pDSPC = ( const tagDBSelPlayer * )pRetBuffer->GetBuffer();
  812. #ifdef CONSOLE_DEBUG
  813. cprintf( "CGamePlayer::SelAddDelRole Select a role from listn" );
  814. #endif
  815. if ( _QueryRoleInfo_ToDBRole( pDSPC->szRoleName ) )
  816. {
  817. nNextTask = enumLoginSelectRole;
  818. }
  819. SAFE_RELEASE( pRetBuffer );
  820. m_theDataQueue[enumOwnerPlayer].Detach( c2s_dbplayerselect );
  821. return nNextTask;
  822. }
  823. /*
  824.  * Create a role
  825.  */
  826. pRetBuffer = m_theDataQueue[enumOwnerPlayer].Attach( c2s_newplayer );
  827. if ( pRetBuffer )
  828. {
  829. UINT nNextTask = enumError;
  830. const TProcessData *pCRPD = ( const TProcessData * )pRetBuffer->GetBuffer();
  831. const NEW_PLAYER_COMMAND *pNPC = ( const NEW_PLAYER_COMMAND * )( pCRPD->pDataBuffer );
  832. ASSERT( pNPC );
  833. char szRoleName[NAME_LEN];
  834. size_t namelen = pRetBuffer->GetUsed() - sizeof( TProcessData );
  835. namelen = ( namelen < 31 ) ? namelen : 31;
  836. memcpy( szRoleName, pNPC->m_szName, namelen );
  837. szRoleName[namelen] = '';
  838. #ifdef CONSOLE_DEBUG
  839. cprintf( "CGamePlayer::SelAddDelRole Create a role [Name : %s]n", szRoleName );
  840. #endif
  841. m_theDataQueue[enumOwnerRoleSvr].Empty();
  842. if ( _CreateNewPlayer_ToDBRole( ( const char * )szRoleName, 
  843. pNPC->m_btRoleNo, 
  844. pNPC->m_btSeries,
  845. pNPC->m_NativePlaceId ) )
  846. {
  847. nNextTask = enumLoginCreateRole;
  848. }
  849. SAFE_RELEASE( pRetBuffer );
  850. m_theDataQueue[enumOwnerPlayer].Detach( c2s_newplayer );
  851. return nNextTask;
  852. }
  853. /*
  854.  * Delete a role
  855.  */
  856. pRetBuffer = m_theDataQueue[enumOwnerPlayer].Attach( c2s_roleserver_deleteplayer );
  857. if ( pRetBuffer )
  858. {
  859. UINT nNextTask = enumError;
  860. #ifdef CONSOLE_DEBUG
  861. cprintf( "CGamePlayer::SelAddDelRole Del a role in listn" );
  862. #endif
  863. m_theDataQueue[enumOwnerRoleSvr].Empty();
  864. if ( _DeleteRole_ToDBRole( pRetBuffer->GetBuffer(), pRetBuffer->GetUsed() ) )
  865. {
  866.             nNextTask = enumToNextTask;
  867. }
  868. SAFE_RELEASE( pRetBuffer );
  869. m_theDataQueue[enumOwnerPlayer].Detach( c2s_roleserver_deleteplayer );
  870. if ( enumToNextTask != nNextTask )
  871. {
  872. tagNewDelRoleResponse ndrr;
  873. ndrr.cProtocol = s2c_rolenewdelresponse;
  874. ndrr.szRoleName[0] = '';
  875. ndrr.bSucceeded = false;
  876. m_pPlayerServer->SendData( m_lnIdentityID, ( const void * )&ndrr, sizeof( tagNewDelRoleResponse ) );
  877. nNextTask = enumSelAddDelRole;
  878. }
  879. return nNextTask;
  880. }
  881. return enumRepeat;
  882. }
  883. UINT CGamePlayer::DelRole_WaitForVerify()
  884. {
  885. #ifdef CONSOLE_DEBUG
  886. cprintf( "CGamePlayer::DelRole_WaitForVerify...n" );
  887. #endif
  888. CBuffer *pRetBuffer = m_theDataQueue[enumOwnerAccSvr].Attach( s2c_accountlogin );
  889.     
  890.     if (pRetBuffer)
  891.     {
  892. UINT nNextTask = enumError;
  893. KAccountUserReturnExt* pReturn = ( KAccountUserReturnExt * )( pRetBuffer->GetBuffer() + 1/* size of a protocol byte */ );
  894. int nResult = pReturn->nReturn;
  895. if (nResult == ACTION_SUCCESS)
  896.         {
  897.             const char *pRoleName = m_sDelRoleName.c_str();
  898.         
  899.             const size_t lenRN = strlen( pRoleName );
  900.         const size_t lenRI = sizeof( TProcessData ) - 1 + lenRN;
  901.         
  902.         CBuffer *pBuffer = m_theGlobalAllocator.Allocate();
  903.         
  904.         TProcessData *pRoleInfo = reinterpret_cast< TProcessData * >( const_cast< BYTE * >( pBuffer->GetBuffer() ) );
  905.         
  906.         ASSERT( pRoleInfo );
  907.         
  908.         pRoleInfo->nProtoId = c2s_roleserver_deleteplayer;
  909.         pRoleInfo->nDataLen = lenRN;
  910.         pRoleInfo->ulIdentity = m_lnIdentityID;
  911.         
  912.         memcpy( &pRoleInfo->pDataBuffer[0], pRoleName, lenRN );
  913.         pRoleInfo->pDataBuffer[lenRN] = '';
  914.         
  915.         m_pDBRoleClient->SendPackToServer( ( const void * )pRoleInfo, lenRI );
  916.         
  917.         SAFE_RELEASE( pBuffer );
  918.         
  919.             nNextTask = enumLoginDeleteRole;
  920.         }
  921.         else
  922.         {
  923.             tagNewDelRoleResponse ndrr;
  924.             ndrr.cProtocol = s2c_rolenewdelresponse;
  925.             ndrr.szRoleName[0] = '';
  926.             ndrr.bSucceeded = false;
  927.             m_pPlayerServer->SendData( m_lnIdentityID, ( const void * )&ndrr, sizeof( tagNewDelRoleResponse ) );
  928.             nNextTask = enumSelAddDelRole;  // 表示这次的动作完成,进入下一个等待流程
  929.         }
  930. SAFE_RELEASE( pRetBuffer );
  931. m_theDataQueue[enumOwnerAccSvr].Detach( s2c_accountlogin );
  932.         return nNextTask;
  933.     }
  934. return enumRepeat;
  935. }
  936. UINT CGamePlayer::WaitForCreateResult()
  937. {
  938. #ifdef CONSOLE_DEBUG
  939. cprintf( "CGamePlayer::WaitForCreateResult...n" );
  940. #endif
  941. CBuffer *pRetBuffer = m_theDataQueue[enumOwnerRoleSvr].Attach( s2c_roleserver_createrole_result );
  942. if ( pRetBuffer )
  943. {
  944. UINT nNextTask = enumError;
  945. TProcessData *pPD = ( TProcessData * )pRetBuffer->GetBuffer();
  946. ASSERT( pPD );
  947. char cResult = pPD->pDataBuffer[0];
  948. tagNewDelRoleResponse ndrr;
  949. ndrr.cProtocol = s2c_rolenewdelresponse;
  950. ndrr.szRoleName[0] = '';
  951. ndrr.bSucceeded = false;
  952. #ifdef CONSOLE_DEBUG
  953. cprintf( "CGamePlayer::WaitForCreateResult %sn", ( 1 == cResult ) ? "Successful" : "Failed" );
  954. #endif
  955. switch ( cResult )
  956. {
  957. case 1: // Successed
  958. ndrr.bSucceeded = true;
  959. m_pPlayerServer->SendData( m_lnIdentityID, ( const void * )&ndrr, sizeof( tagNewDelRoleResponse ) );
  960. nNextTask = enumToNextTask;
  961. break;
  962. //case -1: // Failed
  963. //case -2: // Have exist
  964. default:
  965. ndrr.bSucceeded = false;
  966. m_pPlayerServer->SendData( m_lnIdentityID, ( const void * )&ndrr, sizeof( tagNewDelRoleResponse ) );
  967. nNextTask = enumSelAddDelRole;
  968. break;
  969. }
  970. SAFE_RELEASE( pRetBuffer );
  971. m_theDataQueue[enumOwnerRoleSvr].Detach( s2c_roleserver_createrole_result );
  972. return nNextTask;
  973. }
  974. return enumRepeat;
  975. }
  976. UINT CGamePlayer::WaitForDeleteResult()
  977. {
  978. #ifdef CONSOLE_DEBUG
  979. cprintf( "CGamePlayer::WaitForDeleteResultn" );
  980. #endif
  981. CBuffer *pRetBuffer = m_theDataQueue[enumOwnerRoleSvr].Attach( s2c_roleserver_deleterole_result );
  982. if ( pRetBuffer )
  983. {
  984. UINT nNextTask = enumError;
  985. TProcessData *pPD = ( TProcessData * )pRetBuffer->GetBuffer();
  986. ASSERT( pPD );
  987. char cResult = pPD->pDataBuffer[0];
  988. tagNewDelRoleResponse ndrr;
  989. ndrr.cProtocol = s2c_rolenewdelresponse;
  990. ndrr.szRoleName[0] = '';
  991. ndrr.bSucceeded = false;
  992. #ifdef CONSOLE_DEBUG
  993. cprintf( "CGamePlayer::WaitForDeleteResult %sn", ( 1 == cResult ) ? "Successful" : "Failed" );
  994. #endif
  995. switch ( cResult )
  996. {
  997. case 1: // Successed
  998. ndrr.bSucceeded = true;
  999. m_pPlayerServer->SendData( m_lnIdentityID, ( const void * )&ndrr, sizeof( tagNewDelRoleResponse ) );
  1000. nNextTask = enumSelAddDelRole;
  1001. break;
  1002. //case -1: // Failed
  1003. //case -2: // Have exist
  1004. default:
  1005. ndrr.bSucceeded = false;
  1006. m_pPlayerServer->SendData( m_lnIdentityID, ( const void * )&ndrr, sizeof( tagNewDelRoleResponse ) );
  1007. nNextTask = enumSelAddDelRole;
  1008. break;
  1009. }
  1010. SAFE_RELEASE( pRetBuffer );
  1011. m_theDataQueue[enumOwnerRoleSvr].Detach( s2c_roleserver_deleterole_result );
  1012. return nNextTask;
  1013. }
  1014. return enumRepeat;
  1015. }
  1016. bool CGamePlayer::_QueryRoleInfo_ToDBRole( const char *pRoleName )
  1017. {
  1018. if ( NULL == pRoleName || '' == pRoleName[0] )
  1019. {
  1020. return false;
  1021. }
  1022. const size_t lenRN = strlen( pRoleName );
  1023. const size_t lenRI = sizeof( TProcessData ) - 1 + lenRN;
  1024. CBuffer *pBuffer = m_theGlobalAllocator.Allocate();
  1025. TProcessData *pRoleInfo = reinterpret_cast< TProcessData * >( const_cast< BYTE * >( pBuffer->GetBuffer() ) );
  1026. ASSERT( pRoleInfo );
  1027. pRoleInfo->nProtoId = c2s_roleserver_getroleinfo;
  1028. pRoleInfo->nDataLen = lenRN;
  1029. pRoleInfo->ulIdentity = m_lnIdentityID;
  1030. memcpy( &pRoleInfo->pDataBuffer[0], pRoleName, lenRN );
  1031. pRoleInfo->pDataBuffer[lenRN] = '';
  1032. m_pDBRoleClient->SendPackToServer( ( const void * )pRoleInfo, lenRI );
  1033. SAFE_RELEASE( pBuffer );
  1034. return true;
  1035. }
  1036. bool CGamePlayer::_CreateNewPlayer_ToDBRole( const char *pRoleName, 
  1037. int nRoleSex /* male or female */, 
  1038. int nRoleClass,
  1039. unsigned short nMapID )
  1040. {
  1041. if ( NULL == pRoleName || '' == pRoleName[0] )
  1042. {
  1043. return false;
  1044. }
  1045. size_t datalength = 0;
  1046. CPlayerCreator::ROLEPARAM RP;
  1047. int nMinLen = strlen( pRoleName );
  1048. nMinLen = nMinLen > sizeof( RP.szName ) ? sizeof( RP.szName ) : nMinLen;
  1049. memcpy( RP.szName, pRoleName, nMinLen );
  1050. RP.szName[nMinLen] = '';
  1051. nMinLen = m_sAccountName.size();
  1052. nMinLen = nMinLen > sizeof( RP.szAccName ) ? sizeof( RP.szAccName ) : nMinLen;
  1053. memcpy( RP.szAccName, m_sAccountName.c_str(), nMinLen );
  1054. RP.szAccName[nMinLen] = '';
  1055. RP.nSex = nRoleSex;
  1056. RP.nSeries = nRoleClass;
  1057. RP.nMapID = nMapID;
  1058. const TRoleData *pRoleData = m_thePlayerCreator.GetRoleData( datalength, &RP );
  1059. if ( pRoleData && datalength )
  1060. {
  1061. CBuffer *pData = m_theGlobalAllocator.Allocate();
  1062. TProcessData *pPD = reinterpret_cast< TProcessData * >( const_cast< BYTE * >( pData->GetBuffer() ) );
  1063. pPD->nProtoId = c2s_roleserver_createroleinfo;
  1064. pPD->ulIdentity = m_lnIdentityID;
  1065. pPD->pDataBuffer[0] = 1; // Create successed
  1066. pPD->nDataLen = datalength + 1 /* sizeof( pPD->pDataBuffer[0] ) */;
  1067. memcpy( &pPD->pDataBuffer[1], pRoleData, datalength );
  1068. /*
  1069.  * Send a role-info to role dbserver
  1070.  */
  1071. size_t nRoleInfoLength = datalength + sizeof( TProcessData );
  1072. m_thePackager.AddData( c2s_roleserver_createroleinfo,
  1073. ( const BYTE * )pPD,
  1074. nRoleInfoLength );
  1075. /*
  1076.  * For create a role
  1077.  */
  1078. m_theDataQueue[enumOwnerRoleSvr].AddData( s2c_roleserver_getroleinfo_result, 
  1079. ( const BYTE * )pPD,
  1080. nRoleInfoLength );
  1081. SAFE_RELEASE( pData );
  1082. CBuffer *pPack = m_thePackager.GetHeadPack( c2s_roleserver_createroleinfo );
  1083. while ( pPack )
  1084. {
  1085. m_pDBRoleClient->SendPackToServer( pPack->GetBuffer(), pPack->GetUsed() );
  1086. SAFE_RELEASE( pPack );
  1087. pPack = m_thePackager.GetNextPack( c2s_roleserver_createroleinfo );
  1088. }
  1089. SAFE_RELEASE( pPack );
  1090. m_thePackager.DelData( c2s_roleserver_createroleinfo );
  1091. return true;
  1092. }
  1093. return false;
  1094. }
  1095. UINT CGamePlayer::_DeleteRole_ToDBRole( const void *pData, size_t dataLength )
  1096. {
  1097. tagDBDelPlayer *pDBDP = ( tagDBDelPlayer * )pData;
  1098. if ( NULL == pData || 0 == dataLength )
  1099. {
  1100. return false;
  1101. }
  1102. const char *pAccountName = pDBDP->szAccountName;
  1103. const char *pPassword = pDBDP->Password.szPassword;
  1104. const char *pRoleName = pDBDP->szRoleName;
  1105. if ( !pAccountName || !pPassword || !pRoleName )
  1106. {
  1107. return false;
  1108. }
  1109.     
  1110. if (m_sAccountName.compare( pAccountName ) != 0)
  1111.     {
  1112.         return false;
  1113.     }
  1114.     m_sSuperPassword = pPassword ? pPassword : "";
  1115.     m_sDelRoleName   = pRoleName ? pRoleName : ""; 
  1116.     m_bUseSuperPassword = true;
  1117.     
  1118. return true;
  1119. }
  1120. UINT CGamePlayer::ProcessRoleInfo()
  1121. {
  1122. #ifdef CONSOLE_DEBUG
  1123. cprintf( "CGamePlayer::ProcessRoleInfo...n" );
  1124. #endif
  1125. CBuffer *pRetBuffer = m_theDataQueue[enumOwnerRoleSvr].Attach( s2c_roleserver_getroleinfo_result );
  1126. if ( pRetBuffer )
  1127. {
  1128. UINT nNextTask = enumError;
  1129. TProcessData *pPA = ( TProcessData * )pRetBuffer->GetBuffer();
  1130. ASSERT( m_lnIdentityID == pPA->ulIdentity );
  1131. char cResult = pPA->pDataBuffer[0];
  1132. #ifdef CONSOLE_DEBUG
  1133. cprintf( "CGamePlayer::ProcessRoleInfo Send info to gameservern" );
  1134. #endif
  1135. m_nAttachServerID = -1;
  1136. if ( 1 == cResult && _SyncRoleInfo_ToGameServer( ( const void * )( &pPA->pDataBuffer[1] ), pPA->nDataLen-1 ) )
  1137. {
  1138. nNextTask = enumToNextTask;
  1139. }
  1140. else
  1141. {
  1142. tagNotifyPlayerLogin npl;
  1143. memset( &npl, 0, sizeof( tagNotifyPlayerLogin ) );
  1144. npl.cProtocol = s2c_notifyplayerlogin;
  1145. m_pPlayerServer->SendData( m_lnIdentityID, ( const void * )&npl, sizeof( tagNotifyPlayerLogin ) );
  1146. }
  1147. SAFE_RELEASE( pRetBuffer );
  1148. m_theDataQueue[enumOwnerRoleSvr].Detach( s2c_roleserver_getroleinfo_result );
  1149. return nNextTask;
  1150. }
  1151. return enumRepeat;
  1152. }
  1153. bool CGamePlayer::_SyncRoleInfo_ToGameServer( const void *pData, size_t dataLength )
  1154. {
  1155. bool ok = false;
  1156. ASSERT( pData );
  1157. const TRoleData *pRoleData = ( const TRoleData * )( pData );
  1158. IGServer *pGServer = NULL;
  1159. if (pRoleData->BaseInfo.cUseRevive)
  1160. pGServer = CGameServer::QueryServer( pRoleData->BaseInfo.irevivalid );
  1161. else
  1162. pGServer = CGameServer::QueryServer( pRoleData->BaseInfo.ientergameid );
  1163. if ( pGServer )
  1164. {
  1165. ASSERT( pRoleData->BaseInfo.szName[0] != '' );
  1166. CGamePlayer::Add( ( const char * )pRoleData->BaseInfo.szName,
  1167. ( IPlayer * )this );
  1168. pGServer->Attach( m_sAccountName.c_str() );
  1169. m_nAttachServerID = pGServer->GetID();
  1170. m_theDataQueue[enumOwnerPlayer].Empty();
  1171. ok = pGServer->DispatchTask( CGameServer::enumSyncRoleInfo, pData, dataLength, max(m_nExtPoint, 0));
  1172. m_nExtPoint = -1; //用完就清掉
  1173. }
  1174. return ok;
  1175. }
  1176. UINT CGamePlayer::WaitForGameSvrPermit()
  1177. {
  1178. #ifdef CONSOLE_DEBUG
  1179. cprintf( "CGamePlayer::WaitForGameSvrPermit...n" );
  1180. #endif
  1181. CBuffer *pRetBuffer = m_theDataQueue[enumOwnerPlayer].Attach( s2c_notifyplayerlogin );
  1182. if ( pRetBuffer && m_pPlayerServer )
  1183. {
  1184. UINT nNextTask = enumError;
  1185. tagNotifyPlayerLogin *pNPL = ( tagNotifyPlayerLogin * )pRetBuffer->GetBuffer();
  1186. #ifdef CONSOLE_DEBUG
  1187. cprintf( "CGamePlayer::WaitForGameSvrPermit Notify player to login gameservern" );
  1188. #endif
  1189. if ( pNPL->bPermit )
  1190. {
  1191. m_bAutoUnlockAccount = false;
  1192. nNextTask = enumToNextTask;
  1193. }
  1194. m_pPlayerServer->SendData( m_lnIdentityID, pRetBuffer->GetBuffer(), pRetBuffer->GetUsed() );
  1195. SAFE_RELEASE( pRetBuffer );
  1196. m_theDataQueue[enumOwnerPlayer].Detach( s2c_notifyplayerlogin );
  1197. return nNextTask;
  1198. }
  1199. return enumRepeat;
  1200. }
  1201. bool CGamePlayer::Attach( const char *pRoleName )
  1202. {
  1203. if ( pRoleName && pRoleName[0] )
  1204. {
  1205. m_sRoleName = pRoleName;
  1206. return true;
  1207. }
  1208. return false;
  1209. }
  1210. bool CGamePlayer::Add( const char *pRoleName, IPlayer *pPlayer )
  1211. {
  1212. if ( NULL == pRoleName || NULL == pPlayer || !pRoleName[0] )
  1213. {
  1214. ASSERT( FALSE );
  1215. return false;
  1216. }
  1217. if ( pPlayer )
  1218. {
  1219. CCriticalSection::Owner locker( CGamePlayer::m_csMapSP );
  1220. std::pair< stdMapSP::iterator, bool > result = 
  1221. m_sthePlayerTable.insert( stdMapSP::value_type( pRoleName, pPlayer ) );
  1222. if ( result.second )
  1223. {
  1224. return pPlayer->Attach( pRoleName );
  1225. }
  1226. }
  1227. return false;
  1228. }
  1229. bool CGamePlayer::Del( const char *pRoleName )
  1230. {
  1231. if ( !pRoleName || !pRoleName[0] )
  1232. {
  1233. return false;
  1234. }
  1235. {
  1236. CCriticalSection::Owner locker( CGamePlayer::m_csMapSP );
  1237. stdMapSP::iterator it;
  1238. if ( m_sthePlayerTable.end() != ( it = m_sthePlayerTable.find( pRoleName ) ) )
  1239. {
  1240. IPlayer *pPlayer = ( IPlayer * )( ( *it ).second );
  1241. ASSERT( pPlayer );
  1242. m_sthePlayerTable.erase( it );
  1243. return true;
  1244. }
  1245. }
  1246. return false;
  1247. }
  1248. IPlayer *CGamePlayer::Get( const char *pRoleName )
  1249. {
  1250. if ( !pRoleName )
  1251. {
  1252. return NULL;
  1253. }
  1254. CCriticalSection::Owner locker( CGamePlayer::m_csMapSP );
  1255. stdMapSP::iterator it;
  1256. if ( m_sthePlayerTable.end() != ( it = m_sthePlayerTable.find( pRoleName ) ) )
  1257. {
  1258. return ( IPlayer * )( ( *it ).second );
  1259. }
  1260. return NULL;
  1261. }