Files
wnmj/Servers/服务器组件/比赛服务/LockTimeMatch.cpp
2026-02-13 14:34:15 +08:00

2136 lines
62 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "StdAfx.h"
#include "LockTimeMatch.h"
#include "..\游戏服务器\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+50) //分配用户
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//构造函数
CLockTimeMatch::CLockTimeMatch()
{
//状态变量
m_MatchStatus=MS_NULL;
//比赛配置
m_pMatchOption=NULL;
m_pGameServiceOption=NULL;
m_pGameServiceAttrib=NULL;
//内核接口
m_ppITableFrame=NULL;
m_pITimerEngine=NULL;
m_pIDataBaseEngine=NULL;
m_pITCPNetworkEngineEvent=NULL;
//服务接口
m_pIGameServiceFrame=NULL;
m_pIServerUserManager=NULL;
m_pAndroidUserManager=NULL;
m_AllMatchScorePtrMap.clear();
m_AllMatchScorePtrVector.clear();
}
CLockTimeMatch::~CLockTimeMatch(void)
{
//释放资源
SafeDeleteArray(m_ppITableFrame);
//关闭定时器
m_pITimerEngine->KillTimer(IDI_CHECK_END_MATCH);
m_pITimerEngine->KillTimer(IDI_DISTRIBUTE_USER);
//移除元素
m_DistributeManage.RemoveAll();
ReleaseMatchScore();
}
//接口查询
VOID* CLockTimeMatch::QueryInterface(REFGUID Guid, DWORD dwQueryVer)
{
QUERYINTERFACE(IGameMatchItem,Guid,dwQueryVer);
QUERYINTERFACE(IMatchEventSink,Guid,dwQueryVer);
QUERYINTERFACE(IServerUserItemSink,Guid,dwQueryVer);
QUERYINTERFACE_IUNKNOWNEX(IGameMatchItem,Guid,dwQueryVer);
return NULL;
}
//绑定桌子
bool CLockTimeMatch::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 CLockTimeMatch::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;
//分组设置
m_DistributeManage.SetDistributeRule(m_pGameServiceOption->cbDistributeRule);
//创建桌子
if (m_ppITableFrame==NULL)
{
m_ppITableFrame=new ITableFrame*[m_pGameServiceOption->wTableCount];
}
//计算场次;
m_pMatchOption->dwMatchNO = CalcMatchNo();
if (m_pMatchOption->MatchType.LockTime.dwEndDelayTime == 0)
m_pMatchOption->MatchType.LockTime.dwEndDelayTime = 600;
//设置状态;
m_TimeLastMatch = CTime::GetCurrentTime();
//开始间隔
DWORD dwStartInterval = GetMatchStartInterval();
if(dwStartInterval>0)
{
//开始检测;
m_pITimerEngine->SetTimer(IDI_CHECK_START_MATCH,dwStartInterval*1000L,TIMES_INFINITY,NULL);
}
else
{
//提示信息;
LPCTSTR pszDescribe = TEXT("定局赛时间配置错误!");
CTraceService::TraceString(pszDescribe, TraceLevel_Warning);
return false;
}
//加载排行耪数据(防止游戏崩溃,这个是崩溃后启动用的);
m_pITimerEngine->SetTimer(IDI_LOAD_RANKDATA, 10000L, 1, NULL);
return true;
}
//时间事件
bool CLockTimeMatch::OnEventTimer(DWORD dwTimerID, WPARAM dwBindParameter)
{
switch(dwTimerID)
{
case IDI_DISTRIBUTE_USER: //分配用户
{
//执行分组
PerformDistribute();
return true;
}
case IDI_CHECK_START_MATCH: //开始比赛
{
//变量定义;
BYTE cbMatchStatus = m_MatchStatus;
//更新状态;
UpdateMatchStatus();
//等待比赛;
if (m_MatchStatus == MS_WAITPLAY)
{
m_pITimerEngine->SetTimer(IDI_CHECK_START_MATCH, 2000L, TIMES_INFINITY, NULL);
if (cbMatchStatus != m_MatchStatus)
{
m_pIGameServiceFrame->SendData(BG_COMPUTER, MDM_GR_MATCH, SUB_GR_MATCH_STATUS, &m_MatchStatus, sizeof(m_MatchStatus));
SendMatchInfo(NULL);
}
}
//比赛开始;
else if (m_MatchStatus == MS_MATCHING)
{
//关闭定时器;
m_pITimerEngine->KillTimer(IDI_CHECK_START_MATCH);
//检测比赛结束;
m_pITimerEngine->SetTimer(IDI_CHECK_END_MATCH, 5000, TIMES_INFINITY, 0);
//执行分组;
m_pITimerEngine->SetTimer(IDI_DISTRIBUTE_USER, m_pGameServiceOption->wDistributeTimeSpace * 1000, TIMES_INFINITY, NULL);
//发送状态;
m_pIGameServiceFrame->SendData(BG_ALL_CLIENT, MDM_GR_MATCH, SUB_GR_MATCH_STATUS, &m_MatchStatus, sizeof(m_MatchStatus));
//变量定义;
DBR_GR_MatchStart MatchStart;
//构造结构;
MatchStart.dwMatchID = m_pMatchOption->dwMatchID;
MatchStart.dwMatchNO = m_pMatchOption->dwMatchNO;
MatchStart.cbMatchType = m_pMatchOption->cbMatchType;
MatchStart.wServerID = m_pGameServiceOption->wServerID;
//投递请求;
m_pIDataBaseEngine->PostDataBaseRequest(0, DBR_GR_MATCH_START, 0, &MatchStart, sizeof(MatchStart));
//SendMatchInfo(NULL);
}
return true;
}
case IDI_CHECK_END_MATCH: //结束比赛
{
//变量定义
BYTE cbMatchStatus = m_MatchStatus;
//更新状态;
UpdateMatchStatus();
//比赛结束
if (m_MatchStatus == MS_WAITEND)
{
if (cbMatchStatus != MS_WAITEND)
{
//发送状态
BYTE cbMatchStatus = MS_WAITEND;
m_pIGameServiceFrame->SendData(BG_ALL_CLIENT, MDM_GR_MATCH, SUB_GR_MATCH_STATUS, &cbMatchStatus, sizeof(cbMatchStatus));
//获取时间
CTime CurTime = CTime::GetCurrentTime();
CTime MatchEndTime(m_pMatchOption->MatchType.LockTime.MatchEndTime);
//比赛结束
bool bMatchOver = (CurTime >= MatchEndTime);
//变量定义;
WORD wUserIndex = 0;
TCHAR szMessage[128];
IServerUserItem *pIServerUserItem = NULL;
DWORD dwEndDelayMinutes = m_pMatchOption->MatchType.LockTime.dwEndDelayTime / 60;
do
{
pIServerUserItem = m_pIServerUserManager->EnumUserItem(wUserIndex++);
if (pIServerUserItem == NULL)
{
break;
}
//比赛中用户;
if (pIServerUserItem->GetUserStatus() == US_PLAYING)
{
if (bMatchOver == false)
{
_sntprintf(szMessage, CountArray(szMessage), TEXT("今天的比赛结束时间已到,请尽快在 %d 分钟内结束本局游戏。"), dwEndDelayMinutes);
//m_pIGameServiceFrame->SendGameMessage(pIServerUserItem, szMessage, SMT_CHAT | SMT_GLOBAL);
m_pIGameServiceFrame->SendGameMessage(pIServerUserItem, szMessage, SMT_TABLE_ROLL);
}
else
{
_sntprintf(szMessage, CountArray(szMessage), TEXT("本场比赛结束时间已到,请尽快在 %d 分钟内结束当前比赛。否则系统将会自动解散本回合并不计入成绩。"), dwEndDelayMinutes);
//m_pIGameServiceFrame->SendGameMessage(pIServerUserItem, szMessage, SMT_CHAT | SMT_GLOBAL);
m_pIGameServiceFrame->SendGameMessage(pIServerUserItem, szMessage, SMT_TABLE_ROLL);
}
}
else
{
if (bMatchOver == false)
{
_sntprintf(szMessage, CountArray(szMessage), TEXT("今天的比赛到此结束,请您明天再来参加!"));
m_pIGameServiceFrame->SendGameMessage(pIServerUserItem, szMessage, SMT_CHAT | SMT_EJECT | SMT_GLOBAL | SMT_CLOSE_GAME);
}
else
{
//发送结束消息;
_sntprintf(szMessage, CountArray(szMessage), TEXT("本场比赛结束时间已到,感谢您的参与;请在 %d 分钟后前往相关页面查询您的本场比赛成绩。"), dwEndDelayMinutes);
m_pIGameServiceFrame->SendGameMessage(pIServerUserItem, szMessage, SMT_CHAT | SMT_EJECT | SMT_GLOBAL | SMT_CLOSE_GAME);
}
}
} while (true);
}
}
//比赛完成
if (m_MatchStatus == MS_MATCHEND)
{
//关闭定时器
m_pITimerEngine->KillTimer(IDI_CHECK_END_MATCH);
m_pITimerEngine->KillTimer(IDI_DISTRIBUTE_USER);
//发送状态
BYTE cbMatchStatus=MS_MATCHEND;
m_pIGameServiceFrame->SendData(BG_ALL_CLIENT,MDM_GR_MATCH,SUB_GR_MATCH_STATUS,&cbMatchStatus,sizeof(cbMatchStatus));
//解散游戏;
for(INT i=0; i<m_pGameServiceOption->wTableCount; i++)
{
//获取对象;
ITableFrame * pITableFrame=m_ppITableFrame[i];
ASSERT(pITableFrame!=NULL);
if (pITableFrame==NULL) continue;
//解散游戏;
if(pITableFrame->IsGameStarted())
{
pITableFrame->DismissGame();
}
//执行起立;
PerformAllUserStandUp(pITableFrame);
}
//移除所有玩家;
m_DistributeManage.RemoveAll();
//获取时间
CTime CurTime = CTime::GetCurrentTime();
CTime MatchEndTime(m_pMatchOption->MatchType.LockTime.MatchEndTime);
//比赛结束
if( IsRoundMatchMode() || CurTime >= MatchEndTime)
{
//比赛结束;
DBR_GR_MatchOver MatchOver;
ZeroMemory(&MatchOver,sizeof(MatchOver));
//构造数据;
MatchOver.cbMatchType=MATCH_TYPE_LOCKTIME;
MatchOver.dwMatchID=m_pMatchOption->dwMatchID;
MatchOver.dwMatchNO=m_pMatchOption->dwMatchNO;
MatchOver.wServerID=m_pGameServiceOption->wServerID;
MatchOver.wPlayCount = m_pMatchOption->MatchType.LockTime.wMatchPlayCount;
MatchOver.bMatchFinish = (CurTime >= MatchEndTime) ? TRUE : FALSE;
//常规开赛;
if (IsNormalMatchMode())
{
MatchOver.MatchEndTime = m_pMatchOption->MatchType.LockTime.MatchEndTime;
MatchOver.MatchStartTime = m_pMatchOption->MatchType.LockTime.MatchStartTime;
}
//循环开赛;
if (IsRoundMatchMode())
{
//变量定义;
SYSTEMTIME SystemTimeCurr;
CurTime.GetAsSystemTime(SystemTimeCurr);
//设置时间;
SystemTimeCurr.wHour = m_pMatchOption->MatchType.LockTime.MatchStartTime.wHour;
SystemTimeCurr.wMinute = m_pMatchOption->MatchType.LockTime.MatchStartTime.wMinute;
SystemTimeCurr.wSecond = m_pMatchOption->MatchType.LockTime.MatchStartTime.wSecond;
//开始时间;
MatchOver.MatchStartTime = SystemTimeCurr;
//设置时间;
SystemTimeCurr.wHour = m_pMatchOption->MatchType.LockTime.MatchEndTime.wHour;
SystemTimeCurr.wMinute = m_pMatchOption->MatchType.LockTime.MatchEndTime.wMinute;
SystemTimeCurr.wSecond = m_pMatchOption->MatchType.LockTime.MatchEndTime.wSecond;
//结束时间;
MatchOver.MatchEndTime = SystemTimeCurr;
}
//投递请求;
m_pIDataBaseEngine->PostDataBaseRequest(0,DBR_GR_MATCH_OVER,0,&MatchOver,sizeof(MatchOver));
//切换时钟;
if (IsRoundMatchMode() && CurTime < MatchEndTime)
{
//发送结束消息;
TCHAR szMessage[128] = TEXT("今天的比赛到此结束,请您明天再来参加!");
m_pIGameServiceFrame->SendGameMessage(szMessage, SMT_CHAT | SMT_EJECT | SMT_GLOBAL | SMT_CLOSE_GAME);
//切换状态;
m_pITimerEngine->SetTimer(IDI_SWITCH_STATUS, 2000, TIMES_INFINITY, NULL);
}
return true;
}
}
return true;
}
case IDI_SWITCH_STATUS:
{
//判断状态;
if (m_MatchStatus != MS_MATCHEND) return true;
if (!IsRoundMatchMode()) return true;
//判断日期;
CTime curTime = CTime::GetCurrentTime();
if (m_TimeLastMatch.GetDay() == curTime.GetDay()) return true;
//计算场次;
m_pMatchOption->dwMatchNO = CalcMatchNo();
//设置变量;
m_MatchStatus = MS_NULL;
m_TimeLastMatch = curTime;
//比赛检测;
DWORD dwStartInterval = GetMatchStartInterval();
if (dwStartInterval > 0)
{
m_pITimerEngine->SetTimer(IDI_CHECK_START_MATCH, dwStartInterval * 1000L, TIMES_INFINITY, NULL);
}
//关闭定时器;
m_pITimerEngine->KillTimer(IDI_SWITCH_STATUS);
//发送状态;
BYTE cbMatchStatus = MS_NULL;
m_pIGameServiceFrame->SendData(BG_COMPUTER, MDM_GR_MATCH, SUB_GR_MATCH_STATUS, &cbMatchStatus, sizeof(cbMatchStatus));
return true;
}
case IDI_LOAD_RANKDATA:
{
DBR_GR_MatchLoadRankData loadRankData;
ZeroMemory(&loadRankData, sizeof(DBR_GR_MatchLoadRankData));
loadRankData.dwMatchID = m_pMatchOption->dwMatchID;
loadRankData.dwMatchNO = m_pMatchOption->dwMatchNO;
//投递请求;
m_pIDataBaseEngine->PostDataBaseRequest(0, DBR_GR_MATCH_LOADRANKDATA, 0, &loadRankData, sizeof(loadRankData));
}
}
return true;
}
//数据库事件
bool CLockTimeMatch::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)
{
//提示消息不为空;
if (pMatchSignupResult->szDescribeString[0] != '\0')
{
//m_pIGameServiceFrame->SendRoomMessage(pIServerUserItem, pMatchSignupResult->szDescribeString, SMT_EJECT);
SendMatchJoinResult(pIServerUserItem, 0, pMatchSignupResult->szDescribeString);
}
return true;
}
//报名成功;
//if (m_MatchStatus == MS_NULL)
//{
// //消息通知;
// m_pIGameServiceFrame->SendRoomMessage(pIServerUserItem, TEXT("恭喜您,报名成功,请届时前来参加比赛!"), SMT_CHAT);
//}
//else
//{
// //加入分组;
// if (InsertDistribute(pIServerUserItem) == false) return true;
// //发送分数;
// SendMatchUserInitScore(pIServerUserItem);
// //发送消息;
// m_pIGameServiceFrame->SendRoomMessage(pIServerUserItem, TEXT("系统正在努力为您分配座位,请稍后。。。"), SMT_CHAT);
// SendMatchInfo(NULL);
//}
//发送分数;
SendMatchUserInitScore(pIServerUserItem);
pIServerUserItem->SetUserMatchStatus(MUS_SIGNUP);
if (pIServerUserItem->IsAndroidUser() == false)
{
//构造结构;
CMD_GR_MatchGoldUpdate MatchGoldUpdate;
//设置变量;
MatchGoldUpdate.lCurrGold = pMatchSignupResult->lCurrGold;
MatchGoldUpdate.lCurrIngot = pMatchSignupResult->lCurrIngot;
//发送数据;
m_pIGameServiceFrame->SendData(pIServerUserItem, MDM_GR_MATCH, SUB_GR_MATCH_GOLDUPDATE, &MatchGoldUpdate, sizeof(MatchGoldUpdate));
}
if (m_MatchStatus == MS_NULL)
{
SendMatchJoinResult(pIServerUserItem, 2, TEXT("恭喜您,报名成功,请届时前来参加比赛!"));
}
else
{
SendMatchJoinResult(pIServerUserItem, 1, TEXT("系统正在努力为您分配座位,请稍后。。。"));
}
tagMatchScore* pMatchScore = FindMatchScore(pIServerUserItem);
if (NULL != pMatchScore)
{
pMatchScore->pUserItem = pIServerUserItem;
}
else
{
InsertAllMatchScoreMap(pIServerUserItem);
}
SendMatchWaitTip(pIServerUserItem);
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;
//变量定义
bool bRewardUser=true;
tagMatchRankInfo * pMatchRankInfo=NULL;
IServerUserItem * pIRewardUserItem=NULL;
//发放奖励
for(WORD wIndex=0;wIndex<pMatchRankList->wUserCount;wIndex++)
{
//查找玩家
pMatchRankInfo=&pMatchRankList->MatchRankInfo[wIndex];
pIRewardUserItem=m_pIServerUserManager->SearchUserItem(pMatchRankInfo->dwUserID);
if (pIRewardUserItem!=NULL && pIRewardUserItem->IsAndroidUser()==true) continue;
//写入奖励
WriteUserAward(pIRewardUserItem,pMatchRankInfo);
//设置标识
if (pIRewardUserItem)
pIRewardUserItem->SetMatchData(&bRewardUser);
}
//在线用户
WORD wUserIndex=0;
while (true)
{
pIRewardUserItem=m_pIServerUserManager->EnumUserItem(wUserIndex++);
if (pIRewardUserItem==NULL) break;
if (pIRewardUserItem->IsAndroidUser()==true) continue;
if (pIRewardUserItem->GetMatchData()==&bRewardUser)
{
pIRewardUserItem->SetMatchData(NULL);
continue;
}
//发送结束消息
TCHAR szMessage[128]=TEXT("本次比赛到此结束,请您前往网站查看系统排名或移驾其他比赛房间参与比赛!");
m_pIGameServiceFrame->SendGameMessage(pIRewardUserItem,szMessage,SMT_CHAT|SMT_EJECT|SMT_GLOBAL|SMT_CLOSE_GAME);
}
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;
MatchGoldUpdate.lInsureSocre = pMatchRewardResult->lInsureSocre;
//发送数据
m_pIGameServiceFrame->SendData(pIServerUserItem,MDM_GR_MATCH,SUB_GR_MATCH_GOLDUPDATE,&MatchGoldUpdate,sizeof(MatchGoldUpdate));
}
break;
}
case DBO_GR_MATCH_RANKDATA_LIST:
{
//参数校验;
ASSERT(wDataSize <= sizeof(DBO_GR_MatchRankDataList));
int nSize = sizeof(DBO_GR_MatchRankDataList);
if (wDataSize > sizeof(DBO_GR_MatchRankDataList)) return false;
//提取数据
DBO_GR_MatchRankDataList * pMatchRankDataList = (DBO_GR_MatchRankDataList*)pData;
//变量定义;
tagMatchRankDataInfo * pMatchRankDataInfo = NULL;
for (WORD wIndex = 0; wIndex < pMatchRankDataList->wUserCount; wIndex++)
{
//查找玩家;
pMatchRankDataInfo = &pMatchRankDataList->MatchRankInfo[wIndex];
InsertAllMatchScoreMap(pMatchRankDataInfo);
}
break;
}
}
return true;
}
//比赛事件
bool CLockTimeMatch::OnEventSocketMatch(WORD wSubCmdID, VOID * pData, WORD wDataSize, IServerUserItem * pIServerUserItem, DWORD dwSocketID)
{
switch (wSubCmdID)
{
case SUB_GR_MATCH_FEE: //比赛费用
{
//参数效验
ASSERT(wDataSize == sizeof(CMD_GR_C_Match_Fee));
if (wDataSize != sizeof(CMD_GR_C_Match_Fee)) return false;
//提取数据
CMD_GR_C_Match_Fee* pMatchFee = (CMD_GR_C_Match_Fee*)pData;
if (pMatchFee->dwChannelID != 0 && pMatchFee->dwChannelID != m_pMatchOption->MatchType.LockTime.dwChannelID)
{ //渠道ID不对;
//m_pIGameServiceFrame->SendRoomMessage(pIServerUserItem, TEXT("渠道ID错误"), SMT_EJECT);
SendMatchJoinResult(pIServerUserItem, 0, TEXT("渠道ID错误"));
return false;//先设置成false客户端短线重现链接;
//return true;
}
if (pMatchFee->dwInviteCode != 0 && pMatchFee->dwInviteCode != m_pMatchOption->MatchType.LockTime.dwInviteCode)
{ //邀请码不对;
//m_pIGameServiceFrame->SendRoomMessage(pIServerUserItem, TEXT("邀请码错误"), SMT_EJECT);
SendMatchJoinResult(pIServerUserItem, 0, TEXT("邀请码错误"));
return false;//先设置成false客户端短线重现链接;
//return true;
}
//判断时间;
TCHAR szDescribe[256];
WORD wMessageType;
if (VerifySignupMatchTime(szDescribe, CountArray(szDescribe), wMessageType) == false)
{
SendMatchJoinResult(pIServerUserItem, 0, szDescribe);
return true;
}
//变量定义;
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_pMatchOption->dwMatchNO;
MatchSignup.cbMatchType = m_pMatchOption->cbMatchType;
//拷贝机器码
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, UNSIGNUP_REASON_PLAYER, 0, dwSocketID);
return true;
}
case SUB_GR_MATCH_CONTINUE:
{
//参数效验;
ASSERT(pIServerUserItem != NULL);
if (pIServerUserItem == NULL)
{
return false;
}
OnEventUserJoinMatch(pIServerUserItem, 1, dwSocketID);
return true;
}
}
return true;
}
//用户积分
bool CLockTimeMatch::OnEventUserItemScore(IServerUserItem * pIServerUserItem, BYTE cbReason)
{
//效验参数
ASSERT(pIServerUserItem!=NULL);
if (pIServerUserItem==NULL) return false;
//变量定义
CMD_GR_UserScore 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.lGrade=pUserInfo->lGrade;
UserScore.UserScore.lInsure=pUserInfo->lInsure;
//构造积分
UserScore.UserScore.lScore=pUserInfo->lScore;
UserScore.UserScore.lScore+=pIServerUserItem->GetTrusteeScore();
UserScore.UserScore.lScore+=pIServerUserItem->GetFrozenedScore();
//发送数据
m_pIGameServiceFrame->SendData(BG_COMPUTER,MDM_GR_USER,SUB_GR_USER_SCORE,&UserScore,sizeof(UserScore));
//积分倍数同步;
CMD_GF_S_ScoreMultiple ScoreMultiple;
ZeroMemory(&ScoreMultiple, sizeof(ScoreMultiple));
ScoreMultiple.dwUserID = pUserInfo->dwUserID;
ScoreMultiple.cbScoreMultiple = pUserInfo->cbScoreMultiple;
m_pIGameServiceFrame->SendData(BG_COMPUTER, MDM_GR_USER, SUB_GR_USER_SCOREMULTIPLE, &ScoreMultiple, sizeof(ScoreMultiple));
//变量定义
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=m_pMatchOption->dwMatchNO;
//投递请求
m_pIDataBaseEngine->PostDataBaseRequest(WriteGameScore.dwUserID,DBR_GR_WRITE_GAME_SCORE,0L,&WriteGameScore,sizeof(WriteGameScore), TRUE);
}
return true;
}
//用户状态
bool CLockTimeMatch::OnEventUserItemStatus(IServerUserItem * pIServerUserItem, WORD wOldTableID, WORD wOldChairID)
{
if(m_pIServerUserItemSink!=NULL)
{
return m_pIServerUserItemSink->OnEventUserItemStatus(pIServerUserItem,wOldTableID,wOldChairID);
}
return true;
}
//用户权限
bool CLockTimeMatch::OnEventUserItemRight(IServerUserItem *pIServerUserItem, DWORD dwAddRight, DWORD dwRemoveRight,bool bGameRight)
{
if(m_pIServerUserItemSink!=NULL)
{
return m_pIServerUserItemSink->OnEventUserItemRight(pIServerUserItem,dwAddRight,dwRemoveRight,bGameRight);
}
return true;
}
//用户登录
bool CLockTimeMatch::OnEventUserLogon(IServerUserItem * pIServerUserItem)
{
//发送状态
if(m_MatchStatus>MS_NULL)
{
//发送状态
m_pIGameServiceFrame->SendData(pIServerUserItem, MDM_GR_MATCH, SUB_GR_MATCH_STATUS, &m_MatchStatus, sizeof(m_MatchStatus));
SendMatchInfo(NULL);
}
SendTableUserMatchInfo(pIServerUserItem);
return true;
}
//用户登出
bool CLockTimeMatch::OnEventUserLogout(IServerUserItem * pIServerUserItem)
{
//构造结构
SendMatchInfo(NULL);
return true;
}
//进入事件
bool CLockTimeMatch::OnEventEnterMatch(DWORD dwSocketID ,VOID* pData,DWORD dwUserIP, bool bIsMobile)
{
//判断时间
TCHAR szDescribe[256];
WORD wMessageType;
if (VerifyMatchTime(szDescribe,CountArray(szDescribe),wMessageType)==false)
{
m_pIGameServiceFrame->SendRoomMessage(dwSocketID,szDescribe,wMessageType|SMT_GLOBAL,dwUserIP==0);
return true;
}
//手机用户
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 CLockTimeMatch::OnEventUserJoinMatch(IServerUserItem * pIServerUserItem, BYTE cbReason,DWORD dwSocketID)
{
//参数校验
ASSERT(pIServerUserItem!=NULL);
if (pIServerUserItem == NULL) return false;
//判断状态
if(pIServerUserItem->GetUserStatus()!=US_FREE || pIServerUserItem->GetTableID()!=INVALID_TABLE)
{
return false;
}
//比赛未开始
if(m_MatchStatus==MS_NULL)
{
//发送消息
m_pIGameServiceFrame->SendRoomMessage(pIServerUserItem,TEXT("比赛尚未开始,请稍后再来!"),SMT_EJECT);
return true;
}
//比赛结束
if(m_MatchStatus==MS_MATCHEND)
{
//发送消息
m_pIGameServiceFrame->SendRoomMessage(pIServerUserItem,TEXT("比赛已经结束,请您移驾至其他比赛房间参与比赛!"),SMT_EJECT);
return true;
}
//加入分组
if(InsertDistribute(pIServerUserItem)==false) return false;
//设置等待分配状态;
pIServerUserItem->SetUserStatus(US_WAITDISTRIBUTE);
//发送成绩
SendMatchUserScore(pIServerUserItem);
//发送消息;
m_pIGameServiceFrame->SendRoomMessage(pIServerUserItem, TEXT("系统正在努力为您分配座位,请稍后。。。"), SMT_TABLE_ROLL);
//发送通知;
m_pIGameServiceFrame->SendData(pIServerUserItem, MDM_GF_FRAME, SUB_GF_WAIT_DISTRIBUTE, NULL, 0);
if (!pIServerUserItem->IsAndroidUser())
{
SendMatchInfo(NULL);
//SendTableUserMatchInfo(pIServerUserItem);
}
//上线后从新赋值;
tagMatchScore* pMatchScore = FindMatchScore(pIServerUserItem);
if (NULL != pMatchScore)
{
pMatchScore->pUserItem = pIServerUserItem;
}
else
{
InsertAllMatchScoreMap(pIServerUserItem);
}
return true;
}
//用户退赛
bool CLockTimeMatch::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->GetUserMatchStatus();
if (cbUserEnlist == MS_MATCHING)
{
return true;
}
//移除分组
m_DistributeManage.RemoveDistributeNode(pIServerUserItem);
//移除同桌信息
m_DistributeManage.RemoveUserSameTableInfo(pIServerUserItem->GetUserID());
return true;
}
//游戏开始
bool CLockTimeMatch::OnEventGameStart(ITableFrame *pITableFrame, WORD wChairCount)
{
//发送比赛信息
SendTableUserMatchInfo(pITableFrame, INVALID_CHAIR);
//构造数据包
CMD_CM_SystemMessage SystemMessage;
ZeroMemory(&SystemMessage,sizeof(SystemMessage));
//变量定义
IServerUserItem *pIServerUserItem=NULL;
IServerUserItem *pITableUserItem=NULL;
for (INT i=0; i<pITableFrame->GetChairCount(); i++)
{
pIServerUserItem=pITableFrame->GetTableUserItem(i);
ASSERT(pIServerUserItem!=NULL);
if (pIServerUserItem==NULL) continue;
//构造提示消息
TCHAR szMessage[64]=TEXT("");
_sntprintf_s(szMessage, CountArray(szMessage),TEXT("本局比赛是您的第 %d 局。"),pIServerUserItem->GetUserPlayCount()+1);
lstrcpyn(SystemMessage.szString,szMessage,CountArray(SystemMessage.szString));
SystemMessage.wLength=CountStringBuffer(SystemMessage.szString);
SystemMessage.wType=SMT_CHAT;
//发送提示数据
WORD wSendSize=sizeof(SystemMessage)-sizeof(SystemMessage.szString)+SystemMessage.wLength*sizeof(TCHAR);
pITableFrame->SendTableData(pIServerUserItem->GetChairID(),SUB_GF_SYSTEM_MESSAGE, &SystemMessage,wSendSize,MDM_GF_FRAME);
pIServerUserItem->SetUserMatchStatus(MUS_MATCHING);
//清除同桌
ClearSameTableUser(pIServerUserItem->GetUserID());
for (INT j=0; j<pITableFrame->GetChairCount(); j++)
{
//获取用户
pITableUserItem=pITableFrame->GetTableUserItem(j);
if(pITableUserItem==NULL) continue;
if(pITableUserItem==pIServerUserItem) continue;
//插入同桌用户
InserSameTableUser(pIServerUserItem->GetUserID(),pITableUserItem->GetUserID());
}
}
return true;
}
//游戏结束
bool CLockTimeMatch::OnEventGameEnd(ITableFrame *pITableFrame,WORD wChairID, IServerUserItem * pIServerUserItem, BYTE cbReason)
{
ASSERT(pITableFrame!=NULL);
if (pITableFrame==NULL) return false;
vector<BYTE> cbFinishVec;
//结束处理;
WORD wChairCount = pITableFrame->GetChairCount();
for (WORD i = 0; i<wChairCount; i++)
{
cbFinishVec.push_back(0); //先插入false标志;
IServerUserItem *pIUserItem=pITableFrame->GetTableUserItem(i);
ASSERT(pIUserItem!=NULL);
if (pIUserItem==NULL) continue;
//正常结束;
if(cbReason!=REMOVE_BY_ENDMATCH)
{
//达到淘汰线
if (m_pMatchOption->MatchType.LockTime.lMatchCullScore>0 && pIUserItem->GetUserScore()<m_pMatchOption->MatchType.LockTime.lMatchCullScore)
{
//变量定义
TCHAR szMessage[128]=TEXT("");
_sntprintf_s(szMessage,CountArray(szMessage),TEXT("由于您的比赛币低于 %d您将不能继续游戏"),m_pMatchOption->MatchType.LockTime.lMatchCullScore);
//发送消息
m_pIGameServiceFrame->SendGameMessage(pIUserItem,szMessage,SMT_EJECT|SMT_CHAT);
//构造结构
DBR_GR_MatchEliminate MatchEliminate;
MatchEliminate.cbMatchType=MATCH_TYPE_LOCKTIME;
MatchEliminate.dwMatchID=m_pMatchOption->dwMatchID;
MatchEliminate.dwMatchNO=m_pMatchOption->dwMatchNO;
MatchEliminate.dwUserID=pIUserItem->GetUserID();
//投递请求
m_pIDataBaseEngine->PostDataBaseRequest(0,DBR_GR_MATCH_ELIMINATE,0,&MatchEliminate,sizeof(MatchEliminate));
//发送数据
m_pIGameServiceFrame->SendData(pIUserItem,MDM_GR_MATCH,SUB_GR_MATCH_ELIMINATE,NULL,0);
continue;
}
////插入分组
//if(InsertDistribute(pIUserItem)==true)
//{
// m_pIGameServiceFrame->SendGameMessage(pIUserItem,TEXT("本局比赛结束,系统正在努力为您分配座位,请稍后..."),SMT_CHAT|SMT_TABLE_ROLL);
//}
bool bFinish = false;
//完成局数
if(pIUserItem->GetUserPlayCount()-pIUserItem->GetUserInfo()->dwFleeCount >= m_pMatchOption->MatchType.LockTime.wMatchPlayCount)
{
bFinish = true;
cbFinishVec[i] = 1; //设置成true标志;
TCHAR szMessage[128]=TEXT("");
_sntprintf_s(szMessage,CountArray(szMessage),TEXT("您已完成%d局比赛可以继续当前比赛或选择退出等待本次比赛活动结束后排名"),m_pMatchOption->MatchType.LockTime.wMatchPlayCount);
m_pIGameServiceFrame->SendGameMessage(pIUserItem,szMessage,SMT_CHAT|SMT_TABLE_ROLL);
//构造结构;
DBR_GR_MatchRecordGrades MatchRecordGrades;
//设置变量
MatchRecordGrades.dwUserID = pIUserItem->GetUserID();
MatchRecordGrades.dwMatchID = m_pMatchOption->dwMatchID;
MatchRecordGrades.lMatchNo = m_pMatchOption->dwMatchNO;
MatchRecordGrades.wServerID = m_pGameServiceOption->wServerID;
MatchRecordGrades.lInitScore = m_pMatchOption->MatchType.LockTime.lMatchInitScore;
//投递数据
m_pIDataBaseEngine->PostDataBaseRequest(MatchRecordGrades.dwUserID, DBR_GR_MATCH_RECORD_GRADES, 0, &MatchRecordGrades, sizeof(MatchRecordGrades));
}
UpdateMatchScore(pIUserItem,bFinish);
}
}
SortMatchScoreVector();
for (WORD i = 0; i<wChairCount; i++)
{
IServerUserItem *pIUserItem = pITableFrame->GetTableUserItem(i);
ASSERT(pIUserItem != NULL);
if (pIUserItem == NULL) continue;
//完成局数打完了;
if (cbFinishVec[i])
{
SendMatchPlayerFinish(pIUserItem);
//重新设置分数;
SendMatchUserInitScore(pIUserItem);
}
}
PerformAllUserStandUp(pITableFrame);
return true;
}
//用户坐下
bool CLockTimeMatch::OnActionUserSitDown(WORD wTableID, WORD wChairID, IServerUserItem * pIServerUserItem, bool bLookonUser)
{
return true;
}
//用户起立
bool CLockTimeMatch::OnActionUserStandUp(WORD wTableID, WORD wChairID, IServerUserItem * pIServerUserItem, bool bLookonUser)
{
////移除分组;
//return RemoveDistribute(pIServerUserItem);
return true;
}
//用户同意
bool CLockTimeMatch::OnActionUserOnReady(WORD wTableID, WORD wChairID, IServerUserItem * pIServerUserItem, VOID * pData, WORD wDataSize)
{
return true;
}
//参赛权限
bool CLockTimeMatch::VerifyUserEnterMatch(IServerUserItem * pIServerUserItem)
{
ASSERT(pIServerUserItem!=NULL);
if (pIServerUserItem==NULL) return false;
//机器人不受限制
if (pIServerUserItem->IsAndroidUser()==true)
return true;
//变量定义
WORD wMessageType;
TCHAR szMessage[128]=TEXT("");
//结束时间已到
if (VerifyMatchTime(szMessage,CountArray(szMessage),wMessageType)==false)
{
//发送消息
m_pIGameServiceFrame->SendRoomMessage(pIServerUserItem,szMessage,wMessageType);
return false;
}
//达到淘汰线
if (m_pMatchOption->MatchType.LockTime.lMatchCullScore>0 && pIServerUserItem->GetUserScore()<m_pMatchOption->MatchType.LockTime.lMatchCullScore)
{
_sntprintf_s(szMessage,CountArray(szMessage),TEXT("由于您的比赛币低于 %d您将不能继续游戏"),m_pMatchOption->MatchType.LockTime.lMatchCullScore);
//发送消息
if(pIServerUserItem->GetTableID()==INVALID_TABLE)
{
m_pIGameServiceFrame->SendRoomMessage(pIServerUserItem,szMessage,SMT_EJECT|SMT_CHAT);
}
else
{
m_pIGameServiceFrame->SendGameMessage(pIServerUserItem,szMessage,SMT_EJECT|SMT_CHAT);
}
return false;
}
return true;
}
//开始间隔
DWORD CLockTimeMatch::GetMatchStartInterval()
{
//获取时间
CTime CurTime=CTime::GetCurrentTime();
CTime MatchStartTime(m_pMatchOption->MatchType.LockTime.MatchStartTime);
CTime MatchEndTime(m_pMatchOption->MatchType.LockTime.MatchEndTime);
//变量定义
LONGLONG dwTimeInterval=1;
DWORD dwCurrStamp,dwStartStamp,dwEndStamp;
//比赛未开始
if(CurTime<MatchStartTime)
{
CTimeSpan TimeSpan = MatchStartTime-CurTime;
dwTimeInterval = TimeSpan.GetTotalSeconds();
}
//比赛已结束
if(CurTime>=MatchEndTime) dwTimeInterval=0;
//计算时间
dwCurrStamp = CurTime.GetHour()*3600+CurTime.GetMinute()*60+CurTime.GetSecond();
dwStartStamp = m_pMatchOption->MatchType.LockTime.MatchStartTime.wHour*3600+m_pMatchOption->MatchType.LockTime.MatchStartTime.wMinute*60+m_pMatchOption->MatchType.LockTime.MatchStartTime.wSecond;
dwEndStamp = m_pMatchOption->MatchType.LockTime.MatchEndTime.wHour*3600+m_pMatchOption->MatchType.LockTime.MatchEndTime.wMinute*60+m_pMatchOption->MatchType.LockTime.MatchEndTime.wSecond;
//比赛未开始
if(dwCurrStamp<dwStartStamp)
{
dwTimeInterval = dwStartStamp-dwCurrStamp;
}
if (CurTime < MatchEndTime && IsRoundMatchMode())
{
//比赛已结束;
if (dwCurrStamp >= dwEndStamp)
{
dwTimeInterval = 24 * 3600 - (dwCurrStamp - dwStartStamp);
}
}
return (DWORD)dwTimeInterval;
}
//分配用户
bool CLockTimeMatch::PerformDistribute()
{
//状态判断
if(m_MatchStatus!=MS_MATCHING) return true;
//人数校验
if(m_DistributeManage.GetCount()<m_pGameServiceOption->wMinDistributeUser) return false;
WORD wChairCount = m_pGameServiceAttrib->wChairCount;
//分配用户;
while(true)
{
//变量定义;
CDistributeInfoArray DistributeInfoArray;
//获取用户;
WORD wDistributeCount = m_DistributeManage.PerformDistribute(DistributeInfoArray,wChairCount);
if(wDistributeCount < wChairCount) break;
//寻找位置;
ITableFrame * pICurrTableFrame=NULL;
for (WORD i=0;i<m_pGameServiceOption->wTableCount;i++)
{
//获取对象
ASSERT(m_ppITableFrame[i]!=NULL);
ITableFrame * pITableFrame=m_ppITableFrame[i];
//状态判断
if (pITableFrame->GetNullChairCount()==pITableFrame->GetChairCount())
{
pICurrTableFrame=pITableFrame;
break;
}
}
//桌子判断
if(pICurrTableFrame==NULL) break;
//玩家坐下
bool bSitSuccess=true;
INT_PTR nSitFailedIndex=INVALID_CHAIR;
for(INT_PTR nIndex=0;nIndex<DistributeInfoArray.GetCount();nIndex++)
{
//变量定义
WORD wChairID=INVALID_CHAIR;
//椅子搜索
for (WORD i=0;i<pICurrTableFrame->GetChairCount();i++)
{
if (pICurrTableFrame->GetTableUserItem(i)==NULL)
{
wChairID = i;
break;
}
}
//分配用户
if (wChairID!=INVALID_CHAIR)
{
//获取用户
IServerUserItem * pIServerUserItem=DistributeInfoArray[nIndex].pIServerUserItem;
//用户起立
if (pIServerUserItem->GetTableID()!=INVALID_TABLE)
{
WORD wTableID=pIServerUserItem->GetTableID();
ITableFrame * pITableFrame = m_ppITableFrame[wTableID];
pITableFrame->PerformStandUpAction(pIServerUserItem);
}
//用户坐下
if(pICurrTableFrame->PerformSitDownAction(wChairID,pIServerUserItem)==false)
{
bSitSuccess=false;
nSitFailedIndex=nIndex;
break;
}
// 日志;
#if _DEBUG
IServerUserItem* pMeServerUserItem = pIServerUserItem;
//构造提示;
TCHAR szDescribe[128] = TEXT("");
_sntprintf_s(szDescribe, CountArray(szDescribe), TEXT("player [%s] PerformDistribute, GetUserStatus:[%d]."),
pMeServerUserItem->GetNickName(), pMeServerUserItem->GetUserStatus());
CTraceService::TraceString(szDescribe, TraceLevel_Warning);
#endif
}
}
//坐下结果
if(bSitSuccess)
{
if (pICurrTableFrame&&pICurrTableFrame->IsGameStarted() == false)
{
for (int i = 0; i < wChairCount; i++)
{
IServerUserItem * pIServerUserItem = pICurrTableFrame->GetTableUserItem(i);
if (pIServerUserItem && pIServerUserItem->GetTableID() != INVALID_TABLE)
{
if (pIServerUserItem->IsClientReady() == false)
{
pICurrTableFrame->ImitateGameOption(pIServerUserItem);
}
}
}
}
//移除结点
while(DistributeInfoArray.GetCount()>0)
{
m_DistributeManage.RemoveDistributeNode((tagDistributeNode *)DistributeInfoArray[0].pPertainNode);
DistributeInfoArray.RemoveAt(0);
}
}
else
{
for(INT_PTR nIndex=0;nIndex<DistributeInfoArray.GetCount();nIndex++)
{
if(nSitFailedIndex==nIndex)
{
m_DistributeManage.RemoveDistributeNode((tagDistributeNode *)DistributeInfoArray[nIndex].pPertainNode);
}
else
{
//用户起立
if (DistributeInfoArray[nIndex].pIServerUserItem->GetTableID()!=INVALID_TABLE)
{
WORD wTableID=DistributeInfoArray[nIndex].pIServerUserItem->GetTableID();
m_ppITableFrame[wTableID]->PerformStandUpAction(DistributeInfoArray[nIndex].pIServerUserItem);
}
}
}
}
}
return true;
}
//插入用户
bool CLockTimeMatch::InsertDistribute(IServerUserItem * pIServerUserItem)
{
//效验参数
ASSERT(pIServerUserItem!=NULL);
if (pIServerUserItem==NULL) return false;
//比赛状态;
if ((m_MatchStatus != MS_WAITPLAY) && (m_MatchStatus != MS_MATCHING)) return false;
//状态判断
ASSERT(pIServerUserItem->GetUserStatus()<US_PLAYING);
if (pIServerUserItem->GetUserStatus()>=US_PLAYING) return false;
//参赛校验
if(VerifyUserEnterMatch(pIServerUserItem)==false) return false;
////存在判断;
//if (m_DistributeManage.SearchNode(pIServerUserItem) != NULL)
//{
// return true;
//}
//变量定义
tagDistributeInfo DistributeInfo;
ZeroMemory(&DistributeInfo,sizeof(DistributeInfo));
//设置变量
DistributeInfo.pPertainNode=NULL;
DistributeInfo.dwInsertStamp = (DWORD)time(NULL);
DistributeInfo.pIServerUserItem=pIServerUserItem;
//插入节点
if(m_DistributeManage.InsertDistributeNode(DistributeInfo)==false)
{
return pIServerUserItem->IsAndroidUser()?false:true;
}
//等待开始;
if (m_MatchStatus == MS_WAITPLAY)
{
SendMatchInfo(NULL);
}
return true;
}
//清除玩家
void CLockTimeMatch::ClearSameTableUser(DWORD dwUserID)
{
//变量定义
tagSameTableInfo * pSameTableInfo = m_DistributeManage.GetUserSameTableInfo(dwUserID);
if(pSameTableInfo!=NULL)
{
pSameTableInfo->wPlayerCount=0;
ZeroMemory(pSameTableInfo->wPlayerIDSet,sizeof(pSameTableInfo->wPlayerIDSet));
}
}
//插入用户
void CLockTimeMatch::InserSameTableUser(DWORD dwUserID,DWORD dwTableUserID)
{
//变量定义
tagSameTableInfo * pSameTableInfo = m_DistributeManage.GetUserSameTableInfo(dwUserID);
if(pSameTableInfo!=NULL)
{
//添加用户
pSameTableInfo->wPlayerIDSet[pSameTableInfo->wPlayerCount++] = dwTableUserID;
}
return;
}
//事件校验
bool CLockTimeMatch::VerifyMatchTime(LPTSTR pszMessage,WORD wMaxCount,WORD & wMessageType)
{
//变量定义;
CTime CurTime=CTime::GetCurrentTime();
CTime MatchStartTime(m_pMatchOption->MatchType.LockTime.MatchStartTime);
CTime MatchEndTime(m_pMatchOption->MatchType.LockTime.MatchEndTime);
CTime SignupStartTime(m_pMatchOption->MatchType.LockTime.SignupStartTime);
CTime SignupEndTime(m_pMatchOption->MatchType.LockTime.SignupEndTime);
int nCurrSeconds = CurTime.GetHour() * 3600 + CurTime.GetMinute() * 60 + CurTime.GetSecond();
//设置类型
wMessageType = SMT_EJECT|SMT_CHAT;
//比赛已结束;
if(CurTime>=MatchEndTime)
{
wMessageType |= SMT_CLOSE_ROOM|SMT_CLOSE_GAME;
_sntprintf(pszMessage,wMaxCount,TEXT("比赛已经结束,请您移驾至其他比赛房间参与比赛吧!"));
return false;
}
//比赛已结束;
if (nCurrSeconds >= MatchEndTime.GetHour() * 3600 + MatchEndTime.GetMinute() * 60 + MatchEndTime.GetSecond())
{
wMessageType |= SMT_CLOSE_ROOM|SMT_CLOSE_GAME;
_sntprintf(pszMessage,wMaxCount,TEXT("今天的比赛已经结束,请您于明天%d时%d分%d秒前来参加比赛"),MatchStartTime.GetHour(),MatchStartTime.GetMinute(),MatchStartTime.GetSecond());
return false;
}
//报名未开始;
if (CurTime < SignupStartTime)
{
wMessageType |= SMT_CLOSE_ROOM;
_sntprintf(pszMessage, wMaxCount, TEXT("比赛报名尚未开始,本场比赛报名时段为:%d-%d-%d %d:%d:%d至%d-%d-%d %d:%d:%d"),
SignupStartTime.GetYear(), SignupStartTime.GetMonth(), SignupStartTime.GetDay(), SignupStartTime.GetHour(), SignupStartTime.GetMinute(), SignupStartTime.GetSecond(),
SignupEndTime.GetYear(), SignupEndTime.GetMonth(), SignupEndTime.GetDay(), SignupEndTime.GetHour(), SignupEndTime.GetMinute(), SignupEndTime.GetSecond());
return false;
}
//报名未开始;
if (IsRoundMatchMode() && nCurrSeconds < (SignupStartTime.GetHour() * 3600 + SignupStartTime.GetMinute() * 60 + SignupStartTime.GetSecond()))
{
wMessageType |= SMT_CLOSE_ROOM;
_sntprintf(pszMessage, wMaxCount, TEXT("比赛报名尚未开始,请您于今天%d时%d分%d秒前来报名参加比赛"), SignupStartTime.GetHour(), SignupStartTime.GetMinute(), SignupStartTime.GetSecond());
return false;
}
return true;
}
//发送用户分数
bool CLockTimeMatch::SendMatchUserScore(IServerUserItem * pIServerUserItem)
{
//发送数据
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.lGrade=pUserInfo->lGrade;
UserScore.UserScore.lInsure=pUserInfo->lInsure;
UserScore.UserScore.lScore=pUserInfo->lScore;
UserScore.UserScore.dwUserMedal=pUserInfo->dwUserMedal;
return m_pIGameServiceFrame->SendData(BG_ALL_CLIENT,MDM_GR_USER,SUB_GR_USER_SCORE,&UserScore,sizeof(UserScore));
}
//移除玩家
bool CLockTimeMatch::RemoveDistribute(IServerUserItem * pIServerUserItem)
{
//验证参数
ASSERT(pIServerUserItem!=NULL);
if (pIServerUserItem==NULL) return false;
//移除用户
m_DistributeManage.RemoveDistributeNode(pIServerUserItem);
return true;
}
//获取名次
WORD CLockTimeMatch::GetUserRank(IServerUserItem *pUserItem, ITableFrame *pITableFrame)
{
//参数效验
ASSERT(pUserItem!=NULL);
if(pUserItem==NULL) return INVALID_WORD;
if (!pITableFrame)
{
return INVALID_WORD;
}
//定义变量
SCORE lUserScore=pUserItem->GetUserScore();
WORD wRank=1;
DWORD dwUserID=0;
IServerUserItem *pLoopUserItem=NULL;
ASSERT(pUserItem->GetTableID()==pITableFrame->GetTableID());
if(pUserItem->GetTableID()!=pITableFrame->GetTableID()) return INVALID_WORD;
for(WORD i=0; i<m_pGameServiceAttrib->wChairCount; i++)
{
pLoopUserItem=pITableFrame->GetTableUserItem(i);
if(pLoopUserItem==NULL) continue;
if(pLoopUserItem!=pUserItem && pLoopUserItem->GetUserScore()>lUserScore)
wRank++;
}
return wRank;
}
DWORD CLockTimeMatch::GetUserRank(IServerUserItem *pUserItem)
{
if (NULL == pUserItem)
{
return INVALID_DWORD;
}
tagMatchScore* pMatchScore = FindMatchScore(pUserItem);
if (NULL == pMatchScore)
{
return INVALID_DWORD;
}
tagMatchScorePtrVector::iterator iterFind = std::find(m_AllMatchScorePtrVector.begin(), m_AllMatchScorePtrVector.end(), pMatchScore);
if ( iterFind == m_AllMatchScorePtrVector.end())
{
return INVALID_DWORD;
}
return (iterFind - m_AllMatchScorePtrVector.begin() + 1);
}
//发送比赛信息
void CLockTimeMatch::SendTableUserMatchInfo(ITableFrame *pITableFrame, WORD wChairID)
{
//验证参数
ASSERT(pITableFrame!=NULL);
if (pITableFrame==NULL) return;
//构造数据
CMD_GR_Match_Info MatchInfo;
ZeroMemory(&MatchInfo,sizeof(MatchInfo));
MatchInfo.wTotalCount = m_pMatchOption->MatchType.LockTime.wMatchPlayCount;
for(WORD i=0; i<pITableFrame->GetChairCount(); i++)
{
//获取用户;
if(wChairID!=INVALID_CHAIR && wChairID!=i) continue;
IServerUserItem *pIServerUserItem=pITableFrame->GetTableUserItem(i);
if(pIServerUserItem==NULL) continue;
//设置局数
MatchInfo.wGameCount=(WORD)pIServerUserItem->GetUserPlayCount()+1;
//MatchInfo.wRank=GetUserRank(pIServerUserItem,pITableFrame);
MatchInfo.wRank = GetUserRank(pIServerUserItem);
MatchInfo.wRankSize = sizeof(MatchInfo.rankInfo) / sizeof(MatchInfo.rankInfo[0]);
GetCMDGRMatchRankInfo(MatchInfo.rankInfo, MatchInfo.wRankSize);
//发送数据
if (pIServerUserItem->IsAndroidUser()==false)
{
pITableFrame->SendTableData(i,SUB_GR_MATCH_INFO,&MatchInfo,sizeof(MatchInfo),MDM_GR_MATCH);
}
}
return;
}
void CLockTimeMatch::SendTableUserMatchInfo(IServerUserItem* pIServerUserItem)
{
if (pIServerUserItem == NULL || pIServerUserItem->IsAndroidUser()) return;
//构造数据
CMD_GR_Match_Info MatchInfo;
ZeroMemory(&MatchInfo, sizeof(MatchInfo));
//设置局数;
MatchInfo.wTotalCount = m_pMatchOption->MatchType.LockTime.wMatchPlayCount;
MatchInfo.wGameCount = (WORD)pIServerUserItem->GetUserPlayCount() + 1;
MatchInfo.wRank = GetUserRank(pIServerUserItem);
MatchInfo.wRankSize = sizeof(MatchInfo.rankInfo) / sizeof(MatchInfo.rankInfo[0]);
GetCMDGRMatchRankInfo(MatchInfo.rankInfo, MatchInfo.wRankSize);
m_pIGameServiceFrame->SendData(pIServerUserItem, MDM_GR_MATCH, SUB_GR_MATCH_INFO, &MatchInfo, sizeof(MatchInfo));
}
//写入奖励
bool CLockTimeMatch::WriteUserAward(IServerUserItem *pIServerUserItem,tagMatchRankInfo * pMatchRankInfo)
{
//参数效验
ASSERT(pMatchRankInfo!=NULL);
if(pMatchRankInfo==NULL) return false;
//在线玩家;
if (pIServerUserItem != NULL)
{
//变量定义
CMD_GR_MatchResult MatchResult;
ZeroMemory(&MatchResult, sizeof(MatchResult));
//比赛奖励
MatchResult.lGold = pMatchRankInfo->lRewardGold;
MatchResult.dwIngot = pMatchRankInfo->dwRewardIngot;
MatchResult.dwExperience = pMatchRankInfo->dwRewardExperience;
MatchResult.lInsureScore = pMatchRankInfo->lInsureSocre;
//获奖提示
_sntprintf_s(MatchResult.szDescribe, CountArray(MatchResult.szDescribe), TEXT("%s, 恭喜您在%s中获得第%d名,奖励如下:"),
pIServerUserItem->GetNickName(), m_pMatchOption->szMatchName, pMatchRankInfo->wRankID);
////更新用户信息
//tagUserInfo * pUserInfo = pIServerUserItem->GetUserInfo();
////pUserInfo->lIngot+=pMatchRankInfo->dwRewardIngot;
//pUserInfo->dwExperience += pMatchRankInfo->dwRewardExperience;
//OnEventUserItemScore(pIServerUserItem, 0);
//发送数据
if (pIServerUserItem->IsAndroidUser() == false)
{
m_pIGameServiceFrame->SendData(pIServerUserItem, MDM_GR_MATCH, SUB_GR_MATCH_RESULT, &MatchResult, sizeof(MatchResult));
}
}
//写入记录;
if(m_pIDataBaseEngine!=NULL)
{
//变量定义;
DBR_GR_MatchReward MatchReward;
ZeroMemory(&MatchReward,sizeof(MatchReward));
//构造结构;
MatchReward.dwUserID = pMatchRankInfo->dwUserID;
MatchReward.lRewardGold = pMatchRankInfo->lRewardGold;
MatchReward.dwRewardIngot = pMatchRankInfo->dwRewardIngot;
MatchReward.dwRewardExperience = pMatchRankInfo->dwRewardExperience;
MatchReward.dwClientAddr = pIServerUserItem ? pIServerUserItem->GetClientAddr() : 0;
MatchReward.lInsureSocre = pMatchRankInfo->lInsureSocre;
MatchReward.dwGoodsID = pMatchRankInfo->dwGoodsID;
MatchReward.dwGoodsNum = pMatchRankInfo->dwGoodsNum;
//投递数据
m_pIDataBaseEngine->PostDataBaseRequest(MatchReward.dwUserID,DBR_GR_MATCH_REWARD,0,&MatchReward,sizeof(MatchReward));
}
return true;
}
//发送数据
bool CLockTimeMatch::SendMatchInfo(IServerUserItem * pIServerUserItem)
{
CMD_GR_Match_Num MatchNum;
ZeroMemory(&MatchNum,sizeof(MatchNum));
MatchNum.dwWaitting=m_pIServerUserManager->GetUserItemCount();
MatchNum.dwTotal=m_pGameServiceAttrib->wChairCount;
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));
return true;
}
bool CLockTimeMatch::SendMatchUserInitScore(IServerUserItem * pIServerUserItem)
{
//获取成绩
tagUserInfo *pUserScore = pIServerUserItem->GetUserInfo();
//设置成绩
pUserScore->dwWinCount = 0L;
pUserScore->dwLostCount = 0L;
pUserScore->dwFleeCount = 0L;
pUserScore->dwDrawCount = 0L;
pUserScore->lGrade = 0L;
pUserScore->lScore = m_pMatchOption->MatchType.LockTime.lMatchInitScore;
//特殊需求重新设置;
pUserScore->cbScoreMultiple = 1;
//发送分数
return SendMatchUserScore(pIServerUserItem);
}
bool CLockTimeMatch::IsNormalMatchMode()
{
return (m_pMatchOption->MatchType.LockTime.cbMatchMode == MATCH_MODE_NORMAL);
}
bool CLockTimeMatch::IsRoundMatchMode()
{
return (m_pMatchOption->MatchType.LockTime.cbMatchMode == MATCH_MODE_ROUND);
}
void CLockTimeMatch::UpdateMatchStatus()
{
//变量定义;
CTime CurTime = CTime::GetCurrentTime();
CTime MatchEndTime(m_pMatchOption->MatchType.LockTime.MatchEndTime);
CTime MatchStartTime(m_pMatchOption->MatchType.LockTime.MatchStartTime);
//比赛未开始;
BYTE MatchStatus = m_MatchStatus;
DWORD nCurSeconds = CurTime.GetHour() * 3600 + CurTime.GetMinute() * 60 + CurTime.GetSecond();
DWORD nMatchStartSeconds = MatchStartTime.GetHour() * 3600 + MatchStartTime.GetMinute() * 60 + MatchStartTime.GetSecond();
DWORD nMatchEndSeconds = MatchEndTime.GetHour() * 3600 + MatchEndTime.GetMinute() * 60 + MatchEndTime.GetSecond();
//比赛进行中;
if (MatchStatus == MS_NULL && nCurSeconds >= nMatchStartSeconds)
{
MatchStatus = MS_MATCHING;
}
//等待结束;
if (MatchStatus == MS_MATCHING && nCurSeconds >= nMatchEndSeconds)
{
MatchStatus = MS_WAITEND;
}
//结束判断;
if (MatchStatus == MS_WAITEND)
{
//变量定义;
bool bContinueWait = false;
//解散游戏;
for (INT i = 0; i < m_pGameServiceOption->wTableCount; i++)
{
//获取对象;
ITableFrame * pITableFrame = m_ppITableFrame[i];
if (pITableFrame == NULL)
{
continue;
}
//解散游戏;
if (pITableFrame->IsGameStarted())
{
bContinueWait = true;
break;
}
}
//无需等待;
if (bContinueWait == false)
{
MatchStatus = MS_MATCHEND;
}
//强制结束;
if (nCurSeconds >= (nMatchEndSeconds + m_pMatchOption->MatchType.LockTime.dwEndDelayTime))
{
MatchStatus = MS_MATCHEND;
}
}
//设置状态;
m_MatchStatus = MatchStatus;
}
VOID CLockTimeMatch::PerformAllUserStandUp(ITableFrame *pITableFrame)
{
//参数校验;
ASSERT(pITableFrame != NULL);
if (pITableFrame == NULL)
{
return;
}
//处理起立;
for (int i = 0; i < m_pGameServiceAttrib->wChairCount; i++)
{
//获取用户;
IServerUserItem * pUserServerItem = pITableFrame->GetTableUserItem(i);
if (pUserServerItem&&pUserServerItem->GetTableID() != INVALID_TABLE)
{
//设置状态;
pUserServerItem->SetUserMatchStatus(MUS_NULL);
pITableFrame->PerformStandUpAction(pUserServerItem);
}
}
}
DWORD CLockTimeMatch::CalcMatchNo()
{
////循环开赛;
//if (IsRoundMatchMode())
//{
// //变量定义;
// SYSTEMTIME SystemStartTime = m_pMatchOption->MatchType.LockTime.MatchStartTime;
// //设置变量;
// SystemStartTime.wHour = 0;
// SystemStartTime.wMinute = 0;
// SystemStartTime.wSecond = 0;
// SystemStartTime.wMilliseconds = 0;
// //获取时间;
// CTime CurTime = CTime::GetCurrentTime();
// CTime MatchStartTime(SystemStartTime);
// //变量定义;
// CTimeSpan TimeSpan = CurTime - MatchStartTime;
// return TimeSpan.GetDays() + m_pMatchOption->dwMatchNO;
//}
return m_pMatchOption->dwMatchNO;
}
void CLockTimeMatch::ReleaseMatchScore()
{
tagMatchScorePtrVector::iterator iter = m_AllMatchScorePtrVector.begin();
tagMatchScorePtrVector::iterator iterEnd = m_AllMatchScorePtrVector.end();
for (; iter != iterEnd; ++iter)
{
tagMatchScore* pMatchScore = *iter;
if (pMatchScore != NULL)
{
delete pMatchScore;
pMatchScore = NULL;
}
}
m_AllMatchScorePtrMap.clear();
m_AllMatchScorePtrVector.clear();
}
void CLockTimeMatch::CreateNewMatchScore(IServerUserItem *pIServerUserItem)
{
if (NULL == pIServerUserItem) return;
tagMatchScore* pMatchScore = new tagMatchScore();
pMatchScore->dwUserID = pIServerUserItem->GetUserID();
pMatchScore->pUserItem = pIServerUserItem;
memcpy(pMatchScore->szNickName, pIServerUserItem->GetNickName(), sizeof(pMatchScore->szNickName));
m_AllMatchScorePtrMap.insert(std::make_pair(pMatchScore->dwUserID, pMatchScore));
m_AllMatchScorePtrVector.push_back(pMatchScore);
}
void CLockTimeMatch::InsertAllMatchScoreMap(IServerUserItem *pIServerUserItem)
{
if (NULL == pIServerUserItem) return;
if (NULL != FindMatchScore(pIServerUserItem)) return;
CreateNewMatchScore(pIServerUserItem);
}
void CLockTimeMatch::InsertAllMatchScoreMap(tagMatchRankDataInfo * pMatchRankDataInfo)
{
tagMatchScore* pMatchScore = new tagMatchScore();
pMatchScore->dwUserID = pMatchRankDataInfo->dwUserID;
pMatchScore->lScore = pMatchRankDataInfo->lScore;
pMatchScore->lFinishMaxScore = pMatchRankDataInfo->lFinishMaxScore;
memcpy(pMatchScore->szNickName, pMatchRankDataInfo->szNickName, sizeof(pMatchScore->szNickName));
m_AllMatchScorePtrMap.insert(std::make_pair(pMatchScore->dwUserID, pMatchScore));
m_AllMatchScorePtrVector.push_back(pMatchScore);
}
tagMatchScore* CLockTimeMatch::FindMatchScore(IServerUserItem *pIServerUserItem)
{
if (NULL == pIServerUserItem) return NULL;
DWORD dwUserID = pIServerUserItem->GetUserID();
tagMatchScorePtrMap::iterator iterFind = m_AllMatchScorePtrMap.find(dwUserID);
if (iterFind != m_AllMatchScorePtrMap.end())
{
return iterFind->second;
}
return NULL;
}
void CLockTimeMatch::UpdateMatchScore(IServerUserItem *pIServerUserItem, bool bFinish)
{
if (NULL == pIServerUserItem) return;
tagMatchScore* pMatchScore = FindMatchScore(pIServerUserItem);
if (NULL == pMatchScore)
{
return;
}
SCORE lMatchInitScore = m_pMatchOption->MatchType.LockTime.lMatchInitScore;
SCORE lUserGetScore = pIServerUserItem->GetUserScore() - lMatchInitScore;
if (lUserGetScore < 0)
{
lUserGetScore = 0;
}
if (pMatchScore->lScore < lUserGetScore)
{
pMatchScore->lScore = lUserGetScore;
}
if (bFinish && (pMatchScore->lFinishMaxScore < lUserGetScore))
{
pMatchScore->lFinishMaxScore = lUserGetScore;
}
}
void CLockTimeMatch::SortMatchScoreVector()
{
std::make_heap(m_AllMatchScorePtrVector.begin(), m_AllMatchScorePtrVector.end(), ObjGreatCmp<SCORE, tagMatchScore*>(&tagMatchScore::GetCurMaxScore));
std::sort_heap(m_AllMatchScorePtrVector.begin(), m_AllMatchScorePtrVector.end(), ObjGreatCmp<SCORE, tagMatchScore*>(&tagMatchScore::GetCurMaxScore));
}
void CLockTimeMatch::GetCMDGRMatchRankInfo(CMD_GR_Match_Rank_Info* pRankInfo, WORD& refRankSize)
{
int nVectorSize = m_AllMatchScorePtrVector.size();
if (refRankSize > nVectorSize)
{
refRankSize = nVectorSize;
}
for (int i = 0; i < refRankSize; ++i)
{
tagMatchScore* pMatchScore = m_AllMatchScorePtrVector[i];
pRankInfo[i].lScore = pMatchScore->GetCurMaxScore();
memcpy(pRankInfo[i].szNickName, pMatchScore->szNickName, sizeof(pMatchScore->szNickName));
}
}
void CLockTimeMatch::SendMatchJoinResult(IServerUserItem* pIServerUserItem, WORD wSuccess, LPCTSTR lpszMessage)
{
CMD_GR_Match_JoinResult kResult;
kResult.wSucess = wSuccess;
kResult.wServerID = m_pGameServiceOption->wServerID;
kResult.wLength = lstrlen(lpszMessage) + 1;
lstrcpyn(kResult.szString, lpszMessage, CountArray(kResult.szString));
m_pIGameServiceFrame->SendData(pIServerUserItem, MDM_GR_MATCH, SUB_GR_MATCH_JOIN_RESULT, &kResult, sizeof(kResult));
}
void CLockTimeMatch::SendMatchPlayerFinish(IServerUserItem* pIServerUserItem)
{
CMD_GR_Match_PlayerFinish playerFinish;
memset(&playerFinish, 0, sizeof(playerFinish));
SCORE lMatchInitScore = m_pMatchOption->MatchType.LockTime.lMatchInitScore;
playerFinish.lScore = pIServerUserItem->GetUserScore() - lMatchInitScore;
if (playerFinish.lScore < 0) playerFinish.lScore = 0;
tagMatchScore* pMatchScore = FindMatchScore(pIServerUserItem);
if (pMatchScore!=NULL)
{
playerFinish.lMaxScore = pMatchScore->lFinishMaxScore;
}
playerFinish.wRank = GetUserRank(pIServerUserItem);
m_pIGameServiceFrame->SendData(pIServerUserItem, MDM_GR_MATCH, SUB_GR_MATCH_PLAYERFINISH, &playerFinish, sizeof(playerFinish));
}
bool CLockTimeMatch::VerifySignupMatchTime(LPTSTR pszMessage, WORD wMaxCount, WORD & wMessageType)
{
//变量定义;
CTime CurTime = CTime::GetCurrentTime();
CTime MatchStartTime(m_pMatchOption->MatchType.LockTime.MatchStartTime);
CTime MatchEndTime(m_pMatchOption->MatchType.LockTime.MatchEndTime);
CTime SignupStartTime(m_pMatchOption->MatchType.LockTime.SignupStartTime);
CTime SignupEndTime(m_pMatchOption->MatchType.LockTime.SignupEndTime);
int nCurrSeconds = CurTime.GetHour() * 3600 + CurTime.GetMinute() * 60 + CurTime.GetSecond();
//设置类型
wMessageType = SMT_EJECT | SMT_CHAT;
//报名结束;
if ((CurTime >= SignupEndTime) && (MatchEndTime.GetMonth() == SignupEndTime.GetMonth()) && (MatchEndTime.GetDay() == SignupEndTime.GetDay()))
{
wMessageType |= SMT_CLOSE_ROOM | SMT_CLOSE_GAME;
_sntprintf(pszMessage, wMaxCount, TEXT("报名已经结束,请您移驾至其他比赛房间参与比赛吧!"));
return false;
}
//报名已结束;
if (nCurrSeconds >= SignupEndTime.GetHour() * 3600 + SignupEndTime.GetMinute() * 60 + SignupEndTime.GetSecond())
{
wMessageType |= SMT_CLOSE_ROOM | SMT_CLOSE_GAME;
_sntprintf(pszMessage, wMaxCount, TEXT("今天的报名已经结束,请您于明天%d时%d分%d秒前来报名比赛"), SignupStartTime.GetHour(), SignupStartTime.GetMinute(), SignupStartTime.GetSecond());
return false;
}
//报名未开始;
if (CurTime < SignupStartTime)
{
wMessageType |= SMT_CLOSE_ROOM;
_sntprintf(pszMessage, wMaxCount, TEXT("比赛报名尚未开始,本场比赛报名时段为:%d-%d-%d %d:%d:%d至%d-%d-%d %d:%d:%d"),
SignupStartTime.GetYear(), SignupStartTime.GetMonth(), SignupStartTime.GetDay(), SignupStartTime.GetHour(), SignupStartTime.GetMinute(), SignupStartTime.GetSecond(),
SignupEndTime.GetYear(), SignupEndTime.GetMonth(), SignupEndTime.GetDay(), SignupEndTime.GetHour(), SignupEndTime.GetMinute(), SignupEndTime.GetSecond());
return false;
}
//报名未开始;
if (IsRoundMatchMode() && nCurrSeconds < (SignupStartTime.GetHour() * 3600 + SignupStartTime.GetMinute() * 60 + SignupStartTime.GetSecond()))
{
wMessageType |= SMT_CLOSE_ROOM;
_sntprintf(pszMessage, wMaxCount, TEXT("比赛报名尚未开始,请您于今天%d时%d分%d秒前来报名参加比赛"), SignupStartTime.GetHour(), SignupStartTime.GetMinute(), SignupStartTime.GetSecond());
return false;
}
//比赛已结束;
if (CurTime >= MatchEndTime)
{
wMessageType |= SMT_CLOSE_ROOM | SMT_CLOSE_GAME;
_sntprintf(pszMessage, wMaxCount, TEXT("比赛已经结束,请您移驾至其他比赛房间参与比赛吧!"));
return false;
}
//比赛已结束;
if (nCurrSeconds >= MatchEndTime.GetHour() * 3600 + MatchEndTime.GetMinute() * 60 + MatchEndTime.GetSecond())
{
wMessageType |= SMT_CLOSE_ROOM | SMT_CLOSE_GAME;
_sntprintf(pszMessage, wMaxCount, TEXT("今天的比赛已经结束,请您于明天%d时%d分%d秒前来参加比赛"), MatchStartTime.GetHour(), MatchStartTime.GetMinute(), MatchStartTime.GetSecond());
return false;
}
return true;
}
void CLockTimeMatch::SendMatchWaitTip(IServerUserItem* pIServerUserItem)
{
//变量定义;
CMD_GR_Match_Wait_Tip WaitTip;
ZeroMemory(&WaitTip, sizeof(WaitTip));
WaitTip.wUserCount = (WORD)m_pIServerUserManager->GetUserItemCount();
WaitTip.wCurGameCount = (WORD)pIServerUserItem->GetUserPlayCount() + 1;
WaitTip.wGameCount = m_pMatchOption->MatchType.LockTime.wMatchPlayCount;
lstrcpyn(WaitTip.szMatchName, m_pMatchOption->szMatchName, LEN_SERVER);
//发送比赛信息给玩家;
WaitTip.wRank = GetUserRank(pIServerUserItem);
WaitTip.lScore = pIServerUserItem->GetUserScore();
WaitTip.cbScoreMultiple = pIServerUserItem->getScoreMultiple();
m_pIGameServiceFrame->SendData(pIServerUserItem, MDM_GR_MATCH, SUB_GR_MATCH_WAIT_TIP, &WaitTip, sizeof(WaitTip));
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////