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

模拟服务器

开发平台:

C/C++

  1. #include "stdafx.h"
  2. #include "ClientNode.h"
  3. #include <process.h>
  4. #include <iostream>
  5. #include "IDBRoleServer.h"
  6. #include "Macro.h"
  7. #include "../../../../Headers/KGmProtocol.h"
  8. #include "RoleNameFilter.h"
  9. using OnlineGameLib::Win32::CCriticalSection;
  10. using OnlineGameLib::Win32::CPackager;
  11. using OnlineGameLib::Win32::CEvent;
  12. using OnlineGameLib::Win32::CBuffer;
  13. HANDLE CClientNode::m_hThread = NULL;
  14. CEvent CClientNode::m_hQuitEvent( NULL, true, false );
  15. extern UINT g_nDBEngineLoop;
  16. CCriticalSection CClientNode::m_csCL;
  17. CClientNode::stdMap CClientNode::m_theClientMap;
  18. CClientNode::CDataQueue::CDataQueue( size_t bufferSize /*= 1024 * 64*/, size_t maxFreeBuffers /*= 160*/ )
  19. : m_theDQAllocator( bufferSize, maxFreeBuffers )
  20. {
  21. }
  22. CClientNode::CDataQueue::~CDataQueue()
  23. {
  24. }
  25. bool CClientNode::CDataQueue::AddData( const BYTE *pData, size_t datalength )
  26. {
  27. CBuffer *pBuffer = m_theDQAllocator.Allocate();
  28. pBuffer->AddData( pData, datalength );
  29. {
  30. CCriticalSection::Owner lock( m_csQueue );
  31. m_theData.push_back( pBuffer );
  32. }
  33. return true;
  34. }
  35. CBuffer *CClientNode::CDataQueue::Get()
  36. {
  37. {
  38. CCriticalSection::Owner lock( m_csQueue );
  39. if ( !m_theData.empty() )
  40. {
  41. CBuffer *pBuffer = m_theData.front();
  42. pBuffer->AddRef();
  43. m_theData.pop_front();
  44. pBuffer->Release();
  45. return pBuffer;
  46. }
  47. }
  48. return NULL;
  49. }
  50. CClientNode::CClientNode( IServer *pServer, size_t id )
  51. : m_nIndentity( id ) 
  52. , m_theAllocator( 1024 * 64, 3 )
  53. , m_pServer( pServer )
  54. {
  55. ZeroMemory( m_theProcessArray, sizeof( m_theProcessArray ) );
  56. m_theProcessArray[c2s_roleserver_getrolelist] = _QueryRoleList;
  57. m_theProcessArray[c2s_roleserver_createroleinfo] = _CreateRole;
  58. m_theProcessArray[c2s_roleserver_saveroleinfo] = _SaveRoleInfo;
  59. m_theProcessArray[c2s_roleserver_deleteplayer] = _DelRole;
  60. m_theProcessArray[c2s_roleserver_getroleinfo] = _GetRoleInfo;
  61. // m_theProcessArray[c2s_extend] = _RelayExtend;
  62. m_theProcessArray[c2s_gamestatistic] = _GetGameStat;
  63. m_theProcessArray[c2s_roleserver_lock] = _LockOrUnlockRole;
  64. }
  65. CClientNode::~CClientNode()
  66. {
  67. UnlockAllRole(m_nIndentity);
  68. SAFE_RELEASE( m_pServer );
  69. }
  70. CClientNode *CClientNode::AddNode( IServer *pServer, size_t id )
  71. {
  72. CCriticalSection::Owner lock( CClientNode::m_csCL );
  73. IServer *pCloneServer = NULL;
  74. pServer->QueryInterface( IID_IIOCPServer, ( void ** )&pCloneServer );
  75. CClientNode *pNode = new CClientNode( pCloneServer, id );
  76. CClientNode::m_theClientMap.insert( stdMap::value_type( id, pNode ) );
  77. return pNode;
  78. }
  79. void CClientNode::DelNode( size_t id )
  80. {
  81. stdMap::iterator it;
  82. if ( CClientNode::m_theClientMap.end() != ( it = CClientNode::m_theClientMap.find( id ) ) )
  83. {
  84. CCriticalSection::Owner lock( CClientNode::m_csCL );
  85. CClientNode *pNode = ( *it ).second;
  86. CClientNode::m_theClientMap.erase( id );
  87. SAFE_DELETE( pNode );
  88. }
  89. }
  90. bool CClientNode::Start( IServer *pServer )
  91. {
  92. if ( CClientNode::m_hThread == NULL )
  93. {
  94. unsigned int threadID = 0;
  95. CClientNode::m_hQuitEvent.Reset();
  96. CClientNode::m_hThread = (HANDLE)::_beginthreadex(0,
  97. 0,
  98. ThreadFunction,
  99. ( void * )pServer,
  100. 0,
  101. &threadID );
  102. if ( CClientNode::m_hThread == NULL )
  103. {
  104. return false;
  105. }
  106. }
  107. return true;
  108. }
  109. void CClientNode::End()
  110. {
  111. CClientNode::m_hQuitEvent.Set();
  112. if ( CClientNode::m_hThread != NULL )
  113. {
  114. DWORD result = ::WaitForSingleObject( CClientNode::m_hThread, 50000 );
  115. if ( result == WAIT_TIMEOUT )
  116. {
  117. ::TerminateThread( CClientNode::m_hThread, ( DWORD )( -2 ) );
  118. }
  119. if ( CClientNode::m_hThread != NULL )
  120. {
  121. ::CloseHandle( CClientNode::m_hThread );
  122. CClientNode::m_hThread = NULL;
  123. }
  124. }
  125. /*
  126.  * Save all
  127.  */
  128. }
  129. unsigned int __stdcall CClientNode::ThreadFunction( void *pV )
  130. {
  131. IServer *pServer = reinterpret_cast< IServer * >( pV );
  132. ASSERT( pServer );
  133. try
  134. {
  135. while ( !CClientNode::m_hQuitEvent.Wait( 0 ) )
  136. {
  137. {
  138. CCriticalSection::Owner lock( CClientNode::m_csCL );
  139. CClientNode::stdMap::iterator it;
  140. for ( it = CClientNode::m_theClientMap.begin();
  141. it != CClientNode::m_theClientMap.end();
  142. it ++ )
  143. {
  144. CClientNode *pNode = ( CClientNode * )( ( *it ).second );
  145. ASSERT( pNode );
  146. pNode->Process();
  147. }
  148. }
  149. if ( ++ g_nDBEngineLoop & 0x80000000 )
  150. {
  151. g_nDBEngineLoop = 0;
  152. }
  153. if ( g_nDBEngineLoop & 0x1 )
  154. {
  155. ::Sleep( 1 );
  156. }
  157. }
  158. }
  159. catch(...)
  160. {
  161. ::MessageBox( NULL, "CClientNode::ThreadFunction was error!", "Warning", MB_OK );
  162. }
  163. return 0L;
  164. }
  165. void CClientNode::AppendData( const void *pData, size_t datalength )
  166. {
  167. if ( pData && datalength )
  168. {
  169. BYTE cProtocol = CPackager::Peek( pData );
  170. if ( cProtocol < s2c_micropackbegin )
  171. {
  172. LargePackProcess( pData, datalength );
  173. }
  174. else if ( cProtocol > s2c_micropackbegin )
  175. {
  176. SmallPackProcess( pData, datalength );
  177. }
  178. else
  179. {
  180. ASSERT( FALSE && "Error!" );
  181. }
  182. }
  183. }
  184. void CClientNode::SmallPackProcess( const void *pData, size_t dataLength )
  185. {
  186. BYTE cProtocol = CPackager::Peek( pData );
  187. ASSERT( cProtocol >= 0 && cProtocol < s2c_end );
  188. m_theDataQueue.AddData( ( const BYTE * )pData, dataLength );
  189. }
  190. void CClientNode::LargePackProcess( const void *pData, size_t dataLength )
  191. {
  192. ASSERT( pData && dataLength );
  193. CBuffer *pBuffer = m_theRecv.PackUp( pData, dataLength );
  194. if ( pBuffer )
  195. {
  196. m_theDataQueue.AddData( pBuffer->GetBuffer(), pBuffer->GetUsed() );
  197. SAFE_RELEASE( pBuffer );
  198. }
  199. }
  200. void CClientNode::Process()
  201. {
  202. CBuffer *pBuffer = m_theDataQueue.Get();
  203. if ( pBuffer )
  204. {
  205. const BYTE *pData = pBuffer->GetBuffer();
  206. const size_t dataLength = pBuffer->GetUsed();
  207. BYTE cProtocol = CPackager::Peek( pData );
  208. if ( cProtocol < c2s_end && m_theProcessArray[cProtocol] )
  209. {
  210. ( this->*m_theProcessArray[cProtocol] )( ( const void * )pData, dataLength );
  211. }
  212. }
  213. SAFE_RELEASE( pBuffer );
  214. }
  215. void CClientNode::_QueryRoleList( const void *pData, size_t dataLength )
  216. {
  217. char szAccountName[_NAME_LENGTH];
  218. ASSERT( m_pServer && pData && dataLength );
  219. #ifdef CONSOLE_DEBUG
  220. cout << "_QueryRoleList::Begin" << endl;
  221. #endif
  222. TProcessData *pPlayerList = ( TProcessData * )pData;
  223. int nRoleListCount = pPlayerList->pDataBuffer[0];
  224. int nLen = pPlayerList->nDataLen;
  225. unsigned long ulIdentity = pPlayerList->ulIdentity;
  226. if ( nLen <= 1 || nLen >= _NAME_LENGTH )
  227. {
  228. #ifdef CONSOLE_DEBUG
  229. cout << "_QueryRoleList::Name is invalid" << endl;
  230. #endif
  231. return;
  232. }
  233. memcpy( szAccountName, ( const char * )( &pPlayerList->pDataBuffer[1] ), nLen - 1 );
  234. szAccountName[nLen - 1] = '';
  235. /*
  236.  * Database
  237.  */
  238. S3DBI_RoleBaseInfo DBI[4];
  239. const size_t s_nStructSize = sizeof( S3DBI_RoleBaseInfo );
  240. #ifdef CONSOLE_DEBUG
  241. cout << "_QueryRoleList::GetRoleListOfAccount " << szAccountName << endl;
  242. #endif
  243. int nCount = GetRoleListOfAccount( szAccountName, &DBI[0], nRoleListCount );
  244. CBuffer *pBuffer = m_theAllocator.Allocate();
  245. TProcessData *pListData = reinterpret_cast< TProcessData * >( const_cast< BYTE * >( pBuffer->GetBuffer() ) );
  246. pListData->nProtoId = s2c_roleserver_getrolelist_result;
  247. pListData->ulIdentity = ulIdentity;
  248. int nDataLen = nCount * s_nStructSize + 1;
  249. pListData->nDataLen = nDataLen;
  250. pListData->pDataBuffer[0] = nCount;
  251. memcpy( &pListData->pDataBuffer[1], &DBI[0], nDataLen );
  252. int nUsedLen = sizeof( TProcessData ) - 1 + nDataLen;
  253. pBuffer->Use( nUsedLen );
  254. m_pServer->SendData( m_nIndentity, ( const void * )pListData, nUsedLen );
  255. SAFE_RELEASE( pBuffer );
  256. #ifdef CONSOLE_DEBUG
  257. cout << "_QueryRoleList::end" << endl;
  258. #endif
  259. }
  260. void CClientNode::_CreateRole( const void *pData, size_t dataLength )
  261. {
  262. ASSERT( m_pServer && pData && dataLength );
  263. #ifdef CONSOLE_DEBUG
  264. cout << "_CreateRole::Begin" << endl;
  265. #endif
  266. TProcessData *pPD = ( TProcessData * )pData;
  267. int nResult = 0;
  268. {{
  269. extern CRoleNameFilter g_fltRoleName;
  270. TRoleData* pRoleData = (TRoleData*)(pPD->pDataBuffer + 1);
  271. if (pRoleData->BaseInfo.szName[0])
  272. {
  273. for (size_t pos = sizeof(pRoleData->BaseInfo.szName) - 1; pos >= 1; pos--)
  274. {
  275. if (!pRoleData->BaseInfo.szName[pos])
  276. break;
  277. }
  278. if (pos >= 1)
  279. {
  280. if (g_fltRoleName.IsTextPass(pRoleData->BaseInfo.szName))
  281. nResult = SaveRoleInfo( &pPD->pDataBuffer[1], NULL, TRUE );
  282. else
  283. nResult = -1;
  284. }
  285. }
  286. }}
  287. TProcessData Info;
  288. Info.nProtoId = s2c_roleserver_createrole_result;
  289. Info.ulIdentity = pPD->ulIdentity;
  290. Info.nDataLen = 1;
  291. Info.pDataBuffer[0] = ( nResult == 1 ) ? 1 : -1;
  292. m_pServer->SendData( m_nIndentity, ( const void * )&Info, sizeof( Info ) );
  293. #ifdef CONSOLE_DEBUG
  294. cout << "_CreateRole::End" << endl;
  295. #endif
  296. }
  297. void CClientNode::_SaveRoleInfo( const void *pData, size_t dataLength )
  298. {
  299. ASSERT( m_pServer && pData && dataLength );
  300. #ifdef CONSOLE_DEBUG
  301. cout << "_SaveRoleInfo::Begin" << endl;
  302. #endif
  303. TProcessData *pPD = ( TProcessData * )pData;
  304. int nResult = 0;
  305. TRoleData* pRole = (TRoleData*)(&pPD->pDataBuffer[0]);
  306. char szName[32];
  307. int len = strlen( pRole->BaseInfo.szName );
  308. ASSERT( len > 0 );
  309. len = len > 31 ? 31 : len;
  310. memcpy( szName, pRole->BaseInfo.szName, len );
  311. szName[len] = '';
  312. if (IsRoleLockBySelf(szName))
  313. {
  314. nResult = SaveRoleInfo( &pPD->pDataBuffer[0], NULL, FALSE );
  315. if (pPD->bLeave)
  316. {
  317. UnlockRoleSelf(szName);
  318. }
  319. }
  320. else
  321. nResult = 0;
  322. if ( pPD->ulIdentity >= 0 )
  323. {
  324. TProcessData Info;
  325. Info.nProtoId = s2c_roleserver_saverole_result;
  326. Info.ulIdentity = pPD->ulIdentity;
  327. Info.nDataLen = 1;
  328. Info.pDataBuffer[0] = ( nResult == 1 ) ? 1 : -1;
  329. m_pServer->SendData( m_nIndentity, ( const void * )&Info, sizeof( Info ) );
  330. }
  331. #ifdef CONSOLE_DEBUG
  332. cout << "_SaveRoleInfo::End" << endl;
  333. #endif
  334. }
  335. void CClientNode::_DelRole( const void *pData, size_t dataLength )
  336. {
  337. ASSERT( m_pServer && pData && dataLength );
  338. #ifdef CONSOLE_DEBUG
  339. cout << "_DelRole::Begin" << endl;
  340. #endif
  341. TProcessData *pRoleInfo = ( TProcessData * )pData;
  342. char szRoleName[_NAME_LENGTH];
  343. int nDataLen = pRoleInfo->nDataLen;
  344. nDataLen = ( nDataLen > _NAME_LENGTH ) ? _NAME_LENGTH : nDataLen;
  345. int result = -1;
  346. if ( nDataLen > 0 )
  347. {
  348. memcpy( szRoleName, &pRoleInfo->pDataBuffer[0], nDataLen );
  349. szRoleName[nDataLen] = '';
  350. #ifdef CONSOLE_DEBUG
  351. cout << "_DelRole::DeleteRole " << szRoleName << endl;
  352. #endif
  353. if ( DeleteRole( szRoleName ) )
  354. {
  355. result = 1;
  356. }
  357. else
  358. {
  359. result = -1;
  360. }
  361. }
  362. if ( pRoleInfo->ulIdentity >= 0 )
  363. {
  364. TProcessData Info;
  365. Info.nProtoId = s2c_roleserver_deleterole_result;
  366. Info.ulIdentity = pRoleInfo->ulIdentity;
  367. Info.nDataLen = 1;
  368. Info.pDataBuffer[0] = result;
  369. m_pServer->SendData( m_nIndentity, ( const void * )&Info, sizeof( Info ) );
  370. }
  371. #ifdef CONSOLE_DEBUG
  372. cout << "_DelRole::End" << endl;
  373. #endif
  374. }
  375. //for Relay System and GM [wxb 2003-7-22]
  376. void CClientNode::_RelayExtend( const void *pData, size_t dataLength )
  377. {
  378. ASSERT(c2s_extend == *((unsigned char *)pData));
  379. char* pNewData = ((char *)pData) + 1;
  380. switch (*((WORD*)pNewData))
  381. {
  382. case MAKEWORD(pf_gamemaster, gm_c2s_getrole):
  383. {
  384. ASSERT(dataLength == 1 + sizeof(GM_GET_ROLE_DATA_COMMAND));
  385. GM_GET_ROLE_DATA_COMMAND* pGMData = (GM_GET_ROLE_DATA_COMMAND*)pNewData;
  386. int nResultBuflen = 0;
  387. switch(pGMData->wGetID)
  388. {
  389. case gm_role_entergame_position:
  390. {
  391. ASSERT(0 == pGMData->wLength);
  392. char* pReturnBuffer = (char*)_alloca(1 + sizeof(GM_GET_ROLE_DATA_SYNC) + sizeof(GM_ROLE_DATA_SUB_ENTER_POS));
  393. *pReturnBuffer = (char)s2c_extend;
  394. GM_GET_ROLE_DATA_SYNC* pGMReturn = (GM_GET_ROLE_DATA_SYNC*)(pReturnBuffer + 1);
  395. strncpy(pGMReturn->AccountName, pGMData->AccountName, sizeof(pGMData->AccountName));
  396. pGMReturn->ProtocolFamily = pf_gamemaster;
  397. pGMReturn->ProtocolType = gm_s2c_getrole;
  398. pGMReturn->wGetID = gm_role_entergame_position;
  399. pGMReturn->wLength = sizeof(GM_ROLE_DATA_SUB_ENTER_POS);
  400. GetRoleInfoForGM(pGMData->wGetID, (char*)(pGMReturn + 1), pGMData->AccountName, nResultBuflen);
  401. ASSERT(pGMReturn->wLength == nResultBuflen);
  402. m_pServer->SendData( m_nIndentity, pReturnBuffer, 1 + sizeof(GM_GET_ROLE_DATA_SYNC) + sizeof(GM_ROLE_DATA_SUB_ENTER_POS) );
  403. }
  404. break;
  405. default:
  406. ASSERT(0);
  407. break;
  408. }
  409. }
  410. break;
  411. case MAKEWORD(pf_gamemaster, gm_c2s_setrole):
  412. {
  413. ASSERT(dataLength >= 1 + sizeof(GM_SET_ROLE_DATA_COMMAND));
  414. GM_SET_ROLE_DATA_COMMAND* pGMData = (GM_SET_ROLE_DATA_COMMAND*)pNewData;
  415. SetRoleInfoForGM(pGMData->wSetID, (char*)(pGMData + 1), pGMData->AccountName, pGMData->wLength);
  416. }
  417. break;
  418. default:
  419. ASSERT(0);
  420. break;
  421. }
  422. }
  423. void CClientNode::_GetRoleInfo( const void *pData, size_t dataLength )
  424. {
  425. ASSERT( m_pServer && pData && dataLength );
  426. #ifdef CONSOLE_DEBUG
  427. cout << "_GetRoleInfo::Begin" << endl;
  428. #endif
  429. TProcessData *pRoleInfo = ( TProcessData * )pData;
  430. char szRoleName[_NAME_LENGTH];
  431. int nDataLen = pRoleInfo->nDataLen;
  432. nDataLen = ( nDataLen > _NAME_LENGTH ) ? _NAME_LENGTH : nDataLen;
  433. CBuffer *pBuffer = m_theAllocator.Allocate();
  434. TProcessData *pRoleData = reinterpret_cast< TProcessData * >( const_cast< BYTE * >( pBuffer->GetBuffer() ) );
  435. int nUsedLength = sizeof( TProcessData );
  436. size_t nIdentity = pRoleInfo->ulIdentity;
  437. pRoleData->nProtoId = s2c_roleserver_getroleinfo_result;
  438. pRoleData->pDataBuffer[0] = -1;
  439. pRoleData->nDataLen = 1;
  440. pRoleData->ulIdentity = nIdentity;
  441. if ( nDataLen > 0 )
  442. {
  443. memcpy( szRoleName, &pRoleInfo->pDataBuffer[0], nDataLen );
  444. szRoleName[nDataLen] = '';
  445. int result = -1;
  446. #ifdef CONSOLE_DEBUG
  447. cout << "_GetRoleInfo::GetRoleInfo " << szRoleName << endl;
  448. #endif
  449. int nRoleInfoLen = 0;
  450. if (!IsRoleLock(szRoleName))
  451. GetRoleInfo( &pRoleData->pDataBuffer[1], szRoleName, nRoleInfoLen );
  452. if ( nRoleInfoLen > 0 )
  453. {
  454. pRoleData->pDataBuffer[0] = 1;
  455. pRoleData->nDataLen = nRoleInfoLen + 1;
  456. nUsedLength = sizeof( TProcessData ) + nRoleInfoLen;
  457. }
  458. }
  459. pBuffer->Use( nUsedLength );
  460. m_theSend.AddData( s2c_roleserver_getroleinfo_result, pBuffer->GetBuffer(), nUsedLength, nIdentity );
  461. CBuffer *pPack = m_theSend.GetHeadPack( s2c_roleserver_getroleinfo_result );
  462. while ( pPack )
  463. {
  464. m_pServer->SendData( m_nIndentity, ( const void * )pPack->GetBuffer(), pPack->GetUsed() );
  465. SAFE_RELEASE( pPack );
  466. pPack = m_theSend.GetNextPack( s2c_roleserver_getroleinfo_result );
  467. }
  468. m_theSend.DelData( s2c_roleserver_getroleinfo_result );
  469. SAFE_RELEASE( pPack );
  470. SAFE_RELEASE( pBuffer );
  471. #ifdef CONSOLE_DEBUG
  472. cout << "_GetRoleInfo::End" << endl;
  473. #endif
  474. }
  475. void CClientNode::_GetGameStat( const void *pData, size_t dataLength )
  476. {//发送游戏统计数据(By Fellow,2003.7.22)
  477. ASSERT( m_pServer && pData && dataLength );
  478. #ifdef CONSOLE_DEBUG
  479. cout << "_GetGameStat::Begin" << endl;
  480. #endif
  481. //收到的数据包,只有控制字没有数据
  482. TProcessData *pProData = ( TProcessData * )pData;
  483. size_t nIdentity = pProData->ulIdentity;
  484. //需要发送的数据包
  485. CBuffer *pBuffer = m_theAllocator.Allocate();
  486. TProcessData *pStatData = 
  487. reinterpret_cast< TProcessData * >( const_cast< BYTE * >( pBuffer->GetBuffer() ) );
  488. int nDataLen = sizeof(TGAME_STAT_DATA);
  489. pStatData->nProtoId = s2c_gamestatistic;
  490. pStatData->ulIdentity = nIdentity;
  491. pStatData->nDataLen = nDataLen;
  492. //取得统计数据
  493. TGAME_STAT_DATA* myGameStatData = (TGAME_STAT_DATA*)pStatData->pDataBuffer;
  494. GetGameStat(myGameStatData);
  495. int nUsedLen = sizeof( TProcessData ) - 1 + nDataLen;
  496. pBuffer->Use( nUsedLen );
  497. //发送
  498. m_theSend.AddData( s2c_gamestatistic_bigpackage, pBuffer->GetBuffer(), nUsedLen );
  499. CBuffer *pPack = m_theSend.GetHeadPack( s2c_gamestatistic_bigpackage );
  500. while ( pPack )
  501. {
  502. m_pServer->SendData( m_nIndentity, ( const void * )pPack->GetBuffer(), pPack->GetUsed() );
  503. SAFE_RELEASE( pPack );
  504. pPack = m_theSend.GetNextPack( s2c_gamestatistic_bigpackage );
  505. }
  506. m_theSend.DelData( s2c_gamestatistic_bigpackage );
  507. SAFE_RELEASE( pPack );
  508. SAFE_RELEASE( pBuffer );
  509. #ifdef CONSOLE_DEBUG
  510. cout << "_GetGameStat::End" << endl;
  511. #endif
  512. }
  513. /////////////////////////////////////////////////////////////////////////////////
  514. CClientNode::stdRoleLockMap CClientNode::m_csRoleLock;
  515. CCriticalSection CClientNode::m_csCR;
  516. void CClientNode::_LockOrUnlockRole( const void *pData, size_t dataLength ) //强行加解锁
  517. {
  518. CCriticalSection::Owner lock( CClientNode::m_csCR );
  519. if (pData && dataLength == sizeof(tagRoleEnterGame))
  520. {
  521. tagRoleEnterGame* pRole = (tagRoleEnterGame*)pData;
  522. char szRole[32];
  523. strncpy(szRole, pRole->Name, 31);
  524. szRole[31] = 0;
  525. bool bLock = pRole->bLock;
  526. if (szRole && szRole[0] != 0)
  527. {
  528. if (bLock)
  529. m_csRoleLock[szRole] = m_nIndentity;
  530. else
  531. {
  532. stdRoleLockMap::iterator it = m_csRoleLock.find(szRole);
  533. if (it != m_csRoleLock.end())
  534. m_csRoleLock.erase(it);
  535. }
  536. }
  537. }
  538. }
  539. bool CClientNode::IsRoleLock(char* szRole)
  540. {
  541. CCriticalSection::Owner lock( CClientNode::m_csCR );
  542. if (szRole && szRole[0] != 0)
  543. {
  544. stdRoleLockMap::iterator it = m_csRoleLock.find(szRole);
  545. if (it != m_csRoleLock.end() && it->second != -1)
  546. return true;
  547. }
  548. return false;
  549. }
  550. bool CClientNode::IsRoleLockBySelf(char* szRole)
  551. {
  552. CCriticalSection::Owner lock( CClientNode::m_csCR );
  553. if (szRole && szRole[0] != 0)
  554. {
  555. stdRoleLockMap::iterator it = m_csRoleLock.find(szRole);
  556. if (it != m_csRoleLock.end() && it->second == m_nIndentity)
  557. return true;
  558. }
  559. return false;
  560. }
  561. bool CClientNode::UnlockRoleSelf(char* szRole)
  562. {
  563. CCriticalSection::Owner lock( CClientNode::m_csCR );
  564. if (szRole && szRole[0] != 0)
  565. {
  566. stdRoleLockMap::iterator it = m_csRoleLock.find(szRole);
  567. if (it != m_csRoleLock.end() && it->second == m_nIndentity)
  568. {
  569. m_csRoleLock.erase(it);
  570. return true;
  571. }
  572. }
  573. return false;
  574. }
  575. void CClientNode::UnlockAllRole(size_t ID)
  576. {
  577. CCriticalSection::Owner lock( CClientNode::m_csCR );
  578. stdRoleLockMap::iterator it = m_csRoleLock.begin();
  579. while (it != m_csRoleLock.end())
  580. {
  581. if (it->second == ID)
  582. it->second = -1;
  583. it++;
  584. }
  585. }
  586. /////////////////////////////////////////////////////////////////////////////////