诸暨麻将添加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.
 
 
 
 
 
 

1009 lines
26 KiB

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