From b97ca7fc69d2cddeaf1af2d4e59ba4b413034784 Mon Sep 17 00:00:00 2001
From: lcy <1459594991@qq.com>
Date: 星期四, 12 三月 2026 16:51:46 +0800
Subject: [PATCH] 59 邮件系统-客户端  邮件标题支持参数匹配

---
 Main/System/Battle/Skill/SkillBase.cs |  631 ++++++++++++++++++++++++++++++++++++++++-----------------
 1 files changed, 443 insertions(+), 188 deletions(-)

diff --git a/Main/System/Battle/Skill/SkillBase.cs b/Main/System/Battle/Skill/SkillBase.cs
index ef7132f..3988cad 100644
--- a/Main/System/Battle/Skill/SkillBase.cs
+++ b/Main/System/Battle/Skill/SkillBase.cs
@@ -19,20 +19,28 @@
     protected SkillEffect skillEffect;
     public HB427_tagSCUseSkill tagUseSkillAttack;
     public SkillConfig skillConfig;
+
+    public SkillSkinConfig skillSkinConfig;
     protected bool isFinished = false;
     protected BattleField battleField = null; // 鎴樺満
     protected RectTransform targetNode = null; // 鐩爣鑺傜偣
     public BattleObject caster = null; // 鏂芥硶鑰�
     protected List<GameNetPackBasic> packList;
-    protected List<SkillRecordAction> otherSkillActionList = new List<SkillRecordAction>();
+
+    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 List<BattleDeadPack> endDeadPackList = new List<BattleDeadPack>();
 
     protected bool moveFinished = false;
     public SkillBase fromSkill;
     public bool isPlay = false;
+
+    //  鐖禦ecordAction锛圫killRecordAction锛夛紝鐢ㄤ簬瀛愭妧鑳藉缓绔嬬埗瀛愬叧绯�
+    protected SkillRecordAction ownRecordAction;
+    
+    //  鎶�鑳藉姩鐢绘槸鍚︽挱鏀惧畬鎴愶紙閽堝鏈夊姩鐢荤殑鎶�鑳斤級
+    protected bool isMotionCompleted = false;
 
     private float MoveSpeed = 750f;
 
@@ -52,6 +60,21 @@
         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)
         {
@@ -59,12 +82,17 @@
         }
 
         SafetyCheck();
-#if UNITY_EDITOR
-        if (Launch.Instance.isOpenSkillLogFile)
-        {
-            PinrtHB427Hp();
-        }
-#endif
+    }
+
+    public virtual void AfterAddToQueue()
+    {
+        
+    }
+
+    //  璁剧疆鐖禦ecordAction
+    public void SetOwnRecordAction(SkillRecordAction recordAction)
+    {
+        ownRecordAction = recordAction;
     }
 
 #if UNITY_EDITOR
@@ -81,7 +109,7 @@
             var Hurt = tagUseSkillAttack.HurtList[i];
             BattleObject battleObject = caster.battleField.battleObjMgr.GetBattleObject((int)Hurt.ObjID);
             
-            string targetName = battleObject != null ? battleObject.teamHero.name : "Unknown";
+            string targetName = battleObject != null ? battleObject.GetName() : "Unknown";
             long hurtHp = GeneralDefine.GetFactValue(Hurt.HurtHP, Hurt.HurtHPEx);
             long curHp = GeneralDefine.GetFactValue(Hurt.CurHP, Hurt.CurHPEx);
             
@@ -114,7 +142,7 @@
                 var HurtEx = tagUseSkillAttack.HurtListEx[i];
                 BattleObject battleObject = caster.battleField.battleObjMgr.GetBattleObject((int)HurtEx.ObjID);
                 
-                string targetName = battleObject != null ? battleObject.teamHero.name : "Unknown";
+                string targetName = battleObject != null ? battleObject.GetName() : "Unknown";
                 long hurtHp = GeneralDefine.GetFactValue(HurtEx.HurtHP, HurtEx.HurtHPEx);
                 long curHp = GeneralDefine.GetFactValue(HurtEx.CurHP, HurtEx.CurHPEx);
                 
@@ -144,6 +172,13 @@
 
     private void SafetyCheck()
     {
+#if UNITY_EDITOR
+        if (Launch.Instance.isOpenSkillLogFile)
+        {
+            PinrtHB427Hp();
+        }
+#endif
+
         bool safety = caster != null 
                         && skillConfig != null 
                         && tagUseSkillAttack != null 
@@ -176,22 +211,7 @@
             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)
@@ -222,13 +242,13 @@
             if (change)
             {
                 MoveSpeed = 1125f;
-                caster.motionBase.ShowIllusionShadow(true, color);
+                caster.ShowIllusionShadow(true, color);
             }
         }
         else
         {
             MoveSpeed = 750f;
-            caster.motionBase.ShowIllusionShadow(false);
+            caster.ShowIllusionShadow(false);
         }
     }
 
@@ -237,12 +257,18 @@
     {
         // 骞挎挱鎶�鑳介噴鏀句簨浠�
         string guid = battleField.guid;
-        TeamHero teamHero = caster.teamHero;
+        // 鑾峰彇閲婃斁鑰呮暟鎹細Hero 浼犻�� teamHero锛孧ingge 浼犻�� null锛堝洜涓轰簨浠剁洃鍚櫒鍙鐞� Hero 鏁版嵁锛�
+        TeamHero teamHero = null;
+        if (caster is HeroBattleObject heroBattleObject)
+        {
+            teamHero = heroBattleObject.teamHero;
+        }
+        // 鍛芥牸閲婃斁鎶�鑳芥椂 teamHero 涓� null锛岀洃鍚櫒浼氭纭鐞嗭紙宸叉湁 null 妫�鏌ワ級
         EventBroadcast.Instance.Broadcast<string, SkillConfig, TeamHero>(EventName.BATTLE_CAST_SKILL, guid, skillConfig, teamHero);
 
-        if (skillConfig.SkinllSFX1 != 0)
+        if (skillSkinConfig.SkinllSFX1 != 0)
         {
-            battleField.soundManager.PlayEffectSound(skillConfig.SkinllSFX1, false);
+            battleField.soundManager.PlayEffectSound(skillSkinConfig.SkinllSFX1, false);
         }
 
         if (caster != null)
@@ -271,7 +297,7 @@
         HighLightAllTargets();
 
         // 鏍规嵁閲婃斁妯″紡鎵ц鐩稿簲閫昏緫
-        switch (skillConfig.castMode)
+        switch (skillSkinConfig.castMode)
         {
             case SkillCastMode.None:
             case SkillCastMode.Self:
@@ -290,7 +316,7 @@
                 DashCast(OnAttackFinish);
                 break;
             default:
-                Debug.LogError("寮哄埗缁撴潫鎶�鑳� 鏆傛椂涓嶆敮鎸佸叾浠栫殑鏂瑰紡閲婃斁 鏈夐渶姹俻lease鑱旂郴绛栧垝 鎶�鑳絠d:" + skillConfig.SkillID + " cast position " + skillConfig.CastPosition);
+                Debug.LogError("寮哄埗缁撴潫鎶�鑳� 鏆傛椂涓嶆敮鎸佸叾浠栫殑鏂瑰紡閲婃斁 鏈夐渶姹俻lease鑱旂郴绛栧垝 鎶�鑳絠d:" + skillConfig.SkillID + " cast position " + skillSkinConfig.CastPosition);
                 ForceFinished();
                 break;
         }
@@ -300,7 +326,7 @@
     {
         if (hintConfig != null)
         {
-            battleObject.heroInfoBar.ShowTips(((char)hintConfig.prefix).ToString(), true, false, 1.25f);
+            battleObject.ShowTips(((char)hintConfig.prefix).ToString(), true, false, 1.25f);
         }
     }
 
@@ -314,7 +340,7 @@
     // 瀵规晫鏂归噴鏀炬妧鑳斤細绉诲姩鍒版晫鏂瑰尯鍩熻繘琛屾敾鍑�
     protected void CastToEnemy()
     {
-        RectTransform target = battleField.GetTeamNode(caster.GetEnemyCamp(), skillConfig);
+        RectTransform target = battleField.GetTeamNode(caster.GetEnemyCamp(), skillSkinConfig);
         ExecuteMoveAndCastSequence(target, () =>
         {
             if (skillConfig.ClientTriggerTiming == 1)
@@ -324,7 +350,7 @@
             else
             {
                 // ShadowIllutionCreate(true);
-                MoveToTarget(battleField.GetTeamNode(caster.Camp, caster.teamHero.positionNum), Vector2.zero, () =>
+                MoveToTarget(battleField.GetTeamNode(caster.Camp, caster.GetPositionNum()), Vector2.zero, () =>
                 {
                     // ShadowIllutionCreate(false);
                     OnAttackFinish();
@@ -349,7 +375,7 @@
 
         ExecuteMoveAndCastSequence(targetTrans, () =>
         {
-            RectTransform rectTransform = battleField.GetTeamNode(caster.Camp, caster.teamHero.positionNum);
+            RectTransform rectTransform = battleField.GetTeamNode(caster.Camp, caster.GetPositionNum());
             // ShadowIllutionCreate(true);
             MoveToTarget(rectTransform, Vector2.zero, () =>
             {
@@ -362,7 +388,7 @@
     // 瀵瑰弸鏂归噴鏀炬妧鑳斤細绉诲姩鍒板弸鏂瑰尯鍩熻繘琛屾不鐤楁垨澧炵泭
     protected void CastToAllies()
     {
-        RectTransform target = battleField.GetTeamNode(caster.Camp, skillConfig);
+        RectTransform target = battleField.GetTeamNode(caster.Camp, skillSkinConfig);
         ExecuteMoveAndCastSequence(target, () =>
         {
             if (skillConfig.ClientTriggerTiming == 1)
@@ -372,7 +398,7 @@
             else
             {
                 // ShadowIllutionCreate(true);
-                MoveToTarget(battleField.GetTeamNode(caster.Camp, caster.teamHero.positionNum), Vector2.zero, () =>
+                MoveToTarget(battleField.GetTeamNode(caster.Camp, caster.GetPositionNum()), Vector2.zero, () =>
                 {
                     // ShadowIllutionCreate(false);
                     OnAttackFinish();
@@ -385,11 +411,11 @@
     private void ExecuteMoveAndCastSequence(RectTransform target, Action onReturnComplete)
     {
         ShadowIllutionCreate(true);
-        MoveToTarget(target, new Vector2(skillConfig.CastDistance, 0), () =>
+        MoveToTarget(target, new Vector2(skillSkinConfig.CastDistance, 0), () =>
         {
-            if (skillConfig.CastDistance < 9999 && skillConfig.SkinllSFX2 != 0)
+            if (skillSkinConfig.CastDistance < 9999 && skillSkinConfig.SkinllSFX2 != 0)
             {
-                battleField.soundManager.PlayEffectSound(skillConfig.SkinllSFX2, false);
+                battleField.soundManager.PlayEffectSound(skillSkinConfig.SkinllSFX2, false);
             }
 
             TurnBack(() =>
@@ -418,16 +444,16 @@
     // 绉诲姩鍒扮洰鏍囦綅缃細澶勭悊瑙掕壊鐨勭Щ鍔ㄥ姩鐢诲拰閫昏緫
     protected void MoveToTarget(RectTransform target, Vector2 offset, Action _onComplete = null, float speed = 750f)
     {
-        if (skillConfig.CastDistance >= 9999)
+        if (skillSkinConfig.CastDistance >= 9999)
         {
             _onComplete?.Invoke();
             return;
         }
 
-        caster.motionBase.PlayAnimation(MotionName.run, true);
-        var tweener = BattleUtility.MoveToTarget(caster.heroRectTrans, target, offset, () =>
+        caster.PlayAnimation(MotionName.run, true);
+        var tweener = BattleUtility.MoveToTarget(caster.GetRectTransform(), target, offset, () =>
         {
-            caster.motionBase.PlayAnimation(MotionName.idle, true);
+            caster.PlayAnimation(MotionName.idle, true);
             _onComplete?.Invoke();
         }, speed);
         battleField.battleTweenMgr.OnPlayTween(tweener);
@@ -436,11 +462,9 @@
     // 杞韩閫昏緫锛氭牴鎹妧鑳介厤缃鐞嗚鑹茶浆鍚�
     protected void TurnBack(Action _onComplete, float forward)
     {
-        if (skillConfig.CastDistance < 0)
+        if (skillSkinConfig.CastDistance < 0)
         {
-            Vector3 scale = caster.heroGo.transform.localScale;
-            scale.x = Mathf.Abs(scale.x) * forward;
-            caster.heroGo.transform.localScale = scale;
+            caster.SetFacing(forward);
         }
         _onComplete?.Invoke();
     }
@@ -450,7 +474,7 @@
     {
         TurnBack(null, 1f);
         OnAllAttackMoveFinished();
-        caster.motionBase.PlayAnimation(MotionName.idle, true);
+        caster.PlayAnimation(MotionName.idle, true);
     }
 
     // 鎵�鏈夋敾鍑荤Щ鍔ㄥ畬鎴愬悗鐨勫鐞嗭細鎭㈠UI鏄剧ず鐘舵��
@@ -461,7 +485,7 @@
         foreach (BattleObject bo in allList)
         {
             bo.layerMgr.SetFront();
-            bo.heroInfoBar.SetActive(true);
+            bo.GetHeroInfoBar()?.SetActive(true);
         }
         battleField.battleRootNode.skillMaskNode.SetActive(false);
     }
@@ -469,7 +493,7 @@
     // 鎵ц鎶�鑳介噴鏀惧姩鐢诲拰閫昏緫锛氭挱鏀炬柦娉曞姩浣滃苟鎻愪緵鍥炶皟
     protected TrackEntry CastImpl(Action onComplete = null)
     {
-        return caster.motionBase.PlaySkillAnimation(skillConfig, this, tagUseSkillAttack.BattleType == 4, onComplete);
+        return caster.PlaySkillAnimation(skillConfig, skillSkinConfig, this, tagUseSkillAttack.BattleType == 4, onComplete);
     }
 
     // 鎶�鑳藉紑濮嬪洖璋冿細澶勭悊姝讳骸銆佸瓙鎶�鑳姐�佹妧鑳芥晥鏋滃垵濮嬪寲
@@ -481,28 +505,93 @@
             return;
         }
 
+        //  鍏堟妸姝讳骸鍖呮敹闆嗕簡
         HandleDead();
 
-        skillEffect = SkillEffectFactory.CreateSkillEffect(this, caster, skillConfig, tagUseSkillAttack);
+        //  鍐嶅鐞� 鍐呭祵鎶�鑳�
+        ProcessSubSkill();
+
+        skillEffect = SkillEffectFactory.CreateSkillEffect(this, caster, skillConfig, skillSkinConfig, tagUseSkillAttack);
         skillEffect.Play(OnHitTargets);
-        foreach (var subSkillPack in tagUseSkillAttack.subSkillList)
-        {
-            SkillRecordAction recordAction = CustomHB426CombinePack.CreateSkillAction(battleField.guid, new List<GameNetPackBasic>() { subSkillPack });
-            recordAction.fromSkill = this;
-            otherSkillActionList.Add(recordAction);
-            battleField.recordPlayer.ImmediatelyPlay(recordAction);
-        }
-        tagUseSkillAttack.subSkillList.Clear();
-        foreach (var subCombinePack in tagUseSkillAttack.subSkillCombinePackList)
-        {
-            SkillRecordAction recordAction = CustomHB426CombinePack.CreateSkillAction(battleField.guid, subCombinePack.packList);
-            recordAction.fromSkill = this;
-            otherSkillActionList.Add(recordAction);
-            battleField.recordPlayer.ImmediatelyPlay(recordAction);
-        }
-        tagUseSkillAttack.subSkillCombinePackList.Clear();
+        
 
         isPlay = true;
+    }
+
+    protected void ProcessSubSkill()
+    {
+        // 鎸塸ackUID鎺掑簭鎵�鏈夊瓙鎶�鑳�
+        var allSubSkills = new List<(ulong packUID, SkillRecordAction action)>();
+        
+        List<GameNetPackBasic> removePackList = new List<GameNetPackBasic>();
+
+        foreach (var pack in packList)
+        {
+            if (pack is HB427_tagSCUseSkill skillPack)
+            {
+                SkillConfig ssc = SkillConfig.Get((int)skillPack.SkillID);
+                SkillSkinConfig sscSkin = ssc.GetOriginSkinConfig();
+                if (!string.IsNullOrEmpty(sscSkin.SkillMotionName))
+                {
+                    break;
+                }
+                if (ssc.SkillType == 8)
+                {
+                    break;
+                }
+                SkillRecordAction skillRecordAction = CustomHB426CombinePack.CreateSkillAction(battleField.guid, new List<GameNetPackBasic> { skillPack });
+                allSubSkills.Add((skillPack.packUID, skillRecordAction));
+                removePackList.Add(pack);
+            }
+            else if (pack is HB422_tagMCTurnFightObjDead dead)
+            {
+                break;
+            }
+            else if (pack is CustomHB426CombinePack combinePack)
+            {
+                HB427_tagSCUseSkill sp = combinePack.GetMainHB427SkillPack();
+                SkillConfig ssc = SkillConfig.Get((int)sp.SkillID);
+                SkillSkinConfig sscSkin = ssc.GetOriginSkinConfig();
+                if (!string.IsNullOrEmpty(sscSkin.SkillMotionName))
+                {
+                    break;
+                }
+
+                if (ssc.SkillType == 8)
+                {
+                    break;
+                }
+                
+                SkillRecordAction skillRecordAction = combinePack.CreateSkillAction();
+                allSubSkills.Add((sp.packUID, skillRecordAction));
+                removePackList.Add(pack);
+
+                if (skillRecordAction.useParentRecordPlayer)
+                {
+                    break;
+                }
+            }
+        }
+
+        for (int i = 0; i < removePackList.Count; i++)
+        {
+            packList.Remove(removePackList[i]);
+        }
+
+        // 鎸塸ackUID鎺掑簭
+        allSubSkills.Sort((a, b) => a.packUID.CompareTo(b.packUID));
+
+        foreach (var (packUID, recordAction) in allSubSkills)
+        {
+            if (recordAction.useParentRecordPlayer)
+            {
+                ownRecordAction.GetInnerRecordPlayer().PlayRecord(recordAction, ownRecordAction);
+            }
+            else
+            {
+                ownRecordAction.GetInnerRecordPlayer().ImmediatelyPlay(recordAction);
+            }
+        }
     }
 
     // 鎶�鑳藉墠鎽囩粨鏉熷洖璋�
@@ -529,6 +618,9 @@
     // 鎶�鑳藉悗鎽囩粨鏉熷洖璋冿細閫氱煡鎶�鑳芥晥鏋滃鐞嗗悗鎽囩粨鏉�
     public virtual void OnFinalFrameEnd()
     {
+        //  鏍囪鍔ㄧ敾鎾斁瀹屾垚
+        isMotionCompleted = true;
+        BattleDebug.LogError($"SkillBase.OnFinalFrameEnd: 鎶�鑳� {skillConfig?.SkillID} 鍔ㄧ敾鎾斁瀹屾垚");
         
         skillEffect?.OnFinalFrameEnd(); // 淇锛氭坊鍔犵┖鍊兼鏌�
     }
@@ -536,7 +628,7 @@
     // 楂樹寒鎵�鏈夌浉鍏崇洰鏍囷細璁剧疆鏂芥硶鑰呭拰鐩爣鐨勬樉绀哄眰绾�
     protected void HighLightAllTargets()
     {
-        caster.layerMgr.SetSortingOrder(BattleConst.ActiveHeroActionSortingOrder);
+        caster.layerMgr.SetSortingOrder(BattleConst.SkillMaskOrder + BattleConst.BattleActiveHeroOffset);
 
         if (skillConfig.FuncType != 2)
             return;
@@ -586,7 +678,7 @@
         var highlightSet = new HashSet<BattleObject>(highlightList);
 
         // 鍏堟妸鏂芥硶鑰呯殑 InfoBar 闅愯棌锛堝師閫昏緫淇濈暀锛�
-        caster.heroInfoBar.SetActive(false);
+        caster.GetHeroInfoBar()?.SetActive(false);
 
         foreach (BattleObject bo in allList)
         {
@@ -603,29 +695,22 @@
             }
 
             // 鐩爣锛堝惈 HurtListEx锛夐兘搴旀樉绀� InfoBar
-            bo.heroInfoBar.SetActive(isTarget);
+            bo.GetHeroInfoBar()?.SetActive(isTarget);
         }
 
         battleField.battleRootNode.skillMaskNode.SetActive(true);
     }
 
-    protected long suckHp = 0;
 
     // 鍛戒腑鐩爣鍥炶皟锛氬鐞嗘墍鏈夎鍛戒腑鐨勭洰鏍囷紙鍖呮嫭涓荤洰鏍囥�佸脊灏勭洰鏍囥�佹簠灏勭洰鏍囷級
     protected virtual void OnHitTargets(int _hitIndex, List<HB427_tagSCUseSkill.tagSCUseSkillHurt> hitList)
     {
-        // Debug.LogError($"Skill {skillConfig.SkillID} hit targets _hitIndex: {_hitIndex} hit {string.Join(", ", hitList.Select(h => h.ObjID + ":" + battleField.battleObjMgr.GetBattleObject((int)h.ObjID)?.teamHero.name))}");
+        // Debug.LogError($"Skill {skillConfig.SkillID} hit targets _hitIndex: {_hitIndex} hit {string.Join(", ", hitList.Select(h => h.ObjID + ":" + battleField.battleObjMgr.GetBattleObject((int)h.ObjID)?.GetName()))}");
 
         //  閫犳垚浼ゅ鍓嶅厛澶勭悊琛�閲忓埛鏂板寘
         HandleRefreshHP();
 
-        suckHp = 0;
-
-        // 缁熻鍚歌鎬婚噺锛堜富鐩爣锛�
-        foreach (var hurt in hitList)
-        {
-            suckHp += hurt.SuckHP;
-        }
+        bool suckHp = true;
 
         // 澶勭悊涓荤洰鏍囧垪琛�
         foreach (var hurt in hitList)
@@ -637,7 +722,9 @@
                 continue;
             }
 
-            OnHitEachTarget(_hitIndex, target, hurt);
+            OnHitEachTarget(_hitIndex, target, hurt, suckHp);
+
+            suckHp = false;
 
             // 澶勭悊璇ョ洰鏍囩殑棰濆鐩爣鍒楄〃锛堝寮瑰皠浼ゅ鐨勫钩鎽婄洰鏍囷級
             if (hurt.HurtListEx != null && hurt.HurtListEx.Length > 0)
@@ -672,6 +759,11 @@
             }
         }
 
+        HandleHint(_hitIndex, hitList);
+    }
+
+    protected void HandleHint(int _hitIndex, List<HB427_tagSCUseSkill.tagSCUseSkillHurt> hitList)
+    {
         if (0 == _hitIndex)
         {
             bool needhint = false;
@@ -707,13 +799,41 @@
                 DamageNumConfig hintConfig = DamageNumConfig.Get(BattleConst.BattleStun);
                 Hint(caster, hintConfig);
             }
-        }
 
-        
+            for (int i = 0; i < hitList.Count; i++)
+            {
+                var hurt = hitList[i];
+
+                if ((hurt.AttackTypes & (int)DamageType.BreakArmor) == (int)DamageType.BreakArmor)
+                {
+                    BattleObject battleObject = caster.battleField.battleObjMgr.GetBattleObject((int)hurt.ObjID);
+                    if (battleObject != null)
+                    {
+                        DamageNumConfig hintConfig = DamageNumConfig.Get(BattleConst.BreakArmor);
+                        Hint(battleObject, hintConfig);
+                        battleField.battleEffectMgr.PlayEffect(battleObject, 
+                            BattleConst.BreakArmorEffectID, battleObject.GetRectTransform(), battleObject.Camp, 
+                            battleObject.GetModelScale());
+                    }
+                }
+                else if ((hurt.AttackTypes & (int)DamageType.Parry) == (int)DamageType.Parry)
+                {
+                    BattleObject battleObject = caster.battleField.battleObjMgr.GetBattleObject((int)hurt.ObjID);
+                    if (battleObject != null)
+                    {
+                        DamageNumConfig hintConfig = DamageNumConfig.Get(BattleConst.Parry);
+                        Hint(battleObject, hintConfig);
+                        battleField.battleEffectMgr.PlayEffect(battleObject, 
+                            BattleConst.ParryEffectID, battleObject.GetRectTransform(), battleObject.Camp, 
+                            battleObject.GetModelScale());
+                    }
+                }
+            }
+        }
     }
 
     // 澶勭悊鍗曚釜鐩爣琚懡涓�:搴旂敤浼ゅ鍜屾柦娉曡�呮晥鏋�
-    protected virtual void OnHitEachTarget(int _hitIndex, BattleObject target, HB427_tagSCUseSkill.tagSCUseSkillHurt hurt)
+    protected virtual void OnHitEachTarget(int _hitIndex, BattleObject target, HB427_tagSCUseSkill.tagSCUseSkillHurt hurt, bool suckHp)
     {
         // ============ 鑾峰彇涓存椂鏁版嵁(鎺夎惤銆佹浜$瓑) ============
         int objID = (int)target.ObjID;
@@ -726,20 +846,21 @@
             deadPack = null;
         }
 
-        bool clearSuckHp = tagUseSkillAttack.HurtList.ToList().IndexOf(hurt) != 0;
-
         // ============ 鍙傛暟鎵撳寘 ============
-        BattleHurtParam hurtParam = BattleUtility.CalcBattleHurtParam(this, _hitIndex, target, hurt, battleDrops, deadPack);
-        if (clearSuckHp)
-        {
-            hurtParam.caster.suckHpList.Clear();
-        }
+        BattleHurtParam hurtParam = BattleUtility.CalcBattleHurtParam(this, _hitIndex, target, hurt, battleDrops, deadPack, suckHp);
 #if UNITY_EDITOR
         PrintHurtParamDebugInfo(hurtParam);
 #endif
 
         // 鍏堣皟鐢ㄧ洰鏍囧彈浼�
-        target.Hurt(hurtParam);
+        DeathRecordAction recordAc = target.Hurt(hurtParam, ownRecordAction);
+
+        if (null != recordAc)
+        {
+            tempDeadPackList.Remove(hurtParam.hurter.hurtObj.ObjID);
+            ownRecordAction.GetInnerRecordPlayer().ImmediatelyPlay(recordAc, ownRecordAction, true);
+            currentWaitingSkill.Add(recordAc);
+        }
         
         // 鍐嶈皟鐢ㄦ柦娉曡�呭惛琛�/鍙嶄激
         caster.OnHurtTarget(hurtParam);
@@ -768,29 +889,19 @@
             HurtHPEx = hurtEx.HurtHPEx,
             CurHP = hurtEx.CurHP,
             CurHPEx = hurtEx.CurHPEx,
-            SuckHP = hurtEx.SuckHP,
+            SuckHP = 0,//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);
+        OnHitEachTarget(_hitIndex, target, hurt, false);//鑾峰彇鍏ㄩ儴鍚歌鏃跺凡缁忚绠楄繃 杩欓噷灏变笉鍐嶈绠�
     }
 
 #if UNITY_EDITOR
     private void PrintHurtParamDebugInfo(BattleHurtParam hurtParam)
     {
-        bool isLastHit = hurtParam.hitIndex >= hurtParam.skillConfig.DamageDivide.Length - 1;
+        bool isLastHit = hurtParam.hitIndex >= hurtParam.skillSkinConfig.DamageDivide.Length - 1;
         
         long currentHitDamage = hurtParam.hurter.damageList != null ? hurtParam.hurter.damageList.Sum() : 0;
         long currentHitSuckHp = hurtParam.caster.suckHpList != null ? hurtParam.caster.suckHpList.Sum() : 0;
@@ -802,10 +913,10 @@
         
         BattleDebug.LogError(
             (hurtParam.caster.casterObj.Camp == BattleCamp.Red ? "銆愮孩鏂硅鍔ㄣ��" : "銆愯摑鏂硅鍔ㄣ�� ") +
-            $"鏀诲嚮鑰�: {hurtParam.caster.casterObj.teamHero.name} (ObjID:{hurtParam.caster.casterObj.ObjID})\n" +
-            $"鐩爣: {hurtParam.hurter.hurtObj.teamHero.name} (ObjID:{hurtParam.hurter.hurtObj.ObjID})\n" +
+            $"鏀诲嚮鑰�: {hurtParam.caster.casterObj.GetName()} (ObjID:{hurtParam.caster.casterObj.ObjID})\n" +
+            $"鐩爣: {hurtParam.hurter.hurtObj.GetName()} (ObjID:{hurtParam.hurter.hurtObj.ObjID})\n" +
             $"鎶�鑳�: {hurtParam.skillConfig.SkillName} (ID:{hurtParam.skillConfig.SkillID})\n" +
-            $"鍑绘暟: 绗瑊hurtParam.hitIndex + 1}鍑� / 鍏眥hurtParam.skillConfig.DamageDivide.Length}鍑�" + (isLastHit ? " [鏈�鍚庝竴鍑籡" : " [涓棿鍑籡") + "\n" +
+            $"鍑绘暟: 绗瑊hurtParam.hitIndex + 1}鍑� / 鍏眥hurtParam.skillSkinConfig.DamageDivide.Length}鍑�" + (isLastHit ? " [鏈�鍚庝竴鍑籡" : " [涓棿鍑籡") + "\n" +
             $"\n" +
             $"========== 鐩爣鍙椾激鏁版嵁 ==========\n" +
             $"浼ゅ: {currentHitDamage} / 鎬讳激瀹�: {totalDamage}\n" +
@@ -834,7 +945,10 @@
         if (refreshPack != null)
         {
             // 鍒嗗彂HP鍒锋柊鍖�
-            PackageRegedit.Distribute(refreshPack);
+            // 銆愪娇鐢� parentRecordAction.innerRecordPlayer銆�
+            // 鍘熷洜锛欻P鍒锋柊鍖呮槸鎶�鑳藉唴閮ㄤ骇鐢熺殑锛屽簲璇ョ敱褰撳墠SkillRecordAction鐨刬nnerRecordPlayer绠$悊
+            // 杩欐牱鍙互纭繚HP鍒锋柊涓庢妧鑳界殑鐢熷懡鍛ㄦ湡缁戝畾锛孎orceFinish鏃朵竴骞跺鐞�
+            PackageRegeditEx.DistributeToRecordAction(refreshPack, ownRecordAction);
             packList.Remove(refreshPack);
         }
     }
@@ -845,13 +959,62 @@
         List<BattleDeadPack> deadPackList = BattleUtility.FindDeadPack(packList);
         if (deadPackList.Count <= 0) return;
 
+        foreach (var deadPack in deadPackList)
+        {
+            packList.Remove(deadPack.deadPack);
+            packList.Remove(deadPack.deadTriggerSkill);
+        }
+
+        // 鎵惧埌鏈�澶х殑姝讳骸鍖� packUID
+        BattleDeadPack lastBattleDeadPack = null;
+        ulong maxDeathPackUID = 0;
+        foreach (var deadPack in deadPackList)
+        {
+            if (deadPack.deadPack != null && deadPack.deadPack.packUID > maxDeathPackUID)
+            {
+                maxDeathPackUID = deadPack.deadPack.packUID;
+                lastBattleDeadPack = deadPack;
+            }
+        }
+        
+        // 濡傛灉鎵惧埌浜嗘浜″寘锛屾敹闆嗘墍鏈� packUID > maxDeathPackUID 鐨勫寘
+        if (maxDeathPackUID > 0 && lastBattleDeadPack != null)
+        {
+            BattleDebug.LogError($"SkillBase.HandleDead: 鎵惧埌姝讳骸鍖咃紝maxDeathPackUID = {maxDeathPackUID}锛屽紑濮嬫敹闆嗘浜″悗鐨勫寘");
+            
+            // 1. 鏀堕泦 packList 涓� packUID 澶т簬姝讳骸鍖呯殑鍖咃紙鎺掗櫎缁忛獙鍖呭拰鎺夎惤鍖咃紝瀹冧滑闇�瑕佸湪褰撳墠鎶�鑳戒腑澶勭悊锛�
+            List<GameNetPackBasic> packsToRemove = new List<GameNetPackBasic>();
+            foreach (var pack in packList)
+            {
+                ulong packUID = GetPackUID(pack);
+                if (packUID > maxDeathPackUID)
+                {
+                    // 鎺掗櫎缁忛獙鍖呭拰鎺夎惤鍖咃紝瀹冧滑灞炰簬褰撳墠姝讳骸浜嬩欢鐨勪竴閮ㄥ垎锛屼笉鏄�"姝讳骸鍚�"鐨勫寘
+                    if (pack is HB405_tagMCAddExp expPack && expPack.Source == 2 || 
+                        (pack is H0704_tagRolePackRefresh h0704 && h0704.PackType == (byte)PackType.DropItem && h0704.IsBind == 1))
+                    {
+                        continue; // 璺宠繃缁忛獙鍖呭拰鎺夎惤鍖咃紝璁� CheckAfterDeadhPack() 澶勭悊瀹冧滑
+                    }
+                    
+                    BattleDebug.LogError($"SkillBase.HandleDead: 浠巔ackList鏀堕泦姝讳骸鍚庣殑鍖� - Type: {pack.GetType().Name}, UID: {packUID}");
+                    lastBattleDeadPack.packListAfterDeath.Add(pack);
+                    packsToRemove.Add(pack);
+                }
+            }
+
+            packList.RemoveAll(p => packsToRemove.Contains(p));
+        }
+
         CheckAfterDeadhPack();
 
         // 淇锛氬厛鏀堕泦瑕佸垹闄ょ殑鍖咃紝閬垮厤鍦╢oreach涓慨鏀归泦鍚�
         var dropPacksToRemove = new List<H0704_tagRolePackRefresh>(dropPackList);
         foreach (var _dropPack in dropPacksToRemove)
         {
-            PackageRegedit.Distribute(_dropPack);
+            // 銆愪娇鐢� parentRecordAction.innerRecordPlayer銆�
+            // 鍘熷洜锛氭帀钀藉寘鏄妧鑳芥晥鏋滅殑涓�閮ㄥ垎锛屽簲璇ョ敱褰撳墠SkillRecordAction绠$悊
+            // 鎺夎惤鍖呯殑鍒嗗彂涓庢妧鑳藉畬鎴愮粦瀹氾紝纭繚鍦ㄦ妧鑳紽orceFinish鏃舵纭鐞�
+            PackageRegeditEx.DistributeToRecordAction(_dropPack, ownRecordAction);
             packList.Remove(_dropPack);
         }
 
@@ -866,8 +1029,8 @@
         // 鏋勯�燘attleDrops骞剁紦瀛�
         for (int i = 0; i < deadPackList.Count; i++)
         {
-            BattleDeadPack battleDeadPack = deadPackList[i];
-            int objID = (int)battleDeadPack.deadPack.ObjID;
+            BattleDeadPack bdp = deadPackList[i];
+            int objID = (int)bdp.deadPack.ObjID;
             BattleObject deadTarget = battleField.battleObjMgr.GetBattleObject(objID);
             
             // 淇锛氭坊鍔犵┖鍊兼鏌�
@@ -881,7 +1044,7 @@
             
             BattleDrops battleDrops = new BattleDrops()
             {
-                rectTransform = deadTarget.heroRectTrans,
+                rectTransform = deadTarget.GetRectTransform(),
                 dropItemPackIndex = itemIndexList,
                 expDrops = expAssign[i]
             };
@@ -926,6 +1089,48 @@
         for (int i = 0; i < itemList.Count; i++)
             dropAssign[i % deadCount].Add(itemList[i]);
         return dropAssign;
+    }
+
+    // 鑾峰彇鍖呯殑 packUID
+    protected ulong GetPackUID(GameNetPackBasic pack)
+    {
+        if (pack == null) return 0;
+        
+        if (pack is HB422_tagMCTurnFightObjDead deadPack)
+            return deadPack.packUID;
+        
+        if (pack is CustomHB426CombinePack combinePack)
+        {
+            var mainSkillPack = combinePack.GetMainHB427SkillPack();
+            return mainSkillPack?.packUID ?? 0;
+        }
+        
+        if (pack is HB427_tagSCUseSkill skillPack)
+            return skillPack.packUID;
+        
+        if (pack is HB428_tagSCBuffRefresh buffRefresh)
+            return buffRefresh.packUID;
+        
+        if (pack is HB429_tagSCBuffDel buffDel)
+            return buffDel.packUID;
+        
+        if (pack is HB419_tagSCObjHPRefresh hpRefresh)
+            return hpRefresh.packUID;
+        
+        if (pack is HB405_tagMCAddExp expPack)
+            return expPack.packUID;
+        
+        if (pack is H0704_tagRolePackRefresh dropPack)
+            return dropPack.packUID;
+        
+        // 灏濊瘯閫氳繃鍙嶅皠鑾峰彇 packUID
+        var packUIDField = pack.GetType().GetField("packUID");
+        if (packUIDField != null)
+        {
+            return (ulong)packUIDField.GetValue(pack);
+        }
+        
+        return 0;
     }
 
     // 鍒嗛厤缁忛獙鍊硷細灏嗙粡楠屽寘骞冲潎鍒嗛厤缁欐瘡涓浜″璞�
@@ -1005,7 +1210,7 @@
     }
 
 
-    public virtual bool IsFinishedForJudge()
+    public virtual bool IsActionCompleted()
     {
         if (!isPlay) return false;
 
@@ -1014,19 +1219,16 @@
             if (!skillEffect.IsFinished()) return false;
         }
 
-        if (otherSkillActionList.Count > 0)
+        if (moveFinished)
         {
-            foreach (var action in otherSkillActionList)
+            //  濡傛灉鎶�鑳芥湁鍔ㄧ敾锛圫killMotionName涓嶄负绌猴級锛岄渶瑕佺瓑寰呭姩鐢绘挱鏀惧畬鎴�
+            if (skillSkinConfig != null && !string.IsNullOrEmpty(skillSkinConfig.SkillMotionName))
             {
-                if (!action.IsFinishedForJudge()) return false;
-            }
-        }
-
-        if (isFinished && moveFinished)
-        {
-            if (packList.Count > 0)
-            {
-                return false;
+                if (!isMotionCompleted)
+                {
+                    BattleDebug.LogError($"SkillBase.IsActionCompleted: 鎶�鑳� {skillConfig.SkillID} 绛夊緟鍔ㄧ敾鎾斁瀹屾垚");
+                    return false;
+                }
             }
 
             return true;
@@ -1052,18 +1254,14 @@
         }
 
         // 妫�鏌ュ叾浠栨妧鑳藉姩浣滄槸鍚﹀畬鎴�
-        if (otherSkillActionList.Count > 0)
+        if (currentWaitingSkill.Count > 0)
         {
-            for (int i = otherSkillActionList.Count - 1; i >= 0; i--)
+            if (currentWaitingSkill.Any(s => s.IsFinished()))
             {
-                var action = otherSkillActionList[i];
-                if (action.IsFinished())
-                {
-                    otherSkillActionList.RemoveAt(i);
-                    OnSkillFinished();
-                }
+                currentWaitingSkill.RemoveAll(s => s.IsFinished());
+                OnSkillFinished();
             }
-            if (otherSkillActionList.Count > 0)
+            else
             {
                 tempRetValue = false;
             }
@@ -1074,6 +1272,7 @@
             return false;
         }
 
+
         // 妫�鏌ユ渶缁堝畬鎴愮姸鎬�
         if (isFinished && moveFinished)
         {
@@ -1083,15 +1282,28 @@
                 return false;
             }
 
+            //  濡傛灉鑷繁鍐呴儴鐨剅ecora action鐨� inner record player杩樻湁娌℃墽琛屽畬鐨勫寘 涔熸槸杩斿洖false
+            if (ownRecordAction != null && ownRecordAction.GetInnerRecordPlayer().IsPlaying())
+            {
+                return false;
+            }
+
             // 鎶�鑳藉畬鍏ㄧ粨鏉燂紝绉婚櫎鎶�鑳芥敞鍐屽苟瑙﹀彂寤惰繜鐨勬浜″垽瀹�
             if (battleField != null && caster != null)
             {
                 battleField.RemoveCastingSkill(caster.ObjID, this);
                 
-                battleField.OnObjsDead(new List<BattleDeadPack>(tempDeadPackList.Values));
+                //  浼犻�抪arentRecordAction锛岃姝讳骸鎶�鑳界瓑寰呭綋鍓嶆妧鑳藉畬鎴�
+                DeathRecordAction recordAction = battleField.OnObjsDead(new List<BattleDeadPack>(tempDeadPackList.Values), null, ownRecordAction);
+                if (null != recordAction)
+                {
+                    ownRecordAction.GetInnerRecordPlayer().ImmediatelyPlay(recordAction);
+                    tempDeadPackList.Clear();
+                    return false;
+                }
             }
 
-            return true;
+            return !ownRecordAction.GetInnerRecordPlayer().IsPlaying();
         }
 
         return false;
@@ -1110,45 +1322,45 @@
             battleField.RemoveCastingSkill(caster.ObjID, this);
         }
 
+        //  浼犻�抪arentRecordAction锛岃姝讳骸鎶�鑳界瓑寰呭綋鍓嶆妧鑳藉畬鎴�
+        RecordAction rc = battleField.OnObjsDead(new List<BattleDeadPack>(tempDeadPackList.Values));
+        if (null != rc)
+        {
+            ownRecordAction.GetInnerRecordPlayer().ImmediatelyPlay(rc);
+        }
+        tempDeadPackList.Clear();
+
         // 1. 寮哄埗缁撴潫鎶�鑳芥晥鏋�
         skillEffect?.ForceFinished();
         skillEffect = null;
         
         // 2. 寮哄埗缁撴潫鎵�鏈夊瓙鎶�鑳藉姩浣�
-        otherSkillActionList.ForEach(action => action.ForceFinish());
-        otherSkillActionList.Clear();
+        if (currentWaitingSkill.Count > 0)
+        {
+            foreach (var skill in currentWaitingSkill)
+            {
+                skill.ForceFinish();
+            }
+            currentWaitingSkill.Clear();
+        }
 
         // 3. 娓呯悊 DOTween 鍔ㄧ敾锛堥槻姝㈢Щ鍔ㄥ洖璋冨湪鎴樻枟缁撴潫鍚庢墽琛岋級
-        if (caster != null && caster.heroRectTrans != null)
+        if (caster != null)
         {
-            DG.Tweening.DOTween.Kill(caster.heroRectTrans);
+            caster.StopMoveAnimation();
         }
 
         // 4. 閲嶇疆鏂芥硶鑰呯姸鎬�
         if (caster != null)
         {
             // 閲嶇疆浣嶇疆鍒板師鐐�
-            if (caster.heroRectTrans != null)
-            {
-                caster.heroRectTrans.anchoredPosition = Vector2.zero;
-            }
+            caster.ResetPosition();
             
             // 閲嶇疆鏈濆悜
-            if (caster.heroGo != null)
-            {
-                Vector3 scale = caster.heroGo.transform.localScale;
-                scale.x = Mathf.Abs(scale.x);
-                caster.heroGo.transform.localScale = scale;
-            }
+            caster.ResetFacing();
 
             // 鍙栨秷骞诲奖鏁堟灉
-            caster.motionBase?.ShowIllusionShadow(false);
-            
-            // 鎾斁寰呮満鍔ㄧ敾锛堝鏋滆繕娲荤潃锛�
-            if (!caster.teamHero.isDead)
-            {
-                caster.motionBase?.ResetForReborn(false);
-            }
+            caster.ShowIllusionShadow(false);
         }
 
         // 5. 鎭㈠ UI 鐘舵��
@@ -1161,7 +1373,7 @@
                 foreach (BattleObject bo in allList)
                 {
                     bo.layerMgr?.SetFront();
-                    bo.heroInfoBar?.SetActive(true);
+                    bo.GetHeroInfoBar()?.SetActive(true);
                 }
             }
             
@@ -1175,6 +1387,9 @@
         isFinished = true;
         moveFinished = true;
         isPlay = true;
+        
+        //  寮哄埗缁撴潫鏃讹紝鏃犺鏄惁鏈夊姩鐢伙紝閮芥爣璁板姩鐢诲畬鎴�
+        isMotionCompleted = true;
 
         // 6. 澶勭悊鎵�鏈夊墿浣欏寘锛堝寘鎷� buff 鍖咃級
         // 鍏堝鐞� buffPackCollections
@@ -1195,8 +1410,9 @@
             }
             else
             {
-                if (pack is CustomB421ActionPack actionPack)
-                    actionPack.Distribute();
+                // 銆愪娇鐢� parentRecordAction.innerRecordPlayer銆�
+                // 鍘熷洜锛欶orceFinished鏃跺墿浣欑殑鍖呬篃鏄妧鑳藉唴閮ㄤ骇鐢熺殑锛屽簲璇ョ敱innerRecordPlayer绠$悊
+                // 杩欐牱鍙互纭繚鍗充娇寮哄埗缁撴潫锛屽寘鐨勫鐞嗕篃鍦ㄦ纭殑涓婁笅鏂囦腑
                 PackageRegedit.Distribute(pack);
             }
         }
@@ -1221,20 +1437,14 @@
             }
 
             // 楠岃瘉鍏朵粬鎶�鑳藉姩浣滄槸鍚﹀畬鎴�
-            if (otherSkillActionList.Count > 0)
+            if (currentWaitingSkill.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;
-                    }
-                }
+                bool hasFinishedAction = currentWaitingSkill.All(s => s.IsFinished());
+
                 if (hasFinishedAction)
                 {
+                    // 淇姝诲惊鐜細瀹屾垚鍚庨渶瑕佹竻绌� currentWaitingSkill
+                    currentWaitingSkill.Clear();
                     continue; // 浣跨敤continue浠f浛閫掑綊璋冪敤
                 }
                 return;
@@ -1262,17 +1472,33 @@
     
     protected virtual bool ResolvePackList()
     {
+        if (currentWaitingSkill.Count > 0)
+        {
+            return false;
+        }
+
         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.fromSkill = this;
-                otherSkillActionList.Add(otherSkillAction);
+                var skillRecordAction = combinePack.CreateSkillAction();
+                skillRecordAction.fromSkill = this;
+                currentWaitingSkill.Add(skillRecordAction);
+
+                //  闇�瑕佺粰鐪熸parent鎾殑
+                if (skillRecordAction.useParentRecordPlayer && skillRecordAction.parentSkillAction != null)
+                {
+                    skillRecordAction.parentSkillAction.GetInnerRecordPlayer().PlayRecord(skillRecordAction);
+                }
+                else
+                {
+                    ownRecordAction.GetInnerRecordPlayer().PlayRecord(skillRecordAction);
+                }
+
                 return false;
             }
             else if (IsBuffPack(pack))
@@ -1300,14 +1526,12 @@
                 buffPackCollections.Clear();
                 continue;
             }
-
-            if (pack is CustomB421ActionPack actionPack)
-            {
-                actionPack.Distribute();
-            }
             else
             {
-                PackageRegedit.Distribute(pack);
+                // 銆愪娇鐢� parentRecordAction.innerRecordPlayer銆�
+                // 鍘熷洜锛氭妧鑳芥墽琛岃繃绋嬩腑鐨勫寘锛圔uff銆佸睘鎬у埛鏂扮瓑锛夋槸鎶�鑳芥晥鏋滅殑涓�閮ㄥ垎
+                // 搴旇鐢盨killRecordAction鐨刬nnerRecordPlayer绠$悊锛岀‘淇濅笌鎶�鑳界敓鍛藉懆鏈熶竴鑷�
+                PackageRegeditEx.DistributeToRecordAction(pack, ownRecordAction);
             }
         }
 
@@ -1319,7 +1543,7 @@
     {
         tempDropList?.Clear();
         tempDeadPackList?.Clear();
-        otherSkillActionList?.Clear();
+        currentWaitingSkill?.Clear();
         dropPackList?.Clear();
         expPackList?.Clear();
         buffPackCollections?.Clear();
@@ -1352,7 +1576,11 @@
                 BattleObject battleObj = battleField.battleObjMgr.GetBattleObject((int)buffRefresh.ObjID);
                 if (battleObj != null)
                 {
-                    battleObj.buffMgr.RefreshBuff(buffRefresh, true);
+                    var buffMgr = battleObj.GetBuffMgr();
+                    if (buffMgr != null) // 鍛芥牸涓嶆湁 buff 绠$悊鍣�
+                    {
+                        buffMgr.RefreshBuff(buffRefresh, true);
+                    }
                 }
             }
             else if (pack is HB429_tagSCBuffDel buffDel)
@@ -1360,7 +1588,11 @@
                 BattleObject battleObj = battleField.battleObjMgr.GetBattleObject((int)buffDel.ObjID);
                 if (battleObj != null)
                 {
-                    battleObj.buffMgr.RemoveBuff(buffDel);
+                    var buffMgr = battleObj.GetBuffMgr();
+                    if (buffMgr != null) // 鍛芥牸涓嶆湁 buff 绠$悊鍣�
+                    {
+                        buffMgr.RemoveBuff(buffDel, false);
+                    }
                 }
             }
         }
@@ -1375,10 +1607,33 @@
 
         foreach (var pack in buffPacks)
         {
-            PackageRegedit.Distribute(pack);
+            // 銆愪娇鐢� parentRecordAction.innerRecordPlayer銆�
+            // 鍘熷洜锛欱uff鍖呮槸鎶�鑳芥晥鏋滅殑鏍稿績缁勬垚閮ㄥ垎锛屽簲璇ョ敱SkillRecordAction绠$悊
+            // 鍗充娇鏄己鍒跺垎鍙戠殑鎯呭喌锛屼篃瑕佷繚鎸佸湪姝g‘鐨凴ecordAction涓婁笅鏂囦腑
+            PackageRegeditEx.DistributeToRecordAction(pack, ownRecordAction);
         }
     }
 
+    public virtual bool CanStartExecution()
+    {
+        if (null == caster)
+        {
+            return false;
+        }
+
+        if (null == skillConfig)
+        {
+            return false;
+        }
+
+        if (string.IsNullOrEmpty(skillSkinConfig.SkillMotionName))
+        {
+            return true;
+        }
+
+        return !battleField.IsCastingSkill(caster.ObjID);
+    }
+
     #endregion
 
 }
\ No newline at end of file

--
Gitblit v1.8.0