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); } } }