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


邮件系统:
struct MailDBData{INT64objIdx;//邮件所属玩家idINT32mailId; //邮件Id...INT64n64CreateTime;//邮件创建时间INT64n64EndTime; //邮件过期时间stringmailTitle; //邮件主题stringmailContent;//邮件内容stringmailGift;//邮件赠送附件...};class CCSMailMgr{INT32m_curtMaxMailIdx;//目前的全服邮件id最大值,用于生成唯一邮件idstd::mapm_mapGameMail;//根据邮件id存储全服邮件数据std::map>m_IfHasSendMail;//临时的延时邮件//个人邮件信息,根据个人id存储邮件id列表,具体邮件信息需根据邮件id在m_mapGameMail获取std::map>m_mapPersonalMail;public:...bool addGameMail(const MailDBData& mail);//添加邮件数据...bool closeOrGetMailGift(CCSUser* pUser,INT32 mailId);//领取赠送邮件附件并删除邮件...private:void addPersonalMail(const MailDBData& mail);//添加个人邮件};
玩家实体创建和管理:
class CCSUser{private:EUserPlayingStatusm_eUserPlayingStatus; //玩家是否在线SUserDBDatam_sUserDBData;//玩家基本数据(存档)TIME_MILSECm_OfflineTime;//下线时间SUserNetInfom_sUserNetInfo;//玩家网络数据TIME_MILSECm_tGCLastPing;//客户端最近一次ping时间CCSUserBattleInfom_sUserBattleInfoEx;//玩家战斗数据IRoomPlayerm_tRoomPlayer;//创建房间进行游戏时的个人房间数据IMatchPlayerm_tMatchPlayer;//自由匹配时的个人匹配数据CTaskMgr*m_cTaskMgr;//任务数据管理map m_cAddFVec;//好友数据int64_tm_TimerID;//个人数据定时保存定时器id...stringstreamm_RuneBagStream;//符文背包数据stringstreamm_RuneSlotStream;//符文位置数据public://上线操作voidOnOnline(SUserNetInfo& netinfo,GCToCS::Login &pLogin,bool isFirstInDB,bool isFirstInMem,bool isReLogin=false);//下线操作voidOnOffline();//强制踢下线INT32KickOutOldUser();//重置客户端最后ping时间INT32ResetPingTimer();//加载玩家基础数据INT32LoadDBData(SUserDBData &crsDBData);//加载玩家好友数据voidLoadUserSNSList(DBToCS::RSinfo msg_snslist);//添加道具voidAddUserItems(DBToCS::ItemInfo& itemInfo);...};class CCSUserMgr{private:typedef map UserMap;UserMapm_cUserGUIDMap;//所有玩家数据管理UserMapm_cUserOnlineMap;//在线玩家数据typedef map, CCSUser*> UserNickNameMap;UserNickNameMapm_cNickNameMap;//按绰号分类的玩家数据map, CCSUser*> m_cUserNetMap;//按网络连接分类的玩家数据Concurrency::concurrent_queue m_DBCallbackQueue;//网络线程与逻辑线程通讯消息队列CThreadSafeObejctPoolm_DBCallbackQueuePool;//网络Buffer池DBActiveWrapper* m_UserCacheDBActiveWrapper;//用于系统对玩家数据存储的数据库线程DBActiveWrapper* m_CdkeyWrapper;// 用于全局数据操作的数据库线程vector m_pUserAskDBActiveWrapperVec;//用于玩家主动请求操作的数据库线程INT64m_MaxGuid;//当前服务器最大GUID,但游戏里的GUID是合成的,以保证所有CS Server唯一set> m_AllNickNameSet;//所有玩家昵称集合,所有关于昵称的操作可以通过此表来操作!mapm_AllUserName2GUIDMap;//所有玩家用户名,guid表,如果玩家登陆 通过CS,SDK,Username查到对应guidCCSMailMgrm_MailMgr;//邮件管理类std::stringstreamm_SaveUserStream;//玩家数据保存数据流DBActiveWrapper&GetNowWorkActor();// 获取当前负载最小的DB线程public://注册消息处理回调void RegisterMsgHandle(SSMsgHandlerMap& m_SSMsgHandlerMap, GSMsgHandlerMap& m_GSMsgHandlerMap, GCMsgHandlerMap& m_GCMsgHandlerMap, RCMsgHandlerMap& m_RCMsgHandlerMap);//玩家存储DB线程回调void UserCacheDBAsynHandler(Buffer*& pBuffer);//玩家请求回调void UserAskDBAsynHandler(Buffer*& pBuffer);//玩家在线处理INT32 OnUserOnline(CCSUser *pcUser, const SUserNetInfo &crsUserNetInfo);//玩家离线处理void OnUserOffline(CCSUser *pcUser);//处理玩家请求的数据库操作bool PostUserAskMsgToDBThread(google::protobuf::Message& sMsg, int n32MsgID);//处理缓存数据请求的数据库操作bool PostUserCacheMsgToDBThread(INT64 guidIndex, const string& sqlStr);private://添加玩家数据INT32AddUser(CCSUser *pcUser);//移除玩家数据INT32RemoveUser(CCSUser*& pcUser);//处理来自GateServer的消息INT32OnMsgFromGS_DO();//处理来自客户端的消息INT32OnMgrFromGC_DO();//处理来自场景服的消息INT32OnMsgFromSS_DO();//处理来自远程控制端的消息INT32OnMsgFromRC_DO();...};