local Appearance_Model = {} local private = {} local EventSystem = require 'Event/EventSystem' local appearance_pb = require 'Proto.appearance_pb' Appearance_Model.AppearanceType = { Hero = appearance_pb.Hero, -- 武将时装 Weapon = appearance_pb.Weapon, -- 神兵时装 Horse = appearance_pb.Horse, -- 坐骑时装 } Appearance_Model.OptType = { Active = appearance_pb.Active, -- 激活 Wear = appearance_pb.Wear, -- 穿戴 LevelUp = appearance_pb.LevelUp, -- 升级 SpecialEffectActive = appearance_pb.SpecialEffectActive, -- 激活外观特殊效果 SpecialEffectOpen = appearance_pb.SpecialEffectOpen, --操作效果 } --当前请求的时装id local curReqId = nil local SortFunction = function(a,b) local a_Index = a.isOriginal and 0 or 1 local b_Index = b.isOriginal and 0 or 1 if a_Index == b_Index then local a_Active = a.isActive and 0 or 1 local b_Active = b.isActive and 0 or 1 if a_Active == b_Active then if a.appearanceConfig.HeroQuality == b.appearanceConfig.HeroQuality then return a.appearanceID < b.appearanceID end return a.appearanceConfig.HeroQuality > b.appearanceConfig.HeroQuality end return a_Active < b_Active end return a_Index < b_Index end local SortWeaponFunction = function(a,b) local a_Index = a.isOriginal and 0 or 1 local b_Index = b.isOriginal and 0 or 1 if a_Index == b_Index then local a_Active = a.isActive and 0 or 1 local b_Active = b.isActive and 0 or 1 if a_Active == b_Active then if a.appearanceConfig.MagicWeaponQuality == b.appearanceConfig.MagicWeaponQuality then return a.appearanceID < b.appearanceID end return a.appearanceConfig.MagicWeaponQuality > b.appearanceConfig.MagicWeaponQuality end return a_Active < b_Active end return a_Index < b_Index end function Appearance_Model.OnStartup() NetManager.RegisterMsgCB(MessageEnums.MessageAppearance, private.AppearanceResp) private.HeroAppearanceList = {} private.WeaponAppearanceList = {} private.AppearanceSpecialEffects = {} private.ServerAppearanceSpecialEffects = {} private.AppearanceItemIdToCfgIds = {} private.InitAppearanceList() Appearance_Model.isHeroWear = false end function private.InitAppearanceList() for k,v in DataSheetManager.HeroAppearance:GetEnumerator() do if v.isOpen then if private.HeroAppearanceList[v.HeroID] == nil then private.HeroAppearanceList[v.HeroID] = {} local heroData = DataSheetManager.HeroNum:GetDataByID(v.HeroID) table.insert(private.HeroAppearanceList[v.HeroID], {appearanceID = 0, appearanceConfig = heroData, appearanceLevel = 0, isActive = true, isOriginal = true}) end table.insert(private.HeroAppearanceList[v.HeroID], {appearanceID = v.ID, appearanceConfig = v, appearanceLevel = 0, isActive = false, isOriginal = false}) private.AppearanceItemIdToCfgIds[v.Activation] = v.ID end end for k,v in DataSheetManager.MagicWeaponData:GetEnumerator() do private.WeaponAppearanceList[v.MagicWeaponID] = {} local weaponData = DataSheetManager.MagicWeaponData:GetDataByMagicWeaponID(v.MagicWeaponID) table.insert(private.WeaponAppearanceList[v.MagicWeaponID], {appearanceID = v.MagicWeaponID, appearanceConfig = weaponData, appearanceLevel = 0, isActive = true, isOriginal = true}) for i,id in ipairs(v.WeaponAppearance) do local appearanceConfig = DataSheetManager.WeaponAppearance:GetDataByID(id) table.insert(private.WeaponAppearanceList[v.MagicWeaponID], {appearanceID = id, appearanceConfig = appearanceConfig, appearanceLevel = 0, isActive = false, isOriginal = false}) private.AppearanceItemIdToCfgIds[appearanceConfig.Activation] = appearanceConfig.ID end end --初始化皮肤的特殊效果 for i,v in DataSheetManager.SkinSpecialData:GetEnumerator() do if not private.AppearanceSpecialEffects[v.HeroSkinID] then private.AppearanceSpecialEffects[v.HeroSkinID] = {v.ID} else table.insert(private.AppearanceSpecialEffects[v.HeroSkinID], v.ID) end end end function private.SortAppearanceList(type, id) if type == Appearance_Model.AppearanceType.Hero then local list = private.HeroAppearanceList[id] if list then table.sort(list, SortFunction) end elseif type == Appearance_Model.AppearanceType.Weapon then local list = private.WeaponAppearanceList[id] if list then table.sort(list, SortWeaponFunction) end end end function private.SortAppearanceListOnInit() for k,v in pairs(private.HeroAppearanceList) do table.sort(v, SortFunction) end for k,v in pairs(private.WeaponAppearanceList) do table.sort(v, SortWeaponFunction) end end --region ***************** 外界获取数据接口 *********************** -- 指定武将是否有时装 function Appearance_Model.GetHasAppearanceByHeroID(heroID, appearanceType) local list = Appearance_Model.GetAppearanceListByType(appearanceType) return list[heroID] or false end function Appearance_Model.GetAppearanceDataByHeroID(heroID, appearanceType) local list = Appearance_Model.GetAppearanceListByType(appearanceType) return list[heroID] end function Appearance_Model.GetAppearanceSpecialEffects(appearanceCfgId) return private.AppearanceSpecialEffects[appearanceCfgId] end --是否激活了特殊效果 function Appearance_Model.IsHasActiveSpecialEffect(heroID, appearanceCfgId, specialEffectId) if not private.HeroAppearanceList[heroID] then return false end for _, appearanceData in ipairs(private.HeroAppearanceList[heroID]) do if appearanceData.appearanceID == appearanceCfgId then if not appearanceData.specialEffectData then return false end return appearanceData.specialEffectData[specialEffectId] ~= nil end end return false end --特殊效果是否开启,激活不一定开启 function Appearance_Model.IsHasOpenSpecialEffect(heroID, appearanceCfgId, specialEffectId) if not private.HeroAppearanceList[heroID] then return false end for _, appearanceData in ipairs(private.HeroAppearanceList[heroID]) do if appearanceData.appearanceID == appearanceCfgId then if not appearanceData.specialEffectData then return false end return appearanceData.specialEffectData[specialEffectId] end end return false end function Appearance_Model.GetAppearanceLevel(heroID, appearanceID, appearanceType) local data = Appearance_Model.GetAppearanceDataByHeroID_AppearanceID(heroID, appearanceID, appearanceType) if data then return data.appearanceLevel end return 0 end function Appearance_Model.GetAppearanceDataByHeroID_AppearanceID(heroID, appearanceID, appearanceType) local appearanceDataList = Appearance_Model.GetAppearanceDataByHeroID(heroID, appearanceType) if appearanceDataList then if appearanceID == 0 then -- 跟服务器约定,0是原始皮肤 return appearanceDataList[1] else for _, appearanceData in ipairs(appearanceDataList) do if appearanceData.appearanceID == appearanceID then return appearanceData end end end end return nil end function Appearance_Model.GetAppearanceListByType(appearanceType) if appearanceType == Appearance_Model.AppearanceType.Hero then return private.HeroAppearanceList elseif appearanceType == Appearance_Model.AppearanceType.Weapon then return private.WeaponAppearanceList end end -- 通过itemId获取外观id(武将、神兵) function Appearance_Model.GetAppearanceCfgIdByItemId(itemId) return private.AppearanceItemIdToCfgIds[itemId] end --endregion ***************** 外界获取数据接口 *********************** --region ************* 协议 ******************* function Appearance_Model.SyncRefreshAppearanceList(appearanceList, isInit) for k,v in ipairs(appearanceList.heroAppearances) do for heroID, appearanceDataList in pairs(private.HeroAppearanceList) do for _, appearanceData in ipairs(appearanceDataList) do if appearanceData.appearanceID == v.id then appearanceData.appearanceLevel = v.level appearanceData.isActive = true if v.specialEffect then for __, specialEffectInfo in ipairs(v.specialEffect) do if not appearanceData.specialEffectData then appearanceData.specialEffectData = {} end appearanceData.specialEffectData[specialEffectInfo.id] = specialEffectInfo.isOpen end end if isInit ~= true then private.SortAppearanceList(Appearance_Model.AppearanceType.Hero, heroID) end break end end end end for k,v in ipairs(appearanceList.weaponAppearances) do for heroID, appearanceDataList in pairs(private.WeaponAppearanceList) do for _, appearanceData in ipairs(appearanceDataList) do if appearanceData.appearanceID == v.id then appearanceData.appearanceLevel = v.level appearanceData.isActive = true if isInit ~= true then private.SortAppearanceList(Appearance_Model.AppearanceType.Weapon, heroID) end break end end end end if isInit then --初始化需要全量排序,增量变化只需要对变化的时装排序即可 private.SortAppearanceListOnInit() end end ---@public 激活 function Appearance_Model.ActiveAppearanceRequest(appearanceID, appearanceType) private.AppearanceReq(appearanceType, Appearance_Model.OptType.Active, appearanceID, 0, 0) end ---@public 升级 function Appearance_Model.AppearanceLevelUpRequest(appearanceID, appearanceType) private.AppearanceReq(appearanceType, Appearance_Model.OptType.LevelUp, appearanceID, 0, 0) end ---@public 穿戴 function Appearance_Model.WearAppearanceRequest(appearanceID, heroID, appearanceType) private.AppearanceReq(appearanceType, Appearance_Model.OptType.Wear, appearanceID, heroID, 0) end --激活外观特殊效果 function Appearance_Model.ActiveAppearanceSpecialEffectRequest(appearanceID, heroID, appearanceType, specialEffectId) private.AppearanceReq(appearanceType, Appearance_Model.OptType.SpecialEffectActive, appearanceID, heroID, specialEffectId) end --特殊效果开启宝宝跟随 function Appearance_Model.OpenAppearanceSpecialEffectRequest(appearanceID, heroID, appearanceType, specialEffectId) private.AppearanceReq(appearanceType, Appearance_Model.OptType.SpecialEffectOpen, appearanceID, heroID, specialEffectId) end --appearanceTyp 时装类型 --optTyp 操作类型 --id 时装id --optId 对应类型id 武将id 神兵id 坐骑id function private.AppearanceReq(appearanceTyp, optTyp, id, optId, specialEffectId) local msg = appearance_pb.AppearanceReq() msg.id = id msg.heroId = optId msg.appearanceTyp = appearanceTyp msg.optTyp = optTyp msg.specialEffectId = specialEffectId curReqId = id NetManager.SendMessage(MessageEnums.MessageAppearance, msg) end function private.AppearanceResp(msgResp) if msgResp.Resp.Code == 0 then EventSystem.Dispatch(EventID.UI_Appearance_Refresh, msgResp.optTyp, curReqId) if msgResp.optTyp == Appearance_Model.OptType.Active then CTL.Sound.PlayGameSound("UI_jeweled_03") CTL.Tips.AddTipsMsg(Const_IDS.IDS_MagicWeapon_SmallActivation) elseif msgResp.optTyp == Appearance_Model.OptType.Wear then if msgResp.appearanceTyp == Appearance_Model.AppearanceType.Hero then EventSystem.Dispatch(EventID.UI_Appearance_ChangePreviewAppearance, curReqId) EventSystem.Dispatch(EventID.UI_HeroShow_PlayLevelUpEffect) else CTL.Sound.PlayGameSound("UI_equipment_01") CTL.Tips.AddTipsMsg(Const_IDS.IDS_Appearance_ChuanDaiChengGong) end elseif msgResp.optTyp == Appearance_Model.OptType.LevelUp then CTL.Tips.AddTipsMsg(Const_IDS.IDS_Appearance_ShengJiChengGong) end end end --endregion ************* 协议 ******************* return Appearance_Model