Files
wnmj-normal/Servers/服务器组件/协调服务器/AttemperEngineSink.cpp
2026-03-03 13:56:44 +08:00

970 lines
28 KiB
C++

#include "StdAfx.h"
#include "ServiceUnits.h"
#include "ControlPacket.h"
#include "AttemperEngineSink.h"
//////////////////////////////////////////////////////////////////////////////////
//构造函数
CAttemperEngineSink::CAttemperEngineSink()
{
//状态变量
m_wCollectItem=INVALID_WORD;
//设置变量
m_pInitParameter=NULL;
m_pBindParameter=NULL;
//组件变量
m_pITimerEngine=NULL;
m_pITCPNetworkEngine=NULL;
return;
}
//析构函数
CAttemperEngineSink::~CAttemperEngineSink()
{
}
//接口查询
VOID * CAttemperEngineSink::QueryInterface(REFGUID Guid, DWORD dwQueryVer)
{
QUERYINTERFACE(IAttemperEngineSink,Guid,dwQueryVer);
QUERYINTERFACE_IUNKNOWNEX(IAttemperEngineSink,Guid,dwQueryVer);
return NULL;
}
//启动事件
bool CAttemperEngineSink::OnAttemperEngineStart(IUnknownEx * pIUnknownEx)
{
//绑定参数
m_pBindParameter=new tagBindParameter[m_pInitParameter->m_wMaxConnect];
ZeroMemory(m_pBindParameter,sizeof(tagBindParameter)*m_pInitParameter->m_wMaxConnect);
return true;
}
//停止事件
bool CAttemperEngineSink::OnAttemperEngineConclude(IUnknownEx * pIUnknownEx)
{
//状态变量
m_wCollectItem=INVALID_WORD;
m_WaitCollectItemArray.RemoveAll();
//设置变量
m_pITimerEngine=NULL;
m_pITCPNetworkEngine=NULL;
//删除数据
SafeDeleteArray(m_pBindParameter);
//设置组件
m_GlobalInfoManager.ResetData();
return true;
}
//控制事件
bool CAttemperEngineSink::OnEventControl(WORD wIdentifier, VOID * pData, WORD wDataSize)
{
switch (wIdentifier)
{
case CT_MAINTAIN_SERVICE:
{
//效验参数
ASSERT(wDataSize == sizeof(BYTE));
if (wDataSize != sizeof(BYTE)) return false;
BYTE cbFlag = *(BYTE*)pData;
return true;
}
case CT_SEND_SYSTEM_MESSAGE:
{
//效验参数
ASSERT(wDataSize == sizeof(CMD_CM_SystemMessage));
if (wDataSize != sizeof(CMD_CM_SystemMessage)) return false;
CMD_CM_SystemMessage* pMessage = (CMD_CM_SystemMessage*)pData;
//发送通知
m_pITCPNetworkEngine->SendDataBatch(MDM_CS_MANAGER_SERVICE, SUB_CS_S_GAME_MESSAGE, pData, wDataSize, 0L);
return true;
}
}
return false;
}
//调度事件
bool CAttemperEngineSink::OnEventAttemperData(WORD wRequestID, VOID * pData, WORD wDataSize)
{
return false;
}
//时间事件
bool CAttemperEngineSink::OnEventTimer(DWORD dwTimerID, WPARAM wBindParam)
{
return false;
}
//应答事件
bool CAttemperEngineSink::OnEventTCPNetworkBind(DWORD dwClientAddr, DWORD dwSocketID)
{
//获取索引
ASSERT(LOWORD(dwSocketID)<m_pInitParameter->m_wMaxConnect);
if (LOWORD(dwSocketID)>=m_pInitParameter->m_wMaxConnect) return false;
//变量定义
WORD wBindIndex=LOWORD(dwSocketID);
tagBindParameter * pBindParameter=(m_pBindParameter+wBindIndex);
//设置变量
pBindParameter->dwSocketID=dwSocketID;
pBindParameter->dwClientAddr=dwClientAddr;
pBindParameter->dwActiveTime=(DWORD)time(NULL);
return true;
}
//读取事件
bool CAttemperEngineSink::OnEventTCPNetworkRead(TCP_Command Command, VOID * pData, WORD wDataSize, DWORD dwSocketID)
{
switch (Command.wMainCmdID)
{
case MDM_CS_REGISTER: //服务注册
{
return OnTCPNetworkMainRegister(Command.wSubCmdID,pData,wDataSize,dwSocketID);
}
case MDM_CS_SERVICE_INFO: //服务信息
{
return OnTCPNetworkMainServiceInfo(Command.wSubCmdID,pData,wDataSize,dwSocketID);
}
case MDM_CS_USER_COLLECT: //用户命令
{
return OnTCPNetworkMainUserCollect(Command.wSubCmdID,pData,wDataSize,dwSocketID);
}
case MDM_CS_REMOTE_SERVICE: //远程服务
{
return OnTCPNetworkMainRemoteService(Command.wSubCmdID,pData,wDataSize,dwSocketID);
}
case MDM_CS_MANAGER_SERVICE: //管理服务
{
return OnTCPNetworkMainManagerService(Command.wSubCmdID,pData,wDataSize,dwSocketID);
}
case MDM_CS_WEB_SERVICE: //网站网关服务
{
return OnTCPNetworkMainWebService(Command.wSubCmdID, pData, wDataSize, dwSocketID);
}
}
return false;
}
//关闭事件
bool CAttemperEngineSink::OnEventTCPNetworkShut(DWORD dwClientAddr, DWORD dwActiveTime, DWORD dwSocketID)
{
//获取信息
WORD wBindIndex=LOWORD(dwSocketID);
tagBindParameter * pBindParameter=(m_pBindParameter+wBindIndex);
//游戏服务
if (pBindParameter->ServiceKind==ServiceKind_Game)
{
//变量定义
WORD wBindIndex=LOWORD(dwSocketID);
//汇总处理
if (wBindIndex==m_wCollectItem)
{
//设置变量
m_wCollectItem=INVALID_WORD;
//汇总切换
if (m_WaitCollectItemArray.GetCount()>0)
{
//提取变量
INT_PTR nWaitCount=m_WaitCollectItemArray.GetCount();
m_wCollectItem=m_WaitCollectItemArray[nWaitCount-1];
//删除数组
m_WaitCollectItemArray.RemoveAt(nWaitCount-1);
//发送消息
DWORD dwSocketID=(m_pBindParameter+m_wCollectItem)->dwSocketID;
m_pITCPNetworkEngine->SendData(dwSocketID,MDM_CS_USER_COLLECT,SUB_CS_S_COLLECT_REQUEST);
}
}
else
{
//删除等待
for (INT_PTR i=0;i<m_WaitCollectItemArray.GetCount();i++)
{
if (wBindIndex==m_WaitCollectItemArray[i])
{
m_WaitCollectItemArray.RemoveAt(i);
break;
}
}
}
//变量定义
CMD_CS_S_ServerRemove ServerRemove;
ZeroMemory(&ServerRemove,sizeof(ServerRemove));
//删除通知
ServerRemove.wServerID=pBindParameter->wServiceID;
m_pITCPNetworkEngine->SendDataBatch(MDM_CS_SERVICE_INFO,SUB_CS_S_SERVER_REMOVE,&ServerRemove,sizeof(ServerRemove),0L);
//注销房间
m_GlobalInfoManager.DeleteServerItem(pBindParameter->wServiceID);
}
//广场服务
if (pBindParameter->ServiceKind==ServiceKind_Plaza)
{
//变量定义
WORD wBindIndex=LOWORD(dwSocketID);
tagBindParameter * pBindParameter=(m_pBindParameter+wBindIndex);
//注销房间
m_GlobalInfoManager.DeletePlazaItem(pBindParameter->wServiceID);
}
//清除信息
ZeroMemory(pBindParameter,sizeof(tagBindParameter));
return false;
}
//数据库事件
bool CAttemperEngineSink::OnEventDataBase(WORD wRequestID, DWORD dwContextID, VOID * pData, WORD wDataSize)
{
return false;
}
//关闭事件
bool CAttemperEngineSink::OnEventTCPSocketShut(WORD wServiceID, BYTE cbShutReason)
{
return false;
}
//连接事件
bool CAttemperEngineSink::OnEventTCPSocketLink(WORD wServiceID, INT nErrorCode)
{
return false;
}
//读取事件
bool CAttemperEngineSink::OnEventTCPSocketRead(WORD wServiceID, TCP_Command Command, VOID * pData, WORD wDataSize)
{
return true;
}
//注册服务
bool CAttemperEngineSink::OnTCPNetworkMainRegister(WORD wSubCmdID, VOID * pData, WORD wDataSize, DWORD dwSocketID)
{
switch (wSubCmdID)
{
case SUB_CS_C_REGISTER_PLAZA: //注册广场
{
//效验数据
ASSERT(wDataSize==sizeof(CMD_CS_C_RegisterPlaza));
if (wDataSize!=sizeof(CMD_CS_C_RegisterPlaza)) return false;
//消息定义
CMD_CS_C_RegisterPlaza * pRegisterPlaza=(CMD_CS_C_RegisterPlaza *)pData;
//有效判断
if ((pRegisterPlaza->szServerName[0]==0)||(pRegisterPlaza->szServerAddr[0]==0))
{
//变量定义
CMD_CS_S_RegisterFailure RegisterFailure;
ZeroMemory(&RegisterFailure,sizeof(RegisterFailure));
//设置变量
RegisterFailure.lErrorCode=0L;
lstrcpyn(RegisterFailure.szDescribeString,TEXT("服务器注册失败,“服务地址”与“服务器名”不合法!"),CountArray(RegisterFailure.szDescribeString));
//发送消息
WORD wStringSize=CountStringBuffer(RegisterFailure.szDescribeString);
WORD wSendSize=sizeof(RegisterFailure)-sizeof(RegisterFailure.szDescribeString)+wStringSize;
m_pITCPNetworkEngine->SendData(dwSocketID,MDM_CS_REGISTER,SUB_CS_S_REGISTER_FAILURE,&RegisterFailure,wSendSize);
//中断网络
m_pITCPNetworkEngine->ShutDownSocket(dwSocketID);
return true;
}
//设置绑定
WORD wBindIndex=LOWORD(dwSocketID);
(m_pBindParameter+wBindIndex)->wServiceID=wBindIndex;
(m_pBindParameter+wBindIndex)->ServiceKind=ServiceKind_Plaza;
//变量定义
tagGamePlaza GamePlaza;
ZeroMemory(&GamePlaza,sizeof(GamePlaza));
//构造数据
GamePlaza.wPlazaID=wBindIndex;
lstrcpyn(GamePlaza.szServerName,pRegisterPlaza->szServerName,CountArray(GamePlaza.szServerName));
lstrcpyn(GamePlaza.szServerAddr,pRegisterPlaza->szServerAddr,CountArray(GamePlaza.szServerAddr));
//注册房间
m_GlobalInfoManager.ActivePlazaItem(wBindIndex,GamePlaza);
//发送列表
SendServerListItem(dwSocketID);
SendMatchListItem(dwSocketID);
//群发设置
m_pITCPNetworkEngine->AllowBatchSend(dwSocketID,true,0L);
return true;
}
case SUB_CS_C_REGISTER_SERVER: //注册房间
{
//效验数据
ASSERT(wDataSize==sizeof(CMD_CS_C_RegisterServer));
if (wDataSize!=sizeof(CMD_CS_C_RegisterServer)) return false;
//消息定义
CMD_CS_C_RegisterServer * pRegisterServer=(CMD_CS_C_RegisterServer *)pData;
//查找房间
if (m_GlobalInfoManager.SearchServerItem(pRegisterServer->wServerID)!=NULL)
{
//变量定义
CMD_CS_S_RegisterFailure RegisterFailure;
ZeroMemory(&RegisterFailure,sizeof(RegisterFailure));
//设置变量
RegisterFailure.lErrorCode=0L;
lstrcpyn(RegisterFailure.szDescribeString,TEXT("已经存在相同标识的游戏房间服务,房间服务注册失败"),CountArray(RegisterFailure.szDescribeString));
//发送消息
WORD wStringSize=CountStringBuffer(RegisterFailure.szDescribeString);
WORD wSendSize=sizeof(RegisterFailure)-sizeof(RegisterFailure.szDescribeString)+wStringSize;
m_pITCPNetworkEngine->SendData(dwSocketID,MDM_CS_REGISTER,SUB_CS_S_REGISTER_FAILURE,&RegisterFailure,wSendSize);
//中断网络
m_pITCPNetworkEngine->ShutDownSocket(dwSocketID);
return true;
}
//设置绑定
WORD wBindIndex=LOWORD(dwSocketID);
(m_pBindParameter+wBindIndex)->ServiceKind=ServiceKind_Game;
(m_pBindParameter+wBindIndex)->wServiceID=pRegisterServer->wServerID;
//变量定义
tagGameServer GameServer;
ZeroMemory(&GameServer,sizeof(GameServer));
//构造数据
GameServer.wKindID=pRegisterServer->wKindID;
GameServer.wNodeID=pRegisterServer->wNodeID;
GameServer.wSortID=pRegisterServer->wSortID;
GameServer.wServerID=pRegisterServer->wServerID;
//GameServer.wServerKind=pRegisterServer->wServerKind;
GameServer.wServerType=pRegisterServer->wServerType;
GameServer.wServerPort=pRegisterServer->wServerPort;
GameServer.lCellScore=pRegisterServer->lCellScore;
GameServer.lEnterScore=pRegisterServer->lEnterScore;
GameServer.dwServerRule=pRegisterServer->dwServerRule;
GameServer.dwOnLineCount=pRegisterServer->dwOnLineCount;
GameServer.dwFullCount=pRegisterServer->dwFullCount;
lstrcpyn(GameServer.szServerName,pRegisterServer->szServerName,CountArray(GameServer.szServerName));
lstrcpyn(GameServer.szServerAddr,pRegisterServer->szServerAddr,CountArray(GameServer.szServerAddr));
//注册房间
m_GlobalInfoManager.ActiveServerItem(wBindIndex,GameServer);
//群发房间
m_pITCPNetworkEngine->SendDataBatch(MDM_CS_SERVICE_INFO,SUB_CS_S_SERVER_INSERT,&GameServer,sizeof(GameServer),0L);
//发送列表
SendServerListItem(dwSocketID);
SendMatchListItem(dwSocketID);
//群发设置
m_pITCPNetworkEngine->AllowBatchSend(dwSocketID,true,0L);
//汇总通知
if (m_wCollectItem==INVALID_WORD)
{
m_wCollectItem=wBindIndex;
m_pITCPNetworkEngine->SendData(dwSocketID,MDM_CS_USER_COLLECT,SUB_CS_S_COLLECT_REQUEST);
}
else m_WaitCollectItemArray.Add(wBindIndex);
return true;
}
case SUB_CS_C_REGISTER_MATCH: //注册比赛
{
//效验数据
ASSERT(wDataSize==sizeof(CMD_CS_C_RegisterMatch));
if (wDataSize!=sizeof(CMD_CS_C_RegisterMatch)) return false;
//消息定义
CMD_CS_C_RegisterMatch * pRegisterMatch=(CMD_CS_C_RegisterMatch *)pData;
//查找房间
CGlobalServerItem * pGlobalServerItem = m_GlobalInfoManager.SearchServerItem(pRegisterMatch->wServerID);
if(pGlobalServerItem==NULL) return true;
//变量定义
tagGameMatch GameMatch;
ZeroMemory(&GameMatch,sizeof(GameMatch));
//构造数据
GameMatch.wServerID = pRegisterMatch->wServerID;
GameMatch.dwMatchID = pRegisterMatch->dwMatchID;
GameMatch.dwMatchNO = pRegisterMatch->dwMatchNO;
GameMatch.lMatchEnterScore = pRegisterMatch->lMatchEnterScore;
GameMatch.cbMatchType = pRegisterMatch->cbMatchType;
GameMatch.lMatchFee = pRegisterMatch->lMatchFee;
GameMatch.cbMatchFeeType = pRegisterMatch->cbMatchFeeType;
GameMatch.cbMemberOrder = pRegisterMatch->cbMemberOrder;
GameMatch.wRewardCount = pRegisterMatch->wRewardCount;
GameMatch.MatchEndTime = pRegisterMatch->MatchEndTime;
GameMatch.MatchStartTime = pRegisterMatch->MatchStartTime;
GameMatch.wStartUserCount = pRegisterMatch->wStartUserCount;
GameMatch.wMatchPlayCount = pRegisterMatch->wMatchPlayCount;
GameMatch.SignupStartTime = pRegisterMatch->SignupStartTime;
GameMatch.SignupEndTime = pRegisterMatch->SignupEndTime;
GameMatch.dwQuality = pRegisterMatch->dwQuality;
GameMatch.dwCycle = pRegisterMatch->dwCycle;
GameMatch.dwInviteCode = pRegisterMatch->dwInviteCode;
GameMatch.dwChannelID = pRegisterMatch->dwChannelID;
lstrcpyn(GameMatch.szMatchName,pRegisterMatch->szMatchName,CountArray(GameMatch.szMatchName));
//拷贝数据
CopyMemory(&pGlobalServerItem->m_GameMatch,&GameMatch,sizeof(pGlobalServerItem->m_GameMatch));
//群发房间
m_pITCPNetworkEngine->SendDataBatch(MDM_CS_SERVICE_INFO,SUB_CS_S_MATCH_INSERT,&GameMatch,sizeof(GameMatch),0L);
return true;
}
case SUB_CS_C_REGISTER_WEBGATE:
{
//效验数据
ASSERT(wDataSize == sizeof(CMD_CS_C_RegisterWebGate));
if (wDataSize != sizeof(CMD_CS_C_RegisterWebGate)) return false;
CMD_CS_C_RegisterWebGate* pWebGate = (CMD_CS_C_RegisterWebGate*)pData;
return true;
}
}
return false;
}
//服务状态
bool CAttemperEngineSink::OnTCPNetworkMainServiceInfo(WORD wSubCmdID, VOID * pData, WORD wDataSize, DWORD dwSocketID)
{
switch (wSubCmdID)
{
case SUB_CS_C_SERVER_ONLINE: //房间人数
{
//效验数据
ASSERT(wDataSize==sizeof(CMD_CS_C_ServerOnLine));
if (wDataSize!=sizeof(CMD_CS_C_ServerOnLine)) return false;
//消息定义
CMD_CS_C_ServerOnLine * pServerOnLine=(CMD_CS_C_ServerOnLine *)pData;
//获取参数
WORD wBindIndex=LOWORD(dwSocketID);
tagBindParameter * pBindParameter=(m_pBindParameter+wBindIndex);
//连接效验
ASSERT(pBindParameter->ServiceKind==ServiceKind_Game);
if (pBindParameter->ServiceKind!=ServiceKind_Game) return false;
//查找房间
WORD wServerID=pBindParameter->wServiceID;
CGlobalServerItem * pGlobalServerItem=m_GlobalInfoManager.SearchServerItem(wServerID);
//设置人数
if (pGlobalServerItem!=NULL)
{
//变量定义
CMD_CS_S_ServerOnLine ServerOnLine;
ZeroMemory(&ServerOnLine,sizeof(ServerOnLine));
//设置变量
pGlobalServerItem->m_GameServer.dwOnLineCount=pServerOnLine->dwOnLineCount;
//设置变量
ServerOnLine.wServerID=wServerID;
ServerOnLine.dwOnLineCount=pServerOnLine->dwOnLineCount;
//发送通知
m_pITCPNetworkEngine->SendDataBatch(MDM_CS_SERVICE_INFO,SUB_CS_S_SERVER_ONLINE,&ServerOnLine,sizeof(ServerOnLine),0L);
}
return true;
}
case SUB_CS_C_SERVER_MODIFY: //房间修改
{
//效验数据
ASSERT(wDataSize==sizeof(CMD_CS_C_ServerModify));
if (wDataSize!=sizeof(CMD_CS_C_ServerModify)) return false;
//消息定义
CMD_CS_C_ServerModify * pServerModify=(CMD_CS_C_ServerModify *)pData;
//获取参数
WORD wBindIndex=LOWORD(dwSocketID);
tagBindParameter * pBindParameter=(m_pBindParameter+wBindIndex);
//连接效验
ASSERT(pBindParameter->ServiceKind==ServiceKind_Game);
if (pBindParameter->ServiceKind!=ServiceKind_Game) return false;
//查找房间
ASSERT(m_GlobalInfoManager.SearchServerItem(pBindParameter->wServiceID)!=NULL);
CGlobalServerItem * pGlobalServerItem=m_GlobalInfoManager.SearchServerItem(pBindParameter->wServiceID);
//房间修改
if (pGlobalServerItem!=NULL)
{
//设置变量
pGlobalServerItem->m_GameServer.wSortID=pServerModify->wSortID;
pGlobalServerItem->m_GameServer.wKindID=pServerModify->wKindID;
pGlobalServerItem->m_GameServer.wNodeID=pServerModify->wNodeID;
pGlobalServerItem->m_GameServer.wServerPort=pServerModify->wServerPort;
pGlobalServerItem->m_GameServer.dwOnLineCount=pServerModify->dwOnLineCount;
pGlobalServerItem->m_GameServer.dwFullCount=pServerModify->dwFullCount;
lstrcpyn(pGlobalServerItem->m_GameServer.szServerName,pServerModify->szServerName,CountArray(pGlobalServerItem->m_GameServer.szServerName));
lstrcpyn(pGlobalServerItem->m_GameServer.szServerAddr,pServerModify->szServerAddr,CountArray(pGlobalServerItem->m_GameServer.szServerAddr));
//变量定义
CMD_CS_S_ServerModify ServerModify;
ZeroMemory(&ServerModify,sizeof(ServerModify));
//设置变量
ServerModify.wKindID=pServerModify->wKindID;
ServerModify.wSortID=pServerModify->wSortID;
ServerModify.wNodeID=pServerModify->wNodeID;
ServerModify.wServerID=pBindParameter->wServiceID;
ServerModify.wServerPort=pServerModify->wServerPort;
ServerModify.dwOnLineCount=pServerModify->dwOnLineCount;
ServerModify.dwFullCount=pServerModify->dwFullCount;
lstrcpyn(ServerModify.szServerAddr,pServerModify->szServerAddr,CountArray(ServerModify.szServerAddr));
lstrcpyn(ServerModify.szServerName,pServerModify->szServerName,CountArray(ServerModify.szServerName));
//发送通知
m_pITCPNetworkEngine->SendDataBatch(MDM_CS_SERVICE_INFO,SUB_CS_S_SERVER_MODIFY,&ServerModify,sizeof(ServerModify),0L);
}
return true;
}
}
return false;
}
//用户处理
bool CAttemperEngineSink::OnTCPNetworkMainUserCollect(WORD wSubCmdID, VOID * pData, WORD wDataSize, DWORD dwSocketID)
{
switch (wSubCmdID)
{
case SUB_CS_C_USER_ENTER: //用户进入
{
//效验数据
ASSERT(wDataSize==sizeof(CMD_CS_C_UserEnter));
if (wDataSize!=sizeof(CMD_CS_C_UserEnter)) return false;
//消息处理
CMD_CS_C_UserEnter * pUserEnter=(CMD_CS_C_UserEnter *)pData;
pUserEnter->szNickName[CountArray(pUserEnter->szNickName)-1]=0;
//获取参数
WORD wBindIndex=LOWORD(dwSocketID);
tagBindParameter * pBindParameter=(m_pBindParameter+wBindIndex);
//连接效验
ASSERT(pBindParameter->ServiceKind==ServiceKind_Game);
if (pBindParameter->ServiceKind!=ServiceKind_Game) return false;
//变量定义
tagGlobalUserInfo GlobalUserInfo;
ZeroMemory(&GlobalUserInfo,sizeof(GlobalUserInfo));
//设置变量
GlobalUserInfo.dwUserID=pUserEnter->dwUserID;
GlobalUserInfo.dwGameID=pUserEnter->dwGameID;
lstrcpyn(GlobalUserInfo.szNickName,pUserEnter->szNickName,CountArray(GlobalUserInfo.szNickName));
//辅助信息
GlobalUserInfo.cbGender=pUserEnter->cbGender;
GlobalUserInfo.cbMemberOrder=pUserEnter->cbMemberOrder;
GlobalUserInfo.cbMasterOrder=pUserEnter->cbMasterOrder;
//激活用户
m_GlobalInfoManager.ActiveUserItem(GlobalUserInfo,pBindParameter->wServiceID);
return true;
}
case SUB_CS_C_USER_LEAVE: //用户离开
{
//效验数据
ASSERT(wDataSize==sizeof(CMD_CS_C_UserLeave));
if (wDataSize!=sizeof(CMD_CS_C_UserLeave)) return false;
//消息处理
CMD_CS_C_UserLeave * pUserLeave=(CMD_CS_C_UserLeave *)pData;
//获取参数
WORD wBindIndex=LOWORD(dwSocketID);
tagBindParameter * pBindParameter=(m_pBindParameter+wBindIndex);
//连接效验
ASSERT(pBindParameter->ServiceKind==ServiceKind_Game);
if (pBindParameter->ServiceKind!=ServiceKind_Game) return false;
//删除用户
m_GlobalInfoManager.DeleteUserItem(pUserLeave->dwUserID,pBindParameter->wServiceID);
return true;
}
case SUB_CS_C_USER_FINISH: //用户完成
{
//获取参数
WORD wBindIndex=LOWORD(dwSocketID);
tagBindParameter * pBindParameter=(m_pBindParameter+wBindIndex);
//连接效验
ASSERT((m_wCollectItem==wBindIndex)&&(pBindParameter->ServiceKind==ServiceKind_Game));
if ((m_wCollectItem!=wBindIndex)||(pBindParameter->ServiceKind!=ServiceKind_Game)) return false;
//设置变量
m_wCollectItem=INVALID_WORD;
//汇总切换
if (m_WaitCollectItemArray.GetCount()>0)
{
//切换汇总
INT_PTR nWaitCount=m_WaitCollectItemArray.GetCount();
m_wCollectItem=m_WaitCollectItemArray[nWaitCount-1];
//删除数组
m_WaitCollectItemArray.RemoveAt(nWaitCount-1);
//发送消息
DWORD dwSocketID=(m_pBindParameter+m_wCollectItem)->dwSocketID;
m_pITCPNetworkEngine->SendData(dwSocketID,MDM_CS_USER_COLLECT,SUB_CS_S_COLLECT_REQUEST);
}
return true;
}
}
return false;
}
//远程服务
bool CAttemperEngineSink::OnTCPNetworkMainRemoteService(WORD wSubCmdID, VOID * pData, WORD wDataSize, DWORD dwSocketID)
{
switch (wSubCmdID)
{
case SUB_CS_C_SEARCH_CORRESPOND: //协调查找
{
//效验参数
ASSERT(wDataSize==sizeof(CMD_CS_C_SearchCorrespond));
if (wDataSize!=sizeof(CMD_CS_C_SearchCorrespond)) return false;
//处理消息
CMD_CS_C_SearchCorrespond * pSearchCorrespond=(CMD_CS_C_SearchCorrespond *)pData;
pSearchCorrespond->szNickName[CountArray(pSearchCorrespond->szNickName)-1]=0;
//变量定义
CMD_CS_S_SearchCorrespond SearchCorrespond;
ZeroMemory(&SearchCorrespond,sizeof(SearchCorrespond));
//结果用户
CGlobalUserItem * ResultUserItem[2];
ZeroMemory(ResultUserItem,sizeof(ResultUserItem));
//设置变量
SearchCorrespond.dwSocketID=pSearchCorrespond->dwSocketID;
SearchCorrespond.dwClientAddr=pSearchCorrespond->dwClientAddr;
//查找用户
if (pSearchCorrespond->dwGameID!=0L)
{
ResultUserItem[0]=m_GlobalInfoManager.SearchUserItemByGameID(pSearchCorrespond->dwGameID);
}
//查找用户
if (pSearchCorrespond->szNickName[0]!=0)
{
_tcslwr(pSearchCorrespond->szNickName);
ResultUserItem[1]=m_GlobalInfoManager.SearchUserItemByNickName(pSearchCorrespond->szNickName);
}
//设置结果
for (BYTE i=0;i<CountArray(ResultUserItem);i++)
{
if (ResultUserItem[i]!=NULL)
{
//变量定义
WORD wServerIndex=0;
//查找房间
do
{
//查找房间
CGlobalServerItem * pGlobalServerItem=ResultUserItem[i]->EnumServerItem(wServerIndex++);
//终止判断
if (pGlobalServerItem==NULL) break;
if (SearchCorrespond.wUserCount>=CountArray(SearchCorrespond.UserRemoteInfo)) break;
//索引定义
WORD wIndex=SearchCorrespond.wUserCount++;
//辅助信息
SearchCorrespond.UserRemoteInfo[wIndex].cbGender=ResultUserItem[i]->GetGender();
SearchCorrespond.UserRemoteInfo[wIndex].cbMemberOrder=ResultUserItem[i]->GetMemberOrder();
SearchCorrespond.UserRemoteInfo[wIndex].cbMasterOrder=ResultUserItem[i]->GetMasterOrder();
//用户信息
SearchCorrespond.UserRemoteInfo[wIndex].dwUserID=ResultUserItem[i]->GetUserID();
SearchCorrespond.UserRemoteInfo[wIndex].dwGameID=ResultUserItem[i]->GetGameID();
lstrcpyn(SearchCorrespond.UserRemoteInfo[wIndex].szNickName,ResultUserItem[i]->GetNickName(),LEN_NICKNAME);
//房间信息
SearchCorrespond.UserRemoteInfo[wIndex].wKindID=pGlobalServerItem->GetKindID();
SearchCorrespond.UserRemoteInfo[wIndex].wServerID=pGlobalServerItem->GetServerID();
lstrcpyn(SearchCorrespond.UserRemoteInfo[wIndex].szGameServer,pGlobalServerItem->m_GameServer.szServerName,LEN_SERVER);
} while (true);
}
}
//发送数据
WORD wHeadSize=sizeof(SearchCorrespond)-sizeof(SearchCorrespond.UserRemoteInfo);
WORD wItemSize=sizeof(SearchCorrespond.UserRemoteInfo[0])*SearchCorrespond.wUserCount;
m_pITCPNetworkEngine->SendData(dwSocketID,MDM_CS_REMOTE_SERVICE,SUB_CS_S_SEARCH_CORRESPOND,&SearchCorrespond,wHeadSize+wItemSize);
return true;
}
}
return false;
}
//管理服务
bool CAttemperEngineSink::OnTCPNetworkMainManagerService(WORD wSubCmdID, VOID * pData, WORD wDataSize, DWORD dwSocketID)
{
switch (wSubCmdID)
{
case SUB_CS_C_SYSTEM_MESSAGE: //系统消息
{
//发送通知
m_pITCPNetworkEngine->SendDataBatch(MDM_CS_MANAGER_SERVICE,SUB_CS_S_SYSTEM_MESSAGE,pData,wDataSize,0L);
return true;
}
case SUB_CS_C_PROPERTY_TRUMPET: //喇叭消息
{
//发送通知
m_pITCPNetworkEngine->SendDataBatch(MDM_CS_MANAGER_SERVICE,SUB_CS_S_PROPERTY_TRUMPET,pData,wDataSize,0L);
return true;
}
}
return false;
}
//网站网关服务
bool CAttemperEngineSink::OnTCPNetworkMainWebService(WORD wSubCmdID, VOID * pData, WORD wDataSize, DWORD dwSocketID)
{
switch (wSubCmdID)
{
case SUB_CS_C_SET_CHEAT_USER:
{
//发送通知
m_pITCPNetworkEngine->SendDataBatch(MDM_CS_WEB_SERVICE, SUB_CS_S_SET_CHEAT_USER, pData, wDataSize, 0L);
return true;
}
case SUB_CS_C_SET_CARD_LIB:
{
//效验参数
ASSERT(wDataSize == sizeof(CMD_CS_SetCardLib));
if (wDataSize != sizeof(CMD_CS_SetCardLib)) return false;
CMD_CS_SetCardLib* pCardLib = (CMD_CS_SetCardLib*)pData;
SendDataToKindGame(pCardLib->wKindID, MDM_CS_WEB_SERVICE, SUB_CS_S_SET_CARD_LIB, pData, wDataSize);
return true;
}
case SUB_CS_C_CARD_LIB_GLOBAL_CFG:
{
//效验参数
ASSERT(wDataSize == sizeof(CMD_CS_CardLibGlobalCfg));
if (wDataSize != sizeof(CMD_CS_CardLibGlobalCfg)) return false;
CMD_CS_CardLibGlobalCfg* pCardLib = (CMD_CS_CardLibGlobalCfg*)pData;
SendDataToKindGame(pCardLib->wKindID, MDM_CS_WEB_SERVICE, SUB_CS_S_CARD_LIB_GLOBAL_CFG, pData, wDataSize);
return true;
}
default:
break;
}
return false;
}
//发送列表
bool CAttemperEngineSink::SendServerListItem(DWORD dwSocketID)
{
//变量定义
WORD wPacketSize=0L;
POSITION Position=NULL;
BYTE cbBuffer[SOCKET_TCP_PACKET];
//发送信息
m_pITCPNetworkEngine->SendData(dwSocketID,MDM_CS_SERVICE_INFO,SUB_CS_S_SERVER_INFO);
//收集数据
do
{
//发送数据
if ((wPacketSize+sizeof(tagGameServer))>sizeof(cbBuffer))
{
m_pITCPNetworkEngine->SendData(dwSocketID,MDM_CS_SERVICE_INFO,SUB_CS_S_SERVER_INSERT,cbBuffer,wPacketSize);
wPacketSize=0;
}
//获取对象
tagGameServer * pGameServer=(tagGameServer *)(cbBuffer+wPacketSize);
CGlobalServerItem * pGlobalServerItem=m_GlobalInfoManager.EnumServerItem(Position);
//设置数据
if (pGlobalServerItem!=NULL)
{
wPacketSize+=sizeof(tagGameServer);
CopyMemory(pGameServer,&pGlobalServerItem->m_GameServer,sizeof(tagGameServer));
}
} while (Position!=NULL);
//发送数据
if (wPacketSize>0) m_pITCPNetworkEngine->SendData(dwSocketID,MDM_CS_SERVICE_INFO,SUB_CS_S_SERVER_INSERT,cbBuffer,wPacketSize);
//发送完成
m_pITCPNetworkEngine->SendData(dwSocketID,MDM_CS_SERVICE_INFO,SUB_CS_S_SERVER_FINISH);
return true;
}
//发送列表
bool CAttemperEngineSink::SendMatchListItem(DWORD dwSocketID)
{
//变量定义
WORD wPacketSize=0L;
POSITION Position=NULL;
BYTE cbBuffer[SOCKET_TCP_PACKET];
//收集数据
do
{
//发送数据
if ((wPacketSize+sizeof(tagGameServer))>sizeof(cbBuffer))
{
m_pITCPNetworkEngine->SendData(dwSocketID,MDM_CS_SERVICE_INFO,SUB_CS_S_MATCH_INSERT,cbBuffer,wPacketSize);
wPacketSize=0;
}
//获取对象
tagGameMatch * pGameMatch=(tagGameMatch *)(cbBuffer+wPacketSize);
CGlobalServerItem * pGlobalServerItem=m_GlobalInfoManager.EnumServerItem(Position);
//设置数据
if (pGlobalServerItem!=NULL && pGlobalServerItem->IsMatchServer())
{
wPacketSize+=sizeof(tagGameMatch);
CopyMemory(pGameMatch,&pGlobalServerItem->m_GameMatch,sizeof(tagGameMatch));
}
} while (Position!=NULL);
//发送数据
if (wPacketSize>0) m_pITCPNetworkEngine->SendData(dwSocketID,MDM_CS_SERVICE_INFO,SUB_CS_S_MATCH_INSERT,cbBuffer,wPacketSize);
return true;
}
//类型发送
bool CAttemperEngineSink::SendDataToKindGame(WORD wKindID, WORD wMainCmdID, WORD wSubCmdID, VOID * pData, WORD wDataSize)
{
POSITION Position = NULL;
//收集数据
do
{
//获取对象
CGlobalServerItem * pServerItem = m_GlobalInfoManager.EnumServerItem(Position);
//设置数据
if (pServerItem == NULL || pServerItem->GetKindID() != wKindID)
{
continue;
}
//获取参数
WORD wBindIndex = pServerItem->GetIndex();
ASSERT(wBindIndex < m_pInitParameter->m_wMaxConnect);
if (wBindIndex >= m_pInitParameter->m_wMaxConnect)
{
continue;
}
tagBindParameter * pBindParameter = (m_pBindParameter + wBindIndex);
//发送数据
DWORD dwSocketID = pBindParameter->dwSocketID;
m_pITCPNetworkEngine->SendData(dwSocketID, wMainCmdID, wSubCmdID, pData, wDataSize);
} while (Position != NULL);
return true;
}
//房间发送
bool CAttemperEngineSink::SendDataToGame(WORD wServerID, WORD wMainCmdID, WORD wSubCmdID, VOID * pData, WORD wDataSize)
{
//查找房间
CGlobalServerItem * pGlobalServerItem=m_GlobalInfoManager.SearchServerItem(wServerID);
if (pGlobalServerItem==NULL) return false;
//获取参数
WORD wBindIndex=pGlobalServerItem->GetIndex();
tagBindParameter * pBindParameter=(m_pBindParameter+wBindIndex);
//发送数据
DWORD dwSocketID=pBindParameter->dwSocketID;
m_pITCPNetworkEngine->SendData(dwSocketID,wMainCmdID,wSubCmdID,pData,wDataSize);
return true;
}
//用户发送
bool CAttemperEngineSink::SendDataToUser(WORD wServerID, DWORD dwUserID, WORD wMainCmdID, WORD wSubCmdID, VOID * pData, WORD wDataSize)
{
return true;
}
//////////////////////////////////////////////////////////////////////////////////