/// <summary> /// 玩家下线 /// </summary> internal void Offline(CSUser user) { Logger.Info($"user:{user.gcNID}({user.gsLID}) offline"); //从匹配系统中移除 CS.instance.matchMgr.Leave(user); CS.instance.roomMgr.Leave(user); //玩家下线 user.Offline(); }
internal void KickUser(CSUser user, Protos.CS2GS_KickGC.Types.EReason reason) { //通知gs玩家被踢下线 Protos.CS2GS_KickGC kickGc = ProtoCreator.Q_CS2GS_KickGC(); kickGc.GcNID = user.gcNID; kickGc.Reason = reason; CS.instance.netSessionMgr.Send(user.gsSID, kickGc); this.Offline(user); }
/// <summary> /// 断开指定玩家连接,由Session在连接关闭时调用 /// </summary> internal bool KickUser(ulong gcNID, Protos.CS2GS_KickGC.Types.EReason reason) { CSUser user = this.GetUser(gcNID); if (user == null) { Logger.Warn($"can not find user:{gcNID}"); return(false); } this.KickUser(user, reason); return(true); }
/// <summary> /// 玩家下线 /// </summary> internal bool Offline(ulong gcNID) { CSUser user = this.GetUser(gcNID); if (user == null) { Logger.Warn($"can not find user:{gcNID}"); return(false); } this.Offline(user); return(true); }
/// <summary> /// 注销玩家 /// </summary> internal void DestroyUser(CSUser user) { System.Diagnostics.Debug.Assert(!user.isConnected, $"user:{user.gcNID} still online"); //如果玩家在战场则不销毁,留待战场结束再判断是否在线,不在线再行销毁 if (user.isInBattle) { return; } this._gcNIDToUser.Remove(user.gcNID); this._ukeyToUser.Remove(user.ukey); Logger.Log($"destroy user:{user.gcNID}"); }
/// <summary> /// 玩家上线 /// </summary> internal CSUser Online(ulong gcNID, uint sid, uint lid) { //先验证是否合法登陆 CSUser user = this.GetUser(gcNID); if (user == null) { return(null); } user.Online(sid, lid); this._authUsers.Remove(user); Logger.Info($"user:{gcNID}({lid}) online"); return(user); }
public void AskChangeHeaderId(uint headerID) { this.userDbData.ChangeUserDbData(UserDBDataType.HeaderId, headerID); this.PostMsgToGCNotifyNewHeaderid(this.guid, headerID); //notify new header to on-line friend foreach (KeyValuePair <ulong, UserRelationshipInfo> kv in this.userDbData.friendListMap) { CSUser user = CS.instance.userMgr.GetUser(kv.Value.guididx); if (user != null && user.userPlayingStatus == UserPlayingStatus.Playing) { user.SynUserSNSList(this.guid, RelationShip.Friends); } } //todo //string log = $"{headerID}{LOG_SIGN}{this.userDbData.szNickName}"; //CSSGameLogMgr::GetInstance().AddGameLog( eLog_HeadUse, this.GetUserDBData().sPODUsrDBData.un64ObjIdx, mystream.str() ); }
/// <summary> /// 踢走连接到指定逻辑ID的GS的所有玩家 /// 当GS丢失连接时调用 /// </summary> internal void OnGSDisconnect(uint gsLID) { CSUser[] users = this._gcNIDToUser.Values.ToArray(); int count = users.Length; for (int i = 0; i < count; i++) { CSUser user = users[i]; if (user.gsLID != gsLID) { continue; } //下线玩家 this.Offline(user); //注销玩家 this.DestroyUser(user); } }
private ErrorCode NotifyUserPlayState() { foreach (KeyValuePair <ulong, UserRelationshipInfo> kv in this.userDbData.friendListMap) { CSUser user = CS.instance.userMgr.GetUser(kv.Value.guididx); if (null == user) { continue; } if (!user.CheckIfInFriendList(this.guid)) { continue; } if (UserPlayingStatus.Playing == user.userPlayingStatus) { user.SynUserSNSList(this.guid, kv.Value.relationShip); } } return(ErrorCode.Success); }
/// <summary> /// 心跳回调 /// </summary> internal void OnHeartBeat(long dt) { long currTime = TimeUtils.utcTime; long expTime = CS.instance.config.sessionExpTime; int count = this._authUsers.Count; for (int i = 0; i < count; i++) { CSUser user = this._authUsers[i]; if (currTime < user.loginTime + expTime) { continue; } //销毁玩家,DestroyUser逻辑一致 this._gcNIDToUser.Remove(user.gcNID); this._ukeyToUser.Remove(user.ukey); this._authUsers.RemoveAt(i); --i; --count; Logger.Log($"user:{user.gcNID} expired"); } }
/// <summary> /// 创建玩家登陆凭证 /// </summary> internal CSUser CreateUser(Protos.LS2CS_GCLogin gcLogin) { CSUser user = this.GetUser(gcLogin.Ukey); if (user == null) { user = new CSUser(); this._ukeyToUser[gcLogin.Ukey] = user; this._authUsers.Add(user); } else { //处理顶号 if (user.isConnected) { this.KickUser(user, ( int )Protos.CS2GS_KickGC.Types.EReason.DuplicateLogin); } this._gcNIDToUser.Remove(user.gcNID); } user.OnCreate(gcLogin, TimeUtils.utcTime); this._gcNIDToUser[gcLogin.GcNID] = user; Logger.Info($"user:{user.gcNID} was created"); return(user); }
public ErrorCode SynUserSNSList(ulong guidFriends, RelationShip type) { GSToGC.NotifyUserSNSList notifyUserSNSList = new GSToGC.NotifyUserSNSList(); if (guidFriends != 0) { CSUser user = CS.instance.userMgr.GetUser(guidFriends); if (null == user) { return(ErrorCode.UserNotExist); } GSToGC.SNSInfo info = new GSToGC.SNSInfo { Type = ( int )type, Nickname = user.nickname, Headid = user.headID, Status = ( int )user.userPlayingStatus, Guididx = (guidFriends), Viplv = ( uint )user.userDbData.usrDBData.un16VipLv }; notifyUserSNSList.Info.Add(info); } else { if (RelationShip.Friends == type) { foreach (KeyValuePair <ulong, UserRelationshipInfo> kv in this.userDbData.friendListMap) { GSToGC.SNSInfo info = new GSToGC.SNSInfo { Type = ( int )type, Guididx = kv.Value.guididx }; CSUser pTempUser = CS.instance.userMgr.GetUser(kv.Value.guididx); if (null != pTempUser) { info.Headid = (pTempUser.headID); info.Nickname = (pTempUser.nickname); info.Status = ( int )(pTempUser.userPlayingStatus); info.Viplv = ( uint )(pTempUser.userDbData.usrDBData.un16VipLv); } else { info.Headid = (kv.Value.nHeadId); info.Nickname = (kv.Value.stNickName); info.Status = ( int )(UserPlayingStatus.OffLine); info.Viplv = (kv.Value.viplv); } notifyUserSNSList.Info.Add(info); } } else { foreach (KeyValuePair <ulong, UserRelationshipInfo> kv in this.userDbData.blackListMap) { CSUser pTempUser = CS.instance.userMgr.GetUser(kv.Value.guididx); GSToGC.SNSInfo info = new GSToGC.SNSInfo { Type = ( int )(type), Headid = (kv.Value.nHeadId), Guididx = (kv.Value.guididx), Nickname = null != pTempUser ? pTempUser.nickname : kv.Value.stNickName }; notifyUserSNSList.Info.Add(info); } } } this.PostMsgToGC(notifyUserSNSList, ( int )GSToGC.MsgID.EMsgToGcfromGsNotifyUserSnslist); return(ErrorCode.Success); }