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

模拟服务器

开发平台:

C/C++

  1. #include "Stdafx.h"
  2. #include "GamePlayer.h"
  3. #include "....Sword3PaySysS3AccServerAccountLoginDef.h"
  4. #include "....s3clientloginLoginDef.h"
  5. #include "....RoleDBManagerkroledbheader.h"
  6. #include "S3DBInterface.h"
  7. #include "KProtocolDef.h"
  8. #include "....coreSrcKProtocol.h"
  9. #include "Utils.h"
  10. #include "Macro.h"
  11. #include "Exception.h"
  12. #include "Buffer.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. OnlineGameLib::Win32::CBuffer::Allocator CGamePlayer::m_theGlobalAllocator( 1024 * 64, 20 );
  22. LONG CGamePlayer::m_slnIdentityCounts = 0L;
  23. const int CGamePlayer::s_nRoleListCount = 3;
  24. /*
  25.  * CGamePlayer Global Function
  26.  */
  27. bool CGamePlayer::SetupGlobalAllocator( size_t bufferSize, size_t maxFreeBuffers )
  28. {
  29. return CGamePlayer::m_theGlobalAllocator.ReSet( bufferSize, maxFreeBuffers );
  30. }
  31. /*
  32.  * CGamePlayer::CTask
  33.  */
  34. CGamePlayer::CTask::CTask()
  35. {
  36. ASSERT( FALSE );
  37. }
  38. CGamePlayer::CTask::~CTask()
  39. {
  40. CCriticalSection::Owner lock( m_csTask );
  41. stdVector::iterator theIterator;
  42. for ( theIterator = m_stdCommand.begin(); theIterator != m_stdCommand.end(); theIterator ++ )
  43. {
  44. ICommand *pCmd = reinterpret_cast< ICommand * >( *theIterator );
  45. SAFE_DELETE( pCmd );
  46. }
  47. m_stdCommand.clear();
  48. }
  49. CGamePlayer::CTask::CTask( CGamePlayer *pReceiver, UINT nTaskID )
  50. : m_pReceiver( pReceiver )
  51. , m_indexCmd( 0 )
  52. , m_nTaskProgID( nTaskID )
  53. {
  54. }
  55. size_t CGamePlayer::CTask::AddCmd( Action pFun )
  56. {
  57. CCriticalSection::Owner lock( m_csTask );
  58. /*
  59.  * Convert a status to the other status
  60.  */
  61. /*
  62.  * Generate a command and push it into the task queue
  63.  */
  64. ICommand *pCmd = new CTaskCommand< CGamePlayer >( m_pReceiver, pFun );
  65. m_stdCommand.push_back( pCmd );
  66. size_t id = m_stdCommand.size();
  67. return id;
  68. }
  69. UINT CGamePlayer::CTask::Execute()
  70. {
  71. CCriticalSection::Owner lock( m_csTask );
  72. if ( m_indexCmd < m_stdCommand.size() )
  73. {
  74. ICommand *pCmd = m_stdCommand[ m_indexCmd ];
  75. ASSERT( pCmd );
  76. UINT nResult = pCmd->Execute();
  77. switch ( nResult )
  78. {
  79. case enumCompleted:
  80. Reset();
  81. case enumError:
  82. case enumNone:
  83. return nResult;
  84. break;
  85. case enumRepeat:
  86. return m_nTaskProgID;
  87. break;
  88. case enumToNextTask:
  89. default:
  90. break;
  91. }
  92. m_indexCmd ++;
  93. return m_nTaskProgID;
  94. }
  95. Reset();
  96. return enumCompleted;
  97. }
  98. /*
  99.  * CGamePlayer class
  100.  */
  101. CGamePlayer::CDataQueue::CDataQueue( size_t bufferSize /*= sizeof( DQ )*/, size_t maxFreeBuffers /*= 3*/ )
  102. : m_theDQAllocator( bufferSize, maxFreeBuffers )
  103. {
  104. }
  105. CGamePlayer::CDataQueue::~CDataQueue()
  106. {
  107. Empty();
  108. }
  109. void CGamePlayer::CDataQueue::Empty()
  110. {
  111. CCriticalSection::Owner locker( m_csQueue );
  112. stdDataMap::iterator it;
  113. for ( it = m_theData.begin(); it != m_theData.end(); it ++ )
  114. {
  115. CBuffer *pBuffer = (*it).second;
  116. SAFE_RELEASE( pBuffer );
  117. }
  118. m_theData.erase( m_theData.begin(), m_theData.end() );
  119. }
  120. void CGamePlayer::CDataQueue::Clear( LONG lnID )
  121. {
  122. CCriticalSection::Owner locker( m_csQueue );
  123. stdDataMap::iterator it;
  124. if ( m_theData.end() != ( it = m_theData.find( lnID ) ) )
  125. {
  126. CBuffer *pBuffer = (*it).second;
  127. SAFE_RELEASE( pBuffer );
  128. m_theData.erase( it );
  129. }
  130. }
  131. bool CGamePlayer::CDataQueue::Set( LONG lnID, WPARAM wParam, LPARAM lParam )
  132. {
  133. CCriticalSection::Owner locker( m_csQueue );
  134. CBuffer *pBuffer = m_theDQAllocator.Allocate();
  135. /*
  136.  * Format this buffer
  137.  */
  138. LPDQ lpDQ = reinterpret_cast< LPDQ >( const_cast< BYTE * >( pBuffer->GetBuffer() ) );
  139. lpDQ->wParam = wParam;
  140. lpDQ->lParam = lParam;
  141. m_theData.insert( stdDataMap::value_type( lnID, pBuffer ) );
  142. return true;
  143. }
  144. bool CGamePlayer::CDataQueue::Peek( LONG lnID, LPDQ lpDQ )
  145. {
  146. ASSERT( lpDQ );
  147. CCriticalSection::Owner locker( m_csQueue );
  148. stdDataMap::iterator it;
  149. if ( m_theData.end() != ( it = m_theData.find( lnID ) ) )
  150. {
  151. CBuffer *pBuffer = (*it).second;
  152. const DQ *lpSrcDQ = ( const DQ * )( pBuffer->GetBuffer() );
  153. memcpy( lpDQ, lpSrcDQ, sizeof( DQ ) );
  154. return true;
  155. }
  156. return false;
  157. }
  158. bool CGamePlayer::CDataQueue::Get( LONG lnID, LPDQ lpDQ )
  159. {
  160. ASSERT( lpDQ );
  161. CCriticalSection::Owner locker( m_csQueue );
  162. stdDataMap::iterator it;
  163. if ( m_theData.end() != ( it = m_theData.find( lnID ) ) )
  164. {
  165. CBuffer *pBuffer = (*it).second;
  166. const DQ *lpSrcDQ = ( const DQ * )( pBuffer->GetBuffer() );
  167. memcpy( lpDQ, lpSrcDQ, sizeof( DQ ) );
  168. /*
  169.  * Clear the buffer and delete it from map
  170.  */
  171. SAFE_RELEASE( pBuffer );
  172. m_theData.erase( it );
  173. return true;
  174. }
  175. return false;
  176. }
  177. /*
  178.  * CGamePlayer class
  179.  */
  180. CGamePlayer::CGamePlayer( IClient *pAccSvrClient, 
  181.  IServer *pPlayerServer, 
  182.  IClient *pDBRoleClient, 
  183.  UINT nIdentityID /*  = ( UINT )( -1 ) */ )
  184. : m_lnIdentityID( nIdentityID )
  185. , m_theLoginTask( this, enumLogin )
  186. , m_theLogoutTask( this, enumLogOut )
  187. , m_theExchangeReginTask( this, enumExchangeRegin )
  188. , m_dwAccountID( ( DWORD )-1 )
  189. , m_pAccSvrClient( pAccSvrClient )
  190. , m_pPlayerServer( pPlayerServer )
  191. , m_pDBRoleClient( pDBRoleClient )
  192. {
  193. SetCurrentTask( enumNone );
  194. LONG lnID = ::InterlockedExchangeAdd( &m_slnIdentityCounts, 1 );
  195. m_lnIdentityID = ( ( UINT )( -1 ) == m_lnIdentityID ) ? lnID : m_lnIdentityID;
  196. InitTaskProcessor();
  197. }
  198. CGamePlayer::~CGamePlayer()
  199. {
  200. SAFE_RELEASE( m_pAccSvrClient );
  201. SAFE_RELEASE( m_pPlayerServer );
  202. SAFE_RELEASE( m_pDBRoleClient );
  203. ::InterlockedExchangeAdd( &m_slnIdentityCounts, -1 );
  204. }
  205. bool CGamePlayer::DispatchTask( UINT nTaskID )
  206. {
  207. if ( IsWorking() )
  208. {
  209. /*
  210.  * This player is processing a special tasks
  211.  */
  212. return false;
  213. }
  214. SetCurrentTask( nTaskID );
  215. return true;
  216. }
  217. bool CGamePlayer::IsWorking()
  218. {
  219. return ( GetCurrentTask() != enumNone );
  220. }
  221. int CGamePlayer::Run()
  222. {
  223. LONG lnNextTask = enumNone;
  224. switch ( GetCurrentTask() )
  225. {
  226. case enumLogin:
  227. lnNextTask = m_theLoginTask.Execute();
  228. SetCurrentTask( lnNextTask );
  229. break;
  230. case enumLogOut:
  231. lnNextTask = m_theLogoutTask.Execute();
  232. SetCurrentTask( lnNextTask );
  233. break;
  234. case enumExchangeRegin:
  235. lnNextTask = m_theExchangeReginTask.Execute();
  236. SetCurrentTask( lnNextTask );
  237. break;
  238. case enumCompleted:
  239. lnNextTask = TaskCompleted() ? enumNone : enumCompleted;
  240. SetCurrentTask( lnNextTask );
  241. break;
  242. case enumError:
  243. SetCurrentTask( enumNone );
  244. case enumNone:
  245. default:
  246. break;
  247. }
  248. return true;
  249. }
  250. bool CGamePlayer::AppendData( UINT nOwner, const void *pData, size_t dataLength )
  251. {
  252. if ( nOwner >= enumOwnerTotal )
  253. {
  254. return false;
  255. }
  256. BYTE cProtocol = CPackager::Peek( pData );
  257. if ( cProtocol < s2c_micropackbegin )
  258. {
  259. return LargePackProcess( nOwner, pData, dataLength );
  260. }
  261. else if ( cProtocol > s2c_micropackbegin )
  262. {
  263. return SmallPackProcess( nOwner, pData, dataLength );
  264. }
  265. return true;
  266. }
  267. bool CGamePlayer::SmallPackProcess( UINT nOwner, const void *pData, size_t dataLength )
  268. {
  269. switch ( nOwner )
  270. {
  271. case enumOwnerAccSvr:
  272. return DispatchTaskForAccount( pData, dataLength );
  273. break;
  274. case enumOwnerRoleSvr:
  275. return DispatchTaskForDBRole( pData ,dataLength );
  276. break;
  277. case enumOwnerPlayer:
  278. return DispatchTaskForPlayer( pData, dataLength );
  279. break;
  280. default:
  281. break;
  282. }
  283. return false;
  284. }
  285. bool CGamePlayer::LargePackProcess( UINT nOwner, const void *pData, size_t dataLength )
  286. {
  287. switch ( nOwner )
  288. {
  289. case enumOwnerAccSvr:
  290. ASSERT( FALSE );
  291. break;
  292. case enumOwnerRoleSvr:
  293. {
  294. bool ok = true;
  295. CBuffer *pBuffer = m_thePackReceiver.PackUp( pData, dataLength );
  296. if ( pBuffer )
  297. {
  298. ok = DispatchTaskForDBRole( pBuffer->GetBuffer(), pBuffer->GetUsed() );
  299. SAFE_RELEASE( pBuffer );
  300. }
  301. return ok;
  302. }
  303. break;
  304. case enumOwnerPlayer:
  305. ASSERT( FALSE );
  306. break;
  307. default:
  308. break;
  309. }
  310. return false;
  311. }
  312. bool CGamePlayer::DispatchTaskForAccount( const void *pData, size_t dataLength )
  313. {
  314. if ( NULL == pData || 0 == dataLength )
  315. {
  316. return false;
  317. }
  318. BYTE cProtocol = CPackager::Peek( pData );
  319. m_theDataQueue[enumOwnerAccSvr].Set( cProtocol, ( WPARAM )pData, dataLength );
  320. return true;
  321. }
  322. bool CGamePlayer::DispatchTaskForDBRole( const void *pData, size_t dataLength )
  323. {
  324. if ( NULL == pData || 0 == dataLength )
  325. {
  326. return false;
  327. }
  328. BYTE cProtocol = CPackager::Peek( pData );
  329. m_theDataQueue[enumOwnerRoleSvr].Set( cProtocol, ( WPARAM )pData, dataLength );
  330. return true;
  331. }
  332. bool CGamePlayer::DispatchTaskForPlayer( const void *pData, size_t dataLength )
  333. {
  334. if ( NULL == pData || 0 == dataLength )
  335. {
  336. return false;
  337. }
  338. BYTE cProtocol = CPackager::Peek( pData );
  339. m_theDataQueue[enumOwnerPlayer].Set( cProtocol, ( WPARAM )pData, dataLength );
  340. return true;
  341. }
  342. bool CGamePlayer::Create( const char * const pName, const char * const pPassword )
  343. {
  344. if ( NULL == pName )
  345. {
  346. return false;
  347. }
  348. m_sAccountName = pName;
  349. m_sPassword = pPassword ? pPassword : "";
  350. return true;
  351. }
  352. bool CGamePlayer::Destroy( const char * const /*pPassword*/ )
  353. {
  354. SetCurrentTask( enumNone );
  355. m_sAccountName.empty();
  356. m_sPassword.empty();
  357. m_dwAccountID = ( DWORD )-1;
  358. for ( int i=0; i<enumOwnerTotal; i++ )
  359. {
  360. m_theDataQueue[i].Empty();
  361. }
  362. m_thePackReceiver.Empty();
  363. return true;
  364. }
  365. void CGamePlayer::InitTaskProcessor()
  366. {
  367. m_theLoginTask.AddCmd( &CGamePlayer::QueryAccPwd );
  368. m_theLoginTask.AddCmd( &CGamePlayer::VerifyAccount );
  369. m_theLoginTask.AddCmd( &CGamePlayer::QueryRoleList );
  370. m_theLoginTask.AddCmd( &CGamePlayer::ProcessRoleList );
  371. m_theLoginTask.AddCmd( &CGamePlayer::SelectRole );
  372. m_theLoginTask.AddCmd( &CGamePlayer::ProcessRoleInfo );
  373. }
  374. bool CGamePlayer::TaskCompleted()
  375. {
  376. Trace( ToString( m_lnIdentityID ), "CGamePlayer::TaskCompleted" );
  377. /*
  378.  * Clear some data
  379.  */
  380. return true;
  381. }
  382. UINT CGamePlayer::QueryAccPwd()
  383. {
  384. if ( !m_pAccSvrClient )
  385. {
  386. return enumError;
  387. }
  388. CBuffer *pBuffer = m_theGlobalAllocator.Allocate();
  389. BYTE *pData = const_cast< BYTE * >( pBuffer->GetBuffer() );
  390. const size_t datalength = sizeof( KAccountUserLoginInfo ) + 1;
  391. KAccountUserLoginInfo userlogin;
  392. userlogin.Size = sizeof( KAccountUserLoginInfo );
  393. userlogin.Type = AccountUserLoginInfo;
  394. userlogin.Version = ACCOUNT_CURRENT_VERSION;
  395. userlogin.Operate = m_lnIdentityID;
  396. strcpy( userlogin.Account, m_sAccountName.c_str() );
  397. strcpy( userlogin.Password, m_sPassword.c_str() );
  398. *pData = c2s_accountlogin;
  399. memcpy( pData + 1, &userlogin, sizeof( KAccountUserLoginInfo ) );
  400. pBuffer->Use( datalength );
  401. m_pAccSvrClient->SendPackToServer( ( const void * )pData, datalength );
  402. SAFE_RELEASE( pBuffer );
  403. return enumToNextTask;
  404. }
  405. UINT CGamePlayer::VerifyAccount()
  406. {
  407. CDataQueue::DQ dq;
  408. if ( m_theDataQueue[enumOwnerAccSvr].Get( s2c_accountlogin, &dq ) )
  409. {
  410. const void *pData = ( const void * )( dq.wParam );
  411. KAccountUserLoginReturn* pReturn = ( KAccountUserLoginReturn * )( ( ( char * )pData ) + 1/* size of a protocol byte */ );
  412. int nResult = pReturn->nReturn;
  413. UINT nQueryResult = LOGIN_A_LOGIN;
  414. UINT nNextTask = enumError;
  415. switch ( nResult )
  416. {
  417. case ACTION_SUCCESS: /* Login Success ! */
  418. m_dwAccountID = pReturn->AccountID;
  419. nQueryResult |= LOGIN_R_SUCCESS;
  420. nNextTask = enumToNextTask;
  421. break;
  422. case E_ACCOUNT_OR_PASSWORD: /* Login Failed ! --- Name, Password */
  423. nQueryResult |= LOGIN_R_ACCOUNT_OR_PASSWORD_ERROR;
  424. break;
  425. case E_ACCOUNT_EXIST: /* Login Failed ! --- Already login */
  426. nQueryResult |= LOGIN_R_ACCOUNT_EXIST;
  427. break;
  428. case E_ACCOUNT_NODEPOSIT: /* Login Failed ! --- No Money */
  429. nQueryResult |= LOGIN_R_TIMEOUT;
  430. break;
  431. default: /* Login Failed ! */
  432. nQueryResult |= LOGIN_R_FAILED;
  433. break;
  434. }
  435. /*
  436.  * Notify the result to player
  437.  */
  438. _VerifyAccount_ToPlayer( nQueryResult );
  439. return nNextTask;
  440. }
  441. return enumRepeat;
  442. }
  443. bool CGamePlayer::_VerifyAccount_ToPlayer( UINT nQueryResult )
  444. {
  445. KLoginAccountInfo lai;
  446. ZeroMemory( &lai, sizeof( KLoginAccountInfo ) );
  447. /*
  448.  * Account
  449.  */
  450. size_t used = sizeof( lai.Account );
  451. used = ( used > m_sAccountName.length() ) ? m_sAccountName.length() : used;
  452. memcpy( lai.Account, m_sAccountName.c_str(), used );
  453. /*
  454.  * Password
  455.  */
  456. used = sizeof( lai.Password );
  457. used = ( used > m_sPassword.length() ) ? m_sPassword.length() : used;
  458. memcpy( lai.Password, m_sPassword.c_str(), used );
  459. /*
  460.  * The other info
  461.  */
  462. lai.Param = nQueryResult;
  463. lai.Size = sizeof( lai );
  464. CBuffer *pBuffer = m_theGlobalAllocator.Allocate();
  465. BYTE *pData = const_cast< BYTE * >( pBuffer->GetBuffer() );
  466. BYTE bProtocol = s2c_login;
  467. size_t sizeProtocol = sizeof( BYTE );
  468. memcpy( pData, &bProtocol, sizeProtocol );
  469. memcpy( pData + sizeProtocol, ( BYTE * )( &lai ), sizeof( lai ) );
  470. pBuffer->Use( lai.Size + sizeof( BYTE )/* protocol id */ );
  471. m_pPlayerServer->SendData( m_lnIdentityID, pBuffer->GetBuffer(), pBuffer->GetUsed() );
  472. pBuffer->Release();
  473. return true;
  474. }
  475. UINT CGamePlayer::QueryRoleList()
  476. {
  477. const size_t lenAN = strlen( m_sAccountName.c_str() );
  478. const size_t lenPL = lenAN + sizeof( TStreamData );
  479. CBuffer *pBuffer = m_theGlobalAllocator.Allocate();
  480. TStreamData *pPlayerList = reinterpret_cast< TStreamData * >( const_cast< BYTE * >( pBuffer->GetBuffer() ) );
  481. ASSERT( pPlayerList );
  482. pPlayerList->nProtoId = c2s_roleserver_getrolelist;
  483. pPlayerList->nDataLen = lenAN + 1;
  484. pPlayerList->ulIdentity = m_lnIdentityID;
  485. pPlayerList->pDataBuffer[0] = s_nRoleListCount;
  486. memcpy( &pPlayerList->pDataBuffer[1], m_sAccountName.c_str(), lenAN );
  487. pBuffer->Use( lenPL );
  488. m_pDBRoleClient->SendPackToServer( ( const void * )pPlayerList, lenPL );
  489. SAFE_RELEASE( pBuffer );
  490. return enumToNextTask;
  491. }
  492. UINT CGamePlayer::ProcessRoleList()
  493. {
  494. CDataQueue::DQ dq;
  495. if ( m_theDataQueue[enumOwnerRoleSvr].Get( s2c_roleserver_getrolelist_result, &dq ) )
  496. {
  497. UINT nNextTask = enumError;
  498. const void *pData = ( const void * )( dq.wParam );
  499. const TProcessData *pPD = ( const TProcessData * )pData;
  500. int nRoleCount = *( char * )( pPD->pDataBuffer );
  501. // const S3DBI_RoleBaseInfo *pRoleList = ( const S3DBI_RoleBaseInfo * )( ( const char * )( pPA->pDataBuffer ) + 1/* sizeof( char ) */ );
  502. // const size_t datalength = sizeof( S3DBI_RoleBaseInfo ) * nRoleCount;
  503. if ( nRoleCount > 0 )
  504. {
  505. m_pPlayerServer->SendData( m_lnIdentityID, pData, dq.lParam );
  506. nNextTask = enumToNextTask;
  507. }
  508. return nNextTask;
  509. }
  510. return enumRepeat;
  511. }
  512. UINT CGamePlayer::SelectRole()
  513. {
  514. CDataQueue::DQ dq;
  515. if ( m_theDataQueue[enumOwnerPlayer].Get( c2s_dbplayerselect, &dq ) )
  516. {
  517. UINT nNextTask = enumError;
  518. const void *pData = ( const void * )( dq.wParam );
  519. const tagDBSelPlayer *pDSPC = ( const tagDBSelPlayer * )pData;
  520. _QueryRoleInfo_ToDBRole( pDSPC->szRoleName );
  521. nNextTask = enumToNextTask;
  522. return nNextTask;
  523. }
  524. return enumRepeat;
  525. }
  526. bool CGamePlayer::_QueryRoleInfo_ToDBRole( const char *pRoleName )
  527. {
  528. if ( NULL == pRoleName || '' == pRoleName[0] )
  529. {
  530. return false;
  531. }
  532. const size_t lenRN = strlen( pRoleName );
  533. const size_t lenRI = sizeof( TStreamData ) - 1 + lenRN;
  534. CBuffer *pBuffer = m_theGlobalAllocator.Allocate();
  535. TStreamData *pRoleInfo = reinterpret_cast< TStreamData * >( const_cast< BYTE * >( pBuffer->GetBuffer() ) );
  536. ASSERT( pRoleInfo );
  537. pRoleInfo->nProtoId = c2s_roleserver_getroleinfo;
  538. pRoleInfo->nDataLen = lenRN;
  539. pRoleInfo->ulIdentity = m_lnIdentityID;
  540. memcpy( &pRoleInfo->pDataBuffer[0], pRoleName, lenRN );
  541. pBuffer->Use( lenRI );
  542. m_pDBRoleClient->SendPackToServer( ( const void * )pRoleInfo, lenRI );
  543. SAFE_RELEASE( pBuffer );
  544. return true;
  545. }
  546. UINT CGamePlayer::ProcessRoleInfo()
  547. {
  548. CDataQueue::DQ dq;
  549. if ( m_theDataQueue[enumOwnerRoleSvr].Get( s2c_roleserver_getroleinfo_result, &dq ) )
  550. {
  551. UINT nNextTask = enumError;
  552. const void *pData = ( const void * )( dq.wParam );
  553. TProcessData *pPA = ( TProcessData * )( pData );
  554. ASSERT( m_lnIdentityID == pPA->ulIdentity );
  555. const TRoleData *pRoleData = ( const TRoleData * )( ( const char * )( pPA->pDataBuffer ) );
  556. ::MessageBox( NULL, pRoleData->BaseInfo.szName, "Info", MB_OK );
  557. if ( _SyncRoleInfo_ToGameServer( ( const void * )pRoleData, pPA->nDataLen ) )
  558. {
  559. nNextTask = enumToNextTask;
  560. }
  561. return nNextTask;
  562. }
  563. return enumRepeat;
  564. }
  565. bool CGamePlayer::_SyncRoleInfo_ToGameServer( const void *pData, size_t dataLength )
  566. {
  567. return true;
  568. }