local GemCompose_Model = {} local private = {} local EventSystem = require('Event/EventSystem') local jewelry_pb = require("Proto/jewelry_pb") local pairs = pairs local EQUIP_INDEX = 4 local curGongMingLevel = -1 local levelCountList = {} --宝石类型11 应该不会扩充 写死 local GEM_TYPE_COUNT = 11 function GemCompose_Model.OnStartup() private.quickInFunctionArray = {} private.quickComposeTipArray = {} private.redPointInFunctionArray = {} private.redPointArray = {} curGongMingLevel = -1 local maxCount = GemCompose_Model.GetGemMaxLevel() GemCompose_Model.InitSingleGemUpgradeCostCount() NetManager.RegisterMsgCB(MessageEnums.MessageJewelryWear, private.GemInlayResponse) NetManager.RegisterMsgCB(MessageEnums.MessageMergeJewelry, private.ComposeGemResponse) NetManager.RegisterMsgCB(MessageEnums.MessageRemoveJewelry, private.RemoveJewelryResponse) for i = 1, GEM_TYPE_COUNT do levelCountList[i] = {} for level = 1, maxCount do levelCountList[i][level] = 0 end end end --服务器下发的主将信息列表 local GEM_INDEX_COUNT = 4 --每件装备对应的宝石槽位数量 local CurHeroID = 0 function GemCompose_Model.SetHeroID(heroID) if CurHeroID == heroID then return end CurHeroID = heroID curGongMingLevel = 0 local info = GemCompose_Model.GetHeroGongMingInfo(CurHeroID) if info ~= nil then curGongMingLevel = info.level end end function GemCompose_Model.GetCurHeroID() return CurHeroID end -- ---------------配置---------------------------- --宝石类型 function GemCompose_Model.GetGemTypeCfgData(ID, index) local GemTypeCfgData = DataSheetManager.JadeType:GetDataByID_ChildID(ID, index) return GemTypeCfgData end function GemCompose_Model.IsGemTypeUnlock(ID, index) local GemTypeCfgData = GemCompose_Model.GetGemTypeCfgData(ID, index) return MDL.Unlock.IsComplete(GemTypeCfgData.UnlockCondition, GemTypeCfgData.UnlockConditionParam) end function GemCompose_Model.GetNextLevelGem(curItemId) local itemData= DataSheetManager.ItemData:GetDataByID(curItemId) local __, nextItemData= DataSheetManager.ItemData:TryGetDataByID(curItemId + 1) if nextItemData ~= nil and itemData.FirstType == nextItemData.FirstType and itemData.SecondType == nextItemData.SecondType then if nextItemData.ThirdType <= GemCompose_Model.GetGemMaxLevel() then return curItemId + 1 end end return -1 end --获取宝石最大级数,目前和策划商量所有类型都是固定 local GEM_MAX_LEVLE = 0 function GemCompose_Model.GetGemMaxLevel() if GEM_MAX_LEVLE > 0 then return GEM_MAX_LEVLE end for k,v in DataSheetManager.ItemData:GetEnumerator() do if v.FirstType == 11 and v.SecondType == 1 then GEM_MAX_LEVLE = GEM_MAX_LEVLE + 1 end end return GEM_MAX_LEVLE end --记录每一级消耗1级宝石的数量,2合1 local singleGemUpgradeCostCount = {} function GemCompose_Model.InitSingleGemUpgradeCostCount() local gemMaxLevel = GemCompose_Model.GetGemMaxLevel() for i=0,gemMaxLevel - 1 do table.insert(singleGemUpgradeCostCount,math.pow(2, i)) end end -- --#region-------------通信---------------------------- --单个镶嵌宝石 function GemCompose_Model.GemInlayReq(heroId, equipType, gemId, gemIndex) local msg = jewelry_pb.JewelryWearReq() msg.heroId = heroId msg.jewelryType = equipType msg.jewelryId = gemId msg.jewelryLocation = gemIndex msg.isFast = false NetManager.SendMessage(MessageEnums.MessageJewelryWear,msg) end --一键镶嵌宝石 function GemCompose_Model.GemInlayOneKyReq(heroId) local msg = jewelry_pb.JewelryWearReq() msg.heroId = heroId msg.isFast = true NetManager.SendMessage(MessageEnums.MessageJewelryWear,msg) end function private.GemInlayResponse(msgResp) if msgResp.Resp.Code == 0 then --身上的宝石升级,更新英雄信息 GemCompose_Model.UpdateHeros(msgResp.Resp.PlayerChange.UpdateHeroes) EventSystem.Dispatch(EventID.UI_GemInlayOrRemoveSuccess) local gongMingInfo = GemCompose_Model.GetHeroGongMingInfo(GemCompose_Model.GetCurHeroID()) if gongMingInfo.isActive then if curGongMingLevel ~= gongMingInfo.level then if curGongMingLevel <= 0 then curGongMingLevel = 0 end curGongMingLevel = gongMingInfo.level end end CTL.Tips.AddTipsMsg(Const_IDS.IDS_Jade_Inset_6) BIManager.DispatchBIClientEvent(BIManager.EventName.GemChange) end end --宝石卸下 function GemCompose_Model.RemoveJewelryReq(equipType, gemIndex) local msg = jewelry_pb.RemoveJewelryReq() msg.heroId = GemCompose_Model.GetCurHeroID() msg.jewelryType = equipType msg.jewelryLocation = gemIndex NetManager.SendMessage(MessageEnums.MessageRemoveJewelry,msg) end function private.RemoveJewelryResponse(msgResp) if msgResp.Resp.Code == 0 then --身上的宝石升级,更新英雄信息 GemCompose_Model.UpdateHeros(msgResp.Resp.PlayerChange.UpdateHeroes) EventSystem.Dispatch(EventID.UI_GemInlayOrRemoveSuccess) local gongMingInfo = GemCompose_Model.GetHeroGongMingInfo(GemCompose_Model.GetCurHeroID()) if not gongMingInfo.isActive then curGongMingLevel = 0 end CTL.Tips.AddTipsMsg(Const_IDS.IDS_Jade_Inset_7) end end --单个宝石合成 function GemCompose_Model.ComposeGemReq(targetGemData, costGemDatas) local msg = jewelry_pb.MergeJewelryReq() -- msg.targetJewelry = jewelry_pb.ConsumeJewelry() msg.targetJewelry.Id = targetGemData.Id msg.targetJewelry.nums = targetGemData.Count local gemData = jewelry_pb.ConsumeJewelry() gemData.Id = costGemDatas.Id gemData.nums = costGemDatas.Count table.insert(msg.consumeJewelry, gemData) msg.isFast = false NetManager.SendMessage(MessageEnums.MessageMergeJewelry, msg) end --快捷合成 function GemCompose_Model.FastComposeGemReq(costGemDatas, curItemId,_CurEquipType, _GemIndex, _NextItemID) local msg = jewelry_pb.MergeJewelryReq() msg.heroId = GemCompose_Model.GetCurHeroID() msg.jewelryType = _CurEquipType msg.jewelryLocation = _GemIndex for i=1,#costGemDatas do local gemData = jewelry_pb.ConsumeJewelry() gemData.Id = costGemDatas[i].ID if curItemId == gemData.Id then gemData.nums = 1 else gemData.nums = costGemDatas[i].Count end table.insert(msg.consumeJewelry, gemData) end msg.targetJewelry.Id = _NextItemID msg.targetJewelry.nums = 1 msg.isFast = true NetManager.SendMessage(MessageEnums.MessageMergeJewelry,msg) end function private.ComposeGemResponse(msgResp) if msgResp.Resp.Code == 0 then local isFast = msgResp.isFast if isFast then --身上的宝石升级,更新英雄信息 GemCompose_Model.UpdateHeros(msgResp.Resp.PlayerChange.UpdateHeroes) end EventSystem.Dispatch(EventID.UI_PlayGemComposeEffect) if isFast then EventSystem.Dispatch(EventID.UI_GemQuickComposeSuccess) CTL.Tips.AddTipsMsg(Const_IDS["IDS_Jade_QuickUpgrade_4"]) end local gongMingInfo = GemCompose_Model.GetHeroGongMingInfo(GemCompose_Model.GetCurHeroID()) if gongMingInfo.isActive then if curGongMingLevel ~= gongMingInfo.level then if curGongMingLevel <= 0 then curGongMingLevel = 0 end curGongMingLevel = gongMingInfo.level end end end end -- --#end region-------------通信---------------------------- -- -#region 背包相关操作----------------------- local GemBag = {} --设置宝石背包数据 function GemCompose_Model.SetGemBagInfo(gems) if gems ~= nil then for i = 1, #gems do local gemInfo = {} gemInfo.ID = gems[i].id gemInfo.ItemData = DataSheetManager.ItemData:GetDataByID(gems[i].cfgId) gemInfo.Count = gems[i].count GemBag[gems[i].id] = gemInfo levelCountList[gemInfo.ItemData.SecondType][gemInfo.ItemData.ThirdType] = gems[i].count end end end --更新宝石背包数据 function GemCompose_Model.UpdateGemFromBag(gems) for i = 1, #gems do local gem = gems[i] if GemBag ~= nil then local info = GemBag[gem.id] if info ~= nil then if gem.count > 0 then info.Count = gem.count levelCountList[info.ItemData.SecondType][info.ItemData.ThirdType] = gem.count else GemBag[gem.id] = nil levelCountList[info.ItemData.SecondType][info.ItemData.ThirdType] = 0 end else local gemInfo = {} gemInfo.ID = gems[i].id gemInfo.ItemData = DataSheetManager.ItemData:GetDataByID(gems[i].cfgId) gemInfo.Count = gems[i].count GemBag[gems[i].id] = gemInfo levelCountList[gemInfo.ItemData.SecondType][gemInfo.ItemData.ThirdType] = gems[i].count end end end --刷新背包数据 EventSystem.Dispatch(EventID.UI_RefreshGemBagRedPoint) EventSystem.Dispatch(EventID.UI_RefreshGemRedPoint) EventSystem.Dispatch(EventID.UI_Gem_Refresh_Bag) end --删除宝石背包数据 function GemCompose_Model.DelGemFromBag(gems) if not gems or table.getn(gems)==0 then return end for i = 1, #gems do if GemBag and GemBag[gems[i]] then local info = GemBag[gems[i]] GemBag[gems[i]] = nil levelCountList[info.ItemData.SecondType][info.ItemData.ThirdType] = 0 end end --刷新背包数据 EventSystem.Dispatch(EventID.UI_RefreshGemBagRedPoint) EventSystem.Dispatch(EventID.UI_RefreshGemRedPoint) EventSystem.Dispatch(EventID.UI_Gem_Refresh_Bag) end local CanComposeGemInBag = {} local NotComposeGemInBag = {} --获取宝石背包数据 function GemCompose_Model.GetSortGemBagDatas() for i = #CanComposeGemInBag,1,-1 do CanComposeGemInBag[i] = nil end for i = #NotComposeGemInBag,1,-1 do NotComposeGemInBag[i] = nil end if GemBag ~= nil then for k, v in pairs(GemBag) do if v.Count >= 2 and v.ItemData.ThirdType < GemCompose_Model.GetGemMaxLevel() then table.insert(CanComposeGemInBag, v) else table.insert(NotComposeGemInBag, v) end end end if CanComposeGemInBag ~= nil then table.sort(CanComposeGemInBag, function(a, b) local ret = true if a.ItemData.ThirdType < b.ItemData.ThirdType then ret = true elseif a.ItemData.ThirdType > b.ItemData.ThirdType then ret = false else if a.ItemData.SecondType ~= b.ItemData.SecondType then ret = a.ItemData.ID < b.ItemData.ID else ret = a.Count > b.Count end end return ret end ) end if NotComposeGemInBag ~= nil then table.sort(NotComposeGemInBag, function(a, b) local ret = true if a.ItemData.ThirdType > b.ItemData.ThirdType then ret = true elseif a.ItemData.ThirdType < b.ItemData.ThirdType then ret = false else if a.ItemData.SecondType ~= b.ItemData.SecondType then ret = a.ItemData.SecondType < b.ItemData.SecondType else ret = a.Count > b.Count end end return ret end ) end if NotComposeGemInBag ~= nil and #NotComposeGemInBag > 0 then for i = 1, #NotComposeGemInBag do table.insert(CanComposeGemInBag, NotComposeGemInBag[i]) end end return CanComposeGemInBag end function GemCompose_Model.GetGemBagDatas() return GemBag end function GemCompose_Model.HasGem() local count = 0 if GemBag ~= nil then for k, v in pairs(GemBag) do if v ~= nil then count = count + 1 end end end return count > 0 end function GemCompose_Model.CanPlayInlayTips() local canInlay = false local arrayCanInlay = {} for i, heroId in ipairs(MDL.Formation.GetSlotHeroIds()) do --英雄宝石信息 if heroId > 0 then local heroInfo = MDL.HeroSelect.GetHeroInfo(heroId) local jewelryInfos = heroInfo.jewelryInfos if jewelryInfos ~= nil then for j = 1, #jewelryInfos do local equipType = j local wearInfo = jewelryInfos[j].wearInfo if wearInfo ~= nil then --有镶嵌宝石 local wearInfoCount = #wearInfo if wearInfoCount > 0 then for k = 1, wearInfoCount do --槽位是否开启? local gemIndex = k local curGemTypeCfgData = DataSheetManager.JadeType:GetDataByID_ChildID(equipType, gemIndex) local isUnlock = MDL.Unlock.IsComplete(curGemTypeCfgData.UnlockCondition, curGemTypeCfgData.UnlockConditionParam) if isUnlock and GemCompose_Model.HasEquipByHeroId(heroId, equipType) then local isSuccess, gemItemData = DataSheetManager.ItemData:TryGetDataByID(wearInfo[k]) if isSuccess then local level = gemItemData.ThirdType for kk, v in pairs(GemCompose_Model.GetGemBagDatas()) do if v ~= nil and v.ItemData.SecondType == gemItemData.SecondType then canInlay = v.ItemData.ThirdType > gemItemData.ThirdType table.insert(arrayCanInlay, canInlay) end end else --遇到没有镶嵌宝石的直接返回 for kk, v in pairs(GemCompose_Model.GetGemBagDatas()) do if v ~= nil and v.ItemData.SecondType == curGemTypeCfgData.JadeType then return true end end end end end else for k=1,GEM_INDEX_COUNT do local gemIndex = k local curGemTypeCfgData = DataSheetManager.JadeType:GetDataByID_ChildID(equipType, gemIndex) local isUnlock = MDL.Unlock.IsComplete(curGemTypeCfgData.UnlockCondition, curGemTypeCfgData.UnlockConditionParam) if isUnlock and GemCompose_Model.HasEquipByHeroId(heroId, equipType) then --遇到没有镶嵌宝石的直接返回 for kk, v in pairs(GemCompose_Model.GetGemBagDatas()) do if v ~= nil and v.ItemData.SecondType == curGemTypeCfgData.JadeType then return true end end end end end end end end end end for i = 1, #arrayCanInlay do if arrayCanInlay[i] then return true end end CTL.Tips.AddTipsMsg(Const_IDS.IDS_Jade_Inset_10) return false end function GemCompose_Model.GetGemCountByItemId(itemId) for i, v in pairs(GemBag) do if v.ItemData.ID == itemId then return v.Count end end return 0 end -- -#end region 背包相关操作----------------------- -- -#region----武将已镶嵌宝石信息------------------------------- --英雄身上装备部位镶嵌的宝石信息,用于阵容界面展示和装备界面展示宝石 function GemCompose_Model.GetHeroInlayGemInfo(heroId, equipIndex) local heroInfo = MDL.Player.GetLineUpHeroInfoByHeroId(heroId) if heroInfo then local jewelryInfos =heroInfo.jewelryInfos if jewelryInfos ~= nil then for j = 1, #jewelryInfos do if j == equipIndex then --特定部位4颗宝石信息 return jewelryInfos[j].wearInfo end end else return nil end end return nil end --某个英雄-特定装备部位-特定镶嵌宝石的槽位下标 --返回:宝石ID function GemCompose_Model.GetHeroInlayGemByIndex(heroId, equipIndex, gemIndex) local heroInfo = MDL.Player.GetLineUpHeroInfoByHeroId(heroId) if heroInfo then local jewelryInfos =heroInfo.jewelryInfos if jewelryInfos ~= nil and jewelryInfos[equipIndex] ~= nil then local wearInfo = jewelryInfos[equipIndex].wearInfo if wearInfo then if wearInfo[gemIndex] and wearInfo[gemIndex] > 0 then return wearInfo[gemIndex] else return nil end end end end return nil end --共鸣等级 function GemCompose_Model.GetHeroGongMingInfo(heroId) local heroInfo = MDL.Player.GetLineUpHeroInfoByHeroId(heroId) if heroInfo then return heroInfo.jewelryLevel end return nil end function GemCompose_Model.UpdateHeros(newHeros) EventSystem.Dispatch(EventID.UI_RefreshGemRedPoint) end -- -endRegion----武将已镶嵌宝石信息------------------------------- --身上已镶嵌的宝石 function GemCompose_Model.GetInlayGemInfo(equipType, gemIndex) return GemCompose_Model.GetHeroInlayGemByIndex(GemCompose_Model.GetCurHeroID(), equipType, gemIndex) end function GemCompose_Model.GetGongMingLevel() local gongMingInfo = GemCompose_Model.GetHeroGongMingInfo(GemCompose_Model.GetCurHeroID()) if gongMingInfo ~= nil and gongMingInfo.isActive then return gongMingInfo.level end return 0 end --获取共鸣属性 function GemCompose_Model.GetGongMingInfo() local curGongMingLevel = GemCompose_Model.GetGongMingLevel() if curGongMingLevel > 0 then --展示数据 {title,isUnlock,unlockText,attr} local displayData = {} for _,v in DataSheetManager.JadeResonance:GetEnumerator() do local data = {} if v.Level > 0 then local isUnlock = curGongMingLevel >= v.Level data["isUnlock"] = isUnlock if isUnlock then data["title"] = string.FormatByIdsId(Const_IDS.IDS_Jade_Resonance_3, v.Level) else local unlockText = string.FormatByIdsId(Const_IDS.IDS_Jade_Resonance_2, v.MinJadeLevel) data["title"] = string.FormatByIdsId(Const_IDS.IDS_Jade_Resonance_3, v.Level) .. "(" .. unlockText .. ")" end local AttrDict = UTL.Item.GetAttrDict(v.Attr_Table) data["attr"] = "" local coount = 0 for k,v in pairs(AttrDict) do coount = coount + 1 end local tmpCoount = 0 for k,v in pairs(AttrDict) do tmpCoount = tmpCoount + 1 if tmpCoount < coount then data["attr"] = data["attr"] .. k .. " " .. v .. "\n" else data["attr"] = data["attr"] .. k .. " " .. v end end table.insert(displayData, data) end end return displayData end return nil end --达到共鸣升级时,展示共鸣升级界面时获取展示数据 function GemCompose_Model.UpgradeGongMing(oldGongMingLevel, heroId) local upgradeGongMingLevel = GemCompose_Model.GetGongMingLevel() if oldGongMingLevel >= DataSheetManager.JadeResonance:GetDataCount() then logging.log(LTAG.LOG,"GongMingLevel Is Max") return oldGongMingLevel, upgradeGongMingLevel, nil end local sumAttr = {} for i=oldGongMingLevel + 1,upgradeGongMingLevel do local attrTable = DataSheetManager.JadeResonance:GetDataByLevel(i) local curAttrDict = UTL.Item.GetAttrDict(attrTable.Attr_Table) for k,v in pairs(curAttrDict) do if sumAttr[k] == nil then sumAttr[k] = v else sumAttr[k] = sumAttr[k] + v end end end return oldGongMingLevel, upgradeGongMingLevel, sumAttr end --获取给定类型可镶嵌的宝石 function GemCompose_Model.GetInlayGemDatas(equipType, gemInlayIndex, CurInlayGemId) local GemTypeCfgData = DataSheetManager.JadeType:GetDataByID_ChildID(equipType, gemInlayIndex) --筛选背包中可以佩戴的数据 local displayData = {} if GemBag == nil then return displayData end for k,v in pairs(GemBag) do local gemData = v local itemData = v.ItemData local needEquipType = DataSheetManager.JadeType:GetDataByID_ChildID(equipType, gemInlayIndex) if needEquipType.JadeType == itemData.SecondType then local data = {} data.ID = itemData.ID data.IsOwner = false data.Count = gemData.Count table.insert(displayData, data) end end table.sort(displayData, function (a, b) if a.ID > b.ID then return true elseif a.ID < b.ID then return false end return a.Count > b.Count end) return displayData end -- --#Region-------------快捷合成宝石相关---------------------------- -- local singleValueDict = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384} -- local countDict = {102, 3, 3, 20, 4, 3, 3, 4, 6, 3, 5, 4} function GemCompose_Model.GetGemBagByLevel(FirstType, SecondType,level) local gemBagDatas = GemCompose_Model.GetGemBagDatas() for k,v in pairs(gemBagDatas) do if v ~= nil then if level == v.ItemData.ThirdType and FirstType == v.ItemData.FirstType and SecondType == v.ItemData.SecondType then return v.ItemData.ID end end end end function GemCompose_Model.GetGemCountBy(ItemDataCfgData) local gemFirstType = ItemDataCfgData.FirstType local gemSencondType = ItemDataCfgData.SecondType return levelCountList[gemSencondType] end --根据类型获取下一级宝石ItemID function GemCompose_Model.GetNextGemItem(firstType, secondType, nextLevel) for k,v in DataSheetManager.ItemData:GetEnumerator() do if v.FirstType == firstType and v.SecondType == secondType and v.ThirdType == nextLevel then return v.ID end end end --快捷合成宝石时,需要消耗的宝石 function GemCompose_Model.GetComposeConstGemKeyValue(ItemDataCfgData, curLevel, target) if target <= 0 then return false end local curItemDataId = ItemDataCfgData.ID local gemFirstType = ItemDataCfgData.FirstType local gemSencondType = ItemDataCfgData.SecondType local countDict = GemCompose_Model.GetGemCountBy(ItemDataCfgData) local singleValueDict = singleGemUpgradeCostCount local costCountDict = {} local count = 0 target = singleValueDict[target] target = target - singleValueDict[curLevel] for i = 1, #singleValueDict do local curCount = countDict[i] if costCountDict[i] == nil then costCountDict[i] = 0 end if i == ItemDataCfgData.ThirdType and curCount > 0 then curCount = curCount + 1 end if i == 1 then --1作为特殊处理,只取偶数 if (curCount % 2) ~= 0 then curCount = curCount - 1 end for j = 1, curCount do count = count + singleValueDict[i] costCountDict[i] = costCountDict[i] + 1 if count == target then --print("--11-----已达需要等级------") return true, costCountDict end end elseif i == curLevel then --遍历到当前等级,说明前边的小等级宝石不能满足,直接返回同等级*1即可 if curCount > 0 then table.clear(costCountDict) costCountDict[i] = 1 return true, costCountDict end else for j = 1, curCount do count = count + singleValueDict[i] costCountDict[i] = costCountDict[i] + 1 if count == target then --print("--22-----已达需要等级------count ", count) return true, costCountDict end if count > target then local sub = count - target --到这个分支其实是costCountDict内加起来的等级已经超过target,只需要删去多出来的宝石即可 for k = #singleValueDict, 1, -1 do --倒序遍历直到sub为0 if singleValueDict[k] <= sub and costCountDict[k] > 0 then while sub >= singleValueDict[k] and costCountDict[k] > 0 do sub = sub - singleValueDict[k] costCountDict[k] = costCountDict[k] - 1 end end end local newsumCount = 0 for k, v in pairs(costCountDict) do newsumCount = newsumCount + singleValueDict[k] * v end if newsumCount == target then --print("--33-----已达需要等级------") return true, costCountDict end return false, costCountDict end end end end end -- local result, costCountDict = GemCompose_Model.Parse(1024) -- if result == true then -- if costCountDict ~= nil then -- for k,v in pairs(costCountDict) do -- print(k,v) -- end -- end -- end -- -#end Region------宝石合成信息相关---------------------------- -- -#region-----红点相关---------- --全局红点,用于外部判断 --粗略检测,只要检测到第一个有红点就退出,在进相应功能时再仔细判断 function GemCompose_Model.HasRedPoint() if not MDL.Unlock.IsUnlock(MDL.Unlock.FunctionType.Gem) then return false end local hasInlyGem = true for _,heroInfo in MDL.Player.GetLineUpHeroInfoEnumerator() do --英雄宝石信息 local heroId = heroInfo.heroId local jewelryInfos = heroInfo.jewelryInfos if jewelryInfos ~= nil then for j = 1, #jewelryInfos do local wearInfo = jewelryInfos[j].wearInfo if wearInfo ~= nil then --有镶嵌宝石 local wearInfoCount = #wearInfo for k = 1, wearInfoCount do local gemItemData = wearInfo[k]>0 and DataSheetManager.ItemData:GetDataByID(wearInfo[k]) or nil if gemItemData ~= nil then hasInlyGem = false local equipType = j local gemIndex = k local curGemTypeCfgData = DataSheetManager.JadeType:GetDataByID_ChildID(equipType, gemIndex) for kk, v in pairs(GemCompose_Model.GetGemBagDatas()) do if v ~= nil and v.ItemData.SecondType == curGemTypeCfgData.JadeType and v.ItemData.ThirdType > gemItemData.ThirdType then return true end end else local equipType = j local gemIndex = k local curGemTypeCfgData = DataSheetManager.JadeType:GetDataByID_ChildID(equipType, gemIndex) for k, v in pairs(GemCompose_Model.GetGemBagDatas()) do if v ~= nil and v.ItemData ~= nil and v.ItemData.SecondType == curGemTypeCfgData.JadeType and GemCompose_Model.HasEquipByHeroId(heroId, equipType) then local isUnlock = MDL.Unlock.IsComplete(curGemTypeCfgData.UnlockCondition, curGemTypeCfgData.UnlockConditionParam) if isUnlock then return true end end end end end if wearInfoCount <= 0 then local equipType = j for gemIndex = 1, GEM_INDEX_COUNT do local curGemTypeCfgData = DataSheetManager.JadeType:GetDataByID_ChildID(equipType, gemIndex) for k, v in pairs(GemCompose_Model.GetGemBagDatas()) do if v ~= nil and v.ItemData ~= nil and v.ItemData.SecondType == curGemTypeCfgData.JadeType and GemCompose_Model.HasEquipByHeroId(heroId, equipType) then local isUnlock = MDL.Unlock.IsComplete(curGemTypeCfgData.UnlockCondition, curGemTypeCfgData.UnlockConditionParam) if isUnlock then return true end end end end end else --没有镶嵌宝石 local equipType = j for gemIndex = 1, GEM_INDEX_COUNT do local curGemTypeCfgData = DataSheetManager.JadeType:GetDataByID_ChildID(equipType, gemIndex) for k, v in pairs(GemCompose_Model.GetGemBagDatas()) do if v ~= nil and v.ItemData ~= nil and v.ItemData.SecondType == curGemTypeCfgData.JadeType and GemCompose_Model.HasEquipByHeroId(heroId, equipType) then local isUnlock = MDL.Unlock.IsComplete(curGemTypeCfgData.UnlockCondition, curGemTypeCfgData.UnlockConditionParam) if isUnlock then return true end end end end end end else return false end end return false end --粗略检测,只要检测到第一个有快捷合成就退出,在进相应功能时再仔细判断 function GemCompose_Model.HasQuickCompose() if not MDL.Unlock.IsUnlock(MDL.Unlock.FunctionType.Gem) then return false end for i, v in ipairs(MDL.Player.GetHeroLinUpIds()) do local quickComposeArray = GemCompose_Model.QuickEquipGemInfoInFunction(v) for i=1,#quickComposeArray do if quickComposeArray[i] then return true end end end return false end --单个英雄对应槽位红点 function GemCompose_Model.RedpointInfoByHero(_heroId, equipType) if not MDL.Unlock.IsUnlock(MDL.Unlock.FunctionType.Gem) then return false end local heroId = _heroId table.clearArray(private.redPointArray) for i = 1, GEM_INDEX_COUNT do local hasRedPoint = false local gemItemId = GemCompose_Model.GetHeroInlayGemByIndex(heroId, equipType, i) local curGemTypeCfgData = DataSheetManager.JadeType:GetDataByID_ChildID(equipType, i) if gemItemId ~= nil then --判断该槽位是否已经镶嵌宝石 local gemItemData = DataSheetManager.ItemData:GetDataByID(gemItemId) for k, v in pairs(GemCompose_Model.GetGemBagDatas()) do if v ~= nil and v.ItemData.SecondType == curGemTypeCfgData.JadeType and v.ItemData.ThirdType > gemItemData.ThirdType then hasRedPoint = true break end end table.insert(private.redPointArray, hasRedPoint) else--没镶嵌宝石的,看看背包里有没有 local isUnlock = MDL.Unlock.IsComplete(curGemTypeCfgData.UnlockCondition, curGemTypeCfgData.UnlockConditionParam) if isUnlock then for k, v in pairs(GemCompose_Model.GetGemBagDatas()) do if v ~= nil and v.ItemData.SecondType == curGemTypeCfgData.JadeType then hasRedPoint = true break end end end table.insert(private.redPointArray, hasRedPoint) end end return private.redPointArray end --阵容界面英雄头像红点 function GemCompose_Model.RedpointEquipGemInfoByHero(_heroId) if not MDL.Unlock.IsUnlock(MDL.Unlock.FunctionType.Gem) then return false end table.clearArray(private.redPointArray) local heroId = _heroId for equipType = 1, EQUIP_INDEX do if GemCompose_Model.HasEquipByHeroId(heroId, equipType) then for i = 1, GEM_INDEX_COUNT do local hasRedPoint = false local gemItemId = GemCompose_Model.GetHeroInlayGemByIndex(heroId, equipType, i) local curGemTypeCfgData = DataSheetManager.JadeType:GetDataByID_ChildID(equipType, i) if gemItemId ~= nil then --判断该槽位是否已经镶嵌宝石 local gemItemData = DataSheetManager.ItemData:GetDataByID(gemItemId) for k, v in pairs(GemCompose_Model.GetGemBagDatas()) do if v ~= nil and v.ItemData.SecondType == curGemTypeCfgData.JadeType and v.ItemData.ThirdType > gemItemData.ThirdType then return true end end table.insert(private.redPointArray, hasRedPoint) else --没镶嵌宝石的,看看背包里有没有 for k, v in pairs(GemCompose_Model.GetGemBagDatas()) do if v ~= nil and v.ItemData.SecondType == curGemTypeCfgData.JadeType then local isUnlock = MDL.Unlock.IsComplete(curGemTypeCfgData.UnlockCondition, curGemTypeCfgData.UnlockConditionParam) if isUnlock then return true end end end end end end end return false end --英雄是否有装备 function GemCompose_Model.HasEquipByHeroId(heroId, equipIndex) local heroInfo = MDL.HeroSelect.GetHeroInfo(heroId) if heroInfo and heroInfo.equipInfos and #heroInfo.equipInfos > 0 then for i = 1, #heroInfo.equipInfos do if heroInfo.equipInfos[i].Id ~= nil and #heroInfo.equipInfos[i].Id > 0 and equipIndex == i then return true end end end return false end --阵容、装备界面宝石镶嵌红点显示 function GemCompose_Model.RedpointEquipGemInfoInFunction(_heroId) table.clearArray(private.redPointInFunctionArray) if not MDL.Unlock.IsUnlock(MDL.Unlock.FunctionType.Gem) then return private.redPointInFunctionArray end local heroId = _heroId for equipType = 1, EQUIP_INDEX do if GemCompose_Model.HasEquipByHeroId(heroId, equipType) then local hasRedPoint = false for i = 1, GEM_INDEX_COUNT do local gemItemId = GemCompose_Model.GetHeroInlayGemByIndex(heroId, equipType, i) local curGemTypeCfgData = DataSheetManager.JadeType:GetDataByID_ChildID(equipType, i) if gemItemId ~= nil then --判断该槽位是否已经镶嵌宝石 local gemItemData = DataSheetManager.ItemData:GetDataByID(gemItemId) for k, v in pairs(GemCompose_Model.GetGemBagDatas()) do if v ~= nil and v.ItemData.SecondType == curGemTypeCfgData.JadeType and v.ItemData.ThirdType > gemItemData.ThirdType then hasRedPoint = true break; end end else --没镶嵌宝石的,看看背包里有没有 for k, v in pairs(GemCompose_Model.GetGemBagDatas()) do if v ~= nil and v.ItemData.SecondType == curGemTypeCfgData.JadeType then local isUnlock = MDL.Unlock.IsComplete(curGemTypeCfgData.UnlockCondition, curGemTypeCfgData.UnlockConditionParam) if isUnlock then hasRedPoint = true break; end end end end if hasRedPoint then break; end end table.insert(private.redPointInFunctionArray, hasRedPoint) else table.insert(private.redPointInFunctionArray, false) end end return private.redPointInFunctionArray end --阵容界面英雄头像 function GemCompose_Model.QuickEquipGemInfoByHero(_heroId) if not MDL.Unlock.IsUnlock(MDL.Unlock.FunctionType.Gem) then return false end for equipType = 1, EQUIP_INDEX do local qucikComposeTipArray = GemCompose_Model.QuickComposeInfo(_heroId, equipType) for i = 1, #qucikComposeTipArray do if qucikComposeTipArray[i] then return true end end end return false end --阵容、装备界面宝石镶嵌快捷合成显示 function GemCompose_Model.QuickEquipGemInfoInFunction(_heroId) table.clearArray(private.quickInFunctionArray) if not MDL.Unlock.IsUnlock(MDL.Unlock.FunctionType.Gem) then return private.quickInFunctionArray end for equipType = 1, EQUIP_INDEX do local qucikComposeTipArray = GemCompose_Model.QuickComposeInfo(_heroId, equipType) local canCompose = false for i = 1, #qucikComposeTipArray do if qucikComposeTipArray[i] then canCompose = true break end end table.insert(private.quickInFunctionArray, canCompose) end return private.quickInFunctionArray end --单个快捷合成提示 function GemCompose_Model.QuickComposeInfo(_heroId, equipType) local heroId = _heroId table.clearArray(private.quickComposeTipArray) for i = 1, GEM_INDEX_COUNT do local gemItemId = GemCompose_Model.GetHeroInlayGemByIndex(heroId, equipType, i) local curGemTypeCfgData = DataSheetManager.JadeType:GetDataByID_ChildID(equipType, i) local canCompose = false if gemItemId ~= nil then --判断该槽位是否已经镶嵌宝石 local gemItemData = DataSheetManager.ItemData:GetDataByID(gemItemId) --当前镶嵌的宝石,获取其类型,对比其他上阵英雄是否已经镶嵌宝石了,如果全都镶嵌了则可以提示合成 local canComposeGemArray = {} for k, v in pairs(GemCompose_Model.GetGemBagDatas()) do if v ~= nil then if gemItemData ~= nil and gemItemData.ThirdType < GemCompose_Model.GetGemMaxLevel() and v.ItemData.ThirdType <= gemItemData.ThirdType and curGemTypeCfgData.JadeType == v.ItemData.SecondType then if v.ItemData.ID == gemItemId then if v.Count >= 1 then table.insert(canComposeGemArray, v.ItemData.ID) end else local curLevel = gemItemData.ThirdType local maxLevel = MDL.GemCompose.GetGemMaxLevel() local nextLevel = 0 if curLevel + 1 <= maxLevel then nextLevel = curLevel + 1 end local canCompose, costCountDict = MDL.GemCompose.GetComposeConstGemKeyValue(gemItemData, curLevel, nextLevel) if canCompose then table.insert(canComposeGemArray, v.ItemData.ID) end end end end end if #canComposeGemArray > 0 then --查看其他英雄是否已经镶嵌? canCompose = true --再判断一次是否有相同类型的宝石槽位没有镶嵌宝石 --fix by wyz:少判断了其他装备类型是否有镶嵌同类型的宝石还未穿戴 local hasNil = false for nilGemIndex = 1, GEM_INDEX_COUNT do for _equipType = 1, MDL.Equipment.MaxEquipNum do local isEquip = GemCompose_Model.HasEquipByHeroId(heroId, _equipType) if isEquip then local _CurGemTypeCfgData = DataSheetManager.JadeType:GetDataByID_ChildID(_equipType, nilGemIndex) local _GemItemId = GemCompose_Model.GetHeroInlayGemByIndex(heroId, _equipType, nilGemIndex) if _GemItemId == nil and _CurGemTypeCfgData.JadeType == curGemTypeCfgData.JadeType then local isUnlock = MDL.Unlock.IsComplete(_CurGemTypeCfgData.UnlockCondition, _CurGemTypeCfgData.UnlockConditionParam) if isUnlock then hasNil = true break end end end end if hasNil then break end end if not hasNil then for i, v in ipairs(MDL.Player.GetHeroLinUpIds()) do --判断其他武将(包括自己)是否可穿戴 local heroGemWearRed = nil for _equipType = 1, MDL.Equipment.MaxEquipNum do local isEquip = GemCompose_Model.HasEquipByHeroId(v, _equipType) if isEquip then heroGemWearRed = MDL.GemCompose.RedpointInfoByHero(v,_equipType) for id,heroGemRed in ipairs(heroGemWearRed) do if heroGemRed then local jadeTypeConfig = DataSheetManager.JadeType:GetDataByID_ChildID(_equipType, id) if curGemTypeCfgData.JadeType == jadeTypeConfig.JadeType then canCompose = false break end end end if canCompose == false then break end end end if canCompose == false then break end end else canCompose = false end end table.insert(private.quickComposeTipArray, canCompose) else table.insert(private.quickComposeTipArray, canCompose) end end return private.quickComposeTipArray end --宝石合成背包红点 function GemCompose_Model.BagComposeRedPoint() local gemBagDatas = GemCompose_Model.GetGemBagDatas() for k, v in pairs(gemBagDatas) do if v ~= nil then local gemItemdData = v.ItemData local count = v.Count if count >= 2 and gemItemdData.ThirdType < GemCompose_Model.GetGemMaxLevel() then return true end end end return false end -- -#end region-----红点相关---------- function GemCompose_Model.OnShutdown() curGongMingLevel = -1 end return GemCompose_Model