using System.Collections; using System.Collections.Generic; using UnityEngine; using LitJson; using System; public class ServerListCenter : Singleton { public static readonly string[] JUMP_URL = new string[] { "http://gamecenter.secondworld.net.cn:11000/center/server_list.php/?" }; public static string SERVERLIST_URL_COMMON = ""; public static string SERVERLIST_URL_PLAYER = ""; public ServerInfoPlayer serverInfoPlayer { get; private set; } public ServerInfoCommon serverInfoCommon { get; private set; } ServerData m_CurrentServer; public ServerData currentServer { get { return m_CurrentServer; } set { m_CurrentServer = value; m_SelectedServer = true; localSaveServerId = m_CurrentServer.region_flag; if (serverSelectEvent != null) { serverSelectEvent(); } } } string m_CurrentServerGroup = string.Empty; public string currentServerGroup { get { return m_CurrentServerGroup; } set { if (m_CurrentServerGroup != value) { m_CurrentServerGroup = value; if (serverGroupSelectEvent != null) { serverGroupSelectEvent(); } } } } bool m_SelectedServer = false; bool serverListPlayerPartGot = false; bool serverListCommonPartGot = false; public bool serverListGot { get { return serverListCommonPartGot; } } string accountNameBuf; private string serverUrl; public event Action onServerListRefreshEvent; public event Action serverGroupSelectEvent; public event Action serverSelectEvent; const string LOGIN_SERVER = "LoginServer"; public int localSaveServerId { get { return LocalSave.GetInt(LOGIN_SERVER); } set { LocalSave.SetInt(LOGIN_SERVER, value); } } int jumpUrlIndex = 0; //从有数据的服务器列表 或者 总列表获取 public ServerData GetServerData(int _id) { if (serverInfoPlayer != null && serverInfoPlayer.player != null && serverInfoPlayer.player.group_list != null) { var serverGroup = serverInfoPlayer.player; for (int i = 0; i < serverGroup.group_list.Length; i++) { var serverData = serverGroup.group_list[i]; if (serverData.region_flag == _id) { return serverData; } } } if (serverInfoPlayer != null && serverInfoPlayer.gametest != null && serverInfoPlayer.gametest.group_list != null) { var serverGroup = serverInfoPlayer.gametest; for (int i = 0; i < serverGroup.group_list.Length; i++) { var serverData = serverGroup.group_list[i]; if (serverData.region_flag == _id) { return serverData; } } } if (serverInfoCommon == null) { return default(ServerData); } else { if (serverInfoCommon.common != null) { for (int i = 0; i < serverInfoCommon.common.Length; i++) { var group = serverInfoCommon.common[i]; for (int j = 0; j < group.group_list.Length; j++) { var serverData = group.group_list[j]; if (serverData.region_flag == _id) { return serverData; } } } } } return default(ServerData); } //从总服务器列表获取 public ServerData GetServerDataEx(int _id) { if (serverInfoCommon == null) { return default(ServerData); } else { if (serverInfoCommon.common != null) { for (int i = 0; i < serverInfoCommon.common.Length; i++) { var group = serverInfoCommon.common[i]; for (int j = 0; j < group.group_list.Length; j++) { var serverData = group.group_list[j]; if (serverData.region_flag == _id) { return serverData; } } } } } return default(ServerData); } public string GetServerName(int id, bool defaultName = true) { var data = GetServerDataEx(id); if (string.IsNullOrEmpty(data.name)) { if (defaultName) return "S" + id; return ""; } return data.name.Replace("@gm", ""); } public void RequestJumpUrl() { if (VersionUtility.Instance.InIosAuditTime()) { return; } var url = StringUtility.Contact(JUMP_URL[0], "game=xbqy&flag=", VersionConfig.Get().appId, "_", VersionConfig.Get().branch, "_", VersionConfig.Get().version); jumpUrlIndex++; serverUrl = url; Debug.Log("http地址:serverlist " + url); HttpRequest.Instance.RequestHttpGet(url, HttpRequest.defaultHttpContentType, 1, OnRequestJumpUrl); } private void OnRequestJumpUrl(bool _ok, string _result) { if (_ok) { var serverUrls = _result.Split(new string[] { "||" }, StringSplitOptions.RemoveEmptyEntries); SERVERLIST_URL_COMMON = serverUrls[0]; SERVERLIST_URL_PLAYER = serverUrls[1]; RequestServerList(); } else { Debug.Log("http 数据通讯: ServerlistCenter:" + serverUrl + " result:" + _result); //BuglyAgent.ReportException(new System.Exception(), "http 数据通讯: ServerlistCenter:" + serverUrl + " result:" + _result); Clock.AlarmAt(DateTime.Now + new TimeSpan(TimeSpan.TicksPerSecond), RequestJumpUrl); } } public void RequestServerList() { serverListCommonPartGot = false; serverListPlayerPartGot = false; RequestServerCommonList(); if (VersionConfig.Get().versionAuthority == VersionAuthority.InterTest) { var localSaveAccountName = LocalSave.GetString(LoginManager.USER_ACCOUNT); RequestServerListPlayer(localSaveAccountName); } } public void RequestServerCommonList() { HttpRequest.Instance.RequestHttpGet(SERVERLIST_URL_COMMON, HttpRequest.defaultHttpContentType, 1, OnGetServerList); } private void OnGetServerList(bool _ok, string _result) { if (_ok) { Debug.LogError(" OnGetServerList " + _result); ServerListParser.Instance.PushCommonServerListRawData(_result); NetLinkWin.Hide(); } else { Clock.AlarmAt(DateTime.Now + new TimeSpan(TimeSpan.TicksPerSecond), RequestServerCommonList); } } public void SetServerlistCommon(ServerInfoCommon common) { serverInfoCommon = common; serverInfoCommon.recommend = new ServerGroup(); // serverInfoCommon.recommend.group_title = "TODO"//Language.GetFromLocal(18); var recommendServers = new List(); for (int i = 0; i < serverInfoCommon.common.Length; i++) { var serverList = serverInfoCommon.common[i].group_list; foreach (var server in serverList) { if (server.is_recommend == 1) { recommendServers.Add(server); } } } List prints = FieldPrint.PrintFieldsExpand(serverInfoCommon.common[0], true); for (int i = 0; i < prints.Count; i++) { Debug.LogError($"index : {i} " + prints[i]); } serverInfoCommon.recommend.group_list = recommendServers.ToArray(); FiltrateDefaultServerAndServerGroup(); serverListCommonPartGot = true; if (onServerListRefreshEvent != null) { onServerListRefreshEvent(); } } public void RequestServerListPlayer(string _accountName) { if (VersionUtility.Instance.InIosAuditTime()) { return; } accountNameBuf = _accountName; var url = string.Empty; var tables = new Dictionary(); if (string.IsNullOrEmpty(_accountName)) { url = SERVERLIST_URL_PLAYER; return; } else { tables["player"] = _accountName; tables["lang"] = "vi"; url = StringUtility.Contact(SERVERLIST_URL_PLAYER, "&", HttpRequest.HashtablaToString(tables)); } HttpRequest.Instance.RequestHttpGet(url, HttpRequest.defaultHttpContentType, 1, OnGetServerListPlayer); } private void OnGetServerListPlayer(bool _ok, string _result) { if (_ok) { serverListPlayerPartGot = true; ServerListParser.Instance.PushPlayerServerListRawData(_result); } else { // if (StageLoad.Instance.currentStage == null || StageLoad.Instance.currentStage is LoginStage) // { Clock.AlarmAt(DateTime.Now + new TimeSpan(TimeSpan.TicksPerSecond), () => { RequestServerListPlayer(accountNameBuf); }); // } } } public void SetServerListPlayer(ServerInfoPlayer serverInfoPlayer) { this.serverInfoPlayer = serverInfoPlayer; ProcessRecentServerData(); FiltrateDefaultServerAndServerGroup(); } public bool TryGetServerGroup(string _key, out ServerGroup _group) { if (serverInfoPlayer != null && serverInfoPlayer.player != null && _key == serverInfoPlayer.player.group_title) { _group = serverInfoPlayer.player; return true; } else if (serverInfoPlayer != null && serverInfoPlayer.gametest != null && _key == serverInfoPlayer.gametest.group_title) { _group = serverInfoPlayer.gametest; return true; } else if (serverInfoCommon != null && serverInfoCommon.recommend != null && _key == serverInfoCommon.recommend.group_title) { _group = serverInfoCommon.recommend; return true; } else { for (int i = 0; i < serverInfoCommon.common.Length; i++) { if (_key == serverInfoCommon.common[i].group_title) { _group = serverInfoCommon.common[i]; return true; } } } _group = null; return false; } // public void ParseServerLocalServerList() // { // serverListCommonPartGot = true; // var configs = LoginSeverListConfig.GetValues(); // var count = configs.Count; // serverInfoCommon = new ServerInfoCommon(); // serverInfoCommon.common = new ServerGroup[1]; // serverInfoCommon.common[0] = new ServerGroup(); // serverInfoCommon.common[0].group_title = Language.Get("IOSShenhe"); // serverInfoCommon.common[0].group_list = new ServerData[count]; // for (var i = 0; i < count; i++) // { // var config = configs[i]; // serverInfoCommon.common[0].group_list[i] = new ServerData(config); // } // FiltrateDefaultServerAndServerGroup(); // if (onServerListRefreshEvent != null) // { // onServerListRefreshEvent(); // } // } public List GetAllServerGroup() { var serverGroupTitles = new List(); if (serverInfoPlayer != null && serverInfoPlayer.player != null) { serverGroupTitles.Add(serverInfoPlayer.player.group_title); } if (serverInfoPlayer != null && serverInfoPlayer.gametest != null) { serverGroupTitles.Add(serverInfoPlayer.gametest.group_title); } if (serverInfoCommon != null && serverInfoCommon.recommend != null && serverInfoCommon.recommend.group_list.Length > 0) { serverGroupTitles.Add(serverInfoCommon.recommend.group_title); } for (int i = 0; i < serverInfoCommon.common.Length; i++) { serverGroupTitles.Add(serverInfoCommon.common[i].group_title); } return serverGroupTitles; } private void ProcessRecentServerData() { if (serverInfoPlayer != null && serverInfoPlayer.player != null && serverInfoPlayer.player.group_list != null) { var group = new List(serverInfoPlayer.player.group_list); for (int i = group.Count - 1; i >= 0; i--) { ServerData serverData; if (!serverInfoPlayer.player.FindServerData(group[i].region_flag, out serverData)) { group.RemoveAt(i); } else { var originalData = group[i]; group[i] = new ServerData() { region_flag = serverData.region_flag, name = serverData.name, running_status = serverData.running_status, statue = serverData.statue, is_recommend = serverData.is_recommend, region_domain = serverData.region_domain, login_port = serverData.login_port, game_port = serverData.game_port, start_date = serverData.start_date, job = originalData.job, roleid = originalData.roleid, level = originalData.level, last_login_time = originalData.last_login_time }; } } group.Sort(ServerData.LastLoginTimeCompare); serverInfoPlayer.player.group_list = group.ToArray(); } } //如果已经登录过游戏返回的需要重新请求一次登录列表 //这边请求用的是旧账号,sdk登录成功会用新账号请求一次,内网登录需要手动点击一次服务器列表刷新 public void RequestPlayerServerList() { if (LoginManager.Instance.isLogined) { var account = LoginManager.Instance.localSaveAccountName; if (string.IsNullOrEmpty(account)) return; //要用新账号请求 RequestServerListPlayer(LoginManager.Instance.localSaveAccountName); } } //请求先后顺序 //1.公共列表 获取上一次登陆服,记录下来;当第二次获得 打开服务器列表界面的情况不刷新 //2.玩家列表刷新 若有玩家信息,查找上一次玩家登陆服,没有默认选一个;若没有玩家信息 默认选公共服 //此处耦合度比较高 需谨慎修改 //1.请求发公共列表和最近服 是先后顺序刷新 //2.服务器列表界面刷新逻辑没做好,serverGroupSelectEvent的调用直接决定了界面显示 public void FiltrateDefaultServerAndServerGroup() { if (LoginManager.Instance.isLogined) { return; } if (serverInfoCommon != null) { var findTarget = false; for (int i = 0; i < serverInfoCommon.common.Length; i++) { var serverDatas = serverInfoCommon.common[i].group_list; for (int j = 0; j < serverDatas.Length; j++) { if (localSaveServerId == serverDatas[j].region_flag) { findTarget = true; currentServer = serverDatas[j]; if (string.IsNullOrEmpty(currentServerGroup)) { currentServerGroup = serverInfoCommon.common[i].group_title; } else { serverGroupSelectEvent?.Invoke(); } break; } } if (findTarget) { break; } } if (!findTarget) { if (serverInfoPlayer != null && serverInfoPlayer.player != null && serverInfoPlayer.player.group_list != null && serverInfoPlayer.player.group_list.Length > 0) { if (string.IsNullOrEmpty(currentServer.name)) { var serverDatas = serverInfoPlayer.player.group_list; for (int j = 0; j < serverDatas.Length; j++) { if (localSaveServerId == serverDatas[j].region_flag) { findTarget = true; currentServer = serverDatas[j]; if (string.IsNullOrEmpty(currentServerGroup)) { currentServerGroup = serverInfoPlayer.player.group_title; } else { serverGroupSelectEvent?.Invoke(); } break; } } if (!findTarget) { currentServer = serverInfoPlayer.player.group_list[0]; currentServerGroup = serverInfoPlayer.player.group_title; } } else { serverGroupSelectEvent?.Invoke(); } return; } var serverGroup = serverInfoCommon.common[serverInfoCommon.common.Length - 1]; var serverList = new List(serverGroup.group_list); serverList.Sort(ServerData.Compare); currentServer = serverList[0]; currentServerGroup = serverGroup.group_title; } } } }