LastBattle 最后一战服务器源码分析2——中心服务器(CentralS

中心服CS:
作为游戏的核心服务器,中心服承担着除战斗外的所有游戏功能,包括房间匹配,场景服(SS)战斗及玩家的管理控制,邮件系统,玩家实体创建和管理,核心管理,数据存储与缓存,游戏日志生成等 。
房间匹配:
class CCSMatchMgr{public:...INT32 TeamStartMatch(IMatchPlayer* pPlayer);//开始匹配bool TeamStopMatch(IMatchPlayer* pPlayer);//结束匹配void Update(int64_t tUTCMilsec,int64_t tTickSpan);...private:mapmAllMatchList[eMatchType_Total];//不同类型的匹配列表mapmAllTeamMap;//记录所有正在匹配的队伍信息};
该类是的成员变量,在服务器启动时创建,并在一个定时器中周期性的调用刷新函数:
void CCSMatchMgr::Update(int64_t tUTCMilsec,int64_t tTickSpan)
该刷新函数中根据数组中存储的客户端发来的不同类型的开始匹配的玩家数据,调用各自类型的函数进行匹配 。最终在匹配函数:

LastBattle  最后一战服务器源码分析2——中心服务器(CentralS

文章插图
void CCSBattleMgr::OnBattleMached(CCSUserListMap& pList,map* aiRobots,...);
中,根据函数
ICSSSInfo* CCSKernel::GetMiniBattleNumSS();
选取负载最小的SS,并根据该SS的id在CS上创建来管理本场战斗,然后将本次匹配的玩家及机器人数据通过消息发送给该SS,SS接收到信息后开始创建,加载地图信息,设置玩家和AI信息,创建玩家等,然后通知客户端开启战斗 。
【LastBattle最后一战服务器源码分析2——中心服务器(CentralS】场景服(SS)战斗及玩家的管理控制:
//战场信息类class CCSBattle{private:...BattleTypem_Type; //战场类型EBattleMatchTypem_MatchType;//匹配类型mapm_UserMap;//玩家数据mapm_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 PostMsgToGS_NotifySplitUserNetInfoToSS(CCSUser* piUser,ICSSSInfo* piSSInfo);...};typedef hash_map BattleMap;//场景服战场信息管理类class CCSBattleMgr{private:UINT64m_un64MaxBattleID;//目前最大战场唯一idBattleMapm_cAllBattleMap;//根据战场id存储目前存在的战场信息CCSMatchMgr*m_pMatchMgr;//战场匹配管理数据mapm_BattleRoomList;//游戏房间列表public:...//向场景服通知玩家在线信息INT32 NotifyBattleSSUserIsOnline(CCSUser* piUser,bool isOnline);//向场景服发送信息INT32 PostMsgToBattleSS(UINT64 un64BattleID,google::protobuf::message& sMsg,int n32MsgID);...public://创建房间进入游戏...//创建游戏房间INT32 AskCreateRoom(CCSUser* piUser,UINT32 un32mapId,const string& stPwd,bool isRestart,UINT32 rePostion=0);//游戏房间添加玩家INT32 AskAddRoom(CCSUser* piUser,UINT32 un32mapId,const string& stPwd,bool isRestart,UINT32 rePostion=0);//游戏房间开始游戏INT32 OnBattleRoomStart(CCSBattleRoom* pRoom,CCSUserListMap& sList,map* aiRobots,UINT32 mapID);...public://随机匹配进入游戏INT32 RemoveMatchUser(CCSUser* piUser);//从准备匹配队列中移除该玩家//对准备匹配队列中的玩家进行匹配voidOnBattleMached(CCSUserListMap& pList,map* aiRobots,...);voidOnBattleMached(EBattleMatchType type,UINT32 mapId,...);private:INT32 OnMsgFromRC_DO(ICSRCInfo* piRCInfo,...);//接收及处理来自远程控制端的消息INT32 OnMsgFromGC_DO(ICSRCInfo* piRCInfo,...);//接收及处理来自客户端的消息INT32 OnMsgFromSS_DO(ICSRCInfo* piRCInfo,...);//接收及处理来自场景服的消息...};