123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477 |
- ---@class UIMasterTalentInfo @注释
- ---@field FactionsCfg table<number,cfg_master_ui_column>
- UIMasterTalentInfo = class()
- local this = UIMasterTalentInfo
- function this:ctor()
- end
- function this:Init()
- self:Reset()
- self:InitData()
- self:RegistMessages()
- end
- function this:InitData()
- end
- function this:RegistMessages()
- SL:RegisterLuaNetMsg(LuaMessageIdToClient.RES_MASTER_RED_DOT_INFO,self.RES_MASTER_RED_DOT_INFO,self)
- SL:RegisterLuaNetMsg(LuaMessageIdToClient.RES_MASTER_INFO,self.RES_MASTER_INFO,self)
- SL:RegisterLuaNetMsg(LuaMessageIdToClient.RES_MASTER_CHANGE_INFO,self.RES_MASTER_CHANGE_INFO,self)
- SL:RegisterLuaNetMsg(LuaMessageIdToClient.RES_OPEN_MASTER_TYPE,self.RES_OPEN_MASTER_TYPE,self)
- SL:RegisterLuaNetMsg(LuaMessageIdToClient.RES_EXCHANGE_MASTER_EXP,self.RES_EXCHANGE_MASTER_EXP,self)
- SL:RegisterLUAEvent(LUA_EVENT_LEVELCHANGE, self.LUA_EVENT_LEVELCHANGE, self)--主角等级改变事件
- end
- function this:LUA_EVENT_LEVELCHANGE()
- SL:RefreshPanelALLRedPoint("KLUISystemLeftPanel")
- end
- ---响应:启用大师系列 回 : type series:选中启用的系列
- function this:RES_OPEN_MASTER_TYPE(id,message)
- if message then
- local type = tonumber(message["type"])
- self.TalentSeriesList[type] = tonumber(message["series"])
- end
- end
- ---响应:大师信息
- ---{type = 类型,
- ---series = 系列,
- ---points = 天赋点数,
- ---exchangedExpTimes = 已兑换次数,
- ---level = 等级,
- ---exp= 当前经验,
- ---isFree = 是否免费,
- ---talent = 天赋信息有多个{{id = 配置id, level, series系列},{id = 配置id, level, series系列}}}
- function this:RES_MASTER_INFO(id,message)
- if message then
- local type = tonumber(message["type"])
- self.TalentSeriesList[type] = tonumber(message["series"])
- if self.TalentDatalist[type] then
- self.TalentDatalist[type] = {}
- end
- self:RefreshMasterInfo(message)
- SL:onLUAEvent(LUA_EVENT_MASTER_DATA_CHANGE,message)
- end
- end
- ---响应:大师变化信息
- ---{type = 类型,
- ---series = 系列,
- ---points = 天赋点数,
- ---exchangedExpTimes = 已兑换次数,
- ---level = 等级,
- ---exp= 当前经验,
- ---isFree = 是否免费,
- ---talent = 天赋信息有多个{{id = 配置id, level, series系列},{id = 配置id, level, series系列}}}
- function this:RES_MASTER_CHANGE_INFO(id,message)
- if message then
- self:RefreshMasterInfo(message)
- SL:onLUAEvent(LUA_EVENT_MASTER_SKILL_DATA_CHANGE,message)
- end
- end
- ---是否可升级
- function this:IsCanUpLevel(id,series,step,type,isShowTips)
- local skillLv = self:GetMasterLevel(type,series,id)
- local totalNum,frontTalent,consumPoint = self:GetNowTalentLevelInfo(id,skillLv)
- --满级
- if not totalNum and not frontTalent and not consumPoint then
- return true
- end
- ---前置点数
- local frontPoint = self:GetUpperTalentUserPoint(id,type)
- ---前置点数是否满足
- local isPoint = frontPoint >= totalNum
- ---前置天赋是否点亮
- local isFrontTalent = self:GetMasterLevel(type,series,frontTalent) > 0
- local allPoint = self:GetTalentPoint(type,series)
- if totalNum > 0 and consumPoint > allPoint then
- if isShowTips then
- SL:TipMessage( SL:GetConfig('cfg_string',242).text,1, NoticeType.NoticeMid )--"点数不足",
- return false
- end
- end
- if type == EMasterTalentType.SKILL then
- if frontTalent > 0 and not isFrontTalent then
- if isShowTips then
- SL:TipMessage( SL:GetConfig('cfg_string',243).text, 1, NoticeType.NoticeMid )--"前置天赋等级不足",
- end
- return false
- end
- if not isPoint then
- if isShowTips then
- SL:TipMessage( SL:GetConfig('cfg_string',243).text,1, NoticeType.NoticeMid )--"前置天赋等级不足",
- end
- return false
- end
- elseif type == EMasterTalentType.CAREER then
- if not isPoint then
- if isShowTips then
- SL:TipMessage( SL:GetConfig('cfg_string',244).text, 1, NoticeType.NoticeMid )--"在该天赋页内已投入的点数不足",
- end
- return false
- end
- end
- return true
- end
- ---获取天赋点数
- function this:GetTalentPoint(type,series)
- type = tonumber(type)
- if not self.TalentPointList[type] then
- return 0
- end
- if type == EMasterTalentType.COMMON then
- return self.TalentPointList[type]
- end
- if not self.TalentPointList[type][series] then
- return 0
- end
- return self.TalentPointList[type][series]
- end
- ---获取最大可升级数
- function this:GetMaxPoint(id,lv,maxLevel,type,series)
- local addLv = 0
- local point = 0
- local allPoint = self:GetTalentPoint(type,series)
- for i = lv, maxLevel - 1 do
- local cfg = self:GetMasterCfg(id,lv + 1)
- if cfg then
- if point + cfg.consumPoint > allPoint then
- break
- end
- addLv = addLv + 1
- point = point + cfg.consumPoint
- end
- end
- return addLv
- end
- ---刷新信息
- function this:RefreshMasterInfo(message)
- local type = tonumber(message["type"])
- local points = tonumber(message["points"])
- if type == EMasterTalentType.COMMON then
- self.TalentPointList[type] = points
- else
- if not self.TalentPointList[type] then
- self.TalentPointList[type] = {}
- end
- self:RefreshPointInfo(message)
- end
- if not self.TalentDatalist[type] then
- self.TalentDatalist[type] = {}
- end
- local talentList = message["talent"]
- for i, v in pairs(talentList) do
- local series = tonumber(v["series"])
- local cfgId = tonumber(v["cfgId"])
- local level = tonumber(v["level"])
- if type == EMasterTalentType.COMMON then
- self.TalentDatalist[type][cfgId] = level
- else
- if not self.TalentDatalist[type][series] then
- self.TalentDatalist[type][series] = {}
- end
- self.TalentDatalist[type][series][cfgId] = level
- end
- end
- if type == EMasterTalentType.COMMON then
- self.RedDataList[EMasterTalentType.COMMON] = points > 0 and self:GetCommonTalentIsCanAddPoint()
- SL:RefreshPanelALLRedPoint("KLUISystemLeftPanel")
- SL:onLUAEvent(LUA_EVENT_MASTER_RED_DOT_CHANGE)
- end
- end
- ---获取当前天赋的等级信息
- ---@return cfg_master_info_column
- function this:GetNowTalentLevelInfo(id,level)
- local cfg = self:GetMasterCfg(id,level + 1)
- if cfg then
- return cfg.frontNum,cfg.frontTalent,cfg.consumPoint
- end
- return nil,nil,nil
- end
- ---获取当前类型选择的系列
- function this:GetNowTypeSelectSeries(type)
- if not self.TalentSeriesList[type] then
- return 0
- end
- return self.TalentSeriesList[type]
- end
- ---获取当前天赋的等级
- function this:GetMasterLevel(type,series,cfgId)
- if not self.TalentDatalist[type] then
- return 0
- end
- ---通用的无系列分类
- if type == EMasterTalentType.COMMON then
- if not self.TalentDatalist[type][cfgId] then
- return 0
- end
- return self.TalentDatalist[type][cfgId]
- end
- if not self.TalentDatalist[type][series] then
- return 0
- end
- if not self.TalentDatalist[type][series][cfgId] then
- return 0
- end
- return self.TalentDatalist[type][series][cfgId]
- end
- ---响应:红点信息
- ---{type = 类型,
- ---points = 天赋点数,
- ---exchangedExpTimes = 已兑换次数,
- ---level = 等级,
- function this:RES_MASTER_RED_DOT_INFO(id,message)
- if message then
- for i, v in pairs(message) do
- self:RefreshRedDataList(v)
- end
- SL:RefreshPanelALLRedPoint("KLUISystemLeftPanel")
- SL:onLUAEvent(LUA_EVENT_MASTER_RED_DOT_CHANGE)
- end
- end
- ---响应:兑换大师经验
- ---{type = 类型,
- ---points = 天赋点数,
- ---exchangedExpTimes = 已兑换次数,
- ---level = 等级,
- function this:RES_EXCHANGE_MASTER_EXP(id,message)
- if message then
- self:RefreshRedDataList(message)
- SL:RefreshPanelALLRedPoint("KLUISystemLeftPanel")
- SL:onLUAEvent(LUA_EVENT_MASTER_RED_DOT_CHANGE)
- end
- end
- ---刷新红点信息
- function this:RefreshRedDataList(message)
- local exchangedExpTimes = tonumber(message["exchangedExpTimes"])
- local points = tonumber(message["points"])
- local type = tonumber(message["type"])
- local level = tonumber(message["level"])
- self.RedDataList[type] = false
- if type == EMasterTalentType.COMMON then
- self.RedDataList[EMasterTalentType.COMMON] = points > 0 and self:GetCommonTalentIsCanAddPoint()
- self.TalentPointList[type] = points
- else
- if not self.TalentPointList[type] then
- self.TalentPointList[type] = {}
- end
- self:RefreshPointInfo(message)
- local maxCount = self:GetTalentMaxCount(type)
- local proLevelCfg = self:GetProLevelCfg(level)
- local skillLevelCfg = self:GetSkillLevelCfg(level)
- --职业天赋有兑换次数且不满级
- if type == EMasterTalentType.CAREER
- and proLevelCfg and proLevelCfg.exp > 0
- and maxCount - exchangedExpTimes > 0 then
- self.RedDataList[EMasterTalentType.CAREER] = true
- end
- --技能天赋有兑换次数且不满级
- if type == EMasterTalentType.SKILL
- and skillLevelCfg and skillLevelCfg.exp > 0
- and maxCount - exchangedExpTimes > 0 then
- self.RedDataList[EMasterTalentType.SKILL] = true
- end
- end
- end
- ---通用天赋是否可加点
- function this:GetCommonTalentIsCanAddPoint()
- local cfg = SL:GetConfigTable("cfg_master_commontalent")
- ---@param v cfg_master_commontalent_column
- for i, v in pairs(cfg) do
- --筛选自己职业或者全职业(0为全职业)
- if table.contains(v.career,SL:MeData_GetCareer().baseCareer) or table.contains(v.career,0) then
- local lv = self:GetMasterLevel(EMasterTalentType.COMMON,nil,v.id)
- if lv < v.minMaxLevel[2] then
- return true
- end
- end
- end
- return false
- end
- ---刷新天赋点数据
- function this:RefreshPointInfo(message)
- local type = tonumber(message["type"])
- local seriesPoints = message["seriesPoints"]
- for i, v in pairs(seriesPoints) do
- local series = tonumber(v["series"])
- local points = tonumber(v["points"])
- if not self.TalentPointList[type][series] then
- self.TalentPointList[type][series] = 0
- end
- self.TalentPointList[type][series] = points
- end
- end
- ---主界面是否有红点(3个类型有一个红点主界面按钮就显示红点)
- function this:GetIsMainRed()
- for i, v in pairs(self.RedDataList) do
- ---@type cfg_system_switch_column
- local switchCfg = SL:GetConfig("cfg_system_switch",EMasterTalentSystemSwitchID[i])
- if v == true and SL:MeData_GetLevel() >= switchCfg.needLevel then
- return true
- end
- end
- return false
- end
- ---获取天赋最大兑换次数
- function this:GetTalentMaxCount(type)
- if not self.talentMaxExchangeCountList[type] then
- if type == EMasterTalentType.CAREER then
- ---@type cfg_global_column
- self.talentMaxExchangeCountList[type] = tonumber(SL:GetConfig("cfg_global",4004).value)
- end
- if type == EMasterTalentType.SKILL then
- ---@type cfg_global_column
- self.talentMaxExchangeCountList[type] = tonumber(SL:GetConfig("cfg_global",4014).value)
- end
- end
- return self.talentMaxExchangeCountList[type]
- end
- ---获取玩家职业的所有派系
- ---@param class number @1职业天赋;2技能天赋
- ---@return table<number,cfg_master_ui_column>
- function this:GetFactionsCfg(class)
- if not self.FactionsCfg[class] then
- self.FactionsCfg[class] = {}
- local cfg = SL:GetConfigTable("cfg_master_ui")
- ---@param v cfg_master_ui_column
- for i, v in pairs(cfg) do
- if table.contains(v.career,SL:MeData_GetCareer().baseCareer) or table.contains(v.career,0) then
- if v.class == class then
- table.insert(self.FactionsCfg[class],v)
- end
- end
- end
- table.sort(self.FactionsCfg[class],function(a, b)
- return a.id < b.id
- end)
- end
- return self.FactionsCfg[class]
- end
- ---获取cfg_master_info数据
- ---@return cfg_master_info_column
- function this:GetMasterCfg(id,lv)
- if SL:HasConfigTwoKeys('cfg_master_info',id,lv,'talentId','level') then
- return SL:GetConfigTwoKeys('cfg_master_info',id,lv,'talentId','level')
- end
- return nil
- end
- ---获取cfg_master_proLevel数据
- ---@return cfg_master_proLevel_column
- function this:GetProLevelCfg(level)
- if SL:HasConfig("cfg_master_proLevel",level) then
- return SL:GetConfig("cfg_master_proLevel",level)
- end
- return nil
- end
- ---获取cfg_master_skillLevel数据
- ---@return cfg_master_skillLevel_column
- function this:GetSkillLevelCfg(level)
- if SL:HasConfig("cfg_master_skillLevel",level) then
- return SL:GetConfig("cfg_master_skillLevel",level)
- end
- return nil
- end
- ---获取当前等级消耗点数数
- function this:GetNowUsePoint(id,lv)
- local point = 0
- for i = 1, lv do
- local cfg = self:GetMasterCfg(id,i)
- if cfg then
- point = point + cfg.consumPoint
- end
- end
- return point
- end
- ---获取上一层使用点数
- function this:GetUpperTalentUserPoint(id,type)
- local point = 0
- ---上层天赋
- local talentUpperList = {}
- if type == EMasterTalentType.CAREER then
- ---@type cfg_master_protalent_column
- local nowCfg = SL:GetConfig("cfg_master_protalent",id)
- if self.TalentDatalist[EMasterTalentType.CAREER] and self.TalentDatalist[EMasterTalentType.CAREER][nowCfg.series] then
- for i, v in pairs(self.TalentDatalist[EMasterTalentType.CAREER][nowCfg.series]) do
- point = self:GetNowUsePoint(i,v) + point
- end
- end
-
- return point
- elseif type == EMasterTalentType.SKILL then
- ---@type cfg_master_skilltalent_column
- local nowCfg = SL:GetConfig("cfg_master_skilltalent",id)
- ---@type cfg_master_skilltalent_column
- local upCfg = nil
- local cfg = SL:GetConfigTable("cfg_master_skilltalent")
- ---@param v cfg_master_skilltalent_column
- for i, v in pairs(cfg) do
- if table.contains(v.career,SL:MeData_GetCareer().baseCareer) or table.contains(v.career,0) then
- if nowCfg.id ~= v.id and nowCfg.series == v.series and nowCfg.row == v.row and nowCfg.steps - 1 == v.steps then
- upCfg = v
- break
- end
- end
- end
- if upCfg and self.TalentDatalist then
- if upCfg.steps == 0 and upCfg.type == 2 then
- if self.TalentDatalist[EMasterTalentType.CAREER]
- and self.TalentDatalist[EMasterTalentType.CAREER][upCfg.series]
- and self.TalentDatalist[EMasterTalentType.CAREER][upCfg.series][upCfg.proTalentId] then
- point = self:GetNowUsePoint(upCfg.proTalentId,self.TalentDatalist[EMasterTalentType.CAREER][upCfg.series][upCfg.proTalentId])
- end
- else
- if self.TalentDatalist[EMasterTalentType.SKILL]
- and self.TalentDatalist[EMasterTalentType.SKILL][upCfg.series]
- and self.TalentDatalist[EMasterTalentType.SKILL][upCfg.series][upCfg.id] then
- point = self:GetNowUsePoint(upCfg.id,self.TalentDatalist[EMasterTalentType.SKILL][upCfg.series][upCfg.id])
- end
- end
- end
- return point
- end
- return point
- end
- function this:Reset()
- ---天赋信息
- self.TalentDatalist = {}
- ---天赋选择的系列
- self.TalentSeriesList = {}
- ---天赋点数数据
- self.TalentPointList = {}
- self.FactionsCfg = {}
- ---红点信息
- self.RedDataList = {
- [EMasterTalentType.CAREER] = false,
- [EMasterTalentType.SKILL] = false,
- [EMasterTalentType.COMMON] = false,
- [EMasterTalentType.Archange] = false,
- }
- self.talentMaxExchangeCountList = {}
- end
|