KLHookPointItem.lua 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. ---@class KLHookPointItem:UIKmlLuaPanelBase
  2. ---@field view KLHookPointItemView
  3. ---@field mapItems table<number,KLHookPointMapItem>
  4. local KLHookPointItem = class(UIKmlLuaPanelBase)
  5. local this =KLHookPointItem
  6. ---创建时调用一次
  7. function this:Init()
  8. SL:KeepOpenPanel("KLHookPointItemKml",true)
  9. local cfgTbl = SL:GetConfigTable("cfg_hanguppoints")
  10. self.cfgDatas = {}
  11. self.mapDatas = {}
  12. local level = SL:GetMetaValue(EMetaVarGetKey.LEVEL)
  13. local levelRecommend
  14. local powersList = {}
  15. local minLevelMap
  16. local minLevel
  17. local allTable = SL:GetConfigTable("cfg_VIP")
  18. local goldway = {}
  19. ---@param value cfg_VIP_column
  20. for key, value in pairs(allTable) do
  21. if value.grade == InfoManager.newVipInfo.vipLevel then
  22. goldway = value.goldway
  23. end
  24. end
  25. local tempData = {}
  26. ---@param cfg cfg_hanguppoints_column
  27. for _, cfg in pairs(cfgTbl) do
  28. if not self.cfgDatas[cfg.mapMoveID] then
  29. self.cfgDatas[cfg.mapMoveID] = {}
  30. --找到玩家当前等级解锁的最高等级的地图
  31. ---@type cfg_mapMove_column
  32. local mapMove = SL:GetConfig("cfg_mapMove", cfg.mapMoveID)
  33. local isMove = cfg.type ~= 1 or (cfg.type == 1 and table.contains(goldway,mapMove.mapID))
  34. tempData[cfg.mapMoveID] = isMove
  35. table.insert(self.mapDatas, {mapMoveId=cfg.mapMoveID,isMove = isMove})
  36. if isMove then
  37. if not levelRecommend or level >= mapMove.level then
  38. levelRecommend = cfg.mapMoveID
  39. end
  40. --找到等级最低的地图
  41. if not minLevelMap or mapMove.level < minLevel then
  42. minLevelMap = cfg.mapMoveID
  43. minLevel = mapMove.level
  44. end
  45. end
  46. end
  47. if not self.cfgDatas[cfg.mapMoveID][cfg.monsterGroup] then
  48. self.cfgDatas[cfg.mapMoveID][cfg.monsterGroup] = {}
  49. --找到每个地图等级最高的怪物,存入powersList
  50. if not powersList[cfg.mapMoveID] then
  51. ---@type cfg_monster_column
  52. local monster = SL:GetConfig("cfg_monster", cfg.monsterGroup)
  53. powersList[cfg.mapMoveID] = monster.sword
  54. else
  55. ---@type cfg_monster_column
  56. local monster = SL:GetConfig("cfg_monster", cfg.monsterGroup)
  57. if monster.sword > powersList[cfg.mapMoveID] then
  58. powersList[cfg.mapMoveID] = monster.sword
  59. end
  60. end
  61. end
  62. table.insert(self.cfgDatas[cfg.mapMoveID][cfg.monsterGroup], cfg.coordinates)
  63. end
  64. --正常显示在玩家当前战力对比能打过的最高级怪物所在的地图上
  65. local powerRecommend
  66. local definse = SL:GetMetaValue("GET_ATTR_VALUE_BY_ID", EMUCharacterAttrType.armor)
  67. level = SL:GetMetaValue(EMetaVarGetKey.LEVEL)
  68. for k, v in pairs(powersList) do
  69. if definse >= v then
  70. ---@type cfg_mapMove_column
  71. local thisLv = SL:GetConfig("cfg_mapMove", k)
  72. if not powerRecommend and level > thisLv.level then
  73. powerRecommend = k
  74. elseif powerRecommend then
  75. ---@type cfg_mapMove_column
  76. local lv = SL:GetConfig("cfg_mapMove", powerRecommend)
  77. local isMove = tempData[k]
  78. if isMove and level > thisLv.level and thisLv.level >= lv.level and v >= powersList[powerRecommend] then
  79. powerRecommend = k
  80. end
  81. end
  82. end
  83. end
  84. --满足a条件的怪物所在地图玩家未解锁时,显示在当前解锁的最高等级地图上
  85. local finalRecommend = powerRecommend
  86. if not powerRecommend then
  87. --所有地图的怪物战力都比不过的时候,显示在最低等级的地图上
  88. finalRecommend = minLevelMap
  89. else
  90. ---@type cfg_mapMove_column
  91. local mapMove = SL:GetConfig("cfg_mapMove", powerRecommend)
  92. local isMove = tempData[mapMove.mapID]
  93. if isMove and level < mapMove.level then
  94. finalRecommend = levelRecommend
  95. end
  96. end
  97. self.finalRecommend = finalRecommend
  98. self.selectItemIndex = finalRecommend
  99. if InfoManager.uiHookInfo.selectHookPointMapItem then
  100. self.selectItemIndex = InfoManager.uiHookInfo.selectHookPointMapItem
  101. self.nowClick = InfoManager.uiHookInfo.selectHookPointMapItem
  102. end
  103. GUI:DataListInitData(self.view.mapDataList,function()
  104. return self:MapDataListItemCountFunc()
  105. end,function(realIndex)
  106. return self:MapDataListItemGetFunc(realIndex)
  107. end,function(realIndex, kmlcontrol)
  108. return self:MapDataListItemInitFunc(realIndex, kmlcontrol)
  109. end, function(realIndex, kmlcontrol)
  110. return self:MapDataListItemUpdateFunc(realIndex, kmlcontrol)
  111. end)
  112. self.mapItems = {}
  113. self.monsterItems = {}
  114. end
  115. --地图
  116. function this:MapDataListItemCountFunc()
  117. return #self.mapDatas
  118. end
  119. function this:MapDataListItemGetFunc(realIndex)
  120. local item = GUI:UIPanel_Open("dev/outui/Hook/Item/KLHookPointMap/KLHookPointMapItem",
  121. self.view.mapDataList, self, {}, true)
  122. self.mapItems[item.view.root] = item
  123. return item.view.root
  124. end
  125. function this:MapDataListItemInitFunc(realIndex, kmlcontrol)
  126. end
  127. function this:MapDataListItemUpdateFunc(realIndex, kmlcontrol)
  128. local index = realIndex + 1
  129. local data = self.mapDatas[index]
  130. self.mapItems[kmlcontrol]:SetData(data)
  131. if self.nowClick and data.mapMoveId == self.nowClick then
  132. self.mapItems[kmlcontrol]:SetOn()
  133. self.selectItem = self.mapItems[kmlcontrol]
  134. self.nowClick = data.mapMoveId
  135. end
  136. if data.mapMoveId == self.finalRecommend then
  137. self.mapItems[kmlcontrol]:SetIsRecommended()
  138. end
  139. if not self.first and data.mapMoveId == self.selectItemIndex then
  140. self.first = true
  141. --[[
  142. 这里这么调用是因为该界面是通过事件创建的,RegistEvents在事件完成之前注册不上
  143. 在面板里refreshUI刷新数据 抛LUA_EVENT_UI_HOOK_MAP_CLICK事件就会接收不到
  144. 因此主动调用一下回调
  145. ]]
  146. self:LUA_EVENT_UI_HOOK_MAP_CLICK(_, {selectItem=self.mapItems[kmlcontrol],data=data})
  147. end
  148. end
  149. ---注册UI事件和服务器消息
  150. function this:RegistEvents()
  151. SL:RegisterLUAEvent(LUA_EVENT_UI_HOOK_MAP_CLICK, self.LUA_EVENT_UI_HOOK_MAP_CLICK, self)
  152. end
  153. --地图点击回调
  154. function this:LUA_EVENT_UI_HOOK_MAP_CLICK(id, ItemData)
  155. if self.selectItem then
  156. self.selectItem:SetOff()
  157. self.selectItem = nil
  158. end
  159. self.selectItem = ItemData.selectItem
  160. self.selectItem:SetOn()
  161. local data = ItemData.data.mapMoveId
  162. self.nowClick = data
  163. InfoManager.uiHookInfo.selectHookPointMapItem = ItemData.data.mapMoveId
  164. ---@type cfg_mapMove_column
  165. local cfg = SL:GetConfig("cfg_mapMove", data)
  166. local level = SL:GetMetaValue(EMetaVarGetKey.LEVEL)
  167. if level < cfg.level then
  168. SL:TipMessage(SL:GetConfig('cfg_string',272).text,1, NoticeType.NoticeLeftBottom)--"角色等级不足",
  169. else
  170. self:Recycle()
  171. local datas = self.cfgDatas[data]
  172. if datas then
  173. --按照等级从小到大排序
  174. local tempList = table.keys(datas)
  175. table.sort(tempList, function(a, b)
  176. ---@type cfg_monster_column
  177. local cfgA = SL:GetConfig("cfg_monster", a)
  178. ---@type cfg_monster_column
  179. local cfgB = SL:GetConfig("cfg_monster", b)
  180. return cfgA.level < cfgB.level
  181. end)
  182. for _, v in pairs(tempList) do
  183. table.insert(self.monsterItems, GUI:UIPanel_Open("dev/outui/Hook/Item/KLHookPointMonster/KLHookPointMonsterItem", self.view.layout3,
  184. self, {mapId = cfg.mapID, id = v, posData = datas[v], level = level}, true))
  185. end
  186. end
  187. end
  188. end
  189. function this:Recycle()
  190. for _, v in pairs(self.monsterItems) do
  191. GUI:UIPanel_Close(_, v)
  192. end
  193. table.clear(self.monsterItems)
  194. end
  195. ---创建或者刷新界面数据时调用
  196. function this:Refresh()
  197. self.nowClick = nil
  198. self.first = false
  199. --刷新滚动列表 并跳转到指定项
  200. GUI:DataListUpdateData(self.view.mapDataList)
  201. local index = 0
  202. for k, v in pairs(self.mapDatas) do
  203. if v.mapMoveId == self.selectItemIndex then
  204. index = k
  205. break
  206. end
  207. end
  208. GUI:SetScrollView_scrollpos(self.view.mapScroll, index - 1)
  209. GUI:DataListUpdateData(self.view.mapDataList)
  210. end
  211. function this:Close()
  212. SL:KeepOpenPanel("KLHookPointItemKml",false)
  213. end
  214. return this