yyl
2025-10-28 cf4c463b222d57486671191652a6bf06a49349c0
Main/System/Battle/Buff/BattleObjectBuffMgr.cs
@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using LitJson;
using Spine.Unity;
using UnityEngine;
@@ -10,20 +11,37 @@
    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()
@@ -70,8 +88,7 @@
        buffEffectDict.Clear();
        buffDataDict.Clear();
        battleObject.heroInfoBar.RefreshBuff(buffDataDict.Values.ToList());
        onBuffChanged?.Invoke();
        OnBuffChanged();
    }
    //  删除buff
@@ -79,38 +96,63 @@
    {
        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
@@ -146,6 +188,10 @@
        {
            BuffMountAction buffMountAction = new BuffMountAction(battleObject.battleField, new List<HB428_tagSCBuffRefresh>() { vNetData }, () =>
            {
                if (battleObject.IsDead())
                {
                    return;
                }
                if (null != skillConfig && skillConfig.BuffEffect > 0)
                {
                    //  已经存在相同的buff特效
@@ -166,8 +212,13 @@
                        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)
            {
@@ -181,10 +232,91 @@
        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()
    {