中心服CS:
作为游戏的核心服务器,中心服承担着除战斗外的所有游戏功能,包括房间匹配,场景服(SS)战斗及玩家的管理控制,邮件系统,玩家实体创建和管理,Kernel核心管理,数据存储与缓存,游戏日志生成等。
房间匹配:
class CCSMatchMgr
{
public:
...
INT32 TeamStartMatch(IMatchPlayer* pPlayer);//开始匹配
bool TeamStopMatch(IMatchPlayer* pPlayer);//结束匹配
void Update(int64_t tUTCMilsec,int64_t tTickSpan);
...
private:
map<UINT32,ICSMatchList*> mAllMatchList[eMatchType_Total];//不同类型的匹配列表
map<UINT32,CCSMatchTeam*> mAllTeamMap;//记录所有正在匹配的队伍信息
};
该类是CCSBattleMgr的成员变量,在服务器启动时创建,并在一个定时器中周期性的调用刷新函数:
void CCSMatchMgr::Update(int64_t tUTCMilsec,int64_t tTickSpan)
该刷新函数中根据mAllMatchList数组中存储的客户端发来的不同类型的开始匹配的玩家数据,调用各自类型的update函数进行匹配。最终在匹配函数:
void CCSBattleMgr::OnBattleMached(CCSUserListMap& pList,map<UINT32,UINT32>* aiRobots,...);
中,根据函数
ICSSSInfo* CCSKernel::GetMiniBattleNumSS();
选取负载最小的SS,并根据该SS的id在CS上创建CCSBattle来管理本场战斗,然后将本次匹配的玩家及机器人数据通过消息eMsgToSSFromCS_CreateBattle发送给该SS,SS接收到信息后开始创建CSSBattle,加载地图信息,设置玩家和AI信息,创建玩家CSSUser等,然后通知客户端开启战斗。
场景服(SS)战斗及玩家的管理控制:
//战场信息类
class CCSBattle
{
private:
...
BattleType m_Type; //战场类型
EBattleMatchType m_MatchType;//匹配类型
map<UINT64,CCSUser*> m_UserMap;//玩家数据
map<UINT32,SAIRobot*> m_AIRobots;//机器人数据
SMapLogicCfg* m_MapLogicCfg;//地图配置
public:
...
//游戏开始发送所有数据给场景服
INT32 Start();
//发送消息给客户端
INT32 BroadcastMsgToAllUser(google::protobuf::Message& sMsg,int n32MsgID);
//向场景服发送消息
INT32 PostMsgToBattleSS(google::protobuf::Message& sMsg,int n32MsgID);
INT32 PostMsgToSS_NotifyUserIsOnline(CCSUser* pUser,bool IsOnline);
//向网关服发送消息
INT32 PostMsgToGS_NotifyCombineUserNetInfoToSS(CCSUser* piUser,ICSSSInfo* piSSInfo);
INT32