3171 lines
83 KiB
C++
3171 lines
83 KiB
C++
#include "StdAfx.h"
|
||
#include "TableFrame.h"
|
||
#include "StockManager.h"
|
||
#include "AttemperEngineSink.h"
|
||
#include "DataBasePacket.h"
|
||
|
||
//////////////////////////////////////////////////////////////////////////////////
|
||
|
||
//断线定义
|
||
#define IDI_OFF_LINE (TIME_TABLE_SINK_RANGE+1) //断线标识
|
||
#define MAX_OFF_LINE 3 //断线次数
|
||
#define TIME_OFF_LINE 60000L //断线时间
|
||
|
||
void ConvertUtf8ToGBK(CString &strUtf8)
|
||
{
|
||
int len = MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8, -1, NULL, 0);
|
||
wchar_t * wszGBK = new wchar_t[len];
|
||
memset(wszGBK, 0, len);
|
||
MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8, -1, wszGBK, len);
|
||
|
||
len = WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, NULL, 0, NULL, NULL);
|
||
char *szGBK = new char[len + 1];
|
||
memset(szGBK, 0, len + 1);
|
||
WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, szGBK, len, NULL, NULL);
|
||
|
||
strUtf8 = szGBK;
|
||
delete[] szGBK;
|
||
delete[] wszGBK;
|
||
}
|
||
void ConvertUtf8ToGBK(char* pChar, int iLen)
|
||
{
|
||
CString kString(pChar);
|
||
ConvertUtf8ToGBK(kString);
|
||
strncpy(pChar, kString.GetString(), iLen);
|
||
}
|
||
//////////////////////////////////////////////////////////////////////////////////
|
||
|
||
//组件变量
|
||
CStockManager g_StockManager; //库存管理
|
||
|
||
//游戏记录
|
||
CGameScoreRecordArray CTableFrame::m_GameScoreRecordBuffer;
|
||
CGameCardLibraryArray CTableFrame::m_GameCardLibraryBuffer;
|
||
|
||
//////////////////////////////////////////////////////////////////////////////////
|
||
|
||
//构造函数
|
||
CTableFrame::CTableFrame()
|
||
{
|
||
//固有属性
|
||
m_wUserCount = 0;
|
||
m_wTableID=0;
|
||
m_wChairCount=0;
|
||
m_cbStartMode=START_MODE_ALL_READY;
|
||
|
||
//标志变量
|
||
m_bGameStarted=false;
|
||
m_bDrawStarted=false;
|
||
m_bTableStarted=false;
|
||
ZeroMemory(m_bAllowLookon,sizeof(m_bAllowLookon));
|
||
ZeroMemory(m_lFrozenedScore,sizeof(m_lFrozenedScore));
|
||
|
||
//游戏变量
|
||
m_lCellScore=0L;
|
||
m_wDrawCount = 0; // 构造函数初始化;
|
||
m_cbGameStatus=GAME_STATUS_FREE;
|
||
|
||
//时间变量
|
||
m_dwDrawStartTime=0L;
|
||
ZeroMemory(&m_SystemTimeStart,sizeof(m_SystemTimeStart));
|
||
|
||
//动态属性
|
||
m_dwTableOwnerID=0L;
|
||
ZeroMemory(m_szEnterPassword,sizeof(m_szEnterPassword));
|
||
|
||
//断线变量
|
||
ZeroMemory(m_wOffLineCount,sizeof(m_wOffLineCount));
|
||
ZeroMemory(m_dwOffLineTime,sizeof(m_dwOffLineTime));
|
||
|
||
//配置信息
|
||
m_pGameParameter=NULL;
|
||
m_pGameServiceAttrib=NULL;
|
||
m_pGameServiceOption=NULL;
|
||
m_pGameMatchOption = NULL;
|
||
|
||
//组件接口
|
||
m_pITimerEngine=NULL;
|
||
m_pITableFrameSink=NULL;
|
||
m_pIMainServiceFrame=NULL;
|
||
m_pIAndroidUserManager=NULL;
|
||
|
||
//扩张接口
|
||
m_pITableUserAction=NULL;
|
||
m_pITableUserRequest=NULL;
|
||
m_pIMatchTableAction=NULL;
|
||
|
||
m_pITableFramePrivate=NULL;
|
||
m_pIPrivateTableAction=NULL;
|
||
|
||
//数据接口
|
||
m_pIKernelDataBaseEngine=NULL;
|
||
m_pIRecordDataBaseEngine=NULL;
|
||
|
||
//比赛接口
|
||
m_pITableFrameHook=NULL;
|
||
|
||
//用户数组
|
||
ZeroMemory(m_TableUserItemArray,sizeof(m_TableUserItemArray));
|
||
|
||
//私人场配置;
|
||
ZeroMemory(&m_PrivateFramePrarameter, sizeof(m_PrivateFramePrarameter));
|
||
|
||
return;
|
||
}
|
||
|
||
//析构函数
|
||
CTableFrame::~CTableFrame()
|
||
{
|
||
//释放对象
|
||
SafeRelease(m_pITableFrameSink);
|
||
SafeRelease(m_pITableFrameHook);
|
||
SafeRelease(m_pITableFramePrivate);
|
||
|
||
ClearGameCardLibrary();
|
||
|
||
return;
|
||
}
|
||
|
||
//接口查询
|
||
VOID * CTableFrame::QueryInterface(REFGUID Guid, DWORD dwQueryVer)
|
||
{
|
||
QUERYINTERFACE(ITableFrame,Guid,dwQueryVer);
|
||
QUERYINTERFACE_IUNKNOWNEX(ITableFrame,Guid,dwQueryVer);
|
||
return NULL;
|
||
}
|
||
|
||
//开始游戏
|
||
bool CTableFrame::StartGame()
|
||
{
|
||
//游戏状态
|
||
ASSERT(m_bDrawStarted==false);
|
||
if (m_bDrawStarted==true) return false;
|
||
|
||
//保存变量
|
||
bool bGameStarted=m_bGameStarted;
|
||
bool bTableStarted=m_bTableStarted;
|
||
|
||
//设置状态
|
||
m_bGameStarted=true;
|
||
m_bDrawStarted=true;
|
||
m_bTableStarted=true;
|
||
|
||
//开始时间
|
||
GetLocalTime(&m_SystemTimeStart);
|
||
m_dwDrawStartTime=(DWORD)time(NULL);
|
||
|
||
//开始设置
|
||
if (bGameStarted==false)
|
||
{
|
||
//状态变量
|
||
ZeroMemory(m_wOffLineCount,sizeof(m_wOffLineCount));
|
||
ZeroMemory(m_dwOffLineTime,sizeof(m_dwOffLineTime));
|
||
|
||
//设置用户
|
||
for (WORD i=0;i<m_wChairCount;i++)
|
||
{
|
||
//获取用户
|
||
IServerUserItem * pIServerUserItem=GetTableUserItem(i);
|
||
|
||
//设置用户
|
||
if (pIServerUserItem!=NULL)
|
||
{
|
||
//锁定游戏币
|
||
if (m_pGameServiceOption->lServiceScore>0L)
|
||
{
|
||
m_lFrozenedScore[i]=m_pGameServiceOption->lServiceScore;
|
||
pIServerUserItem->FrozenedUserScore(m_pGameServiceOption->lServiceScore);
|
||
}
|
||
|
||
//设置状态
|
||
BYTE cbUserStatus=pIServerUserItem->GetUserStatus();
|
||
if ((cbUserStatus!=US_OFFLINE)&&(cbUserStatus!=US_PLAYING)) pIServerUserItem->SetUserStatus(US_PLAYING,m_wTableID,i);
|
||
}
|
||
}
|
||
|
||
//发送状态
|
||
if (bTableStarted!=m_bTableStarted) SendTableStatus();
|
||
}
|
||
|
||
//通知事件
|
||
ASSERT(m_pITableFrameSink!=NULL);
|
||
if (m_pITableFrameSink!=NULL) m_pITableFrameSink->OnEventGameStart();
|
||
|
||
//比赛通知
|
||
bool bStart=true;
|
||
if(m_pITableFrameHook!=NULL) bStart=m_pITableFrameHook->OnEventGameStart(this, m_wChairCount);
|
||
|
||
//私人场通知
|
||
if(m_pITableFramePrivate!=NULL) bStart=m_pITableFramePrivate->OnEventGameStart(this, m_wChairCount);
|
||
|
||
////通知事件
|
||
//ASSERT(m_pITableFrameSink!=NULL);
|
||
//if (m_pITableFrameSink!=NULL&&bStart) m_pITableFrameSink->OnEventGameStart();
|
||
return true;
|
||
}
|
||
|
||
//解散游戏
|
||
bool CTableFrame::DismissGame()
|
||
{
|
||
//状态判断
|
||
ASSERT(m_bTableStarted==true);
|
||
if (m_bTableStarted==false) return false;
|
||
|
||
//结束游戏
|
||
if ((m_bGameStarted==true)&&(m_pITableFrameSink->OnEventGameConclude(INVALID_CHAIR,NULL,GER_DISMISS)==false))
|
||
{
|
||
ASSERT(FALSE);
|
||
return false;
|
||
}
|
||
|
||
//设置状态
|
||
if ((m_bGameStarted==false)&&(m_bTableStarted==true))
|
||
{
|
||
//设置变量
|
||
m_bTableStarted=false;
|
||
|
||
//发送状态
|
||
SendTableStatus();
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
//结束游戏
|
||
bool CTableFrame::ConcludeGame(BYTE cbGameStatus, BYTE cbReason/* = GER_NORMAL*/)
|
||
{
|
||
//效验状态
|
||
ASSERT(m_bGameStarted==true);
|
||
if (m_bGameStarted==false) return false;
|
||
|
||
//保存变量
|
||
bool bDrawStarted=m_bDrawStarted;
|
||
|
||
//设置状态
|
||
m_bDrawStarted=false;
|
||
m_cbGameStatus=cbGameStatus;
|
||
m_bGameStarted=(cbGameStatus>=GAME_STATUS_PLAY)?true:false;
|
||
m_wDrawCount++; // 一局结束统计;
|
||
|
||
//游戏记录
|
||
if (bDrawStarted==true)
|
||
{
|
||
////写入记录
|
||
//if (CServerRule::IsRecordGameScore(m_pGameServiceOption->dwServerRule)==true)
|
||
//{
|
||
// //变量定义
|
||
// DBR_GR_GameScoreRecord GameScoreRecord;
|
||
// //设置变量
|
||
// GameScoreRecord.wTableID=m_wTableID;
|
||
// GameScoreRecord.dwPlayTimeCount=(bDrawStarted==true)?(DWORD)time(NULL)-m_dwDrawStartTime:0;
|
||
|
||
// //游戏时间
|
||
// GameScoreRecord.SystemTimeStart=m_SystemTimeStart;
|
||
// GetLocalTime(&GameScoreRecord.SystemTimeConclude);
|
||
|
||
// //用户积分
|
||
// for (INT_PTR i=0;i<m_GameScoreRecordActive.GetCount();i++)
|
||
// {
|
||
// //获取对象
|
||
// ASSERT(m_GameScoreRecordActive[i]!=NULL);
|
||
// tagGameScoreRecord * pGameScoreRecord=m_GameScoreRecordActive[i];
|
||
|
||
// //用户数目
|
||
// if (pGameScoreRecord->cbAndroid==FALSE)
|
||
// {
|
||
// GameScoreRecord.wUserCount++;
|
||
// }
|
||
// else
|
||
// {
|
||
// GameScoreRecord.wAndroidCount++;
|
||
// }
|
||
|
||
// //奖牌统计
|
||
// GameScoreRecord.dwUserMemal+=pGameScoreRecord->dwUserMemal;
|
||
|
||
// //统计信息
|
||
// if (pGameScoreRecord->cbAndroid==FALSE)
|
||
// {
|
||
// GameScoreRecord.lWasteCount-=(pGameScoreRecord->lScore+pGameScoreRecord->lRevenue);
|
||
// GameScoreRecord.lRevenueCount+=pGameScoreRecord->lRevenue;
|
||
// }
|
||
|
||
// WORD wIndex=GameScoreRecord.wRecordCount++;
|
||
// GameScoreRecord.GameScoreRecord.push_back(*pGameScoreRecord);
|
||
// }
|
||
|
||
// //投递数据
|
||
// if(GameScoreRecord.wUserCount > 0)
|
||
// {
|
||
// //GameScoreRecord.dataGameDefine = m_UserDefine;
|
||
|
||
// DataStream kDataStream;
|
||
// GameScoreRecord.StreamValue(kDataStream,true);
|
||
// m_pIRecordDataBaseEngine->PostDataBaseRequest(DBR_GR_GAME_SCORE_RECORD,0,&kDataStream[0],kDataStream.size());
|
||
// }
|
||
//}
|
||
|
||
//清理记录
|
||
if (m_GameScoreRecordActive.GetCount()>0L)
|
||
{
|
||
m_GameScoreRecordBuffer.Append(m_GameScoreRecordActive);
|
||
m_GameScoreRecordActive.RemoveAll();
|
||
}
|
||
}
|
||
|
||
//结束设置
|
||
if (m_bGameStarted==false)
|
||
{
|
||
//变量定义
|
||
bool bOffLineWait=false;
|
||
|
||
//设置用户
|
||
for (WORD i=0;i<m_wChairCount;i++)
|
||
{
|
||
//获取用户
|
||
IServerUserItem * pIServerUserItem=GetTableUserItem(i);
|
||
|
||
//用户处理
|
||
if (pIServerUserItem!=NULL)
|
||
{
|
||
tagTimeInfo* TimeInfo=pIServerUserItem->GetTimeInfo();
|
||
//游戏时间
|
||
DWORD dwCurrentTime=(DWORD)time(NULL);
|
||
TimeInfo->dwEndGameTimer=dwCurrentTime;
|
||
|
||
//解锁游戏币
|
||
if (m_lFrozenedScore[i]!=0L)
|
||
{
|
||
pIServerUserItem->UnFrozenedUserScore(m_lFrozenedScore[i]);
|
||
m_lFrozenedScore[i]=0L;
|
||
}
|
||
|
||
//设置状态
|
||
if (pIServerUserItem->GetUserStatus() == US_OFFLINE)
|
||
{
|
||
//断线处理
|
||
bOffLineWait = true;
|
||
if (m_pGameServiceOption->wServerType != GAME_GENRE_MATCH)
|
||
{
|
||
PerformStandUpAction(pIServerUserItem);
|
||
|
||
// 私人场重置还原状态
|
||
if (m_pGameServiceOption->wServerType == GAME_GENRE_EDUCATE)
|
||
{
|
||
pIServerUserItem->SetReUserStatus(US_SIT);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
pIServerUserItem->SetClientReady(true);
|
||
pIServerUserItem->SetUserStatus(US_SIT, m_wTableID, i);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
//设置状态
|
||
pIServerUserItem->SetUserStatus(US_SIT, m_wTableID, i);
|
||
}
|
||
}
|
||
}
|
||
|
||
//删除时间
|
||
if (bOffLineWait==true) KillGameTimer(IDI_OFF_LINE);
|
||
}
|
||
|
||
//通知比赛
|
||
if(m_pITableFrameHook!=NULL) m_pITableFrameHook->OnEventGameEnd(this,0, NULL, cbGameStatus);
|
||
|
||
//通知私人场;
|
||
if (m_pITableFramePrivate != NULL) m_pITableFramePrivate->OnEventGameEnd(this, 0, NULL, cbReason);
|
||
|
||
//重置桌子
|
||
ASSERT(m_pITableFrameSink!=NULL);
|
||
if (m_pITableFrameSink!=NULL) m_pITableFrameSink->RepositionSink();
|
||
|
||
//踢出检测
|
||
if (m_bGameStarted==false)
|
||
{
|
||
for (WORD i=0;i<m_wChairCount;i++)
|
||
{
|
||
//获取用户
|
||
if (m_TableUserItemArray[i]==NULL) continue;
|
||
IServerUserItem * pIServerUserItem=m_TableUserItemArray[i];
|
||
|
||
//积分限制
|
||
if ((m_pGameServiceOption->lMinTableScore!=0L)&&(pIServerUserItem->GetUserScore()<m_pGameServiceOption->lMinTableScore))
|
||
{
|
||
//构造提示
|
||
TCHAR szDescribe[128]=TEXT("");
|
||
if (m_pGameServiceOption->wServerType&GAME_GENRE_GOLD)
|
||
{
|
||
_sntprintf_s(szDescribe,CountArray(szDescribe),TEXT("您的游戏币少于 ") SCORE_STRING TEXT(",不能继续游戏!"),m_pGameServiceOption->lMinTableScore);
|
||
}
|
||
else
|
||
{
|
||
_sntprintf_s(szDescribe,CountArray(szDescribe),TEXT("您的游戏积分少于 ") SCORE_STRING TEXT(",不能继续游戏!"),m_pGameServiceOption->lMinTableScore);
|
||
}
|
||
|
||
//发送消息
|
||
if (pIServerUserItem->IsAndroidUser()==true)
|
||
SendGameMessage(pIServerUserItem,szDescribe,SMT_CHAT|SMT_CLOSE_GAME|SMT_CLOSE_ROOM|SMT_EJECT);
|
||
else
|
||
SendGameMessage(pIServerUserItem,szDescribe,SMT_CHAT|SMT_CLOSE_GAME|SMT_EJECT);
|
||
|
||
//用户起立
|
||
PerformStandUpAction(pIServerUserItem);
|
||
|
||
continue;
|
||
}
|
||
|
||
//关闭判断
|
||
if ((CServerRule::IsForfendGameEnter(m_pGameServiceOption->dwServerRule)==true)&&(pIServerUserItem->GetMasterOrder()==0))
|
||
{
|
||
//发送消息
|
||
LPCTSTR pszMessage=TEXT("由于系统维护,当前游戏桌子禁止用户继续游戏!");
|
||
SendGameMessage(pIServerUserItem,pszMessage,SMT_EJECT|SMT_CHAT|SMT_CLOSE_GAME);
|
||
|
||
//用户起立
|
||
PerformStandUpAction(pIServerUserItem);
|
||
|
||
continue;
|
||
}
|
||
}
|
||
}
|
||
|
||
//结束桌子
|
||
ConcludeTable();
|
||
|
||
//发送状态
|
||
SendTableStatus();
|
||
|
||
return true;
|
||
}
|
||
|
||
//结束桌子
|
||
bool CTableFrame::ConcludeTable()
|
||
{
|
||
//结束桌子
|
||
if ((m_bGameStarted==false)&&(m_bTableStarted==true))
|
||
{
|
||
//人数判断
|
||
WORD wTableUserCount=GetSitUserCount();
|
||
if (wTableUserCount==0) m_bTableStarted=false;
|
||
if (m_pGameServiceAttrib->wChairCount==MAX_CHAIR) m_bTableStarted=false;
|
||
|
||
//模式判断
|
||
if (m_cbStartMode==START_MODE_FULL_READY) m_bTableStarted=false;
|
||
if (m_cbStartMode==START_MODE_PAIR_READY) m_bTableStarted=false;
|
||
if (m_cbStartMode==START_MODE_ALL_READY) m_bTableStarted=false;
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
//写入积分
|
||
bool CTableFrame::WriteUserScore(WORD wChairID, tagScoreInfo & ScoreInfo)
|
||
{
|
||
//效验参数
|
||
ASSERT((wChairID<m_wChairCount)&&(ScoreInfo.cbType!=SCORE_TYPE_NULL));
|
||
if ((wChairID>=m_wChairCount)&&(ScoreInfo.cbType==SCORE_TYPE_NULL)) return false;
|
||
|
||
//获取用户
|
||
ASSERT(GetTableUserItem(wChairID)!=NULL);
|
||
IServerUserItem * pIServerUserItem=GetTableUserItem(wChairID);
|
||
TCHAR szMessage[128]=TEXT("");
|
||
|
||
//写入积分
|
||
if (pIServerUserItem!=NULL)
|
||
{
|
||
//变量定义
|
||
DWORD dwUserMemal=0L;
|
||
SCORE lRevenueScore=__min(m_lFrozenedScore[wChairID],m_pGameServiceOption->lServiceScore);
|
||
|
||
//扣服务费
|
||
if (m_pGameServiceOption->lServiceScore>0L
|
||
&& m_pGameServiceOption->wServerType == GAME_GENRE_GOLD
|
||
&& m_pITableFrameSink->QueryBuckleServiceCharge(wChairID))
|
||
{
|
||
//扣服务费
|
||
ScoreInfo.lScore-=lRevenueScore;
|
||
ScoreInfo.lRevenue+=lRevenueScore;
|
||
|
||
//解锁游戏币
|
||
pIServerUserItem->UnFrozenedUserScore(m_lFrozenedScore[wChairID]);
|
||
m_lFrozenedScore[wChairID]=0L;
|
||
}
|
||
|
||
//奖牌计算
|
||
if (ScoreInfo.lRevenue>0L)
|
||
{
|
||
WORD wMedalRate=m_pGameParameter->wMedalRate;
|
||
dwUserMemal=(DWORD)(ScoreInfo.lRevenue*wMedalRate/1000L);
|
||
}
|
||
|
||
//游戏时间
|
||
DWORD dwCurrentTime=(DWORD)time(NULL);
|
||
DWORD dwPlayTimeCount=(m_bDrawStarted==true)?dwCurrentTime-m_dwDrawStartTime:0L;
|
||
|
||
//变量定义
|
||
tagUserProperty * pUserProperty=pIServerUserItem->GetUserProperty();
|
||
|
||
//道具判断
|
||
if(m_pGameServiceOption->wServerType == GAME_GENRE_SCORE)
|
||
{
|
||
if (ScoreInfo.lScore>0L)
|
||
{
|
||
//四倍积分
|
||
if ((pUserProperty->wPropertyUseMark&PT_USE_MARK_FOURE_SCORE)!=0)
|
||
{
|
||
//变量定义
|
||
DWORD dwValidTime=pUserProperty->PropertyInfo[1].wPropertyCount*pUserProperty->PropertyInfo[1].dwValidNum;
|
||
if(pUserProperty->PropertyInfo[1].dwEffectTime+dwValidTime>dwCurrentTime)
|
||
{
|
||
//积分翻倍
|
||
ScoreInfo.lScore *= 4;
|
||
_sntprintf_s(szMessage,CountArray(szMessage),TEXT("[ %s ] 使用了[ 四倍积分卡 ],得分翻四倍!)"),pIServerUserItem->GetNickName());
|
||
}
|
||
else
|
||
{
|
||
pUserProperty->wPropertyUseMark&=~PT_USE_MARK_FOURE_SCORE;
|
||
}
|
||
} //双倍积分
|
||
else if ((pUserProperty->wPropertyUseMark&PT_USE_MARK_DOUBLE_SCORE)!=0)
|
||
{
|
||
//变量定义
|
||
DWORD dwValidTime=pUserProperty->PropertyInfo[0].wPropertyCount*pUserProperty->PropertyInfo[0].dwValidNum;
|
||
if (pUserProperty->PropertyInfo[0].dwEffectTime+dwValidTime>dwCurrentTime)
|
||
{
|
||
//积分翻倍
|
||
ScoreInfo.lScore*=2L;
|
||
_sntprintf_s(szMessage,CountArray(szMessage),TEXT("[ %s ] 使用了[ 双倍积分卡 ],得分翻倍!"), pIServerUserItem->GetNickName());
|
||
}
|
||
else
|
||
{
|
||
pUserProperty->wPropertyUseMark&=~PT_USE_MARK_DOUBLE_SCORE;
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
//附身符
|
||
if ((pUserProperty->wPropertyUseMark&PT_USE_MARK_POSSESS)!=0)
|
||
{
|
||
//变量定义
|
||
DWORD dwValidTime=pUserProperty->PropertyInfo[3].wPropertyCount*pUserProperty->PropertyInfo[3].dwValidNum;
|
||
if(pUserProperty->PropertyInfo[3].dwEffectTime+dwValidTime>dwCurrentTime)
|
||
{
|
||
//积分翻倍
|
||
ScoreInfo.lScore = 0;
|
||
_sntprintf_s(szMessage,CountArray(szMessage),TEXT("[ %s ] 使用了[ 护身符卡 ],积分不变!"),pIServerUserItem->GetNickName());
|
||
}
|
||
else
|
||
{
|
||
pUserProperty->wPropertyUseMark &= ~PT_USE_MARK_POSSESS;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
SCORE lScore = ScoreInfo.lScore;
|
||
//if (lScore + pIServerUserItem->GetUserScore() < 0)
|
||
//{
|
||
// lScore = -pIServerUserItem->GetUserScore();
|
||
//}
|
||
|
||
//写入积分
|
||
//if (m_pGameServiceOption->wServerType != GAME_GENRE_EDUCATE)
|
||
//{
|
||
// if (lScore + pIServerUserItem->GetUserScore() < 0)
|
||
// {
|
||
// lScore = -pIServerUserItem->GetUserScore();
|
||
// }
|
||
//}
|
||
|
||
//写入积分
|
||
pIServerUserItem->WriteUserScore(lScore, ScoreInfo.lGrade, ScoreInfo.lRevenue, dwUserMemal, ScoreInfo.cbType, ScoreInfo.cbLastScoreMultiple, dwPlayTimeCount);
|
||
|
||
//游戏记录
|
||
if (pIServerUserItem->IsAndroidUser()==false && CServerRule::IsRecordGameScore(m_pGameServiceOption->dwServerRule)==true)
|
||
{
|
||
//变量定义
|
||
tagGameScoreRecord * pGameScoreRecord=NULL;
|
||
|
||
//查询库存
|
||
if (m_GameScoreRecordBuffer.GetCount()>0L)
|
||
{
|
||
//获取对象
|
||
INT_PTR nCount=m_GameScoreRecordBuffer.GetCount();
|
||
pGameScoreRecord=m_GameScoreRecordBuffer[nCount-1];
|
||
|
||
//删除对象
|
||
m_GameScoreRecordBuffer.RemoveAt(nCount-1);
|
||
}
|
||
|
||
//创建对象
|
||
if (pGameScoreRecord==NULL)
|
||
{
|
||
try
|
||
{
|
||
//创建对象
|
||
pGameScoreRecord=new tagGameScoreRecord;
|
||
if (pGameScoreRecord==NULL) throw TEXT("游戏记录对象创建失败");
|
||
}
|
||
catch (...)
|
||
{
|
||
ASSERT(FALSE);
|
||
}
|
||
}
|
||
|
||
//记录数据
|
||
if (pGameScoreRecord!=NULL)
|
||
{
|
||
//用户信息
|
||
pGameScoreRecord->wChairID=wChairID;
|
||
pGameScoreRecord->dwUserID=pIServerUserItem->GetUserID();
|
||
pGameScoreRecord->cbAndroid=(pIServerUserItem->IsAndroidUser()?TRUE:FALSE);
|
||
|
||
//用户信息
|
||
pGameScoreRecord->dwDBQuestID=pIServerUserItem->GetDBQuestID();
|
||
pGameScoreRecord->dwInoutIndex=pIServerUserItem->GetInoutIndex();
|
||
|
||
//成绩信息
|
||
pGameScoreRecord->lScore=ScoreInfo.lScore;
|
||
pGameScoreRecord->lGrade=ScoreInfo.lGrade;
|
||
pGameScoreRecord->lRevenue=ScoreInfo.lRevenue;
|
||
|
||
//附加信息
|
||
pGameScoreRecord->dwUserMemal=dwUserMemal;
|
||
pGameScoreRecord->dwPlayTimeCount=dwPlayTimeCount;
|
||
|
||
//机器人免税
|
||
if(pIServerUserItem->IsAndroidUser())
|
||
{
|
||
pGameScoreRecord->lScore += pGameScoreRecord->lRevenue;
|
||
pGameScoreRecord->lRevenue = 0L;
|
||
}
|
||
|
||
//插入数据
|
||
m_GameScoreRecordActive.Add(pGameScoreRecord);
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
//离开用户
|
||
CTraceService::TraceString(TEXT("系统暂时未支持离开用户的补分操作处理!"),TraceLevel_Exception);
|
||
|
||
return false;
|
||
}
|
||
|
||
//广播消息
|
||
if (szMessage[0]!=0)
|
||
{
|
||
//变量定义
|
||
IServerUserItem * pISendUserItem = NULL;
|
||
WORD wEnumIndex=0;
|
||
|
||
//游戏玩家
|
||
for (WORD i=0;i<m_wChairCount;i++)
|
||
{
|
||
//获取用户
|
||
pISendUserItem=GetTableUserItem(i);
|
||
if(pISendUserItem==NULL) continue;
|
||
|
||
//发送消息
|
||
SendGameMessage(pISendUserItem, szMessage, SMT_CHAT);
|
||
}
|
||
|
||
//旁观用户
|
||
do
|
||
{
|
||
pISendUserItem=EnumLookonUserItem(wEnumIndex++);
|
||
if(pISendUserItem!=NULL)
|
||
{
|
||
//发送消息
|
||
SendGameMessage(pISendUserItem, szMessage, SMT_CHAT);
|
||
}
|
||
} while (pISendUserItem!=NULL);
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
//写入积分
|
||
bool CTableFrame::WriteTableScore(tagScoreInfo ScoreInfoArray[], WORD wScoreCount,DataStream kDataStream)
|
||
{
|
||
//效验参数
|
||
ASSERT(wScoreCount==m_wChairCount);
|
||
if (wScoreCount!=m_wChairCount) return false;
|
||
|
||
//写入分数
|
||
for (WORD i=0;i<m_wChairCount;i++)
|
||
{
|
||
if (ScoreInfoArray[i].cbType!=SCORE_TYPE_NULL)
|
||
{
|
||
WriteUserScore(i,ScoreInfoArray[i]);
|
||
}
|
||
}
|
||
|
||
if (m_pITableFramePrivate)
|
||
{
|
||
m_pITableFramePrivate->WriteTableScore(this,ScoreInfoArray,wScoreCount,kDataStream);
|
||
}
|
||
return true;
|
||
}
|
||
|
||
////积分倍数
|
||
//bool CTableFrame::WriteScoreMultiple(WORD wChairID, BYTE cbScoreMultiple)
|
||
//{
|
||
// //效验参数
|
||
// ASSERT((wChairID < m_wChairCount) && (cbScoreMultiple >= 1));
|
||
// if ((wChairID >= m_wChairCount) && (cbScoreMultiple < 1)) return false;
|
||
//
|
||
//
|
||
//}
|
||
|
||
//计算税收
|
||
SCORE CTableFrame::CalculateRevenue(WORD wChairID, SCORE lScore)
|
||
{
|
||
//效验参数
|
||
ASSERT(wChairID<m_wChairCount);
|
||
if (wChairID>=m_wChairCount) return 0L;
|
||
|
||
//计算税收
|
||
if ((m_pGameServiceOption->wRevenueRatio>0)&&(lScore>=REVENUE_BENCHMARK))
|
||
{
|
||
//获取用户
|
||
ASSERT(GetTableUserItem(wChairID)!=NULL);
|
||
IServerUserItem * pIServerUserItem=GetTableUserItem(wChairID);
|
||
|
||
//计算税收
|
||
SCORE lRevenue=lScore*m_pGameServiceOption->wRevenueRatio/REVENUE_DENOMINATOR;
|
||
|
||
return lRevenue;
|
||
}
|
||
|
||
return 0L;
|
||
}
|
||
|
||
//消费限额
|
||
SCORE CTableFrame::QueryConsumeQuota(IServerUserItem * pIServerUserItem)
|
||
{
|
||
//用户效验
|
||
ASSERT(pIServerUserItem->GetTableID()==m_wTableID);
|
||
if (pIServerUserItem->GetTableID()!=m_wTableID) return 0L;
|
||
|
||
//查询额度
|
||
SCORE lTrusteeScore=pIServerUserItem->GetTrusteeScore();
|
||
SCORE lMinEnterScore=m_pGameServiceOption->lMinTableScore;
|
||
SCORE lUserConsumeQuota=m_pITableFrameSink->QueryConsumeQuota(pIServerUserItem);
|
||
|
||
//效验额度
|
||
ASSERT((lUserConsumeQuota>=0L)&&(lUserConsumeQuota<=pIServerUserItem->GetUserScore()-lMinEnterScore));
|
||
if ((lUserConsumeQuota<0L)||(lUserConsumeQuota>pIServerUserItem->GetUserScore()-lMinEnterScore)) return 0L;
|
||
|
||
return lUserConsumeQuota+lTrusteeScore;
|
||
}
|
||
|
||
//寻找用户
|
||
IServerUserItem * CTableFrame::SearchUserItem(DWORD dwUserID)
|
||
{
|
||
//变量定义
|
||
WORD wEnumIndex=0;
|
||
IServerUserItem * pIServerUserItem=NULL;
|
||
|
||
//桌子用户
|
||
for (WORD i=0;i<m_wChairCount;i++)
|
||
{
|
||
pIServerUserItem=GetTableUserItem(i);
|
||
if ((pIServerUserItem!=NULL)&&(pIServerUserItem->GetUserID()==dwUserID)) return pIServerUserItem;
|
||
}
|
||
|
||
//旁观用户
|
||
do
|
||
{
|
||
pIServerUserItem=EnumLookonUserItem(wEnumIndex++);
|
||
if ((pIServerUserItem!=NULL)&&(pIServerUserItem->GetUserID()==dwUserID)) return pIServerUserItem;
|
||
} while (pIServerUserItem!=NULL);
|
||
|
||
return NULL;
|
||
}
|
||
|
||
//游戏用户
|
||
IServerUserItem * CTableFrame::GetTableUserItem(WORD wChairID)
|
||
{
|
||
//效验参数
|
||
ASSERT(wChairID<m_wChairCount);
|
||
if (wChairID>=m_wChairCount) return NULL;
|
||
|
||
//获取用户
|
||
return m_TableUserItemArray[wChairID];
|
||
}
|
||
|
||
//旁观用户
|
||
IServerUserItem * CTableFrame::EnumLookonUserItem(WORD wEnumIndex)
|
||
{
|
||
if (wEnumIndex>=m_LookonUserItemArray.GetCount()) return NULL;
|
||
return m_LookonUserItemArray[wEnumIndex];
|
||
}
|
||
|
||
//设置时间
|
||
bool CTableFrame::SetGameTimer(DWORD dwTimerID, DWORD dwElapse, DWORD dwRepeat, WPARAM dwBindParameter)
|
||
{
|
||
//效验参数
|
||
ASSERT((dwTimerID>0)&&(dwTimerID<TIME_TABLE_MODULE_RANGE));
|
||
if ((dwTimerID<=0)||(dwTimerID>=TIME_TABLE_MODULE_RANGE)) return false;
|
||
|
||
//设置时间
|
||
DWORD dwEngineTimerID=IDI_TABLE_MODULE_START+m_wTableID*TIME_TABLE_MODULE_RANGE;
|
||
if (m_pITimerEngine!=NULL) m_pITimerEngine->SetTimer(dwEngineTimerID+dwTimerID,dwElapse,dwRepeat,dwBindParameter);
|
||
|
||
return true;
|
||
}
|
||
|
||
//删除时间
|
||
bool CTableFrame::KillGameTimer(DWORD dwTimerID)
|
||
{
|
||
//效验参数
|
||
ASSERT((dwTimerID>0)&&(dwTimerID<=TIME_TABLE_MODULE_RANGE));
|
||
if ((dwTimerID<=0)||(dwTimerID>TIME_TABLE_MODULE_RANGE)) return false;
|
||
|
||
//删除时间
|
||
DWORD dwEngineTimerID=IDI_TABLE_MODULE_START+m_wTableID*TIME_TABLE_MODULE_RANGE;
|
||
if (m_pITimerEngine!=NULL) m_pITimerEngine->KillTimer(dwEngineTimerID+dwTimerID);
|
||
|
||
return true;
|
||
}
|
||
|
||
//发送数据
|
||
bool CTableFrame::SendUserItemData(IServerUserItem * pIServerUserItem, WORD wSubCmdID)
|
||
{
|
||
//状态效验
|
||
ASSERT((pIServerUserItem!=NULL)&&(pIServerUserItem->IsClientReady()==true));
|
||
if ((pIServerUserItem==NULL)&&(pIServerUserItem->IsClientReady()==false)) return false;
|
||
|
||
//发送数据
|
||
m_pIMainServiceFrame->SendData(pIServerUserItem,MDM_GF_GAME,wSubCmdID,NULL,0);
|
||
|
||
return true;
|
||
}
|
||
|
||
//发送数据
|
||
bool CTableFrame::SendUserItemData(IServerUserItem * pIServerUserItem, WORD wSubCmdID, VOID * pData, WORD wDataSize)
|
||
{
|
||
//状态效验
|
||
ASSERT((pIServerUserItem!=NULL)&&(pIServerUserItem->IsClientReady()==true));
|
||
if ((pIServerUserItem==NULL)&&(pIServerUserItem->IsClientReady()==false)) return false;
|
||
|
||
//发送数据
|
||
m_pIMainServiceFrame->SendData(pIServerUserItem,MDM_GF_GAME,wSubCmdID,pData,wDataSize);
|
||
|
||
return true;
|
||
}
|
||
|
||
//发送数据
|
||
bool CTableFrame::SendTableData(WORD wChairID, WORD wSubCmdID)
|
||
{
|
||
//用户群发
|
||
if (wChairID==INVALID_CHAIR)
|
||
{
|
||
for (WORD i=0;i<m_wChairCount;i++)
|
||
{
|
||
//获取用户
|
||
IServerUserItem * pIServerUserItem=GetTableUserItem(i);
|
||
if (pIServerUserItem==NULL) continue;
|
||
|
||
//效验状态
|
||
ASSERT(pIServerUserItem->IsClientReady()==true);
|
||
if (pIServerUserItem->IsClientReady()==false) continue;
|
||
|
||
//发送数据
|
||
m_pIMainServiceFrame->SendData(pIServerUserItem,MDM_GF_GAME,wSubCmdID,NULL,0);
|
||
}
|
||
|
||
return true;
|
||
}
|
||
else
|
||
{
|
||
//获取用户
|
||
IServerUserItem * pIServerUserItem=GetTableUserItem(wChairID);
|
||
if (pIServerUserItem==NULL) return false;
|
||
|
||
//效验状态
|
||
ASSERT(pIServerUserItem->IsClientReady()==true);
|
||
if (pIServerUserItem->IsClientReady()==false) return false;
|
||
|
||
//发送数据
|
||
m_pIMainServiceFrame->SendData(pIServerUserItem,MDM_GF_GAME,wSubCmdID,NULL,0);
|
||
|
||
return true;
|
||
}
|
||
|
||
return false;
|
||
}
|
||
|
||
//发送数据
|
||
bool CTableFrame::SendTableData(WORD wChairID, WORD wSubCmdID, VOID * pData, WORD wDataSize,WORD wMainCmdID)
|
||
{
|
||
//用户群发
|
||
if (wChairID==INVALID_CHAIR)
|
||
{
|
||
for (WORD i=0;i<m_wChairCount;i++)
|
||
{
|
||
//获取用户
|
||
IServerUserItem * pIServerUserItem=GetTableUserItem(i);
|
||
if ((pIServerUserItem==NULL)||(pIServerUserItem->IsClientReady()==false)) continue;
|
||
if ((pIServerUserItem==NULL)) continue;
|
||
|
||
//发送数据
|
||
m_pIMainServiceFrame->SendData(pIServerUserItem,wMainCmdID,wSubCmdID,pData,wDataSize);
|
||
}
|
||
|
||
return true;
|
||
}
|
||
else
|
||
{
|
||
//获取用户
|
||
IServerUserItem * pIServerUserItem=GetTableUserItem(wChairID);
|
||
if ((pIServerUserItem==NULL)||(pIServerUserItem->IsClientReady()==false)) return false;
|
||
|
||
//发送数据
|
||
m_pIMainServiceFrame->SendData(pIServerUserItem,wMainCmdID,wSubCmdID,pData,wDataSize);
|
||
|
||
return true;
|
||
}
|
||
|
||
return false;
|
||
}
|
||
|
||
//发送数据
|
||
bool CTableFrame::SendLookonData(WORD wChairID, WORD wSubCmdID)
|
||
{
|
||
//变量定义
|
||
WORD wEnumIndex=0;
|
||
IServerUserItem * pIServerUserItem=NULL;
|
||
|
||
//枚举用户
|
||
do
|
||
{
|
||
//获取用户
|
||
pIServerUserItem=EnumLookonUserItem(wEnumIndex++);
|
||
if (pIServerUserItem==NULL) break;
|
||
|
||
//效验状态
|
||
ASSERT(pIServerUserItem->IsClientReady()==true);
|
||
if (pIServerUserItem->IsClientReady()==false) return false;
|
||
|
||
//发送数据
|
||
if ((wChairID==INVALID_CHAIR)||(pIServerUserItem->GetChairID()==wChairID))
|
||
{
|
||
m_pIMainServiceFrame->SendData(pIServerUserItem,MDM_GF_GAME,wSubCmdID,NULL,0);
|
||
}
|
||
|
||
} while (true);
|
||
|
||
return true;
|
||
}
|
||
|
||
//发送数据
|
||
bool CTableFrame::SendLookonData(WORD wChairID, WORD wSubCmdID, VOID * pData, WORD wDataSize)
|
||
{
|
||
//变量定义
|
||
WORD wEnumIndex=0;
|
||
IServerUserItem * pIServerUserItem=NULL;
|
||
|
||
//枚举用户
|
||
do
|
||
{
|
||
//获取用户
|
||
pIServerUserItem=EnumLookonUserItem(wEnumIndex++);
|
||
if (pIServerUserItem==NULL) break;
|
||
|
||
//效验状态
|
||
//ASSERT(pIServerUserItem->IsClientReady()==true);
|
||
if (pIServerUserItem->IsClientReady()==false) return false;
|
||
|
||
//发送数据
|
||
if ((wChairID==INVALID_CHAIR)||(pIServerUserItem->GetChairID()==wChairID))
|
||
{
|
||
m_pIMainServiceFrame->SendData(pIServerUserItem,MDM_GF_GAME,wSubCmdID,pData,wDataSize);
|
||
}
|
||
|
||
} while (true);
|
||
|
||
return true;
|
||
}
|
||
|
||
//发送消息
|
||
bool CTableFrame::SendGameMessage(LPCTSTR lpszMessage, WORD wType)
|
||
{
|
||
//变量定义
|
||
WORD wEnumIndex=0;
|
||
|
||
//发送消息
|
||
for (WORD i=0;i<m_wChairCount;i++)
|
||
{
|
||
//获取用户
|
||
IServerUserItem * pIServerUserItem=GetTableUserItem(i);
|
||
if ((pIServerUserItem==NULL)||(pIServerUserItem->IsClientReady()==false)) continue;
|
||
|
||
//发送消息
|
||
m_pIMainServiceFrame->SendGameMessage(pIServerUserItem,lpszMessage,wType);
|
||
}
|
||
|
||
//枚举用户
|
||
do
|
||
{
|
||
//获取用户
|
||
IServerUserItem * pIServerUserItem=EnumLookonUserItem(wEnumIndex++);
|
||
if (pIServerUserItem==NULL) break;
|
||
|
||
//效验状态
|
||
ASSERT(pIServerUserItem->IsClientReady()==true);
|
||
if (pIServerUserItem->IsClientReady()==false) return false;
|
||
|
||
//发送消息
|
||
m_pIMainServiceFrame->SendGameMessage(pIServerUserItem,lpszMessage,wType);
|
||
|
||
} while (true);
|
||
|
||
return true;
|
||
}
|
||
|
||
//房间消息
|
||
bool CTableFrame::SendRoomMessage(IServerUserItem * pIServerUserItem, LPCTSTR lpszMessage, WORD wType)
|
||
{
|
||
//用户效验
|
||
ASSERT(pIServerUserItem!=NULL);
|
||
if (pIServerUserItem==NULL) return false;
|
||
|
||
//发送消息
|
||
m_pIMainServiceFrame->SendRoomMessage(pIServerUserItem,lpszMessage,wType);
|
||
|
||
return true;
|
||
}
|
||
|
||
//游戏消息
|
||
bool CTableFrame::SendGameMessage(IServerUserItem * pIServerUserItem, LPCTSTR lpszMessage, WORD wType)
|
||
{
|
||
//用户效验
|
||
ASSERT(pIServerUserItem!=NULL);
|
||
if (pIServerUserItem==NULL) return false;
|
||
|
||
//发送消息
|
||
return m_pIMainServiceFrame->SendGameMessage(pIServerUserItem,lpszMessage,wType);
|
||
}
|
||
|
||
//发送场景
|
||
bool CTableFrame::SendGameScene(IServerUserItem * pIServerUserItem, VOID * pData, WORD wDataSize)
|
||
{
|
||
//用户效验
|
||
ASSERT((pIServerUserItem!=NULL)&&(pIServerUserItem->IsClientReady()==true));
|
||
if ((pIServerUserItem==NULL)||(pIServerUserItem->IsClientReady()==false)) return false;
|
||
|
||
//发送场景
|
||
ASSERT(m_pIMainServiceFrame!=NULL);
|
||
m_pIMainServiceFrame->SendData(pIServerUserItem,MDM_GF_FRAME,SUB_GF_GAME_SCENE,pData,wDataSize);
|
||
|
||
return true;
|
||
}
|
||
|
||
//设置接口
|
||
bool CTableFrame::SetTableFrameHook(IUnknownEx * pIUnknownEx)
|
||
{
|
||
ASSERT(pIUnknownEx!=NULL);
|
||
if(pIUnknownEx==NULL) return false;
|
||
|
||
//类型判断
|
||
if((m_pGameServiceOption->wServerType&GAME_GENRE_MATCH)==0) return false;
|
||
|
||
//查询接口
|
||
m_pITableFrameHook=QUERY_OBJECT_PTR_INTERFACE(pIUnknownEx,ITableFrameHook);
|
||
m_pIMatchTableAction=QUERY_OBJECT_PTR_INTERFACE(pIUnknownEx,ITableUserAction);
|
||
|
||
return true;
|
||
}
|
||
bool CTableFrame::SetTableFramePrivate(IUnknownEx * pIUnknownEx)
|
||
{
|
||
ASSERT(pIUnknownEx!=NULL);
|
||
if(pIUnknownEx==NULL) return false;
|
||
|
||
//类型判断
|
||
if((m_pGameServiceOption->wServerType&GAME_GENRE_EDUCATE)==0) return false;
|
||
|
||
//查询接口
|
||
m_pITableFramePrivate=QUERY_OBJECT_PTR_INTERFACE(pIUnknownEx,ITableFramePrivate);
|
||
m_pIPrivateTableAction=QUERY_OBJECT_PTR_INTERFACE(pIUnknownEx,ITableUserAction);
|
||
|
||
return true;
|
||
}
|
||
//添加事件
|
||
void CTableFrame::AddPrivateAction(DWORD dwChairID,BYTE bActionIdex)
|
||
{
|
||
if (m_pITableFramePrivate)
|
||
{
|
||
m_pITableFramePrivate->AddPrivateAction(this,dwChairID,bActionIdex);
|
||
}
|
||
}
|
||
//设置私人场信息
|
||
void CTableFrame::SetPrivateInfo(tagPrivateFrameParameter &PriavateFrame)
|
||
{
|
||
CopyMemory(&m_PrivateFramePrarameter, &PriavateFrame, sizeof(tagPrivateFrameParameter));
|
||
}
|
||
|
||
//获取私人场配置
|
||
tagPrivateFrameParameter* CTableFrame::GetPrivateFrameInfo()
|
||
{
|
||
return &m_PrivateFramePrarameter;
|
||
}
|
||
|
||
bool CTableFrame::IsAutoUserCountRule(ITableFrame* pTbableFrame, bool bReal /*= false*/)
|
||
{
|
||
if (m_pITableFramePrivate)
|
||
{
|
||
return m_pITableFramePrivate->IsAutoUserCountRule(pTbableFrame, bReal);
|
||
}
|
||
|
||
return false;
|
||
}
|
||
|
||
//统计私人场玩家局数
|
||
VOID CTableFrame::addPrivatePlayCout(WORD wCout)
|
||
{
|
||
m_PrivateFrameRecord.cbFinishCout += wCout;
|
||
|
||
if (m_pITableFramePrivate)
|
||
{
|
||
m_pITableFramePrivate->addPrivatePlayCout(this, wCout);
|
||
}
|
||
}
|
||
//重置私人场结束信息
|
||
void CTableFrame::ResetPrivateEndInfo()
|
||
{
|
||
ZeroMemory(&m_PrivateFrameRecord, sizeof(m_PrivateFrameRecord));
|
||
|
||
//私人场配置;
|
||
ZeroMemory(&m_PrivateFramePrarameter, sizeof(m_PrivateFramePrarameter));
|
||
|
||
if (m_pITableFrameSink)
|
||
{
|
||
m_pITableFrameSink->ResetPrivateEndInfo();
|
||
}
|
||
}
|
||
|
||
//获取当前完成数据
|
||
tagPrivateFrameRecordInfo* CTableFrame::GetPrivateFrameRecord()
|
||
{
|
||
return &m_PrivateFrameRecord;
|
||
}
|
||
|
||
//获得私人场结束信息流
|
||
void CTableFrame::GetPrivateEndInfo(DataStream &kDataStream, bool bSend)
|
||
{
|
||
if (m_pITableFrameSink)
|
||
{
|
||
m_pITableFrameSink->GetPrivateEndInfo(kDataStream, bSend);
|
||
}
|
||
}
|
||
|
||
//判断私人场是否结束
|
||
bool CTableFrame::IsPrivateEnd()
|
||
{
|
||
// 判断服务器维护;
|
||
if (CServerRule::IsForfendGameStart(m_pGameServiceOption->dwServerRule) == true)
|
||
{
|
||
return true;
|
||
}
|
||
|
||
// 游戏是否结束;
|
||
if (m_pITableFrameSink)
|
||
{
|
||
return m_pITableFrameSink->IsPrivateEnd();
|
||
}
|
||
|
||
return false;
|
||
}
|
||
|
||
//真实椅子数量
|
||
WORD CTableFrame::GetRealChairCount()
|
||
{
|
||
if (m_pITableFrameSink)
|
||
{
|
||
return m_pITableFrameSink->GetRealChairCount();
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
|
||
//获取牌库
|
||
tagGameCardLibrary* CTableFrame::GetGameCardLibrary(DWORD dwCustomID/* = 0xFFFFFFFF*/)
|
||
{
|
||
INT_PTR nLibCount = m_GameCardLibraryBuffer.GetCount();
|
||
|
||
if (0xFFFFFFFF == dwCustomID)
|
||
{
|
||
if (nLibCount > 0L)
|
||
{
|
||
INT_PTR nIndex = rand() % nLibCount;
|
||
return m_GameCardLibraryBuffer[nIndex];
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (nLibCount > 0L && dwCustomID <= CServerUserItem::g_dwCardLibCount)
|
||
{
|
||
//return m_GameCardLibraryBuffer[dwIndex];
|
||
for (INT_PTR i = 0; i < nLibCount; i++)
|
||
{
|
||
tagGameCardLibrary* pCardLib = m_GameCardLibraryBuffer[i];
|
||
if (pCardLib->dwCustomID == dwCustomID)
|
||
{
|
||
return pCardLib;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
return NULL;
|
||
}
|
||
|
||
//增加牌库
|
||
void CTableFrame::AddGameCardLibrary(tagGameCardLibrary* pGameCard)
|
||
{
|
||
m_GameCardLibraryBuffer.Add(pGameCard);
|
||
}
|
||
|
||
//修改牌库
|
||
void CTableFrame::UpdateGameCardLibrary(DWORD dwLibID, DWORD dwCustomID, BYTE cbCardCount, BYTE* pCardData)
|
||
{
|
||
ASSERT(pCardData != NULL);
|
||
INT_PTR nCount = m_GameCardLibraryBuffer.GetCount();
|
||
for (INT_PTR i = 0; i < nCount; i++)
|
||
{
|
||
tagGameCardLibrary* pCardLib = m_GameCardLibraryBuffer[i];
|
||
if (pCardLib->dwLibID == dwLibID)
|
||
{
|
||
pCardLib->cbCount = cbCardCount;
|
||
pCardLib->dwCustomID = dwCustomID;
|
||
|
||
ZeroMemory(pCardLib->cbData, sizeof(pCardLib->cbData));
|
||
memcpy(pCardLib->cbData, pCardData, cbCardCount*sizeof(BYTE));
|
||
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
//删除牌库
|
||
void CTableFrame::ClearGameCardLibrary()
|
||
{
|
||
for (INT_PTR i = 0; i < m_GameCardLibraryBuffer.GetCount(); i++)
|
||
{
|
||
tagGameCardLibrary* pCardLib = m_GameCardLibraryBuffer[i];
|
||
SafeDelete(pCardLib);
|
||
}
|
||
|
||
m_GameCardLibraryBuffer.RemoveAll();
|
||
}
|
||
|
||
//断线事件
|
||
bool CTableFrame::OnEventUserOffLine(IServerUserItem * pIServerUserItem)
|
||
{
|
||
//参数效验
|
||
ASSERT(pIServerUserItem!=NULL);
|
||
if (pIServerUserItem==NULL) return false;
|
||
|
||
//用户变量
|
||
tagUserInfo * pUserInfo=pIServerUserItem->GetUserInfo();
|
||
IServerUserItem * pITableUserItem=m_TableUserItemArray[pUserInfo->wChairID];
|
||
|
||
//用户属性
|
||
WORD wChairID=pIServerUserItem->GetChairID();
|
||
BYTE cbUserStatus=pIServerUserItem->GetUserStatus();
|
||
|
||
//游戏用户
|
||
if (cbUserStatus!=US_LOOKON)
|
||
{
|
||
//效验用户
|
||
ASSERT(pIServerUserItem==GetTableUserItem(wChairID));
|
||
if (pIServerUserItem!=GetTableUserItem(wChairID)) return false;
|
||
|
||
|
||
//私人类型
|
||
if(m_pGameServiceOption->wServerType==GAME_GENRE_EDUCATE)
|
||
{
|
||
pIServerUserItem->SetReUserStatus(pIServerUserItem->GetUserStatus());
|
||
pIServerUserItem->SetUserStatus(US_OFFLINE,m_wTableID,wChairID);
|
||
//掉线通知
|
||
if(m_pIPrivateTableAction!=NULL) m_pIPrivateTableAction->OnActionUserOffLine(wChairID,pIServerUserItem);
|
||
//掉线通知
|
||
if (m_pITableUserAction != NULL) m_pITableUserAction->OnActionUserOffLine(wChairID, pIServerUserItem);
|
||
|
||
return true;
|
||
}
|
||
|
||
//比赛类型
|
||
if (m_pGameServiceOption->wServerType == GAME_GENRE_MATCH)
|
||
{
|
||
if (pIServerUserItem->GetChairID() != INVALID_CHAIR && pIServerUserItem->GetTableID() != INVALID_TABLE)
|
||
{
|
||
pIServerUserItem->SetReUserStatus(pIServerUserItem->GetUserStatus());
|
||
pIServerUserItem->SetUserStatus(US_OFFLINE, m_wTableID, wChairID);
|
||
//掉线通知
|
||
if (m_pIPrivateTableAction != NULL) m_pIPrivateTableAction->OnActionUserOffLine(wChairID, pIServerUserItem);
|
||
|
||
return true;
|
||
}
|
||
}
|
||
|
||
//断线处理
|
||
if ((cbUserStatus==US_PLAYING)&&(m_wOffLineCount[wChairID]<MAX_OFF_LINE))
|
||
{
|
||
//用户设置
|
||
pIServerUserItem->SetClientReady(false);
|
||
pIServerUserItem->SetUserStatus(US_OFFLINE,m_wTableID,wChairID);
|
||
|
||
//比赛类型
|
||
if(m_pGameServiceOption->wServerType==GAME_GENRE_MATCH)
|
||
{
|
||
//if(pIServerUserItem->IsTrusteeUser()==false)
|
||
{
|
||
//设置托管
|
||
//pIServerUserItem->SetTrusteeUser(true);
|
||
|
||
//掉线通知
|
||
if(m_pITableUserAction!=NULL) m_pITableUserAction->OnActionUserOffLine(wChairID,pIServerUserItem);
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
//掉线通知
|
||
if(m_pITableUserAction!=NULL) m_pITableUserAction->OnActionUserOffLine(wChairID,pIServerUserItem);
|
||
|
||
//断线处理
|
||
if (m_dwOffLineTime[wChairID]==0L)
|
||
{
|
||
//设置变量
|
||
m_wOffLineCount[wChairID]++;
|
||
m_dwOffLineTime[wChairID]=(DWORD)time(NULL);
|
||
|
||
//时间设置
|
||
WORD wOffLineCount=GetOffLineUserCount();
|
||
if (wOffLineCount==1) SetGameTimer(IDI_OFF_LINE,TIME_OFF_LINE,1,wChairID);
|
||
}
|
||
|
||
return true;
|
||
}
|
||
}
|
||
//用户起立
|
||
PerformStandUpAction(pIServerUserItem);
|
||
|
||
//删除用户
|
||
ASSERT(pIServerUserItem->GetUserStatus()==US_FREE);
|
||
pIServerUserItem->SetUserStatus(US_NULL,INVALID_TABLE,INVALID_CHAIR);
|
||
|
||
return true;
|
||
}
|
||
|
||
//积分事件
|
||
bool CTableFrame::OnUserScroeNotify(WORD wChairID, IServerUserItem * pIServerUserItem, BYTE cbReason)
|
||
{
|
||
//通知游戏
|
||
return m_pITableFrameSink->OnUserScroeNotify(wChairID,pIServerUserItem,cbReason);
|
||
}
|
||
|
||
//时间事件
|
||
bool CTableFrame::OnEventTimer(DWORD dwTimerID, WPARAM dwBindParameter)
|
||
{
|
||
//回调事件
|
||
if ((dwTimerID>=0)&&(dwTimerID<TIME_TABLE_SINK_RANGE))
|
||
{
|
||
ASSERT(m_pITableFrameSink!=NULL);
|
||
return m_pITableFrameSink->OnTimerMessage(dwTimerID,dwBindParameter);
|
||
}
|
||
|
||
//事件处理
|
||
switch (dwTimerID)
|
||
{
|
||
case IDI_OFF_LINE: //断线事件
|
||
{
|
||
//效验状态
|
||
ASSERT(m_bGameStarted==true);
|
||
if (m_bGameStarted==false) return false;
|
||
|
||
//变量定义
|
||
DWORD dwOffLineTime=0L;
|
||
WORD wOffLineChair=INVALID_CHAIR;
|
||
|
||
//寻找用户
|
||
for (WORD i=0;i<m_wChairCount;i++)
|
||
{
|
||
if ((m_dwOffLineTime[i]!=0L)&&((m_dwOffLineTime[i]<dwOffLineTime)||(wOffLineChair==INVALID_CHAIR)))
|
||
{
|
||
wOffLineChair=i;
|
||
dwOffLineTime=m_dwOffLineTime[i];
|
||
}
|
||
}
|
||
|
||
//位置判断
|
||
ASSERT(wOffLineChair!=INVALID_CHAIR);
|
||
if (wOffLineChair==INVALID_CHAIR) return false;
|
||
|
||
//用户判断
|
||
ASSERT(dwBindParameter<m_wChairCount);
|
||
if (wOffLineChair!=(WORD)dwBindParameter)
|
||
{
|
||
//时间计算
|
||
DWORD dwCurrentTime=(DWORD)time(NULL);
|
||
DWORD dwLapseTime=dwCurrentTime-m_dwOffLineTime[wOffLineChair];
|
||
|
||
//设置时间
|
||
dwLapseTime=__min(dwLapseTime,TIME_OFF_LINE-2000L);
|
||
SetGameTimer(IDI_OFF_LINE,TIME_OFF_LINE-dwLapseTime,1,wOffLineChair);
|
||
|
||
return true;
|
||
}
|
||
|
||
//获取用户
|
||
ASSERT(GetTableUserItem(wOffLineChair)!=NULL);
|
||
IServerUserItem * pIServerUserItem=GetTableUserItem(wOffLineChair);
|
||
|
||
//结束游戏
|
||
if (pIServerUserItem!=NULL)
|
||
{
|
||
//设置变量
|
||
m_dwOffLineTime[wOffLineChair]=0L;
|
||
|
||
//用户起立
|
||
PerformStandUpAction(pIServerUserItem);
|
||
}
|
||
|
||
//继续时间
|
||
if (m_bGameStarted==true)
|
||
{
|
||
//变量定义
|
||
DWORD dwOffLineTime=0L;
|
||
WORD wOffLineChair=INVALID_CHAIR;
|
||
|
||
//寻找用户
|
||
for (WORD i=0;i<m_wChairCount;i++)
|
||
{
|
||
if ((m_dwOffLineTime[i]!=0L)&&((m_dwOffLineTime[i]<dwOffLineTime)||(wOffLineChair==INVALID_CHAIR)))
|
||
{
|
||
wOffLineChair=i;
|
||
dwOffLineTime=m_dwOffLineTime[i];
|
||
}
|
||
}
|
||
|
||
//设置时间
|
||
if (wOffLineChair!=INVALID_CHAIR)
|
||
{
|
||
//时间计算
|
||
DWORD dwCurrentTime=(DWORD)time(NULL);
|
||
DWORD dwLapseTime=dwCurrentTime-m_dwOffLineTime[wOffLineChair];
|
||
|
||
//设置时间
|
||
dwLapseTime=__min(dwLapseTime,TIME_OFF_LINE-2000L);
|
||
SetGameTimer(IDI_OFF_LINE,TIME_OFF_LINE-dwLapseTime,1,wOffLineChair);
|
||
}
|
||
}
|
||
|
||
return true;
|
||
}
|
||
}
|
||
|
||
//错误断言
|
||
ASSERT(FALSE);
|
||
|
||
return false;
|
||
}
|
||
|
||
//游戏事件
|
||
bool CTableFrame::OnEventSocketGame(WORD wSubCmdID, VOID * pData, WORD wDataSize, IServerUserItem * pIServerUserItem)
|
||
{
|
||
//效验参数
|
||
ASSERT(pIServerUserItem!=NULL);
|
||
ASSERT(m_pITableFrameSink!=NULL);
|
||
|
||
//消息处理
|
||
return m_pITableFrameSink->OnGameMessage(wSubCmdID,pData,wDataSize,pIServerUserItem);
|
||
}
|
||
|
||
//框架事件
|
||
bool CTableFrame::OnEventSocketFrame(WORD wSubCmdID, VOID * pData, WORD wDataSize, IServerUserItem * pIServerUserItem)
|
||
{
|
||
//游戏处理
|
||
if (m_pITableFrameSink->OnFrameMessage(wSubCmdID,pData,wDataSize,pIServerUserItem)==true) return true;
|
||
|
||
//默认处理
|
||
switch (wSubCmdID)
|
||
{
|
||
case SUB_GF_GAME_OPTION: //游戏配置
|
||
{
|
||
//效验参数
|
||
ASSERT(wDataSize==sizeof(CMD_GF_GameOption));
|
||
if (wDataSize!=sizeof(CMD_GF_GameOption)) return false;
|
||
|
||
//变量定义
|
||
CMD_GF_GameOption * pGameOption=(CMD_GF_GameOption *)pData;
|
||
|
||
//获取属性
|
||
WORD wChairID=pIServerUserItem->GetChairID();
|
||
BYTE cbUserStatus=pIServerUserItem->GetUserStatus();
|
||
|
||
//断线清理
|
||
if ((cbUserStatus!=US_LOOKON)&&((m_dwOffLineTime[wChairID]!=0L)))
|
||
{
|
||
//设置变量
|
||
m_dwOffLineTime[wChairID]=0L;
|
||
|
||
//删除时间
|
||
WORD wOffLineCount=GetOffLineUserCount();
|
||
if (wOffLineCount==0) KillGameTimer(IDI_OFF_LINE);
|
||
}
|
||
|
||
//设置状态
|
||
pIServerUserItem->SetClientReady(true);
|
||
if (cbUserStatus!=US_LOOKON) m_bAllowLookon[wChairID]=pGameOption->cbAllowLookon?true:false;
|
||
|
||
//发送状态
|
||
CMD_GF_GameStatus GameStatus;
|
||
GameStatus.cbGameStatus=m_cbGameStatus;
|
||
GameStatus.cbAllowLookon=m_bAllowLookon[wChairID]?TRUE:FALSE;
|
||
m_pIMainServiceFrame->SendData(pIServerUserItem,MDM_GF_FRAME,SUB_GF_GAME_STATUS,&GameStatus,sizeof(GameStatus));
|
||
|
||
// 先发送私人场信息,在发送场景信息
|
||
if (m_pITableFramePrivate != NULL) m_pITableFramePrivate->OnEventPrivateRoomInfo(wChairID, pIServerUserItem);
|
||
|
||
|
||
////发送消息
|
||
//TCHAR szMessage[128]=TEXT("");
|
||
//_sntprintf_s(szMessage,CountArray(szMessage),TEXT("欢迎您进入“%s”游戏,祝您游戏愉快!"),m_pGameServiceAttrib->szGameName);
|
||
//m_pIMainServiceFrame->SendGameMessage(pIServerUserItem,szMessage,SMT_CHAT);
|
||
|
||
for (WORD i=0;i<m_wChairCount;i++)
|
||
{
|
||
//获取用户
|
||
if (m_TableUserItemArray[i]==NULL) continue;
|
||
if (pIServerUserItem==NULL) continue;
|
||
if (pIServerUserItem == m_TableUserItemArray[i]) continue;
|
||
|
||
IServerUserItem * pSendIServerUserItem=m_TableUserItemArray[i];
|
||
m_pIMainServiceFrame->SendUserInfoPacket(pSendIServerUserItem,pIServerUserItem);
|
||
m_pIMainServiceFrame->SendUserInfoPacket(pIServerUserItem,pSendIServerUserItem);
|
||
}
|
||
|
||
if (pIServerUserItem->IsAndroidUser())
|
||
{
|
||
//构造提示;
|
||
TCHAR szDescribe[256] = TEXT("");
|
||
_sntprintf_s(szDescribe, CountArray(szDescribe), TEXT("recv player [%s] SUB_GF_GAME_OPTION message, SendUserInfoPacket, GetUserStatus:[%d].GetTableID:[%d],GetChairID:[%d]."),
|
||
pIServerUserItem->GetNickName(), pIServerUserItem->GetUserStatus(), pIServerUserItem->GetTableID(), pIServerUserItem->GetChairID());
|
||
|
||
//提示消息;
|
||
CTraceService::TraceString(szDescribe, TraceLevel_Warning);
|
||
}
|
||
|
||
// 玩家全部同步完成同步;
|
||
if (m_pITableFramePrivate != NULL) m_pITableFramePrivate->OnEventClientReady(wChairID, pIServerUserItem);
|
||
|
||
//发送场景
|
||
bool bSendSecret=((cbUserStatus!=US_LOOKON)||(m_bAllowLookon[wChairID]==true));
|
||
m_pITableFrameSink->OnEventSendGameScene(wChairID,pIServerUserItem,m_cbGameStatus,bSendSecret);
|
||
|
||
//// 如果当前桌上是空闲状态设置断线玩家为坐下状态
|
||
//if ((this->GetGameStatus() == GAME_STATUS_FREE) && (cbUserStatus == US_PLAYING))
|
||
//{
|
||
// pIServerUserItem->SetUserStatus(US_SIT, GetTableID(), wChairID);
|
||
//}
|
||
|
||
//开始判断
|
||
if (cbUserStatus == US_READY)
|
||
{
|
||
if (EfficacyStartGame(wChairID) == true)
|
||
{
|
||
//StartGame();
|
||
// 自由人数场,通知客户端开始准备;
|
||
if (IsAutoUserCountRule(this))
|
||
{
|
||
tagAutoUserStatus userStatus;
|
||
userStatus.bStartGame = true;
|
||
m_pIPrivateTableAction->OnActionUserOnStart(wChairID, pIServerUserItem, &userStatus, sizeof(userStatus));
|
||
}
|
||
else
|
||
{
|
||
StartGame();
|
||
}
|
||
}
|
||
}
|
||
|
||
return true;
|
||
}
|
||
case SUB_GF_USER_READY: //用户准备
|
||
{
|
||
//获取属性
|
||
WORD wChairID=pIServerUserItem->GetChairID();
|
||
BYTE cbUserStatus=pIServerUserItem->GetUserStatus();
|
||
|
||
//效验状态
|
||
ASSERT(GetTableUserItem(wChairID)==pIServerUserItem);
|
||
if (GetTableUserItem(wChairID)!=pIServerUserItem) return false;
|
||
|
||
//效验状态
|
||
ASSERT(cbUserStatus==US_SIT || cbUserStatus == US_CAN_READY);
|
||
if (cbUserStatus!=US_SIT && cbUserStatus != US_CAN_READY) return true;
|
||
|
||
////分组判断(不是私人场)
|
||
//if (m_pGameServiceOption->wServerType != GAME_GENRE_EDUCATE)
|
||
//{
|
||
// if ((m_pGameServiceOption->cbDistributeRule&DISTRIBUTE_ALLOW) != 0)
|
||
// {
|
||
// m_pIMainServiceFrame->InsertDistribute(pIServerUserItem);
|
||
// return true;
|
||
// }
|
||
//}
|
||
|
||
//防作弊分组判断
|
||
if ((CServerRule::IsAllowAvertCheatMode(m_pGameServiceOption->dwServerRule) && (m_pGameServiceAttrib->wChairCount < MAX_CHAIR))
|
||
&& (m_wDrawCount >= m_pGameServiceOption->wDistributeDrawCount || CheckDistribute()))
|
||
{
|
||
//发送消息
|
||
LPCTSTR pszMessage = TEXT("系统重新分配桌子,请稍后!");
|
||
SendGameMessage(pIServerUserItem, pszMessage, SMT_CHAT);
|
||
|
||
//发送消息
|
||
m_pIMainServiceFrame->InsertDistribute(pIServerUserItem);
|
||
return true;
|
||
}
|
||
|
||
//事件通知
|
||
if (m_pITableUserAction!=NULL)
|
||
{
|
||
m_pITableUserAction->OnActionUserOnReady(wChairID,pIServerUserItem,pData,wDataSize);
|
||
}
|
||
|
||
//事件通知
|
||
if(m_pIMatchTableAction!=NULL && !m_pIMatchTableAction->OnActionUserOnReady(wChairID,pIServerUserItem, pData,wDataSize))
|
||
{
|
||
return true;
|
||
}
|
||
|
||
//事件通知
|
||
bool bReady = true;
|
||
if (m_pIPrivateTableAction != NULL && !m_pIPrivateTableAction->OnActionUserOnReady(wChairID, pIServerUserItem, &bReady, sizeof(bReady)))
|
||
{
|
||
return true;
|
||
}
|
||
|
||
//开始判断
|
||
if (EfficacyStartGame(wChairID)==false)
|
||
{
|
||
pIServerUserItem->SetUserStatus(US_READY,m_wTableID,wChairID);
|
||
}
|
||
else
|
||
{
|
||
// 自由人数场,通知客户端开始准备;
|
||
if (IsAutoUserCountRule(this))
|
||
{
|
||
pIServerUserItem->SetUserStatus(US_READY, m_wTableID, wChairID);
|
||
|
||
tagAutoUserStatus userStatus;
|
||
userStatus.bStartGame = true;
|
||
m_pIPrivateTableAction->OnActionUserOnStart(wChairID, pIServerUserItem, &userStatus, sizeof(userStatus));
|
||
}
|
||
else
|
||
{
|
||
StartGame();
|
||
}
|
||
}
|
||
|
||
return true;
|
||
}
|
||
case SUB_GF_USER_START_READY:
|
||
{
|
||
//分组判断(不是私人场)
|
||
if (m_pGameServiceOption->wServerType != GAME_GENRE_EDUCATE)
|
||
{
|
||
return false;
|
||
}
|
||
|
||
//获取属性
|
||
WORD wChairID = pIServerUserItem->GetChairID();
|
||
BYTE cbUserStatus = pIServerUserItem->GetUserStatus();
|
||
|
||
//效验状态
|
||
ASSERT(GetTableUserItem(wChairID) == pIServerUserItem);
|
||
if (GetTableUserItem(wChairID) != pIServerUserItem) return false;
|
||
|
||
//效验状态
|
||
ASSERT((cbUserStatus == US_READY));
|
||
if ((cbUserStatus != US_READY)) return true;
|
||
|
||
//事件通知
|
||
if (m_pIPrivateTableAction != NULL && !m_pIPrivateTableAction->OnActionUserStartGame(wChairID, pIServerUserItem, pData, wDataSize))
|
||
{
|
||
//开始判断
|
||
return false;
|
||
}
|
||
|
||
return true;
|
||
}
|
||
case SUB_GF_CHANGE_TABLE:
|
||
{
|
||
//获取属性
|
||
WORD wChairID = pIServerUserItem->GetChairID();
|
||
BYTE cbUserStatus = pIServerUserItem->GetUserStatus();
|
||
|
||
//效验状态
|
||
ASSERT(GetTableUserItem(wChairID) == pIServerUserItem);
|
||
if (GetTableUserItem(wChairID) != pIServerUserItem) return false;
|
||
|
||
//效验状态
|
||
ASSERT(cbUserStatus == US_SIT);
|
||
if (cbUserStatus != US_SIT) return true;
|
||
|
||
//防作弊分组判断
|
||
if (CServerRule::IsAllowAvertCheatMode(m_pGameServiceOption->dwServerRule) && (m_pGameServiceAttrib->wChairCount < MAX_CHAIR))
|
||
{
|
||
//发送消息
|
||
LPCTSTR pszMessage = TEXT("系统重新分配桌子,请稍后!");
|
||
SendGameMessage(pIServerUserItem, pszMessage, SMT_CHAT);
|
||
|
||
//发送消息
|
||
m_pIMainServiceFrame->InsertDistribute(pIServerUserItem);
|
||
}
|
||
|
||
return true;
|
||
}
|
||
case SUB_GF_USER_CHAT: //用户聊天
|
||
{
|
||
//变量定义
|
||
CMD_GF_C_UserChat * pUserChat=(CMD_GF_C_UserChat *)pData;
|
||
|
||
//效验参数
|
||
ASSERT(wDataSize<=sizeof(CMD_GF_C_UserChat));
|
||
ASSERT(wDataSize>=(sizeof(CMD_GF_C_UserChat)-sizeof(pUserChat->szChatString)));
|
||
ASSERT(wDataSize==(sizeof(CMD_GF_C_UserChat)-sizeof(pUserChat->szChatString)+pUserChat->wChatLength*sizeof(pUserChat->szChatString[0])));
|
||
|
||
//效验参数
|
||
if (wDataSize>sizeof(CMD_GF_C_UserChat)) return false;
|
||
if (wDataSize<(sizeof(CMD_GF_C_UserChat)-sizeof(pUserChat->szChatString))) return false;
|
||
if (wDataSize!=(sizeof(CMD_GF_C_UserChat)-sizeof(pUserChat->szChatString)+pUserChat->wChatLength*sizeof(pUserChat->szChatString[0]))) return false;
|
||
|
||
pUserChat->szChatString[pUserChat->wChatLength] = _T('\0');
|
||
ConvertUtf8ToGBK(pUserChat->szChatString, LEN_USER_CHAT);
|
||
|
||
//目标用户
|
||
if ((pUserChat->dwTargetUserID!=0)&&(SearchUserItem(pUserChat->dwTargetUserID)==NULL))
|
||
{
|
||
ASSERT(FALSE);
|
||
return true;
|
||
}
|
||
|
||
//状态判断
|
||
if ((CServerRule::IsForfendGameChat(m_pGameServiceOption->dwServerRule)==true)&&(pIServerUserItem->GetMasterOrder()==0L))
|
||
{
|
||
SendGameMessage(pIServerUserItem,TEXT("抱歉,当前游戏房间禁止游戏聊天!"),SMT_CHAT);
|
||
return true;
|
||
}
|
||
|
||
//权限判断
|
||
if (CUserRight::CanRoomChat(pIServerUserItem->GetUserRight())==false)
|
||
{
|
||
SendGameMessage(pIServerUserItem,TEXT("抱歉,您没有游戏聊天的权限,若需要帮助,请联系游戏客服咨询!"),SMT_EJECT|SMT_CHAT);
|
||
return true;
|
||
}
|
||
|
||
//构造消息
|
||
CMD_GF_S_UserChat UserChat;
|
||
ZeroMemory(&UserChat,sizeof(UserChat));
|
||
|
||
//字符过滤
|
||
m_pIMainServiceFrame->SensitiveWordFilter(pUserChat->szChatString,UserChat.szChatString,CountArray(UserChat.szChatString));
|
||
|
||
//构造数据
|
||
UserChat.dwChatColor=pUserChat->dwChatColor;
|
||
UserChat.wChatLength=pUserChat->wChatLength;
|
||
UserChat.dwTargetUserID=pUserChat->dwTargetUserID;
|
||
UserChat.dwSendUserID=pIServerUserItem->GetUserID();
|
||
UserChat.wChatLength=CountStringBuffer(UserChat.szChatString);
|
||
|
||
//发送数据
|
||
WORD wHeadSize=sizeof(UserChat)-sizeof(UserChat.szChatString);
|
||
WORD wSendSize=wHeadSize+UserChat.wChatLength*sizeof(UserChat.szChatString[0]);
|
||
|
||
//游戏用户
|
||
for (WORD i=0;i<m_wChairCount;i++)
|
||
{
|
||
//获取用户
|
||
IServerUserItem * pIServerUserItem=GetTableUserItem(i);
|
||
if ((pIServerUserItem==NULL)||(pIServerUserItem->IsClientReady()==false)) continue;
|
||
|
||
m_pIMainServiceFrame->SendData(pIServerUserItem,MDM_GF_FRAME,SUB_GF_USER_CHAT,&UserChat,wSendSize);
|
||
}
|
||
|
||
//旁观用户
|
||
WORD wEnumIndex=0;
|
||
IServerUserItem * pIServerUserItem=NULL;
|
||
|
||
//枚举用户
|
||
do
|
||
{
|
||
//获取用户
|
||
pIServerUserItem=EnumLookonUserItem(wEnumIndex++);
|
||
if (pIServerUserItem==NULL) break;
|
||
|
||
//发送数据
|
||
if (pIServerUserItem->IsClientReady()==true)
|
||
{
|
||
m_pIMainServiceFrame->SendData(pIServerUserItem,MDM_GF_FRAME,SUB_GF_USER_CHAT,&UserChat,wSendSize);
|
||
}
|
||
} while (true);
|
||
|
||
return true;
|
||
}
|
||
case SUB_GF_USER_EXPRESSION: //用户表情
|
||
{
|
||
//效验参数
|
||
ASSERT(wDataSize==sizeof(CMD_GF_C_UserExpression));
|
||
if (wDataSize!=sizeof(CMD_GF_C_UserExpression)) return false;
|
||
|
||
//变量定义
|
||
CMD_GF_C_UserExpression * pUserExpression=(CMD_GF_C_UserExpression *)pData;
|
||
|
||
//目标用户
|
||
if ((pUserExpression->dwTargetUserID!=0)&&(SearchUserItem(pUserExpression->dwTargetUserID)==NULL))
|
||
{
|
||
ASSERT(FALSE);
|
||
return true;
|
||
}
|
||
|
||
//状态判断
|
||
if ((CServerRule::IsForfendGameChat(m_pGameServiceOption->dwServerRule)==true)&&(pIServerUserItem->GetMasterOrder()==0L))
|
||
{
|
||
SendGameMessage(pIServerUserItem,TEXT("抱歉,当前游戏房间禁止游戏聊天!"),SMT_CHAT);
|
||
return true;
|
||
}
|
||
|
||
//权限判断
|
||
if (CUserRight::CanRoomChat(pIServerUserItem->GetUserRight())==false)
|
||
{
|
||
SendGameMessage(pIServerUserItem,TEXT("抱歉,您没有游戏聊天的权限,若需要帮助,请联系游戏客服咨询!"),SMT_EJECT|SMT_CHAT);
|
||
return true;
|
||
}
|
||
|
||
//构造消息
|
||
CMD_GF_S_UserExpression UserExpression;
|
||
ZeroMemory(&UserExpression,sizeof(UserExpression));
|
||
|
||
//构造数据
|
||
UserExpression.isExpression = pUserExpression->isExpression;
|
||
UserExpression.wItemIndex=pUserExpression->wItemIndex;
|
||
UserExpression.dwSendUserID=pIServerUserItem->GetUserID();
|
||
UserExpression.dwTargetUserID=pUserExpression->dwTargetUserID;
|
||
|
||
//游戏用户
|
||
for (WORD i=0;i<m_wChairCount;i++)
|
||
{
|
||
//获取用户
|
||
IServerUserItem * pIServerUserItem=GetTableUserItem(i);
|
||
if ((pIServerUserItem==NULL)||(pIServerUserItem->IsClientReady()==false)) continue;
|
||
|
||
//发送数据
|
||
m_pIMainServiceFrame->SendData(pIServerUserItem,MDM_GF_FRAME,SUB_GF_USER_EXPRESSION,&UserExpression,sizeof(UserExpression));
|
||
}
|
||
|
||
//旁观用户
|
||
WORD wEnumIndex=0;
|
||
IServerUserItem * pIServerUserItem=NULL;
|
||
|
||
//枚举用户
|
||
do
|
||
{
|
||
//获取用户
|
||
pIServerUserItem=EnumLookonUserItem(wEnumIndex++);
|
||
if (pIServerUserItem==NULL) break;
|
||
|
||
//发送数据
|
||
if (pIServerUserItem->IsClientReady()==true)
|
||
{
|
||
m_pIMainServiceFrame->SendData(pIServerUserItem,MDM_GF_FRAME,SUB_GF_USER_EXPRESSION,&UserExpression,sizeof(UserExpression));
|
||
}
|
||
} while (true);
|
||
|
||
return true;
|
||
}
|
||
case SUB_GR_TABLE_TALK: //游戏聊天
|
||
{
|
||
SendTableData(INVALID_CHAIR,SUB_GR_TABLE_TALK,pData,wDataSize,MDM_GF_FRAME);
|
||
return true;
|
||
}
|
||
case SUB_GF_LOOKON_CONFIG: //旁观配置
|
||
{
|
||
//效验参数
|
||
ASSERT(wDataSize==sizeof(CMD_GF_LookonConfig));
|
||
if (wDataSize<sizeof(CMD_GF_LookonConfig)) return false;
|
||
|
||
//变量定义
|
||
CMD_GF_LookonConfig * pLookonConfig=(CMD_GF_LookonConfig *)pData;
|
||
|
||
//目标用户
|
||
if ((pLookonConfig->dwUserID!=0)&&(SearchUserItem(pLookonConfig->dwUserID)==NULL))
|
||
{
|
||
ASSERT(FALSE);
|
||
return true;
|
||
}
|
||
|
||
//用户效验
|
||
ASSERT(pIServerUserItem->GetUserStatus()!=US_LOOKON);
|
||
if (pIServerUserItem->GetUserStatus()==US_LOOKON) return false;
|
||
|
||
//旁观处理
|
||
if (pLookonConfig->dwUserID!=0L)
|
||
{
|
||
for (INT_PTR i=0;i<m_LookonUserItemArray.GetCount();i++)
|
||
{
|
||
//获取用户
|
||
IServerUserItem * pILookonUserItem=m_LookonUserItemArray[i];
|
||
if (pILookonUserItem->GetUserID()!=pLookonConfig->dwUserID) continue;
|
||
if (pILookonUserItem->GetChairID()!=pIServerUserItem->GetChairID()) continue;
|
||
|
||
//构造消息
|
||
CMD_GF_LookonStatus LookonStatus;
|
||
LookonStatus.cbAllowLookon=pLookonConfig->cbAllowLookon;
|
||
|
||
//发送消息
|
||
ASSERT(m_pIMainServiceFrame!=NULL);
|
||
m_pIMainServiceFrame->SendData(pILookonUserItem,MDM_GF_FRAME,SUB_GF_LOOKON_STATUS,&LookonStatus,sizeof(LookonStatus));
|
||
|
||
break;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
//设置判断
|
||
bool bAllowLookon=(pLookonConfig->cbAllowLookon==TRUE)?true:false;
|
||
if (bAllowLookon==m_bAllowLookon[pIServerUserItem->GetChairID()]) return true;
|
||
|
||
//设置变量
|
||
m_bAllowLookon[pIServerUserItem->GetChairID()]=bAllowLookon;
|
||
|
||
//构造消息
|
||
CMD_GF_LookonStatus LookonStatus;
|
||
LookonStatus.cbAllowLookon=pLookonConfig->cbAllowLookon;
|
||
|
||
//发送消息
|
||
for (INT_PTR i=0;i<m_LookonUserItemArray.GetCount();i++)
|
||
{
|
||
//获取用户
|
||
IServerUserItem * pILookonUserItem=m_LookonUserItemArray[i];
|
||
if (pILookonUserItem->GetChairID()!=pIServerUserItem->GetChairID()) continue;
|
||
|
||
//发送消息
|
||
ASSERT(m_pIMainServiceFrame!=NULL);
|
||
m_pIMainServiceFrame->SendData(pILookonUserItem,MDM_GF_FRAME,SUB_GF_LOOKON_STATUS,&LookonStatus,sizeof(LookonStatus));
|
||
}
|
||
}
|
||
|
||
return true;
|
||
}
|
||
case SUB_GF_USER_LOCATION: //用户地理位置信息;
|
||
{
|
||
//效验参数;
|
||
ASSERT(wDataSize == sizeof(CMD_GF_C_UserLocation));
|
||
if (wDataSize < sizeof(CMD_GF_C_UserLocation)) return false;
|
||
|
||
//变量定义;
|
||
CMD_GF_C_UserLocation * pCUserLocation = (CMD_GF_C_UserLocation *)pData;
|
||
pCUserLocation->szAddress[LEN_DWELLING_PLACE - 1] = '\0';
|
||
|
||
//获取属性;
|
||
WORD wChairID = pIServerUserItem->GetChairID();
|
||
BYTE cbUserStatus = pIServerUserItem->GetUserStatus();
|
||
|
||
//效验状态;
|
||
ASSERT(GetTableUserItem(wChairID) == pIServerUserItem);
|
||
if (GetTableUserItem(wChairID) != pIServerUserItem) return false;
|
||
|
||
tagUserInfo* pTagUserInfo = pIServerUserItem->GetUserInfo();
|
||
if (NULL == pTagUserInfo) return false;
|
||
|
||
if ((pTagUserInfo->lLatitude != pCUserLocation->lLatitude) || (pTagUserInfo->lLongitude != pCUserLocation->lLongitude))
|
||
{
|
||
pTagUserInfo->lAccuracy = pCUserLocation->lAccuracy;
|
||
pTagUserInfo->lLatitude = pCUserLocation->lLatitude;
|
||
pTagUserInfo->lLongitude = pCUserLocation->lLongitude;
|
||
memcpy(pTagUserInfo->szAddress, pCUserLocation->szAddress, sizeof(pCUserLocation->szAddress));
|
||
|
||
// 同步地理位置信息;
|
||
CMD_GF_S_UserLocation newLocation = { 0 };
|
||
newLocation.dwTargetUserID = pIServerUserItem->GetUserID();
|
||
newLocation.lAccuracy = pCUserLocation->lAccuracy;
|
||
newLocation.lLatitude = pCUserLocation->lLatitude;
|
||
newLocation.lLongitude = pCUserLocation->lLongitude;
|
||
memcpy(newLocation.szAddress, pCUserLocation->szAddress, sizeof(pCUserLocation->szAddress));
|
||
SendTableData(INVALID_CHAIR, SUB_GR_USER_LOCATION, &newLocation, sizeof(CMD_GF_S_UserLocation), MDM_GR_USER);
|
||
//游戏用户;
|
||
//for (WORD i = 0; i < m_wChairCount; i++)
|
||
//{
|
||
// if (i != wChairID)
|
||
// {
|
||
// SendTableData(i, SUB_GR_USER_LOCATION, &newLocation, sizeof(CMD_GF_S_UserLocation), MDM_GR_USER);
|
||
// }
|
||
//}
|
||
}
|
||
|
||
return true;
|
||
}
|
||
case SUB_GF_PING_TIME:
|
||
{
|
||
//效验参数;
|
||
ASSERT(wDataSize == sizeof(CMD_GF_C_PingTime));
|
||
if (wDataSize < sizeof(CMD_GF_C_PingTime)) return false;
|
||
|
||
//变量定义;
|
||
CMD_GF_C_PingTime * pPingTime = (CMD_GF_C_PingTime *)pData;
|
||
|
||
//发送状态
|
||
CMD_GF_C_PingTime pingTimeResponse;
|
||
pingTimeResponse.dwPingCount = pPingTime->dwPingCount;
|
||
m_pIMainServiceFrame->SendData(pIServerUserItem, MDM_GF_FRAME, SUB_GF_PING_TIME, &pingTimeResponse, sizeof(pingTimeResponse));
|
||
|
||
return true;
|
||
}
|
||
}
|
||
|
||
return false;
|
||
}
|
||
|
||
//游戏局数
|
||
WORD CTableFrame::GetDrawCount()
|
||
{
|
||
return m_wDrawCount;
|
||
}
|
||
|
||
//获取空位
|
||
WORD CTableFrame::GetNullChairID()
|
||
{
|
||
//椅子搜索
|
||
for (WORD i=0;i<m_wChairCount;i++)
|
||
{
|
||
if (m_TableUserItemArray[i]==NULL)
|
||
{
|
||
return i;
|
||
}
|
||
}
|
||
|
||
return INVALID_CHAIR;
|
||
}
|
||
|
||
//随机空位
|
||
WORD CTableFrame::GetRandNullChairID()
|
||
{
|
||
//椅子搜索
|
||
WORD wIndex = rand()%m_wChairCount;
|
||
for (WORD i=wIndex;i<m_wChairCount+wIndex;i++)
|
||
{
|
||
if (m_TableUserItemArray[i%m_wChairCount]==NULL)
|
||
{
|
||
return i%m_wChairCount;
|
||
}
|
||
}
|
||
|
||
return INVALID_CHAIR;
|
||
}
|
||
|
||
//用户数目
|
||
WORD CTableFrame::GetSitUserCount()
|
||
{
|
||
//变量定义
|
||
WORD wUserCount=0;
|
||
|
||
//数目统计
|
||
for (WORD i=0;i<m_wChairCount;i++)
|
||
{
|
||
if (GetTableUserItem(i)!=NULL)
|
||
{
|
||
wUserCount++;
|
||
}
|
||
}
|
||
|
||
return wUserCount;
|
||
}
|
||
|
||
void CTableFrame::SetCellScore(LONG lCellScore)
|
||
{
|
||
m_lCellScore=lCellScore;
|
||
if (m_pITableFrameSink)
|
||
{
|
||
m_pITableFrameSink->SetGameBaseScore(lCellScore);
|
||
}
|
||
}
|
||
|
||
//旁观数目
|
||
WORD CTableFrame::GetLookonUserCount()
|
||
{
|
||
//获取数目
|
||
INT_PTR nLookonCount=m_LookonUserItemArray.GetCount();
|
||
|
||
return (WORD)(nLookonCount);
|
||
}
|
||
|
||
//断线数目
|
||
WORD CTableFrame::GetOffLineUserCount()
|
||
{
|
||
//变量定义
|
||
WORD wOffLineCount=0;
|
||
|
||
//断线人数
|
||
for (WORD i=0;i<m_wChairCount;i++)
|
||
{
|
||
if (m_dwOffLineTime[i]!=0L)
|
||
{
|
||
wOffLineCount++;
|
||
}
|
||
}
|
||
|
||
return wOffLineCount;
|
||
}
|
||
|
||
//桌子状况
|
||
WORD CTableFrame::GetTableUserInfo(tagTableUserInfo & TableUserInfo)
|
||
{
|
||
//设置变量
|
||
ZeroMemory(&TableUserInfo,sizeof(TableUserInfo));
|
||
|
||
//用户分析
|
||
for (WORD i=0;i<m_pGameServiceAttrib->wChairCount;i++)
|
||
{
|
||
//获取用户
|
||
IServerUserItem * pIServerUserItem=GetTableUserItem(i);
|
||
if (pIServerUserItem==NULL) continue;
|
||
|
||
//用户类型
|
||
if (pIServerUserItem->IsAndroidUser()==false)
|
||
{
|
||
TableUserInfo.wTableUserCount++;
|
||
}
|
||
else
|
||
{
|
||
TableUserInfo.wTableAndroidCount++;
|
||
}
|
||
|
||
//准备判断
|
||
if (pIServerUserItem->GetUserStatus()==US_READY)
|
||
{
|
||
TableUserInfo.wTableReadyCount++;
|
||
}
|
||
}
|
||
|
||
//最少数目
|
||
switch (m_cbStartMode)
|
||
{
|
||
case START_MODE_ALL_READY: //所有准备
|
||
{
|
||
TableUserInfo.wMinUserCount=2;
|
||
break;
|
||
}
|
||
case START_MODE_PAIR_READY: //配对开始
|
||
{
|
||
TableUserInfo.wMinUserCount=2;
|
||
break;
|
||
}
|
||
case START_MODE_TIME_CONTROL: //时间控制
|
||
{
|
||
TableUserInfo.wMinUserCount=1;
|
||
break;
|
||
}
|
||
default: //默认模式
|
||
{
|
||
TableUserInfo.wMinUserCount=m_pGameServiceAttrib->wChairCount;
|
||
break;
|
||
}
|
||
}
|
||
|
||
return TableUserInfo.wTableAndroidCount+TableUserInfo.wTableUserCount;
|
||
}
|
||
|
||
//配置桌子
|
||
bool CTableFrame::InitializationFrame(WORD wTableID, tagTableFrameParameter & TableFrameParameter)
|
||
{
|
||
//设置变量
|
||
m_wTableID=wTableID;
|
||
m_wChairCount=TableFrameParameter.pGameServiceAttrib->wChairCount;
|
||
|
||
//配置参数
|
||
m_pGameParameter=TableFrameParameter.pGameParameter;
|
||
m_pGameServiceAttrib=TableFrameParameter.pGameServiceAttrib;
|
||
m_pGameServiceOption=TableFrameParameter.pGameServiceOption;
|
||
m_pGameMatchOption = TableFrameParameter.pGameMatchOption;
|
||
|
||
|
||
//组件接口
|
||
m_pITimerEngine=TableFrameParameter.pITimerEngine;
|
||
m_pIMainServiceFrame=TableFrameParameter.pIMainServiceFrame;
|
||
m_pIAndroidUserManager=TableFrameParameter.pIAndroidUserManager;
|
||
m_pIKernelDataBaseEngine=TableFrameParameter.pIKernelDataBaseEngine;
|
||
m_pIRecordDataBaseEngine=TableFrameParameter.pIRecordDataBaseEngine;
|
||
|
||
//创建桌子
|
||
IGameServiceManager * pIGameServiceManager=TableFrameParameter.pIGameServiceManager;
|
||
m_pITableFrameSink=(ITableFrameSink *)pIGameServiceManager->CreateTableFrameSink(IID_ITableFrameSink,VER_ITableFrameSink);
|
||
|
||
//错误判断
|
||
if (m_pITableFrameSink==NULL)
|
||
{
|
||
ASSERT(FALSE);
|
||
return false;
|
||
}
|
||
|
||
//设置桌子
|
||
IUnknownEx * pITableFrame=QUERY_ME_INTERFACE(IUnknownEx);
|
||
if (m_pITableFrameSink->Initialization(pITableFrame)==false) return false;
|
||
|
||
//设置变量
|
||
m_lCellScore=m_pGameServiceOption->lCellScore;
|
||
|
||
//扩展接口
|
||
m_pITableUserAction=QUERY_OBJECT_PTR_INTERFACE(m_pITableFrameSink,ITableUserAction);
|
||
m_pITableUserRequest=QUERY_OBJECT_PTR_INTERFACE(m_pITableFrameSink,ITableUserRequest);
|
||
|
||
return true;
|
||
}
|
||
|
||
//起立动作
|
||
bool CTableFrame::PerformStandUpAction(IServerUserItem * pIServerUserItem)
|
||
{
|
||
WORD wChairID=pIServerUserItem->GetChairID();
|
||
//私人场类型
|
||
if(m_pGameServiceOption->wServerType==GAME_GENRE_EDUCATE)
|
||
{
|
||
//掉线通知
|
||
if(m_pIPrivateTableAction!=NULL && m_pIPrivateTableAction->OnActionUserOffLine(wChairID,pIServerUserItem))
|
||
{
|
||
return true;
|
||
}
|
||
}
|
||
return PerformStandUpActionEx(pIServerUserItem);
|
||
}
|
||
//起立动作
|
||
bool CTableFrame::PerformStandUpActionEx(IServerUserItem * pIServerUserItem)
|
||
{
|
||
//效验参数
|
||
ASSERT(pIServerUserItem!=NULL);
|
||
ASSERT(pIServerUserItem->GetTableID()==m_wTableID);
|
||
ASSERT(pIServerUserItem->GetChairID()<=m_wChairCount);
|
||
|
||
//用户属性
|
||
WORD wChairID=pIServerUserItem->GetChairID();
|
||
BYTE cbUserStatus=pIServerUserItem->GetUserStatus();
|
||
IServerUserItem * pITableUserItem=GetTableUserItem(wChairID);
|
||
|
||
//游戏用户
|
||
if ((m_bGameStarted==true)&&((cbUserStatus==US_PLAYING)||(cbUserStatus==US_OFFLINE)))
|
||
{
|
||
//比赛类型
|
||
if(m_pGameServiceOption->wServerType==GAME_GENRE_MATCH)
|
||
{
|
||
//掉线通知
|
||
if(m_pITableUserAction!=NULL) m_pITableUserAction->OnActionUserOffLine(wChairID,pIServerUserItem);
|
||
|
||
return true;
|
||
}
|
||
|
||
if (m_pGameServiceOption->wServerType == GAME_GENRE_EDUCATE)
|
||
{
|
||
m_pITableFrameSink->OnEventGameConclude(wChairID, pIServerUserItem, GER_DISMISS);
|
||
}
|
||
else if (m_pGameServiceOption->wServerType == GAME_GENRE_GOLD || m_pGameServiceOption->wServerType == GAME_GENRE_SCORE)
|
||
{
|
||
BYTE cbConcludeReason = (cbUserStatus == US_OFFLINE) ? GER_NETWORK_ERROR : GER_USER_LEAVE;
|
||
m_pITableFrameSink->OnEventGameConclude(wChairID, pIServerUserItem, cbConcludeReason);
|
||
}
|
||
|
||
//离开判断
|
||
if (m_TableUserItemArray[wChairID]!=pIServerUserItem) return true;
|
||
}
|
||
|
||
//设置变量
|
||
if (pIServerUserItem==pITableUserItem)
|
||
{
|
||
//解锁游戏币
|
||
if (m_lFrozenedScore[wChairID]!=0L)
|
||
{
|
||
pIServerUserItem->UnFrozenedUserScore(m_lFrozenedScore[wChairID]);
|
||
m_lFrozenedScore[wChairID]=0L;
|
||
}
|
||
|
||
//事件通知
|
||
if (m_pITableUserAction!=NULL)
|
||
{
|
||
m_pITableUserAction->OnActionUserStandUp(wChairID,pIServerUserItem,false);
|
||
}
|
||
|
||
//事件通知
|
||
if(m_pIMatchTableAction!=NULL) m_pIMatchTableAction->OnActionUserStandUp(wChairID,pIServerUserItem,false);
|
||
//事件通知
|
||
if(m_pIPrivateTableAction!=NULL) m_pIPrivateTableAction->OnActionUserStandUp(wChairID,pIServerUserItem,false);
|
||
|
||
//设置变量
|
||
m_TableUserItemArray[wChairID]=NULL;
|
||
|
||
//用户状态
|
||
pIServerUserItem->SetClientReady(false);
|
||
pIServerUserItem->SetUserStatus((cbUserStatus==US_OFFLINE)?US_NULL:US_FREE,INVALID_TABLE,INVALID_CHAIR);
|
||
|
||
//变量定义
|
||
bool bTableLocked=IsTableLocked();
|
||
bool bTableStarted=IsTableStarted();
|
||
WORD wTableUserCount=GetSitUserCount();
|
||
|
||
//设置变量
|
||
m_wUserCount=wTableUserCount;
|
||
|
||
//桌子信息
|
||
if (wTableUserCount==0)
|
||
{
|
||
m_dwTableOwnerID=0L;
|
||
m_szEnterPassword[0]=0;
|
||
}
|
||
|
||
//踢走旁观
|
||
if (wTableUserCount==0)
|
||
{
|
||
for (INT_PTR i=0;i<m_LookonUserItemArray.GetCount();i++)
|
||
{
|
||
SendGameMessage(m_LookonUserItemArray[i],TEXT("此游戏桌的所有玩家已经离开了!"),SMT_CLOSE_GAME|SMT_EJECT);
|
||
}
|
||
}
|
||
|
||
//结束桌子
|
||
ConcludeTable();
|
||
|
||
//开始判断
|
||
if (EfficacyStartGame(wChairID) == true)
|
||
{
|
||
//StartGame();
|
||
// 自由人数场,通知客户端开始准备;
|
||
if (IsAutoUserCountRule(this))
|
||
{
|
||
tagAutoUserStatus userStatus;
|
||
userStatus.bStartGame = true;
|
||
m_pIPrivateTableAction->OnActionUserOnStart(wChairID, pIServerUserItem, &userStatus, sizeof(userStatus));
|
||
}
|
||
else
|
||
{
|
||
StartGame();
|
||
}
|
||
}
|
||
|
||
////开始判断
|
||
//if (EfficacyStartGame(INVALID_CHAIR)==true)
|
||
//{
|
||
// StartGame();
|
||
//}
|
||
|
||
//发送状态
|
||
if ((bTableLocked!=IsTableLocked())||(bTableStarted!=IsTableStarted()))
|
||
{
|
||
SendTableStatus();
|
||
}
|
||
|
||
//防作弊分组判断
|
||
if (CServerRule::IsAllowAvertCheatMode(m_pGameServiceOption->dwServerRule) && (m_pGameServiceAttrib->wChairCount < MAX_CHAIR))
|
||
{
|
||
//防作弊分组判断
|
||
if (IsTableStarted() == false && CheckDistribute())
|
||
{
|
||
for (int i = 0; i < m_wChairCount; i++)
|
||
{
|
||
if (m_TableUserItemArray[i] != NULL && m_TableUserItemArray[i]->GetUserStatus() == US_READY)
|
||
{
|
||
//发送消息
|
||
LPCTSTR pszMessage = TEXT("由玩家离开,系统重新分配桌子,请稍后!");
|
||
SendGameMessage(m_TableUserItemArray[i], pszMessage, SMT_CHAT);
|
||
|
||
//发送消息
|
||
m_pIMainServiceFrame->InsertDistribute(m_TableUserItemArray[i]);
|
||
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
return true;
|
||
}
|
||
else
|
||
{
|
||
//起立处理
|
||
for (INT_PTR i=0;i<m_LookonUserItemArray.GetCount();i++)
|
||
{
|
||
if (pIServerUserItem==m_LookonUserItemArray[i])
|
||
{
|
||
//删除子项
|
||
m_LookonUserItemArray.RemoveAt(i);
|
||
|
||
//事件通知
|
||
if (m_pITableUserAction!=NULL)
|
||
{
|
||
m_pITableUserAction->OnActionUserStandUp(wChairID,pIServerUserItem,true);
|
||
}
|
||
|
||
//事件通知
|
||
if(m_pIMatchTableAction!=NULL) m_pIMatchTableAction->OnActionUserStandUp(wChairID,pIServerUserItem,true);
|
||
|
||
//事件通知
|
||
if(m_pIPrivateTableAction!=NULL) m_pIPrivateTableAction->OnActionUserStandUp(wChairID,pIServerUserItem,true);
|
||
|
||
//用户状态
|
||
pIServerUserItem->SetClientReady(false);
|
||
pIServerUserItem->SetUserStatus(US_FREE,INVALID_TABLE,INVALID_CHAIR);
|
||
|
||
return true;
|
||
}
|
||
}
|
||
|
||
//错误断言
|
||
ASSERT(FALSE);
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
//旁观动作
|
||
bool CTableFrame::PerformLookonAction(WORD wChairID, IServerUserItem * pIServerUserItem)
|
||
{
|
||
//效验参数
|
||
ASSERT((pIServerUserItem!=NULL)&&(wChairID<m_wChairCount));
|
||
ASSERT((pIServerUserItem->GetTableID()==INVALID_TABLE)&&(pIServerUserItem->GetChairID()==INVALID_CHAIR));
|
||
|
||
//变量定义
|
||
tagUserInfo * pUserInfo=pIServerUserItem->GetUserInfo();
|
||
tagUserRule * pUserRule=pIServerUserItem->GetUserRule();
|
||
IServerUserItem * pITableUserItem=GetTableUserItem(wChairID);
|
||
|
||
//游戏状态
|
||
if ((m_bGameStarted==false)&&(pIServerUserItem->GetMasterOrder()==0L))
|
||
{
|
||
SendRequestFailure(pIServerUserItem,TEXT("游戏还没有开始,不能旁观此游戏桌!"),REQUEST_FAILURE_NORMAL);
|
||
return false;
|
||
}
|
||
|
||
//模拟处理
|
||
if (m_pGameServiceAttrib->wChairCount < MAX_CHAIR && pIServerUserItem->IsAndroidUser()==false)
|
||
{
|
||
//定义变量
|
||
CAttemperEngineSink * pAttemperEngineSink=(CAttemperEngineSink *)m_pIMainServiceFrame;
|
||
|
||
//查找机器
|
||
for (WORD i=0; i<m_pGameServiceAttrib->wChairCount; i++)
|
||
{
|
||
//获取用户
|
||
IServerUserItem *pIUserItem=m_TableUserItemArray[i];
|
||
if(pIUserItem==NULL) continue;
|
||
if(pIUserItem->IsAndroidUser()==false)break;
|
||
|
||
//获取参数
|
||
tagBindParameter * pBindParameter=pAttemperEngineSink->GetBindParameter(pIUserItem->GetBindIndex());
|
||
IAndroidUserItem * pIAndroidUserItem=m_pIAndroidUserManager->SearchAndroidUserItem(pIUserItem->GetUserID(),pBindParameter->dwSocketID);
|
||
tagAndroidParameter * pAndroidParameter=pIAndroidUserItem->GetAndroidParameter();
|
||
|
||
//模拟判断
|
||
if ((pAndroidParameter->dwServiceMode&ANDROID_SIMULATE) != 0
|
||
&& (pAndroidParameter->dwServiceMode&ANDROID_PASSIVITY) == 0
|
||
&& (pAndroidParameter->dwServiceMode&ANDROID_INITIATIVE) == 0)
|
||
{
|
||
SendRequestFailure(pIServerUserItem,TEXT("抱歉,当前游戏桌子禁止用户旁观!"),REQUEST_FAILURE_NORMAL);
|
||
return false;
|
||
}
|
||
|
||
break;
|
||
}
|
||
}
|
||
|
||
|
||
//旁观判断
|
||
if (CServerRule::IsAllowAndroidSimulate(m_pGameServiceOption->dwServerRule)==true
|
||
&& (CServerRule::IsAllowAndroidAttend(m_pGameServiceOption->dwServerRule)==false))
|
||
{
|
||
if ((pITableUserItem!=NULL)&&(pITableUserItem->IsAndroidUser()==true))
|
||
{
|
||
SendRequestFailure(pIServerUserItem,TEXT("抱歉,当前游戏房间禁止用户旁观!"),REQUEST_FAILURE_NORMAL);
|
||
return false;
|
||
}
|
||
}
|
||
|
||
//状态判断
|
||
if ((CServerRule::IsForfendGameLookon(m_pGameServiceOption->dwServerRule)==true)&&(pIServerUserItem->GetMasterOrder()==0))
|
||
{
|
||
SendRequestFailure(pIServerUserItem,TEXT("抱歉,当前游戏房间禁止用户旁观!"),REQUEST_FAILURE_NORMAL);
|
||
return false;
|
||
}
|
||
|
||
//椅子判断
|
||
if ((pITableUserItem==NULL)&&(pIServerUserItem->GetMasterOrder()==0L))
|
||
{
|
||
SendRequestFailure(pIServerUserItem,TEXT("您所请求的位置没有游戏玩家,无法旁观此游戏桌"),REQUEST_FAILURE_NORMAL);
|
||
return false;
|
||
}
|
||
|
||
//密码效验
|
||
if ((IsTableLocked()==true)&&(pIServerUserItem->GetMasterOrder()==0L)&&(lstrcmp(pUserRule->szPassword,m_szEnterPassword)!=0))
|
||
{
|
||
SendRequestFailure(pIServerUserItem,TEXT("游戏桌进入密码不正确,不能旁观游戏!"),REQUEST_FAILURE_PASSWORD);
|
||
return false;
|
||
}
|
||
|
||
//扩展效验
|
||
if (m_pITableUserRequest!=NULL)
|
||
{
|
||
//变量定义
|
||
tagRequestResult RequestResult;
|
||
ZeroMemory(&RequestResult,sizeof(RequestResult));
|
||
|
||
//坐下效验
|
||
if (m_pITableUserRequest->OnUserRequestLookon(wChairID,pIServerUserItem,RequestResult)==false)
|
||
{
|
||
//发送信息
|
||
SendRequestFailure(pIServerUserItem,RequestResult.szFailureReason,RequestResult.cbFailureCode);
|
||
|
||
return false;
|
||
}
|
||
}
|
||
|
||
//设置用户
|
||
m_LookonUserItemArray.Add(pIServerUserItem);
|
||
|
||
//用户状态
|
||
pIServerUserItem->SetClientReady(false);
|
||
pIServerUserItem->SetUserStatus(US_LOOKON,m_wTableID,wChairID);
|
||
|
||
//事件通知
|
||
if (m_pITableUserAction!=NULL)
|
||
{
|
||
m_pITableUserAction->OnActionUserSitDown(wChairID,pIServerUserItem,true);
|
||
}
|
||
|
||
//事件通知
|
||
if(m_pIMatchTableAction!=NULL) m_pIMatchTableAction->OnActionUserSitDown(wChairID,pIServerUserItem,true);
|
||
//事件通知
|
||
if(m_pIPrivateTableAction!=NULL) m_pIPrivateTableAction->OnActionUserSitDown(wChairID,pIServerUserItem,true);
|
||
return true;
|
||
}
|
||
|
||
//坐下动作
|
||
bool CTableFrame::PerformSitDownAction(WORD wChairID, IServerUserItem * pIServerUserItem, LPCTSTR lpszPassword)
|
||
{
|
||
//效验参数
|
||
ASSERT((pIServerUserItem!=NULL)&&(wChairID<m_wChairCount));
|
||
ASSERT((pIServerUserItem->GetTableID()==INVALID_TABLE)&&(pIServerUserItem->GetChairID()==INVALID_CHAIR));
|
||
|
||
//变量定义
|
||
tagUserInfo * pUserInfo=pIServerUserItem->GetUserInfo();
|
||
tagUserRule * pUserRule=pIServerUserItem->GetUserRule();
|
||
IServerUserItem * pITableUserItem=GetTableUserItem(wChairID);
|
||
|
||
//状态判断
|
||
if ((CServerRule::IsForfendGameEnter(m_pGameServiceOption->dwServerRule)==true)&&(pIServerUserItem->GetMasterOrder()==0))
|
||
{
|
||
SendRequestFailure(pIServerUserItem,TEXT("抱歉,当前游戏桌子禁止用户进入!"),REQUEST_FAILURE_NORMAL);
|
||
return false;
|
||
}
|
||
|
||
//椅子调整
|
||
if (m_pIPrivateTableAction != NULL)
|
||
{
|
||
|
||
WORD wRealChairCount = GetRealChairCount();
|
||
if (wChairID >= wRealChairCount)
|
||
{
|
||
SendRequestFailure(pIServerUserItem, TEXT("由于此游戏桌暂时没有可以让您加入的位置了,请选择另外的游戏桌!"), 0);
|
||
return false;
|
||
}
|
||
}
|
||
|
||
//模拟处理
|
||
if (m_pGameServiceAttrib->wChairCount < MAX_CHAIR && pIServerUserItem->IsAndroidUser()==false)
|
||
{
|
||
//定义变量
|
||
CAttemperEngineSink * pAttemperEngineSink=(CAttemperEngineSink *)m_pIMainServiceFrame;
|
||
|
||
//查找机器
|
||
for (WORD i=0; i<m_pGameServiceAttrib->wChairCount; i++)
|
||
{
|
||
//获取用户
|
||
IServerUserItem *pIUserItem=m_TableUserItemArray[i];
|
||
if(pIUserItem==NULL) continue;
|
||
if(pIUserItem->IsAndroidUser()==false)break;
|
||
|
||
//获取参数
|
||
tagBindParameter * pBindParameter=pAttemperEngineSink->GetBindParameter(pIUserItem->GetBindIndex());
|
||
IAndroidUserItem * pIAndroidUserItem=m_pIAndroidUserManager->SearchAndroidUserItem(pIUserItem->GetUserID(),pBindParameter->dwSocketID);
|
||
tagAndroidParameter * pAndroidParameter=pIAndroidUserItem->GetAndroidParameter();
|
||
|
||
//模拟判断
|
||
if ((pAndroidParameter->dwServiceMode&ANDROID_SIMULATE) != 0
|
||
&& (pAndroidParameter->dwServiceMode&ANDROID_PASSIVITY) == 0
|
||
&& (pAndroidParameter->dwServiceMode&ANDROID_INITIATIVE) == 0)
|
||
{
|
||
SendRequestFailure(pIServerUserItem,TEXT("抱歉,当前游戏桌子禁止用户进入!"),REQUEST_FAILURE_NORMAL);
|
||
return false;
|
||
}
|
||
|
||
break;
|
||
}
|
||
}
|
||
|
||
//动态加入
|
||
bool bDynamicJoin=true;
|
||
if (m_pGameServiceAttrib->cbDynamicJoin==FALSE) bDynamicJoin=false;
|
||
if (CServerRule::IsAllowDynamicJoin(m_pGameServiceOption->dwServerRule)==false) bDynamicJoin=false;
|
||
|
||
//游戏状态
|
||
if ((m_bGameStarted==true)&&(bDynamicJoin==false))
|
||
{
|
||
SendRequestFailure(pIServerUserItem, TEXT("游戏已经开始了,现在不能进入游戏桌!"), SMT_EJECT);
|
||
return false;
|
||
}
|
||
|
||
//椅子判断
|
||
if (pITableUserItem!=NULL)
|
||
{
|
||
for (int i = 0;i<m_wChairCount;i++)
|
||
{
|
||
if (!GetTableUserItem(i))
|
||
{
|
||
wChairID = i;
|
||
pITableUserItem = NULL;
|
||
break;
|
||
}
|
||
}
|
||
if (pITableUserItem)
|
||
{
|
||
//构造信息
|
||
TCHAR szDescribe[128]=TEXT("");
|
||
_sntprintf_s(szDescribe,CountArray(szDescribe),TEXT("椅子已经被 [ %s ] 捷足先登了,下次动作要快点了!"),pITableUserItem->GetNickName());
|
||
|
||
//发送信息
|
||
SendRequestFailure(pIServerUserItem,szDescribe,REQUEST_FAILURE_NORMAL);
|
||
|
||
return false;
|
||
}
|
||
}
|
||
|
||
//积分变量
|
||
SCORE lUserScore=pIServerUserItem->GetUserScore();
|
||
SCORE lMinTableScore=m_pGameServiceOption->lMinTableScore;
|
||
SCORE lLessEnterScore=m_pITableFrameSink->QueryLessEnterScore(wChairID,pIServerUserItem);
|
||
|
||
//密码效验
|
||
if(((IsTableLocked()==true)&&(pIServerUserItem->GetMasterOrder()==0L))
|
||
&&((lpszPassword==NULL)||(lstrcmp(lpszPassword,m_szEnterPassword)!=0)))
|
||
{
|
||
SendRequestFailure(pIServerUserItem, TEXT("游戏桌进入密码不正确,不能加入游戏!"), SMT_EJECT);
|
||
return false;
|
||
}
|
||
|
||
//积分限制
|
||
if (((lMinTableScore!=0L)&&(lUserScore<lMinTableScore))||((lLessEnterScore!=0L)&&(lUserScore<lLessEnterScore)))
|
||
{
|
||
//构造信息
|
||
TCHAR szDescribe[128]=TEXT("");
|
||
if(m_pGameServiceOption->wServerType==GAME_GENRE_GOLD)
|
||
_sntprintf_s(szDescribe,CountArray(szDescribe),TEXT("加入游戏至少需要 ") SCORE_STRING TEXT(" 的游戏币,您的游戏币不够,不能加入!"),__max(lMinTableScore,lLessEnterScore));
|
||
else if(m_pGameServiceOption->wServerType==GAME_GENRE_MATCH)
|
||
_sntprintf_s(szDescribe,CountArray(szDescribe),TEXT("加入游戏至少需要 ") SCORE_STRING TEXT(" 的比赛币,您的比赛币不够,不能加入!"),__max(lMinTableScore,lLessEnterScore));
|
||
else
|
||
_sntprintf_s(szDescribe,CountArray(szDescribe),TEXT("加入游戏至少需要 ") SCORE_STRING TEXT(" 的游戏积分,您的积分不够,不能加入!"),__max(lMinTableScore,lLessEnterScore));
|
||
|
||
//发送信息
|
||
SendRequestFailure(pIServerUserItem, szDescribe, SMT_EJECT);
|
||
|
||
return false;
|
||
}
|
||
|
||
//事件通知
|
||
if (m_pIPrivateTableAction != NULL)
|
||
{
|
||
// 房卡交验
|
||
SCORE lUserInsure = pIServerUserItem->GetUserInsure();
|
||
|
||
if (!m_pIPrivateTableAction->OnActionUserFangKaCheck(wChairID, pIServerUserItem, lUserInsure))
|
||
{
|
||
//构造信息
|
||
TCHAR szDescribe[128] = TEXT("");
|
||
_sntprintf_s(szDescribe, CountArray(szDescribe), TEXT("本房间为AA制房间,您的房卡数量不足,无法加入游戏! "));
|
||
|
||
//发送信息
|
||
SendRoomMessage(pIServerUserItem, szDescribe, SMT_EJECT | SMT_CHAT | SMT_CLOSE_LINK);
|
||
|
||
return false;
|
||
}
|
||
}
|
||
|
||
//规则效验
|
||
if (EfficacyIPAddress(pIServerUserItem)==false) return false;
|
||
if (EfficacyScoreRule(pIServerUserItem)==false) return false;
|
||
|
||
//扩展效验
|
||
if (m_pITableUserRequest!=NULL)
|
||
{
|
||
//变量定义
|
||
tagRequestResult RequestResult;
|
||
ZeroMemory(&RequestResult,sizeof(RequestResult));
|
||
|
||
//坐下效验
|
||
if (m_pITableUserRequest->OnUserRequestSitDown(wChairID,pIServerUserItem,RequestResult)==false)
|
||
{
|
||
//发送信息
|
||
SendRequestFailure(pIServerUserItem,RequestResult.szFailureReason,RequestResult.cbFailureCode);
|
||
|
||
return false;
|
||
}
|
||
}
|
||
//设置变量
|
||
m_TableUserItemArray[wChairID]=pIServerUserItem;
|
||
m_wDrawCount = 0; // 玩家坐下重置;
|
||
|
||
//用户状态
|
||
if ((IsGameStarted()==false)||(m_cbStartMode!=START_MODE_TIME_CONTROL))
|
||
{
|
||
if (CServerRule::IsAllowAvertCheatMode(m_pGameServiceOption->dwServerRule)==false && (m_pGameServiceOption->wServerType&GAME_GENRE_MATCH)==0)
|
||
{
|
||
pIServerUserItem->SetClientReady(false); //QY 2016 05 10 如果已经在游戏中再次调用会永远无法开始游戏
|
||
pIServerUserItem->SetUserStatus(US_SIT,m_wTableID,wChairID);
|
||
}
|
||
else
|
||
{
|
||
pIServerUserItem->SetClientReady(false);
|
||
pIServerUserItem->SetUserStatus(US_READY,m_wTableID,wChairID);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
//设置变量
|
||
m_wOffLineCount[wChairID]=0L;
|
||
m_dwOffLineTime[wChairID]=0L;
|
||
|
||
//锁定游戏币
|
||
if (m_pGameServiceOption->lServiceScore>0L)
|
||
{
|
||
m_lFrozenedScore[wChairID]=m_pGameServiceOption->lServiceScore;
|
||
pIServerUserItem->FrozenedUserScore(m_pGameServiceOption->lServiceScore);
|
||
}
|
||
|
||
//设置状态
|
||
pIServerUserItem->SetClientReady(false);
|
||
pIServerUserItem->SetUserStatus(US_PLAYING,m_wTableID,wChairID);
|
||
}
|
||
|
||
m_wUserCount=GetSitUserCount();
|
||
|
||
//桌子信息
|
||
if (GetSitUserCount()==1)
|
||
{
|
||
//状态变量
|
||
bool bTableLocked=IsTableLocked();
|
||
|
||
//设置变量
|
||
m_dwTableOwnerID=pIServerUserItem->GetUserID();
|
||
lstrcpyn(m_szEnterPassword,pUserRule->szPassword,CountArray(m_szEnterPassword));
|
||
|
||
//发送状态
|
||
if (bTableLocked!=IsTableLocked()) SendTableStatus();
|
||
}
|
||
|
||
//事件通知
|
||
if (m_pITableUserAction!=NULL)
|
||
{
|
||
m_pITableUserAction->OnActionUserSitDown(wChairID,pIServerUserItem,false);
|
||
}
|
||
|
||
//事件通知
|
||
if(m_pIMatchTableAction!=NULL) m_pIMatchTableAction->OnActionUserSitDown(wChairID,pIServerUserItem,false);
|
||
|
||
//事件通知
|
||
if(m_pIPrivateTableAction!=NULL) m_pIPrivateTableAction->OnActionUserSitDown(wChairID,pIServerUserItem,false);
|
||
|
||
return true;
|
||
}
|
||
|
||
//桌子状态
|
||
bool CTableFrame::SendTableStatus()
|
||
{
|
||
//变量定义
|
||
CMD_GR_TableStatus TableStatus;
|
||
ZeroMemory(&TableStatus,sizeof(TableStatus));
|
||
|
||
//构造数据
|
||
TableStatus.wTableID=m_wTableID;
|
||
TableStatus.TableStatus.cbTableLock=IsTableLocked()?TRUE:FALSE;
|
||
TableStatus.TableStatus.cbPlayStatus=IsTableStarted()?TRUE:FALSE;
|
||
|
||
//电脑数据
|
||
m_pIMainServiceFrame->SendData(BG_COMPUTER,MDM_GR_STATUS,SUB_GR_TABLE_STATUS,&TableStatus,sizeof(TableStatus));
|
||
|
||
//手机数据
|
||
|
||
return true;
|
||
}
|
||
|
||
//请求失败
|
||
bool CTableFrame::SendRequestFailure(IServerUserItem * pIServerUserItem, LPCTSTR pszDescribe, LONG lErrorCode)
|
||
{
|
||
//变量定义
|
||
CMD_GR_RequestFailure RequestFailure;
|
||
ZeroMemory(&RequestFailure,sizeof(RequestFailure));
|
||
|
||
//构造数据
|
||
RequestFailure.lErrorCode=lErrorCode;
|
||
lstrcpyn(RequestFailure.szDescribeString,pszDescribe,CountArray(RequestFailure.szDescribeString));
|
||
|
||
//发送数据
|
||
WORD wDataSize=CountStringBuffer(RequestFailure.szDescribeString);
|
||
WORD wHeadSize=sizeof(RequestFailure)-sizeof(RequestFailure.szDescribeString);
|
||
m_pIMainServiceFrame->SendData(pIServerUserItem,MDM_GR_USER,SUB_GR_REQUEST_FAILURE,&RequestFailure,wHeadSize+wDataSize);
|
||
|
||
return true;
|
||
}
|
||
|
||
//开始效验
|
||
bool CTableFrame::EfficacyStartGame(WORD wReadyChairID)
|
||
{
|
||
//状态判断
|
||
if (m_bGameStarted==true) return false;
|
||
|
||
//模式过滤
|
||
if (m_cbStartMode==START_MODE_TIME_CONTROL) return false;
|
||
if (m_cbStartMode==START_MODE_MASTER_CONTROL) return false;
|
||
|
||
//准备人数
|
||
WORD wReadyUserCount=0;
|
||
for (WORD i=0;i<m_wChairCount;i++)
|
||
{
|
||
//获取用户
|
||
IServerUserItem * pITableUserItem=GetTableUserItem(i);
|
||
if (pITableUserItem==NULL) continue;
|
||
|
||
//用户统计
|
||
if (pITableUserItem!=NULL)
|
||
{
|
||
//状态判断(离线前的状态如果是准备状态)
|
||
if (pITableUserItem->IsClientReady() == false) return false;
|
||
if ((wReadyChairID != i) && (pITableUserItem->GetUserStatus() != US_READY)) return false;
|
||
|
||
//用户计数
|
||
wReadyUserCount++;
|
||
}
|
||
}
|
||
|
||
// 自由人数场;
|
||
if (IsAutoUserCountRule(this, true))
|
||
{
|
||
//数目判断
|
||
if (wReadyUserCount >= 2L) return true;
|
||
return false;
|
||
}
|
||
|
||
//开始处理
|
||
switch (m_cbStartMode)
|
||
{
|
||
case START_MODE_ALL_READY: //所有准备
|
||
{
|
||
//数目判断
|
||
if (wReadyUserCount>=2L) return true;
|
||
|
||
return false;
|
||
}
|
||
case START_MODE_FULL_READY: //满人开始
|
||
{
|
||
WORD wRealChairCount = GetRealChairCount();
|
||
|
||
//人数判断
|
||
if (wReadyUserCount == wRealChairCount) return true;
|
||
|
||
return false;
|
||
}
|
||
case START_MODE_PAIR_READY: //配对开始
|
||
{
|
||
//数目判断
|
||
if (wReadyUserCount==m_wChairCount) return true;
|
||
if ((wReadyUserCount<2L)||(wReadyUserCount%2)!=0) return false;
|
||
|
||
//位置判断
|
||
for (WORD i=0;i<m_wChairCount/2;i++)
|
||
{
|
||
//获取用户
|
||
IServerUserItem * pICurrentUserItem=GetTableUserItem(i);
|
||
IServerUserItem * pITowardsUserItem=GetTableUserItem(i+m_wChairCount/2);
|
||
|
||
//位置过滤
|
||
if ((pICurrentUserItem==NULL)&&(pITowardsUserItem!=NULL)) return false;
|
||
if ((pICurrentUserItem!=NULL)&&(pITowardsUserItem==NULL)) return false;
|
||
}
|
||
|
||
return true;
|
||
}
|
||
default:
|
||
{
|
||
ASSERT(FALSE);
|
||
return false;
|
||
}
|
||
}
|
||
|
||
return false;
|
||
}
|
||
|
||
//开始准备校验
|
||
bool CTableFrame::EfficacyStartReady(WORD wStartChairID)
|
||
{
|
||
//状态判断
|
||
if (m_bGameStarted == true) return false;
|
||
|
||
//准备人数
|
||
WORD wReadyUserCount = 0;
|
||
for (WORD i = 0; i < m_wChairCount; i++)
|
||
{
|
||
//获取用户
|
||
IServerUserItem * pITableUserItem = GetTableUserItem(i);
|
||
if (pITableUserItem == NULL) continue;
|
||
|
||
//用户统计
|
||
if (pITableUserItem != NULL)
|
||
{
|
||
//状态判断(离线前的状态如果是准备状态)
|
||
if (pITableUserItem->IsClientReady() == false) return false;
|
||
if ((wStartChairID != i) && (pITableUserItem->GetUserStatus() != US_CAN_READY)) return false;
|
||
|
||
//用户计数
|
||
wReadyUserCount++;
|
||
}
|
||
}
|
||
|
||
//数目判断
|
||
if (wReadyUserCount >= 2L) return true;
|
||
|
||
return false;
|
||
}
|
||
//地址效验
|
||
bool CTableFrame::EfficacyIPAddress(IServerUserItem * pIServerUserItem)
|
||
{
|
||
//管理员不受限制
|
||
if(pIServerUserItem->GetMasterOrder()!=0) return true;
|
||
|
||
//规则判断
|
||
if (CServerRule::IsForfendGameRule(m_pGameServiceOption->dwServerRule)==true) return true;
|
||
|
||
//地址效验
|
||
const tagUserRule * pUserRule=pIServerUserItem->GetUserRule(),*pTableUserRule=NULL;
|
||
bool bCheckSameIP=pUserRule->bLimitSameIP;
|
||
for (WORD i=0;i<m_wChairCount;i++)
|
||
{
|
||
//获取用户
|
||
IServerUserItem * pITableUserItem=GetTableUserItem(i);
|
||
if (pITableUserItem!=NULL && (!pITableUserItem->IsAndroidUser()) && (pITableUserItem->GetMasterOrder()==0))
|
||
{
|
||
pTableUserRule=pITableUserItem->GetUserRule();
|
||
if (pTableUserRule->bLimitSameIP==true)
|
||
{
|
||
bCheckSameIP=true;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
//地址效验
|
||
if (bCheckSameIP==true)
|
||
{
|
||
DWORD dwUserIP=pIServerUserItem->GetClientAddr();
|
||
for (WORD i=0;i<m_wChairCount;i++)
|
||
{
|
||
//获取用户
|
||
IServerUserItem * pITableUserItem=GetTableUserItem(i);
|
||
if ((pITableUserItem!=NULL)&&(pITableUserItem != pIServerUserItem)&&(!pITableUserItem->IsAndroidUser())&&(pITableUserItem->GetMasterOrder()==0)&&(pITableUserItem->GetClientAddr()==dwUserIP))
|
||
{
|
||
if (!pUserRule->bLimitSameIP)
|
||
{
|
||
//发送信息
|
||
LPCTSTR pszDescribe=TEXT("此游戏桌玩家设置了不跟相同 IP 地址的玩家游戏,您 IP 地址与此玩家的 IP 地址相同,不能加入游戏!");
|
||
SendRequestFailure(pIServerUserItem,pszDescribe,REQUEST_FAILURE_NORMAL);
|
||
return false;
|
||
}
|
||
else
|
||
{
|
||
//发送信息
|
||
LPCTSTR pszDescribe=TEXT("您设置了不跟相同 IP 地址的玩家游戏,此游戏桌存在与您 IP 地址相同的玩家,不能加入游戏!");
|
||
SendRequestFailure(pIServerUserItem,pszDescribe,REQUEST_FAILURE_NORMAL);
|
||
return false;
|
||
}
|
||
}
|
||
}
|
||
for (WORD i=0;i<m_wChairCount-1;i++)
|
||
{
|
||
//获取用户
|
||
IServerUserItem * pITableUserItem=GetTableUserItem(i);
|
||
if (pITableUserItem!=NULL && (!pITableUserItem->IsAndroidUser()) && (pITableUserItem->GetMasterOrder()==0))
|
||
{
|
||
for (WORD j=i+1;j<m_wChairCount;j++)
|
||
{
|
||
//获取用户
|
||
IServerUserItem * pITableNextUserItem=GetTableUserItem(j);
|
||
if ((pITableNextUserItem!=NULL) && (!pITableNextUserItem->IsAndroidUser()) && (pITableNextUserItem->GetMasterOrder()==0)&&(pITableUserItem->GetClientAddr()==pITableNextUserItem->GetClientAddr()))
|
||
{
|
||
LPCTSTR pszDescribe=TEXT("您设置了不跟相同 IP 地址的玩家游戏,此游戏桌存在 IP 地址相同的玩家,不能加入游戏!");
|
||
SendRequestFailure(pIServerUserItem,pszDescribe,REQUEST_FAILURE_NORMAL);
|
||
return false;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return true;
|
||
}
|
||
|
||
//积分效验
|
||
bool CTableFrame::EfficacyScoreRule(IServerUserItem * pIServerUserItem)
|
||
{
|
||
//管理员不受限制
|
||
if(pIServerUserItem->GetMasterOrder()!=0) return true;
|
||
|
||
//规则判断
|
||
if (CServerRule::IsForfendGameRule(m_pGameServiceOption->dwServerRule)==true) return true;
|
||
|
||
//变量定义
|
||
WORD wWinRate=pIServerUserItem->GetUserWinRate();
|
||
WORD wFleeRate=pIServerUserItem->GetUserFleeRate();
|
||
|
||
//积分范围
|
||
for (WORD i=0;i<m_wChairCount;i++)
|
||
{
|
||
//获取用户
|
||
IServerUserItem * pITableUserItem=GetTableUserItem(i);
|
||
|
||
//规则效验
|
||
if (pITableUserItem!=NULL)
|
||
{
|
||
//获取规则
|
||
tagUserRule * pTableUserRule=pITableUserItem->GetUserRule();
|
||
|
||
//逃率效验
|
||
if ((pTableUserRule->bLimitFleeRate)&&(wFleeRate>pTableUserRule->wMaxFleeRate))
|
||
{
|
||
//构造信息
|
||
TCHAR szDescribe[128]=TEXT("");
|
||
_sntprintf_s(szDescribe,CountArray(szDescribe),TEXT("您的逃跑率太高,与 %s 设置的设置不符,不能加入游戏!"),pITableUserItem->GetNickName());
|
||
|
||
//发送信息
|
||
SendRequestFailure(pIServerUserItem,szDescribe,REQUEST_FAILURE_NORMAL);
|
||
|
||
return false;
|
||
}
|
||
|
||
//胜率效验
|
||
if ((pTableUserRule->bLimitWinRate)&&(wWinRate<pTableUserRule->wMinWinRate))
|
||
{
|
||
//构造信息
|
||
TCHAR szDescribe[128]=TEXT("");
|
||
_sntprintf_s(szDescribe,CountArray(szDescribe),TEXT("您的胜率太低,与 %s 设置的设置不符,不能加入游戏!"),pITableUserItem->GetNickName());
|
||
|
||
//发送信息
|
||
SendRequestFailure(pIServerUserItem,szDescribe,REQUEST_FAILURE_NORMAL);
|
||
|
||
return false;
|
||
}
|
||
|
||
//积分效验
|
||
if (pTableUserRule->bLimitGameScore==true)
|
||
{
|
||
//最高积分
|
||
if (pIServerUserItem->GetUserScore()>pTableUserRule->lMaxGameScore)
|
||
{
|
||
//构造信息
|
||
TCHAR szDescribe[128]=TEXT("");
|
||
_sntprintf_s(szDescribe,CountArray(szDescribe),TEXT("您的积分太高,与 %s 设置的设置不符,不能加入游戏!"),pITableUserItem->GetNickName());
|
||
|
||
//发送信息
|
||
SendRequestFailure(pIServerUserItem,szDescribe,REQUEST_FAILURE_NORMAL);
|
||
|
||
return false;
|
||
}
|
||
|
||
//最低积分
|
||
if (pIServerUserItem->GetUserScore()<pTableUserRule->lMinGameScore)
|
||
{
|
||
//构造信息
|
||
TCHAR szDescribe[128]=TEXT("");
|
||
_sntprintf_s(szDescribe,CountArray(szDescribe),TEXT("您的积分太低,与 %s 设置的设置不符,不能加入游戏!"),pITableUserItem->GetNickName());
|
||
|
||
//发送信息
|
||
SendRequestFailure(pIServerUserItem,szDescribe,REQUEST_FAILURE_NORMAL);
|
||
|
||
return false;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
|
||
|
||
|
||
//检查分配
|
||
bool CTableFrame::CheckDistribute()
|
||
{
|
||
//防作弊
|
||
if (CServerRule::IsAllowAvertCheatMode(m_pGameServiceOption->dwServerRule))
|
||
{
|
||
//桌子状况
|
||
tagTableUserInfo TableUserInfo;
|
||
WORD wUserSitCount = GetTableUserInfo(TableUserInfo);
|
||
|
||
//用户起立
|
||
if (wUserSitCount < TableUserInfo.wMinUserCount)
|
||
{
|
||
return true;
|
||
}
|
||
}
|
||
|
||
return false;
|
||
}
|
||
|
||
bool CTableFrame::ImitateGameOption(IServerUserItem * pIServerUserItem)
|
||
{
|
||
//参数校验
|
||
ASSERT(pIServerUserItem != NULL);
|
||
if (pIServerUserItem == NULL)
|
||
{
|
||
return false;
|
||
}
|
||
//状态判断;
|
||
if (m_bGameStarted == true)
|
||
{
|
||
return true;
|
||
}
|
||
//if (pIServerUserItem->GetUserMatchStatus() != MUS_PLAYING)
|
||
//{
|
||
// return false;
|
||
//}
|
||
|
||
//类型判断;
|
||
if ((m_pGameServiceOption->wServerType&GAME_GENRE_MATCH) == 0)
|
||
{
|
||
return false;
|
||
}
|
||
|
||
//设置状态;
|
||
pIServerUserItem->SetClientReady(true);
|
||
|
||
//开始判断;
|
||
if ((pIServerUserItem->GetUserStatus() == US_READY) && (EfficacyStartGame(pIServerUserItem->GetChairID()) == true))
|
||
{
|
||
StartGame();
|
||
}
|
||
|
||
return true;
|
||
}
|
||
//////////////////////////////////////////////////////////////////////////////////
|