Files
wnmj/Servers/服务器组件/比赛服务/ImmediateMatch.cpp

1395 lines
41 KiB
C++
Raw Normal View History

2026-02-13 14:34:15 +08:00
#include "StdAfx.h"
#include "ImmediateMatch.h"
#include "..\<5C><>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\DataBasePacket.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
////////////////////////////////////////////////////////////////////////////////////////////////////////////
#define INVALID_VALUE 0xFFFF //<2F><>Чֵ
//////////////////////////////////////////////////////////////////////////
//ʱ<>Ӷ<EFBFBD><D3B6><EFBFBD>
#define IDI_DISTRIBUTE_USER (IDI_MATCH_MODULE_START+50) //<2F><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//<2F><><EFBFBD><EFBFBD><ECBAAF>
CImmediateMatch::CImmediateMatch()
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_pMatchOption=NULL;
m_pGameServiceOption=NULL;
m_pGameServiceAttrib=NULL;
//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
m_ppITableFrame=NULL;
m_pCurMatchGroup=NULL;
//<2F>ں˽ӿ<CBBD>
m_pITimerEngine=NULL;
m_pIDataBaseEngine=NULL;
m_pITCPNetworkEngineEvent=NULL;
//<2F><><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD>
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; i<m_MatchGroup.GetCount(); i++)
{
SafeDelete(m_MatchGroup[i]);
}
m_MatchGroup.RemoveAll();
m_OverMatchGroup.RemoveAll();
}
//<2F>ӿڲ<D3BF>ѯ
VOID* CImmediateMatch::QueryInterface(REFGUID Guid, DWORD dwQueryVer)
{
QUERYINTERFACE(IGameMatchItem,Guid,dwQueryVer);
QUERYINTERFACE(IServerUserItemSink,Guid,dwQueryVer);
QUERYINTERFACE_IUNKNOWNEX(IGameMatchItem,Guid,dwQueryVer);
return NULL;
}
//<2F><><EFBFBD><EFBFBD>֪ͨ
void CImmediateMatch::OnStartService()
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (m_pCurMatchGroup==NULL)
{
m_pCurMatchGroup=new CImmediateGroup((DWORD)time(NULL),m_pMatchOption,this);
}
//<2F><><EFBFBD><EFBFBD>ͬʱ9<CAB1><39><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (int i=0;i<79;i++)
{
m_LoopTimer.Add(i);
}
m_pITimerEngine->SetTimer(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();
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool CImmediateMatch::BindTableFrame(ITableFrame * pTableFrame,WORD wTableID)
{
if(pTableFrame==NULL || wTableID>m_pGameServiceOption->wTableCount)
{
ASSERT(false);
return false;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CTableFrameHook * pTableFrameHook=new CTableFrameHook();
pTableFrameHook->InitTableFrameHook(QUERY_OBJECT_PTR_INTERFACE(pTableFrame,IUnknownEx));
pTableFrameHook->SetMatchEventSink(QUERY_OBJECT_PTR_INTERFACE(this,IUnknownEx));
//<2F><><EFBFBD>ýӿ<C3BD>
pTableFrame->SetTableFrameHook(QUERY_OBJECT_PTR_INTERFACE(pTableFrameHook,IUnknownEx));
m_ppITableFrame[wTableID]=pTableFrame;
return true;
}
//<2F><>ʼ<EFBFBD><CABC><EFBFBD>ӿ<EFBFBD>
bool CImmediateMatch::InitMatchInterface(tagMatchManagerParameter & MatchManagerParameter)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_pMatchOption=MatchManagerParameter.pGameMatchOption;
m_pGameServiceOption=MatchManagerParameter.pGameServiceOption;
m_pGameServiceAttrib=MatchManagerParameter.pGameServiceAttrib;
//<2F>ں<EFBFBD><DABA><EFBFBD><EFBFBD><EFBFBD>
m_pITimerEngine=MatchManagerParameter.pITimerEngine;
m_pIDataBaseEngine=MatchManagerParameter.pICorrespondManager;
m_pITCPNetworkEngineEvent=MatchManagerParameter.pTCPNetworkEngine;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_pIGameServiceFrame=MatchManagerParameter.pIMainServiceFrame;
m_pIServerUserManager=MatchManagerParameter.pIServerUserManager;
m_pAndroidUserManager=MatchManagerParameter.pIAndroidUserManager;
m_pIServerUserItemSink=MatchManagerParameter.pIServerUserItemSink;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CImmediateGroup::m_wChairCount=m_pGameServiceAttrib->wChairCount;
if (m_ppITableFrame==NULL)
{
m_ppITableFrame=new ITableFrame*[m_pGameServiceOption->wTableCount];
}
return true;
}
//ʱ<><CAB1><EFBFBD>¼<EFBFBD>
bool CImmediateMatch::OnEventTimer(DWORD dwTimerID, WPARAM dwBindParameter)
{
if(dwTimerID>=IDI_GROUP_TIMER_START)
{
for (INT_PTR i=m_MatchGroup.GetCount()-1;i>=0;i--)
{
//<2F><EFBFBD><E9BFB4><EFBFBD>ij<EFBFBD><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ķ<EFBFBD>ʱ<EFBFBD><CAB1>
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:
{
//<2F><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>һ<EFBFBD><D2BB> <20><>Щ<EFBFBD><D0A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (INT_PTR i=m_MatchGroup.GetCount()-1;i>=0;i--)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>
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;
}
//<2F><><EFBFBD>ݿ<EFBFBD><DDBF>¼<EFBFBD>
bool CImmediateMatch::OnEventDataBase(WORD wRequestID, IServerUserItem * pIServerUserItem, VOID * pData, WORD wDataSize)
{
switch (wRequestID)
{
case DBO_GR_MATCH_SIGNUP_RESULT: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
//<2F><><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>
if(pIServerUserItem==NULL) return true;
if(wDataSize>sizeof(DBO_GR_MatchSingupResult)) return false;
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
DBO_GR_MatchSingupResult * pMatchSignupResult = (DBO_GR_MatchSingupResult*)pData;
//<2F><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
if(pMatchSignupResult->bResultCode==false)
{
m_pIGameServiceFrame->SendRoomMessage(pIServerUserItem,pMatchSignupResult->szDescribeString,SMT_EJECT);
return true;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(m_pCurMatchGroup->OnUserSignUpMatch(pIServerUserItem)==false)
{
SendRoomMessage(pIServerUserItem, TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD>"),SMT_CHAT);
return false;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>
m_OnMatchUserItem.Add(pIServerUserItem);
SendMatchInfo(NULL);
if(m_pIGameServiceFrame!=NULL)
{
SendRoomMessage(pIServerUserItem, TEXT("<EFBFBD><EFBFBD>ϲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>ϵͳΪ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>"),SMT_CHAT);
}
//<2F><><EFBFBD>Ҹ<EFBFBD><D2B8><EFBFBD>
if(pIServerUserItem->IsAndroidUser()==false)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD>
CMD_GR_MatchGoldUpdate MatchGoldUpdate;
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
MatchGoldUpdate.lCurrGold=pMatchSignupResult->lCurrGold;
MatchGoldUpdate.lCurrIngot=pMatchSignupResult->lCurrIngot;
MatchGoldUpdate.dwCurrExprience=pIServerUserItem->GetUserInfo()->dwExperience;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return SendData(pIServerUserItem,MDM_GR_MATCH,SUB_GR_MATCH_GOLDUPDATE,&MatchGoldUpdate,sizeof(MatchGoldUpdate));
}
break;
}
case DBO_GR_MATCH_UNSIGNUP_RESULT: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
//<2F><><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>
if(pIServerUserItem==NULL) return true;
if(wDataSize>sizeof(DBO_GR_MatchSingupResult)) return false;
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
DBO_GR_MatchSingupResult * pMatchSignupResult = (DBO_GR_MatchSingupResult*)pData;
//<2F>˷<EFBFBD>ʧ<EFBFBD><CAA7>
if(pMatchSignupResult->bResultCode==false)
{
m_pIGameServiceFrame->SendRoomMessage(pIServerUserItem,pMatchSignupResult->szDescribeString,SMT_EJECT);
return true;
}
//<2F><><EFBFBD><EFBFBD>״̬
pIServerUserItem->SetUserMatchStatus(MUS_NULL);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
LPCTSTR pszMatchFeeType[]={TEXT("<EFBFBD><EFBFBD>Ϸ<EFBFBD><EFBFBD>"),TEXT("Ԫ<EFBFBD><EFBFBD>")};
if(m_pMatchOption->cbMatchFeeType<CountArray(pszMatchFeeType))
{
//<2F>˷<EFBFBD>֪ͨ
TCHAR szDescribe[128]=TEXT("");
_sntprintf_s(szDescribe,CountArray(szDescribe),TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˻<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>%I64d%s<><73>"),m_pMatchOption->lMatchFee,pszMatchFeeType[m_pMatchOption->cbMatchFeeType]);
m_pIGameServiceFrame->SendRoomMessage(pIServerUserItem,szDescribe,SMT_EJECT);
}
//<2F><><EFBFBD>Ҹ<EFBFBD><D2B8><EFBFBD>
if(pIServerUserItem->IsAndroidUser()==false)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD>
CMD_GR_MatchGoldUpdate MatchGoldUpdate;
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
MatchGoldUpdate.lCurrGold=pMatchSignupResult->lCurrGold;
MatchGoldUpdate.lCurrIngot=pMatchSignupResult->lCurrIngot;
MatchGoldUpdate.dwCurrExprience=pIServerUserItem->GetUserInfo()->dwExperience;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return SendData(pIServerUserItem,MDM_GR_MATCH,SUB_GR_MATCH_GOLDUPDATE,&MatchGoldUpdate,sizeof(MatchGoldUpdate));
}
break;
}
case DBO_GR_MATCH_RANK_LIST: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
//<2F><><EFBFBD><EFBFBD>У<EFBFBD><D0A3>
ASSERT(wDataSize<=sizeof(DBO_GR_MatchRankList));
if(wDataSize>sizeof(DBO_GR_MatchRankList)) return false;
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
DBO_GR_MatchRankList * pMatchRankList = (DBO_GR_MatchRankList*)pData;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
IServerUserItem * pIRewardUserItem=NULL;
tagMatchRankInfo * pMatchRankInfo=NULL;
//<2F><><EFBFBD>Ž<EFBFBD><C5BD><EFBFBD>
for(WORD wIndex=0;wIndex<pMatchRankList->wUserCount;wIndex++)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
pMatchRankInfo=&pMatchRankList->MatchRankInfo[wIndex];
pIRewardUserItem=m_pIServerUserManager->SearchUserItem(pMatchRankInfo->dwUserID);
if(pIRewardUserItem==NULL || pIRewardUserItem->IsAndroidUser()==true) continue;
//д<><EFBFBD><EBBDB1>
WriteUserAward(pIRewardUserItem,pMatchRankInfo);
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CImmediateGroup * pImmediateGroup=NULL;
//<2F><><EFBFBD>ҷ<EFBFBD><D2B7><EFBFBD>
for (int i=0;i<m_MatchGroup.GetCount();i++)
{
if(m_MatchGroup[i]->m_dwMatchNO==pMatchRankList->dwMatchNO)
{
pImmediateGroup=m_MatchGroup[i];
if(pImmediateGroup!=NULL)
{
//ȫ<><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
pImmediateGroup->RearrangeUserSeat();
//<2F><><EFBFBD>Ϳɱ<CDBF><C9B1><EFBFBD>״̬
BYTE cbMatchStatus=MatchStatus_Null;
SendGroupData(MDM_GR_MATCH, SUB_GR_MATCH_STATUS, &cbMatchStatus, sizeof(cbMatchStatus),pImmediateGroup);
//<2F><>ԭ<EFBFBD><D4AD><EFBFBD><EFBFBD>
m_LoopTimer.Add(pImmediateGroup->m_LoopTimer);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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->SetUserMatchStatus(MUS_NULL);
if (true==OnEventUserQuitMatch(pITempUserItem,0))
wQuitUserCount++;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><CEB4><EFBFBD>أ<EFBFBD><D8A3><EFBFBD><EFBFBD>߳<EFBFBD><DFB3><EFBFBD><EFBFBD><EFBFBD>
bool bAndroidUser=pITempUserItem->IsAndroidUser();
//bool bTrusteeUser=pITempUserItem->IsTrusteeUser();
bool bClientReady=pITempUserItem->IsClientReady();
//if (bAndroidUser==false && bTrusteeUser==true && bClientReady==false)
if (bAndroidUser==false && bClientReady==false)
{
//<2F><EFBFBD><EBBFAA><EFBFBD><EFBFBD>
WORD wTableID=pITempUserItem->GetTableID();
if (wTableID!=INVALID_TABLE)
{
//״̬<D7B4>ж<EFBFBD>
ASSERT (pITempUserItem->GetUserStatus()!=US_PLAYING);
SendGameMessage(pITempUserItem,TEXT(""),SMT_CLOSE_GAME);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD>
for(int m=0;m<pImmediateGroup->m_MatchTableArray.GetCount();m++)
{
if(pITempUserItem->GetTableID()==pImmediateGroup->m_MatchTableArray[m]->wTableID)
{
pImmediateGroup->m_MatchTableArray[m]->pTableFrame->PerformStandUpAction(pITempUserItem);
break;
}
}
}
//<2F><EFBFBD><EBBFAA><EFBFBD><EFBFBD>
if (pITempUserItem->GetBindIndex()==INVALID_WORD)
{
pITempUserItem->SetUserStatus(US_NULL,INVALID_TABLE,INVALID_CHAIR);
}
}
}
}
//У<><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ASSERT(wQuitUserCount==wMatchUserCount);
if (wQuitUserCount!=wMatchUserCount)
{
CTraceService::TraceString(TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"),TraceLevel_Exception);
}
//<2F><><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (int j=0;pImmediateGroup->m_MatchTableArray.GetCount();)
{
tagTableFrameInfo* pTempTable=pImmediateGroup->m_MatchTableArray[j];
pImmediateGroup->m_MatchTableArray.RemoveAt(j);
SafeDelete(pTempTable);
}
}
//<2F>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD>
m_MatchGroup.RemoveAt(i);
m_OverMatchGroup.Add(pImmediateGroup);
break;
}
}
break;
}
case DBO_GR_MATCH_REWARD_RESULT: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
//<2F><><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>
if(pIServerUserItem==NULL) return true;
if(wDataSize>sizeof(DBR_GR_MatchRewardResult)) return false;
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
DBR_GR_MatchRewardResult * pMatchRewardResult = (DBR_GR_MatchRewardResult*)pData;
//<2F><><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>
if(pMatchRewardResult->bResultCode==true)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD>
CMD_GR_MatchGoldUpdate MatchGoldUpdate;
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
MatchGoldUpdate.lCurrGold=pMatchRewardResult->lCurrGold;
MatchGoldUpdate.lCurrIngot=pMatchRewardResult->lCurrIngot;
MatchGoldUpdate.dwCurrExprience=pMatchRewardResult->dwCurrExperience;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SendData(pIServerUserItem,MDM_GR_MATCH,SUB_GR_MATCH_GOLDUPDATE,&MatchGoldUpdate,sizeof(MatchGoldUpdate));
}
break;
}
}
return true;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
bool CImmediateMatch::OnEventSocketMatch(WORD wSubCmdID, VOID * pData, WORD wDataSize, IServerUserItem * pIServerUserItem, DWORD dwSocketID)
{
switch (wSubCmdID)
{
case SUB_GR_MATCH_FEE: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
//<2F><><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>
ASSERT(wDataSize==sizeof(SCORE));
if(wDataSize!=sizeof(SCORE)) return false;
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
SCORE lMatchFee=*(SCORE*)pData;
if(lMatchFee!=m_pMatchOption->lMatchFee)return false;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DBR_GR_MatchSignup MatchSignup;
ZeroMemory(&MatchSignup,sizeof(MatchSignup));
//<2F><><EFBFBD><EFBFBD><EFBFBD>
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;
MatchSignup.cbMatchType = m_pMatchOption->cbMatchType;
lstrcpyn(MatchSignup.szMachineID,pIServerUserItem->GetMachineID(),CountArray(MatchSignup.szMachineID));
//Ͷ<><CDB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_pIDataBaseEngine->PostDataBaseRequest(MatchSignup.dwUserID,DBR_GR_MATCH_SIGNUP,dwSocketID,&MatchSignup,sizeof(MatchSignup));
return true;
}
case SUB_GR_LEAVE_MATCH: //<2F>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD>
{
//<2F><><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>
ASSERT(pIServerUserItem!=NULL);
if(pIServerUserItem==NULL) return false;
OnEventUserQuitMatch(pIServerUserItem,0,0,dwSocketID);
return true;
}
}
return true;
}
//<2F>û<EFBFBD><C3BB><EFBFBD>¼
bool CImmediateMatch::OnEventUserLogon(IServerUserItem * pIServerUserItem)
{
return SendMatchInfo(pIServerUserItem);
}
//<2F>û<EFBFBD><C3BB>dz<EFBFBD>
bool CImmediateMatch::OnEventUserLogout(IServerUserItem * pIServerUserItem)
{
return true;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
bool CImmediateMatch::OnEventEnterMatch(DWORD dwSocketID ,VOID* pData,DWORD dwUserIP, bool bIsMobile)
{
//<2F>ֻ<EFBFBD><D6BB>û<EFBFBD>
if(bIsMobile == true)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
CMD_GR_LogonMobile * pLogonMobile=(CMD_GR_LogonMobile *)pData;
pLogonMobile->szPassword[CountArray(pLogonMobile->szPassword)-1]=0;
pLogonMobile->szMachineID[CountArray(pLogonMobile->szMachineID)-1]=0;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DBR_GR_LogonMobile LogonMobile;
ZeroMemory(&LogonMobile,sizeof(LogonMobile));
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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));
//Ͷ<><CDB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_pIDataBaseEngine->PostDataBaseRequest(LogonMobile.dwUserID,DBR_GR_LOGON_MOBILE,dwSocketID,&LogonMobile,sizeof(LogonMobile));
}
else
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
CMD_GR_LogonUserID * pLogonUserID=(CMD_GR_LogonUserID *)pData;
pLogonUserID->szPassword[CountArray(pLogonUserID->szPassword)-1]=0;
pLogonUserID->szMachineID[CountArray(pLogonUserID->szMachineID)-1]=0;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DBR_GR_LogonUserID LogonUserID;
ZeroMemory(&LogonUserID,sizeof(LogonUserID));
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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));
//Ͷ<><CDB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_pIDataBaseEngine->PostDataBaseRequest(LogonUserID.dwUserID,DBR_GR_LOGON_USERID,dwSocketID,&LogonUserID,sizeof(LogonUserID));
}
return true;
}
//<2F>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>
bool CImmediateMatch::OnEventUserJoinMatch(IServerUserItem * pIServerUserItem, BYTE cbReason,DWORD dwSocketID)
{
ASSERT(pIServerUserItem!=NULL);
if (pIServerUserItem == NULL)
{
CTraceService::TraceString(TEXT("<EFBFBD>û<EFBFBD>ָ<EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD>!"),TraceLevel_Warning);
return true;
}
if(CServerRule::IsForfendRoomEnter(m_pGameServiceOption->dwServerRule))
{
SendRoomMessage(pIServerUserItem, TEXT("<EFBFBD><EFBFBD>Ǹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳά<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>÷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹ<EFBFBD>û<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"),SMT_CHAT|SMT_EJECT);
return true;
}
WORD wTableCount=GetNullTable();
if(wTableCount<m_pMatchOption->MatchType.Immediate.wStartUserCount/CImmediateGroup::m_wChairCount)
{
CString str;
str.Format( TEXT("<EFBFBD><EFBFBD>Ǹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> %d <20><><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD><D3BF>Ա<EFBFBD><D4B1><EFBFBD>"),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("<EFBFBD><EFBFBD>Ǹ<EFBFBD><EFBFBD><EFBFBD>÷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ժ<EFBFBD><EFBFBD>ٱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"),SMT_CHAT);
return true;
}
INT_PTR dwUserCount=m_OnMatchUserItem.GetCount();
for (INT_PTR i=0;i<dwUserCount;i++)
{
if(m_OnMatchUserItem[i]->GetUserID()==pIServerUserItem->GetUserID())
{
SendRoomMessage(pIServerUserItem, TEXT("<EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"),SMT_CHAT|SMT_EJECT);
return true;
}
}
if(m_LoopTimer.GetCount()==0)
{
SendRoomMessage(pIServerUserItem, TEXT("<EFBFBD><EFBFBD>Ǹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ų<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Եȡ<EFBFBD>"),SMT_CHAT);
return true;
}
if(pIServerUserItem->GetUserStatus()!=US_FREE || pIServerUserItem->GetTableID()!=INVALID_TABLE)
{
SendRoomMessage(pIServerUserItem, TEXT("<EFBFBD>Բ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD>״̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>μӱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"),SMT_CHAT);
return true;
}
if (m_pMatchOption->MatchType.Immediate.dwInitalScore==0&&pIServerUserItem->GetUserScore()<m_pMatchOption->MatchType.Immediate.dwInitalBase*m_pMatchOption->MatchType.Immediate.wMinEnterGold+m_pMatchOption->lMatchFee)
{
TCHAR szMsg[256]=TEXT("");
_sntprintf_s(szMsg,CountArray(szMsg),TEXT("<EFBFBD>Բ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD>Ľ<EFBFBD><EFBFBD>ҵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>%d<><64><EFBFBD><EFBFBD><EFBFBD>ܲμӱ<CEBC><D3B1><EFBFBD><EFBFBD><EFBFBD>"),
m_pMatchOption->MatchType.Immediate.dwInitalBase*m_pMatchOption->MatchType.Immediate.wMinEnterGold+m_pMatchOption->lMatchFee);
SendRoomMessage(pIServerUserItem, szMsg,SMT_CHAT|SMT_EJECT);
return true;
}
//<2F><><EFBFBD>˿۱<CBBF><DBB1><EFBFBD><EFBFBD><EFBFBD>
if(m_pMatchOption->lMatchFee>0 && pIServerUserItem->IsAndroidUser()==false)
{
ASSERT(m_pIGameServiceFrame!=NULL);
if(m_pIGameServiceFrame==NULL)
{
CTraceService::TraceString(TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD>!"),TraceLevel_Warning);
return true;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>
CMD_GR_Match_Fee MatchFee;
MatchFee.lMatchFee=m_pMatchOption->lMatchFee;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ
if(MatchFee.lMatchFee>0)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
LPCTSTR pszMatchFeeType[]={TEXT("<EFBFBD><EFBFBD>Ϸ<EFBFBD><EFBFBD>"),TEXT("Ԫ<EFBFBD><EFBFBD>")};
if(m_pMatchOption->cbMatchFeeType<CountArray(pszMatchFeeType))
{
_sntprintf_s(MatchFee.szNotifyContent,CountArray(MatchFee.szNotifyContent),TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>۳<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> %I64d %s<><73>ȷ<EFBFBD><C8B7>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"),m_pMatchOption->lMatchFee,pszMatchFeeType[m_pMatchOption->cbMatchFeeType]);
}
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
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;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>˱<EFBFBD><CBB1><EFBFBD>
if(m_pMatchOption->lMatchFee==0 || pIServerUserItem->IsAndroidUser()==true)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
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);
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>
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("<EFBFBD><EFBFBD>ϲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>ϵͳΪ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>"),SMT_CHAT);
}
return true;
}
//<2F>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>
bool CImmediateMatch::OnEventUserQuitMatch(IServerUserItem * pIServerUserItem, BYTE cbReason, WORD *pBestRank, DWORD dwContextID)
{
ASSERT(pIServerUserItem!=NULL);
if (pIServerUserItem==NULL) return false;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ״̬
if (pIServerUserItem->GetUserStatus()>=US_PLAYING)
{
return true;
}
//<2F><><EFBFBD>ڱ<EFBFBD><DAB1><EFBFBD><EFBFBD>׶<EFBFBD>
BYTE cbUserEnlist=pIServerUserItem->GetUserMatchStatus();
if (cbUserEnlist==MS_MATCHING)
{
return true;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(RemoveMatchUserItem(pIServerUserItem))
{
//<2F><><EFBFBD><EFBFBD><EFBFBD>ڱ<EFBFBD><DAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
INT_PTR nGroupCount=m_MatchGroup.GetCount();
for (INT_PTR i=0;i<nGroupCount;i++)
{
CImmediateGroup *pMatch=m_MatchGroup[i];
if(pMatch->OnUserQuitMatch(pIServerUserItem))
{
//if(pMatch->m_enMatchStatus!=MatchStatus_Signup && pMatch->m_enMatchStatus!=MatchStatus_Wait)
//{
// SendRoomMessage(pIServerUserItem, TEXT("<22><><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD>ӭ<EFBFBD><D3AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><CEBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"), SMT_CHAT|SMT_EJECT);
//}
if (pMatch->m_enMatchStatus!=MatchStatus_Null)
{
SendRoomMessage(pIServerUserItem, TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"), SMT_CHAT|SMT_EJECT);
}
return true;
}
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>ڱ<EFBFBD><DAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(m_pCurMatchGroup->OnUserQuitMatch(pIServerUserItem))
{
//<2F>˻<EFBFBD><CBBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(m_pMatchOption->lMatchFee>0 && !pIServerUserItem->IsAndroidUser())
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DBR_GR_MatchSignup MatchSignup;
MatchSignup.dwUserID=pIServerUserItem->GetUserID();
//<2F><><EFBFBD><EFBFBD><EFBFBD>
MatchSignup.lMatchFee=m_pMatchOption->lMatchFee;
MatchSignup.dwInoutIndex=pIServerUserItem->GetInoutIndex();
MatchSignup.dwClientAddr=pIServerUserItem->GetClientAddr();
MatchSignup.dwMatchID=m_pMatchOption->dwMatchID;
MatchSignup.dwMatchNO=m_pCurMatchGroup->m_dwMatchNO;
MatchSignup.cbMatchType = m_pMatchOption->cbMatchType;
lstrcpyn(MatchSignup.szMachineID,pIServerUserItem->GetMachineID(),CountArray(MatchSignup.szMachineID));
//Ͷ<><CDB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_pIDataBaseEngine->PostDataBaseRequest(MatchSignup.dwUserID,DBR_GR_MATCH_UNSIGNUP,dwContextID,&MatchSignup,sizeof(MatchSignup));
}
if (m_pCurMatchGroup->m_enMatchStatus!=MatchStatus_Null)
{
SendRoomMessage(pIServerUserItem, TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"), SMT_CHAT|SMT_EJECT);
}
SendMatchInfo(NULL);
return true;
}
SendMatchInfo(NULL);
}
return false;
}
//<2F>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>
bool CImmediateMatch::OnEventUserItemScore(IServerUserItem * pIServerUserItem, BYTE cbReason)
{
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ASSERT(pIServerUserItem!=NULL);
if (pIServerUserItem==NULL) return false;
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
CImmediateGroup * pImmediateGroup = static_cast<CImmediateGroup *>(pIServerUserItem->GetMatchData());
if(pImmediateGroup==NULL)
{
return m_pIServerUserItemSink->OnEventUserItemScore(pIServerUserItem,cbReason);
}
//<2F><><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD>
SendGroupUserScore(pIServerUserItem,pImmediateGroup);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
tagUserInfo * pUserInfo = pIServerUserItem->GetUserInfo();
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CMD_GR_MobileUserScore MobileUserScore;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
MobileUserScore.UserScore.lScore=pUserInfo->lScore;
MobileUserScore.UserScore.lScore+=pIServerUserItem->GetTrusteeScore();
MobileUserScore.UserScore.lScore+=pIServerUserItem->GetFrozenedScore();
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_pIGameServiceFrame->SendDataBatchToMobileUser(pIServerUserItem->GetTableID(),MDM_GR_USER,SUB_GR_USER_SCORE,&MobileUserScore,sizeof(MobileUserScore));
//<2F><>ʱд<CAB1><D0B4>
if ((CServerRule::IsImmediateWriteScore(m_pGameServiceOption->dwServerRule)==true)&&(pIServerUserItem->IsVariation()==true))
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DBR_GR_WriteGameScore WriteGameScore;
ZeroMemory(&WriteGameScore,sizeof(WriteGameScore));
//<2F>û<EFBFBD><C3BB><EFBFBD>Ϣ
WriteGameScore.dwUserID=pIServerUserItem->GetUserID();
WriteGameScore.dwDBQuestID=pIServerUserItem->GetDBQuestID();
WriteGameScore.dwClientAddr=pIServerUserItem->GetClientAddr();
WriteGameScore.dwInoutIndex=pIServerUserItem->GetInoutIndex();
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
pIServerUserItem->DistillVariation(WriteGameScore.VariationInfo);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
WriteGameScore.dwMatchID=m_pMatchOption->dwMatchID;
WriteGameScore.dwMatchNO=pImmediateGroup->m_dwMatchNO;
//Ͷ<><CDB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_pIDataBaseEngine->PostDataBaseRequest(WriteGameScore.dwUserID,DBR_GR_WRITE_GAME_SCORE,0L,&WriteGameScore,sizeof(WriteGameScore), TRUE);
}
return true;
}
//<2F>û<EFBFBD>״̬
bool CImmediateMatch::OnEventUserItemStatus(IServerUserItem * pIServerUserItem, WORD wOldTableID, WORD wOldChairID)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(pIServerUserItem->GetUserStatus()==US_FREE) pIServerUserItem->SetMatchData(NULL);
//<2F>ص<EFBFBD><D8B5>ӿ<EFBFBD>
if(m_pIServerUserItemSink!=NULL)
{
return m_pIServerUserItemSink->OnEventUserItemStatus(pIServerUserItem,wOldTableID,wOldChairID);
}
return true;
}
//<2F>û<EFBFBD>Ȩ<EFBFBD><C8A8>
bool CImmediateMatch::OnEventUserItemRight(IServerUserItem *pIServerUserItem, DWORD dwAddRight, DWORD dwRemoveRight,bool bGameRight)
{
if(m_pIServerUserItemSink!=NULL)
{
return m_pIServerUserItemSink->OnEventUserItemRight(pIServerUserItem,dwAddRight,dwRemoveRight,bGameRight);
}
return true;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
bool CImmediateMatch::OnEventMatchStart(CImmediateGroup *pMatch)
{
ASSERT(pMatch==m_pCurMatchGroup&&m_LoopTimer.GetCount()>0);
//<2F><><EFBFBD>Ų<EFBFBD><C5B2><EFBFBD> <20><><EFBFBD>ܱ<EFBFBD><DCB1><EFBFBD><EFBFBD><EFBFBD>
pMatch->m_LoopTimer=m_LoopTimer[0];
m_LoopTimer.RemoveAt(0);
m_MatchGroup.Add(pMatch);
//׼<><D7BC><EFBFBD>µ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool CImmediateMatch::OnEventMatchOver(CImmediateGroup *pMatch)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(pMatch!=NULL)
{
DBR_GR_MatchOver MatchOver;
ZeroMemory(&MatchOver,sizeof(MatchOver));
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
MatchOver.dwMatchID=m_pMatchOption->dwMatchID;
MatchOver.dwMatchNO=pMatch->m_dwMatchNO;
MatchOver.cbMatchType=MATCH_TYPE_IMMEDIATE;
MatchOver.wServerID=m_pGameServiceOption->wServerID;
//<2F><>ȡʱ<C8A1><CAB1>
MatchOver.MatchStartTime=pMatch->m_MatchStartTime;
CTime::GetCurrentTime().GetAsSystemTime(MatchOver.MatchEndTime);
//Ͷ<><CDB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_pIDataBaseEngine->PostDataBaseRequest(0,DBR_GR_MATCH_OVER,0,&MatchOver,sizeof(MatchOver));
}
return true;
}
//<2F>رն<D8B1>ʱ<EFBFBD><CAB1>
bool CImmediateMatch::KillGameTimer(DWORD dwTimerID,CImmediateGroup *pMatch)
{
m_pITimerEngine->KillTimer(dwTimerID);
return false;
}
//<2F><><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1>
bool CImmediateMatch::SetGameTimer(DWORD dwTimerID, DWORD dwElapse, DWORD dwRepeat, WPARAM dwBindParameter,CImmediateGroup *pMatch)
{
return m_pITimerEngine->SetTimer(dwTimerID,dwElapse,dwRepeat,dwBindParameter);
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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));
INT_PTR dwUserCount=m_OnMatchUserItem.GetCount();
for (INT_PTR i=0;i<dwUserCount;i++)
{
if(m_OnMatchUserItem[i]==pIServerUserItem)
{
BYTE cbMatchStatus=pIServerUserItem->GetUserMatchStatus();
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);
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
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;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>
bool CImmediateMatch::SendGroupUserScore(IServerUserItem * pIServerUserItem,CImmediateGroup *pMatch)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CMD_GR_UserScore UserScore;
ZeroMemory(&UserScore,sizeof(UserScore));
tagUserInfo * pUserInfo=pIServerUserItem->GetUserInfo();
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//UserScore.UserScore.lIngot=pUserInfo->lIngot;
UserScore.UserScore.lGrade=pUserInfo->lGrade;
UserScore.UserScore.lInsure=pUserInfo->lInsure;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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));
}
//<2F><><EFBFBD><EFBFBD>״̬
bool CImmediateMatch::SendGroupUserStatus(IServerUserItem * pIServerUserItem,CImmediateGroup *pMatch)
{
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ASSERT(pIServerUserItem!=NULL);
ASSERT(pIServerUserItem->IsClientReady()==true);
if (pIServerUserItem->IsClientReady()==false) return false;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CMD_GR_UserStatus UserStatus;
ZeroMemory(&UserStatus,sizeof(UserStatus));
tagUserInfo * pUserData=pIServerUserItem->GetUserInfo();
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD><CFB7>Ϣ
bool CImmediateMatch::SendGameMessage(IServerUserItem * pIServerUserItem, LPCTSTR lpszMessage, WORD wMessageType)
{
ASSERT(pIServerUserItem!=-NULL);
if (pIServerUserItem==NULL) return false;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if ((pIServerUserItem->GetBindIndex()!=INVALID_WORD)&&(pIServerUserItem->IsClientReady()==true)&&(pIServerUserItem->IsAndroidUser()==false))
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>
CMD_CM_SystemMessage Message;
Message.wType=wMessageType;
lstrcpyn(Message.szString,lpszMessage,CountArray(Message.szString));
Message.wLength=CountStringBuffer(Message.szString);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
bool CImmediateMatch::SendRoomMessage(IServerUserItem * pIServerUserItem, LPCTSTR lpszMessage, WORD wMessageType)
{
ASSERT(pIServerUserItem!=-NULL);
if (pIServerUserItem==NULL) return false;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (pIServerUserItem->GetBindIndex()!=INVALID_WORD && false==pIServerUserItem->IsAndroidUser())
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>
CMD_CM_SystemMessage Message;
Message.wType=wMessageType;
lstrcpyn(Message.szString,lpszMessage,CountArray(Message.szString));
Message.wLength=CountStringBuffer(Message.szString);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD>û<EFBFBD>
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;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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;
}
//Ϊ<><CEAA><EFBFBD>ֲ<EFBFBD><D6B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void CImmediateMatch::InsertNullTable()
{
for (int i=0;i<m_pGameServiceOption->wTableCount;i++)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD>
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;j<m_MatchGroup.GetCount();j++)
{
WORD wMatchGroupTableCount=(WORD)m_MatchGroup[j]->m_MatchTableArray.GetCount();
for (int k=0;k<wMatchGroupTableCount;k++)
{
WORD wTableID=m_MatchGroup[j]->m_MatchTableArray[k]->wTableID;
if(i==wTableID){bIsInsert=false;break;}//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˸<EFBFBD><CBB8><EFBFBD>
}
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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);
}
}
}
//<2F><>ȡһ<C8A1><D2BB><EFBFBD><EFBFBD><EFBFBD>еĻ<D0B5><C4BB><EFBFBD><EFBFBD><EFBFBD>
IAndroidUserItem * CImmediateMatch::GetFreeAndroidUserItem()
{
if(m_pAndroidUserManager->GetAndroidCount()==0) return NULL;
//<2F><><EFBFBD><EFBFBD>״̬
tagAndroidUserInfo AndroidSimulate;
m_pAndroidUserManager->GetAndroidUserInfo(AndroidSimulate,ANDROID_SIMULATE|ANDROID_PASSIVITY|ANDROID_INITIATIVE);
if(AndroidSimulate.wFreeUserCount==0)
return NULL;
else
{
//<2F><><EFBFBD><EFBFBD><EFBFBD>ѱ<EFBFBD><D1B1><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD><D8B8><EFBFBD><EFBFBD><EFBFBD>
for(WORD i=0; i<AndroidSimulate.wFreeUserCount;i++)
{
if(AndroidSimulate.pIAndroidUserFree[i]->GetMeUserItem()->GetUserMatchStatus()==MatchStatus_Null)
{
ASSERT(AndroidSimulate.pIAndroidUserFree[i]->GetUserID()==AndroidSimulate.pIAndroidUserFree[i]->GetMeUserItem()->GetUserID());
return AndroidSimulate.pIAndroidUserFree[i];
}
}
}
return NULL;
}
//<2F>û<EFBFBD><C3BB><EFBFBD>̭
bool CImmediateMatch::OnUserOut(IServerUserItem *pUserItem,LPCTSTR szReason,WORD wLen,WORD wRank,CImmediateGroup *pMatch)
{
if(pUserItem==NULL)
return false;
pUserItem->SetUserMatchStatus(MUS_NULL);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һЩ<D2BB>û<EFBFBD>
for (INT_PTR i=0;i<pMatch->m_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);
}
//<2F>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>
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)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DBR_GR_MatchSignup MatchSignup;
ZeroMemory(&MatchSignup,sizeof(MatchSignup));
//<2F><><EFBFBD><EFBFBD><EFBFBD>
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;
MatchSignup.cbMatchType = m_pMatchOption->cbMatchType;
lstrcpyn(MatchSignup.szMachineID,pUserItem->GetMachineID(),CountArray(MatchSignup.szMachineID));
//Ͷ<><CDB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_pIDataBaseEngine->PostDataBaseRequest(MatchSignup.dwUserID,DBR_GR_MATCH_UNSIGNUP,0,&MatchSignup,sizeof(MatchSignup));
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
LPCTSTR pszMatchFeeType[]={TEXT("<EFBFBD><EFBFBD>Ϸ<EFBFBD><EFBFBD>"),TEXT("Ԫ<EFBFBD><EFBFBD>")};
if(m_pMatchOption->cbMatchFeeType<CountArray(pszMatchFeeType))
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
TCHAR szMessage[128]=TEXT("");
_sntprintf_s(szMessage,CountArray(szMessage),TEXT("<EFBFBD>÷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>رգ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˻<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> %I64d %s<><73>"),m_pMatchOption->lMatchFee,pszMatchFeeType[m_pMatchOption->cbMatchFeeType]);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
m_pIGameServiceFrame->SendRoomMessage(pUserItem,szMessage,SMT_EJECT|SMT_CHAT|SMT_CLOSE_ROOM);
}
}
}
CServerRule::SetForfendRoomEnter(static_cast<DWORD>(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;
}
//д<><EFBFBD><EBBDB1>
bool CImmediateMatch::WriteUserAward(IServerUserItem *pIServerUserItem,tagMatchRankInfo * pMatchRankInfo)
{
//<2F><><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>
ASSERT(pIServerUserItem!=NULL && pMatchRankInfo!=NULL);
if(pIServerUserItem==NULL || pMatchRankInfo==NULL) return false;
//д<><D0B4><EFBFBD>ж<EFBFBD>
bool bWriteReward=(pMatchRankInfo->lRewardGold+pMatchRankInfo->dwRewardIngot+pMatchRankInfo->dwRewardExperience)>0;
//д<><EFBFBD><EBBDB1>
if(bWriteReward==true)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CMD_GR_MatchResult MatchResult;
ZeroMemory(&MatchResult,sizeof(MatchResult));
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
MatchResult.lGold+=pMatchRankInfo->lRewardGold;
MatchResult.dwIngot+=pMatchRankInfo->dwRewardIngot;
MatchResult.dwExperience+=pMatchRankInfo->dwRewardExperience;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ
_sntprintf_s(MatchResult.szDescribe,CountArray(MatchResult.szDescribe),TEXT("%s, <20><>ϲ<EFBFBD><CFB2><EFBFBD><EFBFBD>%s<>л<EFBFBD><D0BB>õ<EFBFBD>%d<><64>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>£<EFBFBD>"),
pIServerUserItem->GetNickName(),m_pMatchOption->szMatchName,pMatchRankInfo->wRankID);
//<2F><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>Ϣ
tagUserInfo * pUserInfo=pIServerUserItem->GetUserInfo();
//pUserInfo->lIngot+=pMatchRankInfo->dwRewardIngot;
pUserInfo->dwExperience+=pMatchRankInfo->dwRewardExperience;
SendGroupUserScore(pIServerUserItem, NULL);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (pIServerUserItem->IsAndroidUser()==false)
{
m_pIGameServiceFrame->SendData(pIServerUserItem, MDM_GR_MATCH, SUB_GR_MATCH_RESULT, &MatchResult, sizeof(MatchResult));
}
}
else
{
TCHAR szMessage[256]=TEXT("");
_sntprintf_s(szMessage,CountArray(szMessage),TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD>%d<><64><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӭ<EFBFBD><D3AD><EFBFBD>μ<EFBFBD><CEBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>εı<CEB5><C4B1><EFBFBD><EFBFBD><EFBFBD>"),pMatchRankInfo->wRankID);
SendGameMessage(pIServerUserItem, szMessage, SMT_CLOSE_GAME);
SendRoomMessage(pIServerUserItem, szMessage, SMT_CHAT|SMT_EJECT);
return true;
}
//д<><D0B4><EFBFBD><EFBFBD>¼
if(m_pIDataBaseEngine!=NULL)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DBR_GR_MatchReward MatchReward;
ZeroMemory(&MatchReward,sizeof(MatchReward));
//<2F><><EFBFBD><EFBFBD><EFBFBD>
MatchReward.dwUserID=pIServerUserItem->GetUserID();
MatchReward.lRewardGold=pMatchRankInfo->lRewardGold;
MatchReward.dwRewardIngot=pMatchRankInfo->dwRewardIngot;
MatchReward.dwRewardExperience=pMatchRankInfo->dwRewardExperience;
MatchReward.dwClientAddr=pIServerUserItem->GetClientAddr();
//Ͷ<><CDB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_pIDataBaseEngine->PostDataBaseRequest(MatchReward.dwUserID,DBR_GR_MATCH_REWARD,0,&MatchReward,sizeof(MatchReward));
}
return true;
}
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
WORD CImmediateMatch::GetNullTable()
{
WORD wTableCount=0;
for (int i=0;i<m_pGameServiceOption->wTableCount;i++)
{
BOOL bIsInsert=true;
for (int j=0;j<m_MatchGroup.GetCount();j++)
{
WORD wMatchGroupTableCount=(WORD)m_MatchGroup[j]->m_MatchTableArray.GetCount();
for (int k=0;k<wMatchGroupTableCount;k++)
{
WORD wTableID=m_MatchGroup[j]->m_MatchTableArray[k]->wTableID;
if(i==wTableID){bIsInsert=false;break;}//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˸<EFBFBD><CBB8><EFBFBD>
}
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if( bIsInsert&&m_ppITableFrame[i]->GetNullChairCount()==m_pGameServiceAttrib->wChairCount)
{
wTableCount++;
}
}
return wTableCount;
}
//ɾ<><C9BE><EFBFBD>û<EFBFBD>
bool CImmediateMatch::DeleteUserItem(DWORD dwUserIndex)
{
try
{
if (m_pITCPNetworkEngineEvent == NULL)
{
throw 0;
}
m_pITCPNetworkEngineEvent->OnEventTCPNetworkShut(dwUserIndex,0,0L);
}
catch (...)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ASSERT(FALSE);
return false;
}
return true;
}
//<2F>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>
bool CImmediateMatch::RemoveMatchUserItem(IServerUserItem *pIServerUserItem)
{
for (INT_PTR i=0;i<m_OnMatchUserItem.GetCount();i++)
{
//<2F><>ȡ<EFBFBD>û<EFBFBD>
IServerUserItem * pOnLineUserItem=m_OnMatchUserItem[i];
//<2F>û<EFBFBD><C3BB>ж<EFBFBD>
if (pOnLineUserItem==pIServerUserItem)
{
ASSERT(pOnLineUserItem->GetUserID()==pIServerUserItem->GetUserID());
m_OnMatchUserItem.RemoveAt(i);
return true;
}
}
return false;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////