Ejemplo n.º 1
0
 /// <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();
 }
Ejemplo n.º 2
0
 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);
 }
Ejemplo n.º 3
0
        /// <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);
        }
Ejemplo n.º 4
0
        /// <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);
        }
Ejemplo n.º 5
0
 /// <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}");
 }
Ejemplo n.º 6
0
        /// <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);
        }
Ejemplo n.º 7
0
 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() );
 }
Ejemplo n.º 8
0
        /// <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);
            }
        }
Ejemplo n.º 9
0
 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);
 }
Ejemplo n.º 10
0
        /// <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");
            }
        }
Ejemplo n.º 11
0
        /// <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);
        }
Ejemplo n.º 12
0
        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);
        }