local HorseEquip_Model = {} local private = {} local EventSystem = require('Event/EventSystem') local horse_equip_pb = require "Proto.horse_equip_pb" HorseEquip_Model.WearHorseEquipType = { PutOn = horse_equip_pb.putOn, TakeOff = horse_equip_pb.takeOff, AutoEquip = horse_equip_pb.auto_putOn, } function HorseEquip_Model.OnStartup() NetManager.RegisterMsgCB(MessageEnums.MessageWearHorseEquip, private.WearHorseEquipResp) NetManager.RegisterMsgCB(MessageEnums.MessageHorseEquipLevelUp, private.HorseEquipLevelUpResp) --[[private.horseEquipInfoDic[id] = { id, --背包唯一实例Id cfgId, --战装道具Id,映射战装表和道具表 equipHorseId, --被装备上的马Id equipData, --战装表数据 itemData, --道具表数据 gs, }]]-- private.horseEquipInfoDic = {} private.equipIdList = {} private.equipMaterialIdList = {} --按照材料的规则排序,这里不做已装备的筛选 private.horseEquipDic = {} -- k-horseID v-{k-实例id v-装备位置Typ} private.horseArmorDic = {} -- k-horseID v-{level-战装等级; exp-战装经验; isArmorActive-装甲是否激活} end function HorseEquip_Model.GetEquipInfoById(id) return private.horseEquipInfoDic[id] end --传入pos, 返回该位置的装备 --不传pos, 返回所有位置装备列表(注意列表下标index和部位pos并不一致) function HorseEquip_Model.GetEquipSlotInfoByHorseId(horseId, pos) local info = MDL.WarHorse.GetInfoByID(horseId) if info then local equipInfos = info.HorseInfo.horseEquip.equipInfos if equipInfos and pos then for i, v in ipairs(equipInfos) do if v.typ == pos then return v end end return nil end return info.HorseInfo.horseEquip.equipInfos or {} else logging.error(LTAG.ERROR, "没有找到HorseId:", horseId, "的坐骑信息,请检查!") end end function HorseEquip_Model.GetArmorLvInfoByHorseId(horseId) local info = MDL.WarHorse.GetInfoByID(horseId) if info then return info.HorseInfo.horseEquip.level or 0 else logging.error(LTAG.ERROR, "没有找到HorseId:", horseId, "的坐骑信息,请检查!") end end function HorseEquip_Model.GetEquipItemList() return private.equipIdList end function HorseEquip_Model.GetEquipMaterialList() return private.equipMaterialIdList end --已装备>高阶级>高品质>id local function SortEquip(a, b) local equipInfoA = private.horseEquipInfoDic[a] local equipInfoB = private.horseEquipInfoDic[b] local isEquipA = equipInfoA.equipHorseId and true local isEquipB = equipInfoB.equipHorseId and true if isEquipA and not isEquipB then return true elseif not isEquipA and isEquipB then return false else local stageA = equipInfoA.equipData.EquipStage local stageB = equipInfoB.equipData.EquipStage if stageA ~= stageB then return stageA > stageB else local qualityA = equipInfoA.itemData.Color local qualityB = equipInfoB.itemData.Color if qualityA ~= qualityB then return qualityA > qualityB else return equipInfoA.cfgId > equipInfoB.cfgId end end end end --低等阶>低品质>id local function SortEquipMaterial(a, b) local equipInfoA = private.horseEquipInfoDic[a] local equipInfoB = private.horseEquipInfoDic[b] local stageA = equipInfoA.equipData.EquipStage local stageB = equipInfoB.equipData.EquipStage if stageA ~= stageB then return stageA < stageB else local qualityA = equipInfoA.itemData.Color local qualityB = equipInfoB.itemData.Color if qualityA ~= qualityB then return qualityA < qualityB else return equipInfoA.cfgId < equipInfoB.cfgId end end end function HorseEquip_Model.InitHorseEquipBag(horseEquip) for i, v in ipairs(horseEquip) do local data = private.horseEquipInfoDic[v.id] if not data then private.horseEquipInfoDic[v.id] = { id = v.id, cfgId = v.cfgId, equipHorseId = false, equipData = DataSheetManager.HorseEquipData:GetDataByID(v.cfgId), itemData = DataSheetManager.ItemData:GetDataByID(v.cfgId), gs = CTL.HorseEquip.GetEquipGs(v.cfgId), } table.insert(private.equipIdList, v.id) table.insert(private.equipMaterialIdList, v.id) end end table.sort(private.equipIdList, SortEquip) table.sort(private.equipMaterialIdList, SortEquipMaterial) EventSystem.Dispatch(EventID.HorseEquip_UpdateBag) end --坐骑信息发生变化,更新战装数据 function HorseEquip_Model.UpdateEquipDic(horseInfoList) for _, v in ipairs(horseInfoList) do --更新装备数据 local horseEquip = private.horseEquipDic[v.Id] if horseEquip then for equipId, pos in pairs(horseEquip) do if private.horseEquipInfoDic[equipId] then private.horseEquipInfoDic[equipId].equipHorseId = false end end table.clear(horseEquip) else horseEquip = {} private.horseEquipDic[v.Id] = horseEquip end local equipCount = 0 for i, info in ipairs(v.horseEquip.equipInfos) do if not string.isNilOrEmpty(info.Id) then horseEquip[info.Id] = info.typ equipCount = equipCount + 1 end end --更新装甲数据 if not private.horseArmorDic[v.Id] then private.horseArmorDic[v.Id] = {} end private.horseArmorDic[v.Id].level = v.horseEquip.level private.horseArmorDic[v.Id].exp = v.horseEquip.exp private.horseArmorDic[v.Id].isArmorActive = equipCount == 4 end --设置装备穿戴的horseId for horseId, horseEquip in pairs(private.horseEquipDic) do for equipId, pos in pairs(horseEquip) do if private.horseEquipInfoDic[equipId] then private.horseEquipInfoDic[equipId].equipHorseId = horseId end end --计算坐骑战装战力 CTL.HorseEquip.CalculateHorseEquipGs(horseId) end table.sort(private.equipIdList, SortEquip) EventSystem.Dispatch(EventID.UI_HorseArmor_EquipUpdate) end function HorseEquip_Model.UpdateEquipBag(horseEquip) for i, v in ipairs(horseEquip) do local horseEquipData = private.horseEquipInfoDic[v.id] if not horseEquipData then private.horseEquipInfoDic[v.id] = { id = v.id, cfgId = v.cfgId, equipHorseId = HorseEquip_Model.JudgeIfEquip(v.id), equipData = DataSheetManager.HorseEquipData:GetDataByID(v.cfgId), itemData = DataSheetManager.ItemData:GetDataByID(v.cfgId), gs = CTL.HorseEquip.GetEquipGs(v.cfgId), } table.insert(private.equipIdList, v.id) table.insert(private.equipMaterialIdList, v.id) end end table.sort(private.equipIdList, SortEquip) table.sort(private.equipMaterialIdList, SortEquipMaterial) EventSystem.Dispatch(EventID.HorseEquip_UpdateBag) end function HorseEquip_Model.DelHorseEquipBag(delHorseEquip) for i, id in ipairs(delHorseEquip) do private.horseEquipInfoDic[id] = nil local index = 0 for i, v in ipairs(private.equipIdList) do if v == id then index = i break end end table.remove(private.equipIdList, index) for i, v in ipairs(private.equipMaterialIdList) do if v == id then index = i break end end table.remove(private.equipMaterialIdList, index) end table.sort(private.equipIdList, SortEquip) table.sort(private.equipMaterialIdList, SortEquipMaterial) EventSystem.Dispatch(EventID.HorseEquip_UpdateBag) end function HorseEquip_Model.JudgeIfEquip(equipId) for horseId, equipDic in pairs(private.horseEquipDic) do for id, pos in pairs(equipDic) do if id == equipId then return horseId end end end return false end function HorseEquip_Model.GetArmorInfo(horseId) return private.horseArmorDic[horseId] end function HorseEquip_Model.GetArmorLimitLv(horseId) local limitLv = 0 for i = 1, 4 do local equipInfo = HorseEquip_Model.GetEquipSlotInfoByHorseId(horseId,i) if equipInfo and CTL.HorseEquip.JudgeEquipId(equipInfo.Id) then local equipData = MDL.HorseEquip.GetEquipInfoById(equipInfo.Id).equipData limitLv = limitLv + equipData.OfferLevel else return false, 0 end end return true, limitLv end --region 协议 function HorseEquip_Model.OptHorseEquipReq(horseId, equipId, optType) local msg = horse_equip_pb.WearHorseEquipReq() msg.horseId = horseId msg.equipUUid = equipId msg.optType = optType local targetEquipInfo = private.horseEquipInfoDic[equipId] local targetHorseId, oldLimitLv if targetEquipInfo and targetEquipInfo.equipHorseId then targetHorseId = HorseEquip_Model.JudgeIfEquip(equipId) local _, imitLv = HorseEquip_Model.GetArmorLimitLv(targetHorseId) oldLimitLv = imitLv else targetHorseId = horseId local _, imitLv = HorseEquip_Model.GetArmorLimitLv(horseId) oldLimitLv = imitLv end private.tempOptEquipData = {horseId = targetHorseId, oldLimitLv = oldLimitLv, oldArmorLv = private.horseArmorDic[targetHorseId].level, isArmorActive = private.horseArmorDic[horseId].isArmorActive} NetManager.SendMessage(MessageEnums.MessageWearHorseEquip, msg) end function private.WearHorseEquipResp(msgResp) logging.log(LTAG.LOG,"坐骑战装穿戴WearHorseEquipResp ",msgResp.optType) if msgResp.Resp.Code == 0 then if msgResp.optType == HorseEquip_Model.WearHorseEquipType.AutoEquip then CTL.Tips.AddTipsMsg(Const_IDS.IDS_HorseEquip_Hint_7) EventSystem.Dispatch(EventID.UI_Horse_Equip, private.tempOptEquipData) end if msgResp.optType == HorseEquip_Model.WearHorseEquipType.PutOn then EventSystem.Dispatch(EventID.UI_Horse_Equip, private.tempOptEquipData) end if msgResp.backItemNum > 0 then UIManager.OpenView(Const_UI_Lua.UIEnum.UIHorseEquipRelegate, {tempOptEquipData = private.tempOptEquipData, backItemNum = msgResp.backItemNum}) end end end function HorseEquip_Model.HorseEquipLevelUpReq(horseId, costEquipList, costItemNum) local msg = horse_equip_pb.HorseEquipLevelUpReq() msg.horseId = horseId local levelUpGeneralItem = CTL.HorseEquip.GetGeneralMaterialItem() for i, v in ipairs(costEquipList) do if v ~= levelUpGeneralItem then msg.costEquipUUid:append(v) end end msg.costItem = costItemNum or 0 private.tempLevelData = {horseId = horseId, oldArmorLv = private.horseArmorDic[horseId].level} NetManager.SendMessage(MessageEnums.MessageHorseEquipLevelUp, msg) end function private.HorseEquipLevelUpResp(msgResp) logging.log(LTAG.LOG,"坐骑装甲升级HorseEquipLevelUpResp ",msgResp) if msgResp.Resp.Code == 0 then EventSystem.Dispatch(EventID.UI_HorseArmor_UpLv, private.tempLevelData) end end --endregion 协议 return HorseEquip_Model