From cf4c463b222d57486671191652a6bf06a49349c0 Mon Sep 17 00:00:00 2001
From: yyl <yyl>
Date: 星期二, 28 十月 2025 18:54:51 +0800
Subject: [PATCH] 125 战斗  buff控制与解控的表现

---
 Main/System/Battle/Buff/BattleObjectBuffMgr.cs |  192 ++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 162 insertions(+), 30 deletions(-)

diff --git a/Main/System/Battle/Buff/BattleObjectBuffMgr.cs b/Main/System/Battle/Buff/BattleObjectBuffMgr.cs
index 24073a2..fc0871e 100644
--- a/Main/System/Battle/Buff/BattleObjectBuffMgr.cs
+++ b/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 + " 鐨刡uff 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)
                 {
                     //  宸茬粡瀛樺湪鐩稿悓鐨刡uff鐗规晥
@@ -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 + " 鐨刡uff id " + vNetData.BuffID + " pack uid 鏄� " + vNetData.packUID + " BuffState is " + skillConfig.BuffState);
+                }
+
+                OnBuffChanged();
             });
             if (insert)
             {
@@ -181,10 +232,91 @@
         else
         {
             //  宸茬粡瀛樺湪鐨刡uff 鍒锋柊
-            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()
     {

--
Gitblit v1.8.0