local DivineWeapon_Model = {} local private = {} local magicWeaponList = {} local magic_weapon_pb = require('Proto/magic_weapon_pb') local resonance_info = require 'Proto/resonance_info_pb' local foundry_pb = require 'Proto.foundry_pb' local EventSystem = require('Event/EventSystem') local curReqId = nil local curActiveState = false --当前是否在激活的动画中 DivineWeapon_Model.STARMAX = 7 DivineWeapon_Model.ItemUseAppearanceId = nil local FORGE_LINE_COUNT = 3 local DIVINE_WEAPON_ACTIVE_ITEM = 5100 --神兵符石 function DivineWeapon_Model.OnStartup() NetManager.RegisterMsgCB(MessageEnums.MessageActiveMagicWeapon,private.ActiveDivineWeaponResp) NetManager.RegisterMsgCB(MessageEnums.MessageBreakMagicWeapon,private.BreakMagicWeaponResp) NetManager.RegisterMsgCB(MessageEnums.MessageOneKeyActiveWeapon, private.OneKeyActiveWeaponResp) NetManager.RegisterMsgCB(MessageEnums.MessageFoundryActivate, private.FoundryActivateResp) EventSystem.Regist(EventID.AcquireSystemRedAfterUnlock, private.OnEnterWorldPostprocess) EventSystem.Regist(EventID.UI_AssistanceFight_HeroChange, private.SortMagicWeaponList) EventSystem.Regist(EventID.UI_HeroFormation_ChangeHero, private.SortMagicWeaponList) EventSystem.Regist(EventID.UI_HeroSelect_RefreshAfterActiveHero, private.SortMagicWeaponList) EventSystem.Regist(EventID.HideGolden_DataChanged, private.InitMagicWeaponList) CTL.Bag.RegisteEventByItemId(DIVINE_WEAPON_ACTIVE_ITEM , private.SortMagicWeaponList) private.forgeProgressInfos = LuaExt.CreateTable(DataSheetManager.MagicWeaponData:GetDataCount()) end function private.OnEnterWorldPostprocess() private.InitMagicWeaponList() end function private.InitMagicWeaponList() magicWeaponList = {} for i,v in DataSheetManager.MagicWeaponData:GetEnumerator() do if MDL.HideGolden.IsShowGoldenByID(LuaConst.ShowGoldenType.Hero, v.MagicWeaponID) then -- 屏蔽金武将对应的金神兵 table.insert(magicWeaponList, v) end end private.SortMagicWeaponList() end function private.SortMagicWeaponList() table.sort(magicWeaponList, DivineWeapon_Model.Sort) end function DivineWeapon_Model:OnShutdown() private.forgeProgressInfos = nil end function DivineWeapon_Model.IsActiveState() return curActiveState end function DivineWeapon_Model.SetActiveState(value) curActiveState = value end function DivineWeapon_Model.GetFormationData() local lineUpHeroIds = MDL.Formation.GetSlotHeroIds() --MDL.Player.GetHeroLinUpIds() local list = {} for i,v in ipairs(lineUpHeroIds) do if v>0 then table.insert(list,DataSheetManager.MagicWeaponData:GetDataByMagicWeaponID(v)) end end return list end function DivineWeapon_Model.GetAllData() return magicWeaponList end -- 返回已激活神兵数组 function DivineWeapon_Model.GetHasWeaponList() local hasWeaponList = {} for i,v in ipairs(DivineWeapon_Model.GetAllData()) do local heroServerInfo = MDL.HeroSelect.GetHeroInfo(v.MagicWeaponID) if heroServerInfo and heroServerInfo.isMagicWeaponActive then table.insert(hasWeaponList, v) end end return hasWeaponList end function DivineWeapon_Model.GetCostInfo(id) local data = DataSheetManager.MagicWeaponItemRepeat:GetDataByItemRepeatID(id) if data then return data.Item_Table end return nil end function DivineWeapon_Model.GetBreakMax(id) local max = -1 for key, value in DataSheetManager.MagicWeaponStar:GetDataByMagicWeaponID_Star(id) do max = max + 1 end return max end function DivineWeapon_Model.IsWeaponMax(heroId) local heroInfo = MDL.HeroSelect.GetHeroInfo(heroId) if heroInfo then local max = DivineWeapon_Model.GetBreakMax(heroId) return heroInfo.magicWeaponLevel >= max end return false end function DivineWeapon_Model.GetEnoughLevel(data) --data.ActivateItem if not MDL.Unlock.IsUnlock(MDL.Unlock.FunctionType.Weapon) then return end local heroInfo = MDL.HeroSelect.GetHeroInfo(data.MagicWeaponID) if heroInfo == nil then return false end local costInfo = nil if heroInfo.isMagicWeaponActive then local weaponLevel = heroInfo.magicWeaponLevel or 0 local weaponStar = (heroInfo.magicWeaponStar or 0 )+1 if DivineWeapon_Model.GetBreakMax(data.MagicWeaponID) == weaponLevel then return false end local heroStar = heroInfo.starLevel or 0 if (weaponStar == DivineWeapon_Model.STARMAX and heroStar == weaponLevel) or heroStar < weaponLevel then return false end local dataTemp = DataSheetManager.MagicWeaponStar:GetDataByMagicWeaponID_Star(data.MagicWeaponID,weaponLevel) local costData = DataSheetManager.MagicWeaponStarItem:GetDataByItemRepeatID(dataTemp.Item_Table[weaponStar].ItemRepeat) costInfo = costData.Item_Table else local curPhase = heroInfo.magicWeaponActivePhase + 1 costInfo = DivineWeapon_Model.GetCostInfo(data.Item_Table[curPhase].ItemRepeat) end local count1 = MDL.Bag.GetItemCount(costInfo[1].ItemID) if count1 0 then local count2 = MDL.Bag.GetItemCount(costInfo[2].ItemID) if count2 bWeightValue end --[[ @desc: author:{author} time:2020-04-11 16:15:13 --@data: @return: 根据权值去排序 有四种排序条件 是否上阵 是否激活 品质高低 进阶程度高低 iD 大小 以上阵 以900000 往上加 以助战 以800000 往上加 未上阵 以激活 以700000 往上加 未上阵 可点击的 以600000 往上加 未上阵 不可点击的 以500000 往上加 这里主要是加每个值时不能超过前一个值 比如 x+y y不能大于x ]] function private.GetWeightValue(data) local lineUpHeroIds = MDL.Formation.GetSlotHeroIds() local heroInfo = MDL.HeroSelect.GetHeroInfo(data.MagicWeaponID) for i,v in ipairs(lineUpHeroIds) do if v == data.MagicWeaponID then return 900000 - i end end if MDL.AssistanceFight.IsHeroOnAssistancePos(data.MagicWeaponID) then return 800000 + data.MagicWeaponQuality*10000 - data.MagicWeaponID end local heros = MDL.HeroSelect.GetHasHeroList() for i,v in ipairs(heros) do if v.isMagicWeaponActive and v.heroId == data.MagicWeaponID then return 700000 + data.MagicWeaponQuality*10000 - data.MagicWeaponID elseif not v.isMagicWeaponActive and v.heroId == data.MagicWeaponID and DivineWeapon_Model.GetEnoughLevel(data) then return 600000 + data.MagicWeaponQuality*10000 + v.magicWeaponActivePhase*1000 - data.MagicWeaponID elseif not v.isMagicWeaponActive and v.heroId == data.MagicWeaponID and not DivineWeapon_Model.GetEnoughLevel(data) then return 500000 + data.MagicWeaponQuality*10000 + v.magicWeaponActivePhase*100 - data.MagicWeaponID end end return data.MagicWeaponQuality*100-data.MagicWeaponID end function DivineWeapon_Model.SetForgeInfos(foundryActivateInfo) if not IsServerDataNotNil(foundryActivateInfo) then return end for _, v in ipairs (foundryActivateInfo.foundryInfo) do if not private.forgeProgressInfos[v.heroId] then private.forgeProgressInfos[v.heroId] = LuaExt.CreateTable(FORGE_LINE_COUNT) end local progressInfo = private.forgeProgressInfos[v.heroId] for i, v in ipairs(progressInfo) do progressInfo[i] = 0 end for _, line in ipairs (v.accordLineId) do progressInfo[line.lineType] = line.lineId end end EventSystem.Dispatch(EventID.UI_DivineWeapon_ForgeUpdate) -- 纳灵系统刷新 MDL.Reborn.SyncRFMaterialDic(MDL.Reborn.RFMaterialType.ForgeWeapon) end function DivineWeapon_Model.GetForgeLineMaxActivatePointID(heroId, lineType) if not private.forgeProgressInfos[heroId] then return 0 end local progressInfo = private.forgeProgressInfos[heroId] if not progressInfo[lineType] then return 0 end return progressInfo[lineType] end --*****协议处理***** function DivineWeapon_Model.ActiveDivineWeaponRequest(id) logging.log(LTAG.LOG, "ActiveDivineWeaponRequest", id) local msg = magic_weapon_pb.ActiveMagicWeaponReq() msg.HeroId = id curReqId = id NetManager.SendMessage(MessageEnums.MessageActiveMagicWeapon,msg) end function private.ActiveDivineWeaponResp(msgResp) logging.log(LTAG.LOG, "ActiveDivineWeaponResp",msgResp) if msgResp.Resp.Code == 0 then private.SortMagicWeaponList() MDL.FormationResonance.SetSubResonanceOprType(resonance_info.Weapon_Break) EventSystem.Dispatch(EventID.UI_DivineWeapon_Update) end end function DivineWeapon_Model.BreakMagicWeaponRequest(id) logging.log(LTAG.LOG, "BreakMagicWeaponRequest", id) local msg = magic_weapon_pb.ActiveMagicWeaponReq() msg.HeroId = id NetManager.SendMessage(MessageEnums.MessageBreakMagicWeapon,msg) end function private.BreakMagicWeaponResp(msgResp) logging.log(LTAG.LOG, "BreakMagicWeaponResp",msgResp) if msgResp.Resp.Code == 0 then private.SortMagicWeaponList() private.OnWeaponBreakExp(msgResp.HeroId) EventSystem.Dispatch(EventID.UI_DivineWeapon_Update, {isBreak = true}) CTL.Sound.PlayGameSound("UI_breakout_01") end end function private.OnWeaponBreakExp(weaponId) local heroInfo = MDL.HeroSelect.GetHeroInfo(weaponId) local weaponLevel = heroInfo.magicWeaponLevel or 0 local weaponStar = (heroInfo.magicWeaponStar or 0 )+1 if weaponLevel > 0 and weaponStar == 1 then UIManager.CloseView(Const_UI_Lua.UIEnum.UIDivineWeaponBreakSuccess) UIManager.OpenView(Const_UI_Lua.UIEnum.UIDivineWeaponBreakSuccess, { weaponId = weaponId }, "Common/UICommonBreakSuccess") MDL.FormationResonance.SetSubResonanceOprType(resonance_info.Weapon_Break) else UIManager.CloseView(Const_UI_Lua.UIEnum.UIHeroAdvancedTips) local data local appearanceId = MDL.HeroSelect.GetAttrWeaponAppearanceIDByHeroID(weaponId) if appearanceId > 0 then data = DataSheetManager.MagicWeaponStar:GetDataByMagicWeaponID_Star(appearanceId,weaponLevel) else data = DataSheetManager.MagicWeaponStar:GetDataByMagicWeaponID_Star(weaponId, weaponLevel) end UIManager.OpenView(Const_UI_Lua.UIEnum.UIHeroAdvancedTips, { isWeaponBreak = true, attr = data.Attr_Table[weaponStar - 1].AttrRepeat }) if weaponStar == DivineWeapon_Model.STARMAX then CTL.Sound.PlayGameSound("UI_breakout_02") else CTL.Sound.PlayGameSound("UI_breakout_01") end end end function DivineWeapon_Model.OneKeyActiveWeaponRequest(heroId) local msg = magic_weapon_pb.OneKeyActiveWeaponReq() msg.HeroId = heroId NetManager.SendMessage(MessageEnums.MessageOneKeyActiveWeapon, msg) end function private.OneKeyActiveWeaponResp(msgResp) if msgResp.Resp.Code == 0 then private.SortMagicWeaponList() MDL.FormationResonance.SetSubResonanceOprType(resonance_info.Weapon_Break) EventSystem.Dispatch(EventID.UI_DivineWeapon_ActiveOneStep, msgResp.HeroId, msgResp.WeaponActivePhase) end end function DivineWeapon_Model.FoundryActivateRequest(weaponId, pointId, lineType) local msg = foundry_pb.FoundryActivateReq() msg.weaponId = weaponId msg.pointId = pointId msg.lineType = lineType NetManager.SendMessage(MessageEnums.MessageFoundryActivate, msg) end function private.FoundryActivateResp(msgResp) EventSystem.Dispatch(EventID.UI_DivineWeapon_ForgeSkillUnlock, msgResp.weaponId, msgResp.pointId) end --*****END协议处理***** return DivineWeapon_Model