示例#1
0
        public override int ProcessCLogin(CLogin protocol)
        {
            Session session = Session.Get(protocol);

            SLogin result = new SLogin();

            result.Argument.RoleId = protocol.Argument.RoleId;

            BAccount account = _taccount.Get(session.Account);

            if (null == account)
            {
                result.ResultCode = 1;
                session.SendResponse(result);
                return(Zeze.Transaction.Procedure.LogicError);
            }
            account.LastLoginRoleId = protocol.Argument.RoleId;
            BRoleData role = _trole.Get(protocol.Argument.RoleId);

            if (null == role)
            {
                result.ResultCode = 2;
                session.SendResponse(result);
                return(Zeze.Transaction.Procedure.LogicError);
            }

            BOnline online = _tonline.GetOrAdd(protocol.Argument.RoleId);

            online.RoleId       = protocol.Argument.RoleId; // 对于同一个 session,允许重复登录 role,直接覆盖
            online.SessionId    = session.SessionId;
            session.LoginRoleId = protocol.Argument.RoleId;
            session.SendResponse(result);
            return(Zeze.Transaction.Procedure.Success);
        }
示例#2
0
        public override int ProcessGetRoleListRequest(GetRoleList rpc)
        {
            Session session = Session.Get(rpc);

            BAccount account = _taccount.Get(session.Account);

            if (null != account)
            {
                foreach (var roleId in account.Roles)
                {
                    BRoleData roleData = _trole.Get(roleId);
                    if (null != roleData)
                    {
                        rpc.Result.RoleList.Add(new BRole()
                        {
                            Id   = roleId,
                            Name = roleData.Name
                        });
                    }
                }
                rpc.Result.LastLoginRoleId = account.LastLoginRoleId;
            }

            session.SendResponse(rpc);
            return(Procedure.Success);
        }
示例#3
0
        public override int ProcessReLoginRequest(ReLogin rpc)
        {
            Session session = Session.Get(rpc);

            BAccount account = _taccount.Get(session.Account);

            if (null == account)
            {
                return(ReturnCode(ResultCodeAccountNotExist));
            }

            if (account.LastLoginRoleId != rpc.Argument.RoleId)
            {
                return(ReturnCode(ResultCodeNotLastLoginRoleId));
            }

            BRoleData role = _trole.Get(rpc.Argument.RoleId);

            if (null == role)
            {
                return(ReturnCode(ResultCodeRoleNotExist));
            }

            BOnline online = _tonline.Get(rpc.Argument.RoleId);

            if (null == online)
            {
                return(ReturnCode(ResultCodeOnlineDataNotFound));
            }

            online.LinkName = session.LinkName;
            online.LinkSid  = session.SessionId;
            online.State    = BOnline.StateOnline;

            // 先发结果,再发送同步数据(ReliableNotifySync)。
            // 都使用 WhileCommit,如果成功,按提交的顺序发送,失败全部不会发送。
            session.SendResponseWhileCommit(rpc);
            Transaction.Current.RunWhileCommit(() =>
            {
                var setUserState = new gnet.Provider.SetUserState();
                setUserState.Argument.LinkSid = session.SessionId;
                setUserState.Argument.States.Add(rpc.Argument.RoleId);
                rpc.Sender.Send(setUserState); // 直接使用link连接。
            });

            var syncResultCode = ReliableNotifySync(
                session, rpc.Argument.ReliableNotifyConfirmCount,
                online);

            if (syncResultCode != ResultCodeSuccess)
            {
                return(ReturnCode((ushort)syncResultCode));
            }

            App.Load.LoginCount.IncrementAndGet();
            return(Procedure.Success);
        }
示例#4
0
        public override int ProcessLoginRequest(Login rpc)
        {
            Session session = Session.Get(rpc);

            BAccount account = _taccount.Get(session.Account);

            if (null == account)
            {
                return(ReturnCode(ResultCodeAccountNotExist));
            }

            account.LastLoginRoleId = rpc.Argument.RoleId;
            BRoleData role = _trole.Get(rpc.Argument.RoleId);

            if (null == role)
            {
                return(ReturnCode(ResultCodeRoleNotExist));
            }

            BOnline online = _tonline.GetOrAdd(rpc.Argument.RoleId);

            online.LinkName = session.LinkName;
            online.LinkSid  = session.SessionId;
            online.State    = BOnline.StateOnline;

            online.ReliableNotifyConfirmCount = 0;
            online.ReliableNotifyTotalCount   = 0;
            online.ReliableNotifyMark.Clear();
            online.ReliableNotifyQueue.Clear();

            var linkSession = session.Link.UserState as Game.Server.LinkSession;

            online.ProviderId        = App.Zeze.Config.AutoKeyLocalId;
            online.ProviderSessionId = linkSession.ProviderSessionId;

            // 先提交结果再设置状态。
            // see linkd::gnet.Provider.ModuleProvider。ProcessBroadcast
            session.SendResponseWhileCommit(rpc);
            Transaction.Current.RunWhileCommit(() =>
            {
                var setUserState = new gnet.Provider.SetUserState();
                setUserState.Argument.LinkSid = session.SessionId;
                setUserState.Argument.States.Add(rpc.Argument.RoleId);
                rpc.Sender.Send(setUserState); // 直接使用link连接。
            });
            App.Load.LoginCount.IncrementAndGet();
            return(Procedure.Success);
        }
示例#5
0
        public override int ProcessCGetRoleList(CGetRoleList protocol)
        {
            Session session = Session.Get(protocol);

            SGetRoleList result  = new SGetRoleList();
            BAccount     account = _taccount.Get(session.Account);

            foreach (var roleId in account.Roles)
            {
                BRoleData roleData = _trole.Get(roleId);
                if (null != roleData)
                {
                    result.Argument.RoleList.Add(new BRole()
                    {
                        Id = roleId, Name = roleData.Name
                    });
                }
            }
            result.Argument.LastLoginRoleId = account.LastLoginRoleId;

            session.SendResponse(result);
            return(Zeze.Transaction.Procedure.Success);
        }