local HeroSelect_Model = {} local private = {} local EventSystem = require('Event/EventSystem') local HeroInfoPropertyUtil = require "Modules.HeroSelect.HeroInfoPropertyUtil" --服务器下发的主将信息列表 local heroInfoList = {} --排序后的所有主将信息 local sortedHeroDataList={} HeroSelect_Model.HeroAddExpType = { CostItem = 0, Upgrade = 1, OneKeyUpgrade = 2, } HeroSelect_Model.ToggleViewNameList = { Advanced = Const_UI_Lua.UIEnum.UIHeroAdvanced, -- 进阶 LevelUp = Const_UI_Lua.UIEnum.UIHeroLevelUp, -- 升级 Break = Const_UI_Lua.UIEnum.UIHeroBreak, -- 突破 Relation = Const_UI_Lua.UIEnum.UIHeroDetailRelation, -- 羁绊 Appearance = Const_UI_Lua.UIEnum.UIHeroAppearanceBase, -- 外观 Info = Const_UI_Lua.UIEnum.UIHeroDetailInfo, -- 信息 Strenthen = Const_UI_Lua.UIEnum.UIHeroStrenthen, -- 修炼 Awaken = Const_UI_Lua.UIEnum.UIHeroAwaken, -- 觉醒 AwakenSkill = Const_UI_Lua.UIEnum.UIHeroAwakenSkill, -- 觉醒技能 } HeroSelect_Model.curSelectHeroID = 0 -- 吕布法相特殊处理需要用到的常量 HeroSelect_Model.LvBuHeroId = 22 HeroSelect_Model.LvBuFaXiangId = 204001 HeroSelect_Model.LvBuFaXiangSkillId = 801108 function HeroSelect_Model.OnStartup() NetManager.RegisterMsgCB(MessageEnums.MessageAddHeroExp, private.AddHeroExpResponse) NetManager.RegisterMsgCB(MessageEnums.MessageActivateHero, nil) NetManager.RegisterMsgCB(MessageEnums.MessageG2CPushHeroRelationActive, private.OnG2CPushHeroRelationActive) NetManager.RegisterMsgCB(MessageEnums.MessageG2CPushHeroRelationLevelUp, private.OnG2CPushHeroRelationLevelUp) EventSystem.Regist(EventID.AcquireSystemRedAfterUnlock, private.OnEnterWorldPostprocess) private.heroSkillIdList = {} private.heroRelationDic = {} private.heroDisplaySkillIdList = {} --换成技能信息的临时结果 private.SkillTipLevelUpParamTableTemp = {} private.SkillIdTableTemp = {} end function HeroSelect_Model.OnShutdown() heroInfoList = {} end --region ******************* 外界获取武将信息 ************************* --服务器发过来的,玩家拥有的主将数量 function HeroSelect_Model.GetHasHeroCount() return #heroInfoList end --玩家拥有国家武将数量 function HeroSelect_Model.GetHasCountryHeroCount(country) local count = 0 for i, v in ipairs(heroInfoList) do local heroData = DataSheetManager.HeroNum:GetDataByID(v.heroId) if heroData.Kingdom == country then count = count + 1 end end return count end -- 服务器发来的所有武将信息 function HeroSelect_Model.GetHasHeroList() return heroInfoList end -- 指定武将的服务器数据 function HeroSelect_Model.GetHeroInfo(id) for i = 1, #heroInfoList do if heroInfoList[i].heroId==id then return heroInfoList[i] end end return nil end --数据表里所有主将数量 function HeroSelect_Model.GetHeroDataCount() return DataSheetManager.HeroNum:GetDataCount() end -- 指定武将的表数据 function HeroSelect_Model.GetHeroDataById(id) return DataSheetManager.HeroNum:GetDataByID(id) end function HeroSelect_Model.GetHeroQualityImage(quality) return DataSheetManager.QualityColor:GetDataByID(quality).MagicWeaponBase end function HeroSelect_Model.GetUnactiveHeroData() local data = {} for i, v in DataSheetManager.HeroNum:GetEnumerator() do if not HeroSelect_Model.IsHasHero(v.ID) and MDL.HideGolden.IsShowGoldenByID(LuaConst.ShowGoldenType.Hero, v.ID) then table.insert(data, v) end end table.sort(data, private.SortHeroOrder) return data end --未拥有的金色武将 function HeroSelect_Model.GetUnactiveGoldenHeroData() local unactiveHeroData = HeroSelect_Model.GetUnactiveHeroData() local data = {} for _, v in ipairs(unactiveHeroData) do if v.HeroQuality == LuaConst.QualityColor.Gold then table.insert(data, v) end end return data end function HeroSelect_Model.GetSortedHeroDataCount() local heroList= HeroSelect_Model.GetSortedHeroData() return #heroList end --获取最后一个拥有的武将索引 function HeroSelect_Model.GetLastHasHeroIndex() local heroList = HeroSelect_Model.GetSortedHeroData() local findIndex = 1 for i = 1, #heroList do if HeroSelect_Model.IsHasHero(heroList[i].ID) then findIndex = i end end return findIndex end function HeroSelect_Model.GetHeroUnActiveCount() local heroList = HeroSelect_Model.GetSortedHeroData() local count = 0 for i = 1, #heroList do if not HeroSelect_Model.IsHasHero(heroList[i].ID) then count = count + 1 end end return count end function HeroSelect_Model.GetHeroIndexById(list, heroId) for i, v in ipairs(list) do if v.ID == heroId then return i end end end function HeroSelect_Model.GetSortedHeroIdByIndex(index) local heroList= HeroSelect_Model.GetSortedHeroData() if(index <= #heroList or index>=1) then return heroList[index] and heroList[index].ID or 0 else logging.error(LTAG.ERROR, "GetSortedHeroIdByIndex index error", index) return nil end end function HeroSelect_Model.GetFirstSortedHeroId() return HeroSelect_Model.GetSortedHeroIdByIndex(1) end function HeroSelect_Model.GetSortedHeroDataIndex(id) local heroList= HeroSelect_Model.GetSortedHeroData() for i = 1, #heroList do if heroList[i].ID==id then return i end end return -1 end function HeroSelect_Model.GetMaxLevelByRank(rank) local data = DataSheetManager.Nobility:GetDataByRankID(rank <= 0 and 1 or rank) return data.TeamLevelMax end function HeroSelect_Model.GetTeamLevelName(level) local data = DataSheetManager.HeroLevelUp:GetDataByHeroLevel(level) if not data then logging.error(LTAG.ERROR, "该等级: ", level, "无法在表里找到数据!!!") return end local levelUpData = DataSheetManager.HeroLevelUp:GetDataByHeroLevel(level) local levelStr = UTL.Item.GetNobilityByTeamLevel(levelUpData.HeroLevel) -- 爵位转换 return string.FormatByIdsKey(levelUpData.TeamLevelName, levelStr) end function HeroSelect_Model.GetAtkDefHpGrowNumber(attrTypeId, star) local data = DataSheetManager.HeroLevelAttr:GetDataByLevelUpAttrTypeID(attrTypeId) if data then local result = data.Break_Table[star + 1] return result.AtkGrow, result.DefGrow, result.HpGrow end end function HeroSelect_Model.GetAtkDefHp(attrTypeId, level, star) local data = DataSheetManager.HeroLevelAttr:GetDataByLevelUpAttrTypeID(attrTypeId) if data then local result = data.Break_Table[star + 1] local hp = private.CalculateAttrGrowNumber(result.HplmtInitial, result.HpGrow, level, LuaConst.AttrTypeId.hplmt) local atk = private.CalculateAttrGrowNumber(result.AtkInitial, result.AtkGrow, level, LuaConst.AttrTypeId.atk) local def = private.CalculateAttrGrowNumber(result.DefInitial, result.DefGrow, level, LuaConst.AttrTypeId.def) return atk, def, hp end return nil end --未激活返回0 function HeroSelect_Model.GetRelationLev(heroId, relationId) if private.heroRelationDic ~= nil then local info = private.heroRelationDic[heroId] if info then return info[relationId] or 0 end end return 0 end -- 获取指定武将的外观ID function HeroSelect_Model.GetAppearanceIDByHeroID(heroId) if heroInfoList then for i = 1, #heroInfoList do if(heroInfoList[i].heroId == heroId) then return heroInfoList[i].curAppearanceId end end end return 0 end -- 获取指定武将的属性资质生效的时装id function HeroSelect_Model.GetAttrAppearanceIDByHeroID(heroId) if heroInfoList then for i = 1, #heroInfoList do if(heroInfoList[i].heroId == heroId) then if heroInfoList[i].curAttrAppearanceId then return heroInfoList[i].curAttrAppearanceId end end end end return 0 end --是否显示切换技能展示 function HeroSelect_Model.GetHeroDisplaySkillIdList(heroId, isSimple) if private.heroDisplaySkillIdList[heroId] and heroId ~= HeroSelect_Model.LvBuHeroId then return private.heroDisplaySkillIdList[heroId] end local needInsert = false if isSimple == nil or isSimple == false then --region 吕布法相技能展示特殊处理 if heroId == HeroSelect_Model.LvBuHeroId then local dataDic = MDL.LightEffect.GetHeroWearLightEffectIDDic(heroId) local id = dataDic ~= nil and dataDic[4] or 0 if id ~= nil and id == HeroSelect_Model.LvBuFaXiangId then needInsert = true end end --endregion end private.heroDisplaySkillIdList[heroId] = {} local displaySkillIDList = DataSheetManager.HeroData:GetDataByID(heroId).DisplaySkillList_Table for m, n in pairs(displaySkillIDList) do local tb = {} if needInsert then table.insert(tb, HeroSelect_Model.LvBuFaXiangSkillId) end for _, v in ipairs(n.DisplaySkill) do table.insert(tb, v) end table.insert(private.heroDisplaySkillIdList[heroId], tb) end return private.heroDisplaySkillIdList[heroId] end --判断神兵是否激活 function HeroSelect_Model.IsMagicWeaponActive(heroId) local heroInfo = HeroSelect_Model.GetHeroInfo(heroId) local isLock = not heroInfo or not heroInfo.isMagicWeaponActive return not isLock end --获取当前技能等级的信息 function HeroSelect_Model.GetSkillTipsOfCurrentLevel(heroId,skillId) local isLock = true local currentSkillLevel = 0 local currentSkillId local skillData = DataSheetManager.SkillTipsData:GetDataByID(skillId) private.SkillTipLevelUpParamTableTemp = {} private.SkillIdTableTemp = {} if skillData then if skillData.LevelUpType == 1 or skillData.LevelUpType == 5 then --功能尚未开放 isLock = false currentSkillLevel = 1 currentSkillId = skillId elseif skillData.LevelUpType == 2 then --武将突破至+ LevelUpTypeParam后升级 currentSkillLevel = 1 isLock = false local heorStar = MDL.HeroStar.GetHeroStarLevel(heroId) --武将突破等级 private.GetSkillTipLevelUpParam(skillId) local skillLevelIndex = 1 if #private.SkillTipLevelUpParamTableTemp > 0 then for i = 1, #private.SkillTipLevelUpParamTableTemp do if heorStar >= private.SkillTipLevelUpParamTableTemp[i] then skillLevelIndex = i end end end currentSkillId = private.SkillIdTableTemp[skillLevelIndex] currentSkillLevel = skillLevelIndex elseif skillData.LevelUpType == 3 then --武将的神兵突破至+ LevelUpTypeParam后升级 local heroInfo = HeroSelect_Model.GetHeroInfo(heroId) local isActive = HeroSelect_Model.IsMagicWeaponActive(heroId) if isActive then private.GetSkillTipLevelUpParam(skillId) local skillLevelIndex = 1 if #private.SkillTipLevelUpParamTableTemp > 0 then for i = 1, #private.SkillTipLevelUpParamTableTemp do --判断神兵突破等级 if heroInfo.magicWeaponLevel >= private.SkillTipLevelUpParamTableTemp[i] then skillLevelIndex = i end end end currentSkillId = private.SkillIdTableTemp[skillLevelIndex] currentSkillLevel = skillLevelIndex isLock = false else currentSkillId = skillId isLock = true end elseif skillData.LevelUpType == 4 then currentSkillId = skillId currentSkillLevel = 1 isLock = false local heroInfo = HeroSelect_Model.GetHeroInfo(heroId) if heroInfo and HeroSelect_Model.IsHasHero(heroId) then if MDL.Unlock.IsUnlock(MDL.Unlock.FunctionType.DivineWeaponForge) and CTL.DivineWeapon.GetForgeTemplateID(heroId) ~= 0 then local nextSkillData = DataSheetManager.SkillTipsData:GetDataByID(skillData.NextDisplaySkill) while (nextSkillData ~= nil) do local pointData = DataSheetManager.MagicWeaponFoundry:GetDataByID_PointID(CTL.DivineWeapon.GetForgeTemplateID(heroId), nextSkillData.LevelUpTypeParam) if pointData then if CTL.DivineWeapon.GetPointState(heroId, pointData) ~= CTL.DivineWeapon.ForgePointState.Activate then break end currentSkillId, currentSkillLevel = CTL.DivineWeapon.GetLineSkillCurSkillIdAndCurLevel(heroId, pointData,skillId) end nextSkillData = nextSkillData.NextDisplaySkill>0 and DataSheetManager.SkillTipsData:GetDataByID(nextSkillData.NextDisplaySkill) or nil end end else isLock = true end elseif skillData.LevelUpType == 6 then --觉醒后直接就是满级 currentSkillId = skillId currentSkillLevel = 1 isLock = true local _, nextSkillData = DataSheetManager.SkillTipsData:GetDataByID(skillData.NextDisplaySkill) while(nextSkillData ~= nil) do currentSkillId = skillData.NextDisplaySkill currentSkillLevel = currentSkillLevel + 1 end end end return isLock,currentSkillId,currentSkillLevel end --获取技能等级参数 function private.GetSkillTipLevelUpParam(skillId) local skillData = DataSheetManager.SkillTipsData:GetDataByID(skillId) if skillData then table.insert(private.SkillTipLevelUpParamTableTemp,skillData.LevelUpTypeParam) table.insert(private.SkillIdTableTemp,skillId) if skillData.NextDisplaySkill ~= 0 then private.GetSkillTipLevelUpParam(skillData.NextDisplaySkill) end end end function HeroSelect_Model.GetWeaponAppearanceIDByID(id) if heroInfoList then for i = 1, #heroInfoList do if(heroInfoList[i].heroId == id) then return heroInfoList[i].curWeaponAppearanceId end end end return id end -- 获取指定武将神兵的属性资质生效的时装id function HeroSelect_Model.GetAttrWeaponAppearanceIDByHeroID(heroId) if heroInfoList then for i = 1, #heroInfoList do if(heroInfoList[i].heroId == heroId) then if heroInfoList[i].curAttrWeaponAppearanceId and heroInfoList[i].curAttrWeaponAppearanceId > 0 then return heroInfoList[i].curAttrWeaponAppearanceId end end end end return heroId end --endregion ******************* 外界获取武将信息 ************************* --region ******************* 给武将排序 ************************* --重新排序主将信息 function HeroSelect_Model.ReSortedHeroData() sortedHeroDataList={} HeroSelect_Model.GetSortedHeroData() end function private.SortHeroOrder(a, b) local isCanActiveA = HeroSelect_Model.IsHeroCanActive(a.ID) local isCanActiveB = HeroSelect_Model.IsHeroCanActive(b.ID) if isCanActiveA and isCanActiveB then return private.SortBasicHeroOrder(a, b) elseif isCanActiveA then return true elseif isCanActiveB then return false else return private.SortBasicHeroOrder(a, b) end end function private.SortBasicHeroOrder(a, b) local isHasA= HeroSelect_Model.IsHasHero(a.ID) local isHasB= HeroSelect_Model.IsHasHero(b.ID) if isHasA or isHasB then if isHasA and isHasB then -- 查询是否上阵并且先把上阵的排在前面 local indexA = MDL.Formation.GetSlotIndexByHeroId(a.ID) local indexB = MDL.Formation.GetSlotIndexByHeroId(b.ID) if indexA or indexB then if indexA and indexB then return indexA < indexB end return indexA ~= nil end -- 助战在后 local isAssistA = MDL.AssistanceFight.IsHeroOnAssistancePos(a.ID) local isAssistB = MDL.AssistanceFight.IsHeroOnAssistancePos(b.ID) if isAssistA or isAssistB then if isAssistA and isAssistB then return private.SortByQualityAndRank(a, b) end return isAssistA end return private.SortByQualityAndRank(a, b) end return isHasA else if a.Rank2 ~= b.Rank2 then return a.Rank2 < b.Rank2 else return a.ID < b.ID end end end function private.SortByQualityAndRank(a, b) -- 按照品质排序 local qualityA = a.HeroQuality local qualityB = b.HeroQuality if qualityA ~= qualityB then return qualityA > qualityB else if a.Rank ~= b.Rank then return a.Rank < b.Rank else return a.ID < a.ID end end end function HeroSelect_Model.SortHeroOrderByHeroGs(a, b) local GsA = HeroSelect_Model.GetHeroGs(a.ID) local GsB = HeroSelect_Model.GetHeroGs(b.ID) if GsA ~= GsB then return GsA > GsB else return private.SortByQualityAndRank(a, b) end end function HeroSelect_Model.SortHeroOrder() table.sort(sortedHeroDataList , private.SortHeroOrder) end -- 可激活武将数量 function HeroSelect_Model.GetPendingActiveCount() for i,v in ipairs(HeroSelect_Model.GetSortedHeroData()) do if HeroSelect_Model.IsHasHero(v.ID) then return i - 1 end end return 0 end --排序后的主将信息 function HeroSelect_Model.GetSortedHeroData() --拷贝一份,再排序 if #sortedHeroDataList == 0 then HeroSelect_Model.UpdateSortedHeroData() end return sortedHeroDataList end --排序后的未觉醒主将信息 function HeroSelect_Model.GetSortedUnAwakenHeroData() local list = {} for i, v in DataSheetManager.HeroNum:GetEnumerator() do if MDL.HideGolden.IsShowGoldenByID(LuaConst.ShowGoldenType.Hero, v.ID) and not MDL.HeroAwaken.GetIsHeroAwaken(v.ID) then -- 屏蔽金将判断 table.insert(sortedHeroDataList, v) end end table.sort(list , private.SortHeroOrder) return list end --上面被动且仅刷新一次的方式,在武将信息初始化之前调用会有问题,比如enterworld里触发的一些红点逻辑 --金将屏蔽的判断依赖武将的信息,过早调用的话,则排序列表里会丢失金将。 --这里先不改enterworld里的顺序,只在InitHeroesInfoInit的时候补一次刷新 function HeroSelect_Model.UpdateSortedHeroData() if #sortedHeroDataList > 0 then sortedHeroDataList = {} end for i, v in DataSheetManager.HeroNum:GetEnumerator() do if MDL.HideGolden.IsShowGoldenByID(LuaConst.ShowGoldenType.Hero, v.ID) then -- 屏蔽金将判断 table.insert(sortedHeroDataList, v) end end HeroSelect_Model.SortHeroOrder() --排序,按是否激活,激活进度,默认表排序 end --country为0表示全部 function HeroSelect_Model.CollectHeroCfgByCountry(list, country) for i, v in DataSheetManager.HeroNum:GetEnumerator() do if MDL.HideGolden.IsShowGoldenByID(LuaConst.ShowGoldenType.Hero, v.ID) then -- 屏蔽金将判断 if country == 0 or v.Kingdom == country then table.insert(list, v) end end end table.sort(list, private.SortHeroOrder) end function private.SortSkillShowOrder(a, b) local skillDataA = DataSheetManager.SkillTipsData:GetDataByID(a) local skillDataB = DataSheetManager.SkillTipsData:GetDataByID(b) if skillDataA and skillDataB then if skillDataA.ShowOrder ~= skillDataB.ShowOrder then return skillDataA.ShowOrder < skillDataB.ShowOrder end else return a < b end end --endregion ******************* 排序 ************************* --region ******************* 内部获取武将信息 ************************* --获取激活百分比,用于排序 function private.GetActiveRate(id) local hero=HeroSelect_Model.GetHeroDataById(id) local hasCount=MDL.Bag.GetItemCountInOneCell(hero.PieceItem) local canActiveCount=DataSheetManager.HeroNum:GetDataByID(id).UnlockPiece local rate=hasCount/canActiveCount return rate end function private.CalculateAttrGrowNumber(init, grow, level, type) if type == LuaConst.AttrTypeId.hplmt then return math.ceil(init + ((grow / DataSheetManager.ConstData:GetDataByID("hplmtgrowMax").IntValue) * DataSheetManager.ConstData:GetDataByID("hplmtgrowMaxVaule").IntValue) * (level - 1)) elseif type == LuaConst.AttrTypeId.atk then return math.ceil(init + ((grow / DataSheetManager.ConstData:GetDataByID("atkgrowMax").IntValue) * DataSheetManager.ConstData:GetDataByID("atkgrowMaxVaule").IntValue) * (level - 1)) elseif type == LuaConst.AttrTypeId.def then return math.ceil(init + ((grow / DataSheetManager.ConstData:GetDataByID("defgrowMax").IntValue) * DataSheetManager.ConstData:GetDataByID("defgrowMaxVaule").IntValue) * (level - 1)) end end --endregion ******************* 内部获取武将信息 ************************* --region ********************* 获取状态 ************************* --玩家是否拥有这个主将 function HeroSelect_Model.IsHasHero(id) return HeroSelect_Model.GetHeroInfo(id) ~= nil end function HeroSelect_Model.IsHeroCanActive(id) if not HeroSelect_Model.IsHasHero(id) then local hero=HeroSelect_Model.GetHeroDataById(id) local hasCount=MDL.Bag.GetItemCountInOneCell(hero.PieceItem) local canActiveCount=DataSheetManager.HeroNum:GetDataByID(id).UnlockPiece return hasCount>=canActiveCount end return false end --endregion ********************* 获取状态 ************************* --region *****武将升级相关***** --isShowLevelProName 是否显示进爵后的等级 function HeroSelect_Model.GetHeroLevelName(id) local level=HeroSelect_Model.GetHeroLevel(id) local isShowLevelProName= not HeroSelect_Model.IsCanShowRankUp(id) return HeroSelect_Model.GetTeamLevelName(level,isShowLevelProName) end function HeroSelect_Model.GetHeroNextLevelName(id) local level=HeroSelect_Model.GetHeroLevel(id)+1 return HeroSelect_Model.GetTeamLevelName(level) end function HeroSelect_Model.IsHaveUpgradeItem(isShowTips) for _, v in DataSheetManager.HeroLevelMaterial:GetEnumerator() do local itemId = v.ItemID local data = MDL.Bag.GetItemInOneCell(itemId) if data then return true end end if isShowTips then CTL.Tips.AddTipsMsg(Const_IDS["IDS_UpgradeMaterialEmpty"]) end return false end --获取战队等级 function HeroSelect_Model.GetTeamLevel() local teamLevel = MDL.Player.GetRoleLevel() return teamLevel or 0 end --获取某个英雄的爵位等级 function HeroSelect_Model.GetHeroRankLevel(id) if heroInfoList then for i = 1, #heroInfoList do if(heroInfoList[i].heroId==id) then return heroInfoList[i].rankId end end end return 0 end --获取某个英雄的战力 function HeroSelect_Model.GetHeroGs(id) if heroInfoList then for i = 1, #heroInfoList do if(heroInfoList[i].heroId==id) then return heroInfoList[i].Gs end end end return 0 end --是否可以进爵 function HeroSelect_Model.IsCanRankUp(heroId) --达到进爵等级,小于战队爵位可进爵 local currentLevel=HeroSelect_Model.GetHeroLevel(heroId) local maxLevelOfCurrentRank=HeroSelect_Model.GetHeroMaxLevelOfCurrentRank(heroId) if(currentLevel >= maxLevelOfCurrentRank and maxLevelOfCurrentRank > 0) then local currentRank=HeroSelect_Model.GetHeroRankLevel(heroId) local teamLevel,teamLevelExp,teamRankID=MDL.Player.GetRoleInfo() if(currentRank= maxLevelOfCurrentRank and maxLevelOfCurrentRank > 0) then if(HeroSelect_Model.IsHeroReachMaxLevel(heroId)) then return false else return true end else return false end end function HeroSelect_Model.GetHeroLevelAttrID(heroId) local heroAttrId local appearanceWearID = HeroSelect_Model.GetAttrAppearanceIDByHeroID(heroId) if appearanceWearID > 0 then local appearanceData = DataSheetManager.HeroAppearance:GetDataByID(appearanceWearID) if appearanceData.HeroLevelAttrReplace > 0 then heroAttrId = appearanceData.HeroLevelAttrReplace else heroAttrId = DataSheetManager.HeroNum:GetDataByID(heroId).HeroLevelAttrID end else heroAttrId = DataSheetManager.HeroNum:GetDataByID(heroId).HeroLevelAttrID end return heroAttrId end function HeroSelect_Model.GetHeroNobilityAttrID(heroId) local nobilityAttrID local appearanceWearID = HeroSelect_Model.GetAppearanceIDByHeroID(heroId) if appearanceWearID > 0 then local appearanceData = DataSheetManager.HeroAppearance:GetDataByID(appearanceWearID) if appearanceData.HeroNobilityAttrReplace > 0 then nobilityAttrID = appearanceData.HeroNobilityAttrReplace else nobilityAttrID = DataSheetManager.HeroNum:GetDataByID(heroId).HeroNobilityAttrID end else nobilityAttrID = DataSheetManager.HeroNum:GetDataByID(heroId).HeroNobilityAttrID end return nobilityAttrID end --获取某个英雄当前爵位所能达到的最大等级 function HeroSelect_Model.GetHeroMaxLevelOfCurrentRank(id) local rankId= HeroSelect_Model.GetHeroRankLevel(id) return HeroSelect_Model.GetMaxLevelByRank(rankId) end --获取武将当前可以达到的最大等级 function HeroSelect_Model.GetHeroCurrentMaxLevel(id) local heroLevelLimit = -1 local level = HeroSelect_Model.GetTeamLevel() local data = DataSheetManager.TeamLevelData:GetDataByTeamLevel(HeroSelect_Model.GetTeamLevel()) if data then heroLevelLimit = data.HeroLevelLimit end local limitByRank = HeroSelect_Model.GetHeroMaxLevelOfCurrentRank(id) if limitByRank < 0 then --最高爵位没有等级上限限制 return heroLevelLimit else return Mathf.Min(heroLevelLimit, limitByRank) end end --武将当前等级 function HeroSelect_Model.GetHeroLevel(id) if heroInfoList then for i = 1, #heroInfoList do if(heroInfoList[i].heroId==id) then return heroInfoList[i].heroLevel end end end return -1 end --武将之前的等级 function HeroSelect_Model.GetHeroLastLevel(id) if heroInfoList then for i = 1, #heroInfoList do if(heroInfoList[i].heroId==id) then return heroInfoList[i].heroLevel end end end return -1 end --武将经验值 function HeroSelect_Model.GetHeroExp(id) if heroInfoList then for i = 1, #heroInfoList do if(heroInfoList[i].heroId==id) then return heroInfoList[i].exp end end end return -1 end --获取武将需要到下一级的经验 function HeroSelect_Model.GetHeroNextLevelExp(id) local heroLevel = HeroSelect_Model.GetHeroLevel(id) return DataSheetManager.HeroLevelUp:GetDataByHeroLevel(heroLevel).LevelExp end --武将是否满级 function HeroSelect_Model.IsHeroReachMaxLevel(id) local heroLevel = HeroSelect_Model.GetHeroLevel(id) local result = DataSheetManager.HeroLevelUp:GetDataByHeroLevel(heroLevel+1) --认为品质 和 当前等级+1,找不到数据为满级 return result==nil end --武将是否可以升级 function HeroSelect_Model.IsHeroCanLevelUp(id) local herolevel= HeroSelect_Model.GetHeroLevel(id) local maxLevel= HeroSelect_Model.GetHeroCurrentMaxLevel(id) if(herolevel= 0 then HeroInfoPropertyUtil.UpdateHeroProperty(heroInfoList[index], newHeros[i]) else table.insert(heroInfoList, HeroInfoPropertyUtil.CloneHeroInfoData(newHeros[i])) isHasNewHero = true end end if isHasNewHero then EventSystem.Dispatch(EventID.UI_HeroSelect_RefreshAfterActiveHero) HeroSelect_Model.ReSortedHeroData() end EventSystem.Dispatch(EventID.BI_UnlockHero) EventSystem.Dispatch(EventID.UI_HeroShow_UpdateHeroShow) -- 监听武将图鉴红点 CTL.HeroLibrary.CheckRedPoint() -- 主将图鉴界面刷新 EventSystem.Dispatch(EventID.UI_Illustration_HeroLibrary_RefreshBase) EventSystem.Dispatch(EventID.UI_Illustration_HeroLibrary_RefreshPopUp) --神兵图鉴界面刷新 EventSystem.Dispatch(EventID.UI_Illustration_WeaponLibrary_RefreshBase) EventSystem.Dispatch(EventID.UI_Illustration_WeaponLibrary_RefreshPopUp) -- 纳灵系统刷新 MDL.Reborn.SyncRFMaterialDic(MDL.Reborn.RFMaterialType.Hero) MDL.Reborn.SyncRFMaterialDic(MDL.Reborn.RFMaterialType.DivineWeapon) -- 主将修炼刷新 EventSystem.Dispatch(EventID.Strenthen_RefreshProgressAndLevel) end function HeroSelect_Model.UpdateHeroAttrInfo(attrInfo) for i, v in ipairs(attrInfo) do local index = private.FindIndexOfHerosById(v.heroId) heroInfoList[index].Gs = v.gs local oldAttr = heroInfoList[index].attr.attrs local newAttr = v.attr.attrs UTL.Attr.ProcessProtoAttrTable(newAttr) for index = #oldAttr, 1, -1 do table.remove(oldAttr) end for index = 1, #newAttr do table.insert(oldAttr, newAttr[index]) end end EventSystem.Dispatch(EventID.UI_HeroShow_UpdateHeroShow) end function private.FindIndexOfHerosById(heroId) if heroInfoList then for i = 1, #heroInfoList do if(heroInfoList[i].heroId==heroId) then return i end end end return -1 end --武将羁绊 function HeroSelect_Model.InitRelationInfo(infos) for _, v in ipairs(infos) do for i, id in ipairs(v.relationIds) do private.SetHeroRelation(v.heroId, id, v.relationLevels[i]) end end end --2级K-V表,武将id-羁绊id-羁绊等级 function private.SetHeroRelation(heroId, relationId, lev) local dic = private.heroRelationDic[heroId] if dic == nil then dic = {} private.heroRelationDic[heroId] = dic end dic[relationId] = lev end --羁绊激活 function private.OnG2CPushHeroRelationActive(msgResp) for _, v in ipairs(msgResp.heroRelations) do private.SetHeroRelation(v.heroId, v.relationId, v.relationLevel) end CTL.HeroSelect.OpenRelationPopup(msgResp.heroRelations, "IDS_HeroRelation_JiBanJiHuo") EventSystem.Dispatch(EventID.UI_HeroRelation_Refresh) end --羁绊升级(重生、武将置换可能会降低羁绊) function private.OnG2CPushHeroRelationLevelUp(msgResp) local isReduceLv = false for _, v in ipairs(msgResp.heroRelations) do if not isReduceLv and HeroSelect_Model.GetRelationLev(v.heroId, v.relationId) > v.relationLevel then isReduceLv = true end private.SetHeroRelation(v.heroId, v.relationId, v.relationLevel) end if isReduceLv then --羁绊等级降低 CTL.HeroSelect.OpenRelationPopup(msgResp.heroRelations, "IDS_HeroRelation_JiBanBianHuan") else CTL.HeroSelect.OpenRelationPopup(msgResp.heroRelations, "IDS_HeroRelation_JiBanShengJi") end EventSystem.Dispatch(EventID.UI_HeroRelation_Refresh) end --endregion *****END协议处理***** return HeroSelect_Model