诸暨麻将添加redis
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。
 
 
 
 
 
 

1163 行
45 KiB

  1. #include "StdAfx.h"
  2. #include "LockTimeMatch.h"
  3. #include "..\GameServer\DataBasePacket.h"
  4. ////////////////////////////////////////////////////////////////////////////////////////////////////////////
  5. #ifdef _DEBUG
  6. #define new DEBUG_NEW
  7. #undef THIS_FILE
  8. static char THIS_FILE[] = __FILE__;
  9. #endif
  10. ////////////////////////////////////////////////////////////////////////////////////////////////////////////
  11. #define INVALID_VALUE 0xFFFF //无效值
  12. //////////////////////////////////////////////////////////////////////////
  13. //时钟定义
  14. #define IDI_DISTRIBUTE_USER (IDI_MATCH_MODULE_START+100) //分配用户
  15. ////////////////////////////////////////////////////////////////////////////////////////////////////////////
  16. //构造函数
  17. CLockTimeMatch::CLockTimeMatch()
  18. {
  19. //状态变量
  20. m_MatchStatus = MatchStatus_Free;
  21. //比赛配置
  22. m_pMatchOption = NULL;
  23. m_pGameServiceOption = NULL;
  24. m_pGameServiceAttrib = NULL;
  25. //内核接口
  26. m_ppITableFrame = NULL;
  27. m_pITimerEngine = NULL;
  28. m_pIDataBaseEngine = NULL;
  29. m_pITCPNetworkEngineEvent = NULL;
  30. //服务接口
  31. m_pIGameServiceFrame = NULL;
  32. m_pIServerUserManager = NULL;
  33. m_pAndroidUserManager = NULL;
  34. }
  35. CLockTimeMatch::~CLockTimeMatch(void)
  36. {
  37. //释放资源
  38. SafeDeleteArray(m_ppITableFrame);
  39. //关闭定时器
  40. m_pITimerEngine->KillTimer(IDI_CHECK_END_MATCH);
  41. m_pITimerEngine->KillTimer(IDI_DISTRIBUTE_USER);
  42. //移除元素
  43. m_DistributeManage.RemoveAll();
  44. }
  45. //接口查询
  46. VOID* CLockTimeMatch::QueryInterface(REFGUID Guid, DWORD dwQueryVer)
  47. {
  48. QUERYINTERFACE(IGameMatchItem, Guid, dwQueryVer);
  49. QUERYINTERFACE(IMatchEventSink, Guid, dwQueryVer);
  50. QUERYINTERFACE(IServerUserItemSink, Guid, dwQueryVer);
  51. QUERYINTERFACE_IUNKNOWNEX(IGameMatchItem, Guid, dwQueryVer);
  52. return NULL;
  53. }
  54. //绑定桌子
  55. bool CLockTimeMatch::BindTableFrame(ITableFrame * pTableFrame, WORD wTableID)
  56. {
  57. if (pTableFrame == NULL || wTableID > m_pGameServiceOption->wTableCount)
  58. {
  59. ASSERT(false);
  60. return false;
  61. }
  62. //创建钩子
  63. CTableFrameHook * pTableFrameHook = new CTableFrameHook();
  64. pTableFrameHook->InitTableFrameHook(QUERY_OBJECT_PTR_INTERFACE(pTableFrame, IUnknownEx));
  65. pTableFrameHook->SetMatchEventSink(QUERY_OBJECT_PTR_INTERFACE(this, IUnknownEx));
  66. //设置接口
  67. pTableFrame->SetTableFrameHook(QUERY_OBJECT_PTR_INTERFACE(pTableFrameHook, IUnknownEx));
  68. m_ppITableFrame[wTableID] = pTableFrame;
  69. return true;
  70. }
  71. //初始化接口
  72. bool CLockTimeMatch::InitMatchInterface(tagMatchManagerParameter & MatchManagerParameter)
  73. {
  74. //服务配置
  75. m_pMatchOption = MatchManagerParameter.pGameMatchOption;
  76. m_pGameServiceOption = MatchManagerParameter.pGameServiceOption;
  77. m_pGameServiceAttrib = MatchManagerParameter.pGameServiceAttrib;
  78. //内核组件
  79. m_pITimerEngine = MatchManagerParameter.pITimerEngine;
  80. m_pIDataBaseEngine = MatchManagerParameter.pICorrespondManager;
  81. m_pITCPNetworkEngineEvent = MatchManagerParameter.pTCPNetworkEngine;
  82. //服务组件
  83. m_pIGameServiceFrame = MatchManagerParameter.pIMainServiceFrame;
  84. m_pIServerUserManager = MatchManagerParameter.pIServerUserManager;
  85. m_pAndroidUserManager = MatchManagerParameter.pIAndroidUserManager;
  86. m_pIServerUserItemSink = MatchManagerParameter.pIServerUserItemSink;
  87. //分组设置
  88. m_DistributeManage.SetDistributeRule(m_pGameServiceOption->cbDistributeRule);
  89. //创建桌子
  90. if (m_ppITableFrame == NULL)
  91. {
  92. m_ppITableFrame = new ITableFrame*[m_pGameServiceOption->wTableCount];
  93. }
  94. //开始间隔
  95. DWORD dwStartInterval = GetMatchStartInterval();
  96. if (dwStartInterval > 0)
  97. {
  98. //开始检测
  99. m_pITimerEngine->SetTimer(IDI_CHECK_START_MATCH, dwStartInterval * 1000L, TIMES_INFINITY, NULL);
  100. }
  101. return true;
  102. }
  103. //时间事件
  104. bool CLockTimeMatch::OnEventTimer(DWORD dwTimerID, WPARAM dwBindParameter)
  105. {
  106. switch (dwTimerID)
  107. {
  108. case IDI_DISTRIBUTE_USER: //分配用户
  109. {
  110. //执行分组
  111. PerformDistribute();
  112. return true;
  113. }
  114. case IDI_CHECK_START_MATCH: //开始比赛
  115. {
  116. //设置状态
  117. m_MatchStatus = MatchStatus_Playing;
  118. //发送状态
  119. BYTE cbMatchStatus = MS_MATCHING;
  120. m_pIGameServiceFrame->SendData(BG_ALL_CLIENT, MDM_GR_MATCH, SUB_GR_MATCH_STATUS, &cbMatchStatus, sizeof(cbMatchStatus));
  121. //关闭定时器
  122. m_pITimerEngine->KillTimer(IDI_CHECK_START_MATCH);
  123. //检测比赛结束
  124. m_pITimerEngine->SetTimer(IDI_CHECK_END_MATCH, 5000, TIMES_INFINITY, 0);
  125. //执行分组
  126. m_pITimerEngine->SetTimer(IDI_DISTRIBUTE_USER, m_pGameServiceOption->wDistributeTimeSpace * 1000, TIMES_INFINITY, NULL);
  127. //构造结构
  128. CMD_GR_Match_Num MatchNum;
  129. ZeroMemory(&MatchNum, sizeof(MatchNum));
  130. //设置变量
  131. MatchNum.dwWaitting = m_pIServerUserManager->GetUserItemCount();
  132. //发送消息
  133. m_pIGameServiceFrame->SendData(BG_ALL_CLIENT, MDM_GR_MATCH, SUB_GR_MATCH_NUM, &MatchNum, sizeof(MatchNum));
  134. return true;
  135. }
  136. case IDI_CHECK_END_MATCH: //结束比赛
  137. {
  138. //获取时间
  139. CTime CurTime = CTime::GetCurrentTime();
  140. SYSTEMTIME MatchEndTime = m_pMatchOption->MatchType.LockTime.MatchEndTime;
  141. //比赛完成
  142. if (CurTime.GetHour() * 3600 + CurTime.GetMinute() * 60 + CurTime.GetSecond() >=
  143. MatchEndTime.wHour * 3600 + MatchEndTime.wMinute * 60 + MatchEndTime.wSecond)
  144. {
  145. //关闭定时器
  146. m_pITimerEngine->KillTimer(IDI_CHECK_END_MATCH);
  147. m_pITimerEngine->KillTimer(IDI_DISTRIBUTE_USER);
  148. //设置状态
  149. m_MatchStatus = MatchStatus_End;
  150. //发送状态
  151. BYTE cbMatchStatus = MS_MATCHEND;
  152. m_pIGameServiceFrame->SendData(BG_ALL_CLIENT, MDM_GR_MATCH, SUB_GR_MATCH_STATUS, &cbMatchStatus, sizeof(cbMatchStatus));
  153. //解散游戏
  154. for (INT i = 0; i < m_pGameServiceOption->wTableCount; i++)
  155. {
  156. //获取对象
  157. ITableFrame * pITableFrame = m_ppITableFrame[i];
  158. ASSERT(pITableFrame != NULL);
  159. if (pITableFrame == NULL) continue;
  160. //解散游戏
  161. pITableFrame->DismissGame();
  162. }
  163. //比赛结束
  164. if (CurTime >= MatchEndTime)
  165. {
  166. //比赛结束
  167. DBR_GR_MatchOver MatchOver;
  168. ZeroMemory(&MatchOver, sizeof(MatchOver));
  169. //构造数据
  170. MatchOver.cbMatchType = MATCH_TYPE_LOCKTIME;
  171. MatchOver.dwMatchID = m_pMatchOption->dwMatchID;
  172. MatchOver.dwMatchNO = m_pMatchOption->dwMatchNO;
  173. MatchOver.wServerID = m_pGameServiceOption->wServerID;
  174. MatchOver.MatchEndTime = m_pMatchOption->MatchType.LockTime.MatchEndTime;
  175. MatchOver.MatchStartTime = m_pMatchOption->MatchType.LockTime.MatchStartTime;
  176. //投递请求
  177. m_pIDataBaseEngine->PostDataBaseRequest(0, DBR_GR_MATCH_OVER, 0, &MatchOver, sizeof(MatchOver));
  178. return true;
  179. }
  180. //发送结束消息
  181. TCHAR szMessage[128] = TEXT("今天的比赛到此结束,请您明天再来参加!");
  182. m_pIGameServiceFrame->SendGameMessage(szMessage, SMT_CLOSE_GAME);
  183. //比赛检测
  184. DWORD dwStartInterval = GetMatchStartInterval();
  185. if (dwStartInterval > 0)
  186. {
  187. m_pITimerEngine->SetTimer(IDI_CHECK_START_MATCH, dwStartInterval * 1000L, TIMES_INFINITY, NULL);
  188. }
  189. }
  190. return true;
  191. }
  192. }
  193. return true;
  194. }
  195. //数据库事件
  196. bool CLockTimeMatch::OnEventDataBase(WORD wRequestID, IServerUserItem * pIServerUserItem, VOID * pData, WORD wDataSize)
  197. {
  198. switch (wRequestID)
  199. {
  200. case DBO_GR_MATCH_RANK_LIST: //比赛排行
  201. {
  202. //参数校验
  203. ASSERT(wDataSize <= sizeof(DBO_GR_MatchRankList));
  204. if (wDataSize > sizeof(DBO_GR_MatchRankList)) return false;
  205. //提取数据
  206. DBO_GR_MatchRankList * pMatchRankList = (DBO_GR_MatchRankList*)pData;
  207. //变量定义
  208. bool bRewardUser = true;
  209. tagMatchRankInfo * pMatchRankInfo = NULL;
  210. IServerUserItem * pIRewardUserItem = NULL;
  211. //发放奖励
  212. for (WORD wIndex = 0; wIndex < pMatchRankList->wUserCount; wIndex++)
  213. {
  214. //查找玩家
  215. pMatchRankInfo = &pMatchRankList->MatchRankInfo[wIndex];
  216. pIRewardUserItem = m_pIServerUserManager->SearchUserItem(pMatchRankInfo->dwUserID);
  217. if (pIRewardUserItem == NULL || pIRewardUserItem->IsAndroidUser() == true) continue;
  218. //写入奖励
  219. WriteUserAward(pIRewardUserItem, pMatchRankInfo);
  220. //设置标识
  221. pIRewardUserItem->SetMatchData(&bRewardUser);
  222. }
  223. //在线用户
  224. WORD wUserIndex = 0;
  225. while (true)
  226. {
  227. pIRewardUserItem = m_pIServerUserManager->EnumUserItem(wUserIndex++);
  228. if (pIRewardUserItem == NULL) break;
  229. if (pIRewardUserItem->IsAndroidUser() == true) continue;
  230. if (pIRewardUserItem->GetMatchData() == &bRewardUser)
  231. {
  232. pIRewardUserItem->SetMatchData(NULL);
  233. continue;
  234. }
  235. //发送结束消息
  236. TCHAR szMessage[128] = TEXT("本次比赛到此结束,请您前往网站查看系统排名或移驾其他比赛房间参与比赛!");
  237. m_pIGameServiceFrame->SendGameMessage(pIRewardUserItem, szMessage, SMT_CHAT | SMT_EJECT | SMT_GLOBAL | SMT_CLOSE_GAME);
  238. }
  239. break;
  240. }
  241. case DBO_GR_MATCH_REWARD_RESULT: //奖励结果
  242. {
  243. //参数效验
  244. if (pIServerUserItem == NULL) return true;
  245. if (wDataSize > sizeof(DBR_GR_MatchRewardResult)) return false;
  246. //提取数据
  247. DBR_GR_MatchRewardResult * pMatchRewardResult = (DBR_GR_MatchRewardResult*)pData;
  248. //奖励成功
  249. if (pMatchRewardResult->bResultCode == true)
  250. {
  251. //构造结构
  252. CMD_GR_MatchGoldUpdate MatchGoldUpdate;
  253. //设置变量
  254. MatchGoldUpdate.lCurrGold = pMatchRewardResult->lCurrGold;
  255. MatchGoldUpdate.lCurrIngot = pMatchRewardResult->lCurrIngot;
  256. MatchGoldUpdate.dwCurrExprience = pMatchRewardResult->dwCurrExperience;
  257. //发送数据
  258. m_pIGameServiceFrame->SendData(pIServerUserItem, MDM_GR_MATCH, SUB_GR_MATCH_GOLDUPDATE, &MatchGoldUpdate, sizeof(MatchGoldUpdate));
  259. }
  260. break;
  261. }
  262. }
  263. return true;
  264. }
  265. //比赛事件
  266. bool CLockTimeMatch::OnEventSocketMatch(WORD wSubCmdID, VOID * pData, WORD wDataSize, IServerUserItem * pIServerUserItem, DWORD dwSocketID)
  267. {
  268. return true;
  269. }
  270. //用户积分
  271. bool CLockTimeMatch::OnEventUserItemScore(IServerUserItem * pIServerUserItem, BYTE cbReason)
  272. {
  273. //效验参数
  274. ASSERT(pIServerUserItem != NULL);
  275. if (pIServerUserItem == NULL) return false;
  276. //变量定义
  277. CMD_GR_UserScore UserScore;
  278. tagUserInfo * pUserInfo = pIServerUserItem->GetUserInfo();
  279. //构造数据
  280. UserScore.dwUserID = pUserInfo->dwUserID;
  281. UserScore.UserScore.dwWinCount = pUserInfo->dwWinCount;
  282. UserScore.UserScore.dwLostCount = pUserInfo->dwLostCount;
  283. UserScore.UserScore.dwDrawCount = pUserInfo->dwDrawCount;
  284. UserScore.UserScore.dwFleeCount = pUserInfo->dwFleeCount;
  285. UserScore.UserScore.dwExperience = pUserInfo->dwExperience;
  286. UserScore.UserScore.lLoveLiness = pUserInfo->lLoveLiness;
  287. //构造积分
  288. UserScore.UserScore.lGrade = pUserInfo->lGrade;
  289. UserScore.UserScore.lInsure = pUserInfo->lInsure;
  290. UserScore.UserScore.lIngot = 0;//pUserInfo->lIngot;
  291. //构造积分
  292. UserScore.UserScore.lScore = pUserInfo->lScore;
  293. UserScore.UserScore.lScore += pIServerUserItem->GetTrusteeScore();
  294. UserScore.UserScore.lScore += pIServerUserItem->GetFrozenedScore();
  295. //发送数据
  296. m_pIGameServiceFrame->SendData(BG_COMPUTER, MDM_GR_USER, SUB_GR_USER_SCORE, &UserScore, sizeof(UserScore));
  297. //变量定义
  298. CMD_GR_MobileUserScore MobileUserScore;
  299. //构造数据
  300. MobileUserScore.dwUserID = pUserInfo->dwUserID;
  301. MobileUserScore.UserScore.dwWinCount = pUserInfo->dwWinCount;
  302. MobileUserScore.UserScore.dwLostCount = pUserInfo->dwLostCount;
  303. MobileUserScore.UserScore.dwDrawCount = pUserInfo->dwDrawCount;
  304. MobileUserScore.UserScore.dwFleeCount = pUserInfo->dwFleeCount;
  305. MobileUserScore.UserScore.dwExperience = pUserInfo->dwExperience;
  306. //构造积分
  307. MobileUserScore.UserScore.lScore = pUserInfo->lScore;
  308. MobileUserScore.UserScore.lScore += pIServerUserItem->GetTrusteeScore();
  309. MobileUserScore.UserScore.lScore += pIServerUserItem->GetFrozenedScore();
  310. //发送数据
  311. m_pIGameServiceFrame->SendDataBatchToMobileUser(pIServerUserItem->GetTableID(), MDM_GR_USER, SUB_GR_USER_SCORE, &MobileUserScore, sizeof(MobileUserScore));
  312. //即时写分
  313. if ((CServerRule::IsImmediateWriteScore(m_pGameServiceOption->dwServerRule) == true) && (pIServerUserItem->IsVariation() == true))
  314. {
  315. //变量定义
  316. DBR_GR_WriteGameScore WriteGameScore;
  317. ZeroMemory(&WriteGameScore, sizeof(WriteGameScore));
  318. //用户信息
  319. WriteGameScore.dwUserID = pIServerUserItem->GetUserID();
  320. WriteGameScore.dwDBQuestID = pIServerUserItem->GetDBQuestID();
  321. WriteGameScore.dwClientAddr = pIServerUserItem->GetClientAddr();
  322. WriteGameScore.dwInoutIndex = pIServerUserItem->GetInoutIndex();
  323. //提取积分
  324. pIServerUserItem->DistillVariation(WriteGameScore.VariationInfo);
  325. //比赛信息
  326. WriteGameScore.dwMatchID = m_pMatchOption->dwMatchID;
  327. WriteGameScore.dwMatchNO = m_pMatchOption->dwMatchNO;
  328. //投递请求
  329. m_pIDataBaseEngine->PostDataBaseRequest(WriteGameScore.dwUserID, DBR_GR_WRITE_GAME_SCORE, 0L, &WriteGameScore, sizeof(WriteGameScore), TRUE);
  330. }
  331. return true;
  332. }
  333. //用户状态
  334. bool CLockTimeMatch::OnEventUserItemStatus(IServerUserItem * pIServerUserItem, WORD wOldTableID, WORD wOldChairID, bool bSendState)
  335. {
  336. if (m_pIServerUserItemSink != NULL)
  337. {
  338. return m_pIServerUserItemSink->OnEventUserItemStatus(pIServerUserItem, wOldTableID, wOldChairID);
  339. }
  340. return true;
  341. }
  342. //用户权限
  343. bool CLockTimeMatch::OnEventUserItemRight(IServerUserItem *pIServerUserItem, DWORD dwAddRight, DWORD dwRemoveRight, BYTE cbRightKind)
  344. {
  345. if (m_pIServerUserItemSink != NULL)
  346. {
  347. return m_pIServerUserItemSink->OnEventUserItemRight(pIServerUserItem, dwAddRight, dwRemoveRight, cbRightKind);
  348. }
  349. return true;
  350. }
  351. //用户登录
  352. bool CLockTimeMatch::OnEventUserLogon(IServerUserItem * pIServerUserItem)
  353. {
  354. //发送状态
  355. if (m_MatchStatus > MatchStatus_Free)
  356. {
  357. //发送状态
  358. BYTE cbMatchStatus = (m_MatchStatus == MatchStatus_Playing) ? MS_MATCHING : MS_MATCHEND;
  359. m_pIGameServiceFrame->SendData(pIServerUserItem, MDM_GR_MATCH, SUB_GR_MATCH_STATUS, &cbMatchStatus, sizeof(cbMatchStatus));
  360. //构造结构
  361. CMD_GR_Match_Num MatchNum;
  362. ZeroMemory(&MatchNum, sizeof(MatchNum));
  363. //设置变量
  364. MatchNum.dwWaitting = m_pIServerUserManager->GetUserItemCount();
  365. //发送消息
  366. m_pIGameServiceFrame->SendData(BG_ALL_CLIENT, MDM_GR_MATCH, SUB_GR_MATCH_NUM, &MatchNum, sizeof(MatchNum));
  367. }
  368. return true;
  369. }
  370. //用户登出
  371. bool CLockTimeMatch::OnEventUserLogout(IServerUserItem * pIServerUserItem)
  372. {
  373. //构造结构
  374. CMD_GR_Match_Num MatchNum;
  375. ZeroMemory(&MatchNum, sizeof(MatchNum));
  376. //设置变量
  377. MatchNum.dwWaitting = m_pIServerUserManager->GetUserItemCount();
  378. //发送消息
  379. m_pIGameServiceFrame->SendData(BG_ALL_CLIENT, MDM_GR_MATCH, SUB_GR_MATCH_NUM, &MatchNum, sizeof(MatchNum));
  380. return true;
  381. }
  382. //进入事件
  383. bool CLockTimeMatch::OnEventEnterMatch(DWORD dwSocketID, VOID* pData, DWORD dwUserIP, bool bIsMobile)
  384. {
  385. //判断时间
  386. TCHAR szDescribe[256];
  387. WORD wMessageType;
  388. if (VerifyMatchTime(szDescribe, CountArray(szDescribe), wMessageType) == false)
  389. {
  390. m_pIGameServiceFrame->SendRoomMessage(dwSocketID, szDescribe, wMessageType | SMT_GLOBAL, dwUserIP == 0);
  391. return true;
  392. }
  393. //手机用户
  394. if (bIsMobile == true)
  395. {
  396. //处理消息
  397. CMD_GR_LogonMobile * pLogonMobile = (CMD_GR_LogonMobile *)pData;
  398. pLogonMobile->szPassword[CountArray(pLogonMobile->szPassword) - 1] = 0;
  399. pLogonMobile->szMachineID[CountArray(pLogonMobile->szMachineID) - 1] = 0;
  400. //变量定义
  401. DBR_GR_LogonMobile LogonMobile;
  402. ZeroMemory(&LogonMobile, sizeof(LogonMobile));
  403. //构造数据
  404. LogonMobile.dwUserID = pLogonMobile->dwUserID;
  405. LogonMobile.dwClientAddr = dwUserIP;
  406. LogonMobile.dwMatchID = m_pMatchOption->dwMatchID;
  407. LogonMobile.dwMatchNO = m_pMatchOption->dwMatchNO;
  408. LogonMobile.cbDeviceType = pLogonMobile->cbDeviceType;
  409. LogonMobile.wBehaviorFlags = pLogonMobile->wBehaviorFlags;
  410. LogonMobile.wPageTableCount = pLogonMobile->wPageTableCount;
  411. lstrcpyn(LogonMobile.szPassword, pLogonMobile->szPassword, CountArray(LogonMobile.szPassword));
  412. lstrcpyn(LogonMobile.szMachineID, pLogonMobile->szMachineID, CountArray(LogonMobile.szMachineID));
  413. //投递请求
  414. m_pIDataBaseEngine->PostDataBaseRequest(LogonMobile.dwUserID, DBR_GR_LOGON_MOBILE, dwSocketID, &LogonMobile, sizeof(LogonMobile));
  415. }
  416. else
  417. {
  418. //处理消息
  419. CMD_GR_LogonUserID * pLogonUserID = (CMD_GR_LogonUserID *)pData;
  420. pLogonUserID->szPassword[CountArray(pLogonUserID->szPassword) - 1] = 0;
  421. pLogonUserID->szMachineID[CountArray(pLogonUserID->szMachineID) - 1] = 0;
  422. //变量定义
  423. DBR_GR_LogonUserID LogonUserID;
  424. ZeroMemory(&LogonUserID, sizeof(LogonUserID));
  425. //构造数据
  426. LogonUserID.dwClientAddr = dwUserIP;
  427. LogonUserID.dwUserID = pLogonUserID->dwUserID;
  428. LogonUserID.dwMatchID = m_pMatchOption->dwMatchID;
  429. LogonUserID.dwMatchNO = m_pMatchOption->dwMatchNO;
  430. lstrcpyn(LogonUserID.szPassword, pLogonUserID->szPassword, CountArray(LogonUserID.szPassword));
  431. lstrcpyn(LogonUserID.szMachineID, pLogonUserID->szMachineID, CountArray(LogonUserID.szMachineID));
  432. //投递请求
  433. m_pIDataBaseEngine->PostDataBaseRequest(LogonUserID.dwUserID, DBR_GR_LOGON_USERID, dwSocketID, &LogonUserID, sizeof(LogonUserID));
  434. }
  435. return true;
  436. }
  437. //用户参赛
  438. bool CLockTimeMatch::OnEventUserJoinMatch(IServerUserItem * pIServerUserItem, BYTE cbReason, DWORD dwSocketID)
  439. {
  440. //参数校验
  441. ASSERT(pIServerUserItem != NULL);
  442. if (pIServerUserItem == NULL) return false;
  443. //判断状态
  444. if (pIServerUserItem->GetUserStatus() != US_FREE || pIServerUserItem->GetTableID() != INVALID_TABLE)
  445. {
  446. return false;
  447. }
  448. //比赛未开始
  449. if (m_MatchStatus == MatchStatus_Free)
  450. {
  451. //发送消息
  452. m_pIGameServiceFrame->SendRoomMessage(pIServerUserItem, TEXT("比赛尚未开始,请稍后再来!"), SMT_EJECT);
  453. return true;
  454. }
  455. //比赛结束
  456. if (m_MatchStatus == MatchStatus_End)
  457. {
  458. //发送消息
  459. m_pIGameServiceFrame->SendRoomMessage(pIServerUserItem, TEXT("比赛已经结束,请您移驾至其他比赛房间参与比赛!"), SMT_EJECT);
  460. return true;
  461. }
  462. //加入分组
  463. if (InsertDistribute(pIServerUserItem) == false) return false;
  464. //发送成绩
  465. SendMatchUserScore(pIServerUserItem);
  466. //发送消息
  467. m_pIGameServiceFrame->SendRoomMessage(pIServerUserItem, TEXT("系统正在努力为您分配座位,请稍后。。。"), SMT_CHAT);
  468. return true;
  469. }
  470. //用户退赛
  471. bool CLockTimeMatch::OnEventUserQuitMatch(IServerUserItem * pIServerUserItem, BYTE cbReason, WORD *pBestRank, DWORD dwContextID)
  472. {
  473. ASSERT(pIServerUserItem != NULL);
  474. if (pIServerUserItem == NULL) return false;
  475. //移除分组
  476. m_DistributeManage.RemoveDistributeNode(pIServerUserItem);
  477. //移除同桌信息
  478. m_DistributeManage.RemoveUserSameTableInfo(pIServerUserItem->GetUserID());
  479. return true;
  480. }
  481. //游戏开始
  482. bool CLockTimeMatch::OnEventGameStart(ITableFrame *pITableFrame, WORD wChairCount)
  483. {
  484. //发送比赛信息
  485. SendTableUserMatchInfo(pITableFrame, INVALID_CHAIR);
  486. //构造数据包
  487. CMD_CM_SystemMessage SystemMessage;
  488. ZeroMemory(&SystemMessage, sizeof(SystemMessage));
  489. //变量定义
  490. IServerUserItem *pIServerUserItem = NULL;
  491. IServerUserItem *pITableUserItem = NULL;
  492. for (INT i = 0; i < pITableFrame->GetChairCount(); i++)
  493. {
  494. pIServerUserItem = pITableFrame->GetTableUserItem(i);
  495. ASSERT(pIServerUserItem != NULL);
  496. if (pIServerUserItem == NULL) continue;
  497. //构造提示消息
  498. TCHAR szMessage[64] = TEXT("");
  499. _sntprintf(szMessage, CountArray(szMessage), TEXT("本局比赛是您的第 %d 局。"), pIServerUserItem->GetUserPlayCount() + 1);
  500. lstrcpyn(SystemMessage.szString, szMessage, CountArray(SystemMessage.szString));
  501. SystemMessage.wLength = CountStringBuffer(SystemMessage.szString);
  502. SystemMessage.wType = SMT_CHAT;
  503. //发送提示数据
  504. WORD wSendSize = sizeof(SystemMessage)-sizeof(SystemMessage.szString) + SystemMessage.wLength*sizeof(TCHAR);
  505. pITableFrame->SendTableData(pIServerUserItem->GetChairID(), SUB_GF_SYSTEM_MESSAGE, &SystemMessage, wSendSize, MDM_GF_FRAME);
  506. //清除同桌
  507. ClearSameTableUser(pIServerUserItem->GetUserID());
  508. for (INT j = 0; j < pITableFrame->GetChairCount(); j++)
  509. {
  510. //获取用户
  511. pITableUserItem = pITableFrame->GetTableUserItem(j);
  512. if (pITableUserItem == NULL) continue;
  513. if (pITableUserItem == pIServerUserItem) continue;
  514. //插入同桌用户
  515. InserSameTableUser(pIServerUserItem->GetUserID(), pITableUserItem->GetUserID());
  516. }
  517. }
  518. return true;
  519. }
  520. //游戏结束
  521. bool CLockTimeMatch::OnEventGameEnd(ITableFrame *pITableFrame, WORD wChairID, IServerUserItem * pIServerUserItem, BYTE cbReason)
  522. {
  523. ASSERT(pITableFrame != NULL);
  524. if (pITableFrame == NULL) return false;
  525. //结束处理
  526. for (INT i = 0; i<pITableFrame->GetChairCount(); i++)
  527. {
  528. IServerUserItem *pIUserItem = pITableFrame->GetTableUserItem(i);
  529. ASSERT(pIUserItem != NULL);
  530. if (pIUserItem == NULL) continue;
  531. //正常结束
  532. if (cbReason != REMOVE_BY_ENDMATCH)
  533. {
  534. //达到淘汰线
  535. if (m_pMatchOption->MatchType.LockTime.lMatchCullScore>0 && pIUserItem->GetUserScore() < m_pMatchOption->MatchType.LockTime.lMatchCullScore)
  536. {
  537. //变量定义
  538. TCHAR szMessage[128] = TEXT("");
  539. _sntprintf(szMessage, CountArray(szMessage), TEXT("由于您的比赛币低于 %d,您将不能继续游戏!"), m_pMatchOption->MatchType.LockTime.lMatchCullScore);
  540. //发送消息
  541. m_pIGameServiceFrame->SendGameMessage(pIUserItem, szMessage, SMT_EJECT | SMT_CHAT);
  542. //构造结构
  543. DBR_GR_MatchEliminate MatchEliminate;
  544. MatchEliminate.cbMatchType = MATCH_TYPE_LOCKTIME;
  545. MatchEliminate.dwMatchID = m_pMatchOption->dwMatchID;
  546. MatchEliminate.dwMatchNO = m_pMatchOption->dwMatchNO;
  547. MatchEliminate.dwUserID = pIUserItem->GetUserID();
  548. //投递请求
  549. m_pIDataBaseEngine->PostDataBaseRequest(0, DBR_GR_MATCH_ELIMINATE, 0, &MatchEliminate, sizeof(MatchEliminate));
  550. //发送数据
  551. m_pIGameServiceFrame->SendData(pIUserItem, MDM_GR_MATCH, SUB_GR_MATCH_ELIMINATE, NULL, 0);
  552. continue;
  553. }
  554. //插入分组
  555. if (InsertDistribute(pIUserItem) == true)
  556. {
  557. m_pIGameServiceFrame->SendGameMessage(pIUserItem, TEXT("本局比赛结束,系统正在努力为您分配座位,请稍后..."), SMT_CHAT | SMT_TABLE_ROLL);
  558. }
  559. //完成局数
  560. if (pIUserItem->GetUserPlayCount() - pIUserItem->GetUserInfo()->dwFleeCount == m_pMatchOption->MatchType.LockTime.wMatchPlayCount)
  561. {
  562. TCHAR szMessage[128] = TEXT("");
  563. _sntprintf(szMessage, CountArray(szMessage), TEXT("您已完成%d局比赛,可以继续当前比赛或选择退出等待本次比赛活动结束后排名!"), m_pMatchOption->MatchType.LockTime.wMatchPlayCount);
  564. m_pIGameServiceFrame->SendGameMessage(pIUserItem, szMessage, SMT_CHAT | SMT_TABLE_ROLL);
  565. }
  566. }
  567. }
  568. return true;
  569. }
  570. //用户坐下
  571. bool CLockTimeMatch::OnActionUserSitDown(WORD wTableID, WORD wChairID, IServerUserItem * pIServerUserItem, bool bLookonUser)
  572. {
  573. return true;
  574. }
  575. //用户起立
  576. bool CLockTimeMatch::OnActionUserStandUp(WORD wTableID, WORD wChairID, IServerUserItem * pIServerUserItem, bool bLookonUser)
  577. {
  578. //移除分组
  579. return RemoveDistribute(pIServerUserItem);
  580. }
  581. //用户同意
  582. bool CLockTimeMatch::OnActionUserOnReady(WORD wTableID, WORD wChairID, IServerUserItem * pIServerUserItem, VOID * pData, WORD wDataSize)
  583. {
  584. return true;
  585. }
  586. //参赛权限
  587. bool CLockTimeMatch::VerifyUserEnterMatch(IServerUserItem * pIServerUserItem)
  588. {
  589. ASSERT(pIServerUserItem != NULL);
  590. if (pIServerUserItem == NULL) return false;
  591. //机器人不受限制
  592. if (pIServerUserItem->IsAndroidUser() == true)
  593. return true;
  594. //变量定义
  595. WORD wMessageType;
  596. TCHAR szMessage[128] = TEXT("");
  597. //结束时间已到
  598. if (VerifyMatchTime(szMessage, CountArray(szMessage), wMessageType) == false)
  599. {
  600. //发送消息
  601. m_pIGameServiceFrame->SendRoomMessage(pIServerUserItem, szMessage, wMessageType);
  602. return false;
  603. }
  604. //达到淘汰线
  605. if (m_pMatchOption->MatchType.LockTime.lMatchCullScore > 0 && pIServerUserItem->GetUserScore() < m_pMatchOption->MatchType.LockTime.lMatchCullScore)
  606. {
  607. _sntprintf(szMessage, CountArray(szMessage), TEXT("由于您的比赛币低于 %d,您将不能继续游戏!"), m_pMatchOption->MatchType.LockTime.lMatchCullScore);
  608. //发送消息
  609. if (pIServerUserItem->GetTableID() == INVALID_TABLE)
  610. {
  611. m_pIGameServiceFrame->SendRoomMessage(pIServerUserItem, szMessage, SMT_EJECT | SMT_CHAT);
  612. }
  613. else
  614. {
  615. m_pIGameServiceFrame->SendGameMessage(pIServerUserItem, szMessage, SMT_EJECT | SMT_CHAT);
  616. }
  617. return false;
  618. }
  619. return true;
  620. }
  621. //开始间隔
  622. DWORD CLockTimeMatch::GetMatchStartInterval()
  623. {
  624. //获取时间
  625. CTime CurTime = CTime::GetCurrentTime();
  626. CTime MatchStartTime(m_pMatchOption->MatchType.LockTime.MatchStartTime);
  627. CTime MatchEndTime(m_pMatchOption->MatchType.LockTime.MatchEndTime);
  628. //变量定义
  629. DWORD dwTimeInterval = 1;
  630. DWORD dwCurrStamp, dwStartStamp, dwEndStamp;
  631. //比赛未开始
  632. if (CurTime < MatchStartTime)
  633. {
  634. CTimeSpan TimeSpan = MatchStartTime - CurTime;
  635. dwTimeInterval = TimeSpan.GetTotalSeconds();
  636. }
  637. //比赛已结束
  638. if (CurTime >= MatchEndTime) dwTimeInterval = 0;
  639. //计算时间
  640. dwCurrStamp = CurTime.GetHour() * 3600 + CurTime.GetMinute() * 60 + CurTime.GetSecond();
  641. dwStartStamp = m_pMatchOption->MatchType.LockTime.MatchStartTime.wHour * 3600 + m_pMatchOption->MatchType.LockTime.MatchStartTime.wMinute * 60 + m_pMatchOption->MatchType.LockTime.MatchStartTime.wSecond;
  642. dwEndStamp = m_pMatchOption->MatchType.LockTime.MatchEndTime.wHour * 3600 + m_pMatchOption->MatchType.LockTime.MatchEndTime.wMinute * 60 + m_pMatchOption->MatchType.LockTime.MatchEndTime.wSecond;
  643. //比赛未开始
  644. if (dwCurrStamp < dwStartStamp)
  645. {
  646. dwTimeInterval = dwStartStamp - dwCurrStamp;
  647. }
  648. //比赛已结束
  649. if (dwCurrStamp >= dwEndStamp)
  650. {
  651. dwTimeInterval = 24 * 3600 - (dwCurrStamp - dwStartStamp);
  652. }
  653. return dwTimeInterval;
  654. }
  655. //分配用户
  656. bool CLockTimeMatch::PerformDistribute()
  657. {
  658. //状态判断
  659. if (m_MatchStatus != MatchStatus_Playing) return true;
  660. //人数校验
  661. if (m_DistributeManage.GetCount() < m_pGameServiceOption->wMinDistributeUser) return false;
  662. //分配用户
  663. while (true)
  664. {
  665. //变量定义
  666. CDistributeInfoArray DistributeInfoArray;
  667. //获取用户
  668. //WORD wRandCount = __max(m_pGameServiceOption->wMaxDistributeUser-m_pGameServiceOption->wMinPartakeGameUser+1,1);
  669. WORD wChairCount = m_pGameServiceAttrib->wChairCount/*+rand()%wRandCount*/;
  670. WORD wDistributeCount = m_DistributeManage.PerformDistribute(DistributeInfoArray, wChairCount);
  671. if (wDistributeCount < wChairCount/*m_pGameServiceOption->wMinPartakeGameUser*/) break;
  672. //寻找位置
  673. ITableFrame * pICurrTableFrame = NULL;
  674. for (WORD i = 0; i < m_pGameServiceOption->wTableCount; i++)
  675. {
  676. //获取对象
  677. ASSERT(m_ppITableFrame[i] != NULL);
  678. ITableFrame * pITableFrame = m_ppITableFrame[i];
  679. //状态判断
  680. if (pITableFrame->GetNullChairCount() == pITableFrame->GetChairCount())
  681. {
  682. pICurrTableFrame = pITableFrame;
  683. break;
  684. }
  685. }
  686. //桌子判断
  687. if (pICurrTableFrame == NULL) break;
  688. //玩家坐下
  689. bool bSitSuccess = true;
  690. INT_PTR nSitFailedIndex = INVALID_CHAIR;
  691. for (INT_PTR nIndex = 0; nIndex < DistributeInfoArray.GetCount(); nIndex++)
  692. {
  693. //变量定义
  694. WORD wChairID = INVALID_CHAIR;
  695. //椅子搜索
  696. for (WORD i = 0; i < pICurrTableFrame->GetChairCount(); i++)
  697. {
  698. if (pICurrTableFrame->GetTableUserItem(i) == NULL)
  699. {
  700. wChairID = i;
  701. break;
  702. }
  703. }
  704. //分配用户
  705. if (wChairID != INVALID_CHAIR)
  706. {
  707. //获取用户
  708. IServerUserItem * pIServerUserItem = DistributeInfoArray[nIndex].pIServerUserItem;
  709. //用户起立
  710. if (pIServerUserItem->GetTableID() != INVALID_TABLE)
  711. {
  712. WORD wTableID = pIServerUserItem->GetTableID();
  713. ITableFrame * pITableFrame = m_ppITableFrame[wTableID];
  714. pITableFrame->PerformStandUpAction(pIServerUserItem);
  715. }
  716. //用户坐下
  717. if (pICurrTableFrame->PerformSitDownAction(wChairID, pIServerUserItem) == false)
  718. {
  719. bSitSuccess = false;
  720. nSitFailedIndex = nIndex;
  721. break;
  722. }
  723. }
  724. }
  725. //坐下结果
  726. if (bSitSuccess)
  727. {
  728. //移除结点
  729. while (DistributeInfoArray.GetCount() > 0)
  730. {
  731. m_DistributeManage.RemoveDistributeNode((tagDistributeNode *)DistributeInfoArray[0].pPertainNode);
  732. DistributeInfoArray.RemoveAt(0);
  733. }
  734. }
  735. else
  736. {
  737. for (INT_PTR nIndex = 0; nIndex < DistributeInfoArray.GetCount(); nIndex++)
  738. {
  739. if (nSitFailedIndex == nIndex)
  740. {
  741. m_DistributeManage.RemoveDistributeNode((tagDistributeNode *)DistributeInfoArray[nIndex].pPertainNode);
  742. }
  743. else
  744. {
  745. //用户起立
  746. if (DistributeInfoArray[nIndex].pIServerUserItem->GetTableID() != INVALID_TABLE)
  747. {
  748. WORD wTableID = DistributeInfoArray[nIndex].pIServerUserItem->GetTableID();
  749. m_ppITableFrame[wTableID]->PerformStandUpAction(DistributeInfoArray[nIndex].pIServerUserItem);
  750. }
  751. }
  752. }
  753. }
  754. }
  755. return true;
  756. }
  757. //插入用户
  758. bool CLockTimeMatch::InsertDistribute(IServerUserItem * pIServerUserItem)
  759. {
  760. //效验参数
  761. ASSERT(pIServerUserItem != NULL);
  762. if (pIServerUserItem == NULL) return false;
  763. //比赛状态
  764. if (m_MatchStatus != MatchStatus_Playing) return false;
  765. //状态判断
  766. ASSERT(pIServerUserItem->GetUserStatus() < US_PLAYING);
  767. if (pIServerUserItem->GetUserStatus() >= US_PLAYING) return false;
  768. //参赛校验
  769. if (VerifyUserEnterMatch(pIServerUserItem) == false) return false;
  770. //变量定义
  771. tagDistributeInfo DistributeInfo;
  772. ZeroMemory(&DistributeInfo, sizeof(DistributeInfo));
  773. //设置变量
  774. DistributeInfo.pPertainNode = NULL;
  775. DistributeInfo.dwInsertStamp = (DWORD)time(NULL);
  776. DistributeInfo.pIServerUserItem = pIServerUserItem;
  777. //插入节点
  778. if (m_DistributeManage.InsertDistributeNode(DistributeInfo) == false)
  779. {
  780. return pIServerUserItem->IsAndroidUser() ? false : true;
  781. }
  782. return true;
  783. }
  784. //清除玩家
  785. void CLockTimeMatch::ClearSameTableUser(DWORD dwUserID)
  786. {
  787. //变量定义
  788. tagSameTableInfo * pSameTableInfo = m_DistributeManage.GetUserSameTableInfo(dwUserID);
  789. if (pSameTableInfo != NULL)
  790. {
  791. pSameTableInfo->wPlayerCount = 0;
  792. ZeroMemory(pSameTableInfo->wPlayerIDSet, sizeof(pSameTableInfo->wPlayerIDSet));
  793. }
  794. }
  795. //插入用户
  796. void CLockTimeMatch::InserSameTableUser(DWORD dwUserID, DWORD dwTableUserID)
  797. {
  798. //变量定义
  799. tagSameTableInfo * pSameTableInfo = m_DistributeManage.GetUserSameTableInfo(dwUserID);
  800. if (pSameTableInfo != NULL)
  801. {
  802. //添加用户
  803. pSameTableInfo->wPlayerIDSet[pSameTableInfo->wPlayerCount++] = dwTableUserID;
  804. }
  805. return;
  806. }
  807. //事件校验
  808. bool CLockTimeMatch::VerifyMatchTime(LPTSTR pszMessage, WORD wMaxCount, WORD & wMessageType)
  809. {
  810. //变量定义
  811. CTime CurTime = CTime::GetCurrentTime();
  812. CTime MatchStartTime(m_pMatchOption->MatchType.LockTime.MatchStartTime);
  813. CTime MatchEndTime(m_pMatchOption->MatchType.LockTime.MatchEndTime);
  814. //设置类型
  815. wMessageType = SMT_EJECT | SMT_CHAT;
  816. ////比赛未开始
  817. //if(CurTime<MatchStartTime)
  818. //{
  819. // wMessageType |= SMT_CLOSE_ROOM;
  820. // _sntprintf(pszMessage,wMaxCount,TEXT("比赛尚未开始,请您于%d年%d月%d日-%d时%d分%d秒前来参加比赛!"),MatchStartTime.GetYear(),MatchStartTime.GetMonth(),MatchStartTime.GetDay(),MatchStartTime.GetHour(),MatchStartTime.GetMinute(),MatchStartTime.GetSecond());
  821. // return false;
  822. //}
  823. //比赛已结束
  824. if (CurTime >= MatchEndTime)
  825. {
  826. wMessageType |= SMT_CLOSE_ROOM | SMT_CLOSE_GAME;
  827. _sntprintf(pszMessage, wMaxCount, TEXT("比赛已经结束,请您移驾至其他比赛房间参与比赛吧!"));
  828. return false;
  829. }
  830. ////比赛未开始
  831. //if(CurTime.GetHour()*3600+CurTime.GetMinute()*60+CurTime.GetSecond()<
  832. // m_pMatchOption->MatchType.LockTime.MatchStartTime.wHour*3600+m_pMatchOption->MatchType.LockTime.MatchStartTime.wMinute*60+m_pMatchOption->MatchType.LockTime.MatchStartTime.wSecond)
  833. //{
  834. // wMessageType |= SMT_CLOSE_ROOM|SMT_CLOSE_GAME;
  835. // _sntprintf(pszMessage,wMaxCount,TEXT("今天的比赛尚未开始,请您于%d时%d分%d秒前来参加比赛!"),MatchStartTime.GetHour(),MatchStartTime.GetMinute(),MatchStartTime.GetSecond());
  836. // return false;
  837. //}
  838. //比赛已结束
  839. if (CurTime.GetHour() * 3600 + CurTime.GetMinute() * 60 + CurTime.GetSecond() >= m_pMatchOption->MatchType.LockTime.MatchEndTime.wHour * 3600 + m_pMatchOption->MatchType.LockTime.MatchEndTime.wMinute * 60 + m_pMatchOption->MatchType.LockTime.MatchEndTime.wSecond)
  840. {
  841. wMessageType |= SMT_CLOSE_ROOM | SMT_CLOSE_GAME;
  842. _sntprintf(pszMessage, wMaxCount, TEXT("今天的比赛已经结束,请您于明天%d时%d分%d秒前来参加比赛!"), MatchStartTime.GetHour(), MatchStartTime.GetMinute(), MatchStartTime.GetSecond());
  843. return false;
  844. }
  845. return true;
  846. }
  847. //发送用户分数
  848. bool CLockTimeMatch::SendMatchUserScore(IServerUserItem * pIServerUserItem)
  849. {
  850. //发送数据
  851. CMD_GR_UserScore UserScore;
  852. ZeroMemory(&UserScore, sizeof(UserScore));
  853. tagUserInfo * pUserInfo = pIServerUserItem->GetUserInfo();
  854. //构造数据
  855. UserScore.dwUserID = pUserInfo->dwUserID;
  856. UserScore.UserScore.dwWinCount = pUserInfo->dwWinCount;
  857. UserScore.UserScore.dwLostCount = pUserInfo->dwLostCount;
  858. UserScore.UserScore.dwDrawCount = pUserInfo->dwDrawCount;
  859. UserScore.UserScore.dwFleeCount = pUserInfo->dwFleeCount;
  860. UserScore.UserScore.dwExperience = pUserInfo->dwExperience;
  861. UserScore.UserScore.lLoveLiness = pUserInfo->lLoveLiness;
  862. //构造积分
  863. UserScore.UserScore.lGrade = pUserInfo->lGrade;
  864. UserScore.UserScore.lInsure = pUserInfo->lInsure;
  865. UserScore.UserScore.lScore = pUserInfo->lScore;
  866. UserScore.UserScore.lIngot = 0;// pUserInfo->lIngot;
  867. return m_pIGameServiceFrame->SendData(BG_ALL_CLIENT, MDM_GR_USER, SUB_GR_USER_SCORE, &UserScore, sizeof(UserScore));
  868. }
  869. //移除玩家
  870. bool CLockTimeMatch::RemoveDistribute(IServerUserItem * pIServerUserItem)
  871. {
  872. //验证参数
  873. ASSERT(pIServerUserItem != NULL);
  874. if (pIServerUserItem == NULL) return false;
  875. //移除用户
  876. m_DistributeManage.RemoveDistributeNode(pIServerUserItem);
  877. return true;
  878. }
  879. //发送比赛信息
  880. void CLockTimeMatch::SendTableUserMatchInfo(ITableFrame *pITableFrame, WORD wChairID)
  881. {
  882. //验证参数
  883. ASSERT(pITableFrame != NULL);
  884. if (pITableFrame == NULL) return;
  885. //构造数据
  886. CMD_GR_Match_Info MatchInfo;
  887. ZeroMemory(&MatchInfo, sizeof(MatchInfo));
  888. //设置标题
  889. _sntprintf(MatchInfo.szTitle[0], CountArray(MatchInfo.szTitle[0]), TEXT("积分方式:累计积分"));
  890. _sntprintf(MatchInfo.szTitle[1], CountArray(MatchInfo.szTitle[1]), TEXT("游戏基数:%d"), m_pMatchOption->MatchType.LockTime.lMatchInitScore);
  891. _sntprintf(MatchInfo.szTitle[2], CountArray(MatchInfo.szTitle[2]), TEXT("局制名称:定时开赛"));
  892. for (WORD i = 0; i < pITableFrame->GetChairCount(); i++)
  893. {
  894. //获取用户
  895. if (wChairID != INVALID_CHAIR && wChairID != i) continue;
  896. IServerUserItem *pIServerUserItem = pITableFrame->GetTableUserItem(i);
  897. if (pIServerUserItem == NULL) continue;
  898. //设置局数
  899. MatchInfo.wGameCount = (WORD)pIServerUserItem->GetUserPlayCount() + 1;
  900. //发送数据
  901. if (pIServerUserItem->IsAndroidUser() == false)
  902. {
  903. pITableFrame->SendTableData(i, SUB_GR_MATCH_INFO, &MatchInfo, sizeof(MatchInfo), MDM_GF_FRAME);
  904. }
  905. }
  906. return;
  907. }
  908. //写入奖励
  909. bool CLockTimeMatch::WriteUserAward(IServerUserItem *pIServerUserItem, tagMatchRankInfo * pMatchRankInfo)
  910. {
  911. //参数效验
  912. ASSERT(pIServerUserItem != NULL && pMatchRankInfo != NULL);
  913. if (pIServerUserItem == NULL || pMatchRankInfo == NULL) return false;
  914. //变量定义
  915. CMD_GR_MatchResult MatchResult;
  916. ZeroMemory(&MatchResult, sizeof(MatchResult));
  917. //比赛奖励
  918. MatchResult.lGold = pMatchRankInfo->lRewardGold;
  919. MatchResult.dwIngot = pMatchRankInfo->dwRewardIngot;
  920. MatchResult.dwExperience = pMatchRankInfo->dwRewardExperience;
  921. //获奖提示
  922. _sntprintf(MatchResult.szDescribe, CountArray(MatchResult.szDescribe), TEXT("%s, 恭喜您在%s中获得第%d名,奖励如下:"),
  923. pIServerUserItem->GetNickName(), m_pMatchOption->szMatchName, pMatchRankInfo->wRankID);
  924. //更新用户信息
  925. tagUserInfo * pUserInfo = pIServerUserItem->GetUserInfo();
  926. //pUserInfo->lIngot = 0;//pMatchRankInfo->dwRewardIngot;
  927. pUserInfo->dwExperience += pMatchRankInfo->dwRewardExperience;
  928. OnEventUserItemScore(pIServerUserItem, 0);
  929. //发送数据
  930. if (pIServerUserItem->IsAndroidUser() == false)
  931. {
  932. m_pIGameServiceFrame->SendData(pIServerUserItem, MDM_GF_FRAME, SUB_GR_MATCH_RESULT, &MatchResult, sizeof(MatchResult));
  933. }
  934. //写入记录
  935. if (m_pIDataBaseEngine != NULL)
  936. {
  937. //变量定义
  938. DBR_GR_MatchReward MatchReward;
  939. ZeroMemory(&MatchReward, sizeof(MatchReward));
  940. //构造结构
  941. MatchReward.dwUserID = pIServerUserItem->GetUserID();
  942. MatchReward.lRewardGold = pMatchRankInfo->lRewardGold;
  943. MatchReward.dwRewardIngot = pMatchRankInfo->dwRewardIngot;
  944. MatchReward.dwRewardExperience = pMatchRankInfo->dwRewardExperience;
  945. MatchReward.dwClientAddr = pIServerUserItem->GetClientAddr();
  946. //投递数据
  947. m_pIDataBaseEngine->PostDataBaseRequest(MatchReward.dwUserID, DBR_GR_MATCH_REWARD, 0, &MatchReward, sizeof(MatchReward));
  948. }
  949. return true;
  950. }
  951. ////////////////////////////////////////////////////////////////////////////////////////////////////////////