|  |  | 
 |  |  | using System; | 
 |  |  | using System.Collections.Generic; | 
 |  |  | using System.Linq; | 
 |  |  | using LitJson; | 
 |  |  | using Spine.Unity; | 
 |  |  | using UnityEngine; | 
 |  |  |  | 
 |  |  | 
 |  |  |  | 
 |  |  |     public Action onBuffChanged; | 
 |  |  |  | 
 |  |  |     public Action<int, bool> onIsControlChanged; | 
 |  |  |  | 
 |  |  |     private Dictionary<int/*EffectId*/, KeyValuePair<BattleEffectPlayer, HashSet<uint/*BuffID*/>>> buffEffectDict = new Dictionary<int, KeyValuePair<BattleEffectPlayer, HashSet<uint>>>(); | 
 |  |  |  | 
 |  |  |     private Dictionary<uint, HB428_tagSCBuffRefresh> buffDataDict = new Dictionary<uint, HB428_tagSCBuffRefresh>(); | 
 |  |  |  | 
 |  |  |     private BattleObject battleObject; | 
 |  |  |  | 
 |  |  |     private static Dictionary<string, List<int>> buffGroupStateDict = null; | 
 |  |  |  | 
 |  |  |     public Dictionary<int, bool> isControled = new Dictionary<int, bool>() | 
 |  |  |     { | 
 |  |  |         { BattleConst.HardControlGroup, false }, | 
 |  |  |         { BattleConst.SoftControlGroup, false }, | 
 |  |  |         { BattleConst.NormalAttackLimitGroup, false }, | 
 |  |  |         { BattleConst.RageAttackLimitGroup, false }, | 
 |  |  |         { BattleConst.PassiveSkillLimitGroup, false }, | 
 |  |  |     }; | 
 |  |  |  | 
 |  |  |     public void Init(BattleObject _battleObject) | 
 |  |  |     { | 
 |  |  |         battleObject = _battleObject; | 
 |  |  |         InitBuffGroupStateDict(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void Release() | 
 |  |  |     { | 
 |  |  |         onBuffChanged = null; | 
 |  |  |         buffGroupStateDict = null; | 
 |  |  |         RemoveAllBuff(); | 
 |  |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void Run() | 
 |  |  | 
 |  |  |         buffEffectDict.Clear(); | 
 |  |  |         buffDataDict.Clear(); | 
 |  |  |  | 
 |  |  |         battleObject.heroInfoBar.RefreshBuff(buffDataDict.Values.ToList()); | 
 |  |  |         onBuffChanged?.Invoke(); | 
 |  |  |         OnBuffChanged(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     //  删除buff | 
 |  |  | 
 |  |  |     { | 
 |  |  |         HB428_tagSCBuffRefresh buffData = null; | 
 |  |  |  | 
 |  |  |         bool isRemove = false; | 
 |  |  |  | 
 |  |  |         if (buffDataDict.TryGetValue(vNetData.BuffID, out buffData)) | 
 |  |  |         { | 
 |  |  |             isRemove = true; | 
 |  |  |             buffDataDict.Remove(vNetData.BuffID); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         if (buffData != null) | 
 |  |  |         if (!isRemove) | 
 |  |  |         { | 
 |  |  |             SkillConfig skillConfig = SkillConfig.Get((int)buffData.SkillID); | 
 |  |  |  | 
 |  |  |             if (null == skillConfig || skillConfig.BuffEffect <= 0) | 
 |  |  |             { | 
 |  |  |                 return; | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             KeyValuePair<BattleEffectPlayer, HashSet<uint>> effectPair; | 
 |  |  |  | 
 |  |  |             if (buffEffectDict.TryGetValue(skillConfig.BuffEffect, out effectPair)) | 
 |  |  |             { | 
 |  |  |                 effectPair.Value.Remove(vNetData.BuffID); | 
 |  |  |  | 
 |  |  |                 if (effectPair.Value.Count == 0) | 
 |  |  |                 { | 
 |  |  |                     //  没有这个buff了 | 
 |  |  |                     battleObject.battleField.battleEffectMgr.RemoveEffect(skillConfig.BuffEffect, effectPair.Key); | 
 |  |  |                     buffEffectDict.Remove(skillConfig.BuffEffect); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |             return; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         //  不做表现 | 
 |  |  |         battleObject.heroInfoBar.RefreshBuff(buffDataDict.Values.ToList()); | 
 |  |  |         onBuffChanged?.Invoke(); | 
 |  |  |         BuffUnmountAction buffRemoveAction = new BuffUnmountAction(battleObject.battleField, new List<HB429_tagSCBuffDel>() { vNetData }, () => | 
 |  |  |         { | 
 |  |  |             bool isRemoveEffect = false; | 
 |  |  |  | 
 |  |  |             int remainCnt = -1; | 
 |  |  |  | 
 |  |  |             if (buffData != null) | 
 |  |  |             { | 
 |  |  |                 SkillConfig skillConfig = SkillConfig.Get((int)buffData.SkillID); | 
 |  |  |  | 
 |  |  |                 if (null == skillConfig || skillConfig.BuffEffect <= 0) | 
 |  |  |                 { | 
 |  |  |                     return; | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 KeyValuePair<BattleEffectPlayer, HashSet<uint>> effectPair; | 
 |  |  |  | 
 |  |  |                 if (buffEffectDict.TryGetValue(skillConfig.BuffEffect, out effectPair)) | 
 |  |  |                 { | 
 |  |  |                     effectPair.Value.Remove(buffData.BuffID); | 
 |  |  |  | 
 |  |  |                     remainCnt = effectPair.Value.Count; | 
 |  |  |  | 
 |  |  |                     if (effectPair.Value.Count == 0) | 
 |  |  |                     { | 
 |  |  |                         //  没有这个buff了 | 
 |  |  |                         isRemoveEffect = true; | 
 |  |  |                         battleObject.battleField.battleEffectMgr.RemoveEffect(skillConfig.BuffEffect, effectPair.Key); | 
 |  |  |                         buffEffectDict.Remove(skillConfig.BuffEffect); | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 if (buffGroupStateDict[BattleConst.HardControlGroup.ToString()].Contains(skillConfig.BuffState)) | 
 |  |  |                 { | 
 |  |  |                     BattleDebug.LogError("[BattleObjectBuffMgr]移除对象 " + battleObject.ObjID + " 的buff id " + vNetData.BuffID + " BuffState is " + skillConfig.BuffState + " 是否删除了字典内的内容 " + isRemove.ToString() + " 是否删除了特效 " + isRemoveEffect.ToString() + " pack uid 是 " + vNetData.packUID); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             //  不做表现 | 
 |  |  |             OnBuffChanged(); | 
 |  |  |         }); | 
 |  |  |  | 
 |  |  |         battleObject.battleField.recordPlayer.PlayRecord(buffRemoveAction); | 
 |  |  |          | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     //  刷新buff | 
 |  |  | 
 |  |  |         { | 
 |  |  |             BuffMountAction buffMountAction = new BuffMountAction(battleObject.battleField, new List<HB428_tagSCBuffRefresh>() { vNetData }, () => | 
 |  |  |             { | 
 |  |  |                 if (battleObject.IsDead()) | 
 |  |  |                 { | 
 |  |  |                     return; | 
 |  |  |                 } | 
 |  |  |                 if (null != skillConfig && skillConfig.BuffEffect > 0) | 
 |  |  |                 { | 
 |  |  |                     //  已经存在相同的buff特效 | 
 |  |  | 
 |  |  |                         buffEffectDict.Add(skillConfig.BuffEffect, new KeyValuePair<BattleEffectPlayer, HashSet<uint>>(effect, buffIdSet)); | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |                 battleObject.heroInfoBar.RefreshBuff(buffDataDict.Values.ToList()); | 
 |  |  |                 onBuffChanged?.Invoke(); | 
 |  |  |  | 
 |  |  |                 if (buffGroupStateDict[BattleConst.HardControlGroup.ToString()].Contains(skillConfig.BuffState)) | 
 |  |  |                 { | 
 |  |  |                     BattleDebug.LogError("[BattleObjectBuffMgr]添加对象 " + battleObject.ObjID + " 的buff id " + vNetData.BuffID + " pack uid 是 " + vNetData.packUID + " BuffState is " + skillConfig.BuffState); | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 OnBuffChanged(); | 
 |  |  |             }); | 
 |  |  |             if (insert) | 
 |  |  |             { | 
 |  |  | 
 |  |  |         else | 
 |  |  |         { | 
 |  |  |             //  已经存在的buff 刷新 | 
 |  |  |             battleObject.heroInfoBar.RefreshBuff(buffDataDict.Values.ToList()); | 
 |  |  |             onBuffChanged?.Invoke(); | 
 |  |  |             OnBuffChanged(); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private void InitBuffGroupStateDict() | 
 |  |  |     { | 
 |  |  |         if (null == buffGroupStateDict) | 
 |  |  |         { | 
 |  |  |             FuncConfigConfig buffGroupStateConfig = FuncConfigConfig.Get("BuffStateGroup"); | 
 |  |  |             buffGroupStateDict = JsonMapper.ToObject<Dictionary<string, List<int>>>(buffGroupStateConfig.Numerical1); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private void OnBuffChanged() | 
 |  |  |     { | 
 |  |  |  | 
 |  |  |         UpdateControlState(); | 
 |  |  |  | 
 |  |  |         battleObject.heroInfoBar.RefreshBuff(buffDataDict.Values.ToList()); | 
 |  |  |         onBuffChanged?.Invoke(); | 
 |  |  |  | 
 |  |  |         // bool isUnderControl = false; | 
 |  |  |  | 
 |  |  |         // foreach (var kv in buffDataDict) | 
 |  |  |         // { | 
 |  |  |         //     HB428_tagSCBuffRefresh hB428_TagSCBuffRefresh = kv.Value; | 
 |  |  |         //     SkillConfig skillConfig = SkillConfig.Get((int)hB428_TagSCBuffRefresh.SkillID); | 
 |  |  |         //     if (null != skillConfig && skillConfig.IsControlBuff()) | 
 |  |  |         //     { | 
 |  |  |         //         isUnderControl = true; | 
 |  |  |         //         break; | 
 |  |  |         //     } | 
 |  |  |         // } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private void UpdateControlState() | 
 |  |  |     { | 
 |  |  |         UpdateControlState(BattleConst.HardControlGroup); | 
 |  |  |         UpdateControlState(BattleConst.SoftControlGroup); | 
 |  |  |         UpdateControlState(BattleConst.NormalAttackLimitGroup); | 
 |  |  |         UpdateControlState(BattleConst.RageAttackLimitGroup); | 
 |  |  |         UpdateControlState(BattleConst.PassiveSkillLimitGroup); | 
 |  |  |     } | 
 |  |  |      | 
 |  |  |     private void UpdateControlState(int groupType) | 
 |  |  |     { | 
 |  |  |         bool isChange = false; | 
 |  |  |         bool curState = isControled[groupType]; | 
 |  |  |         bool newState = IsUnderControl(groupType); | 
 |  |  |         isControled[groupType] = newState; | 
 |  |  |         isChange = curState != newState; | 
 |  |  |         if (isChange) | 
 |  |  |         { | 
 |  |  |             onIsControlChanged?.Invoke(groupType, newState); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private bool IsUnderControl(int groupType) | 
 |  |  |     { | 
 |  |  |  | 
 |  |  |         foreach (var kv in buffDataDict) | 
 |  |  |         { | 
 |  |  |             HB428_tagSCBuffRefresh hB428_TagSCBuffRefresh = kv.Value; | 
 |  |  |             SkillConfig skillConfig = SkillConfig.Get((int)hB428_TagSCBuffRefresh.SkillID); | 
 |  |  |  | 
 |  |  |             if (null != skillConfig) | 
 |  |  |             { | 
 |  |  |                 int buffState = skillConfig.BuffState; | 
 |  |  |                  | 
 |  |  |                 if (buffGroupStateDict != null && buffGroupStateDict.TryGetValue(groupType.ToString(), out List<int> buffGroupState)) | 
 |  |  |                 { | 
 |  |  |                     if (buffGroupState.Contains(buffState)) | 
 |  |  |                     { | 
 |  |  |                         if (groupType == 1) | 
 |  |  |                         { | 
 |  |  |                             Debug.LogError("对象 " + battleObject.ObjID + " 受到了 " + skillConfig.SkillID + " 的控制效果,BuffState:" + buffState + " buffGroup :" + groupType + " buff id is " + hB428_TagSCBuffRefresh.BuffID + "  ralate skill id is " + hB428_TagSCBuffRefresh.RelatedSkillID + " pack uid is " + hB428_TagSCBuffRefresh.packUID); | 
 |  |  |                         } | 
 |  |  |                         return true; | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         return false; | 
 |  |  |     } | 
 |  |  |      | 
 |  |  |     public List<HB428_tagSCBuffRefresh> GetBuffList() | 
 |  |  |     { |