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

模拟服务器

开发平台:

C/C++

  1. //////////////////////////////////////////////////////////////////////////////////////
  2. //
  3. //  FileName    :   KSG_RoleProcess.cpp
  4. //  Version     :   1.0
  5. //  Creater     :   Freeway Chen
  6. //  Date        :   2003-9-15 7:45:21
  7. //  Comment     :   
  8. //
  9. //////////////////////////////////////////////////////////////////////////////////////
  10. #include "StdAfx.h"
  11. #pragma warning( disable : 4786 ) 
  12. #include "winsock2.h"
  13. #include "CriticalSection.h"
  14. #include "KSG_RoleProcess.h"
  15. #include <vector>
  16. #include <map>
  17. #include <algorithm>
  18. using namespace std;
  19. using namespace OnlineGameLib::Win32;
  20. #include "kprotocoldef.h"
  21. #include "KProtocol.h"
  22. #include "../../../../Headers/KGmProtocol.h"
  23. #include "IDBRoleServer.h"
  24. #include "Macro.h"
  25. #include "RoleNameFilter.h"
  26. #define _NAME_LENGTH 64
  27. typedef struct _THREAD_PARAM
  28. {
  29.     HANDLE          hThread;
  30.     SOCKET          hSocket;
  31.     long            lID;
  32.     HWND            hMainWnd;
  33.     unsigned char   InBuffer [64 * 1024];
  34.     unsigned char   OutBuffer[64 * 1024];
  35. } THREAD_PARAM;
  36. typedef void (*ProcessArray[c2s_end])(THREAD_PARAM *pParam,  const void *pData, size_t dataLength);
  37. ProcessArray g_theProcessArray;
  38. void _QueryRoleList(THREAD_PARAM *pParam, const void *pData, size_t dataLength);
  39. void _CreateRole(THREAD_PARAM *pParam, const void *pData, size_t dataLength);
  40. void _SaveRoleInfo(THREAD_PARAM *pParam, const void *pData, size_t dataLength);
  41. void _DelRole(THREAD_PARAM *pParam, const void *pData, size_t dataLength);
  42. void _GetRoleInfo(THREAD_PARAM *pParam, const void *pData, size_t dataLength);
  43. void _RelayExtend(THREAD_PARAM *pParam, const void *pData, size_t dataLength);
  44. void _GetGameStat(THREAD_PARAM *pParam, const void *pData, size_t dataLength);//发送游戏统计数据(By Fellow,2003.7.22)
  45. void _LockOrUnlockRole(THREAD_PARAM *pParam, const void *pData, size_t dataLength);
  46. bool IsRoleLock(char* szRole);
  47. bool IsRoleLockBySelf(size_t ID, char* szRole);
  48. bool UnlockRoleSelf(size_t ID, char* szRole);
  49. void UnlockAllRole(size_t ID);
  50. static int gs_nWSAStartupFlag = false;
  51. static SOCKET gs_sckListen = INVALID_SOCKET;
  52. static int    gs_nExitFlag = false;
  53. static long g_lID = 0;
  54. static CCriticalSection     gs_ThreadsLock;
  55. typedef vector<THREAD_PARAM *>  ThreadsType; 
  56. static  ThreadsType             gs_Threads;
  57. HWND    g_hMainWnd = NULL;
  58. #define SOCKET_VERSION_REQUIRED     0x202
  59. int KSG_RoleProcess_Init(int nPort, HWND hMainWnd)
  60. {
  61.     int nResult  = false;
  62.     int nRetCode = false;
  63.     int nWSAStartupFlag = false;
  64.     memset(&g_theProcessArray, 0, sizeof(g_theProcessArray));
  65. g_theProcessArray[c2s_roleserver_getrolelist] = _QueryRoleList;
  66. g_theProcessArray[c2s_roleserver_createroleinfo] = _CreateRole;
  67. g_theProcessArray[c2s_roleserver_saveroleinfo] = _SaveRoleInfo;
  68. g_theProcessArray[c2s_roleserver_deleteplayer] = _DelRole;
  69. g_theProcessArray[c2s_roleserver_getroleinfo] = _GetRoleInfo;
  70.     //g_theProcessArray[c2s_extend] = _RelayExtend;
  71. g_theProcessArray[c2s_gamestatistic] = _GetGameStat;
  72. g_theProcessArray[c2s_roleserver_lock] = _LockOrUnlockRole;
  73.     g_hMainWnd = hMainWnd;
  74.     WSADATA WSAData = { 0 };
  75.     struct sockaddr_in addr = { 0 };
  76.     nRetCode = WSAStartup(SOCKET_VERSION_REQUIRED, &WSAData);
  77.     if (nRetCode != 0)
  78.         goto Exit0;
  79.     
  80.     gs_nWSAStartupFlag = true;
  81.     gs_Threads.reserve(256);
  82.     gs_sckListen = socket(AF_INET, SOCK_STREAM, 0);
  83.     if (gs_sckListen == INVALID_SOCKET)
  84.         goto Exit0;
  85.     addr.sin_family = AF_INET;
  86.     addr.sin_addr.s_addr = INADDR_ANY;
  87.     addr.sin_port = htons(nPort);
  88.     nRetCode = bind(gs_sckListen, (struct sockaddr *)&addr, sizeof(addr));
  89.     if (nRetCode == SOCKET_ERROR)
  90.         goto Exit0;
  91.     nRetCode = listen(gs_sckListen, 5);
  92.     if (nRetCode == SOCKET_ERROR)
  93.         goto Exit0;
  94.     nResult = true;
  95. Exit0:
  96.     if (!nResult)
  97.     {
  98.         if (gs_sckListen != INVALID_SOCKET)
  99.         {
  100.             closesocket(gs_sckListen);
  101.             gs_sckListen = INVALID_SOCKET;
  102.         }
  103.         
  104.         if (gs_nWSAStartupFlag)
  105.         {
  106.             WSACleanup();
  107.             gs_nWSAStartupFlag = false; 
  108.         }
  109.     }
  110.     return nResult;
  111. }
  112. int KSG_RoleProcess_UnInit()
  113. {
  114.     int nResult  = false;
  115.     int nRetCode = false;
  116.     
  117.     {
  118.         CCriticalSection::Owner lock(gs_ThreadsLock);
  119.         
  120.         gs_nExitFlag = true;    // 设置退出标志
  121.         ThreadsType::iterator pPos;
  122.         for (pPos = gs_Threads.begin(); pPos != gs_Threads.end(); ++pPos)
  123.         {
  124.             if (((*pPos)->hSocket) != INVALID_SOCKET)
  125.             {
  126.         LINGER lingerStruct;
  127.     
  128.         lingerStruct.l_onoff = 1;
  129.         lingerStruct.l_linger = 0;
  130.     
  131.                 setsockopt( 
  132.                     (*pPos)->hSocket, 
  133.     SOL_SOCKET, 
  134.     SO_LINGER, 
  135.     (char *)&lingerStruct, 
  136.     sizeof(lingerStruct)
  137.                 );
  138.                 closesocket((*pPos)->hSocket);
  139.             }
  140.         }
  141.         if (gs_sckListen != INVALID_SOCKET)
  142.         {
  143.     LINGER lingerStruct;
  144.     lingerStruct.l_onoff = 1;
  145.     lingerStruct.l_linger = 0;
  146.             // notify accept thread to exit
  147.             setsockopt( 
  148.                 gs_sckListen, 
  149. SOL_SOCKET, 
  150. SO_LINGER, 
  151. (char *)&lingerStruct, 
  152. sizeof(lingerStruct)
  153.             );
  154.         
  155.             closesocket(gs_sckListen);
  156.             gs_sckListen = INVALID_SOCKET;
  157.         }
  158.     }
  159.     while (true)
  160.     {
  161.         {
  162.             CCriticalSection::Owner lock(gs_ThreadsLock);
  163.             if (gs_Threads.empty())
  164.                 break;
  165.         }
  166.         Sleep(250);
  167.     }
  168.     nRetCode = WSACleanup();
  169.     if (nRetCode != 0)
  170.         goto Exit0;
  171.     nResult = true;
  172. Exit0:
  173.     return nResult;
  174. }
  175. static inline int _RecvBuffer(SOCKET sckSocket, int nBufferSize, unsigned char *pbyBuffer)
  176. {
  177.     int nResult  = false;
  178.     int nRetCode = false;
  179.     ASSERT(sckSocket != INVALID_SOCKET);
  180.     ASSERT(nBufferSize > 0);
  181.     ASSERT(pbyBuffer != NULL);
  182.     while (nBufferSize > 0)
  183.     {
  184.         nRetCode = recv(sckSocket, (char *)pbyBuffer, nBufferSize, 0);
  185.         if (
  186.             (nRetCode == SOCKET_ERROR) ||
  187.             (nRetCode == 0)
  188.         )
  189.             goto Exit0;
  190.         pbyBuffer += nRetCode;
  191.         nBufferSize -= nRetCode;
  192.     }
  193.     nResult = true;
  194. Exit0:
  195.     return nResult;
  196. }
  197. static inline int _SendBuffer(SOCKET sckSocket, int nBufferSize, unsigned char *pbyBuffer)
  198. {
  199.     int nResult  = false;
  200.     int nRetCode = false;
  201.     ASSERT(sckSocket != INVALID_SOCKET);
  202.     ASSERT(nBufferSize > 0);
  203.     ASSERT(pbyBuffer != NULL);
  204.     while (nBufferSize > 0)
  205.     {
  206.         nRetCode = send(sckSocket, (char *)pbyBuffer, nBufferSize, 0);
  207.         if (nRetCode == SOCKET_ERROR)
  208.             goto Exit0;
  209.         pbyBuffer += nRetCode;
  210.         nBufferSize -= nRetCode;
  211.     }
  212.     nResult = true;
  213. Exit0:
  214.     return nResult;
  215. }
  216. static DWORD WINAPI KSG_RoleProcessThread(LPVOID lpParam)
  217. {
  218.     int nResult  = false;
  219.     int nRetCode = false;
  220.     struct sockaddr_in addr_from = { 0 };
  221.     int addr_from_len = sizeof(addr_from);
  222.     unsigned uProcessDataSize     = 0;
  223.     unsigned char *pbyProcessData = NULL;
  224.     int  nNotifyAddClientFlag = false;
  225.     SOCKET sckSocketProcess = INVALID_SOCKET;
  226.     THREAD_PARAM *pThreadParam = (THREAD_PARAM *)lpParam;
  227.     if (!pThreadParam)
  228.         goto Exit0;
  229.     if (gs_nExitFlag)
  230.         goto Exit1;
  231.     pThreadParam->lID = InterlockedIncrement(&g_lID);
  232.     sckSocketProcess = accept(gs_sckListen, (struct sockaddr *)&addr_from, &addr_from_len);
  233.     if (sckSocketProcess == INVALID_SOCKET)
  234.         goto Exit0;
  235.     pThreadParam->hSocket = sckSocketProcess;
  236.     if (gs_nExitFlag)
  237.         goto Exit0;
  238.     // notfiy Add Client
  239.     if (pThreadParam->hMainWnd)
  240.     {
  241.         ::SendMessage(pThreadParam->hMainWnd, WM_ADD_CLIENT, (WPARAM)addr_from_len, (LPARAM)&addr_from);
  242.         nNotifyAddClientFlag = true;
  243.     }
  244.     nRetCode = KSG_RoleProcess_Start();
  245.     if (!nRetCode)
  246.         goto Exit0;
  247.     
  248.     while (true)
  249.     {
  250.         if (gs_nExitFlag)
  251.             goto Exit0;
  252.         nRetCode = _RecvBuffer(sckSocketProcess, sizeof(WORD), pThreadParam->InBuffer);
  253.         if (!nRetCode)
  254.             goto Exit0;
  255.         uProcessDataSize = *((WORD *)pThreadParam->InBuffer);
  256.         uProcessDataSize -= sizeof(WORD);
  257.         pbyProcessData = (pThreadParam->InBuffer) + sizeof(WORD);
  258.         nRetCode = _RecvBuffer(sckSocketProcess, uProcessDataSize, pbyProcessData);
  259.         if (!nRetCode)
  260.             goto Exit0;
  261. BYTE cProtocol;
  262.         cProtocol = *pbyProcessData;
  263. if ( 
  264.             (cProtocol < c2s_end) && 
  265.             (g_theProcessArray[cProtocol]) 
  266.         )
  267. {
  268. (*g_theProcessArray[cProtocol])(pThreadParam, (const void *)pbyProcessData, uProcessDataSize);
  269. }
  270.     }
  271. Exit1:
  272.     nResult = true;
  273. Exit0:
  274.     if (nNotifyAddClientFlag)
  275.     {
  276.         if (!gs_nExitFlag)
  277.         {
  278.             if (pThreadParam->hMainWnd)
  279.             {
  280.                 ::SendMessage(pThreadParam->hMainWnd, WM_DEL_CLIENT, (WPARAM)addr_from_len, (LPARAM)&addr_from);
  281.             }
  282.         }
  283.         nNotifyAddClientFlag = false;
  284.     }
  285.     UnlockAllRole(pThreadParam->lID);
  286.     {
  287.         CCriticalSection::Owner lock(gs_ThreadsLock);
  288.         ThreadsType::iterator pPos;
  289.         
  290.         pPos = find(gs_Threads.begin(), gs_Threads.end(), pThreadParam);
  291.         if (pPos != gs_Threads.end())
  292.         {
  293.             CloseHandle((*pPos)->hThread);
  294.             *pPos = NULL;
  295.     
  296.             gs_Threads.erase(pPos);
  297.         }
  298.    
  299.         if (sckSocketProcess != INVALID_SOCKET)
  300.         {
  301.     LINGER lingerStruct;
  302.     
  303.     lingerStruct.l_onoff = 1;
  304.     lingerStruct.l_linger = 0;
  305.     
  306.             // notify accept thread to exit
  307.             setsockopt( 
  308.                 gs_sckListen, 
  309.     SOL_SOCKET, 
  310.     SO_LINGER, 
  311.     (char *)&lingerStruct, 
  312.     sizeof(lingerStruct)
  313.             );
  314.             closesocket(sckSocketProcess);
  315.             sckSocketProcess = INVALID_SOCKET;
  316.         }
  317.     }
  318.     if (pThreadParam)
  319.     {
  320.         delete pThreadParam;
  321.         pThreadParam = NULL;
  322.     }
  323.     return nResult;
  324. }
  325. int KSG_RoleProcess_Start()
  326. {
  327.     int nResult  = false;
  328.     int nRetCode = false;
  329.     HANDLE hThread = NULL;
  330.     DWORD dwThreadID = 0;
  331.     THREAD_PARAM *pThreadParam = NULL;
  332.     pThreadParam = new THREAD_PARAM;
  333.     if (!pThreadParam)
  334.         goto Exit0;
  335.     pThreadParam->hMainWnd = g_hMainWnd;
  336.     pThreadParam->hSocket  = INVALID_SOCKET;
  337.     hThread = CreateThread(
  338.         NULL, 
  339.         0,
  340.         KSG_RoleProcessThread,
  341.         (LPVOID)pThreadParam,
  342.         CREATE_SUSPENDED,
  343.         &dwThreadID
  344.     );
  345.     if (!hThread)
  346.         goto Exit0;
  347.     {
  348.         CCriticalSection::Owner lock(gs_ThreadsLock);
  349.         pThreadParam->hThread = hThread;
  350.         gs_Threads.push_back(pThreadParam);
  351.         ResumeThread(hThread);
  352.         hThread = NULL;
  353.         dwThreadID = 0;
  354.     }
  355.     nResult = true;
  356. Exit0:
  357.     if (!nResult)
  358.     {
  359.         if (pThreadParam)
  360.         {
  361.             delete pThreadParam;
  362.             pThreadParam = NULL;
  363.         }
  364.     }
  365.     return nResult;
  366. }
  367. /////////////////////////////////////////////////////////////////////////////////
  368. // 处理角色锁定
  369. typedef map< std::string, size_t > stdRoleLockMap;
  370. stdRoleLockMap      gs_csRoleLock;
  371. CCriticalSection gs_csCR;
  372. void _LockOrUnlockRole(THREAD_PARAM *pParam, const void *pData, size_t dataLength) //强行加解锁
  373. {
  374. CCriticalSection::Owner lock( gs_csCR );
  375. if (pData && dataLength == sizeof(tagRoleEnterGame))
  376. {
  377. tagRoleEnterGame* pRole = (tagRoleEnterGame*)pData;
  378. char szRole[32];
  379. strncpy(szRole, pRole->Name, 31);
  380. szRole[31] = 0;
  381. bool bLock = pRole->bLock;
  382. if (szRole && szRole[0] != 0)
  383. {
  384. if (bLock)
  385. gs_csRoleLock[szRole] = pParam->lID;
  386. else
  387. {
  388. stdRoleLockMap::iterator it = gs_csRoleLock.find(szRole);
  389. if (it != gs_csRoleLock.end())
  390. gs_csRoleLock.erase(it);
  391. }
  392. }
  393. }
  394. }
  395. bool IsRoleLock(char* szRole)
  396. {
  397. CCriticalSection::Owner lock( gs_csCR );
  398. if (szRole && szRole[0] != 0)
  399. {
  400. stdRoleLockMap::iterator it = gs_csRoleLock.find(szRole);
  401. if (it != gs_csRoleLock.end() && it->second != -1)
  402. return true;
  403. }
  404. return false;
  405. }
  406. bool IsRoleLockBySelf(size_t ID, char* szRole)
  407. {
  408. CCriticalSection::Owner lock( gs_csCR );
  409. if (szRole && szRole[0] != 0)
  410. {
  411. stdRoleLockMap::iterator it = gs_csRoleLock.find(szRole);
  412. if (it != gs_csRoleLock.end() && it->second == ID)
  413. return true;
  414. }
  415. return false;
  416. }
  417. bool UnlockRoleSelf(size_t ID, char* szRole)
  418. {
  419. CCriticalSection::Owner lock( gs_csCR );
  420. if (szRole && szRole[0] != 0)
  421. {
  422. stdRoleLockMap::iterator it = gs_csRoleLock.find(szRole);
  423. if (it != gs_csRoleLock.end() && it->second == ID)
  424. {
  425. gs_csRoleLock.erase(it);
  426. return true;
  427. }
  428. }
  429. return false;
  430. }
  431. void UnlockAllRole(size_t ID)
  432. {
  433. CCriticalSection::Owner lock( gs_csCR );
  434. stdRoleLockMap::iterator it = gs_csRoleLock.begin();
  435. while (it != gs_csRoleLock.end())
  436. {
  437. if (it->second == ID)
  438. it->second = -1;
  439. it++;
  440. }
  441. }
  442. /////////////////////////////////////////////////////////////////////////////////
  443.     
  444. //============= Process Data =======================
  445. void _QueryRoleList(THREAD_PARAM *pParam, const void *pData, size_t dataLength)
  446. {
  447. char szAccountName[_NAME_LENGTH];
  448. ASSERT( pParam && pData && dataLength);
  449.     #ifdef CONSOLE_DEBUG
  450. cout << "_QueryRoleList::Begin" << endl;
  451.     #endif
  452. TProcessData *pPlayerList = ( TProcessData * )pData;
  453. int nRoleListCount = pPlayerList->pDataBuffer[0];
  454. int nLen = pPlayerList->nDataLen;
  455. unsigned long ulIdentity = pPlayerList->ulIdentity;
  456. if ( nLen <= 1 || nLen >= _NAME_LENGTH )
  457. {
  458.         #ifdef CONSOLE_DEBUG
  459. cout << "_QueryRoleList::Name is invalid" << endl;
  460.         #endif
  461. return;
  462. }
  463. memcpy( szAccountName, ( const char * )( &pPlayerList->pDataBuffer[1] ), nLen - 1 );
  464. szAccountName[nLen - 1] = '';
  465. /*
  466.  * Database
  467.  */
  468. S3DBI_RoleBaseInfo DBI[4];
  469. const size_t s_nStructSize = sizeof( S3DBI_RoleBaseInfo );
  470.     #ifdef CONSOLE_DEBUG
  471. cout << "_QueryRoleList::GetRoleListOfAccount " << szAccountName << endl;
  472.     #endif
  473. int nCount = GetRoleListOfAccount( szAccountName, &DBI[0], nRoleListCount );
  474. TProcessData *pListData = (TProcessData *)((pParam->OutBuffer) + sizeof(WORD));
  475. pListData->nProtoId = s2c_roleserver_getrolelist_result;
  476. pListData->ulIdentity = ulIdentity;
  477. int nDataLen = nCount * s_nStructSize + 1;
  478. pListData->nDataLen = nDataLen;
  479. pListData->pDataBuffer[0] = nCount;
  480. memcpy( &pListData->pDataBuffer[1], &DBI[0], nDataLen );
  481. int nUsedLen = sizeof( TProcessData ) - 1 + nDataLen;
  482.     *((WORD *)pParam->OutBuffer) = ((WORD)nUsedLen) + sizeof(WORD);
  483.     _SendBuffer(pParam->hSocket, *((WORD *)pParam->OutBuffer), pParam->OutBuffer);
  484.     #ifdef CONSOLE_DEBUG
  485. cout << "_QueryRoleList::end" << endl;
  486.     #endif
  487. }
  488. void _CreateRole(THREAD_PARAM *pParam, const void *pData, size_t dataLength)
  489. {
  490. ASSERT( pParam && pData && dataLength);
  491.     #ifdef CONSOLE_DEBUG
  492. cout << "_CreateRole::Begin" << endl;
  493.     #endif
  494. TProcessData *pPD = ( TProcessData * )pData;
  495. int nResult = 0;
  496. {{
  497. extern CRoleNameFilter g_fltRoleName;
  498. TRoleData* pRoleData = (TRoleData*)(pPD->pDataBuffer + 1);
  499. if (pRoleData->BaseInfo.szName[0])
  500. {
  501. for (size_t pos = sizeof(pRoleData->BaseInfo.szName) - 1; pos >= 1; pos--)
  502. {
  503. if (!pRoleData->BaseInfo.szName[pos])
  504. break;
  505. }
  506. if (pos >= 1)
  507. {
  508. if (g_fltRoleName.IsTextPass(pRoleData->BaseInfo.szName))
  509. nResult = SaveRoleInfo( &pPD->pDataBuffer[1], NULL, TRUE );
  510. else
  511. nResult = -1;
  512. }
  513. }
  514. }}
  515. TProcessData *pInfo = (TProcessData *)(pParam->OutBuffer + sizeof(WORD));
  516. pInfo->nProtoId = s2c_roleserver_createrole_result;
  517. pInfo->ulIdentity = pPD->ulIdentity;
  518. pInfo->nDataLen = 1;
  519. pInfo->pDataBuffer[0] = ( nResult == 1 ) ? 1 : -1;
  520.     int nUsedLen = sizeof(TProcessData);
  521.     *((WORD *)pParam->OutBuffer) = ((WORD)nUsedLen) + sizeof(WORD);
  522.     _SendBuffer(pParam->hSocket, *((WORD *)pParam->OutBuffer), pParam->OutBuffer);
  523.     #ifdef CONSOLE_DEBUG
  524. cout << "_CreateRole::End" << endl;
  525.     #endif
  526. }
  527. void _SaveRoleInfo(THREAD_PARAM *pParam, const void *pData, size_t dataLength)
  528. {
  529. ASSERT( pParam && pData && dataLength);
  530.     
  531.     #ifdef CONSOLE_DEBUG
  532. cout << "_SaveRoleInfo::Begin" << endl;
  533.     #endif
  534. TProcessData *pPD = ( TProcessData * )pData;
  535. int nResult = 0;
  536. TRoleData* pRole = (TRoleData*)(&pPD->pDataBuffer[0]);
  537. char szName[32];
  538. int len = strlen( pRole->BaseInfo.szName );
  539. ASSERT( len > 0 );
  540. len = len > 31 ? 31 : len;
  541. memcpy( szName, pRole->BaseInfo.szName, len );
  542. szName[len] = '';
  543. if (IsRoleLockBySelf(pParam->lID, szName))
  544. {
  545. nResult = SaveRoleInfo( &pPD->pDataBuffer[0], NULL, FALSE );
  546. if (pPD->bLeave)
  547. {
  548. UnlockRoleSelf(pParam->lID, szName);
  549. }
  550. }
  551. else
  552. nResult = 0;
  553. if ( pPD->ulIdentity >= 0 )
  554. {
  555.      TProcessData *pInfo = (TProcessData *)(pParam->OutBuffer + sizeof(WORD));
  556. pInfo->nProtoId = s2c_roleserver_saverole_result;
  557. pInfo->ulIdentity = pPD->ulIdentity;
  558. pInfo->nDataLen = 1;
  559. pInfo->pDataBuffer[0] = ( nResult == 1 ) ? 1 : -1;
  560.         int nUsedLen = sizeof(TProcessData);
  561.         *((WORD *)pParam->OutBuffer) = ((WORD)nUsedLen) + sizeof(WORD);
  562.         _SendBuffer(pParam->hSocket, *((WORD *)pParam->OutBuffer), pParam->OutBuffer);
  563. }
  564.     #ifdef CONSOLE_DEBUG
  565. cout << "_SaveRoleInfo::End" << endl;
  566.     #endif
  567. }
  568. void _DelRole(THREAD_PARAM *pParam, const void *pData, size_t dataLength)
  569. {
  570. ASSERT( pParam && pData && dataLength);
  571.     #ifdef CONSOLE_DEBUG
  572. cout << "_DelRole::Begin" << endl;
  573.     #endif
  574. TProcessData *pRoleInfo = ( TProcessData * )pData;
  575. char szRoleName[_NAME_LENGTH];
  576. int nDataLen = pRoleInfo->nDataLen;
  577. nDataLen = ( nDataLen > _NAME_LENGTH ) ? _NAME_LENGTH : nDataLen;
  578. int result = -1;
  579. if ( nDataLen > 0 )
  580. {
  581. memcpy( szRoleName, &pRoleInfo->pDataBuffer[0], nDataLen );
  582. szRoleName[nDataLen] = '';
  583.         #ifdef CONSOLE_DEBUG
  584. cout << "_DelRole::DeleteRole " << szRoleName << endl;
  585.         #endif
  586. if ( DeleteRole( szRoleName ) )
  587. {
  588. result = 1;
  589. }
  590. else
  591. {
  592. result = -1;
  593. }
  594. }
  595. if ( pRoleInfo->ulIdentity >= 0 )
  596. {
  597.      TProcessData *pInfo = (TProcessData *)(pParam->OutBuffer + sizeof(WORD));
  598. pInfo->nProtoId = s2c_roleserver_deleterole_result;
  599. pInfo->ulIdentity = pRoleInfo->ulIdentity;
  600. pInfo->nDataLen = 1;
  601. pInfo->pDataBuffer[0] = result;
  602.         int nUsedLen = sizeof(TProcessData);
  603.         *((WORD *)pParam->OutBuffer) = ((WORD)nUsedLen) + sizeof(WORD);
  604.         _SendBuffer(pParam->hSocket, *((WORD *)pParam->OutBuffer), pParam->OutBuffer);
  605. }
  606.     #ifdef CONSOLE_DEBUG
  607. cout << "_DelRole::End" << endl;
  608.     #endif
  609. }
  610. void _GetRoleInfo(THREAD_PARAM *pParam, const void *pData, size_t dataLength)
  611. {
  612. ASSERT( pParam && pData && dataLength);
  613.     #ifdef CONSOLE_DEBUG
  614. cout << "_GetRoleInfo::Begin" << endl;
  615.     #endif
  616. TProcessData *pRoleInfo = ( TProcessData * )pData;
  617. char szRoleName[_NAME_LENGTH];
  618. int nDataLen = pRoleInfo->nDataLen;
  619. nDataLen = ( nDataLen > _NAME_LENGTH ) ? _NAME_LENGTH : nDataLen;
  620.     TProcessData *pRoleData = (TProcessData *)(pParam->OutBuffer + sizeof(WORD));
  621. int nUsedLen = sizeof( TProcessData );
  622. size_t nIdentity = pRoleInfo->ulIdentity;
  623. pRoleData->nProtoId = s2c_roleserver_getroleinfo_result;
  624. pRoleData->pDataBuffer[0] = -1;
  625. pRoleData->nDataLen = 1;
  626. pRoleData->ulIdentity = nIdentity;
  627. if ( nDataLen > 0 )
  628. {
  629. memcpy( szRoleName, &pRoleInfo->pDataBuffer[0], nDataLen );
  630. szRoleName[nDataLen] = '';
  631. int result = -1;
  632.         #ifdef CONSOLE_DEBUG
  633. cout << "_GetRoleInfo::GetRoleInfo " << szRoleName << endl;
  634.         #endif
  635. int nRoleInfoLen = 0;
  636. if (!IsRoleLock(szRoleName))
  637.         {
  638. GetRoleInfo( &pRoleData->pDataBuffer[1], szRoleName, nRoleInfoLen );
  639.         }
  640. if ( nRoleInfoLen > 0 )
  641. {
  642. pRoleData->pDataBuffer[0] = 1;
  643. pRoleData->nDataLen = nRoleInfoLen + 1;
  644. nUsedLen = sizeof( TProcessData ) + nRoleInfoLen;
  645. }
  646. }
  647.     *((WORD *)pParam->OutBuffer) = ((WORD)nUsedLen) + sizeof(WORD);
  648.     _SendBuffer(pParam->hSocket, *((WORD *)pParam->OutBuffer), pParam->OutBuffer);
  649.     #ifdef CONSOLE_DEBUG
  650. cout << "_GetRoleInfo::End" << endl;
  651.     #endif
  652. }
  653. void _GetGameStat(THREAD_PARAM *pParam, const void *pData, size_t dataLength)
  654. {
  655.     //发送游戏统计数据(By Fellow,2003.7.22)
  656. ASSERT( pParam && pData && dataLength);
  657.     #ifdef CONSOLE_DEBUG
  658. cout << "_GetGameStat::Begin" << endl;
  659.     #endif
  660. //收到的数据包,只有控制字没有数据
  661. TProcessData *pProData = ( TProcessData * )pData;
  662. size_t nIdentity = pProData->ulIdentity;
  663. //取得统计数据
  664. TProcessData *pStatData = (TProcessData *)(pParam->OutBuffer + sizeof(WORD));
  665. pStatData->nProtoId = s2c_gamestatistic;
  666. pStatData->ulIdentity = nIdentity;
  667.     TGAME_STAT_DATA *pGameStatData = (TGAME_STAT_DATA *)(&pStatData->pDataBuffer[0]);
  668.     GetGameStat(pGameStatData);
  669. int nDataLen = sizeof(TGAME_STAT_DATA);
  670. pStatData->nDataLen = nDataLen;
  671. int nUsedLen = sizeof( TProcessData ) - 1 + nDataLen;
  672.     *((WORD *)pParam->OutBuffer) = ((WORD)nUsedLen) + sizeof(WORD);
  673.     _SendBuffer(pParam->hSocket, *((WORD *)pParam->OutBuffer), pParam->OutBuffer);
  674.     #ifdef CONSOLE_DEBUG
  675. cout << "_GetGameStat::End" << endl;
  676.     #endif
  677. }
  678. //for Relay System and GM [wxb 2003-7-22]
  679. //void _RelayExtend(THREAD_PARAM *pParam, const void *pData, size_t dataLength)
  680. //{
  681. // ASSERT(c2s_extend == *((unsigned char *)pData));
  682. // char* pNewData = ((char *)pData) + 1;
  683. // switch (*((WORD*)pNewData))
  684. // {
  685. // case MAKEWORD(pf_gamemaster, gm_c2s_getrole):
  686. // {
  687. // ASSERT(dataLength == 1 + sizeof(GM_GET_ROLE_DATA_COMMAND));
  688. // GM_GET_ROLE_DATA_COMMAND* pGMData = (GM_GET_ROLE_DATA_COMMAND*)pNewData;
  689. // int nResultBuflen = 0;
  690. // switch(pGMData->wGetID)
  691. // {
  692. // case gm_role_entergame_position:
  693. // {
  694. // ASSERT(0 == pGMData->wLength);
  695. // char* pReturnBuffer = (char*)_alloca(1 + sizeof(GM_GET_ROLE_DATA_SYNC) + sizeof(GM_ROLE_DATA_SUB_ENTER_POS));
  696. //
  697. // *pReturnBuffer = (char)s2c_extend;
  698. //
  699. // GM_GET_ROLE_DATA_SYNC* pGMReturn = (GM_GET_ROLE_DATA_SYNC*)(pReturnBuffer + 1);
  700. // strncpy(pGMReturn->AccountName, pGMData->AccountName, sizeof(pGMData->AccountName));
  701. // pGMReturn->ProtocolFamily = pf_gamemaster;
  702. // pGMReturn->ProtocolType = gm_s2c_getrole;
  703. // pGMReturn->wGetID = gm_role_entergame_position;
  704. // pGMReturn->wLength = sizeof(GM_ROLE_DATA_SUB_ENTER_POS);
  705. //
  706. // GetRoleInfoForGM(pGMData->wGetID, (char*)(pGMReturn + 1), pGMData->AccountName, nResultBuflen);
  707. // ASSERT(pGMReturn->wLength == nResultBuflen);
  708. // m_pServer->SendData( m_nIndentity, pReturnBuffer, 1 + sizeof(GM_GET_ROLE_DATA_SYNC) + sizeof(GM_ROLE_DATA_SUB_ENTER_POS) );
  709. // }
  710. // break;
  711. // default:
  712. // ASSERT(0);
  713. // break;
  714. // }
  715. // }
  716. // break;
  717. //
  718. // case MAKEWORD(pf_gamemaster, gm_c2s_setrole):
  719. // {
  720. // ASSERT(dataLength >= 1 + sizeof(GM_SET_ROLE_DATA_COMMAND));
  721. // GM_SET_ROLE_DATA_COMMAND* pGMData = (GM_SET_ROLE_DATA_COMMAND*)pNewData;
  722. // SetRoleInfoForGM(pGMData->wSetID, (char*)(pGMData + 1), pGMData->AccountName, pGMData->wLength);
  723. // }
  724. // break;
  725. // default:
  726. // ASSERT(0);
  727. // break;
  728. // }
  729. //}