local Advanced_Model = {} local private = {} local hero_advance_pb = require 'Proto/hero_advance_pb' local resonance_info = require 'Proto/resonance_info_pb' local EventSystem = require('Event/EventSystem') local SingleSweepEnergy = 5 private.rewardClientShowCfgData = {} private.barrierChosenCfgData = {} function Advanced_Model.OnStartup() NetManager.RegisterMsgCB(MessageEnums.MessageHeroAdvance, private.HeroAdvanceResponse) NetManager.RegisterMsgCB(MessageEnums.MessageHeroAdvanceEquipMaterial, private.MaterialEquipResponse) private.InitCfgData() end function Advanced_Model.GetMaterialAttrTableById(heroId, advanceId, index) local materialAttrId = DataSheetManager.HeroAdvanceAttr:GetDataByAdvanceTemplateID_AdvanceID(DataSheetManager.HeroNum:GetDataByID(heroId).AdvanceTemplateID, advanceId).Material_Table[index].MaterialAttr return DataSheetManager.HeroMaterialAttrRepeat:GetDataByAttrRepeatID(materialAttrId).Attr_Table end function Advanced_Model.GetLevelUpAttrTableById(heroId, advanceId) local LevelUpAttrId = DataSheetManager.HeroAdvanceAttr:GetDataByAdvanceTemplateID_AdvanceID(DataSheetManager.HeroNum:GetDataByID(heroId).AdvanceTemplateID, advanceId).LvupAttr return DataSheetManager.HeroAdvLvupRepeat:GetDataByLvupRepeatID(LevelUpAttrId).Lvup_Table end function Advanced_Model.GetRequireMaterialTable(id) return DataSheetManager.HeroAdvance:GetDataByAdvanceID(Advanced_Model.GetHeroAdvancedInfo(id)).Item_Table end function Advanced_Model.GetStarInfoOfAdvanced(id) local advancedData = DataSheetManager.HeroAdvance:GetDataByAdvanceID(Advanced_Model.GetHeroAdvancedInfo(id)) return advancedData.SumStar, advancedData.LightStar end function Advanced_Model.GetHeroAdvancedInfo(id) return MDL.HeroSelect.GetHeroInfo(id).heroAdvanceLevel end function Advanced_Model.GetHeroAdvancedMaterialInfo(id) local info = MDL.HeroSelect.GetHeroInfo(id).advanceEquipState if IsServerDataNotNil(info) then return info else return {false, false, false, false} end end function private.InitCfgData() for i, v in DataSheetManager.RewardClientShow:GetEnumerator() do for _, itemID in ipairs(v.ItemID) do if not private.rewardClientShowCfgData[itemID] then private.rewardClientShowCfgData[itemID] = {} end table.insert(private.rewardClientShowCfgData[itemID], v.ClientShowID) end end for i, v in DataSheetManager.BarrierChosenData:GetEnumerator() do if not private.barrierChosenCfgData[v.RewardClientShowID] then private.barrierChosenCfgData[v.RewardClientShowID] = {} end private.barrierChosenCfgData[v.RewardClientShowID] = v.ID end end function Advanced_Model.GetSortedLevelIdByItemId(itemId) local rewardIdList = private.rewardClientShowCfgData[itemId] local levelIdList = {} for _, id in ipairs(rewardIdList) do table.insert(levelIdList, private.barrierChosenCfgData[id]) end table.sort(levelIdList, Advanced_Model.SortLevelIdList) return levelIdList end function Advanced_Model.GetFirstLevelIdByItemId(itemId) local levelIdList = Advanced_Model.GetSortedLevelIdByItemId(itemId) for i, v in ipairs(levelIdList) do local starNum = MDL.LevelSelect.GetLevelStarNumById(v) if starNum > 0 then return v end end return nil end function Advanced_Model.SortLevelIdList(a, b) local isAUnlock = MDL.LevelSelect.IsLevelUnlock(a) local isBUnlock = MDL.LevelSelect.IsLevelUnlock(b) if isAUnlock and isBUnlock then return a > b elseif isAUnlock then return true elseif isBUnlock then return false else return a > b end end function Advanced_Model.IsHeroCanAdvance(heroId) if not MDL.HeroSelect.IsHasHero(heroId) then return false end if MDL.Unlock.IsUnlock(MDL.Unlock.FunctionType.Advanced) then if CTL.Unlock.JudgeIfSatisfiedUnlockTable(DataSheetManager.FuctionUnlock:GetDataByFucID(MDL.Unlock.FunctionType.Advanced).Unlock_Table) then if CTL.Advanced.IsCouldAdvance(heroId) then if not CTL.Advanced.IsReachMaxAdvanceLevel(heroId) and CTL.Advanced.IsHeroLevelReachLimit(heroId) then if CTL.Advanced.IsAdvanceItemEnough(heroId) then return true end end else if CTL.Advanced.IsMaterialEnough(heroId) then return true end end end end return false end function Advanced_Model.IsHeroCanGatherToAdvance(heroId) if not MDL.HeroSelect.IsHasHero(heroId) then return false end if MDL.Unlock.IsUnlock(MDL.Unlock.FunctionType.Advanced) then if CTL.Unlock.JudgeIfSatisfiedUnlockTable(DataSheetManager.FuctionUnlock:GetDataByFucID(MDL.Unlock.FunctionType.Advanced).Unlock_Table) then local advancedInfo = MDL.Advanced.GetHeroAdvancedMaterialInfo(heroId) local advancedItemData = MDL.Advanced.GetRequireMaterialTable(heroId) for i, v in ipairs(advancedInfo) do if not v then local itemId = advancedItemData[i].ItemID local needCount = advancedItemData[i].ItemNum local hasCount = MDL.Currency.GetSoftTokenCountById(itemId) or 0 if hasCount < needCount then if CTL.Advanced.IsHasLevelCanSweep(itemId) then return MDL.Player.GetEnergyValue() >= (needCount - hasCount) * SingleSweepEnergy end end end end end end return false end function Advanced_Model.HeroAdvanceRequest(id) local msg = hero_advance_pb.HeroAdvanceReq() msg.HeroId = id NetManager.SendMessage(MessageEnums.MessageHeroAdvance, msg) end function private.HeroAdvanceResponse(msgResp) if msgResp.Resp.Code == 0 then BIManager.DispatchBIClientEvent(BIManager.EventName.HeroAdvance) EventSystem.Dispatch(EventID.UI_RefreshAdvancedInfo) EventSystem.Dispatch(EventID.UI_PlayAdvanceJadeEffect, msgResp.HeroId) if CTL.Advanced.IsGreatAdvanced(msgResp.HeroId) then MDL.FormationResonance.SetSubResonanceOprType(resonance_info.Hero_Advance) UIManager.OpenView(Const_UI_Lua.UIEnum.UIHeroAdvancedSuccess, {msgResp.HeroId}) else UIManager.CloseView(Const_UI_Lua.UIEnum.UIHeroAdvancedTips) UIManager.OpenView(Const_UI_Lua.UIEnum.UIHeroAdvancedTips, {heroId = msgResp.HeroId}) end end end function Advanced_Model.MaterialEquipRequest(id, indexTable) local msg = hero_advance_pb.HeroAdvanceEquipMaterialReq() msg.HeroId = id if not indexTable or type(indexTable) == "table" then for i,v in ipairs(indexTable) do table.insert(msg.EquipIndex, v) end EventSystem.Dispatch(EventID.UI_EquipAdvanceMaterial, indexTable) else --点击单个物体的时候的情况,只发一个固定的index数字 table.insert(msg.EquipIndex, indexTable) EventSystem.Dispatch(EventID.UI_EquipAdvanceMaterial, {indexTable}) end NetManager.SendMessage(MessageEnums.MessageHeroAdvanceEquipMaterial, msg) end function private.MaterialEquipResponse(msgResp) if msgResp.Resp.Code == 0 then EventSystem.Dispatch(EventID.UI_RefreshAdvancedInfo) UIManager.CloseView(Const_UI_Lua.UIEnum.UIHeroAdvancedTips) UIManager.OpenView(Const_UI_Lua.UIEnum.UIHeroAdvancedTips, {materialIndex = msgResp.EquipIndex}) end end return Advanced_Model