using System; 
 | 
using System.Collections.Generic; 
 | 
using System.Linq; 
 | 
using Spine.Unity; 
 | 
using UnityEngine; 
 | 
  
 | 
  
 | 
public class BattleObjectBuffMgr 
 | 
{ 
 | 
    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; 
 | 
  
 | 
    public void Init(BattleObject _battleObject) 
 | 
    { 
 | 
        battleObject = _battleObject; 
 | 
    } 
 | 
  
 | 
    public void Release() 
 | 
    { 
 | 
  
 | 
    } 
 | 
  
 | 
    public void Run() 
 | 
    { 
 | 
        List<int> removeEffectList = new List<int>(); 
 | 
        //  跟随BattleObject 
 | 
        foreach (var kv in buffEffectDict) 
 | 
        { 
 | 
            BattleEffectPlayer effectPlayer = kv.Value.Key; 
 | 
            if (null != effectPlayer) 
 | 
            { 
 | 
                if (effectPlayer.isBindBone) 
 | 
                { 
 | 
                    continue; 
 | 
                } 
 | 
                effectPlayer.transform.position = battleObject.heroRectTrans.position; 
 | 
                var effectPos = effectPlayer.effectConfig.effectPos; 
 | 
                if (null != effectPos && effectPos.Length >= 2) 
 | 
                { 
 | 
                    effectPlayer.rectTrans.anchoredPosition += new Vector2(effectPos[0], effectPos[1]); 
 | 
                } 
 | 
            } 
 | 
            else 
 | 
            { 
 | 
                removeEffectList.Add(kv.Key); 
 | 
            } 
 | 
        } 
 | 
         
 | 
        foreach (var effectId in removeEffectList) 
 | 
        { 
 | 
            buffEffectDict.Remove(effectId); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    public void RemoveAllBuff() 
 | 
    { 
 | 
        foreach (var kv in buffEffectDict) 
 | 
        { 
 | 
            KeyValuePair<BattleEffectPlayer, HashSet<uint>> pair = kv.Value; 
 | 
            battleObject.battleField.battleEffectMgr.RemoveEffect(kv.Key, pair.Key); 
 | 
        } 
 | 
  
 | 
        buffEffectDict.Clear(); 
 | 
        buffDataDict.Clear(); 
 | 
  
 | 
        battleObject.heroInfoBar.RefreshBuff(buffDataDict.Values.ToList()); 
 | 
    } 
 | 
  
 | 
    //  删除buff 
 | 
    public void RemoveBuff(HB429_tagSCBuffDel vNetData) 
 | 
    { 
 | 
        HB428_tagSCBuffRefresh buffData = null; 
 | 
  
 | 
        if (buffDataDict.TryGetValue(vNetData.BuffID, out buffData)) 
 | 
        { 
 | 
            buffDataDict.Remove(vNetData.BuffID); 
 | 
        } 
 | 
  
 | 
        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(vNetData.BuffID); 
 | 
  
 | 
                if (effectPair.Value.Count == 0) 
 | 
                { 
 | 
                    //  没有这个buff了 
 | 
                    battleObject.battleField.battleEffectMgr.RemoveEffect(skillConfig.BuffEffect, effectPair.Key); 
 | 
                    buffEffectDict.Remove(skillConfig.BuffEffect); 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
  
 | 
        //  不做表现 
 | 
        battleObject.heroInfoBar.RefreshBuff(buffDataDict.Values.ToList()); 
 | 
    } 
 | 
  
 | 
    //  刷新buff 
 | 
    public void RefreshBuff(HB428_tagSCBuffRefresh vNetData, bool insert = false) 
 | 
    { 
 | 
        SkillConfig skillConfig = SkillConfig.Get((int)vNetData.SkillID); 
 | 
  
 | 
        if (null == skillConfig) 
 | 
        { 
 | 
            Debug.LogError("buff对应的技能不存在,skillId : " + vNetData.SkillID); 
 | 
            return; 
 | 
        } 
 | 
  
 | 
        // bool isNew = false; 
 | 
        if (buffDataDict.ContainsKey(vNetData.BuffID)) 
 | 
        { 
 | 
            buffDataDict[vNetData.BuffID] = vNetData; 
 | 
        } 
 | 
        else 
 | 
        { 
 | 
            // isNew = true; 
 | 
            buffDataDict.Add(vNetData.BuffID, vNetData); 
 | 
        } 
 | 
  
 | 
        if (vNetData.IsAdd != 0) 
 | 
        { 
 | 
            BuffMountAction buffMountAction = new BuffMountAction(battleObject.battleField, new List<HB428_tagSCBuffRefresh>(){ vNetData}, () => 
 | 
            { 
 | 
                if (null != skillConfig && skillConfig.BuffEffect > 0) 
 | 
                { 
 | 
                    //  已经存在相同的buff特效 
 | 
                    if (buffEffectDict.TryGetValue(skillConfig.BuffEffect, out KeyValuePair<BattleEffectPlayer, HashSet<uint>> pair)) 
 | 
                    { 
 | 
                        pair.Value.Add(vNetData.BuffID); 
 | 
                    } 
 | 
                    else 
 | 
                    { 
 | 
                        BattleEffectPlayer effect = battleObject.battleField.battleEffectMgr.PlayEffect(battleObject, skillConfig.BuffEffect, battleObject.heroRectTrans, battleObject.Camp); 
 | 
  
 | 
                        BoneFollower boneFollower = effect.AddMissingComponent<BoneFollower>(); 
 | 
  
 | 
                        effect.BindBone(battleObject.motionBase.skeletonAnim, "hit"); 
 | 
                         
 | 
                        HashSet<uint> buffIdSet = new HashSet<uint>(); 
 | 
                        buffIdSet.Add(vNetData.BuffID); 
 | 
                        buffEffectDict.Add(skillConfig.BuffEffect, new KeyValuePair<BattleEffectPlayer, HashSet<uint>>(effect, buffIdSet)); 
 | 
                    } 
 | 
                } 
 | 
                battleObject.heroInfoBar.RefreshBuff(buffDataDict.Values.ToList()); 
 | 
            }); 
 | 
            if (insert) 
 | 
            { 
 | 
                battleObject.battleField.recordPlayer.ImmediatelyPlay(buffMountAction); 
 | 
            } 
 | 
            else 
 | 
            { 
 | 
                battleObject.battleField.recordPlayer.PlayRecord(buffMountAction); 
 | 
            } 
 | 
        } 
 | 
        else 
 | 
        { 
 | 
            //  已经存在的buff 刷新 
 | 
            battleObject.heroInfoBar.RefreshBuff(buffDataDict.Values.ToList()); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    public void InsertBuff(HB428_tagSCBuffRefresh vNetData) 
 | 
    { 
 | 
        RefreshBuff(vNetData, true); 
 | 
    } 
 | 
} 
 |