诸暨麻将添加redis
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

992 lines
26 KiB

  1. #include "StdAfx.h"
  2. #include "ServerListManager.h"
  3. #include <strsafe.h>
  4. //////////////////////////////////////////////////////////////////////////////////
  5. //构造函数
  6. CGameTypeItem::CGameTypeItem()
  7. {
  8. //设置变量
  9. ZeroMemory(&m_GameType, sizeof(m_GameType));
  10. return;
  11. }
  12. //////////////////////////////////////////////////////////////////////////////////
  13. //构造函数
  14. CGameKindItem::CGameKindItem()
  15. {
  16. //设置变量
  17. ZeroMemory(&m_GameKind, sizeof(m_GameKind));
  18. return;
  19. }
  20. //////////////////////////////////////////////////////////////////////////////////
  21. //构造函数
  22. CGameNodeItem::CGameNodeItem()
  23. {
  24. //设置变量
  25. ZeroMemory(&m_GameNode, sizeof(m_GameNode));
  26. return;
  27. }
  28. //////////////////////////////////////////////////////////////////////////////////
  29. //构造函数
  30. CGameServerItem::CGameServerItem()
  31. {
  32. //设置变量
  33. ZeroMemory(&m_GameServer, sizeof(m_GameServer));
  34. ZeroMemory(&m_GameMatch, sizeof(m_GameMatch));
  35. ZeroMemory(m_ListLL, sizeof(LianLu) * MAX_TONGDAO);
  36. return;
  37. }
  38. //获取随机链路
  39. std::wstring CGameServerItem::GetRandom(DWORD dUserID, int iPaiMing, int iCount)
  40. {
  41. std::wstring cc = L"";
  42. CList<std::wstring> aa;
  43. for (size_t i = 0; i < MAX_TONGDAO; i++)
  44. {
  45. if (m_ListLL[i].iIsOk == 1)
  46. {
  47. std::wstring bb = m_ListLL[i].szIP;
  48. aa.AddTail(bb);
  49. }
  50. }
  51. if (aa.GetCount() == 0)
  52. {
  53. TCHAR szString[512] = TEXT("");
  54. ZeroMemory(szString, sizeof(TCHAR) * 512);
  55. _sntprintf(szString, CountArray(szString), TEXT("未发现有效通道。"));
  56. //提示消息
  57. CTraceService::TraceString(szString, TraceLevel_Warning);
  58. return cc;
  59. }
  60. int iNum = aa.GetCount();
  61. double dPaiMing = ((double)iPaiMing) / ((double)iCount) * ((double)iNum);
  62. int iKey = (int)dPaiMing;
  63. if (iKey > iNum) iKey = iNum;
  64. cc = aa.GetAt(aa.FindIndex(iKey));
  65. TCHAR szString[512] = TEXT("");
  66. ZeroMemory(szString, sizeof(TCHAR) * 512);
  67. _sntprintf(szString, CountArray(szString), TEXT("通道信息 总通道数->%d 排名:%d 最大排名:%d 取通道ID:%d")
  68. , aa.GetCount(), iPaiMing, iCount, iKey);
  69. aa.RemoveAll();
  70. //提示消息
  71. CTraceService::TraceString(szString, TraceLevel_Normal);
  72. return cc;
  73. }
  74. //更新链路状态
  75. bool CGameServerItem::SetLLStat(std::wstring szIp, int iStat, SYSTEMTIME Time)
  76. {
  77. bool bFind = false;
  78. for (size_t i = 0; i < MAX_TONGDAO; i++)
  79. {
  80. std::wstring test = m_ListLL[i].szIP;
  81. if (test == szIp)
  82. {
  83. m_ListLL[i].iIsOk = iStat;
  84. m_ListLL[i].SystemTimeConclude = Time;
  85. bFind = true;
  86. //break;
  87. }
  88. }
  89. if (bFind) return true;
  90. for (size_t i = 0; i < MAX_TONGDAO; i++)
  91. {
  92. std::wstring test = m_ListLL[i].szIP;
  93. if (test == _T(""))
  94. {
  95. StringCbCat(m_ListLL[i].szIP, 32, szIp.c_str());
  96. m_ListLL[i].iIsOk = iStat;
  97. m_ListLL[i].SystemTimeConclude = Time;
  98. break;
  99. }
  100. }
  101. return true;
  102. }
  103. //////////////////////////////////////////////////////////////////////////////////
  104. //构造函数
  105. CGamePageItem::CGamePageItem()
  106. {
  107. //设置变量
  108. ZeroMemory(&m_GamePage, sizeof(m_GamePage));
  109. return;
  110. }
  111. //////////////////////////////////////////////////////////////////////////////////
  112. //构造函数
  113. CServerListManager::CServerListManager()
  114. {
  115. //设置质数
  116. m_TypeItemMap.InitHashTable(PRIME_TYPE);
  117. m_KindItemMap.InitHashTable(PRIME_KIND);
  118. m_NodeItemMap.InitHashTable(PRIME_NODE);
  119. m_PageItemMap.InitHashTable(PRIME_PAGE);
  120. m_ServerItemMap.InitHashTable(PRIME_SERVER);
  121. return;
  122. }
  123. //析构函数
  124. CServerListManager::~CServerListManager()
  125. {
  126. //变量定义
  127. WORD wKey = 0;
  128. //删除种类
  129. CGameTypeItem * pGameTypeItem = NULL;
  130. POSITION Position = m_TypeItemMap.GetStartPosition();
  131. while (Position != NULL)
  132. {
  133. m_TypeItemMap.GetNextAssoc(Position, wKey, pGameTypeItem);
  134. SafeDelete(pGameTypeItem);
  135. }
  136. for (INT_PTR i = 0; i < m_TypeItemBuffer.GetCount(); i++)
  137. {
  138. pGameTypeItem = m_TypeItemBuffer[i];
  139. SafeDelete(pGameTypeItem);
  140. }
  141. m_TypeItemMap.RemoveAll();
  142. m_TypeItemBuffer.RemoveAll();
  143. //删除类型
  144. CGameKindItem * pGameKindItem = NULL;
  145. Position = m_KindItemMap.GetStartPosition();
  146. while (Position != NULL)
  147. {
  148. m_KindItemMap.GetNextAssoc(Position, wKey, pGameKindItem);
  149. SafeDelete(pGameKindItem);
  150. }
  151. for (INT_PTR i = 0; i < m_KindItemBuffer.GetCount(); i++)
  152. {
  153. pGameKindItem = m_KindItemBuffer[i];
  154. SafeDelete(pGameKindItem);
  155. }
  156. m_KindItemMap.RemoveAll();
  157. m_KindItemBuffer.RemoveAll();
  158. //删除节点
  159. CGameNodeItem * pGameNodeItem = NULL;
  160. Position = m_NodeItemMap.GetStartPosition();
  161. while (Position != NULL)
  162. {
  163. m_NodeItemMap.GetNextAssoc(Position, wKey, pGameNodeItem);
  164. SafeDelete(pGameNodeItem);
  165. }
  166. for (INT_PTR i = 0; i < m_NodeItemBuffer.GetCount(); i++)
  167. {
  168. pGameNodeItem = m_NodeItemBuffer[i];
  169. SafeDelete(pGameNodeItem);
  170. }
  171. m_NodeItemMap.RemoveAll();
  172. m_NodeItemBuffer.RemoveAll();
  173. //删除房间
  174. CGameServerItem * pGameServerItem = NULL;
  175. Position = m_ServerItemMap.GetStartPosition();
  176. while (Position != NULL)
  177. {
  178. m_ServerItemMap.GetNextAssoc(Position, wKey, pGameServerItem);
  179. SafeDelete(pGameServerItem);
  180. }
  181. for (INT_PTR i = 0; i < m_ServerItemBuffer.GetCount(); i++)
  182. {
  183. pGameServerItem = m_ServerItemBuffer[i];
  184. SafeDelete(pGameServerItem);
  185. }
  186. m_ServerItemMap.RemoveAll();
  187. m_ServerItemBuffer.RemoveAll();
  188. //删除定制
  189. CGamePageItem * pGamePageItem = NULL;
  190. Position = m_PageItemMap.GetStartPosition();
  191. while (Position != NULL)
  192. {
  193. m_PageItemMap.GetNextAssoc(Position, wKey, pGamePageItem);
  194. SafeDelete(pGamePageItem);
  195. }
  196. for (INT_PTR i = 0; i < m_PageItemBuffer.GetCount(); i++)
  197. {
  198. pGamePageItem = m_PageItemBuffer[i];
  199. SafeDelete(pGamePageItem);
  200. }
  201. m_PageItemMap.RemoveAll();
  202. m_PageItemBuffer.RemoveAll();
  203. return;
  204. }
  205. DWORD CServerListManager::GetGameServerCount()
  206. {
  207. DWORD dwRet = (DWORD)m_ServerItemMap.GetCount();
  208. return dwRet;
  209. }
  210. //重置列表
  211. VOID CServerListManager::ResetServerList()
  212. {
  213. //废弃列表
  214. DisuseKernelItem();
  215. DisuseServerItem();
  216. //清理列表
  217. CleanKernelItem();
  218. CleanServerItem();
  219. return;
  220. }
  221. //清理内核
  222. VOID CServerListManager::CleanKernelItem()
  223. {
  224. //变量定义
  225. POSITION PositionType = m_TypeItemMap.GetStartPosition();
  226. POSITION PositionKind = m_KindItemMap.GetStartPosition();
  227. POSITION PositionNode = m_NodeItemMap.GetStartPosition();
  228. POSITION PositionPage = m_PageItemMap.GetStartPosition();
  229. //清理种类
  230. while (PositionType != NULL)
  231. {
  232. //索引房间
  233. WORD wTypeID = 0;
  234. CGameTypeItem * pGameTypeItem = NULL;
  235. m_TypeItemMap.GetNextAssoc(PositionType, wTypeID, pGameTypeItem);
  236. //删除判断
  237. if (pGameTypeItem->m_bDisuse == true)
  238. {
  239. m_TypeItemMap.RemoveKey(wTypeID);
  240. m_TypeItemBuffer.Add(pGameTypeItem);
  241. }
  242. }
  243. //清理类型
  244. while (PositionKind != NULL)
  245. {
  246. //索引房间
  247. WORD wKindID = 0;
  248. CGameKindItem * pGameKindItem = NULL;
  249. m_KindItemMap.GetNextAssoc(PositionKind, wKindID, pGameKindItem);
  250. //删除判断
  251. if (pGameKindItem->m_bDisuse == true)
  252. {
  253. m_KindItemMap.RemoveKey(wKindID);
  254. m_KindItemBuffer.Add(pGameKindItem);
  255. }
  256. }
  257. //清理节点
  258. while (PositionNode != NULL)
  259. {
  260. //索引房间
  261. WORD wNodeID = 0;
  262. CGameNodeItem * pGameNodeItem = NULL;
  263. m_NodeItemMap.GetNextAssoc(PositionNode, wNodeID, pGameNodeItem);
  264. //删除判断
  265. if (pGameNodeItem->m_bDisuse == true)
  266. {
  267. m_NodeItemMap.RemoveKey(wNodeID);
  268. m_NodeItemBuffer.Add(pGameNodeItem);
  269. }
  270. }
  271. //清理定制
  272. while (PositionPage != NULL)
  273. {
  274. //索引房间
  275. WORD wPageID = 0;
  276. CGamePageItem * pGamePageItem = NULL;
  277. m_PageItemMap.GetNextAssoc(PositionPage, wPageID, pGamePageItem);
  278. //删除判断
  279. if (pGamePageItem->m_bDisuse == true)
  280. {
  281. m_PageItemMap.RemoveKey(wPageID);
  282. m_PageItemBuffer.Add(pGamePageItem);
  283. }
  284. }
  285. return;
  286. }
  287. //清理房间
  288. VOID CServerListManager::CleanServerItem()
  289. {
  290. //变量定义
  291. POSITION PositionServer = m_ServerItemMap.GetStartPosition();
  292. //删除房间
  293. while (PositionServer != NULL)
  294. {
  295. //索引房间
  296. WORD wServerID = 0;
  297. CGameServerItem * pGameServerItem = NULL;
  298. m_ServerItemMap.GetNextAssoc(PositionServer, wServerID, pGameServerItem);
  299. //删除判断
  300. if (pGameServerItem->m_bDisuse == true)
  301. {
  302. //删除数据
  303. m_ServerItemMap.RemoveKey(wServerID);
  304. m_ServerItemBuffer.Add(pGameServerItem);
  305. //设置人数
  306. CGameKindItem * pGameKindItem = NULL;
  307. if (m_KindItemMap.Lookup(pGameServerItem->m_GameServer.wKindID, pGameKindItem) == TRUE)
  308. {
  309. tagGameServer * pGameServer = &pGameServerItem->m_GameServer;
  310. pGameKindItem->m_GameKind.dwOnLineCount = __max(pGameKindItem->m_GameKind.dwOnLineCount - pGameServer->dwOnLineCount, 0);
  311. pGameKindItem->m_GameKind.dwFullCount = __max(pGameKindItem->m_GameKind.dwFullCount - pGameServer->dwFullCount, 0);
  312. }
  313. }
  314. }
  315. return;
  316. }
  317. //废弃内核
  318. VOID CServerListManager::DisuseKernelItem()
  319. {
  320. //变量定义
  321. WORD wKey = 0;
  322. DWORD dwKey = 0;
  323. //废弃种类
  324. CGameTypeItem * pGameTypeItem = NULL;
  325. POSITION Position = m_TypeItemMap.GetStartPosition();
  326. while (Position != NULL)
  327. {
  328. m_TypeItemMap.GetNextAssoc(Position, wKey, pGameTypeItem);
  329. pGameTypeItem->m_bDisuse = true;
  330. }
  331. //废弃类型
  332. CGameKindItem * pGameKindItem = NULL;
  333. Position = m_KindItemMap.GetStartPosition();
  334. while (Position != NULL)
  335. {
  336. m_KindItemMap.GetNextAssoc(Position, wKey, pGameKindItem);
  337. pGameKindItem->m_bDisuse = true;
  338. }
  339. //废弃节点
  340. CGameNodeItem * pGameNodeItem = NULL;
  341. Position = m_NodeItemMap.GetStartPosition();
  342. while (Position != NULL)
  343. {
  344. m_NodeItemMap.GetNextAssoc(Position, wKey, pGameNodeItem);
  345. pGameNodeItem->m_bDisuse = true;
  346. }
  347. //废弃定制
  348. CGamePageItem * pGamePageItem = NULL;
  349. Position = m_PageItemMap.GetStartPosition();
  350. while (Position != NULL)
  351. {
  352. m_PageItemMap.GetNextAssoc(Position, wKey, pGamePageItem);
  353. pGamePageItem->m_bDisuse = true;
  354. }
  355. return;
  356. }
  357. //废弃房间
  358. VOID CServerListManager::DisuseServerItem()
  359. {
  360. //变量定义
  361. WORD wKey = 0;
  362. CGameServerItem * pGameServerItem = NULL;
  363. //废弃房间
  364. POSITION Position = m_ServerItemMap.GetStartPosition();
  365. while (Position != NULL)
  366. {
  367. m_ServerItemMap.GetNextAssoc(Position, wKey, pGameServerItem);
  368. pGameServerItem->m_bDisuse = true;
  369. }
  370. return;
  371. }
  372. //统计人数
  373. DWORD CServerListManager::CollectOnlineInfo(bool bAndroid)
  374. {
  375. //变量定义
  376. DWORD dwOnLineCount = 0L;
  377. if (!bAndroid)
  378. {
  379. //变量定义
  380. WORD wKey = 0;
  381. CGameServerItem* pGameServerItem = NULL;
  382. POSITION Position = m_ServerItemMap.GetStartPosition();
  383. while (Position != NULL)
  384. {
  385. m_ServerItemMap.GetNextAssoc(Position, wKey, pGameServerItem);
  386. //统计人数
  387. if (pGameServerItem != NULL)
  388. {
  389. dwOnLineCount += pGameServerItem->m_GameServer.dwOnLineCount;
  390. }
  391. }
  392. ////人数
  393. //POSITION PositionKind = m_KindItemMap.GetStartPosition();
  394. ////统计人数
  395. //while (PositionKind != NULL)
  396. //{
  397. // //索引类型
  398. // WORD wKindID = 0;
  399. // CGameKindItem * pGameKindItem = NULL;
  400. // m_KindItemMap.GetNextAssoc(PositionKind, wKindID, pGameKindItem);
  401. // //统计人数
  402. // if (pGameKindItem != NULL)
  403. // {
  404. // dwOnLineCount += pGameKindItem->m_GameKind.dwOnLineCount;
  405. // }
  406. //}
  407. }
  408. else
  409. {
  410. //桌子数
  411. POSITION PositionKind = m_KindItemMap.GetStartPosition();
  412. //统计人数
  413. while (PositionKind != NULL)
  414. {
  415. //索引类型
  416. WORD wKindID = 0;
  417. CGameKindItem * pGameKindItem = NULL;
  418. m_KindItemMap.GetNextAssoc(PositionKind, wKindID, pGameKindItem);
  419. //统计人数
  420. if (pGameKindItem != NULL)
  421. {
  422. dwOnLineCount += pGameKindItem->m_GameKind.wTableCount;
  423. }
  424. }
  425. }
  426. return dwOnLineCount;
  427. }
  428. //类型在线
  429. DWORD CServerListManager::CollectOnlineInfo(WORD wKindID, bool bAndroid)
  430. {
  431. //变量定义
  432. DWORD dwOnLineCount = 0L;
  433. POSITION PositionServer = m_ServerItemMap.GetStartPosition();
  434. //枚举房间
  435. while (PositionServer != NULL)
  436. {
  437. //索引房间
  438. WORD wServerID = 0;
  439. CGameServerItem * pGameServerItem = NULL;
  440. m_ServerItemMap.GetNextAssoc(PositionServer, wServerID, pGameServerItem);
  441. //统计人数
  442. if (pGameServerItem->m_GameServer.wKindID == wKindID)
  443. {
  444. dwOnLineCount += pGameServerItem->m_GameServer.dwOnLineCount;
  445. }
  446. }
  447. return dwOnLineCount;
  448. }
  449. //插入种类
  450. bool CServerListManager::InsertGameType(tagGameType * pGameType)
  451. {
  452. //效验参数
  453. ASSERT(pGameType != NULL);
  454. if (pGameType == NULL) return false;
  455. //查找现存
  456. CGameTypeItem * pGameTypeItem = NULL;
  457. if (m_TypeItemMap.Lookup(pGameType->wTypeID, pGameTypeItem) == FALSE)
  458. {
  459. //创建对象
  460. try
  461. {
  462. INT_PTR nStroeCount = m_TypeItemBuffer.GetCount();
  463. if (nStroeCount > 0)
  464. {
  465. pGameTypeItem = m_TypeItemBuffer[nStroeCount - 1];
  466. m_TypeItemBuffer.RemoveAt(nStroeCount - 1);
  467. }
  468. else
  469. {
  470. pGameTypeItem = new CGameTypeItem;
  471. if (pGameTypeItem == NULL) return false;
  472. }
  473. }
  474. catch (...) { return false; }
  475. //设置变量
  476. ZeroMemory(pGameTypeItem, sizeof(CGameTypeItem));
  477. }
  478. //设置数据
  479. pGameTypeItem->m_bDisuse = false;
  480. CopyMemory(&pGameTypeItem->m_GameType, pGameType, sizeof(tagGameType));
  481. //设置索引
  482. m_TypeItemMap[pGameType->wTypeID] = pGameTypeItem;
  483. return true;
  484. }
  485. //插入类型
  486. bool CServerListManager::InsertGameKind(tagGameKind * pGameKind)
  487. {
  488. //效验参数
  489. ASSERT(pGameKind != NULL);
  490. if (pGameKind == NULL) return false;
  491. //查找现存
  492. CGameKindItem * pGameKindItem = NULL;
  493. if (m_KindItemMap.Lookup(pGameKind->wKindID, pGameKindItem) == FALSE)
  494. {
  495. //创建对象
  496. try
  497. {
  498. INT_PTR nStroeCount = m_KindItemBuffer.GetCount();
  499. if (nStroeCount > 0)
  500. {
  501. pGameKindItem = m_KindItemBuffer[nStroeCount - 1];
  502. m_KindItemBuffer.RemoveAt(nStroeCount - 1);
  503. }
  504. else
  505. {
  506. pGameKindItem = new CGameKindItem;
  507. if (pGameKindItem == NULL) return false;
  508. }
  509. }
  510. catch (...) { return false; }
  511. //设置变量
  512. ZeroMemory(pGameKindItem, sizeof(CGameKindItem));
  513. }
  514. //设置数据
  515. pGameKindItem->m_bDisuse = false;
  516. CopyMemory(&pGameKindItem->m_GameKind, pGameKind, sizeof(tagGameKind));
  517. //设置索引
  518. m_KindItemMap[pGameKind->wKindID] = pGameKindItem;
  519. return true;
  520. }
  521. //插入节点
  522. bool CServerListManager::InsertGameNode(tagGameNode * pGameNode)
  523. {
  524. //效验参数
  525. ASSERT(pGameNode != NULL);
  526. if (pGameNode == NULL) return false;
  527. //查找现存
  528. CGameNodeItem * pGameNodeItem = NULL;
  529. if (m_NodeItemMap.Lookup(pGameNode->wNodeID, pGameNodeItem) == FALSE)
  530. {
  531. //创建对象
  532. try
  533. {
  534. INT_PTR nStroeCount = m_NodeItemBuffer.GetCount();
  535. if (nStroeCount > 0)
  536. {
  537. pGameNodeItem = m_NodeItemBuffer[nStroeCount - 1];
  538. m_NodeItemBuffer.RemoveAt(nStroeCount - 1);
  539. }
  540. else
  541. {
  542. pGameNodeItem = new CGameNodeItem;
  543. if (pGameNodeItem == NULL) return false;
  544. }
  545. }
  546. catch (...) { return false; }
  547. //设置变量
  548. ZeroMemory(pGameNodeItem, sizeof(CGameNodeItem));
  549. }
  550. //插入数据
  551. pGameNodeItem->m_bDisuse = false;
  552. CopyMemory(&pGameNodeItem->m_GameNode, pGameNode, sizeof(tagGameNode));
  553. //设置索引
  554. m_NodeItemMap[pGameNode->wNodeID] = pGameNodeItem;
  555. return true;
  556. }
  557. //插入定制
  558. bool CServerListManager::InsertGamePage(tagGamePage * pGamePage)
  559. {
  560. //效验参数
  561. ASSERT(pGamePage != NULL);
  562. if (pGamePage == NULL) return false;
  563. //获取子项
  564. CGamePageItem * pGamePageItem = NULL;
  565. if (m_PageItemMap.Lookup(pGamePage->wPageID, pGamePageItem) == FALSE)
  566. {
  567. //创建对象
  568. try
  569. {
  570. INT_PTR nStroeCount = m_PageItemBuffer.GetCount();
  571. if (nStroeCount > 0)
  572. {
  573. pGamePageItem = m_PageItemBuffer[nStroeCount - 1];
  574. m_PageItemBuffer.RemoveAt(nStroeCount - 1);
  575. }
  576. else
  577. {
  578. pGamePageItem = new CGamePageItem;
  579. if (pGamePageItem == NULL) return false;
  580. }
  581. }
  582. catch (...) { return false; }
  583. //设置变量
  584. ZeroMemory(pGamePageItem, sizeof(CGamePageItem));
  585. }
  586. //设置数据
  587. pGamePageItem->m_bDisuse = false;
  588. CopyMemory(&pGamePageItem->m_GamePage, pGamePage, sizeof(tagGamePage));
  589. //设置索引
  590. m_PageItemMap[pGamePage->wPageID] = pGamePageItem;
  591. return true;
  592. }
  593. //插入房间
  594. bool CServerListManager::InsertGameServer(tagGameServer * pGameServer)
  595. {
  596. //效验参数
  597. ASSERT(pGameServer != NULL);
  598. if (pGameServer == NULL) return false;
  599. //查找房间
  600. WORD wKindID = 0;
  601. DWORD dwOnLineCount = 0L;
  602. DWORD dwMaxPlayer = 0L;
  603. CGameServerItem * pGameServerItem = NULL;
  604. //获取子项
  605. if (m_ServerItemMap.Lookup(pGameServer->wServerID, pGameServerItem) == FALSE)
  606. {
  607. //创建对象
  608. try
  609. {
  610. INT_PTR nStroeCount = m_ServerItemBuffer.GetCount();
  611. if (nStroeCount > 0)
  612. {
  613. pGameServerItem = m_ServerItemBuffer[nStroeCount - 1];
  614. m_ServerItemBuffer.RemoveAt(nStroeCount - 1);
  615. }
  616. else
  617. {
  618. pGameServerItem = new CGameServerItem;
  619. if (pGameServerItem == NULL) return false;
  620. }
  621. }
  622. catch (...) { return false; }
  623. //设置变量
  624. ZeroMemory(pGameServerItem, sizeof(CGameServerItem));
  625. }
  626. else
  627. {
  628. //保存变量
  629. wKindID = pGameServerItem->m_GameServer.wKindID;
  630. dwOnLineCount = pGameServerItem->m_GameServer.dwOnLineCount;
  631. dwMaxPlayer = pGameServerItem->m_GameServer.dwFullCount;
  632. }
  633. //设置数据
  634. pGameServerItem->m_bDisuse = false;
  635. CopyMemory(&pGameServerItem->m_GameServer, pGameServer, sizeof(tagGameServer));
  636. //设置人数
  637. if (wKindID != pGameServerItem->m_GameServer.wKindID)
  638. {
  639. //变量定义
  640. CGameKindItem * pGameKindItemLast = NULL;
  641. CGameKindItem * pGameKindItemCurrent = NULL;
  642. //历史人数
  643. if ((wKindID != 0) && (m_KindItemMap.Lookup(wKindID, pGameKindItemLast) == TRUE))
  644. {
  645. pGameKindItemLast->m_GameKind.dwOnLineCount -= dwOnLineCount;
  646. pGameKindItemLast->m_GameKind.dwFullCount -= dwMaxPlayer;
  647. }
  648. //当前人数
  649. if (m_KindItemMap.Lookup(pGameServer->wKindID, pGameKindItemCurrent) == TRUE)
  650. {
  651. pGameKindItemCurrent->m_GameKind.dwOnLineCount += pGameServer->dwOnLineCount;
  652. pGameKindItemCurrent->m_GameKind.dwFullCount += pGameServer->dwFullCount;
  653. }
  654. }
  655. else
  656. {
  657. //查找类型
  658. CGameKindItem * pGameKindItem = NULL;
  659. m_KindItemMap.Lookup(wKindID, pGameKindItem);
  660. //设置人数
  661. if (pGameKindItem != NULL)
  662. {
  663. pGameKindItem->m_GameKind.dwOnLineCount -= dwOnLineCount;
  664. pGameKindItem->m_GameKind.dwOnLineCount += pGameServer->dwOnLineCount;
  665. pGameKindItem->m_GameKind.dwFullCount -= dwMaxPlayer;
  666. pGameKindItem->m_GameKind.dwFullCount += pGameServer->dwFullCount;
  667. }
  668. }
  669. //设置索引
  670. m_ServerItemMap[pGameServer->wServerID] = pGameServerItem;
  671. return true;
  672. }
  673. //删除种类
  674. bool CServerListManager::DeleteGameType(WORD wTypeID)
  675. {
  676. //查找种类
  677. CGameTypeItem * pGameTypeItem = NULL;
  678. if (m_TypeItemMap.Lookup(wTypeID, pGameTypeItem) == FALSE) return false;
  679. //删除数据
  680. m_TypeItemMap.RemoveKey(wTypeID);
  681. m_TypeItemBuffer.Add(pGameTypeItem);
  682. return true;
  683. }
  684. //删除类型
  685. bool CServerListManager::DeleteGameKind(WORD wKindID)
  686. {
  687. //查找类型
  688. CGameKindItem * pGameKindItem = NULL;
  689. if (m_KindItemMap.Lookup(wKindID, pGameKindItem) == FALSE) return false;
  690. //删除数据
  691. m_KindItemMap.RemoveKey(wKindID);
  692. m_KindItemBuffer.Add(pGameKindItem);
  693. //设置变量
  694. ZeroMemory(pGameKindItem, sizeof(CGameKindItem));
  695. return true;
  696. }
  697. //删除节点
  698. bool CServerListManager::DeleteGameNode(WORD wNodeID)
  699. {
  700. //查找节点
  701. CGameNodeItem * pGameNodeItem = NULL;
  702. if (m_NodeItemMap.Lookup(wNodeID, pGameNodeItem) == FALSE) return false;
  703. //删除数据
  704. m_NodeItemMap.RemoveKey(wNodeID);
  705. m_NodeItemBuffer.Add(pGameNodeItem);
  706. //设置变量
  707. ZeroMemory(pGameNodeItem, sizeof(CGameNodeItem));
  708. return false;
  709. }
  710. //删除房间
  711. bool CServerListManager::DeleteGameServer(WORD wServerID)
  712. {
  713. //查找房间
  714. CGameServerItem * pGameServerItem = NULL;
  715. if (m_ServerItemMap.Lookup(wServerID, pGameServerItem) == FALSE) return false;
  716. //删除数据
  717. m_ServerItemMap.RemoveKey(wServerID);
  718. m_ServerItemBuffer.Add(pGameServerItem);
  719. //设置人数
  720. CGameKindItem * pGameKindItem = NULL;
  721. if (m_KindItemMap.Lookup(pGameServerItem->m_GameServer.wKindID, pGameKindItem) == TRUE)
  722. {
  723. tagGameServer * pGameServer = &pGameServerItem->m_GameServer;
  724. pGameKindItem->m_GameKind.dwOnLineCount = __max(pGameKindItem->m_GameKind.dwOnLineCount - pGameServer->dwOnLineCount, 0);
  725. pGameKindItem->m_GameKind.dwFullCount = __max(pGameKindItem->m_GameKind.dwFullCount - pGameServer->dwFullCount, 0);
  726. pGameKindItem->m_GameKind.wTableCount = __max(pGameKindItem->m_GameKind.wTableCount - pGameServer->wTableOnlineCount, 0);
  727. }
  728. return true;
  729. }
  730. //删除定制
  731. bool CServerListManager::DeleteGamePage(WORD wPageID)
  732. {
  733. //查找类型
  734. CGamePageItem * pGamePageItem = NULL;
  735. if (m_PageItemMap.Lookup(wPageID, pGamePageItem) == FALSE) return false;
  736. //删除数据
  737. m_PageItemMap.RemoveKey(wPageID);
  738. m_PageItemBuffer.Add(pGamePageItem);
  739. //设置变量
  740. ZeroMemory(pGamePageItem, sizeof(CGamePageItem));
  741. return true;
  742. }
  743. //枚举种类
  744. CGameTypeItem * CServerListManager::EmunGameTypeItem(POSITION & Position)
  745. {
  746. //变量定义
  747. WORD wKey = 0;
  748. CGameTypeItem * pGameTypeItem = NULL;
  749. //获取对象
  750. if (Position == NULL) Position = m_TypeItemMap.GetStartPosition();
  751. if (Position != NULL) m_TypeItemMap.GetNextAssoc(Position, wKey, pGameTypeItem);
  752. return pGameTypeItem;
  753. }
  754. //枚举类型
  755. CGameKindItem * CServerListManager::EmunGameKindItem(POSITION & Position)
  756. {
  757. //变量定义
  758. WORD wKey = 0;
  759. CGameKindItem * pGameKindItem = NULL;
  760. //获取对象
  761. if (Position == NULL) Position = m_KindItemMap.GetStartPosition();
  762. if (Position != NULL) m_KindItemMap.GetNextAssoc(Position, wKey, pGameKindItem);
  763. return pGameKindItem;
  764. }
  765. //枚举节点
  766. CGameNodeItem * CServerListManager::EmunGameNodeItem(POSITION & Position)
  767. {
  768. //变量定义
  769. WORD wKey = 0;
  770. CGameNodeItem * pGameNodeItem = NULL;
  771. //获取对象
  772. if (Position == NULL) Position = m_NodeItemMap.GetStartPosition();
  773. if (Position != NULL) m_NodeItemMap.GetNextAssoc(Position, wKey, pGameNodeItem);
  774. return pGameNodeItem;
  775. }
  776. //枚举房间
  777. CGameServerItem * CServerListManager::EmunGameServerItem(POSITION & Position)
  778. {
  779. //变量定义
  780. WORD wKey = 0;
  781. CGameServerItem * pGameServerItem = NULL;
  782. //获取对象
  783. if (Position == NULL) Position = m_ServerItemMap.GetStartPosition();
  784. if (Position != NULL) m_ServerItemMap.GetNextAssoc(Position, wKey, pGameServerItem);
  785. return pGameServerItem;
  786. }
  787. //枚举定制
  788. CGamePageItem * CServerListManager::EmunGamePageItem(POSITION & Position)
  789. {
  790. //变量定义
  791. WORD wKey = 0;
  792. CGamePageItem * pGamePageItem = NULL;
  793. //获取对象
  794. if (Position == NULL) Position = m_PageItemMap.GetStartPosition();
  795. if (Position != NULL) m_PageItemMap.GetNextAssoc(Position, wKey, pGamePageItem);
  796. return pGamePageItem;
  797. }
  798. //查找种类
  799. CGameTypeItem * CServerListManager::SearchGameType(WORD wTypeID)
  800. {
  801. CGameTypeItem * pGameTypeItem = NULL;
  802. m_TypeItemMap.Lookup(wTypeID, pGameTypeItem);
  803. return pGameTypeItem;
  804. }
  805. //查找类型
  806. CGameKindItem * CServerListManager::SearchGameKind(WORD wKindID)
  807. {
  808. CGameKindItem * pGameKindItem = NULL;
  809. m_KindItemMap.Lookup(wKindID, pGameKindItem);
  810. return pGameKindItem;
  811. }
  812. //查找节点
  813. CGameNodeItem * CServerListManager::SearchGameNode(WORD wNodeID)
  814. {
  815. CGameNodeItem * pGameNodeItem = NULL;
  816. m_NodeItemMap.Lookup(wNodeID, pGameNodeItem);
  817. return pGameNodeItem;
  818. }
  819. //查找房间
  820. CGameServerItem * CServerListManager::SearchGameServer(WORD wServerID)
  821. {
  822. CGameServerItem * pGameServerItem = NULL;
  823. m_ServerItemMap.Lookup(wServerID, pGameServerItem);
  824. return pGameServerItem;
  825. }
  826. //查找定制
  827. CGamePageItem * CServerListManager::SearchGamePage(WORD wPageID)
  828. {
  829. CGamePageItem * pGamePageItem = NULL;
  830. m_PageItemMap.Lookup(wPageID, pGamePageItem);
  831. return pGamePageItem;
  832. }
  833. //////////////////////////////////////////////////////////////////////////////////