970 lines
28 KiB
C++
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;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////
|