From 2dd1841d03a730d3d369092c2a3ad656cee4bf64 Mon Sep 17 00:00:00 2001
From: lcy <1459594991@qq.com>
Date: 星期四, 07 五月 2026 15:11:38 +0800
Subject: [PATCH] 512 跨服演武场

---
 Main/System/Battle/Skill/SkillBase.cs | 1109 +++++++++++++--------------------------------------------
 1 files changed, 260 insertions(+), 849 deletions(-)

diff --git a/Main/System/Battle/Skill/SkillBase.cs b/Main/System/Battle/Skill/SkillBase.cs
index 22c3082..3f64d78 100644
--- a/Main/System/Battle/Skill/SkillBase.cs
+++ b/Main/System/Battle/Skill/SkillBase.cs
@@ -1,12 +1,22 @@
-using System.Collections.Generic;
+锘縰sing System.Collections.Generic;
 using UnityEngine;
 using DG.Tweening;
 using Spine;
 using System.Linq;
 using System;
 
-public class SkillBase
+// SkillBase锛氭妧鑳借繍琛屾椂鍩虹被銆�
+// 鏈被浣跨敤 partial 鎷嗗垎涓哄涓枃浠讹紝鎸夎亴璐e垎缁勶細
+//   SkillBase.cs             瀛楁銆佹瀯閫犮�佸叕鍏卞叆鍙o紙Cast/Run/OnSkillStart/鍚� Frame 鍥炶皟 绛夛級
+//   SkillBase.Cast.cs        鏂芥硶闃舵锛氱Щ鍔ㄣ�佸姩鐢汇�佹畫褰便�侀珮浜�佹敾鍑诲洖鍚堢粨鏉�
+//   SkillBase.Hit.cs         鍛戒腑闃舵锛歄nHit 鍒嗗彂鍒颁富鐩爣 / 婧呭皠鐩爣 / 鍛戒腑鎻愮ず
+//   SkillBase.SubSkill.cs    鍓嶇疆鍐呭祵瀛愭妧鑳界殑鏀堕泦涓庢姇閫�
+//   SkillBase.Death.cs       姝讳骸鍖呬笌鎺夎惤/缁忛獙鍒嗛厤
+//   SkillBase.Buff.cs        Buff 鍖咃紙HB428/HB429锛夌殑鏀堕泦涓庡垎鍙�
+//   SkillBase.Finish.cs      瀹屾垚鍒ゅ畾涓庡己鍒剁粨鏉�
+public partial class SkillBase
 {
+    // ===== 甯搁噺 =====
     const float moveTime = 0.5f;
 
     private static readonly Color colorGreen = new Color(33f / 255f,
@@ -16,41 +26,252 @@
                                                         87f / 255f,
                                                         189f / 255f);
 
-    protected SkillEffect skillEffect;
-    protected HB427_tagSCUseSkill tagUseSkillAttack;
+    // ===== 鏍稿績寮曠敤 =====
+    public HB427_tagSCUseSkill tagUseSkillAttack;
     public SkillConfig skillConfig;
-    protected bool isFinished = false;
+    public SkillSkinConfig skillSkinConfig;
+    public BattleObject caster = null; // 鏂芥硶鑰�
     protected BattleField battleField = null; // 鎴樺満
     protected RectTransform targetNode = null; // 鐩爣鑺傜偣
-    protected BattleObject caster = null; // 鏂芥硶鑰�
     protected List<GameNetPackBasic> packList;
-    protected List<SkillRecordAction> otherSkillActionList = new List<SkillRecordAction>();
+
+    // ===== 鍛戒腑鏁堟灉 =====
+    protected SkillEffect skillEffect;
+
+    // ===== 瀛愭妧鑳�/瀛愬姩浣滅瓑寰呭垪琛� =====
+    protected List<RecordAction> currentWaitingSkill = new List<RecordAction>();
+
+    // ===== 姝讳骸鐩稿叧涓存椂鏁版嵁 =====
     protected List<H0704_tagRolePackRefresh> dropPackList = new List<H0704_tagRolePackRefresh>();
     protected List<HB405_tagMCAddExp> expPackList = new List<HB405_tagMCAddExp>();
-    protected bool moveFinished = false;
-    public int fromSkillId;
-    public bool isPlay = false;
+    private Dictionary<int, BattleDrops> tempDropList = new Dictionary<int, BattleDrops>();
+    private Dictionary<int, BattleDeadPack> tempDeadPackList = new Dictionary<int, BattleDeadPack>();
 
+    // ===== Buff 鐩稿叧鍖呴泦鍚堬紝鏀寔 HB428(鍒锋柊) 鍜� HB429(鍒犻櫎) =====
+    protected List<GameNetPackBasic> buffPackCollections = new List<GameNetPackBasic>();
+
+    // ===== 鐢熷懡鍛ㄦ湡鐘舵�侊紙4 涓苟琛岄噷绋嬬浣嶏紝鍚堝苟鍒板悓涓� Flags 瀛楁锛� =====
+    //   Started        : 宸茶繘鍏ユ柦娉曢樁娈碉紙OnSkillStart 璋冪敤鍚庯級
+    //   MoveCompleted  : 浣嶇Щ宸叉敹灏撅紙OnAllAttackMoveFinished锛�
+    //   MotionCompleted: 鎶�鑳藉姩鐢诲凡鎾斁瀹岋紙OnFinalFrameEnd锛�
+    //   Finished       : 鍖呭垪琛ㄥ凡澶勭悊瀹岋紙OnSkillFinished / ForceFinished 缁撳熬锛�
+    //   4 涓噷绋嬬鐩镐簰鐙珛锛岄潪绾挎�ч樁娈碉紝涓嶈兘鐢ㄥ崟涓� state 琛ㄨ揪銆�
+    [System.Flags]
+    protected enum SkillStateFlags
+    {
+        None            = 0,
+        Started         = 1 << 0,
+        MoveCompleted   = 1 << 1,
+        MotionCompleted = 1 << 2,
+        Finished        = 1 << 3,
+    }
+
+    private SkillStateFlags _stateFlags = SkillStateFlags.None;
+
+    /// <summary>褰撳墠鎶�鑳界姸鎬佷綅锛堝彧璇伙紝璋冭瘯鐢級銆�</summary>
+    protected SkillStateFlags StateFlags => _stateFlags;
+
+#if UNITY_EDITOR
+    /// <summary>渚涘閮ㄨ皟璇�/璇婃柇鎵撳嵃鐢紝闈炵紪杈戝櫒涓嬩笉缂栬瘧銆�</summary>
+    public string StateFlagsForDebug => _stateFlags.ToString();
+#endif
+
+    /// <summary>鏄惁宸茶繘鍏ユ柦娉曢樁娈碉紙OnSkillStart 璋冪敤鍚庝负 true锛夈��</summary>
+    public bool isPlay
+    {
+        get => (_stateFlags & SkillStateFlags.Started) != 0;
+        set => SetFlag(SkillStateFlags.Started, value);
+    }
+
+    /// <summary>鍖呭垪琛ㄦ槸鍚﹀凡鍏ㄩ儴澶勭悊瀹屻��</summary>
+    protected bool isFinished
+    {
+        get => (_stateFlags & SkillStateFlags.Finished) != 0;
+        set => SetFlag(SkillStateFlags.Finished, value);
+    }
+
+    /// <summary>浣嶇Щ鏄惁宸叉敹灏俱��</summary>
+    protected bool moveFinished
+    {
+        get => (_stateFlags & SkillStateFlags.MoveCompleted) != 0;
+        set => SetFlag(SkillStateFlags.MoveCompleted, value);
+    }
+
+    /// <summary>鎶�鑳藉姩鐢绘槸鍚﹀凡鎾斁瀹屻��</summary>
+    protected bool isMotionCompleted
+    {
+        get => (_stateFlags & SkillStateFlags.MotionCompleted) != 0;
+        set => SetFlag(SkillStateFlags.MotionCompleted, value);
+    }
+
+    private void SetFlag(SkillStateFlags flag, bool value)
+    {
+#if UNITY_EDITOR
+        //  璁板綍鐘舵�佸彉鏇达細鍗℃/鍗℃椿鐨勬帓鏌ュ埄鍣ㄣ��
+        //  缂栬緫鍣ㄤ笅鍙湪鍊肩湡姝e彂鐢熸敼鍙樻椂鎵撳嵃锛岄伩鍏嶅埛灞忋��
+        bool oldValue = (_stateFlags & flag) != 0;
+        if (oldValue != value)
+        {
+            int skillId = skillConfig != null ? skillConfig.SkillID : 0;
+            ulong casterId = tagUseSkillAttack != null ? tagUseSkillAttack.ObjID : 0UL;
+            BattleDebug.LogError(
+                $"SkillBase.StateFlags 鍙樻洿:skillId={skillId} caster={casterId} " +
+                $"{flag}: {oldValue} -> {value}  (before={_stateFlags})");
+        }
+#endif
+
+        if (value) _stateFlags |= flag;
+        else       _stateFlags &= ~flag;
+    }
+
+    // ===== 鐖跺瓙鍏崇郴 =====
+    public SkillBase fromSkill;
+    //  鐖禦ecordAction锛圫killRecordAction锛夛紝鐢ㄤ簬瀛愭妧鑳藉缓绔嬬埗瀛愬叧绯�
+    protected SkillRecordAction ownRecordAction;
+
+    // ===== 绉诲姩閫熷害锛堟畫褰卞姞閫熸椂浼氭敼鍙橈級 =====
     private float MoveSpeed = 750f;
 
-    private Dictionary<int, BattleDrops> tempDropList = new Dictionary<int, BattleDrops>();
-    private Dictionary<int, HB422_tagMCTurnFightObjDead> tempDeadPackList = new Dictionary<int, HB422_tagMCTurnFightObjDead>();
-
-    protected List<HB428_tagSCBuffRefresh> buffCollections = new List<HB428_tagSCBuffRefresh>();
-
+#if UNITY_EDITOR
+    public static Dictionary<string, string> changeListDict = new Dictionary<string, string>();
+#endif
 
     // 鏋勯�犲嚱鏁帮細鍒濆鍖栨妧鑳藉熀纭�鏁版嵁
     public SkillBase(BattleObject _caster, SkillConfig _skillCfg, HB427_tagSCUseSkill vNetData, List<GameNetPackBasic> _packList, BattleField _battleField = null)
     {
         caster = _caster;
-        if (null == caster)
-        {
-            throw new Exception("SkillBase caster is null ");
-        }
         skillConfig = _skillCfg;
         tagUseSkillAttack = vNetData;
         battleField = _battleField;
         packList = _packList;
+
+        if (_caster is HeroBattleObject heroBattleObject)
+        {
+            skillSkinConfig = skillConfig.GetSkillSkinConfig(heroBattleObject.teamHero.SkinID);
+
+            if (null == skillSkinConfig)
+            {
+                Debug.LogError("鎵句笉鍒版妧鑳界毊鑲よ〃 " + "skillId: " + skillConfig.SkillID + " skinId: " + heroBattleObject.teamHero.SkinID);
+            }
+        }
+        else
+        {
+            skillSkinConfig = skillConfig.GetOriginSkinConfig();
+        }
+
+
+        // 娉ㄥ唽姝e湪閲婃斁鐨勬妧鑳�
+        if (battleField != null && caster != null)
+        {
+            battleField.AddCastingSkill(caster.ObjID, this);
+        }
+
+        SafetyCheck();
+    }
+
+    public virtual void AfterAddToQueue()
+    {
+
+    }
+
+    //  璁剧疆鐖禦ecordAction
+    public void SetOwnRecordAction(SkillRecordAction recordAction)
+    {
+        ownRecordAction = recordAction;
+    }
+
+    private void PinrtHB427Hp()
+    {
+#if UNITY_EDITOR
+        string skillDetail = "SkillCaster : " + tagUseSkillAttack.ObjID + " -> cast SkillID: " + skillConfig.SkillID + "\n";
+
+        skillDetail += "------------------ HurtList ------------------\n";
+        for (int i = 0; i < tagUseSkillAttack.HurtCount; i++)
+        {
+            var Hurt = tagUseSkillAttack.HurtList[i];
+            BattleObject battleObject = caster.battleField.battleObjMgr.GetBattleObject((int)Hurt.ObjID);
+
+            string targetName = battleObject != null ? battleObject.GetName() : "Unknown";
+            long hurtHp = GeneralDefine.GetFactValue(Hurt.HurtHP, Hurt.HurtHPEx);
+            long curHp = GeneralDefine.GetFactValue(Hurt.CurHP, Hurt.CurHPEx);
+
+            skillDetail += $"  [{i}] Target: {targetName} (ObjID:{Hurt.ObjID})\n";
+            skillDetail += $"      HurtHP: {hurtHp}\n";
+            skillDetail += $"      CurHP: {curHp}\n";
+            skillDetail += $"      SuckHP: {Hurt.SuckHP}\n";
+            skillDetail += $"      BounceHP: {Hurt.BounceHP}\n";
+            skillDetail += $"      AttackTypes: {Hurt.AttackTypes}\n";
+
+            if (Hurt.HurtListEx != null && Hurt.HurtListEx.Length > 0)
+            {
+                skillDetail += $"      HurtListEx ({Hurt.HurtListEx.Length}):\n";
+                for (int j = 0; j < Hurt.HurtListEx.Length; j++)
+                {
+                    var hurtEx = Hurt.HurtListEx[j];
+                    long hurtExHp = GeneralDefine.GetFactValue(hurtEx.HurtHP, hurtEx.HurtHPEx);
+                    long curExHp = GeneralDefine.GetFactValue(hurtEx.CurHP, hurtEx.CurHPEx);
+
+                    skillDetail += $"        [{j}] ObjID:{hurtEx.ObjID} HurtHP:{hurtExHp} CurHP:{curExHp} SuckHP:{hurtEx.SuckHP} AttackTypes:{hurtEx.AttackTypes}\n";
+                }
+            }
+        }
+
+        skillDetail += "------------------ HurtListEx ------------------\n";
+        if (tagUseSkillAttack.HurtListEx != null)
+        {
+            for (int i = 0; i < tagUseSkillAttack.HurtListEx.Length; i++)
+            {
+                var HurtEx = tagUseSkillAttack.HurtListEx[i];
+                BattleObject battleObject = caster.battleField.battleObjMgr.GetBattleObject((int)HurtEx.ObjID);
+
+                string targetName = battleObject != null ? battleObject.GetName() : "Unknown";
+                long hurtHp = GeneralDefine.GetFactValue(HurtEx.HurtHP, HurtEx.HurtHPEx);
+                long curHp = GeneralDefine.GetFactValue(HurtEx.CurHP, HurtEx.CurHPEx);
+
+                skillDetail += $"  [{i}] Target: {targetName} (ObjID:{HurtEx.ObjID})\n";
+                skillDetail += $"      HurtHP: {hurtHp}\n";
+                skillDetail += $"      CurHP: {curHp}\n";
+                skillDetail += $"      SuckHP: {HurtEx.SuckHP}\n";
+                skillDetail += $"      AttackTypes: {HurtEx.AttackTypes}\n";
+            }
+        }
+
+        skillDetail += "------------------ END ------------------\n";
+
+        if (changeListDict.ContainsKey(caster.battleField.guid))
+        {
+            string origin = changeListDict[caster.battleField.guid];
+            origin += skillDetail;
+            changeListDict[caster.battleField.guid] = origin;
+
+        }
+        else
+            changeListDict.Add(caster.battleField.guid, skillDetail);
+
+        Debug.LogError("skillDetail : " + skillDetail);
+#endif
+    }
+
+    private void SafetyCheck()
+    {
+#if UNITY_EDITOR
+        if (Launch.Instance.isOpenSkillLogFile)
+        {
+            PinrtHB427Hp();
+        }
+#endif
+
+        bool safety = caster != null
+                        && skillConfig != null
+                        && tagUseSkillAttack != null
+                        && battleField != null;
+
+
+        if (!safety)
+        {
+            Debug.LogError("SkillBase SafetyCheck failed! Caster or SkillConfig or TagUseSkillAttack or BattleField is null, or Caster is dead.");
+            ForceFinished();
+        }
     }
 
     // 鎶�鑳借繍琛屼富閫昏緫锛氬鐞嗘妧鑳芥晥鏋滃拰鍏朵粬鎶�鑳藉姩浣�
@@ -69,287 +290,31 @@
             }
             return;
         }
-
-        if (otherSkillActionList.Count > 0)
-        {
-            for (int i = otherSkillActionList.Count - 1; i >= 0; i--)
-            {
-                var action = otherSkillActionList[i];
-                if (action.IsFinished())
-                {
-                    otherSkillActionList.RemoveAt(i);
-                    OnSkillFinished();
-                }
-                else if (moveFinished)
-                {
-                    action.Run();
-                }
-            }
-        }
-    }
-
-    protected void ShadowIllutionCreate(bool create)
-    {
-        if (create)
-        {
-            Color color = Color.white;
-            //1-杩炲嚮锛�2-鍙嶅嚮锛�3-杩藉嚮
-            //  鍙嶅嚮钃濊壊
-            //  杩藉嚮杩炲嚮缁胯壊
-            bool change = false;
-            if (tagUseSkillAttack.BattleType == 1)
-            {
-                color = colorGreen;
-                change = true;
-            }
-            else if (tagUseSkillAttack.BattleType == 2)
-            {
-                color = colorBlue;
-                change = true;
-            }
-            else if (tagUseSkillAttack.BattleType == 3)
-            {
-                color = colorGreen;
-                change = true;
-            }
-            
-            if (change)
-            {
-                MoveSpeed = 1125f;
-                caster.motionBase.ShowIllusionShadow(true, color);
-            }
-        }
-        else
-        {
-            MoveSpeed = 750f;
-            caster.motionBase.ShowIllusionShadow(false);
-        }
-    }
-
-    // 鎶�鑳介噴鏀句富閫昏緫锛氬箍鎾簨浠躲�侀珮浜洰鏍囥�佹墽琛岄噴鏀�
-    public virtual void Cast()
-    {
-        // 骞挎挱鎶�鑳介噴鏀句簨浠�
-        string guid = battleField.guid;
-        TeamHero teamHero = caster.teamHero;
-        EventBroadcast.Instance.Broadcast<string, SkillConfig, TeamHero>(EventName.BATTLE_CAST_SKILL, guid, skillConfig, teamHero);
-
-        if (caster != null)
-        {
-            // 鎴樻枟绫诲瀷 0-甯歌锛�1-杩炲嚮锛�2-鍙嶅嚮锛�3-杩藉嚮锛�4-瀛愭妧鑳斤紱5-琚姩瑙﹀彂鐨�
-            DamageNumConfig hintConfig = null;
-            if (tagUseSkillAttack.BattleType == 1)
-            {
-                hintConfig = DamageNumConfig.Get(BattleConst.BattleComboAttack);
-            }
-            else if (tagUseSkillAttack.BattleType == 2)
-            {
-                hintConfig = DamageNumConfig.Get(BattleConst.BattleCounterAttack);
-            }
-            else if (tagUseSkillAttack.BattleType == 3)
-            {
-                hintConfig = DamageNumConfig.Get(BattleConst.BattleChaseAttack);
-            }
-            
-            if (hintConfig != null)
-            {
-                caster.heroInfoBar.ShowTips(((char)hintConfig.prefix).ToString(), true, false, 1.25f);
-                // Debug.Break();
-            }
-        }
-
-        // 楂樹寒鎵�鏈夋湰娆℃妧鑳界浉鍏崇殑鐩爣
-        HighLightAllTargets();
-
-        // 鏍规嵁閲婃斁妯″紡鎵ц鐩稿簲閫昏緫
-        switch (skillConfig.castMode)
-        {
-            case SkillCastMode.None:
-            case SkillCastMode.Self:
-                CastImpl(OnAttackFinish);
-                break;
-            case SkillCastMode.Enemy:
-                CastToEnemy();
-                break;
-            case SkillCastMode.Target:
-                CastToTarget();
-                break;
-            case SkillCastMode.Allies:
-                CastToAllies();
-                break;
-            case SkillCastMode.DashCast:
-                DashCast(OnAttackFinish);
-                break;
-            default:
-                Debug.LogError("寮哄埗缁撴潫鎶�鑳� 鏆傛椂涓嶆敮鎸佸叾浠栫殑鏂瑰紡閲婃斁 鏈夐渶姹俻lease鑱旂郴绛栧垝 鎶�鑳絠d:" + skillConfig.SkillID + " cast position " + skillConfig.CastPosition);
-                ForceFinished();
-                break;
-        }
-    }
-
-    // 鍐叉挒鏀诲嚮妯″紡锛堝緟瀹炵幇锛�
-    protected void DashCast(Action _onComplete)
-    {
-        Debug.LogError("DashCast 杩樻病瀹炵幇");
-        ForceFinished();
-    }
-
-    // 瀵规晫鏂归噴鏀炬妧鑳斤細绉诲姩鍒版晫鏂瑰尯鍩熻繘琛屾敾鍑�
-    protected void CastToEnemy()
-    {
-        RectTransform target = battleField.GetTeamNode(caster.GetEnemyCamp(), skillConfig);
-        ExecuteMoveAndCastSequence(target, () =>
-        {
-            // ShadowIllutionCreate(true);
-            MoveToTarget(battleField.GetTeamNode(caster.Camp, caster.teamHero.positionNum), Vector2.zero, () =>
-            {
-                // ShadowIllutionCreate(false);
-                OnAttackFinish();
-            }, MoveSpeed);
-        });
-    }
-
-    // 瀵规寚瀹氱洰鏍囬噴鏀炬妧鑳斤細绉诲姩鍒颁富瑕佺洰鏍囦綅缃繘琛屾敾鍑�
-    protected void CastToTarget()
-    {
-        if (tagUseSkillAttack.HurtCount <= 0)
-        {
-            Debug.LogError("鎶�鑳芥敾鍑诲寘娌℃湁鐩爣 HurtCount <= 0");
-            OnSkillFinished();
-            return;
-        }
-
-        int mainTargetPosNum = BattleUtility.GetMainTargetPositionNum(caster, tagUseSkillAttack.HurtList.ToList(), skillConfig);
-        BattleCamp battleCamp = skillConfig.TagFriendly != 0 ? caster.Camp : caster.GetEnemyCamp();
-        RectTransform targetTrans = battleField.GetTeamNode(battleCamp, mainTargetPosNum);
-
-        ExecuteMoveAndCastSequence(targetTrans, () =>
-        {
-            RectTransform rectTransform = battleField.GetTeamNode(caster.Camp, caster.teamHero.positionNum);
-            // ShadowIllutionCreate(true);
-            MoveToTarget(rectTransform, Vector2.zero, () =>
-            {
-                // ShadowIllutionCreate(false);
-                OnAttackFinish();
-            }, MoveSpeed);
-        });
-    }
-
-    // 瀵瑰弸鏂归噴鏀炬妧鑳斤細绉诲姩鍒板弸鏂瑰尯鍩熻繘琛屾不鐤楁垨澧炵泭
-    protected void CastToAllies()
-    {
-        RectTransform target = battleField.GetTeamNode(caster.Camp, skillConfig);
-        ExecuteMoveAndCastSequence(target, () =>
-        {
-            // ShadowIllutionCreate(true);
-            MoveToTarget(battleField.GetTeamNode(caster.Camp, caster.teamHero.positionNum), Vector2.zero, () =>
-            {
-                // ShadowIllutionCreate(false);
-                OnAttackFinish();
-            }, MoveSpeed);
-        });
-    }
-
-    // 鎵ц绉诲姩-鏂芥硶-杩斿洖搴忓垪锛氶�氱敤鐨勭Щ鍔ㄦ敾鍑绘祦绋�
-    private void ExecuteMoveAndCastSequence(RectTransform target, Action onReturnComplete)
-    {
-        ShadowIllutionCreate(true);
-        MoveToTarget(target, new Vector2(skillConfig.CastDistance, 0), () =>
-        {
-            TurnBack(() =>
-            {
-                ShadowIllutionCreate(false);
-                CastImpl(() =>
-                {
-                    TurnBack(() => 
-                    {
-                        try
-                        {
-                            onReturnComplete?.Invoke(); // 娣诲姞寮傚父澶勭悊闃叉鍥炶皟寮傚父瀵艰嚧鐘舵�佷笉瀹屾暣
-                        }
-                        catch (Exception ex)
-                        {
-                            Debug.LogError($"ExecuteMoveAndCastSequence鍥炶皟寮傚父: {ex.Message}");
-                            throw;
-                        }
-                    }, -1f);
-                });
-            }, -1f);
-        });
-    }
-
-    // 绉诲姩鍒扮洰鏍囦綅缃細澶勭悊瑙掕壊鐨勭Щ鍔ㄥ姩鐢诲拰閫昏緫
-    protected void MoveToTarget(RectTransform target, Vector2 offset, Action _onComplete = null, float speed = 750f)
-    {
-        if (skillConfig.CastDistance >= 9999)
-        {
-            _onComplete?.Invoke();
-            return;
-        }
-
-        caster.motionBase.PlayAnimation(MotionName.run, true);
-        var tweener = BattleUtility.MoveToTarget(caster.heroRectTrans, target, offset, () =>
-        {
-            caster.motionBase.PlayAnimation(MotionName.idle, true);
-            _onComplete?.Invoke();
-        }, speed);
-        battleField.battleTweenMgr.OnPlayTween(tweener);
-    }
-
-    // 杞韩閫昏緫锛氭牴鎹妧鑳介厤缃鐞嗚鑹茶浆鍚�
-    protected void TurnBack(Action _onComplete, float forward)
-    {
-        if (skillConfig.CastDistance < 0)
-        {
-            Vector3 scale = caster.heroGo.transform.localScale;
-            scale.x = Mathf.Abs(scale.x) * forward;
-            caster.heroGo.transform.localScale = scale;
-        }
-        _onComplete?.Invoke();
-    }
-
-    // 鏀诲嚮瀹屾垚鍚庣殑澶勭悊锛氳浆韬�佹仮澶嶇姸鎬併�佹挱鏀惧緟鏈哄姩鐢�
-    protected void OnAttackFinish()
-    {
-        TurnBack(null, 1f);
-        OnAllAttackMoveFinished();
-        caster.motionBase.PlayAnimation(MotionName.idle, true);
-    }
-
-    // 鎵�鏈夋敾鍑荤Щ鍔ㄥ畬鎴愬悗鐨勫鐞嗭細鎭㈠UI鏄剧ず鐘舵��
-    protected virtual void OnAllAttackMoveFinished()
-    {
-        moveFinished = true;
-        List<BattleObject> allList = battleField.battleObjMgr.allBattleObjDict.Values.ToList<BattleObject>();
-        foreach (BattleObject bo in allList)
-        {
-            bo.layerMgr.SetFront();
-            bo.heroInfoBar.SetActive(true);
-        }
-        battleField.battleRootNode.skillMaskNode.SetActive(false);
-    }
-
-    // 鎵ц鎶�鑳介噴鏀惧姩鐢诲拰閫昏緫锛氭挱鏀炬柦娉曞姩浣滃苟鎻愪緵鍥炶皟
-    protected TrackEntry CastImpl(Action onComplete = null)
-    {
-        return caster.motionBase.PlaySkillAnimation(skillConfig, this, tagUseSkillAttack.BattleType == 4, onComplete);
     }
 
     // 鎶�鑳藉紑濮嬪洖璋冿細澶勭悊姝讳骸銆佸瓙鎶�鑳姐�佹妧鑳芥晥鏋滃垵濮嬪寲
     public void OnSkillStart()
     {
-        HandleDead();
-        
-        skillEffect = SkillEffectFactory.CreateSkillEffect(caster, skillConfig, tagUseSkillAttack);
-        skillEffect.Play(OnHitTargets);
-        foreach (var subSkillPack in tagUseSkillAttack.subSkillList)
+        if (isPlay)
         {
-            SkillRecordAction recordAction = CustomHB426CombinePack.CreateSkillAction(battleField.guid, new List<GameNetPackBasic>() { subSkillPack });
-            otherSkillActionList.Add(recordAction);
-            battleField.recordPlayer.ImmediatelyPlay(recordAction);
+            Debug.LogError(" play twice OnSkillStart skillId :" + skillConfig.SkillID);
+            return;
         }
+
+        //  鍏堟妸姝讳骸鍖呮敹闆嗕簡
+        HandleDead();
+
+        //  鍐嶅鐞� 鍐呭祵鎶�鑳�
+        ProcessSubSkill();
+
+        skillEffect = SkillEffectFactory.CreateSkillEffect(this, caster, skillConfig, skillSkinConfig, tagUseSkillAttack);
+        skillEffect.Play(OnHitTargets);
+
+
         isPlay = true;
     }
+
+    // ===== 鎶�鑳借妭鎷嶅洖璋� =====
 
     // 鎶�鑳藉墠鎽囩粨鏉熷洖璋�
     public virtual void OnStartSkillFrameEnd() { }
@@ -375,564 +340,10 @@
     // 鎶�鑳藉悗鎽囩粨鏉熷洖璋冿細閫氱煡鎶�鑳芥晥鏋滃鐞嗗悗鎽囩粨鏉�
     public virtual void OnFinalFrameEnd()
     {
-        
+        //  鏍囪鍔ㄧ敾鎾斁瀹屾垚
+        isMotionCompleted = true;
+        BattleDebug.LogError($"SkillBase.OnFinalFrameEnd: 鎶�鑳� {skillConfig?.SkillID} 鍔ㄧ敾鎾斁瀹屾垚");
+
         skillEffect?.OnFinalFrameEnd(); // 淇锛氭坊鍔犵┖鍊兼鏌�
-    }
-
-    // 楂樹寒鎵�鏈夌浉鍏崇洰鏍囷細璁剧疆鏂芥硶鑰呭拰鐩爣鐨勬樉绀哄眰绾�
-    protected void HighLightAllTargets()
-    {
-        caster.layerMgr.SetSortingOrder(BattleConst.ActiveHeroActionSortingOrder);
-
-        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>();
-        
-        // 淇锛氫娇鐢℉ashSet浼樺寲鎬ц兘锛岄伩鍏嶉噸澶嶈缃�
-        var targetSet = new HashSet<BattleObject>(targetList);
-        var highlightSet = new HashSet<BattleObject>(highlightList);
-        
-        caster.heroInfoBar.SetActive(false);
-
-        foreach (BattleObject bo in allList)
-        {
-            bool isHighlight = highlightSet.Contains(bo);
-            bool isTarget = targetSet.Contains(bo);
-            
-            if (isHighlight)
-            {
-                bo.layerMgr.SetFront();
-            }
-            else
-            {
-                bo.layerMgr.SetBack();
-            }
-
-            bo.heroInfoBar.SetActive(isTarget);
-        }
-
-        battleField.battleRootNode.skillMaskNode.SetActive(true);
-        // battleField.battleRootNode.SetSortingOrder();
-    }
-
-    // 鍛戒腑鐩爣鍥炶皟锛氬鐞嗘墍鏈夎鍛戒腑鐨勭洰鏍�
-    protected virtual void OnHitTargets(int _hitIndex, List<HB427_tagSCUseSkill.tagSCUseSkillHurt> hitList)
-    {
-        //  閫犳垚浼ゅ鍓嶅厛澶勭悊琛�閲忓埛鏂板寘
-        HandleRefreshHP();
-
-        foreach (var hurt in hitList)
-        {
-            BattleObject target = caster.battleField.battleObjMgr.GetBattleObject((int)hurt.ObjID);
-            if (target == null)
-            {
-                Debug.LogError("鐩爣涓虹┖ target == null ObjId : " + hurt.ObjID);
-                continue;
-            }
-
-            OnHitEachTarget(_hitIndex, target, hurt);
-        }
-    }
-
-    // 澶勭悊鍗曚釜鐩爣琚懡涓�:搴旂敤浼ゅ鍜屾柦娉曡�呮晥鏋�
-    protected virtual void OnHitEachTarget(int _hitIndex, BattleObject target, HB427_tagSCUseSkill.tagSCUseSkillHurt hurt)
-    {
-        // ============ 绗竴姝�:璁$畻浼ゅ鍒嗗竷 ============
-        List<int> damageDivide = new List<int>();
-        if (_hitIndex == 0 && skillConfig.DamageDivide.Length <= 0)
-        {
-            damageDivide.Add(10000);
-        }
-        else
-        {
-            if (skillConfig.DamageDivide.Length <= _hitIndex)
-            {
-                Debug.LogError("鎶�鑳戒激瀹冲垎甯冮厤缃敊璇� skillId: " + skillConfig.SkillID + " hitIndex: " + _hitIndex);
-                damageDivide.Add(10000);
-            }
-            else
-            {
-                damageDivide = skillConfig.DamageDivide[_hitIndex].ToList();
-            }
-        }
-
-        // 璁$畻鎬讳激瀹冲拰鍒嗘浼ゅ鍒楄〃
-        long totalDamage = GeneralDefine.GetFactValue(hurt.HurtHP, hurt.HurtHPEx);
-        List<long> damageList = BattleUtility.DivideDamageToList(skillConfig.DamageDivide, _hitIndex, totalDamage);
-
-        // ============ 绗簩姝�:鍒锋柊瀹為檯琛�閲� ============
-        long fromHp = target.teamHero.curHp;
-        
-
-
-        // ============澶勭悊鍚歌璺熷弽浼� ===============
-        //  涔熻鎸夋瘡涓�鍑诲钩鍧囩畻 鏈�鍚庤琛ラ綈浼ゅ
-        long suckHp = hurt.SuckHP;
-        long reflectHp = hurt.BounceHP;
-
-        List<long> suckHpList = BattleUtility.DivideDamageToList(skillConfig.DamageDivide, _hitIndex, suckHp);
-
-        List<long> reflectHpList = BattleUtility.DivideDamageToList(skillConfig.DamageDivide, _hitIndex, hurt.BounceHP);
-        // long currentSuckHp = suckHp / tagUseSkillAttack.HurtCount;
-
-        // 璁$畻褰撳墠杩欎竴鍑荤殑瀹為檯浼ゅ(鎵�鏈夊垎娈典激瀹充箣鍜�)
-        long currentHitDamage = 0;
-        foreach (long dmg in damageList)
-        {
-            currentHitDamage += dmg;
-        }
-
-        long currentHitSuckHp = 0;
-        foreach (long suck in suckHpList)
-        {
-            currentHitSuckHp += suck;
-        }
-
-        long currentHitReflectHp = 0;
-        foreach (long reflect in reflectHpList)
-        {
-            currentHitReflectHp += reflect;
-        }
-
-        long toHp = Math.Max(0, fromHp - currentHitDamage + currentHitSuckHp - currentHitReflectHp);
-
-
-        // 鏇存柊鐩爣琛�閲�
-        target.teamHero.curHp = toHp;
-
-#if UNITY_EDITOR
-        BattleDebug.LogError(
-            (caster.Camp == BattleCamp.Red ? "銆愮孩鏂硅鍔ㄣ��" : "銆愯摑鏂硅鍔ㄣ��") + "\n" +
-            $"鏀诲嚮鑰�: {caster.teamHero.name}\n" +
-            $"鐩爣: {target.teamHero.name}\n" +
-            $"鎶�鑳�: {skillConfig.SkillName} (绗瑊_hitIndex}鍑�)\n" +
-            $"浼ゅ: {currentHitDamage} (鎬讳激瀹�: {totalDamage})\n" +
-            $"鍚歌: {currentHitSuckHp}\n" +
-            $"鍙嶄激: {currentHitReflectHp}\n" +
-            $"琛�閲忓彉鍖�: {fromHp} -> {toHp}"
-        );
-#endif
-
-        
-        bool isLastHit = _hitIndex >= skillConfig.DamageDivide.Length - 1;
-
-        // ============ 绗笁姝�:鑾峰彇涓存椂鏁版嵁(鎺夎惤銆佹浜$瓑) ============
-        int objID = (int)target.ObjID;
-        tempDropList.TryGetValue(objID, out BattleDrops battleDrops);
-        tempDeadPackList.TryGetValue(objID, out HB422_tagMCTurnFightObjDead deadPack);
-
-
-        //  鍙傛暟鎵撳寘
-        BattleHurtParam hurtParam = new BattleHurtParam()
-        {
-            casterObj = caster,
-            hurtObj = target,
-            damageList = damageList,
-            suckHpList = suckHpList,
-            reflectHpList = reflectHpList,
-            fromHp = fromHp,
-            toHp = toHp,
-            battleDrops = battleDrops,
-            hurt = hurt,
-            hitIndex = _hitIndex,
-            deadPack = deadPack,
-            skillConfig = skillConfig
-        };
-
-        // ============ 绗洓姝�:鎵ц琛ㄧ幇(椋樺瓧銆佸姩鐢荤瓑) ============
-        target.Hurt(hurtParam);
-
-
-    }
-
-    // 澶勭悊HP鍒锋柊鍖咃紙绠�鍖栭�昏緫锛�
-    private void HandleRefreshHP()
-    {
-        // 鏌ユ壘HP鍒锋柊鍖�
-        HB419_tagSCObjHPRefresh refreshPack = BattleUtility.FindObjHPRefreshPack(packList);
-
-        if (refreshPack != null)
-        {
-            // 鍒嗗彂HP鍒锋柊鍖�
-            PackageRegedit.Distribute(refreshPack);
-            packList.Remove(refreshPack);
-        }
-    }
-
-    // 澶勭悊姝讳骸鐩稿叧閫昏緫锛氬垎閰嶆帀钀藉拰缁忛獙
-    protected void HandleDead()
-    {
-        var deadPackList = BattleUtility.FindDeadPack(packList);
-        if (deadPackList.Count <= 0) return;
-
-        CheckAfterDeadhPack();
-
-        // 淇锛氬厛鏀堕泦瑕佸垹闄ょ殑鍖咃紝閬垮厤鍦╢oreach涓慨鏀归泦鍚�
-        var dropPacksToRemove = new List<H0704_tagRolePackRefresh>(dropPackList);
-        foreach (var _dropPack in dropPacksToRemove)
-        {
-            PackageRegedit.Distribute(_dropPack);
-            packList.Remove(_dropPack);
-        }
-
-        // 鑾峰彇骞跺垎閰嶆帀钀界墿鍝佸拰缁忛獙
-        var dropPack = PackManager.Instance.GetSinglePack(PackType.DropItem);
-        var itemDict = dropPack.GetAllItems();
-        List<ItemModel> itemList = new List<ItemModel>(itemDict.Values.Where(item => item != null && item.isAuction));
-
-        var dropAssign = AssignDrops(itemList, deadPackList.Count);
-        var expAssign = AssignExp(expPackList, deadPackList.Count);
-
-        // 鏋勯�燘attleDrops骞剁紦瀛�
-        for (int i = 0; i < deadPackList.Count; i++)
-        {
-            int objID = (int)deadPackList[i].ObjID;
-            BattleObject deadTarget = battleField.battleObjMgr.GetBattleObject(objID);
-            
-            // 淇锛氭坊鍔犵┖鍊兼鏌�
-            if (deadTarget == null)
-            {
-                Debug.LogError($"鎵句笉鍒版浜$洰鏍囷紝ObjID: {objID}");
-                continue;
-            }
-            
-            List<int> itemIndexList = dropAssign[i].Select(item => item.gridIndex).ToList();
-            
-            BattleDrops battleDrops = new BattleDrops()
-            {
-                rectTransform = deadTarget.heroRectTrans,
-                dropItemPackIndex = itemIndexList,
-                expDrops = expAssign[i]
-            };
-
-            // 淇锛氶伩鍏嶅瓧鍏搁敭鍐茬獊锛屼娇鐢ㄥ畨鍏ㄧ殑娣诲姞鏂瑰紡
-            if (!tempDropList.ContainsKey(objID))
-            {
-                tempDropList.Add(objID, battleDrops);
-            }
-            else
-            {
-                Debug.LogWarning($"tempDropList涓凡瀛樺湪ObjID={objID}鐨勮褰曪紝灏嗚鐩栧師鍊�");
-                tempDropList[objID] = battleDrops; // 瑕嗙洊鐜版湁鍊�
-            }
-
-            if (!tempDeadPackList.ContainsKey(objID))
-            {
-                tempDeadPackList.Add(objID, deadPackList[i]);
-            }
-            else
-            {
-                Debug.LogWarning($"tempDeadPackList涓凡瀛樺湪ObjID={objID}鐨勮褰曪紝灏嗚鐩栧師鍊�");
-                tempDeadPackList[objID] = deadPackList[i]; // 瑕嗙洊鐜版湁鍊�
-            }
-        }
-
-        // 淇锛氶伩鍏嶅湪閬嶅巻鏃朵慨鏀归泦鍚堬紝鍏堟敹闆嗗悗鍒犻櫎
-        var deadPacksToRemove = new List<GameNetPackBasic>(deadPackList.Cast<GameNetPackBasic>());
-        foreach (var deadPack in deadPacksToRemove)
-        {
-            packList.Remove(deadPack);
-        }
-    }
-
-    // 鍒嗛厤鎺夎惤鐗╁搧锛氬皢鎺夎惤鐗╁搧骞冲潎鍒嗛厤缁欐浜″璞�
-    protected List<List<ItemModel>> AssignDrops(List<ItemModel> itemList, int deadCount)
-    {
-        var dropAssign = new List<List<ItemModel>>();
-        for (int i = 0; i < deadCount; i++)
-            dropAssign.Add(new List<ItemModel>());
-        for (int i = 0; i < itemList.Count; i++)
-            dropAssign[i % deadCount].Add(itemList[i]);
-        return dropAssign;
-    }
-
-    // 鍒嗛厤缁忛獙鍊硷細灏嗙粡楠屽寘骞冲潎鍒嗛厤缁欐瘡涓浜″璞�
-    protected List<List<HB405_tagMCAddExp>> AssignExp(List<HB405_tagMCAddExp> expList, int deadCount)
-    {
-        var expAssign = new List<List<HB405_tagMCAddExp>>();
-        for (int i = 0; i < deadCount; i++)
-            expAssign.Add(new List<HB405_tagMCAddExp>());
-
-        // 淇锛氭鏌ラ櫎闆堕闄�
-        if (deadCount == 0)
-        {
-            Debug.LogWarning("AssignExp: deadCount涓�0锛屾棤娉曞垎閰嶇粡楠�");
-            return expAssign;
-        }
-
-        // 淇锛氬厛鏀堕泦瑕佸垹闄ょ殑鍖咃紝閬垮厤鍦╢oreach涓慨鏀筽ackList
-        var expPacksToRemove = new List<HB405_tagMCAddExp>();
-
-        foreach (var expPack in expList)
-        {
-            long totalExp = GeneralDefine.GetFactValue(expPack.Exp, expPack.ExpPoint);
-            long avgExp = totalExp / deadCount;
-            long remain = totalExp % deadCount;
-
-            for (int i = 0; i < deadCount; i++)
-            {
-                long assignExp = avgExp + (i < remain ? 1 : 0);
-                var newPack = new HB405_tagMCAddExp
-                {
-                    Exp = (uint)(assignExp % Constants.ExpPointValue),
-                    ExpPoint = (uint)(assignExp / Constants.ExpPointValue),
-                    Source = expPack.Source
-                };
-                expAssign[i].Add(newPack);
-            }
-            expPacksToRemove.Add(expPack);
-        }
-        
-        // 缁熶竴鍒犻櫎鏀堕泦鐨勫寘
-        foreach (var pack in expPacksToRemove)
-        {
-            packList.Remove(pack);
-        }
-
-        return expAssign;
-    }
-
-    // 妫�鏌ユ浜″悗鐨勫寘澶勭悊锛氬鐞嗘妧鑳藉寘銆佹帀钀藉寘銆佺粡楠屽寘
-    protected void CheckAfterDeadhPack()
-    {
-        List<int> removeIndexList = new List<int>();
-        
-        for (int i = 0; i < packList.Count; i++)
-        {
-            var pack = packList[i];
-
-            // 澶嶆椿鍩烘湰閮介潬鎶�鑳藉寘
-            if (pack is CustomHB426CombinePack combinePack && combinePack.startTag.Tag.StartsWith("Skill_"))
-                break;
-                
-            if (pack is H0704_tagRolePackRefresh h0704Pack && h0704Pack.PackType == (byte)PackType.DropItem && h0704Pack.IsBind == 1)
-            {
-                dropPackList.Add(h0704Pack);
-                removeIndexList.Add(i);
-            }
-            
-            if (pack is HB405_tagMCAddExp h405Pack && h405Pack.Source == 2)
-            {
-                expPackList.Add(h405Pack);
-                removeIndexList.Add(i);
-            }
-        }
-
-        for (int i = removeIndexList.Count - 1; i >= 0; i--)
-            packList.RemoveAt(removeIndexList[i]);
-    }
-
-    // 妫�鏌ユ妧鑳芥槸鍚﹀畬鎴愶細缁煎悎妫�鏌ユ墍鏈夊畬鎴愭潯浠�
-    public virtual bool IsFinished()
-    {
-        if (!isPlay) return false;
-        
-
-        // 妫�鏌ユ妧鑳芥晥鏋滄槸鍚﹀畬鎴�
-        if (skillEffect != null)
-        {
-            if (!skillEffect.IsFinished()) return false;
-            skillEffect = null;
-            OnSkillFinished();
-            return false;
-        }
-
-        // 妫�鏌ュ叾浠栨妧鑳藉姩浣滄槸鍚﹀畬鎴�
-        if (otherSkillActionList.Count > 0)
-        {
-            for (int i = otherSkillActionList.Count - 1; i >= 0; i--)
-            {
-                var action = otherSkillActionList[i];
-                if (action.IsFinished())
-                {
-                    otherSkillActionList.RemoveAt(i);
-                    OnSkillFinished();
-                }
-            }
-            if (otherSkillActionList.Count > 0) return false;
-        }
-
-        // 妫�鏌ユ渶缁堝畬鎴愮姸鎬�
-        if (isFinished && moveFinished)
-        {
-            if (packList.Count > 0)
-            {
-                OnSkillFinished();
-                return false;
-            }
-
-            return true;
-        }
-
-        return false;
-    }
-
-
-    // 寮哄埗缁撴潫鎶�鑳斤細绔嬪嵆缁撴潫鎵�鏈夋妧鑳界浉鍏崇殑澶勭悊
-    public virtual void ForceFinished()
-    {
-        skillEffect?.ForceFinished();
-        
-        otherSkillActionList.ForEach(action => action.ForceFinish());
-        otherSkillActionList.Clear();
-
-        isFinished = true;
-        moveFinished = true;
-        isPlay = true;
-
-        // 澶勭悊鎵�鏈夊墿浣欏寘
-        while (packList.Count > 0)
-        {
-            var pack = packList[0];
-            packList.RemoveAt(0);
-
-            if (pack is CustomHB426CombinePack combinePack && combinePack.startTag.Tag.StartsWith("Skill_"))
-            {
-                var otherSkillAction = combinePack.CreateSkillAction();
-                otherSkillAction.fromSkillId = skillConfig.SkillID;
-                otherSkillAction.ForceFinish();
-            }
-            else
-            {
-                if (pack is CustomB421ActionPack actionPack)
-                    actionPack.Distribute();
-                PackageRegedit.Distribute(pack);
-            }
-        }
-    }
-
-    // 鎶�鑳藉畬鎴愬鐞嗭細姝e父瀹屾垚鏃剁殑娓呯悊宸ヤ綔
-    public void OnSkillFinished()
-    {
-        // 淇锛氫娇鐢ㄥ惊鐜唬鏇块�掑綊锛岄伩鍏嶆爤婧㈠嚭椋庨櫓
-        // try
-        // {
-        while (true)
-        {
-            // 楠岃瘉鎶�鑳芥晥鏋滄槸鍚﹀畬鎴�
-            if (skillEffect != null && !skillEffect.IsFinished())
-                return;
-
-            if (skillEffect != null)
-            {
-                skillEffect = null;
-                continue; // 浣跨敤continue浠f浛閫掑綊璋冪敤
-            }
-
-            // 楠岃瘉鍏朵粬鎶�鑳藉姩浣滄槸鍚﹀畬鎴�
-            if (otherSkillActionList.Count > 0)
-            {
-                bool hasFinishedAction = false;
-                for (int i = otherSkillActionList.Count - 1; i >= 0; i--)
-                {
-                    var action = otherSkillActionList[i];
-                    if (action.IsFinished())
-                    {
-                        otherSkillActionList.RemoveAt(i);
-                        hasFinishedAction = true;
-                    }
-                }
-                if (hasFinishedAction)
-                {
-                    continue; // 浣跨敤continue浠f浛閫掑綊璋冪敤
-                }
-                return;
-            }
-
-            break; // 娌℃湁鏇村闇�瑕佸鐞嗙殑锛岄��鍑哄惊鐜�
-        }
-
-        // 澶勭悊鍓╀綑鍖�
-        if (!ResolvePackList())
-        {
-            return;
-        }
-            // }
-            // catch (Exception ex)
-            // {
-            //     Debug.LogError($"OnSkillFinished寮傚父: {ex.Message}锛屾妧鑳絀D={skillConfig.SkillID}");
-            //     // 纭繚鐘舵�佷竴鑷存�э紝鍗充娇鍑虹幇寮傚父涔熻鏍囪瀹屾垚
-            //     isFinished = true;
-            //     throw; // 閲嶆柊鎶涘嚭寮傚父渚涗笂灞傚鐞�
-            // }
-
-        isFinished = true;
-    }
-    
-    protected virtual bool ResolvePackList()
-    {
-        while (packList.Count > 0)
-        {
-            var pack = packList[0];
-            packList.RemoveAt(0);
-
-            if (pack is CustomHB426CombinePack combinePack && combinePack.startTag.Tag.StartsWith("Skill_"))
-            {
-                BattleDebug.LogError("other skill casting " + combinePack.startTag.Tag);
-                var otherSkillAction = combinePack.CreateSkillAction();
-                otherSkillAction.fromSkillId = skillConfig.SkillID;
-                otherSkillActionList.Add(otherSkillAction);
-                return false;
-            }
-            else if (pack is HB428_tagSCBuffRefresh buffRefresh)
-            {
-                //	浠庢壘鍒扮涓�涓狧B428寮�濮� 鎵惧嚭杩炵画鐨凥B428_tagSCBuffRefresh鍖� 濡傛灉鎵惧埌涓�涓狟428鍚� 涔嬪悗纰板埌闈濰B428鍖呭氨鍋滄
-                buffCollections.Add(buffRefresh);
-                while (packList.Count > 0)
-                {
-                    var nextPack = packList[0];
-                    if (nextPack is HB428_tagSCBuffRefresh nextBuffRefresh)
-                    {
-                        buffCollections.Add(nextBuffRefresh);
-                        packList.RemoveAt(0);
-                    }
-                    else
-                    {
-                        break;
-                    }
-                }
-
-                // 鍚屾椂鍒锋柊鎵�鏈夊璞$殑buff锛屼笉鍒嗙粍
-                foreach (var buff in buffCollections)
-                {
-                    BattleObject battleObj = battleField.battleObjMgr.GetBattleObject((int)buff.ObjID);
-                    if (battleObj != null)
-                    {
-                        battleObj.buffMgr.RefreshBuff(buff, true);
-                    }
-                }
-
-                // 娓呯┖宸插鐞嗙殑buff闆嗗悎
-                buffCollections.Clear();
-                continue;
-            }
-
-            if (pack is CustomB421ActionPack actionPack)
-            {
-                actionPack.Distribute();
-            }
-            else
-            {
-                PackageRegedit.Distribute(pack);
-            }
-        }
-
-        return true;
-    }
-
-    // 娣诲姞娓呯悊鏂规硶锛氶槻姝㈠唴瀛樻硠婕�
-    public virtual void Cleanup()
-    {
-        tempDropList?.Clear();
-        tempDeadPackList?.Clear();
-        otherSkillActionList?.Clear();
-        dropPackList?.Clear();
-        expPackList?.Clear();
-        
-        skillEffect = null;
-        packList = null;
     }
 }
\ No newline at end of file

--
Gitblit v1.8.0