UIMasterTalentInfo.lua 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477
  1. ---@class UIMasterTalentInfo @注释
  2. ---@field FactionsCfg table<number,cfg_master_ui_column>
  3. UIMasterTalentInfo = class()
  4. local this = UIMasterTalentInfo
  5. function this:ctor()
  6. end
  7. function this:Init()
  8. self:Reset()
  9. self:InitData()
  10. self:RegistMessages()
  11. end
  12. function this:InitData()
  13. end
  14. function this:RegistMessages()
  15. SL:RegisterLuaNetMsg(LuaMessageIdToClient.RES_MASTER_RED_DOT_INFO,self.RES_MASTER_RED_DOT_INFO,self)
  16. SL:RegisterLuaNetMsg(LuaMessageIdToClient.RES_MASTER_INFO,self.RES_MASTER_INFO,self)
  17. SL:RegisterLuaNetMsg(LuaMessageIdToClient.RES_MASTER_CHANGE_INFO,self.RES_MASTER_CHANGE_INFO,self)
  18. SL:RegisterLuaNetMsg(LuaMessageIdToClient.RES_OPEN_MASTER_TYPE,self.RES_OPEN_MASTER_TYPE,self)
  19. SL:RegisterLuaNetMsg(LuaMessageIdToClient.RES_EXCHANGE_MASTER_EXP,self.RES_EXCHANGE_MASTER_EXP,self)
  20. SL:RegisterLUAEvent(LUA_EVENT_LEVELCHANGE, self.LUA_EVENT_LEVELCHANGE, self)--主角等级改变事件
  21. end
  22. function this:LUA_EVENT_LEVELCHANGE()
  23. SL:RefreshPanelALLRedPoint("KLUISystemLeftPanel")
  24. end
  25. ---响应:启用大师系列 回 : type series:选中启用的系列
  26. function this:RES_OPEN_MASTER_TYPE(id,message)
  27. if message then
  28. local type = tonumber(message["type"])
  29. self.TalentSeriesList[type] = tonumber(message["series"])
  30. end
  31. end
  32. ---响应:大师信息
  33. ---{type = 类型,
  34. ---series = 系列,
  35. ---points = 天赋点数,
  36. ---exchangedExpTimes = 已兑换次数,
  37. ---level = 等级,
  38. ---exp= 当前经验,
  39. ---isFree = 是否免费,
  40. ---talent = 天赋信息有多个{{id = 配置id, level, series系列},{id = 配置id, level, series系列}}}
  41. function this:RES_MASTER_INFO(id,message)
  42. if message then
  43. local type = tonumber(message["type"])
  44. self.TalentSeriesList[type] = tonumber(message["series"])
  45. if self.TalentDatalist[type] then
  46. self.TalentDatalist[type] = {}
  47. end
  48. self:RefreshMasterInfo(message)
  49. SL:onLUAEvent(LUA_EVENT_MASTER_DATA_CHANGE,message)
  50. end
  51. end
  52. ---响应:大师变化信息
  53. ---{type = 类型,
  54. ---series = 系列,
  55. ---points = 天赋点数,
  56. ---exchangedExpTimes = 已兑换次数,
  57. ---level = 等级,
  58. ---exp= 当前经验,
  59. ---isFree = 是否免费,
  60. ---talent = 天赋信息有多个{{id = 配置id, level, series系列},{id = 配置id, level, series系列}}}
  61. function this:RES_MASTER_CHANGE_INFO(id,message)
  62. if message then
  63. self:RefreshMasterInfo(message)
  64. SL:onLUAEvent(LUA_EVENT_MASTER_SKILL_DATA_CHANGE,message)
  65. end
  66. end
  67. ---是否可升级
  68. function this:IsCanUpLevel(id,series,step,type,isShowTips)
  69. local skillLv = self:GetMasterLevel(type,series,id)
  70. local totalNum,frontTalent,consumPoint = self:GetNowTalentLevelInfo(id,skillLv)
  71. --满级
  72. if not totalNum and not frontTalent and not consumPoint then
  73. return true
  74. end
  75. ---前置点数
  76. local frontPoint = self:GetUpperTalentUserPoint(id,type)
  77. ---前置点数是否满足
  78. local isPoint = frontPoint >= totalNum
  79. ---前置天赋是否点亮
  80. local isFrontTalent = self:GetMasterLevel(type,series,frontTalent) > 0
  81. local allPoint = self:GetTalentPoint(type,series)
  82. if totalNum > 0 and consumPoint > allPoint then
  83. if isShowTips then
  84. SL:TipMessage( SL:GetConfig('cfg_string',242).text,1, NoticeType.NoticeMid )--"点数不足",
  85. return false
  86. end
  87. end
  88. if type == EMasterTalentType.SKILL then
  89. if frontTalent > 0 and not isFrontTalent then
  90. if isShowTips then
  91. SL:TipMessage( SL:GetConfig('cfg_string',243).text, 1, NoticeType.NoticeMid )--"前置天赋等级不足",
  92. end
  93. return false
  94. end
  95. if not isPoint then
  96. if isShowTips then
  97. SL:TipMessage( SL:GetConfig('cfg_string',243).text,1, NoticeType.NoticeMid )--"前置天赋等级不足",
  98. end
  99. return false
  100. end
  101. elseif type == EMasterTalentType.CAREER then
  102. if not isPoint then
  103. if isShowTips then
  104. SL:TipMessage( SL:GetConfig('cfg_string',244).text, 1, NoticeType.NoticeMid )--"在该天赋页内已投入的点数不足",
  105. end
  106. return false
  107. end
  108. end
  109. return true
  110. end
  111. ---获取天赋点数
  112. function this:GetTalentPoint(type,series)
  113. type = tonumber(type)
  114. if not self.TalentPointList[type] then
  115. return 0
  116. end
  117. if type == EMasterTalentType.COMMON then
  118. return self.TalentPointList[type]
  119. end
  120. if not self.TalentPointList[type][series] then
  121. return 0
  122. end
  123. return self.TalentPointList[type][series]
  124. end
  125. ---获取最大可升级数
  126. function this:GetMaxPoint(id,lv,maxLevel,type,series)
  127. local addLv = 0
  128. local point = 0
  129. local allPoint = self:GetTalentPoint(type,series)
  130. for i = lv, maxLevel - 1 do
  131. local cfg = self:GetMasterCfg(id,lv + 1)
  132. if cfg then
  133. if point + cfg.consumPoint > allPoint then
  134. break
  135. end
  136. addLv = addLv + 1
  137. point = point + cfg.consumPoint
  138. end
  139. end
  140. return addLv
  141. end
  142. ---刷新信息
  143. function this:RefreshMasterInfo(message)
  144. local type = tonumber(message["type"])
  145. local points = tonumber(message["points"])
  146. if type == EMasterTalentType.COMMON then
  147. self.TalentPointList[type] = points
  148. else
  149. if not self.TalentPointList[type] then
  150. self.TalentPointList[type] = {}
  151. end
  152. self:RefreshPointInfo(message)
  153. end
  154. if not self.TalentDatalist[type] then
  155. self.TalentDatalist[type] = {}
  156. end
  157. local talentList = message["talent"]
  158. for i, v in pairs(talentList) do
  159. local series = tonumber(v["series"])
  160. local cfgId = tonumber(v["cfgId"])
  161. local level = tonumber(v["level"])
  162. if type == EMasterTalentType.COMMON then
  163. self.TalentDatalist[type][cfgId] = level
  164. else
  165. if not self.TalentDatalist[type][series] then
  166. self.TalentDatalist[type][series] = {}
  167. end
  168. self.TalentDatalist[type][series][cfgId] = level
  169. end
  170. end
  171. if type == EMasterTalentType.COMMON then
  172. self.RedDataList[EMasterTalentType.COMMON] = points > 0 and self:GetCommonTalentIsCanAddPoint()
  173. SL:RefreshPanelALLRedPoint("KLUISystemLeftPanel")
  174. SL:onLUAEvent(LUA_EVENT_MASTER_RED_DOT_CHANGE)
  175. end
  176. end
  177. ---获取当前天赋的等级信息
  178. ---@return cfg_master_info_column
  179. function this:GetNowTalentLevelInfo(id,level)
  180. local cfg = self:GetMasterCfg(id,level + 1)
  181. if cfg then
  182. return cfg.frontNum,cfg.frontTalent,cfg.consumPoint
  183. end
  184. return nil,nil,nil
  185. end
  186. ---获取当前类型选择的系列
  187. function this:GetNowTypeSelectSeries(type)
  188. if not self.TalentSeriesList[type] then
  189. return 0
  190. end
  191. return self.TalentSeriesList[type]
  192. end
  193. ---获取当前天赋的等级
  194. function this:GetMasterLevel(type,series,cfgId)
  195. if not self.TalentDatalist[type] then
  196. return 0
  197. end
  198. ---通用的无系列分类
  199. if type == EMasterTalentType.COMMON then
  200. if not self.TalentDatalist[type][cfgId] then
  201. return 0
  202. end
  203. return self.TalentDatalist[type][cfgId]
  204. end
  205. if not self.TalentDatalist[type][series] then
  206. return 0
  207. end
  208. if not self.TalentDatalist[type][series][cfgId] then
  209. return 0
  210. end
  211. return self.TalentDatalist[type][series][cfgId]
  212. end
  213. ---响应:红点信息
  214. ---{type = 类型,
  215. ---points = 天赋点数,
  216. ---exchangedExpTimes = 已兑换次数,
  217. ---level = 等级,
  218. function this:RES_MASTER_RED_DOT_INFO(id,message)
  219. if message then
  220. for i, v in pairs(message) do
  221. self:RefreshRedDataList(v)
  222. end
  223. SL:RefreshPanelALLRedPoint("KLUISystemLeftPanel")
  224. SL:onLUAEvent(LUA_EVENT_MASTER_RED_DOT_CHANGE)
  225. end
  226. end
  227. ---响应:兑换大师经验
  228. ---{type = 类型,
  229. ---points = 天赋点数,
  230. ---exchangedExpTimes = 已兑换次数,
  231. ---level = 等级,
  232. function this:RES_EXCHANGE_MASTER_EXP(id,message)
  233. if message then
  234. self:RefreshRedDataList(message)
  235. SL:RefreshPanelALLRedPoint("KLUISystemLeftPanel")
  236. SL:onLUAEvent(LUA_EVENT_MASTER_RED_DOT_CHANGE)
  237. end
  238. end
  239. ---刷新红点信息
  240. function this:RefreshRedDataList(message)
  241. local exchangedExpTimes = tonumber(message["exchangedExpTimes"])
  242. local points = tonumber(message["points"])
  243. local type = tonumber(message["type"])
  244. local level = tonumber(message["level"])
  245. self.RedDataList[type] = false
  246. if type == EMasterTalentType.COMMON then
  247. self.RedDataList[EMasterTalentType.COMMON] = points > 0 and self:GetCommonTalentIsCanAddPoint()
  248. self.TalentPointList[type] = points
  249. else
  250. if not self.TalentPointList[type] then
  251. self.TalentPointList[type] = {}
  252. end
  253. self:RefreshPointInfo(message)
  254. local maxCount = self:GetTalentMaxCount(type)
  255. local proLevelCfg = self:GetProLevelCfg(level)
  256. local skillLevelCfg = self:GetSkillLevelCfg(level)
  257. --职业天赋有兑换次数且不满级
  258. if type == EMasterTalentType.CAREER
  259. and proLevelCfg and proLevelCfg.exp > 0
  260. and maxCount - exchangedExpTimes > 0 then
  261. self.RedDataList[EMasterTalentType.CAREER] = true
  262. end
  263. --技能天赋有兑换次数且不满级
  264. if type == EMasterTalentType.SKILL
  265. and skillLevelCfg and skillLevelCfg.exp > 0
  266. and maxCount - exchangedExpTimes > 0 then
  267. self.RedDataList[EMasterTalentType.SKILL] = true
  268. end
  269. end
  270. end
  271. ---通用天赋是否可加点
  272. function this:GetCommonTalentIsCanAddPoint()
  273. local cfg = SL:GetConfigTable("cfg_master_commontalent")
  274. ---@param v cfg_master_commontalent_column
  275. for i, v in pairs(cfg) do
  276. --筛选自己职业或者全职业(0为全职业)
  277. if table.contains(v.career,SL:MeData_GetCareer().baseCareer) or table.contains(v.career,0) then
  278. local lv = self:GetMasterLevel(EMasterTalentType.COMMON,nil,v.id)
  279. if lv < v.minMaxLevel[2] then
  280. return true
  281. end
  282. end
  283. end
  284. return false
  285. end
  286. ---刷新天赋点数据
  287. function this:RefreshPointInfo(message)
  288. local type = tonumber(message["type"])
  289. local seriesPoints = message["seriesPoints"]
  290. for i, v in pairs(seriesPoints) do
  291. local series = tonumber(v["series"])
  292. local points = tonumber(v["points"])
  293. if not self.TalentPointList[type][series] then
  294. self.TalentPointList[type][series] = 0
  295. end
  296. self.TalentPointList[type][series] = points
  297. end
  298. end
  299. ---主界面是否有红点(3个类型有一个红点主界面按钮就显示红点)
  300. function this:GetIsMainRed()
  301. for i, v in pairs(self.RedDataList) do
  302. ---@type cfg_system_switch_column
  303. local switchCfg = SL:GetConfig("cfg_system_switch",EMasterTalentSystemSwitchID[i])
  304. if v == true and SL:MeData_GetLevel() >= switchCfg.needLevel then
  305. return true
  306. end
  307. end
  308. return false
  309. end
  310. ---获取天赋最大兑换次数
  311. function this:GetTalentMaxCount(type)
  312. if not self.talentMaxExchangeCountList[type] then
  313. if type == EMasterTalentType.CAREER then
  314. ---@type cfg_global_column
  315. self.talentMaxExchangeCountList[type] = tonumber(SL:GetConfig("cfg_global",4004).value)
  316. end
  317. if type == EMasterTalentType.SKILL then
  318. ---@type cfg_global_column
  319. self.talentMaxExchangeCountList[type] = tonumber(SL:GetConfig("cfg_global",4014).value)
  320. end
  321. end
  322. return self.talentMaxExchangeCountList[type]
  323. end
  324. ---获取玩家职业的所有派系
  325. ---@param class number @1职业天赋;2技能天赋
  326. ---@return table<number,cfg_master_ui_column>
  327. function this:GetFactionsCfg(class)
  328. if not self.FactionsCfg[class] then
  329. self.FactionsCfg[class] = {}
  330. local cfg = SL:GetConfigTable("cfg_master_ui")
  331. ---@param v cfg_master_ui_column
  332. for i, v in pairs(cfg) do
  333. if table.contains(v.career,SL:MeData_GetCareer().baseCareer) or table.contains(v.career,0) then
  334. if v.class == class then
  335. table.insert(self.FactionsCfg[class],v)
  336. end
  337. end
  338. end
  339. table.sort(self.FactionsCfg[class],function(a, b)
  340. return a.id < b.id
  341. end)
  342. end
  343. return self.FactionsCfg[class]
  344. end
  345. ---获取cfg_master_info数据
  346. ---@return cfg_master_info_column
  347. function this:GetMasterCfg(id,lv)
  348. if SL:HasConfigTwoKeys('cfg_master_info',id,lv,'talentId','level') then
  349. return SL:GetConfigTwoKeys('cfg_master_info',id,lv,'talentId','level')
  350. end
  351. return nil
  352. end
  353. ---获取cfg_master_proLevel数据
  354. ---@return cfg_master_proLevel_column
  355. function this:GetProLevelCfg(level)
  356. if SL:HasConfig("cfg_master_proLevel",level) then
  357. return SL:GetConfig("cfg_master_proLevel",level)
  358. end
  359. return nil
  360. end
  361. ---获取cfg_master_skillLevel数据
  362. ---@return cfg_master_skillLevel_column
  363. function this:GetSkillLevelCfg(level)
  364. if SL:HasConfig("cfg_master_skillLevel",level) then
  365. return SL:GetConfig("cfg_master_skillLevel",level)
  366. end
  367. return nil
  368. end
  369. ---获取当前等级消耗点数数
  370. function this:GetNowUsePoint(id,lv)
  371. local point = 0
  372. for i = 1, lv do
  373. local cfg = self:GetMasterCfg(id,i)
  374. if cfg then
  375. point = point + cfg.consumPoint
  376. end
  377. end
  378. return point
  379. end
  380. ---获取上一层使用点数
  381. function this:GetUpperTalentUserPoint(id,type)
  382. local point = 0
  383. ---上层天赋
  384. local talentUpperList = {}
  385. if type == EMasterTalentType.CAREER then
  386. ---@type cfg_master_protalent_column
  387. local nowCfg = SL:GetConfig("cfg_master_protalent",id)
  388. if self.TalentDatalist[EMasterTalentType.CAREER] and self.TalentDatalist[EMasterTalentType.CAREER][nowCfg.series] then
  389. for i, v in pairs(self.TalentDatalist[EMasterTalentType.CAREER][nowCfg.series]) do
  390. point = self:GetNowUsePoint(i,v) + point
  391. end
  392. end
  393. return point
  394. elseif type == EMasterTalentType.SKILL then
  395. ---@type cfg_master_skilltalent_column
  396. local nowCfg = SL:GetConfig("cfg_master_skilltalent",id)
  397. ---@type cfg_master_skilltalent_column
  398. local upCfg = nil
  399. local cfg = SL:GetConfigTable("cfg_master_skilltalent")
  400. ---@param v cfg_master_skilltalent_column
  401. for i, v in pairs(cfg) do
  402. if table.contains(v.career,SL:MeData_GetCareer().baseCareer) or table.contains(v.career,0) then
  403. if nowCfg.id ~= v.id and nowCfg.series == v.series and nowCfg.row == v.row and nowCfg.steps - 1 == v.steps then
  404. upCfg = v
  405. break
  406. end
  407. end
  408. end
  409. if upCfg and self.TalentDatalist then
  410. if upCfg.steps == 0 and upCfg.type == 2 then
  411. if self.TalentDatalist[EMasterTalentType.CAREER]
  412. and self.TalentDatalist[EMasterTalentType.CAREER][upCfg.series]
  413. and self.TalentDatalist[EMasterTalentType.CAREER][upCfg.series][upCfg.proTalentId] then
  414. point = self:GetNowUsePoint(upCfg.proTalentId,self.TalentDatalist[EMasterTalentType.CAREER][upCfg.series][upCfg.proTalentId])
  415. end
  416. else
  417. if self.TalentDatalist[EMasterTalentType.SKILL]
  418. and self.TalentDatalist[EMasterTalentType.SKILL][upCfg.series]
  419. and self.TalentDatalist[EMasterTalentType.SKILL][upCfg.series][upCfg.id] then
  420. point = self:GetNowUsePoint(upCfg.id,self.TalentDatalist[EMasterTalentType.SKILL][upCfg.series][upCfg.id])
  421. end
  422. end
  423. end
  424. return point
  425. end
  426. return point
  427. end
  428. function this:Reset()
  429. ---天赋信息
  430. self.TalentDatalist = {}
  431. ---天赋选择的系列
  432. self.TalentSeriesList = {}
  433. ---天赋点数数据
  434. self.TalentPointList = {}
  435. self.FactionsCfg = {}
  436. ---红点信息
  437. self.RedDataList = {
  438. [EMasterTalentType.CAREER] = false,
  439. [EMasterTalentType.SKILL] = false,
  440. [EMasterTalentType.COMMON] = false,
  441. [EMasterTalentType.Archange] = false,
  442. }
  443. self.talentMaxExchangeCountList = {}
  444. end