KLServerSelectionPanel.lua 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. ---@class KLServerSelectionPanel:UIKmlLuaPanelBase
  2. ---@field view KLServerSelectionPanelView
  3. local KLServerSelectionPanel = class(UIKmlLuaPanelBase)
  4. local this = KLServerSelectionPanel
  5. function this:AsyncLoadUI()
  6. end
  7. ---创建时调用一次
  8. function this:Init()
  9. self.atlas = "Atlas/PCPlatform_UI.spriteatlas"
  10. self.ServerGroupItems = {}
  11. self.ServerSelectionItems = {}
  12. ---@type ServerStruct[]
  13. self.loginedList = {}
  14. self.hadRoleServers = false
  15. self.showHalfYearTitle = false
  16. self.ServerData = {}--所有服务器的数据
  17. ---@type ServerStruct[]
  18. self.CurServerSelectionData = {} --当前选中的服务器组数据
  19. self.CurServerGroupIndex = 1--当前选中的服务器组序号
  20. GUI:SetActive(self.view.sv_haveRoles, false)
  21. --[[
  22. self.view.serverGroup --服务器组
  23. self.view.SelectServer --服务器选择
  24. self.view.sv_haveRoles --最近登录
  25. --]]
  26. end
  27. ---注册UI事件和服务器消息
  28. function this:RegistEvents()
  29. GUI:AddOnClickEvent(self.view.btn_closeSelectServer, self, self.CloseEvent)
  30. end
  31. ---界面显示时调用一次
  32. function this:Show()
  33. end
  34. ---创建或者刷新界面数据时调用
  35. function this:Refresh()
  36. table.clear(self.ServerGroupItems)
  37. table.clear(self.ServerSelectionItems)
  38. self.hadRoleServers = false
  39. self.ServerData = self:GetServerData()
  40. self:InitServerGroupList()
  41. GUI:DataListUpdateData(self.view.serverGroup)
  42. GUI:Toggle_setIsOn(self.ServerGroupItems[self.CurServerGroupIndex], true)
  43. GUI:SetActive(self.view.halfYearTitle, self.showHalfYearTitle)
  44. end
  45. function this:Hide()
  46. end
  47. function this:Close()
  48. end
  49. function this:CloseEvent()
  50. GUI:UIPanel_Close("dev/outui/PCPlatform/Panel/KLServerSelection/KLServerSelectionPanel")
  51. end
  52. function this:GetServerData()
  53. local dataTable = {}
  54. local spacing = 10
  55. local index = 0
  56. local serverIndex = 0
  57. table.clear(self.loginedList)
  58. for k, v in pairs(SL:GetRecentServer()) do
  59. if v.state ~= EServerState.NotShow then
  60. table.insert(self.loginedList, v.sid)
  61. end
  62. end
  63. local haveRole = SL:GetServerRoleList() or {}
  64. local serverHadRole = {}
  65. for i, v in pairs(haveRole) do
  66. local value = SL:GetServerInfoByRole(v.sid)
  67. ---清服时玩家已有角色未清空,找不到角色报错,此处加个容错
  68. if value then
  69. local server = this.CopyTableValue(value)
  70. server.roleInfo = v
  71. serverHadRole[#serverHadRole + 1] = server
  72. table.insert(self.loginedList, server.sid)
  73. end
  74. end
  75. local serverCount = table.count(serverHadRole)
  76. if serverCount > 0 then
  77. table.insert(dataTable, { server = serverHadRole, name = "最近登录" })
  78. self.hadRoleServers = true
  79. end
  80. ---if LoginManager.serverStruct.group_list then
  81. if SL:GetServerStruct().group_list then
  82. local spacingSv = {}
  83. local bigAreas = {}
  84. for i, v in ipairs(SL:GetServerList()) do
  85. --LoginManager.serverList) do
  86. if v.state ~= EServerState.NotShow then
  87. index = index + 1
  88. if not bigAreas[v.bigAreaName] then
  89. bigAreas[v.bigAreaName] = {}
  90. end
  91. table.insert(bigAreas[v.bigAreaName], v)
  92. end
  93. end
  94. ---@param a ServerStruct
  95. ---@param b ServerStruct
  96. table.sort(bigAreas, function(a, b)
  97. return a.bigAreaName < b.bigAreaName
  98. end)
  99. for k, v in pairs(bigAreas) do
  100. ---@param v2 {id:number,name:string,displayTime:number}
  101. ---@type {id:number,name:string,displayTime:number}
  102. local t, data = table.find(SL:GetServerStruct().group_list, function(_, _, k2, v2)
  103. if v2.id == k then
  104. return true
  105. end
  106. return false
  107. end)
  108. table.insert(dataTable, { server = v, name = data and data.name or "未知分组" })
  109. end
  110. else
  111. --每spacing个服务器为一组划分
  112. ---@type ServerStruct[]
  113. local spacingSv = {}
  114. for i, v in pairs(SL:GetServerList()) do
  115. if v.state ~= EServerState.NotShow then
  116. index = index + 1
  117. if index > spacing then
  118. serverIndex = serverIndex + 1
  119. serverCount = table.count(spacingSv) + serverCount
  120. table.insert(dataTable, { server = spacingSv, name = "服务器组" .. serverIndex })
  121. index = 1
  122. spacingSv = {}
  123. end
  124. table.insert(spacingSv, v)
  125. end
  126. end
  127. --不够spacing服务器一个组
  128. if next(spacingSv) then
  129. serverIndex = serverIndex + 1
  130. table.insert(dataTable, { server = spacingSv, name = "服务器组" .. serverIndex })
  131. serverCount = table.count(spacingSv) + serverCount
  132. end
  133. end
  134. return dataTable
  135. end
  136. function this.CopyTableValue(tb)
  137. local copy = {}
  138. for k, v in pairs(tb) do
  139. copy[k] = v
  140. end
  141. return copy
  142. end
  143. ---服务器组列表
  144. function this:InitServerGroupList()
  145. GUI:DataListInitData(self.view.serverGroup, function()
  146. return table.count(self.ServerData)
  147. end, function()
  148. end, function()
  149. end, function(realIndex)
  150. self:ServerGroupItem(realIndex)
  151. end)
  152. end
  153. ---服务器组列表
  154. function this:ServerGroupItem(realIndex)
  155. local index = realIndex + 1
  156. self.ServerGroupItems[index] = GUI:GetChildControl(self.view.serverGroup, realIndex, 'btn_serverGroup')
  157. local text = GUI:GetChildById(self.ServerGroupItems[index], "ServerGroupName")
  158. GUI:Text_setString(text, self.ServerData[index].name)
  159. GUI:SetToggleOnValueChange(self.ServerGroupItems[index], self, self.ServerGroupItemEvent, index)
  160. end
  161. ---服务器组列表
  162. function this:ServerGroupItemEvent(control, realIndex)
  163. local isOn = GUI:Toggle_getIsOn(control)
  164. if isOn == "1" then
  165. self.showHalfYearTitle = false
  166. if realIndex == 1 and self.hadRoleServers then
  167. self.CurServerGroupIndex = realIndex
  168. self.CurServerSelectionData = self.ServerData[realIndex].server
  169. self:InitHadRoleList()
  170. GUI:DataListUpdateData(self.view.haveRoles)
  171. GUI:SetActive(self.view.sv_haveRoles, true)
  172. GUI:SetActive(self.view.sv_selectServers, false)
  173. self.showHalfYearTitle = true
  174. else
  175. self.CurServerGroupIndex = realIndex
  176. self.CurServerSelectionData = self.ServerData[realIndex].server
  177. self:InitServerSelectionList()
  178. GUI:DataListUpdateData(self.view.SelectServer)
  179. GUI:SetActive(self.view.sv_selectServers, true)
  180. GUI:SetActive(self.view.sv_haveRoles, false)
  181. end
  182. GUI:SetActive(self.view.halfYearTitle, self.showHalfYearTitle)
  183. end
  184. end
  185. ---服务器选择
  186. function this:InitServerSelectionList()
  187. GUI:DataListInitData(self.view.SelectServer, function()
  188. return table.count(self.CurServerSelectionData)
  189. end, function()
  190. end, function()
  191. end, function(realIndex)
  192. self:ServerSelectionItem(realIndex)
  193. end)
  194. end
  195. ---服务器选择
  196. function this:ServerSelectionItem(realIndex)
  197. local index = realIndex + 1
  198. local control = GUI:GetChildControl(self.view.SelectServer, realIndex, 'selectItem')
  199. ---@type ServerStruct
  200. local serverInfo = self.CurServerSelectionData[index]
  201. self.ServerSelectionItems[index] = control
  202. GUI:AddOnClickEvent(control, self, self.ServerSelectionItemEvent, { server = serverInfo })
  203. local newServerIcon = GUI:GetChildControl(control, 1, 'NewServerIcon')
  204. local serverStateImg = GUI:GetChildControl(control, 2, 'ServerState')
  205. local Servername = GUI:GetChildControl(control, 3, 'ServerName')
  206. local roleEditIcon = GUI:GetChildControl(control, 4, 'RoleEditIcon')
  207. GUI:Text_setString(Servername, serverInfo.name)
  208. ---1新服,2畅通,3爆满,4维护,5隐藏
  209. local serverState = serverInfo.state
  210. GUI:SetActive(newServerIcon, serverState == 1)
  211. GUI:SetActive(serverStateImg, serverState ~= 1)
  212. if serverState == 2 then
  213. GUI:Image_loadTexture(serverStateImg, "ServerStateIcon_Flumency", self.atlas)
  214. elseif serverState == 3 then
  215. GUI:Image_loadTexture(serverStateImg, "ServerStateIcon_Hot", self.atlas)
  216. elseif serverState == 4 then
  217. GUI:Image_loadTexture(serverStateImg, "ServerStateIcon_Maintenance", self.atlas)
  218. end
  219. GUI:SetActive(roleEditIcon, table.contains(self.loginedList, serverInfo.sid))
  220. end
  221. function this:InitHadRoleList()
  222. GUI:DataListInitData(self.view.haveRoles, function()
  223. return table.count(self.CurServerSelectionData)
  224. end, function()
  225. end, function()
  226. end, function(realIndex)
  227. self:HadRoleItem(realIndex)
  228. end)
  229. end
  230. ---服务器选择
  231. function this:HadRoleItem(realIndex)
  232. local index = realIndex + 1
  233. local control = GUI:GetChildControl(self.view.haveRoles, realIndex, 'UIServerItem')
  234. ---@type ServerStruct
  235. local serverInfo = self.CurServerSelectionData[index]
  236. self.ServerSelectionItems[index] = control
  237. GUI:AddOnClickEvent(control, self, self.ServerSelectionItemEvent, { server = serverInfo })
  238. local roleHead = GUI:GetChildControl(control, 1, 'RoleHead')
  239. local ServerName02 = GUI:GetChildControl(control, 2, 'ServerName02')
  240. local ServerState02 = GUI:GetChildControl(control, 3, 'ServerState02')
  241. local Rank = GUI:GetChildControl(control, 4, 'Rank')
  242. local Occu = GUI:GetChildControl(control, 5, 'Occu')
  243. local RoleName = GUI:GetChildControl(control, 6, 'RoleName')
  244. local NewServer = GUI:GetChildControl(control, 7, 'NewServer')
  245. GUI:Text_setString(ServerName02, serverInfo.name)
  246. local atlas, src = SL.GetAtlas2CareerHead(serverInfo.roleInfo.rBaseCareer)
  247. GUI:Image_loadTexture(roleHead, src, atlas)
  248. ---1新服,2畅通,3爆满,4维护,5隐藏
  249. local serverState = serverInfo.state
  250. GUI:SetActive(NewServer, serverState == 1)
  251. GUI:SetActive(ServerState02, serverState ~= 1)
  252. if serverState == 2 then
  253. GUI:Image_loadTexture(ServerState02, "ServerStateIcon_Flumency", self.atlas)
  254. elseif serverState == 3 then
  255. GUI:Image_loadTexture(ServerState02, "ServerStateIcon_Hot", self.atlas)
  256. elseif serverState == 4 then
  257. GUI:Image_loadTexture(ServerState02, "ServerStateIcon_Maintenance", self.atlas)
  258. end
  259. GUI:Text_setString(Rank, "Lv" .. serverInfo.roleInfo.rLevel)
  260. local careerName = SL:CfgCareerPost_GetCfgCareerName(serverInfo.roleInfo.rBaseCareer)
  261. GUI:Text_setString(Occu, careerName)
  262. GUI:Text_setString(RoleName, serverInfo.roleInfo.rName)
  263. end
  264. ---服务器选择
  265. function this:ServerSelectionItemEvent(control, eventData)
  266. self:CloseEvent()
  267. SL:DispatchSelectServer(eventData.server)
  268. end
  269. return this