From 4e6976f5b0a0515b4485604fc989927f90ccf2c9 Mon Sep 17 00:00:00 2001
From: yyl <yyl>
Date: 星期三, 26 十一月 2025 16:56:25 +0800
Subject: [PATCH] 125 战斗 1.战斗中技能高亮的问题 包含HurtEx的目标 支持HurtEx (溅射 平摊伤害类似的技能)

---
 Main/System/Battle/Skill/SkillBase.cs |  123 ++++++++++++++++++++++++++++++++++++++--
 1 files changed, 115 insertions(+), 8 deletions(-)

diff --git a/Main/System/Battle/Skill/SkillBase.cs b/Main/System/Battle/Skill/SkillBase.cs
index 7d425a9..c60313e 100644
--- a/Main/System/Battle/Skill/SkillBase.cs
+++ b/Main/System/Battle/Skill/SkillBase.cs
@@ -505,20 +505,57 @@
         if (skillConfig.FuncType != 2)
             return;
 
-        List<BattleObject> targetList = battleField.battleObjMgr.GetBattleObjList(tagUseSkillAttack);
-        List<BattleObject> highlightList = new List<BattleObject>(targetList) { caster };
-        List<BattleObject> allList = battleField.battleObjMgr.allBattleObjDict.Values.ToList<BattleObject>();
+        // 鏀堕泦鎵�鏈夌洰鏍囷紙鍖呭惈 HurtList銆佹瘡涓� Hurt 鐨� HurtListEx銆佷互鍙婇《灞� HurtListEx锛�
+        var targetSet = new HashSet<BattleObject>();
+        if (tagUseSkillAttack != null)
+        {
+            // 涓荤洰鏍囧垪琛�
+            if (tagUseSkillAttack.HurtList != null)
+            {
+                foreach (var hurt in tagUseSkillAttack.HurtList)
+                {
+                    var bo = battleField.battleObjMgr.GetBattleObject((int)hurt.ObjID);
+                    if (bo != null) targetSet.Add(bo);
 
-        // 淇锛氫娇鐢℉ashSet浼樺寲鎬ц兘锛岄伩鍏嶉噸澶嶈缃�
-        var targetSet = new HashSet<BattleObject>(targetList);
+                    // 涓荤洰鏍囩殑棰濆鐩爣锛堝脊灏�/骞虫憡锛�
+                    if (hurt.HurtListEx != null)
+                    {
+                        foreach (var hurtEx in hurt.HurtListEx)
+                        {
+                            var exBo = battleField.battleObjMgr.GetBattleObject((int)hurtEx.ObjID);
+                            if (exBo != null) targetSet.Add(exBo);
+                        }
+                    }
+                }
+            }
+
+            // 鎶�鑳藉寘椤跺眰鐨� HurtListEx锛堝婧呭皠銆侀《灞傚钩鎽婏級
+            if (tagUseSkillAttack.HurtListEx != null)
+            {
+                foreach (var hurtEx in tagUseSkillAttack.HurtListEx)
+                {
+                    var exBo = battleField.battleObjMgr.GetBattleObject((int)hurtEx.ObjID);
+                    if (exBo != null) targetSet.Add(exBo);
+                }
+            }
+        }
+
+        // 纭繚鏂芥硶鑰呬篃琚珮浜紙鍘熼�昏緫锛�
+        var highlightList = new List<BattleObject>(targetSet) { caster };
+
+        var allList = battleField.battleObjMgr.allBattleObjDict.Values.ToList();
+
+        // 鏋勯�犻泦鍚堜究浜庡垽鏂�
+        var targetSetLookup = new HashSet<BattleObject>(targetSet);
         var highlightSet = new HashSet<BattleObject>(highlightList);
 
+        // 鍏堟妸鏂芥硶鑰呯殑 InfoBar 闅愯棌锛堝師閫昏緫淇濈暀锛�
         caster.heroInfoBar.SetActive(false);
 
         foreach (BattleObject bo in allList)
         {
             bool isHighlight = highlightSet.Contains(bo);
-            bool isTarget = targetSet.Contains(bo);
+            bool isTarget = targetSetLookup.Contains(bo);
 
             if (isHighlight)
             {
@@ -529,16 +566,16 @@
                 bo.layerMgr.SetBack();
             }
 
+            // 鐩爣锛堝惈 HurtListEx锛夐兘搴旀樉绀� InfoBar
             bo.heroInfoBar.SetActive(isTarget);
         }
 
         battleField.battleRootNode.skillMaskNode.SetActive(true);
-        // battleField.battleRootNode.SetSortingOrder();
     }
 
     protected long suckHp = 0;
 
-    // 鍛戒腑鐩爣鍥炶皟锛氬鐞嗘墍鏈夎鍛戒腑鐨勭洰鏍�
+    // 鍛戒腑鐩爣鍥炶皟锛氬鐞嗘墍鏈夎鍛戒腑鐨勭洰鏍囷紙鍖呮嫭涓荤洰鏍囥�佸脊灏勭洰鏍囥�佹簠灏勭洰鏍囷級
     protected virtual void OnHitTargets(int _hitIndex, List<HB427_tagSCUseSkill.tagSCUseSkillHurt> hitList)
     {
         //  閫犳垚浼ゅ鍓嶅厛澶勭悊琛�閲忓埛鏂板寘
@@ -546,11 +583,13 @@
 
         suckHp = 0;
 
+        // 缁熻鍚歌鎬婚噺锛堜富鐩爣锛�
         foreach (var hurt in hitList)
         {
             suckHp += hurt.SuckHP;
         }
 
+        // 澶勭悊涓荤洰鏍囧垪琛�
         foreach (var hurt in hitList)
         { 
             BattleObject target = caster.battleField.battleObjMgr.GetBattleObject((int)hurt.ObjID);
@@ -561,6 +600,38 @@
             }
 
             OnHitEachTarget(_hitIndex, target, hurt);
+
+            // 澶勭悊璇ョ洰鏍囩殑棰濆鐩爣鍒楄〃锛堝寮瑰皠浼ゅ鐨勫钩鎽婄洰鏍囷級
+            if (hurt.HurtListEx != null && hurt.HurtListEx.Length > 0)
+            {
+                foreach (var hurtEx in hurt.HurtListEx)
+                {
+                    BattleObject exTarget = caster.battleField.battleObjMgr.GetBattleObject((int)hurtEx.ObjID);
+                    if (exTarget == null)
+                    {
+                        Debug.LogError($"棰濆鐩爣涓虹┖ HurtListEx target == null ObjId : {hurtEx.ObjID}");
+                        continue;
+                    }
+
+                    OnHitEachTargetEx(_hitIndex, exTarget, hurtEx);
+                }
+            }
+        }
+
+        // 澶勭悊鎶�鑳藉寘椤跺眰鐨勯澶栫洰鏍囧垪琛紙濡傛簠灏勪激瀹炽�佸钩鎽婁激瀹筹級
+        if (tagUseSkillAttack.HurtListEx != null && tagUseSkillAttack.HurtListEx.Length > 0)
+        {
+            foreach (var hurtEx in tagUseSkillAttack.HurtListEx)
+            {
+                BattleObject exTarget = caster.battleField.battleObjMgr.GetBattleObject((int)hurtEx.ObjID);
+                if (exTarget == null)
+                {
+                    Debug.LogError($"椤跺眰棰濆鐩爣涓虹┖ tagUseSkillAttack.HurtListEx target == null ObjId : {hurtEx.ObjID}");
+                    continue;
+                }
+
+                OnHitEachTargetEx(_hitIndex, exTarget, hurtEx);
+            }
         }
     }
 
@@ -586,6 +657,42 @@
         caster.OnHurtTarget(hurtParam);
     }
 
+    // 澶勭悊棰濆鐩爣琚懡涓紙HurtListEx锛夛細婧呭皠銆佸脊灏勩�佸钩鎽婁激瀹崇瓑
+    protected virtual void OnHitEachTargetEx(int _hitIndex, BattleObject target, HB427_tagSCUseSkill.tagSCUseSkillHurtEx hurtEx)
+    {
+        // ============ 鑾峰彇涓存椂鏁版嵁(鎺夎惤銆佹浜$瓑) ============
+        int objID = (int)target.ObjID;
+        tempDropList.TryGetValue(objID, out BattleDrops battleDrops);
+        tempDeadPackList.TryGetValue(objID, out HB422_tagMCTurnFightObjDead deadPack);
+
+        // ============ 鍙傛暟鎵撳寘锛堝皢 tagSCUseSkillHurtEx 杞崲涓� tagSCUseSkillHurt锛�============
+        HB427_tagSCUseSkill.tagSCUseSkillHurt hurt = new HB427_tagSCUseSkill.tagSCUseSkillHurt
+        {
+            ObjID = hurtEx.ObjID,
+            AttackTypes = hurtEx.AttackTypes,
+            HurtHP = hurtEx.HurtHP,
+            HurtHPEx = hurtEx.HurtHPEx,
+            CurHP = hurtEx.CurHP,
+            CurHPEx = hurtEx.CurHPEx,
+            SuckHP = hurtEx.SuckHP,
+            BounceHP = 0, // HurtEx 娌℃湁鍙嶄激瀛楁
+            HurtCountEx = 0,
+            HurtListEx = null
+        };
+
+        BattleHurtParam hurtParam = BattleUtility.CalcBattleHurtParam(this, _hitIndex, target, hurt, battleDrops, deadPack);
+
+#if UNITY_EDITOR
+        PrintHurtParamDebugInfo(hurtParam);
+#endif
+
+        // 鍏堣皟鐢ㄧ洰鏍囧彈浼�
+        target.Hurt(hurtParam);
+        
+        // 鍐嶈皟鐢ㄦ柦娉曡�呭惛琛�/鍙嶄激
+        caster.OnHurtTarget(hurtParam);
+    }
+
 #if UNITY_EDITOR
     private void PrintHurtParamDebugInfo(BattleHurtParam hurtParam)
     {

--
Gitblit v1.8.0