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