using System.Collections;
|
using System.Collections.Generic;
|
using UnityEngine;
|
using LitJson;
|
using System;
|
|
public class ServerListCenter : Singleton<ServerListCenter>
|
|
{
|
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)
|
{
|
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<ServerData>();
|
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<string> prints = FieldPrint.PrintFieldsExpand(serverInfoCommon.common[0], true);
|
|
// for (int i = 0; i < prints.Count; i++)
|
// {
|
// Debug.Log($"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<string, string>();
|
|
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<string> GetAllServerGroup()
|
{
|
var serverGroupTitles = new List<string>();
|
|
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<ServerData>(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<ServerData>(serverGroup.group_list);
|
serverList.Sort(ServerData.Compare);
|
currentServer = serverList[0];
|
currentServerGroup = serverGroup.group_title;
|
}
|
|
}
|
|
}
|
|
}
|