#include "StdAfx.h" #include "ImmediateMatch.h" #include "..\GameServer\DataBasePacket.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif //////////////////////////////////////////////////////////////////////////////////////////////////////////// #define INVALID_VALUE 0xFFFF //无效值 ////////////////////////////////////////////////////////////////////////// //时钟定义 #define IDI_DISTRIBUTE_USER (IDI_MATCH_MODULE_START+100) //分配用户 //////////////////////////////////////////////////////////////////////////////////////////////////////////// //构造函数 CImmediateMatch::CImmediateMatch() { //比赛配置 m_pMatchOption = NULL; m_pGameServiceOption = NULL; m_pGameServiceAttrib = NULL; //设置指针 m_ppITableFrame = NULL; m_pCurMatchGroup = NULL; //内核接口 m_pITimerEngine = NULL; m_pIDataBaseEngine = NULL; m_pITCPNetworkEngineEvent = NULL; //服务接口 m_pIGameServiceFrame = NULL; m_pIServerUserManager = NULL; m_pAndroidUserManager = NULL; m_pIServerUserItemSink = NULL; } CImmediateMatch::~CImmediateMatch(void) { SafeDeleteArray(m_ppITableFrame); m_LoopTimer.RemoveAll(); SafeDelete(m_pCurMatchGroup); m_MatchGroup.Append(m_OverMatchGroup); for (int i = 0; iSetTimer(IDI_CHECK_OVER_MATCH, 60000L, TIMES_INFINITY, 0); m_pITimerEngine->SetTimer(IDI_DELETE_OVER_MATCH, 6000, TIMES_INFINITY, 0); //#ifdef _DEBUG // m_pITimerEngine->SetTimer(IDI_ANDROID_SIGNUP,1000,TIMES_INFINITY,0); //#else // m_pITimerEngine->SetTimer(IDI_ANDROID_SIGNUP,3000,TIMES_INFINITY,0); //#endif InsertNullTable(); } //绑定桌子 bool CImmediateMatch::BindTableFrame(ITableFrame * pTableFrame, WORD wTableID) { if (pTableFrame == NULL || wTableID>m_pGameServiceOption->wTableCount) { ASSERT(false); return false; } //创建钩子 CTableFrameHook * pTableFrameHook = new CTableFrameHook(); pTableFrameHook->InitTableFrameHook(QUERY_OBJECT_PTR_INTERFACE(pTableFrame, IUnknownEx)); pTableFrameHook->SetMatchEventSink(QUERY_OBJECT_PTR_INTERFACE(this, IUnknownEx)); //设置接口 pTableFrame->SetTableFrameHook(QUERY_OBJECT_PTR_INTERFACE(pTableFrameHook, IUnknownEx)); m_ppITableFrame[wTableID] = pTableFrame; return true; } //初始化接口 bool CImmediateMatch::InitMatchInterface(tagMatchManagerParameter & MatchManagerParameter) { //服务配置 m_pMatchOption = MatchManagerParameter.pGameMatchOption; m_pGameServiceOption = MatchManagerParameter.pGameServiceOption; m_pGameServiceAttrib = MatchManagerParameter.pGameServiceAttrib; //内核组件 m_pITimerEngine = MatchManagerParameter.pITimerEngine; m_pIDataBaseEngine = MatchManagerParameter.pICorrespondManager; m_pITCPNetworkEngineEvent = MatchManagerParameter.pTCPNetworkEngine; //服务组件 m_pIGameServiceFrame = MatchManagerParameter.pIMainServiceFrame; m_pIServerUserManager = MatchManagerParameter.pIServerUserManager; m_pAndroidUserManager = MatchManagerParameter.pIAndroidUserManager; m_pIServerUserItemSink = MatchManagerParameter.pIServerUserItemSink; //创建桌子数组 CImmediateGroup::m_wChairCount = m_pGameServiceAttrib->wChairCount; if (m_ppITableFrame == NULL) { m_ppITableFrame = new ITableFrame*[m_pGameServiceOption->wTableCount]; } return true; } //时间事件 bool CImmediateMatch::OnEventTimer(DWORD dwTimerID, WPARAM dwBindParameter) { if (dwTimerID >= IDI_GROUP_TIMER_START) { for (INT_PTR i = m_MatchGroup.GetCount() - 1; i >= 0; i--) { //查看是哪场比赛的定时器 if (m_MatchGroup[i]->m_LoopTimer == ((dwTimerID - IDI_GROUP_TIMER_START) / 10)) { m_MatchGroup[i]->OnTimeMessage(dwTimerID - (m_MatchGroup[i]->m_LoopTimer * 10), dwBindParameter); } } return true; } switch (dwTimerID) { case IDI_CHECK_OVER_MATCH: { //定时检测一下 那些比赛人数不够被卡的问题 for (INT_PTR i = m_MatchGroup.GetCount() - 1; i >= 0; i--) { //参赛用户小于椅子数量 就要结束 m_MatchGroup[i]->CheckMatchUser(); } return true; } case IDI_DELETE_OVER_MATCH: { for (int i = 0; m_OverMatchGroup.GetCount(); i++) { CImmediateGroup * pOverMatch = m_OverMatchGroup[i]; m_OverMatchGroup.RemoveAt(i--); SafeDelete(pOverMatch); } return true; } } return true; } //数据库事件 bool CImmediateMatch::OnEventDataBase(WORD wRequestID, IServerUserItem * pIServerUserItem, VOID * pData, WORD wDataSize) { switch (wRequestID) { case DBO_GR_MATCH_SIGNUP_RESULT: //报名结果 { //参数效验 if (pIServerUserItem == NULL) return true; if (wDataSize>sizeof(DBO_GR_MatchSingupResult)) return false; //提取数据 DBO_GR_MatchSingupResult * pMatchSignupResult = (DBO_GR_MatchSingupResult*)pData; //报名失败 if (pMatchSignupResult->bResultCode == false) { m_pIGameServiceFrame->SendRoomMessage(pIServerUserItem, pMatchSignupResult->szDescribeString, SMT_EJECT); return true; } //加入比赛 if (m_pCurMatchGroup->OnUserSignUpMatch(pIServerUserItem) == false) { SendRoomMessage(pIServerUserItem, TEXT("报名失败"), SMT_CHAT); return false; } //报名成功 m_OnMatchUserItem.Add(pIServerUserItem); SendMatchInfo(NULL); if (m_pIGameServiceFrame != NULL) { SendRoomMessage(pIServerUserItem, TEXT("恭喜,报名成功,请等待系统为您安排座位!"), SMT_CHAT); } //金币更新 if (pIServerUserItem->IsAndroidUser() == false) { //构造结构 CMD_GR_MatchGoldUpdate MatchGoldUpdate; //设置变量 MatchGoldUpdate.lCurrGold = pMatchSignupResult->lCurrGold; MatchGoldUpdate.lCurrIngot = pMatchSignupResult->lCurrIngot; MatchGoldUpdate.dwCurrExprience = pIServerUserItem->GetUserInfo()->dwExperience; //发送数据 return SendData(pIServerUserItem, MDM_GR_MATCH, SUB_GR_MATCH_GOLDUPDATE, &MatchGoldUpdate, sizeof(MatchGoldUpdate)); } break; } case DBO_GR_MATCH_UNSIGNUP_RESULT: //退赛结果 { //参数效验 if (pIServerUserItem == NULL) return true; if (wDataSize>sizeof(DBO_GR_MatchSingupResult)) return false; //提取数据 DBO_GR_MatchSingupResult * pMatchSignupResult = (DBO_GR_MatchSingupResult*)pData; //退费失败 if (pMatchSignupResult->bResultCode == false) { m_pIGameServiceFrame->SendRoomMessage(pIServerUserItem, pMatchSignupResult->szDescribeString, SMT_EJECT); return true; } //设置状态 pIServerUserItem->SetSignUpStatus(MatchStatus_Null); //变量定义 LPCTSTR pszMatchFeeType[] = { TEXT("游戏币"), TEXT("元宝") }; if (m_pMatchOption->cbMatchFeeTypelMatchFee, pszMatchFeeType[m_pMatchOption->cbMatchFeeType]); m_pIGameServiceFrame->SendRoomMessage(pIServerUserItem, szDescribe, SMT_EJECT); } //金币更新 if (pIServerUserItem->IsAndroidUser() == false) { //构造结构 CMD_GR_MatchGoldUpdate MatchGoldUpdate; //设置变量 MatchGoldUpdate.lCurrGold = pMatchSignupResult->lCurrGold; MatchGoldUpdate.lCurrIngot = pMatchSignupResult->lCurrIngot; MatchGoldUpdate.dwCurrExprience = pIServerUserItem->GetUserInfo()->dwExperience; //发送数据 return SendData(pIServerUserItem, MDM_GR_MATCH, SUB_GR_MATCH_GOLDUPDATE, &MatchGoldUpdate, sizeof(MatchGoldUpdate)); } break; } case DBO_GR_MATCH_RANK_LIST: //比赛排行 { //参数校验 ASSERT(wDataSize <= sizeof(DBO_GR_MatchRankList)); if (wDataSize>sizeof(DBO_GR_MatchRankList)) return false; //提取数据 DBO_GR_MatchRankList * pMatchRankList = (DBO_GR_MatchRankList*)pData; //变量定义 IServerUserItem * pIRewardUserItem = NULL; tagMatchRankInfo * pMatchRankInfo = NULL; //发放奖励 for (WORD wIndex = 0; wIndexwUserCount; wIndex++) { //查找玩家 pMatchRankInfo = &pMatchRankList->MatchRankInfo[wIndex]; pIRewardUserItem = m_pIServerUserManager->SearchUserItem(pMatchRankInfo->dwUserID); if (pIRewardUserItem == NULL || pIRewardUserItem->IsAndroidUser() == true) continue; //写入奖励 WriteUserAward(pIRewardUserItem, pMatchRankInfo); } //变量定义 CImmediateGroup * pImmediateGroup = NULL; //查找分组 for (int i = 0; im_dwMatchNO == pMatchRankList->dwMatchNO) { pImmediateGroup = m_MatchGroup[i]; if (pImmediateGroup != NULL) { //全部起立 pImmediateGroup->RearrangeUserSeat(); //发送可报名状态 BYTE cbMatchStatus = MatchStatus_Null; SendGroupData(MDM_GR_MATCH, SUB_GR_MATCH_STATUS, &cbMatchStatus, sizeof(cbMatchStatus), pImmediateGroup); //还原编号 m_LoopTimer.Add(pImmediateGroup->m_LoopTimer); //参赛玩家退赛 POSITION pos = pImmediateGroup->m_OnMatchUserMap.GetStartPosition(); IServerUserItem *pITempUserItem = NULL; DWORD dwUserID = 0; WORD wQuitUserCount = 0; WORD wMatchUserCount = (WORD)pImmediateGroup->m_OnMatchUserMap.GetCount(); while (pos != NULL) { pImmediateGroup->m_OnMatchUserMap.GetNextAssoc(pos, dwUserID, pITempUserItem); if (pITempUserItem != NULL) { pITempUserItem->SetSignUpStatus(MatchStatus_Null); if (true == OnEventUserQuitMatch(pITempUserItem, 0)) wQuitUserCount++; //比赛结束后代打玩家未返回,则踢出房间 bool bAndroidUser = pITempUserItem->IsAndroidUser(); bool bTrusteeUser = pITempUserItem->IsTrusteeUser(); bool bClientReady = pITempUserItem->IsClientReady(); if (bAndroidUser == false && bTrusteeUser == true && bClientReady == false) { //离开桌子 WORD wTableID = pITempUserItem->GetTableID(); if (wTableID != INVALID_TABLE) { //状态判断 ASSERT(pITempUserItem->GetUserStatus() != US_PLAYING); SendGameMessage(pITempUserItem, TEXT(""), SMT_CLOSE_GAME); //查找桌子并弹起 for (int m = 0; mm_MatchTableArray.GetCount(); m++) { if (pITempUserItem->GetTableID() == pImmediateGroup->m_MatchTableArray[m]->wTableID) { pImmediateGroup->m_MatchTableArray[m]->pTableFrame->PerformStandUpAction(pITempUserItem); break; } } } //离开房间 if (pITempUserItem->GetBindIndex() == INVALID_WORD) { pITempUserItem->SetUserStatus(US_NULL, INVALID_TABLE, INVALID_CHAIR); } } } } //校验退赛结果 ASSERT(wQuitUserCount == wMatchUserCount); if (wQuitUserCount != wMatchUserCount) { CTraceService::TraceString(TEXT("比赛结束后,退赛人数异常"), TraceLevel_Exception); } //回收全部桌子 for (int j = 0; pImmediateGroup->m_MatchTableArray.GetCount();) { tagTableFrameInfo* pTempTable = pImmediateGroup->m_MatchTableArray[j]; pImmediateGroup->m_MatchTableArray.RemoveAt(j); SafeDelete(pTempTable); } } //移除对象 m_MatchGroup.RemoveAt(i); m_OverMatchGroup.Add(pImmediateGroup); break; } } break; } case DBO_GR_MATCH_REWARD_RESULT: //奖励结果 { //参数效验 if (pIServerUserItem == NULL) return true; if (wDataSize>sizeof(DBR_GR_MatchRewardResult)) return false; //提取数据 DBR_GR_MatchRewardResult * pMatchRewardResult = (DBR_GR_MatchRewardResult*)pData; //奖励成功 if (pMatchRewardResult->bResultCode == true) { //构造结构 CMD_GR_MatchGoldUpdate MatchGoldUpdate; //设置变量 MatchGoldUpdate.lCurrGold = pMatchRewardResult->lCurrGold; MatchGoldUpdate.lCurrIngot = pMatchRewardResult->lCurrIngot; MatchGoldUpdate.dwCurrExprience = pMatchRewardResult->dwCurrExperience; //发送数据 SendData(pIServerUserItem, MDM_GR_MATCH, SUB_GR_MATCH_GOLDUPDATE, &MatchGoldUpdate, sizeof(MatchGoldUpdate)); } break; } } return true; } //命令消息 bool CImmediateMatch::OnEventSocketMatch(WORD wSubCmdID, VOID * pData, WORD wDataSize, IServerUserItem * pIServerUserItem, DWORD dwSocketID) { switch (wSubCmdID) { case SUB_GR_MATCH_FEE: //比赛费用 { //参数效验 ASSERT(wDataSize == sizeof(SCORE)); if (wDataSize != sizeof(SCORE)) return false; //提取数据 SCORE lMatchFee = *(SCORE*)pData; if (lMatchFee != m_pMatchOption->lMatchFee)return false; //变量定义 DBR_GR_MatchSignup MatchSignup; ZeroMemory(&MatchSignup, sizeof(MatchSignup)); //构造结构 MatchSignup.dwUserID = pIServerUserItem->GetUserID(); MatchSignup.lMatchFee = m_pMatchOption->lMatchFee; MatchSignup.dwInoutIndex = pIServerUserItem->GetInoutIndex(); MatchSignup.dwClientAddr = pIServerUserItem->GetClientAddr(); MatchSignup.dwMatchID = m_pMatchOption->dwMatchID; MatchSignup.dwMatchNO = m_pCurMatchGroup->m_dwMatchNO; lstrcpyn(MatchSignup.szMachineID, pIServerUserItem->GetMachineID(), CountArray(MatchSignup.szMachineID)); //投递数据 m_pIDataBaseEngine->PostDataBaseRequest(MatchSignup.dwUserID, DBR_GR_MATCH_SIGNUP, dwSocketID, &MatchSignup, sizeof(MatchSignup)); return true; } case SUB_GR_LEAVE_MATCH: //退出比赛 { //参数效验 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; OnEventUserQuitMatch(pIServerUserItem, 0, 0, dwSocketID); return true; } } return true; } //用户登录 bool CImmediateMatch::OnEventUserLogon(IServerUserItem * pIServerUserItem) { return SendMatchInfo(pIServerUserItem); } //用户登出 bool CImmediateMatch::OnEventUserLogout(IServerUserItem * pIServerUserItem) { return true; } //进入事件 bool CImmediateMatch::OnEventEnterMatch(DWORD dwSocketID, VOID* pData, DWORD dwUserIP, bool bIsMobile) { //手机用户 if (bIsMobile == true) { //处理消息 CMD_GR_LogonMobile * pLogonMobile = (CMD_GR_LogonMobile *)pData; pLogonMobile->szPassword[CountArray(pLogonMobile->szPassword) - 1] = 0; pLogonMobile->szMachineID[CountArray(pLogonMobile->szMachineID) - 1] = 0; //变量定义 DBR_GR_LogonMobile LogonMobile; ZeroMemory(&LogonMobile, sizeof(LogonMobile)); //构造数据 LogonMobile.dwUserID = pLogonMobile->dwUserID; LogonMobile.dwClientAddr = dwUserIP; LogonMobile.dwMatchID = m_pMatchOption->dwMatchID; LogonMobile.dwMatchNO = m_pMatchOption->dwMatchNO; LogonMobile.cbDeviceType = pLogonMobile->cbDeviceType; LogonMobile.wBehaviorFlags = pLogonMobile->wBehaviorFlags; LogonMobile.wPageTableCount = pLogonMobile->wPageTableCount; lstrcpyn(LogonMobile.szPassword, pLogonMobile->szPassword, CountArray(LogonMobile.szPassword)); lstrcpyn(LogonMobile.szMachineID, pLogonMobile->szMachineID, CountArray(LogonMobile.szMachineID)); //投递请求 m_pIDataBaseEngine->PostDataBaseRequest(LogonMobile.dwUserID, DBR_GR_LOGON_MOBILE, dwSocketID, &LogonMobile, sizeof(LogonMobile)); } else { //处理消息 CMD_GR_LogonUserID * pLogonUserID = (CMD_GR_LogonUserID *)pData; pLogonUserID->szPassword[CountArray(pLogonUserID->szPassword) - 1] = 0; pLogonUserID->szMachineID[CountArray(pLogonUserID->szMachineID) - 1] = 0; //变量定义 DBR_GR_LogonUserID LogonUserID; ZeroMemory(&LogonUserID, sizeof(LogonUserID)); //构造数据 LogonUserID.dwClientAddr = dwUserIP; LogonUserID.dwUserID = pLogonUserID->dwUserID; LogonUserID.dwMatchID = m_pMatchOption->dwMatchID; LogonUserID.dwMatchNO = m_pMatchOption->dwMatchNO; lstrcpyn(LogonUserID.szPassword, pLogonUserID->szPassword, CountArray(LogonUserID.szPassword)); lstrcpyn(LogonUserID.szMachineID, pLogonUserID->szMachineID, CountArray(LogonUserID.szMachineID)); //投递请求 m_pIDataBaseEngine->PostDataBaseRequest(LogonUserID.dwUserID, DBR_GR_LOGON_USERID, dwSocketID, &LogonUserID, sizeof(LogonUserID)); } return true; } //用户参赛 bool CImmediateMatch::OnEventUserJoinMatch(IServerUserItem * pIServerUserItem, BYTE cbReason, DWORD dwSocketID) { ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) { CTraceService::TraceString(TEXT("用户指针为空!"), TraceLevel_Warning); return true; } if (CServerRule::IsForfendRoomEnter(m_pGameServiceOption->dwServerRule)) { SendRoomMessage(pIServerUserItem, TEXT("抱歉,由于系统维护,该房间禁止用户报名比赛!。"), SMT_CHAT | SMT_EJECT); return true; } WORD wTableCount = GetNullTable(); if (wTableCountMatchType.Immediate.wStartUserCount / CImmediateGroup::m_wChairCount) { CString str; str.Format(TEXT("抱歉,当前桌子不够请等待。还差 %d 张桌子可以报名"), m_pMatchOption->MatchType.Immediate.wStartUserCount / CImmediateGroup::m_wChairCount - wTableCount); SendRoomMessage(pIServerUserItem, str, SMT_CHAT); return true; } if (m_pCurMatchGroup == NULL || m_pCurMatchGroup->m_enMatchStatus == MatchStatus_Wait) { SendRoomMessage(pIServerUserItem, TEXT("抱歉,该房间参赛人数已满,请稍后再报名或者进入另一房间比赛。"), SMT_CHAT); return true; } INT_PTR dwUserCount = m_OnMatchUserItem.GetCount(); for (INT_PTR i = 0; iGetUserID() == pIServerUserItem->GetUserID()) { SendRoomMessage(pIServerUserItem, TEXT("您已经成功报名,不能重复报名!"), SMT_CHAT | SMT_EJECT); return true; } } if (m_LoopTimer.GetCount() == 0) { SendRoomMessage(pIServerUserItem, TEXT("抱歉,比赛编号不够请稍等。"), SMT_CHAT); return true; } if (pIServerUserItem->GetUserStatus() != US_FREE || pIServerUserItem->GetTableID() != INVALID_TABLE) { SendRoomMessage(pIServerUserItem, TEXT("对不起,您当前的状态不允许参加比赛!"), SMT_CHAT); return true; } if (m_pMatchOption->MatchType.Immediate.dwInitalScore == 0 && pIServerUserItem->GetUserScore()MatchType.Immediate.dwInitalBase*m_pMatchOption->MatchType.Immediate.wMinEnterGold + m_pMatchOption->lMatchFee) { TCHAR szMsg[256] = TEXT(""); _sntprintf(szMsg, CountArray(szMsg), TEXT("对不起,您当前的金币低于了%d,不能参加比赛!"), m_pMatchOption->MatchType.Immediate.dwInitalBase*m_pMatchOption->MatchType.Immediate.wMinEnterGold + m_pMatchOption->lMatchFee); SendRoomMessage(pIServerUserItem, szMsg, SMT_CHAT | SMT_EJECT); return true; } //真人扣报名费 if (m_pMatchOption->lMatchFee>0 && pIServerUserItem->IsAndroidUser() == false) { ASSERT(m_pIGameServiceFrame != NULL); if (m_pIGameServiceFrame == NULL) { CTraceService::TraceString(TEXT("服务框架指针为空!"), TraceLevel_Warning); return true; } //构造结构 CMD_GR_Match_Fee MatchFee; MatchFee.lMatchFee = m_pMatchOption->lMatchFee; //构造提示 if (MatchFee.lMatchFee>0) { //变量定义 LPCTSTR pszMatchFeeType[] = { TEXT("游戏币"), TEXT("元宝") }; if (m_pMatchOption->cbMatchFeeTypelMatchFee, pszMatchFeeType[m_pMatchOption->cbMatchFeeType]); } } //发送消息 WORD wDataSize = sizeof(MatchFee)-sizeof(MatchFee.szNotifyContent); wDataSize += CountStringBuffer(MatchFee.szNotifyContent); m_pIGameServiceFrame->SendData(pIServerUserItem, MDM_GR_MATCH, SUB_GR_MATCH_FEE, &MatchFee, wDataSize); return true; } //机器人报名 if (m_pMatchOption->lMatchFee == 0 || pIServerUserItem->IsAndroidUser() == true) { //机器数判断 if (pIServerUserItem->IsAndroidUser() == true && (m_pCurMatchGroup->m_wAndroidUserCount >= m_pMatchOption->MatchType.Immediate.wAndroidUserCount)) { return true; } return OnEventSocketMatch(SUB_GR_MATCH_FEE, &m_pMatchOption->lMatchFee, sizeof(SCORE), pIServerUserItem, dwSocketID); } //报名成功 m_OnMatchUserItem.Add(pIServerUserItem); SendMatchInfo(NULL); if (m_pIGameServiceFrame != NULL) { SCORE lScore = SCORE(m_pMatchOption->lMatchFee)*-1; /*if(m_pMatchOption->MatchType.Immediate.dwInitalScore==0) { pIServerUserItem->GetUserInfo()->lScore+=lScore; m_pIServerUserItemSink->OnEventUserItemScore(pIServerUserItem,SCORE_REASON_MATCH_FEE); }*/ SendRoomMessage(pIServerUserItem, TEXT("恭喜,报名成功,请等待系统为您安排座位!"), SMT_CHAT); } return true; } //用户退赛 bool CImmediateMatch::OnEventUserQuitMatch(IServerUserItem * pIServerUserItem, BYTE cbReason, WORD *pBestRank, DWORD dwContextID) { ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; //正在游戏状态 if (pIServerUserItem->GetUserStatus() >= US_PLAYING) { return true; } //正在比赛阶段 BYTE cbUserEnlist = pIServerUserItem->GetSignUpStatus(); if (cbUserEnlist == MS_MATCHING) { return true; } //否则玩家退赛 if (RemoveMatchUserItem(pIServerUserItem)) { //从正在比赛的组中删除该玩家 INT_PTR nGroupCount = m_MatchGroup.GetCount(); for (INT_PTR i = 0; iOnUserQuitMatch(pIServerUserItem)) { //if(pMatch->m_enMatchStatus!=MatchStatus_Signup && pMatch->m_enMatchStatus!=MatchStatus_Wait) //{ // SendRoomMessage(pIServerUserItem, TEXT("退赛成功,欢迎您继续参加其他比赛!"), SMT_CHAT|SMT_EJECT); //} if (pMatch->m_enMatchStatus != MatchStatus_Null) { SendRoomMessage(pIServerUserItem, TEXT("退赛成功,欢迎您继续参加其他比赛!"), SMT_CHAT | SMT_EJECT); } return true; } } //从正在报名的组中删除该玩家 if (m_pCurMatchGroup->OnUserQuitMatch(pIServerUserItem)) { //退还报名费 if (m_pMatchOption->lMatchFee>0 && !pIServerUserItem->IsAndroidUser()) { //变量定义 DBR_GR_MatchSignup MatchSignup; MatchSignup.dwUserID = pIServerUserItem->GetUserID(); //构造结构 MatchSignup.lMatchFee = m_pMatchOption->lMatchFee; MatchSignup.dwInoutIndex = pIServerUserItem->GetInoutIndex(); MatchSignup.dwClientAddr = pIServerUserItem->GetClientAddr(); MatchSignup.dwMatchID = m_pMatchOption->dwMatchID; MatchSignup.dwMatchNO = m_pCurMatchGroup->m_dwMatchNO; lstrcpyn(MatchSignup.szMachineID, pIServerUserItem->GetMachineID(), CountArray(MatchSignup.szMachineID)); //投递数据 m_pIDataBaseEngine->PostDataBaseRequest(MatchSignup.dwUserID, DBR_GR_MATCH_UNSIGNUP, dwContextID, &MatchSignup, sizeof(MatchSignup)); } if (m_pCurMatchGroup->m_enMatchStatus != MatchStatus_Null) { SendRoomMessage(pIServerUserItem, TEXT("退赛成功,欢迎您继续参加其他比赛!"), SMT_CHAT | SMT_EJECT); } SendMatchInfo(NULL); return true; } SendMatchInfo(NULL); } return false; } //用户积分 bool CImmediateMatch::OnEventUserItemScore(IServerUserItem * pIServerUserItem, BYTE cbReason) { //效验参数 ASSERT(pIServerUserItem != NULL); if (pIServerUserItem == NULL) return false; //获取对象 CImmediateGroup * pImmediateGroup = static_cast(pIServerUserItem->GetMatchData()); if (pImmediateGroup == NULL) { return m_pIServerUserItemSink->OnEventUserItemScore(pIServerUserItem, cbReason); } //发送分数 SendGroupUserScore(pIServerUserItem, pImmediateGroup); //变量定义 tagUserInfo * pUserInfo = pIServerUserItem->GetUserInfo(); //变量定义 CMD_GR_MobileUserScore MobileUserScore; //构造数据 MobileUserScore.dwUserID = pUserInfo->dwUserID; MobileUserScore.UserScore.dwWinCount = pUserInfo->dwWinCount; MobileUserScore.UserScore.dwLostCount = pUserInfo->dwLostCount; MobileUserScore.UserScore.dwDrawCount = pUserInfo->dwDrawCount; MobileUserScore.UserScore.dwFleeCount = pUserInfo->dwFleeCount; MobileUserScore.UserScore.dwExperience = pUserInfo->dwExperience; //构造积分 MobileUserScore.UserScore.lScore = pUserInfo->lScore; MobileUserScore.UserScore.lScore += pIServerUserItem->GetTrusteeScore(); MobileUserScore.UserScore.lScore += pIServerUserItem->GetFrozenedScore(); //发送数据 m_pIGameServiceFrame->SendDataBatchToMobileUser(pIServerUserItem->GetTableID(), MDM_GR_USER, SUB_GR_USER_SCORE, &MobileUserScore, sizeof(MobileUserScore)); //即时写分 if ((CServerRule::IsImmediateWriteScore(m_pGameServiceOption->dwServerRule) == true) && (pIServerUserItem->IsVariation() == true)) { //变量定义 DBR_GR_WriteGameScore WriteGameScore; ZeroMemory(&WriteGameScore, sizeof(WriteGameScore)); //用户信息 WriteGameScore.dwUserID = pIServerUserItem->GetUserID(); WriteGameScore.dwDBQuestID = pIServerUserItem->GetDBQuestID(); WriteGameScore.dwClientAddr = pIServerUserItem->GetClientAddr(); WriteGameScore.dwInoutIndex = pIServerUserItem->GetInoutIndex(); //提取积分 pIServerUserItem->DistillVariation(WriteGameScore.VariationInfo); //比赛信息 WriteGameScore.dwMatchID = m_pMatchOption->dwMatchID; WriteGameScore.dwMatchNO = pImmediateGroup->m_dwMatchNO; //投递请求 m_pIDataBaseEngine->PostDataBaseRequest(WriteGameScore.dwUserID, DBR_GR_WRITE_GAME_SCORE, 0L, &WriteGameScore, sizeof(WriteGameScore), TRUE); } return true; } //用户状态 bool CImmediateMatch::OnEventUserItemStatus(IServerUserItem * pIServerUserItem, WORD wOldTableID, WORD wOldChairID, bool bSendState) { //清除数据 if (pIServerUserItem->GetUserStatus() == US_FREE) pIServerUserItem->SetMatchData(NULL); //回调接口 if (m_pIServerUserItemSink != NULL) { return m_pIServerUserItemSink->OnEventUserItemStatus(pIServerUserItem, wOldTableID, wOldChairID); } return true; } //用户权限 bool CImmediateMatch::OnEventUserItemRight(IServerUserItem *pIServerUserItem, DWORD dwAddRight, DWORD dwRemoveRight, BYTE cbRightKind) { if (m_pIServerUserItemSink != NULL) { return m_pIServerUserItemSink->OnEventUserItemRight(pIServerUserItem, dwAddRight, dwRemoveRight, cbRightKind); } return true; } //报名人满,开始比赛 bool CImmediateMatch::OnEventMatchStart(CImmediateGroup *pMatch) { ASSERT(pMatch == m_pCurMatchGroup&&m_LoopTimer.GetCount()>0); //编号不够 不能报名的 pMatch->m_LoopTimer = m_LoopTimer[0]; m_LoopTimer.RemoveAt(0); m_MatchGroup.Add(pMatch); //准备新的一组比赛 m_pCurMatchGroup = new CImmediateGroup((DWORD)time(NULL), m_pMatchOption, this); SendMatchInfo(NULL); BYTE cbMatchStatus = MS_MATCHING; SendGroupData(MDM_GR_MATCH, SUB_GR_MATCH_STATUS, &cbMatchStatus, sizeof(cbMatchStatus), pMatch); return true; } //比赛结束 bool CImmediateMatch::OnEventMatchOver(CImmediateGroup *pMatch) { //比赛结束 if (pMatch != NULL) { DBR_GR_MatchOver MatchOver; ZeroMemory(&MatchOver, sizeof(MatchOver)); //构造数据 MatchOver.dwMatchID = m_pMatchOption->dwMatchID; MatchOver.dwMatchNO = pMatch->m_dwMatchNO; MatchOver.cbMatchType = MATCH_TYPE_IMMEDIATE; MatchOver.wServerID = m_pGameServiceOption->wServerID; //获取时间 MatchOver.MatchStartTime = pMatch->m_MatchStartTime; CTime::GetCurrentTime().GetAsSystemTime(MatchOver.MatchEndTime); //投递请求 m_pIDataBaseEngine->PostDataBaseRequest(0, DBR_GR_MATCH_OVER, 0, &MatchOver, sizeof(MatchOver)); } return true; } //关闭定时器 bool CImmediateMatch::KillGameTimer(DWORD dwTimerID, CImmediateGroup *pMatch) { m_pITimerEngine->KillTimer(dwTimerID); return false; } //设置定时器 bool CImmediateMatch::SetGameTimer(DWORD dwTimerID, DWORD dwElapse, DWORD dwRepeat, WPARAM dwBindParameter, CImmediateGroup *pMatch) { return m_pITimerEngine->SetTimer(dwTimerID, dwElapse, dwRepeat, dwBindParameter); } //发送数据 bool CImmediateMatch::SendMatchInfo(IServerUserItem * pIServerUserItem) { CMD_GR_Match_Num MatchNum; MatchNum.dwWaitting = (DWORD)m_pCurMatchGroup->m_OnMatchUserMap.GetCount(); MatchNum.dwTotal = m_pMatchOption->MatchType.Immediate.wStartUserCount; if (pIServerUserItem == NULL) { m_pIGameServiceFrame->SendData(BG_ALL_CLIENT, MDM_GR_MATCH, SUB_GR_MATCH_NUM, &MatchNum, sizeof(MatchNum)); return true; } m_pIGameServiceFrame->SendData(pIServerUserItem, MDM_GR_MATCH, SUB_GR_MATCH_NUM, &MatchNum, sizeof(MatchNum)); m_pIGameServiceFrame->SendData(pIServerUserItem, MDM_GR_MATCH, SUB_GR_MATCH_DESC, &m_MatchDesc, sizeof(m_MatchDesc)); INT_PTR dwUserCount = m_OnMatchUserItem.GetCount(); for (INT_PTR i = 0; iGetSignUpStatus(); m_pIGameServiceFrame->SendData(pIServerUserItem, MDM_GR_MATCH, SUB_GR_MATCH_STATUS, &cbMatchStatus, sizeof(cbMatchStatus)); return true; } } tagUserInfo *pUserScore = pIServerUserItem->GetUserInfo(); pUserScore->dwWinCount = pUserScore->dwLostCount = pUserScore->dwFleeCount = pUserScore->dwDrawCount = pUserScore->cbGender = 0; if ((SCORE)m_pMatchOption->MatchType.Immediate.dwInitalScore != 0) { pUserScore->lScore = (LONG)m_pMatchOption->MatchType.Immediate.dwInitalScore; } return SendGroupUserScore(pIServerUserItem, NULL); } //发送信息 bool CImmediateMatch::SendGroupUserMessage(LPCTSTR pStrMessage, CImmediateGroup *pMatch) { POSITION pos = pMatch->m_OnMatchUserMap.GetStartPosition(); IServerUserItem *pUserItem = NULL; DWORD dwUserID = 0; while (pos != NULL) { pMatch->m_OnMatchUserMap.GetNextAssoc(pos, dwUserID, pUserItem); SendGameMessage(pUserItem, pStrMessage, SMT_CHAT | SMT_TABLE_ROLL); } return true; } //发送用户分数 bool CImmediateMatch::SendGroupUserScore(IServerUserItem * pIServerUserItem, CImmediateGroup *pMatch) { //发送数据 CMD_GR_UserScore UserScore; ZeroMemory(&UserScore, sizeof(UserScore)); tagUserInfo * pUserInfo = pIServerUserItem->GetUserInfo(); //构造数据 UserScore.dwUserID = pUserInfo->dwUserID; UserScore.UserScore.dwWinCount = pUserInfo->dwWinCount; UserScore.UserScore.dwLostCount = pUserInfo->dwLostCount; UserScore.UserScore.dwDrawCount = pUserInfo->dwDrawCount; UserScore.UserScore.dwFleeCount = pUserInfo->dwFleeCount; UserScore.UserScore.dwExperience = pUserInfo->dwExperience; UserScore.UserScore.lLoveLiness = pUserInfo->lLoveLiness; //构造积分 UserScore.UserScore.lIngot = 0;// pUserInfo->lIngot; UserScore.UserScore.lGrade = pUserInfo->lGrade; UserScore.UserScore.lInsure = pUserInfo->lInsure; //构造积分 UserScore.UserScore.lScore = pUserInfo->lScore; if (pMatch != NULL) { POSITION pos = pMatch->m_OnMatchUserMap.GetStartPosition(); IServerUserItem *pUserItem = NULL; DWORD dwUserID = 0; while (pos != NULL) { pMatch->m_OnMatchUserMap.GetNextAssoc(pos, dwUserID, pUserItem); m_pIGameServiceFrame->SendData(pUserItem, MDM_GR_USER, SUB_GR_USER_SCORE, &UserScore, sizeof(UserScore)); } return true; } return m_pIGameServiceFrame->SendData(BG_COMPUTER, MDM_GR_USER, SUB_GR_USER_SCORE, &UserScore, sizeof(UserScore)); } //发送状态 bool CImmediateMatch::SendGroupUserStatus(IServerUserItem * pIServerUserItem, CImmediateGroup *pMatch) { //效验参数 ASSERT(pIServerUserItem != NULL); ASSERT(pIServerUserItem->IsClientReady() == true); if (pIServerUserItem->IsClientReady() == false) return false; //变量定义 CMD_GR_UserStatus UserStatus; ZeroMemory(&UserStatus, sizeof(UserStatus)); tagUserInfo * pUserData = pIServerUserItem->GetUserInfo(); //构造数据 UserStatus.dwUserID = pUserData->dwUserID; UserStatus.UserStatus.wTableID = pUserData->wTableID; UserStatus.UserStatus.wChairID = pUserData->wChairID; UserStatus.UserStatus.cbUserStatus = pUserData->cbUserStatus; POSITION pos = pMatch->m_OnMatchUserMap.GetStartPosition(); IServerUserItem *pUserItem = NULL; DWORD dwUserID = 0; while (pos != NULL) { pMatch->m_OnMatchUserMap.GetNextAssoc(pos, dwUserID, pUserItem); if (pUserItem->IsClientReady()) m_pIGameServiceFrame->SendData(pUserItem, MDM_GR_USER, SUB_GR_USER_STATUS, &UserStatus, sizeof(UserStatus)); } return true; } //发送游戏消息 bool CImmediateMatch::SendGameMessage(IServerUserItem * pIServerUserItem, LPCTSTR lpszMessage, WORD wMessageType) { ASSERT(pIServerUserItem != -NULL); if (pIServerUserItem == NULL) return false; //发送数据 if ((pIServerUserItem->GetBindIndex() != INVALID_WORD) && (pIServerUserItem->IsClientReady() == true) && (pIServerUserItem->IsAndroidUser() == false)) { //构造数据包 CMD_CM_SystemMessage Message; Message.wType = wMessageType; lstrcpyn(Message.szString, lpszMessage, CountArray(Message.szString)); Message.wLength = CountStringBuffer(Message.szString); //发送数据 WORD wSendSize = sizeof(Message)-sizeof(Message.szString) + Message.wLength*sizeof(TCHAR); return m_pIGameServiceFrame->SendData(pIServerUserItem, MDM_GF_FRAME, SUB_GF_SYSTEM_MESSAGE, &Message, wSendSize); } return true; } //发送消息 bool CImmediateMatch::SendRoomMessage(IServerUserItem * pIServerUserItem, LPCTSTR lpszMessage, WORD wMessageType) { ASSERT(pIServerUserItem != -NULL); if (pIServerUserItem == NULL) return false; //发送数据 if (pIServerUserItem->GetBindIndex() != INVALID_WORD && false == pIServerUserItem->IsAndroidUser()) { //构造数据包 CMD_CM_SystemMessage Message; Message.wType = wMessageType; lstrcpyn(Message.szString, lpszMessage, CountArray(Message.szString)); Message.wLength = CountStringBuffer(Message.szString); //发送数据 WORD wSendSize = sizeof(Message)-sizeof(Message.szString) + Message.wLength*sizeof(TCHAR); return m_pIGameServiceFrame->SendData(pIServerUserItem, MDM_CM_SYSTEM, SUB_CM_SYSTEM_MESSAGE, &Message, wSendSize); } return true; } //发送数据到一组用户 bool CImmediateMatch::SendGroupData(WORD wMainCmdID, WORD wSubCmdID, void * pData, WORD wDataSize, CImmediateGroup *pMatch) { POSITION pos = pMatch->m_OnMatchUserMap.GetStartPosition(); IServerUserItem *pUserItem = NULL; DWORD dwUserID = 0; while (pos != NULL) { pMatch->m_OnMatchUserMap.GetNextAssoc(pos, dwUserID, pUserItem); m_pIGameServiceFrame->SendData(pUserItem, wMainCmdID, wSubCmdID, pData, wDataSize); } return true; } //发送数据 bool CImmediateMatch::SendData(IServerUserItem * pIServerUserItem, WORD wMainCmdID, WORD wSubCmdID, VOID * pData, WORD wDataSize) { if (pIServerUserItem != NULL) return m_pIGameServiceFrame->SendData(pIServerUserItem, wMainCmdID, wSubCmdID, pData, wDataSize); else return m_pIGameServiceFrame->SendData(BG_ALL_CLIENT, wMainCmdID, wSubCmdID, pData, wDataSize); return true; } //为首轮插入空桌子 void CImmediateMatch::InsertNullTable() { for (int i = 0; iwTableCount; i++) { //超过就退出 WORD nCurTableCount = (WORD)m_pCurMatchGroup->m_MatchTableArray.GetCount(); if (nCurTableCount >= m_pMatchOption->MatchType.Immediate.wStartUserCount / m_pGameServiceAttrib->wChairCount)break; BOOL bIsInsert = true; for (int j = 0; jm_MatchTableArray.GetCount(); for (int k = 0; km_MatchTableArray[k]->wTableID; if (i == wTableID){ bIsInsert = false; break; }//其他组已经分配了该桌 } } //插入桌子 if (bIsInsert&&m_ppITableFrame[i]->GetNullChairCount() == m_pGameServiceAttrib->wChairCount) { tagTableFrameInfo * pTableFrameInfo = new tagTableFrameInfo; ZeroMemory(pTableFrameInfo, sizeof(tagTableFrameInfo)); pTableFrameInfo->wTableID = i; pTableFrameInfo->pTableFrame = m_ppITableFrame[i]; pTableFrameInfo->dwBaseScore = m_pMatchOption->MatchType.Immediate.dwInitalBase; ITableFrameHook * pFrameHook = QUERY_OBJECT_PTR_INTERFACE(m_ppITableFrame[i]->GetTableFrameHook(), ITableFrameHook); pFrameHook->SetMatchEventSink(QUERY_OBJECT_PTR_INTERFACE(m_pCurMatchGroup, IUnknownEx)); m_pCurMatchGroup->AddMatchTable(pTableFrameInfo); } } } //获取一个空闲的机器人 IAndroidUserItem * CImmediateMatch::GetFreeAndroidUserItem() { if (m_pAndroidUserManager->GetAndroidCount() == 0) return NULL; //机器状态 tagAndroidUserInfo AndroidSimulate; m_pAndroidUserManager->GetAndroidUserInfo(AndroidSimulate, ANDROID_SIMULATE | ANDROID_PASSIVITY | ANDROID_INITIATIVE); if (AndroidSimulate.wFreeUserCount == 0) return NULL; else { //避免已报名的机器人重复安排 for (WORD i = 0; iGetMeUserItem()->GetSignUpStatus() == MatchStatus_Null) { ASSERT(AndroidSimulate.pIAndroidUserFree[i]->GetUserID() == AndroidSimulate.pIAndroidUserFree[i]->GetMeUserItem()->GetUserID()); return AndroidSimulate.pIAndroidUserFree[i]; } } } return NULL; } //用户淘汰 bool CImmediateMatch::OnUserOut(IServerUserItem *pUserItem, LPCTSTR szReason, WORD wLen, WORD wRank, CImmediateGroup *pMatch) { if (pUserItem == NULL) return false; pUserItem->SetSignUpStatus(MatchStatus_Null); //清除比赛后的一些用户 for (INT_PTR i = 0; im_FreeUserArray.GetCount(); i++) { if (pMatch->m_FreeUserArray[i]->GetUserID() == pUserItem->GetUserID()) { pMatch->m_FreeUserArray.RemoveAt(i); break; } } if (wLen>0 && szReason != NULL) { CString str(szReason, wLen); SendGameMessage(pUserItem, str, SMT_EJECT | SMT_CHAT | SMT_CLOSE_GAME); } //移除参赛用户 RemoveMatchUserItem(pUserItem); BYTE cbMatchStatus = MatchStatus_Null; m_pIGameServiceFrame->SendData(pUserItem, MDM_GR_MATCH, SUB_GR_MATCH_STATUS, &cbMatchStatus, sizeof(cbMatchStatus)); if (pMatch == m_pCurMatchGroup) { if (pUserItem != NULL && !pUserItem->IsAndroidUser()) { if (m_pMatchOption->lMatchFee>0) { //变量定义 DBR_GR_MatchSignup MatchSignup; ZeroMemory(&MatchSignup, sizeof(MatchSignup)); //构造结构 MatchSignup.dwUserID = pUserItem->GetUserID(); MatchSignup.lMatchFee = m_pMatchOption->lMatchFee; MatchSignup.dwInoutIndex = pUserItem->GetInoutIndex(); MatchSignup.dwClientAddr = pUserItem->GetClientAddr(); MatchSignup.dwMatchID = m_pMatchOption->dwMatchID; MatchSignup.dwMatchNO = m_pCurMatchGroup->m_dwMatchNO; lstrcpyn(MatchSignup.szMachineID, pUserItem->GetMachineID(), CountArray(MatchSignup.szMachineID)); //投递数据 m_pIDataBaseEngine->PostDataBaseRequest(MatchSignup.dwUserID, DBR_GR_MATCH_UNSIGNUP, 0, &MatchSignup, sizeof(MatchSignup)); //发送消息 LPCTSTR pszMatchFeeType[] = { TEXT("游戏币"), TEXT("元宝") }; if (m_pMatchOption->cbMatchFeeTypelMatchFee, pszMatchFeeType[m_pMatchOption->cbMatchFeeType]); //发送消息 m_pIGameServiceFrame->SendRoomMessage(pUserItem, szMessage, SMT_EJECT | SMT_CHAT | SMT_CLOSE_ROOM); } } } CServerRule::SetForfendRoomEnter(static_cast(m_pGameServiceOption->dwServerRule), true); } else if (m_pIDataBaseEngine != NULL) { /*DBR_GR_MatchReward MatchReward; ZeroMemory(&MatchReward,sizeof(MatchReward)); MatchReward.dwMatchID=m_pMatchOption->dwMatchID; MatchReward.dwUserID=pUserItem->GetUserID(); MatchReward.dwMatchNO=pMatch->m_dwMatchNO; MatchReward.wRank=wRank; MatchReward.lMatchScore=pUserItem->GetUserScore(); MatchReward.dwClientAddr=pUserItem->GetClientAddr(); m_pIDataBaseEngine->PostDataBaseRequest(MatchReward.dwUserID,DBR_GR_MATCH_REWARD, 0, &MatchReward, sizeof(MatchReward));*/ } return true; } //写入奖励 bool CImmediateMatch::WriteUserAward(IServerUserItem *pIServerUserItem, tagMatchRankInfo * pMatchRankInfo) { //参数效验 ASSERT(pIServerUserItem != NULL && pMatchRankInfo != NULL); if (pIServerUserItem == NULL || pMatchRankInfo == NULL) return false; //写入判断 bool bWriteReward = (pMatchRankInfo->lRewardGold + pMatchRankInfo->dwRewardIngot + pMatchRankInfo->dwRewardExperience)>0; //写入奖励 if (bWriteReward == true) { //变量定义 CMD_GR_MatchResult MatchResult; ZeroMemory(&MatchResult, sizeof(MatchResult)); //比赛奖励 MatchResult.lGold += pMatchRankInfo->lRewardGold; MatchResult.dwIngot += pMatchRankInfo->dwRewardIngot; MatchResult.dwExperience += pMatchRankInfo->dwRewardExperience; //获奖提示 _sntprintf(MatchResult.szDescribe, CountArray(MatchResult.szDescribe), TEXT("%s, 恭喜您在%s中获得第%d名,奖励如下:"), pIServerUserItem->GetNickName(), m_pMatchOption->szMatchName, pMatchRankInfo->wRankID); //更新用户信息 tagUserInfo * pUserInfo = pIServerUserItem->GetUserInfo(); //pUserInfo->lIngot = 0;//+= pMatchRankInfo->dwRewardIngot; pUserInfo->dwExperience += pMatchRankInfo->dwRewardExperience; SendGroupUserScore(pIServerUserItem, NULL); //发送数据 if (pIServerUserItem->IsAndroidUser() == false) { m_pIGameServiceFrame->SendData(pIServerUserItem, MDM_GF_FRAME, SUB_GR_MATCH_RESULT, &MatchResult, sizeof(MatchResult)); } } else { TCHAR szMessage[256] = TEXT(""); _sntprintf(szMessage, CountArray(szMessage), TEXT("比赛已结束,恭喜您获得第%d名,欢迎您参加其他场次的比赛!"), pMatchRankInfo->wRankID); SendGameMessage(pIServerUserItem, szMessage, SMT_CLOSE_GAME); SendRoomMessage(pIServerUserItem, szMessage, SMT_CHAT | SMT_EJECT); return true; } //写入记录 if (m_pIDataBaseEngine != NULL) { //变量定义 DBR_GR_MatchReward MatchReward; ZeroMemory(&MatchReward, sizeof(MatchReward)); //构造结构 MatchReward.dwUserID = pIServerUserItem->GetUserID(); MatchReward.lRewardGold = pMatchRankInfo->lRewardGold; MatchReward.dwRewardIngot = pMatchRankInfo->dwRewardIngot; MatchReward.dwRewardExperience = pMatchRankInfo->dwRewardExperience; MatchReward.dwClientAddr = pIServerUserItem->GetClientAddr(); //投递数据 m_pIDataBaseEngine->PostDataBaseRequest(MatchReward.dwUserID, DBR_GR_MATCH_REWARD, 0, &MatchReward, sizeof(MatchReward)); } return true; } //获取空桌子 WORD CImmediateMatch::GetNullTable() { WORD wTableCount = 0; for (int i = 0; iwTableCount; i++) { BOOL bIsInsert = true; for (int j = 0; jm_MatchTableArray.GetCount(); for (int k = 0; km_MatchTableArray[k]->wTableID; if (i == wTableID){ bIsInsert = false; break; }//其他组已经分配了该桌 } } //插入桌子 if (bIsInsert&&m_ppITableFrame[i]->GetNullChairCount() == m_pGameServiceAttrib->wChairCount) { wTableCount++; } } return wTableCount; } //删除用户 bool CImmediateMatch::DeleteUserItem(DWORD dwUserIndex) { try { if (m_pITCPNetworkEngineEvent == NULL) { throw 0; } m_pITCPNetworkEngineEvent->OnEventTCPNetworkShut(dwUserIndex, 0, 0L); } catch (...) { //错误断言 ASSERT(FALSE); return false; } return true; } //移除参赛用户 bool CImmediateMatch::RemoveMatchUserItem(IServerUserItem *pIServerUserItem) { for (INT_PTR i = 0; iGetUserID() == pIServerUserItem->GetUserID()); m_OnMatchUserItem.RemoveAt(i); return true; } } return false; } ////////////////////////////////////////////////////////////////////////////////////////////////////////////