Наследование: global::ProtoBuf.IExtensible
Пример #1
0
        private void HandleAccountLoginResult(NodeMessage lobbyMsg)
        {
            GameFrameworkMessage.AccountLoginResult protoData = lobbyMsg.m_ProtoData as GameFrameworkMessage.AccountLoginResult;
            if (null == protoData)
            {
                return;
            }
            GameFrameworkMessage.AccountLoginResult.AccountLoginResultEnum ret = protoData.m_Result;
            ulong userGuid = protoData.m_UserGuid;

            UserNetworkSystem.Instance.IsQueueing = false;
            if (m_HasLoggedOn)  //重连处理
            {
                if (ret == AccountLoginResult.AccountLoginResultEnum.Success)
                {
                    //登录成功,向服务器请求玩家角色
                    m_Guid = userGuid;
                    NodeMessage msg = new NodeMessage(LobbyMessageDefine.RoleEnter, m_AccountId);
                    GameFrameworkMessage.RoleEnter protoMsg = new GameFrameworkMessage.RoleEnter();
                    msg.m_ProtoData = protoMsg;
                    SendMessage(msg);
                }
                else if (ret == AccountLoginResult.AccountLoginResultEnum.Queueing ||
                         ret == AccountLoginResult.AccountLoginResultEnum.QueueFull ||
                         ret == AccountLoginResult.AccountLoginResultEnum.Wait)
                {
                    Disconnect();
                }
                else
                {
                    //PluginFramework.Instance.ReturnToLogin();
                }
            }
            else    //首次登录处理
            {
                if (ret == AccountLoginResult.AccountLoginResultEnum.Success)
                {
                    m_Guid = userGuid;
                    //登录成功,向服务器请求玩家角色
                    NodeMessage msg = new NodeMessage(LobbyMessageDefine.RoleEnter, m_AccountId);
                    GameFrameworkMessage.RoleEnter protoMsg = new GameFrameworkMessage.RoleEnter();
                    protoMsg.m_Nickname = string.Empty;
                    msg.m_ProtoData     = protoMsg;
                    SendMessage(msg);
                }
                else if (ret == AccountLoginResult.AccountLoginResultEnum.FirstLogin)
                {
                    //账号首次登录,需要指定昵称
                    m_Guid = userGuid;
                    RequestNickname();
                }
                else if (ret == AccountLoginResult.AccountLoginResultEnum.Wait)
                {
                    //同时登录人太多,需要等待一段时间后再登录
                    PluginFramework.Instance.HighlightPrompt("Tip_TooManyPeople");
                }
                else if (ret == AccountLoginResult.AccountLoginResultEnum.Banned)
                {
                    //账号已被封停,禁止登录
                }
                else if (ret == AccountLoginResult.AccountLoginResultEnum.Queueing)
                {
                    PluginFramework.Instance.HighlightPrompt("Tip_Queueing");
                    UserNetworkSystem.Instance.IsQueueing  = true;
                    UserNetworkSystem.Instance.QueueingNum = -1;
                }
                else if (ret == AccountLoginResult.AccountLoginResultEnum.QueueFull)
                {
                    //排队满
                    StopLoginLobby();
                    PluginFramework.Instance.HighlightPrompt("Tip_QueueFull");
                }
                else
                {
                    //账号登录失败
                    PluginFramework.Instance.HighlightPrompt("Tip_AccountLoginFailed");
                }
            }
        }
 internal void DoAccountLoginWithoutQueueing(string accountId, string password, string clientInfo, string nodeName)
 {
     AccountInfo accountInfo = m_AccountSystem.FindAccountById(accountId);
     if (accountInfo == null) {
         //当前accountId不在线
         accountInfo = new AccountInfo();
         accountInfo.AccountId = accountId;
         accountInfo.Password = password;
         accountInfo.ClientInfo = clientInfo;
         accountInfo.NodeName = nodeName;
         accountInfo.CurrentState = AccountState.Unloaded;
         accountInfo.UserGuid = UserServer.Instance.GlobalProcessThread.GenerateUserGuid();
         var dsThread = UserServer.Instance.DataCacheThread;
         if (dsThread.DataStoreAvailable == true) {
             m_AccountSystem.AddAccountById(accountId, accountInfo);
             LogSys.Log(LOG_TYPE.INFO, ConsoleColor.Green, "LoginStep_4: Load account from DataStore . AccountId:{0}", accountId);
             dsThread.DispatchAction(dsThread.DSPLoadAccount, accountId);
         } else {
             accountInfo.CurrentState = AccountState.Online;
             m_AccountSystem.AddAccountById(accountId, accountInfo);
             LogSys.Log(LOG_TYPE.INFO, "Account login success. Account:{0}", accountId);
             NodeMessage replyMsg = new NodeMessage(LobbyMessageDefine.AccountLoginResult, accountId);
             GameFrameworkMessage.AccountLoginResult protoMsg = new GameFrameworkMessage.AccountLoginResult();
             protoMsg.m_AccountId = accountId;
             protoMsg.m_Result = AccountLoginResult.AccountLoginResultEnum.FirstLogin;
             protoMsg.m_UserGuid = accountInfo.UserGuid;
             replyMsg.m_ProtoData = protoMsg;
             NodeMessageDispatcher.SendNodeMessage(nodeName, replyMsg);
         }
     } else {
         //当前账号在线
         if (accountInfo.CurrentState == AccountState.Dropped || clientInfo == accountInfo.ClientInfo) {
             //账号处在离线状态或同一设备重复登录,登录成功
             LogSys.Log(LOG_TYPE.INFO, ConsoleColor.Green, "LoginStep_5a: Account is dropped. Login SUCCESS. AccountId:{0}", accountId);
             accountInfo.AccountId = accountId;
             accountInfo.Password = password;
             accountInfo.ClientInfo = clientInfo;
             accountInfo.NodeName = nodeName;
             accountInfo.CurrentState = AccountState.Online;
             NodeMessage replyMsg = new NodeMessage(LobbyMessageDefine.AccountLoginResult, accountId);
             GameFrameworkMessage.AccountLoginResult protoMsg = new GameFrameworkMessage.AccountLoginResult();
             protoMsg.m_AccountId = accountId;
             if (null != GetUserInfo(accountInfo.UserGuid))
                 protoMsg.m_Result = AccountLoginResult.AccountLoginResultEnum.Success;
             else
                 protoMsg.m_Result = AccountLoginResult.AccountLoginResultEnum.FirstLogin;
             protoMsg.m_UserGuid = accountInfo.UserGuid;
             replyMsg.m_ProtoData = protoMsg;
             NodeMessageDispatcher.SendNodeMessage(nodeName, replyMsg);
         } else {
             //账号在别的设备上登录,登录失败
             LogSys.Log(LOG_TYPE.INFO, ConsoleColor.Yellow, "LoginStep_5b: Account is online. Login FAILED. AccountId:{0}", accountId);
             NodeMessage replyMsg = new NodeMessage(LobbyMessageDefine.AccountLoginResult, accountId);
             GameFrameworkMessage.AccountLoginResult protoMsg = new GameFrameworkMessage.AccountLoginResult();
             protoMsg.m_AccountId = accountId;
             protoMsg.m_Result = AccountLoginResult.AccountLoginResultEnum.AlreadyOnline;
             replyMsg.m_ProtoData = protoMsg;
             NodeMessageDispatcher.SendNodeMessage(nodeName, replyMsg);
         }
     }
 }
 internal void DSPLoadAccountCallback(string accountId, Msg_DL_LoadResult ret)
 {
     AccountInfo accountInfo = m_AccountSystem.FindAccountById(accountId);
     if (accountInfo == null) {
         return;
     }
     NodeMessage replyMsg = new NodeMessage(LobbyMessageDefine.AccountLoginResult, accountId);
     GameFrameworkMessage.AccountLoginResult protoMsg = new GameFrameworkMessage.AccountLoginResult();
     protoMsg.m_AccountId = accountId;
     protoMsg.m_Result = AccountLoginResult.AccountLoginResultEnum.Error;
     try {
         if (ret.ErrorNo == Msg_DL_LoadResult.ErrorNoEnum.Success) {
             foreach (var result in ret.Results) {
                 object _msg;
                 if (DbDataSerializer.Decode(result.Data, DataEnum2Type.Query(result.MsgId), out _msg)) {
                     DataEnum msgEnum = (DataEnum)result.MsgId;
                     switch (msgEnum) {
                         case DataEnum.TableAccount:
                             accountInfo.TableAccount.FromProto(_msg as TableAccount);
                             break;
                         default:
                             LogSys.Log(LOG_TYPE.ERROR, ConsoleColor.Red, "Decode account data ERROR. Wrong message id. Account:{0}, WrongId:{1}", result.PrimaryKeys[0], msgEnum);
                             break;
                     }
                 }
             }
             if (accountInfo.TableAccount.IsBanned) {
                 //账号被封停
                 protoMsg.m_Result = AccountLoginResult.AccountLoginResultEnum.Banned;
             } else {
                 accountInfo.CurrentState = AccountState.Online;
                 accountInfo.LastLoginTime = TimeUtility.CurTimestamp;
                 m_AccountSystem.AddAccountById(accountId, accountInfo);
                 LogSys.Log(LOG_TYPE.INFO, ConsoleColor.Green, "LoginStep_4a: Account login SUCCESS . AccountId:{0}, LogicServerId:{1}, AccountId:{2}", accountId, 0, accountId);
                 protoMsg.m_Result = AccountLoginResult.AccountLoginResultEnum.Success;
                 protoMsg.m_UserGuid = accountInfo.UserGuid;
             }
         } else if (ret.ErrorNo == Msg_DL_LoadResult.ErrorNoEnum.NotFound) {
             //账号首次进入游戏
             LogSys.Log(LOG_TYPE.INFO, ConsoleColor.Green, "LoginStep_4b: Load account NotFound . AccountId:{0}, LogicServerId:{1}, AccountId:{2}", accountId, 0, accountId);
             accountInfo.CurrentState = AccountState.Online;
             accountInfo.TableAccount.AccountId = accountId;
             accountInfo.TableAccount.IsBanned = false;
             m_AccountSystem.AddAccountById(accountId, accountInfo);
             protoMsg.m_Result = AccountLoginResult.AccountLoginResultEnum.FirstLogin;
             protoMsg.m_UserGuid = accountInfo.UserGuid;
             //norm log
             accountInfo.LastLoginTime = TimeUtility.CurTimestamp;
         } else {
             //数据加载失败
             LogSys.Log(LOG_TYPE.INFO, ConsoleColor.Yellow, "LoginStep_4c: Load account FAILED . AccountId:{0}, LogicServerId:{1}, AccountId:{2}", accountId, 0, accountId);
         }
     } catch (Exception ex) {
         LogSys.Log(LOG_TYPE.INFO, ConsoleColor.Red, "ERROR LoginStep_4d. AccountId:{0}, LogicServerId:{1}, AccountId:{2}\nERROR Message:{3}\nStackTrace:{4}",
                     accountId, 0, accountId, ex.Message, ex.StackTrace);
     } finally {
         if (protoMsg.m_Result != AccountLoginResult.AccountLoginResultEnum.Success && protoMsg.m_Result != AccountLoginResult.AccountLoginResultEnum.FirstLogin) {
             m_AccountSystem.RemoveAccountById(accountId);
         }
         replyMsg.m_ProtoData = protoMsg;
         NodeMessageDispatcher.SendNodeMessage(accountInfo.NodeName, replyMsg);
     }
 }
        //--------------------------------------------------------------------------------------------------------------------------
        //供GM消息调用的方法,实际执行线程是在线程池的某个线程里执行,实现时需要注意并发问题,需要加锁的加锁。
        //逻辑功能不要直接调用此类处理(会有gm权限判断,正式服会导致功能失效),应该调用逻辑上一个功能相同的方法(通常以Do开头命名)。
        //--------------------------------------------------------------------------------------------------------------------------
        //--------------------------------------------------------------------------------------------------------------------------
        //供外部通过QueueAction调用的方法,实际执行线程是在线程池的某个线程里执行,实现时需要注意并发问题,需要加锁的加锁。
        //--------------------------------------------------------------------------------------------------------------------------
        //登录流程相关方法
        internal void DoAccountLogin(string accountId, string password, string clientInfo, string nodeName)
        {
            AccountInfo accountInfo = m_AccountSystem.FindAccountById(accountId);
            QueueingThread queueingThread = UserServer.Instance.QueueingThread;
            if (null != accountInfo || !queueingThread.NeedQueueing()) {
                LogSys.Log(LOG_TYPE.INFO, ConsoleColor.Green, "LoginStep_3a: DoLogin without queueing. AccountId:{0}", accountId);
                DoAccountLoginWithoutQueueing(accountId, password, clientInfo, nodeName);
            } else {
                if (queueingThread.IsQueueingFull()) {
                    LogSys.Log(LOG_TYPE.INFO, ConsoleColor.Yellow, "LoginStep_3b1: Start queueing but queue full. AccountId:{0}", accountId);

                    NodeMessage replyMsg = new NodeMessage(LobbyMessageDefine.AccountLoginResult, accountId);
                    GameFrameworkMessage.AccountLoginResult protoMsg = new GameFrameworkMessage.AccountLoginResult();
                    protoMsg.m_AccountId = accountId;
                    protoMsg.m_Result = AccountLoginResult.AccountLoginResultEnum.QueueFull;
                    replyMsg.m_ProtoData = protoMsg;
                    NodeMessageDispatcher.SendNodeMessage(nodeName, replyMsg);
                } else {
                    LogSys.Log(LOG_TYPE.INFO, ConsoleColor.Yellow, "LoginStep_3b2: Start queueing. AccountId:{0}", accountId);

                    queueingThread.QueueAction(queueingThread.StartQueueing, accountId, password, clientInfo, nodeName);
                    NodeMessage replyMsg = new NodeMessage(LobbyMessageDefine.AccountLoginResult, accountId);
                    GameFrameworkMessage.AccountLoginResult protoMsg = new GameFrameworkMessage.AccountLoginResult();
                    protoMsg.m_AccountId = accountId;
                    protoMsg.m_Result = AccountLoginResult.AccountLoginResultEnum.Queueing;
                    replyMsg.m_ProtoData = protoMsg;
                    NodeMessageDispatcher.SendNodeMessage(nodeName, replyMsg);
                }
            }
        }