local WeaponLibrary_Model = {} local private = {} local EventSystem = require('Event/EventSystem') local pictorial_book = require 'Proto.pictorial_book_pb' local TabToKingdom = { [0] = LuaConst.Kingdom.Shu, [1] = LuaConst.Kingdom.Wei, [2] = LuaConst.Kingdom.Wu, [3] = LuaConst.Kingdom.Qun } --region---------------------------------- 系统函数 ------------------------------------------ function WeaponLibrary_Model.OnStartup() EventSystem.Regist(EventID.Illustration_AssignUpdateLevelResponse, private.ResponseUpdateLevel) EventSystem.Regist(EventID.UI_HeroShow_UpdateHeroShow, private.SetInfoDirty) EventSystem.Regist(EventID.UI_HeroAwaken_WeaponAwaken, private.SetInfoDirty) EventSystem.Regist(EventID.UI_HeroAwaken_OnBigBreakExp, private.SetInfoDirty) EventSystem.Regist(EventID.UI_Reborn_Recast_RecastSuccess, private.OnRecastSuccess) EventSystem.Regist(EventID.UI_HeroSubstitute_Success, private.OnHeroSubstituteSuccess) EventSystem.Regist(EventID.AcquireSystemRedAfterUnlock, private.OnEnterWorldPostprocess) EventSystem.Regist(EventID.UI_Illustration_OneKeyUpLevel, private.OnOneKeyUpLevel) private.isInit = false private.libraryLevel = 0 private.libraryScore = 0 private.shuWeapons = {} private.weiWeapons = {} private.wuWeapons = {} private.qunWeapons = {} private.shuUnlockWeaponCount = 0 private.weiUnlockWeaponCount = 0 private.wuUnlockWeaponCount = 0 private.qunUnlockWeaponCount = 0 private.levelZeroAttrs = LuaExt.CreateTable(DataSheetManager.AttrData:GetDataCount()) local scoreData = DataSheetManager.HeroPictorialScore:GetDataByLevelID(1) for _, attrData in ipairs (scoreData.Attr_Table) do private.levelZeroAttrs[attrData.AttrType] = 0 end private.levelScoreAttr = LuaExt.CreateTable(DataSheetManager.MWPictorialScore:GetDataCount()) -- 累加统计每个等级的积分属性 for _, v in DataSheetManager.MWPictorialScore:GetEnumerator() do local attrs = LuaExt.CreateTable(DataSheetManager.AttrData:GetDataCount()) local formerAttrs = private.levelScoreAttr[v.LevelID - 1] if formerAttrs then for attrType, attrNum in pairs (formerAttrs) do if not attrs[attrType] then attrs[attrType] = attrNum else attrs[attrType] = attrs[attrType] + attrNum end end end for _, attrData in ipairs (v.Attr_Table) do if not attrs[attrData.AttrType] then attrs[attrData.AttrType] = attrData.AttrNum else attrs[attrData.AttrType] = attrs[attrData.AttrType] + attrData.AttrNum end end table.insert(private.levelScoreAttr, attrs) end end function WeaponLibrary_Model.OnShutdown() private.shuWeapons = nil private.weiWeapons = nil private.wuWeapons = nil private.qunWeapons = nil private.weaponAttrs = nil table.clearArray(private.levelScoreAttr) private.levelScoreAttr = nil private.levelZeroAttrs = nil end --endregion---------------------------------------------------------------------------------- --region 协议处理 function WeaponLibrary_Model.SetLibraryInfo(libraryInfoArray) if not IsServerDataNotNil(libraryInfoArray) then return end --获取神兵图鉴信息 local libraryInfo = {} for i,v in ipairs(libraryInfoArray) do if v.type == LuaConst.PictorialType.Weapon then libraryInfo = v break end end if IsServerDataNotNil(libraryInfo) then private.libraryLevel = libraryInfo.level private.libraryScore = libraryInfo.score end -- 升级弹出提示 CTL.WeaponLibrary.ShowLeveUpTipPanel(private.formerLibraryLevel, private.libraryLevel) private.formerLibraryLevel = private.libraryLevel --保存上次图鉴积分等级 EventSystem.Dispatch(EventID.UI_Illustration_WeaponLibrary_RefreshBase) end function private.OnEnterWorldPostprocess() if not private.isInit then private.CalAttrs() private.isInit = true end end --图鉴按主将图鉴顺序重现排序 function WeaponLibrary_Model.ResortByHero() local CountryTabEnum = { Init = -1, Shu = 0, Wei = 1, Wu = 2, Qun = 3 } private.weiWeapons = private.ResortByCountry(CountryTabEnum.Wei) private.shuWeapons = private.ResortByCountry(CountryTabEnum.Shu) private.wuWeapons = private.ResortByCountry(CountryTabEnum.Wu) private.qunWeapons = private.ResortByCountry(CountryTabEnum.Qun) end function private.ResortByCountry(countryTab) local weaponList = WeaponLibrary_Model.GetWeaponList(countryTab) local heroList = MDL.HeroLibrary.GetHeroList(countryTab) local weaponTempList = {} for i,vhero in ipairs(heroList) do local isAdd = true for j,vWeapon in ipairs(weaponList) do if MDL.HideGolden.IsShowGoldenByID(LuaConst.ShowGoldenType.Hero, vhero.ID) then -- 屏蔽金将判断 isAdd = false if vhero.ID == vWeapon.MagicWeaponID then table.insert(weaponTempList,vWeapon) isAdd = true break end end end if not isAdd then local magicData = DataSheetManager.MagicWeaponData:GetDataByMagicWeaponID(vhero.ID) if magicData then table.insert(weaponTempList, magicData) end end end return weaponTempList end function WeaponLibrary_Model.RequestUpdateLevel(weaponId) private.isInfoDirty = false private.formerLibraryLevel = private.libraryLevel --保存上次图鉴积分等级 local msg = pictorial_book.PictorialLevelUpReq() msg.id = weaponId msg.type = LuaConst.PictorialType.Weapon NetManager.SendMessage(MessageEnums.MessagePictorialLevelUp, msg) end function private.ResponseUpdateLevel(msgResp) if msgResp.Resp.Code ~= 0 then return end if msgResp.type ~= LuaConst.PictorialType.Weapon then return end private.lastUpdateId = msgResp.id private.UpdateInfoAfterUpdateLevel() end --图鉴信息变化了 function private.SetInfoDirty() private.isInfoDirty = true private.UpdateInfoAfterUpdateLevel() CTL.WeaponLibrary.CheckRedPoint() end --激活/升级后更新图鉴数据 --等升级和playerchange消息都回来以后执行 function private.UpdateInfoAfterUpdateLevel() if private.lastUpdateId ==nil then return end if not private.isInfoDirty then return end --更新解锁的数量 local weaponCfgData = DataSheetManager.MagicWeaponData:GetDataByMagicWeaponID(private.lastUpdateId ) local libraryLevel = WeaponLibrary_Model.GetWeaponLevel(private.lastUpdateId) if libraryLevel == 0 then local kingdom = private.GetKingdom(private.lastUpdateId) -- 解锁 if kingdom == 1 then private.weiUnlockWeaponCount = private.weiUnlockWeaponCount + 1 elseif kingdom == 2 then private.shuUnlockWeaponCount = private.shuUnlockWeaponCount + 1 elseif kingdom == 3 then private.wuUnlockWeaponCount = private.wuUnlockWeaponCount + 1 elseif kingdom == 4 then private.qunUnlockWeaponCount = private.qunUnlockWeaponCount + 1 end CTL.Tips.AddTipsMsg(string.FormatByIdsKey("IDS_Handbook_MW_Activate_Tips", UIUtils.GetLocalizedTxt(Const_IDS[weaponCfgData.MagicWeaponName]))) else CTL.Tips.AddTipsMsg(string.FormatByIdsKey("IDS_Handbook_MW_LevelUp_Tips", UIUtils.GetLocalizedTxt(Const_IDS[weaponCfgData.MagicWeaponName]))) end --更新属性 local curCfg = DataSheetManager.MWPictorialType:GetDataByMWPictorialTypeID_PictorialLevel(weaponCfgData.MWPictorialType, libraryLevel) for i, v in ipairs (curCfg.Attr_Table) do if not private.weaponAttrs[v.AttrType] then private.weaponAttrs[v.AttrType] = curCfg.Attr_Table[i].AttrNum else private.weaponAttrs[v.AttrType] = private.weaponAttrs[v.AttrType] + curCfg.Attr_Table[i].AttrNum end end if libraryLevel >= 1 then local formerCfg = DataSheetManager.MWPictorialType:GetDataByMWPictorialTypeID_PictorialLevel(weaponCfgData.MWPictorialType, libraryLevel - 1) for i, v in ipairs (formerCfg.Attr_Table) do if private.weaponAttrs[v.AttrType] then private.weaponAttrs[v.AttrType] = private.weaponAttrs[v.AttrType] - formerCfg.Attr_Table[i].AttrNum end end end EventSystem.Dispatch(EventID.UI_Illustration_WeaponLibrary_RefreshBase) EventSystem.Dispatch(EventID.UI_Illustration_WeaponLibrary_RefreshPopUp, true) CTL.WeaponLibrary.CheckRedPoint() private.lastUpdateId = nil private.isInfoDirty = false end --endregion function private.GetKingdom(weaponId) local heroData = DataSheetManager.HeroNum:GetDataByID(weaponId) --这里神兵和主将ID 是一一对应的 if heroData then return heroData.Kingdom end return LuaConst.Kingdom.Shu end function WeaponLibrary_Model.GetLibraryLevelAndScore() return private.libraryLevel, private.libraryScore end function WeaponLibrary_Model.GetUnlockAndAmountWeaponCount(countryTab) local kingdom = TabToKingdom[countryTab] if kingdom == LuaConst.Kingdom.Wei then return private.weiUnlockWeaponCount, #private.weiWeapons elseif kingdom == LuaConst.Kingdom.Shu then return private.shuUnlockWeaponCount, #private.shuWeapons elseif kingdom == LuaConst.Kingdom.Wu then return private.wuUnlockWeaponCount, #private.wuWeapons elseif kingdom == LuaConst.Kingdom.Qun then return private.qunUnlockWeaponCount, #private.qunWeapons end return 0, 0 end function WeaponLibrary_Model.GetWeaponList(countryTab) local kingdom = TabToKingdom[countryTab] if kingdom == LuaConst.Kingdom.Wei then return private.weiWeapons elseif kingdom == LuaConst.Kingdom.Shu then return private.shuWeapons elseif kingdom == LuaConst.Kingdom.Wu then return private.wuWeapons elseif kingdom == LuaConst.Kingdom.Qun then return private.qunWeapons end return nil end function WeaponLibrary_Model.GetAttrs(isGetScore) if isGetScore then if not private.levelScoreAttr[private.libraryLevel] then return private.levelZeroAttrs end return private.levelScoreAttr[private.libraryLevel] end return private.weaponAttrs end function WeaponLibrary_Model.IsShowRPByTab(kingdom) if not kingdom then return false end for _, v in ipairs (WeaponLibrary_Model.GetWeaponList(kingdom)) do if WeaponLibrary_Model.IsWeaponCanUpdate(v.MagicWeaponID) then return true end end return false end function WeaponLibrary_Model.GetAttrValue(attrType, isGetScore) if isGetScore then if not private.levelScoreAttr[private.libraryLevel] then return private.levelZeroAttrs[attrType] end return private.levelScoreAttr[private.libraryLevel][attrType] end return private.weaponAttrs[attrType] end function WeaponLibrary_Model.GetScoreAttrByLevel(libraryLevel, attrType) return private.levelScoreAttr[libraryLevel][attrType] end --获取神兵图鉴等级 function WeaponLibrary_Model.GetWeaponLevel(weaponId) if not weaponId then return -1 end local heroInfo = MDL.HeroSelect.GetHeroInfo(weaponId) if not heroInfo then return -1 end return heroInfo.magicWeaponPictorialLevel end --可激活或可升级 function WeaponLibrary_Model.IsWeaponCanUpdate(weaponId) local libraryLevel = WeaponLibrary_Model.GetWeaponLevel(weaponId) if libraryLevel == -1 then -- 可激活 local heroInfo = MDL.HeroSelect.GetHeroInfo(weaponId) if heroInfo then return heroInfo.isMagicWeaponActive end return false else --超过神兵突破等级 local weaponCfg = DataSheetManager.MagicWeaponData:GetDataByMagicWeaponID(weaponId) local isSuccess, nextCfg = DataSheetManager.HeroPictorialType:TryGetDataByHeroPictorialTypeID_PictorialLevel(weaponCfg.MWPictorialType, libraryLevel + 1) if isSuccess then local awakenLevel = 0 if MDL.HeroAwaken.GetIsWeaponAwaken(weaponId) then awakenLevel = 1 + MDL.HeroAwaken.GetCurWeaponStar(weaponId) end local heroInfo = MDL.HeroSelect.GetHeroInfo(weaponId) return heroInfo.magicWeaponLevel + awakenLevel >= nextCfg.StarLevel end end return false end function private.OnRecastSuccess(typeId) if typeId == MDL.Reborn.RebornType.Weapon then private.CalAttrs() end end function private.OnOneKeyUpLevel(type) if type == LuaConst.PictorialType.Weapon then private.weiUnlockWeaponCount = 0 private.shuUnlockWeaponCount = 0 private.wuUnlockWeaponCount = 0 private.qunUnlockWeaponCount = 0 table.clearArray(private.shuWeapons) table.clearArray(private.weiWeapons) table.clearArray(private.wuWeapons) table.clearArray(private.qunWeapons) private.CalAttrs(true) EventSystem.Dispatch(EventID.UI_Illustration_WeaponLibrary_RefreshBase) end end function private.CalAttrs(isForce) private.weaponAttrs = LuaExt.CreateTable(DataSheetManager.AttrData:GetDataCount()) --统计的总属性值 local list = MDL.DivineWeapon.GetAllData() for _, t in ipairs(list) do local libraryLevel = WeaponLibrary_Model.GetWeaponLevel(t.MagicWeaponID) local isUnlock = libraryLevel >= 0 local weapons = nil local kingdom = private.GetKingdom(t.MagicWeaponID) --判断是哪国的,累加各国解锁的神兵数量 if not private.isInit or isForce then if kingdom == LuaConst.Kingdom.Wei then weapons = private.weiWeapons private.weiUnlockWeaponCount = isUnlock and private.weiUnlockWeaponCount + 1 or private.weiUnlockWeaponCount elseif kingdom == LuaConst.Kingdom.Shu then weapons = private.shuWeapons private.shuUnlockWeaponCount = isUnlock and private.shuUnlockWeaponCount + 1 or private.shuUnlockWeaponCount elseif kingdom == LuaConst.Kingdom.Wu then weapons = private.wuWeapons private.wuUnlockWeaponCount = isUnlock and private.wuUnlockWeaponCount + 1 or private.wuUnlockWeaponCount elseif kingdom == LuaConst.Kingdom.Qun then weapons = private.qunWeapons private.qunUnlockWeaponCount = isUnlock and private.qunUnlockWeaponCount + 1 or private.qunUnlockWeaponCount end if weapons then table.insert(weapons, t) end end --累加总属性加成 if isUnlock then local curCfg = DataSheetManager.MWPictorialType:GetDataByMWPictorialTypeID_PictorialLevel(t.MWPictorialType, libraryLevel) for i, v in ipairs(curCfg.Attr_Table) do if not private.weaponAttrs[v.AttrType] then private.weaponAttrs[v.AttrType] = curCfg.Attr_Table[i].AttrNum else private.weaponAttrs[v.AttrType] = private.weaponAttrs[v.AttrType] + curCfg.Attr_Table[i].AttrNum end end else -- 初始化0 local curCfg = DataSheetManager.MWPictorialType:GetDataByMWPictorialTypeID_PictorialLevel(t.MWPictorialType, 0) for i, v in ipairs(curCfg.Attr_Table) do if not private.weaponAttrs[v.AttrType] then private.weaponAttrs[v.AttrType] = 0 end end end end WeaponLibrary_Model.ResortByHero() CTL.WeaponLibrary.CheckRedPoint() end --武将置换成功,武器图鉴需重新计算 function private.OnHeroSubstituteSuccess() private.shuUnlockWeaponCount = 0 private.weiUnlockWeaponCount = 0 private.wuUnlockWeaponCount = 0 private.qunUnlockWeaponCount = 0 private.shuWeapons = {} private.weiWeapons = {} private.wuWeapons = {} private.qunWeapons = {} private.isInit = false private.CalAttrs() private.isInit = true end return WeaponLibrary_Model