Files
Main/Assets/GameAssets/Resources/Lua/Logic/ServerList/ServerListSystem.lua

540 lines
20 KiB
Lua
Raw Normal View History

2025-01-25 04:38:09 +08:00
------------------------------------------------
-- 作者: gzg
-- 日期: 2021-02-25
-- 文件: ServerListSystem.lua
-- 模块: ServerListSystem
-- 描述: 服务器列表的信息
------------------------------------------------
local LoginStatus = require("Logic.Login.LoginStatus");
local ServerUrlInfo = require("Logic.ServerList.ServerUrlInfo");
local ServerDataInfo = require("Logic.ServerList.ServerDataInfo");
local ServerGroupInfo = require("Logic.ServerList.ServerGroupInfo");
local ServerCharInfo = require("Logic.ServerList.ServerCharInfo");
local SDKCacheData = CS.Thousandto.CoreSDK.SDKCacheData;
local L_MAX_SHOW_SERVER_GROUP = 50;
local L_CN_RECENT_SERVER_KEY = "RecentServerKey";
local ServerListSystem = {
--通过远程获得所有服务器的列表
AllList = List:New();
--所有网关的列表
AllAgentList = List:New();
--曾经登录过的服务器列表
RecentLoginList = List:New(),
--推荐服务器列表
RecommendList = List:New(),
--存在角色的服务器列表
ExistRoleList = List:New(),
--获得维护的服务器列表
MaintenanceList = List:New(),
--登录服务器
LoginServer = nil,
--最后一次登录的服务器
LastEnterServer = nil,
--服务器分组
GroupedList = List:New(),
--玩家手动选择的服务器
ChooseGameServerID = -1,
--服务器列表下载标记:-1:没有下载, 0:开始下载, >0:成功下载某列表
DownloadFlag = -1,
--服务器下载地址信息
ServerUrlInfo = nil,
--游戏服务器列表下载完毕回调句柄
--OnGsServerDownloadFinishHandler = nil,
--登录服务器列表下载完毕回调句柄
--OnLsServerDownloadFinishHandler = nil,
--服务器列表下载完毕的回调句柄
OnServerDownloadFinishHandler = nil,
--服务器列表下载失败回调句柄
OnDownloadFailHandler = nil,
}
function ServerListSystem:Initialize(clearLoginData)
Debug.Log("ServerListSystem:Initialize:" .. tostring(clearLoginData));
--重新关联事件,因为所有注册事件都会在一个轮回中清理掉.
GameCenter.RegFixEventHandle(LogicEventDefine.EID_EVENT_SDK_LOGIN_SUCCESS,self.DownloadServerList,self);
if clearLoginData then
self.ServerUrlInfo = ServerUrlInfo:New();
--self.OnGsServerDownloadFinishHandler = Utils.Handler(self.OnGsServerDownloadFinish,self,nil,true);
--self.OnLsServerDownloadFinishHandler = Utils.Handler(self.OnLsServerDownloadFinish,self,nil,true);
self.OnServerDownloadFinishHandler = Utils.Handler(self.OnServerDownloadFinish,self,nil,true);
self.OnDownloadFailHandler = Utils.Handler(self.OnDownloadFail,self,nil,true);
end
end
function ServerListSystem:UnInitialize(clearLoginData)
Debug.Log("ServerListSystem:UnInitialize:" .. tostring(clearLoginData));
--重新关联事件,因为所有注册事件都会在一个轮回中清理掉.
GameCenter.UnRegFixEventHandle(LogicEventDefine.EID_EVENT_SDK_LOGIN_SUCCESS,self.DownloadServerList,self);
if clearLoginData then
self.ServerUrlInfo = nil;
self.OnGsServerDownloadFinishHandler = nil;
self.OnLsServerDownloadFinishHandler = nil;
self.OnServerDownloadFinishHandler = nil;
self.OnDownloadFailHandler = nil;
end
end
--清理所有的服务器列表
function ServerListSystem:Clear()
self.AllList:Clear();
self.AllAgentList:Clear();
self.RecentLoginList:Clear();
self.RecommendList:Clear();
self.ExistRoleList:Clear();
self.GroupedList:Clear();
self.LastEnterServer = nil;
self.LoginServer = nil;
end
function ServerListSystem:GetLoginServer()
if not self.LoginServer then
if self.AllAgentList and self.AllAgentList:Count() > 0 then
math.randomseed(os.time());
local _idx = math.random(1,self.AllAgentList:Count());
self.LoginServer = self.AllAgentList[_idx];
else
Debug.LogError("当前网关服务器列表为空!!");
end
end
return self.LoginServer;
end
--下载服务器列表
function ServerListSystem:DownloadServerList()
if self.DownloadFlag >= 0 then
return;
end
self.DownloadFlag = 0;
GameCenter.PushFixEvent(UIEventDefine.UI_WAITING_OPEN, DataConfig.DataMessageString.Get("C_XIAOTIAN_TIPS3"));
GameCenter.PushFixEvent(LogicLuaEventDefine.EID_EVENT_LOGIN_STATUS, LoginStatus.CallServerlist);
--LuaCoroutineUtils.WebRequestText(self.ServerUrlInfo:GetServerListURL(), self.OnGsServerDownloadFinishHandler, self.OnDownloadFailHandler, nil);
--LuaCoroutineUtils.WebRequestText(self.ServerUrlInfo:GetLoginServerURL(), self.OnLsServerDownloadFinishHandler, self.OnDownloadFailHandler, nil);
LuaCoroutineUtils.WebRequestText(self.ServerUrlInfo:GetServerListNewURL(), self.OnServerDownloadFinishHandler, self.OnDownloadFailHandler, nil);
--self:OnGsServerDownloadFinish("{\"data\":{\"servers\":[{\"group_type\":1,\"svr_host\":\"127.0.0.1\",\"svr_id\":\"20017\",\"svr_idx\":\"20017\",\"svr_label\":\"3\",\"svr_name\":\"本地服务器\",\"svr_pay_callback\":\"xxx\",\"svr_port\":8587,\"svr_sort\":3,\"svr_status\":1}]},\"state\":1}");
--self:OnLsServerDownloadFinish("{\"data\":{\"extParams\":{\"svr_private_chids\":\"73|74\",\"svr_port\":8887,\"svr_host\":\"127.0.0.1\",\"svr_name\":\"网关服务器\"}},\"state\":1}");
end
--服务器下载完毕
function ServerListSystem:OnServerDownloadFinish(wwwText)
--去下载充值列表的数据
--GameCenter.PaySystem:DownLoadPayList();
--关闭MessageBox
GameCenter.MsgPromptSystem:CloseMsgBox();
GameCenter.PushFixEvent(LogicEventDefine.EID_EVENT_UPDATE_RECORDER_STEP, { CS.Thousandto.Update.Recorder.StepType.RequestServerList, 0, "Success" });
--如果www不为空,表示通过url进行下载的.
if wwwText ~= nil and wwwText ~= "" then
self:Clear();
self.AllList,self.AllAgentList = ServerDataInfo:ParseServersJsonNew(wwwText);
if self.AllAgentList and self.AllList and self.AllAgentList:Count() > 0 then
self.LoginServer = nil;
Debug.Log("游戏服务器列表下载完毕!downloadFlag = " .. self.DownloadFlag .. ";;服务器列表数量:" .. self.AllList:Count());
GameCenter.LoginSystem:ConnectLoginServer();
else
Debug.LogError("当前服务器列表为空,wwwText:" .. tostring(wwwText));
end
self.DownloadFlag = -1;
else
Debug.LogError("下载游戏服务器列表错误!downloadFlag = " .. self.DownloadFlag);
self.DownloadFlag = -1;
Utils.ShowMsgBoxAndBtn(nil,"C_MSGBOX_OK","C_LOGIN_DOWNLOAD_SERVER_LIST_FAIL");
end
end
--下载失败
function ServerListSystem:OnDownloadFail(errCode, error)
if (errCode <= 0 ) then
--下载失败,彻底失败,退出
GameCenter.PushFixEvent(LogicEventDefine.EID_EVENT_UPDATE_RECORDER_STEP, { CS.Thousandto.Update.Recorder.StepType.RequestServerList, 1, error });
GameCenter.PushFixEvent(UIEventDefine.UI_WAITING_CLOSE);
self.DownloadFlag = -1;
--关闭MessageBox
Utils.ShowMsgBox(function (x)
if (x == MsgBoxResultCode.Button2) then
self:DownloadServerList();
else
GameCenter.SDKSystem:ExitGame();
end
end,"C_GETSERVERLIST_ERROR");
else
--下载失败,正在重试
GameCenter.PushFixEvent(LogicEventDefine.EID_EVENT_UPDATE_RECORDER_STEP, { CS.Thousandto.Update.Recorder.StepType.RequestServerList, 2, error });
end
end
--处理服务器列表
--List<MSG_Login.serverNumInfo> serNumInfos,List<int> existRoleIDs,int lastEnterID,List<MSG_Login.serverChangeName> changeNameList = null)
function ServerListSystem:ProcessServerList(serNumInfos,existRoleIDs,lastEnterID,changeNameList)
--这里注释了通过服务器白名单的剔除工作,现在服务器列表通过用户ID参数直接过滤
--1.如果有改名先给服务器名字替换了
self:UpdateServerNames(changeNameList);
--2.为服务器列表数据,增加服务器的其他数据
self:UpdateServerNums(serNumInfos);
--3.处理存在角色的服务器
self:UpdateExistRoleServer(existRoleIDs);
--4.处理推荐服务器
self:ProcessRecommendServer();
--5.处理最后一次登录的服务器
self:ProcessLastEnterServer(lastEnterID);
--6.处理最近登录的服务器列表
self:ProcessRecentServer();
--7.处理服务器分组
self:ProcessGroupedServerList(L_MAX_SHOW_SERVER_GROUP);
--8.处理维护的服务器列表
self:ProcessMaintenanceServerList();
--9.处理默认的当前服务器
local _defaultCurSer = self:GetCurrentServer();
if _defaultCurSer then
SDKCacheData.ServerID = tostring(_defaultCurSer.ServerId);
end
end
--更新服务器名字
function ServerListSystem:GS2U_ResChangeServerNameSuccess(serverId,changeName)
local _cs = self:FindServer(serverId)
if _cs then
_cs.Name = changeName;
GameCenter.PushFixEvent(LogicLuaEventDefine.EID_EVENT_SERVER_CHANGNAME_SUCCESS );
end
end
-- 通过服务器ID来查找服务器信息,
-- 各位亲,请注意,这里很有找不到的情况.
function ServerListSystem:FindServer(id)
return self.AllList:Find(function(a)
return a.ServerId == id;
end);
end
--更新服务器的名字
function ServerListSystem:UpdateServerNames(changeNameList)
if changeNameList then
for i = 1, changeNameList:Count() do
local info = self:FindServer(changeNameList[i].serverId)
if info then
info.Name = changeNameList[i].changeName;
end
end
end
end
--填充服务器的其他数据
function ServerListSystem:UpdateServerNums(serNumInfos)
if serNumInfos then
for _, _si in ipairs(serNumInfos) do
local _info = self:FindServer(_si.serverId)
if _info then
for i, value in ipairs(_si.roles) do
local _sci = ServerCharInfo:New();
_info.CharacterList:Add(_sci);
_sci.ID = value.roleId;
_sci.ServerId = _si.serverId;
_sci.Career = value.career;
_sci.Level = value.lv;
_sci.Name = value.name;
_sci.PowerValue = value.fight;
end
end
end
end
end
--处理存在角色的服务器
function ServerListSystem:UpdateExistRoleServer(existRoleIDs)
self.ExistRoleList:Clear();
if existRoleIDs then
for _, _sid in ipairs(existRoleIDs) do
local _info = self:FindServer(_sid);
if _info then
_info.HasRole = true;
self.ExistRoleList:Add(_info);
end
end
end
--所有推荐服都需要进行排序
self.ExistRoleList:Sort(function (x,y)
return x.ShowOrder > y.ShowOrder;
end);
end
--获取推荐服如果没有则返回最新的10个服务器
function ServerListSystem:ProcessRecommendServer()
self.RecommendList:Clear();
local _tmp = List:New();
for index, value in ipairs(self.AllList) do
local _item = value;
if _item and _item.IsRecommendServer then
self.RecommendList:Add(_item);
end
if index <= 10 then
_tmp:Add(_item);
end
end
--如果没有推荐服则默认显示最新的10个服务器
if self.RecommendList:Count() == 0 then
self.RecommendList:AddRange(_tmp);
end
--所有推荐服都需要进行排序
self.RecommendList:Sort(function (x,y)
if x.PlayerNum == y.PlayerNum then
return x.ShowOrder > y.ShowOrder;
else
return x.PlayerNum < y.PlayerNum;
end
end);
end
--处理最后一次登录的服务器
function ServerListSystem:ProcessLastEnterServer(lastEnterID)
self.LastEnterServer = self:FindServer(lastEnterID);
if (self.LastEnterServer == nil and self.RecommendList:Count() > 0) then
self.LastEnterServer = self.RecommendList[1];
end
if (self.LastEnterServer == nil and self.AllList:Count() > 0) then
self.LastEnterServer = self.AllList[1];
end
end
--添加最近的服务器到本地
function ServerListSystem:AddRecentServer(ID)
local _jsonStr = PlayerPrefs.GetString(L_CN_RECENT_SERVER_KEY, "{\"data\":[]}");
local _tab = Json.decode(_jsonStr);
for index, value in ipairs(_tab.data) do
if value == ID then
table.remove(_tab.data,index);
break;
end
end
table.insert(_tab.data,1,ID);
_jsonStr = Json.encode(_tab);
PlayerPrefs.SetString(L_CN_RECENT_SERVER_KEY, _jsonStr);
PlayerPrefs.Save();
end
--获取最近登录的服务器ID列表
function ServerListSystem:GetRecentServerIDList()
local _jsonStr = PlayerPrefs.GetString(L_CN_RECENT_SERVER_KEY, "{\"data\":[]}");
local _tab = Json.decode(_jsonStr);
return List:New(_tab.data);
end
--处理最近登录的服务器
function ServerListSystem:ProcessRecentServer()
self.RecentLoginList:Clear();
local _ids = self:GetRecentServerIDList();
for _, value in ipairs(_ids) do
local _item = self:FindServer(value);
if _item then
_item.HasRole = true;
self.RecentLoginList:Add(_item);
end
end
end
--分组后的列表以groupCount个为1组
function ServerListSystem:ProcessGroupedServerList(groupCount)
self.GroupedList:Clear();
--测试服 grouptype = 0
local _testList = List:New();
--先锋服 group type = 1
local _tryList = List:New();
--正式服 group type = 2
local _noSortList = List:New();
local _sortList = List:New();
for _, value in ipairs(self.AllList) do
--value.GroupType = math.random(0,3)
if value.GroupType == 0 then
_testList:Add(value)
elseif value.GroupType == 1 then
_tryList:Add(value)
else
if value.ShowOrder <= 0 then
_noSortList:Add(value);
else
_sortList:Add(value);
end
end
end
--把无序的设定位一组
if _testList:Count() > 0 then
self.GroupedList:Add(ServerGroupInfo:New(0,0,_testList,DataConfig.DataMessageString.Get("C_TEST_SERVER_AREA")));
end
if _tryList:Count() > 0 then
self.GroupedList:Add(ServerGroupInfo:New(0,0,_tryList,DataConfig.DataMessageString.Get("C_DNF_SERVER_AREA")));
end
if _noSortList:Count() > 0 then
self.GroupedList:Add(ServerGroupInfo:New(0,0,_noSortList,DataConfig.DataMessageString.Get("C_INVALID_SERVER_AREA")));
end
--排序
_sortList:Sort(function (x,y)
return x.ShowOrder < y.ShowOrder;
end)
while _sortList:Count() > 0 do
local _gi = ServerGroupInfo:Create(_sortList,_sortList[1].ShowOrder,_sortList[1].ShowOrder + groupCount - 1);
if _gi then
self.GroupedList:Add(_gi);
end
end
self.GroupedList:Sort(function (x,y)
if ( x.EndID == y.EndID) then
return false;
elseif(x.EndID == 0)then
return true;
elseif(y.EndID == 0)then
return false;
else
return x.EndID > y.EndID;
end
end)
end
--处理维护服务器列表
function ServerListSystem:ProcessMaintenanceServerList()
self.MaintenanceList:Clear();
for _, value in ipairs(self.AllList) do
self.MaintenanceList:Add(value);
end
end
--设置最后的进入服务器
function ServerListSystem:SetLastEnterServer(gs)
if gs == nil then return; end
self:AddRecentServer(gs.ServerId);
self.LastEnterServer = gs;
end
--获得当前服务器
function ServerListSystem:GetCurrentServer()
local _result = nil;
--如果当前选择的游戏服ID大于0
if (self.ChooseGameServerID >= 0) then
_result = self:FindServer(self.ChooseGameServerID);
end
--选择服务器最后一次登录的服务器
if (_result == nil and self.LastEnterServer) then
_result = self.LastEnterServer;
end
--选择本地最后一次登录的服务器
if _result == nil and self.RecentLoginList:Count() > 0 then
_result = self.RecentLoginList[1];
end
--如果都还是空的,取包含角色的列表第一个服务器
if (_result == nil and self.ExistRoleList:Count() > 0) then
_result = self.ExistRoleList[1];
end
--如果都还是空的,取推荐列表的第一个服务器
if (_result == nil and self.RecommendList:Count() > 0) then
_result = self.RecommendList[1];
end
--如果都还是空的,取全部列表的第一个服务器
if (_result == nil and self.AllList:Count() > 0) then
_result = self.AllList[1];
end
--如果还是空,直接报错吧
if (_result == nil) then
Debug.LogError("GetCurrentServer:获取当前服务器为空!");
end
return _result;
end
--[[
---解析x8的服务器列表--被抛弃了--2021-08-06.
--游戏服务器列表下载完毕回调
function ServerListSystem:OnGsServerDownloadFinish(wwwText)
--去下载充值列表的数据
GameCenter.PaySystem:DownLoadPayList();
--关闭MessageBox
GameCenter.MsgPromptSystem:CloseMsgBox();
GameCenter.PushFixEvent(LogicEventDefine.EID_EVENT_UPDATE_RECORDER_STEP, { CS.Thousandto.Update.Recorder.StepType.RequestServerList, 0, "Success" });
--如果www不为空,表示通过url进行下载的.
if wwwText ~= nil and wwwText ~= "" then
self:Clear();
self.AllList = ServerDataInfo:ParseGameServerListJson(wwwText);
Debug.Log("游戏服务器列表下载完毕!downloadFlag = " .. self.DownloadFlag .. ";;服务器列表数量:" .. self.AllList:Count());
self.DownloadFlag = self.DownloadFlag | 2;
if ((self.DownloadFlag & 3) == 3) then
GameCenter.LoginSystem:ConnectLoginServer();
self.DownloadFlag = -1;
end
else
Debug.LogError("下载游戏服务器列表错误!downloadFlag = " .. self.DownloadFlag);
self.DownloadFlag = -1;
Utils.ShowMsgBoxAndBtn(nil,"C_MSGBOX_OK","C_LOGIN_DOWNLOAD_SERVER_LIST_FAIL");
end
end
--下载登陆服务器列表完成 -- 回调
function ServerListSystem:OnLsServerDownloadFinish(wwwText)
--关闭MessageBox
GameCenter.MsgPromptSystem:CloseMsgBox();
GameCenter.PushFixEvent(LogicEventDefine.EID_EVENT_UPDATE_RECORDER_STEP, { CS.Thousandto.Update.Recorder.StepType.RequestServerList, 0, "Success" });
--如果www不为空,表示通过url进行下载的.
if wwwText ~= nil and wwwText ~= "" then
self.LoginServer = null;
--去掉通配符
--wwwText = Utils.ReplaceString(wwwText, "\"", "");
--wwwText = Utils.ReplaceString(wwwText, "\\", "");
self.LoginServer = ServerDataInfo:ParserLoginServerListJson(wwwText, SDKCacheData.ChannelID);
Debug.Log("登陆服务器列表下载完毕!downloadFlag = " .. self.DownloadFlag);
self.DownloadFlag = self.DownloadFlag | 1;
if ((self.DownloadFlag & 3) == 3) then
GameCenter.LoginSystem:ConnectLoginServer();
self.DownloadFlag = -1;
end
else
Debug.LogError("下载登陆服务器列表错误!downloadFlag = " .. self.DownloadFlag);
self.DownloadFlag = -1;
Utils.ShowMsgBoxAndBtn(nil,"C_MSGBOX_OK","C_LOGIN_DOWNLOAD_SERVER_LIST_FAIL");
end
end
]]
return ServerListSystem;