---@class KLServerSelectionPanel:UIKmlLuaPanelBase ---@field view KLServerSelectionPanelView local KLServerSelectionPanel = class(UIKmlLuaPanelBase) local this = KLServerSelectionPanel function this:AsyncLoadUI() end ---创建时调用一次 function this:Init() self.atlas = "Atlas/PCPlatform_UI.spriteatlas" self.ServerGroupItems = {} self.ServerSelectionItems = {} ---@type ServerStruct[] self.loginedList = {} self.hadRoleServers = false self.showHalfYearTitle = false self.ServerData = {}--所有服务器的数据 ---@type ServerStruct[] self.CurServerSelectionData = {} --当前选中的服务器组数据 self.CurServerGroupIndex = 1--当前选中的服务器组序号 GUI:SetActive(self.view.sv_haveRoles, false) --[[ self.view.serverGroup --服务器组 self.view.SelectServer --服务器选择 self.view.sv_haveRoles --最近登录 --]] end ---注册UI事件和服务器消息 function this:RegistEvents() GUI:AddOnClickEvent(self.view.btn_closeSelectServer, self, self.CloseEvent) end ---界面显示时调用一次 function this:Show() end ---创建或者刷新界面数据时调用 function this:Refresh() table.clear(self.ServerGroupItems) table.clear(self.ServerSelectionItems) self.hadRoleServers = false self.ServerData = self:GetServerData() self:InitServerGroupList() GUI:DataListUpdateData(self.view.serverGroup) GUI:Toggle_setIsOn(self.ServerGroupItems[self.CurServerGroupIndex], true) GUI:SetActive(self.view.halfYearTitle, self.showHalfYearTitle) end function this:Hide() end function this:Close() end function this:CloseEvent() GUI:UIPanel_Close("dev/outui/PCPlatform/Panel/KLServerSelection/KLServerSelectionPanel") end function this:GetServerData() local dataTable = {} local spacing = 10 local index = 0 local serverIndex = 0 table.clear(self.loginedList) for k, v in pairs(SL:GetRecentServer()) do if v.state ~= EServerState.NotShow then table.insert(self.loginedList, v.sid) end end local haveRole = SL:GetServerRoleList() or {} local serverHadRole = {} for i, v in pairs(haveRole) do local value = SL:GetServerInfoByRole(v.sid) ---清服时玩家已有角色未清空,找不到角色报错,此处加个容错 if value then local server = this.CopyTableValue(value) server.roleInfo = v serverHadRole[#serverHadRole + 1] = server table.insert(self.loginedList, server.sid) end end local serverCount = table.count(serverHadRole) if serverCount > 0 then table.insert(dataTable, { server = serverHadRole, name = "最近登录" }) self.hadRoleServers = true end ---if LoginManager.serverStruct.group_list then if SL:GetServerStruct().group_list then local spacingSv = {} local bigAreas = {} for i, v in ipairs(SL:GetServerList()) do --LoginManager.serverList) do if v.state ~= EServerState.NotShow then index = index + 1 if not bigAreas[v.bigAreaName] then bigAreas[v.bigAreaName] = {} end table.insert(bigAreas[v.bigAreaName], v) end end ---@param a ServerStruct ---@param b ServerStruct table.sort(bigAreas, function(a, b) return a.bigAreaName < b.bigAreaName end) for k, v in pairs(bigAreas) do ---@param v2 {id:number,name:string,displayTime:number} ---@type {id:number,name:string,displayTime:number} local t, data = table.find(SL:GetServerStruct().group_list, function(_, _, k2, v2) if v2.id == k then return true end return false end) table.insert(dataTable, { server = v, name = data and data.name or "未知分组" }) end else --每spacing个服务器为一组划分 ---@type ServerStruct[] local spacingSv = {} for i, v in pairs(SL:GetServerList()) do if v.state ~= EServerState.NotShow then index = index + 1 if index > spacing then serverIndex = serverIndex + 1 serverCount = table.count(spacingSv) + serverCount table.insert(dataTable, { server = spacingSv, name = "服务器组" .. serverIndex }) index = 1 spacingSv = {} end table.insert(spacingSv, v) end end --不够spacing服务器一个组 if next(spacingSv) then serverIndex = serverIndex + 1 table.insert(dataTable, { server = spacingSv, name = "服务器组" .. serverIndex }) serverCount = table.count(spacingSv) + serverCount end end return dataTable end function this.CopyTableValue(tb) local copy = {} for k, v in pairs(tb) do copy[k] = v end return copy end ---服务器组列表 function this:InitServerGroupList() GUI:DataListInitData(self.view.serverGroup, function() return table.count(self.ServerData) end, function() end, function() end, function(realIndex) self:ServerGroupItem(realIndex) end) end ---服务器组列表 function this:ServerGroupItem(realIndex) local index = realIndex + 1 self.ServerGroupItems[index] = GUI:GetChildControl(self.view.serverGroup, realIndex, 'btn_serverGroup') local text = GUI:GetChildById(self.ServerGroupItems[index], "ServerGroupName") GUI:Text_setString(text, self.ServerData[index].name) GUI:SetToggleOnValueChange(self.ServerGroupItems[index], self, self.ServerGroupItemEvent, index) end ---服务器组列表 function this:ServerGroupItemEvent(control, realIndex) local isOn = GUI:Toggle_getIsOn(control) if isOn == "1" then self.showHalfYearTitle = false if realIndex == 1 and self.hadRoleServers then self.CurServerGroupIndex = realIndex self.CurServerSelectionData = self.ServerData[realIndex].server self:InitHadRoleList() GUI:DataListUpdateData(self.view.haveRoles) GUI:SetActive(self.view.sv_haveRoles, true) GUI:SetActive(self.view.sv_selectServers, false) self.showHalfYearTitle = true else self.CurServerGroupIndex = realIndex self.CurServerSelectionData = self.ServerData[realIndex].server self:InitServerSelectionList() GUI:DataListUpdateData(self.view.SelectServer) GUI:SetActive(self.view.sv_selectServers, true) GUI:SetActive(self.view.sv_haveRoles, false) end GUI:SetActive(self.view.halfYearTitle, self.showHalfYearTitle) end end ---服务器选择 function this:InitServerSelectionList() GUI:DataListInitData(self.view.SelectServer, function() return table.count(self.CurServerSelectionData) end, function() end, function() end, function(realIndex) self:ServerSelectionItem(realIndex) end) end ---服务器选择 function this:ServerSelectionItem(realIndex) local index = realIndex + 1 local control = GUI:GetChildControl(self.view.SelectServer, realIndex, 'selectItem') ---@type ServerStruct local serverInfo = self.CurServerSelectionData[index] self.ServerSelectionItems[index] = control GUI:AddOnClickEvent(control, self, self.ServerSelectionItemEvent, { server = serverInfo }) local newServerIcon = GUI:GetChildControl(control, 1, 'NewServerIcon') local serverStateImg = GUI:GetChildControl(control, 2, 'ServerState') local Servername = GUI:GetChildControl(control, 3, 'ServerName') local roleEditIcon = GUI:GetChildControl(control, 4, 'RoleEditIcon') GUI:Text_setString(Servername, serverInfo.name) ---1新服,2畅通,3爆满,4维护,5隐藏 local serverState = serverInfo.state GUI:SetActive(newServerIcon, serverState == 1) GUI:SetActive(serverStateImg, serverState ~= 1) if serverState == 2 then GUI:Image_loadTexture(serverStateImg, "ServerStateIcon_Flumency", self.atlas) elseif serverState == 3 then GUI:Image_loadTexture(serverStateImg, "ServerStateIcon_Hot", self.atlas) elseif serverState == 4 then GUI:Image_loadTexture(serverStateImg, "ServerStateIcon_Maintenance", self.atlas) end GUI:SetActive(roleEditIcon, table.contains(self.loginedList, serverInfo.sid)) end function this:InitHadRoleList() GUI:DataListInitData(self.view.haveRoles, function() return table.count(self.CurServerSelectionData) end, function() end, function() end, function(realIndex) self:HadRoleItem(realIndex) end) end ---服务器选择 function this:HadRoleItem(realIndex) local index = realIndex + 1 local control = GUI:GetChildControl(self.view.haveRoles, realIndex, 'UIServerItem') ---@type ServerStruct local serverInfo = self.CurServerSelectionData[index] self.ServerSelectionItems[index] = control GUI:AddOnClickEvent(control, self, self.ServerSelectionItemEvent, { server = serverInfo }) local roleHead = GUI:GetChildControl(control, 1, 'RoleHead') local ServerName02 = GUI:GetChildControl(control, 2, 'ServerName02') local ServerState02 = GUI:GetChildControl(control, 3, 'ServerState02') local Rank = GUI:GetChildControl(control, 4, 'Rank') local Occu = GUI:GetChildControl(control, 5, 'Occu') local RoleName = GUI:GetChildControl(control, 6, 'RoleName') local NewServer = GUI:GetChildControl(control, 7, 'NewServer') GUI:Text_setString(ServerName02, serverInfo.name) local atlas, src = SL.GetAtlas2CareerHead(serverInfo.roleInfo.rBaseCareer) GUI:Image_loadTexture(roleHead, src, atlas) ---1新服,2畅通,3爆满,4维护,5隐藏 local serverState = serverInfo.state GUI:SetActive(NewServer, serverState == 1) GUI:SetActive(ServerState02, serverState ~= 1) if serverState == 2 then GUI:Image_loadTexture(ServerState02, "ServerStateIcon_Flumency", self.atlas) elseif serverState == 3 then GUI:Image_loadTexture(ServerState02, "ServerStateIcon_Hot", self.atlas) elseif serverState == 4 then GUI:Image_loadTexture(ServerState02, "ServerStateIcon_Maintenance", self.atlas) end GUI:Text_setString(Rank, "Lv" .. serverInfo.roleInfo.rLevel) local careerName = SL:CfgCareerPost_GetCfgCareerName(serverInfo.roleInfo.rBaseCareer) GUI:Text_setString(Occu, careerName) GUI:Text_setString(RoleName, serverInfo.roleInfo.rName) end ---服务器选择 function this:ServerSelectionItemEvent(control, eventData) self:CloseEvent() SL:DispatchSelectServer(eventData.server) end return this