From bb145d27787e6d54cb4bf0995cf11a41d1c9e67d Mon Sep 17 00:00:00 2001
From: yyl <yyl>
Date: 星期五, 05 九月 2025 15:25:28 +0800
Subject: [PATCH] 125 【战斗】战斗系统 强制结束战斗(haverest)

---
 Main/System/Battle/SkillEffect/BulletCurve/BulletCurve.cs                          |    5 
 Main/System/Battle/SkillEffect/NormalSkillEffect.cs                                |    8 +
 Main/System/Battle/BattleManager.cs                                                |   14 ++
 Main/System/Battle/BattleUtility.cs                                                |    6 +
 Main/System/Battle/Skill/RebornSkill.cs                                            |   24 ----
 Main/System/Battle/SkillEffect/SkillEffect.cs                                      |   21 +++
 Main/System/Battle/SkillEffect/BulletSkillEffect.cs                                |   15 ++
 Main/System/Battle/BattleField/BattleField.cs                                      |    7 
 Main/System/Battle/RecordPlayer/RecordAction.cs                                    |   15 +
 Main/System/Battle/RecordPlayer/RecordPlayer.cs                                    |   26 +++-
 Main/System/Battle/BattleField/RecordActions/BuffMountAction.cs                    |   16 +
 Main/System/Battle/BattleField/RecordActions/BattleEndAction.cs                    |    6 +
 Main/System/Battle/BattleField/RecordActions/BattleStartAction.cs                  |   17 ++
 Main/System/Battle/Skill/SkillBase.cs                                              |   87 +++++++++-----
 Main/System/Battle/Skill/DirectlyHealSkill.cs                                      |   43 ++----
 Main/System/Battle/BattleField/RecordActions/DeathRecordAction.cs                  |   18 ++-
 Main/Core/NetworkPackage/DTCFile/ServerPack/H04_Scene/DTC0418_tagObjInfoRefresh.cs |    1 
 Main/System/Battle/BattleField/RecordActions/SkillRecordAction.cs                  |   17 ++
 18 files changed, 228 insertions(+), 118 deletions(-)

diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/H04_Scene/DTC0418_tagObjInfoRefresh.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/H04_Scene/DTC0418_tagObjInfoRefresh.cs
index 8f49ec0..e2c67d4 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/H04_Scene/DTC0418_tagObjInfoRefresh.cs
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/H04_Scene/DTC0418_tagObjInfoRefresh.cs
@@ -30,6 +30,7 @@
         {
             battleField.DistributeNextPackage();
         }
+
     }
 
 
diff --git a/Main/System/Battle/BattleField/BattleField.cs b/Main/System/Battle/BattleField/BattleField.cs
index 0d0be34..912190c 100644
--- a/Main/System/Battle/BattleField/BattleField.cs
+++ b/Main/System/Battle/BattleField/BattleField.cs
@@ -508,12 +508,11 @@
     public virtual void HaveRest()
     {
         //  浼戞伅鐘舵��
-        battleObjMgr.HaveRest(BattleCamp.Red);
-        battleObjMgr.DestroyTeam(BattleCamp.Blue);
-
         battleEffectMgr.HaveRest();
         battleTweenMgr.HaveRest();
-
+        recordPlayer.HaveRest();
+        battleObjMgr.HaveRest(BattleCamp.Red);
+        battleObjMgr.DestroyTeam(BattleCamp.Blue);
         SetBattleMode(BattleMode.Stop);
     }
 
diff --git a/Main/System/Battle/BattleField/RecordActions/BattleEndAction.cs b/Main/System/Battle/BattleField/RecordActions/BattleEndAction.cs
index 6daa870..453baad 100644
--- a/Main/System/Battle/BattleField/RecordActions/BattleEndAction.cs
+++ b/Main/System/Battle/BattleField/RecordActions/BattleEndAction.cs
@@ -27,6 +27,12 @@
         isFinish = true;
     }
 
+    public override void ForceFinish()
+    {
+        onComplete?.Invoke();
+        base.ForceFinish();
+    }
+
     public override bool IsFinished()
     {
         return isFinish;
diff --git a/Main/System/Battle/BattleField/RecordActions/BattleStartAction.cs b/Main/System/Battle/BattleField/RecordActions/BattleStartAction.cs
index c60825a..879d478 100644
--- a/Main/System/Battle/BattleField/RecordActions/BattleStartAction.cs
+++ b/Main/System/Battle/BattleField/RecordActions/BattleStartAction.cs
@@ -8,7 +8,7 @@
 	public BattleStartAction(BattleField _battleField)
 		: base(RecordActionType.BattleStart, _battleField, null)
 	{
-		
+
 	}
 
 	public override bool IsFinished()
@@ -17,9 +17,9 @@
 	}
 
 
-    public override void Run()
-    {
-        base.Run();
+	public override void Run()
+	{
+		base.Run();
 
 		if (isRun)
 			return;
@@ -37,5 +37,14 @@
 		});
 
 		isRun = true;
+	}
+
+	public override void ForceFinish()
+	{
+		//姝e父寮�濮嬩箣鍚庡埌鐣岄潰鍑虹幇涔嬪墠閮界偣涓嶄簡 鎵�浠ヨ繖杈逛笉鐢ㄥ己鍒跺畬鎴� 鎺ュ彛鐣欑潃
+
+		base.ForceFinish();
+		// 瀹屾垚灏卞紑濮嬫樉绀篣I
+
     }
 }
\ No newline at end of file
diff --git a/Main/System/Battle/BattleField/RecordActions/BuffMountAction.cs b/Main/System/Battle/BattleField/RecordActions/BuffMountAction.cs
index 388779d..7f3ce1b 100644
--- a/Main/System/Battle/BattleField/RecordActions/BuffMountAction.cs
+++ b/Main/System/Battle/BattleField/RecordActions/BuffMountAction.cs
@@ -16,10 +16,10 @@
         onComplete = _onComplete;
     }
 
-	public override bool IsFinished()
-	{
-		return isFinish;
-	}
+    public override bool IsFinished()
+    {
+        return isFinish;
+    }
 
 
     public override void Run()
@@ -43,6 +43,12 @@
             isFinish = true;
             return;
         }
-        
+
+    }
+
+    public override void ForceFinish()
+    {
+        //  1甯у氨缁撴潫浜� 涓嶇
+        base.ForceFinish();
     }
 }
\ No newline at end of file
diff --git a/Main/System/Battle/BattleField/RecordActions/DeathRecordAction.cs b/Main/System/Battle/BattleField/RecordActions/DeathRecordAction.cs
index af95296..482218f 100644
--- a/Main/System/Battle/BattleField/RecordActions/DeathRecordAction.cs
+++ b/Main/System/Battle/BattleField/RecordActions/DeathRecordAction.cs
@@ -12,10 +12,10 @@
         deadPackList = _deadPackList;
     }
 
-	public override bool IsFinished()
-	{
-		return isFinish;
-	}
+    public override bool IsFinished()
+    {
+        return isFinish;
+    }
 
 
     public override void Run()
@@ -39,13 +39,13 @@
 
                     if (isLastOne)
                     {
-                    	isFinish = true;
+                        isFinish = true;
                     }
                 });
             }
             return;
         }
-        
+
     }
 
     private void OnDeathAnimationEnd(BattleObject deadObj)
@@ -56,4 +56,10 @@
             deadObj.PerformDrop();
         }
     }
+    
+    public override void ForceFinish()
+    {
+        //  璁剧疆缁撴潫flag 璁板緱娓呯┖motionBase閲岀殑浜嬩欢
+        base.ForceFinish();
+    }
 }
\ No newline at end of file
diff --git a/Main/System/Battle/BattleField/RecordActions/SkillRecordAction.cs b/Main/System/Battle/BattleField/RecordActions/SkillRecordAction.cs
index e56eb36..1608714 100644
--- a/Main/System/Battle/BattleField/RecordActions/SkillRecordAction.cs
+++ b/Main/System/Battle/BattleField/RecordActions/SkillRecordAction.cs
@@ -22,10 +22,19 @@
 		return skillBase.IsFinished();
 	}
 
-
-    public override void Run()
+    public override void ForceFinish()
     {
-        base.Run();
+		//  璁剧疆缁撴潫flag 璁板緱娓呯┖motionBase閲岀殑浜嬩欢
+		if (null != skillBase)
+		{
+			skillBase.ForceFinished();
+		}
+        base.ForceFinish();
+    }
+
+	public override void Run()
+	{
+		base.Run();
 
 		if (null == skillBase)
 		{
@@ -43,5 +52,5 @@
 		skillBase.Cast();
 
 		isCast = true;
-    }
+	}
 }
\ No newline at end of file
diff --git a/Main/System/Battle/BattleManager.cs b/Main/System/Battle/BattleManager.cs
index 177c95e..c695c77 100644
--- a/Main/System/Battle/BattleManager.cs
+++ b/Main/System/Battle/BattleManager.cs
@@ -159,6 +159,8 @@
                     }
                 }
 
+
+
                 // 鍚堝苟鎵�鏈夌浉鍏冲寘
                 CustomB421ActionPack actionPack = CustomB421ActionPack.CreateB421ActionPack(GetGUID(b421Pack.packUID), b421PackList);
 
@@ -191,7 +193,17 @@
 
 
         // b421璺焍426鐨勫寘宸茬粡澶勭悊瀹屼簡
-            packQueue = new Queue<GameNetPackBasic>(newPackList);
+        packQueue.Clear();
+        for (int i = 0; i < newPackList.Count; i++)
+        {
+            var pack = newPackList[i];
+
+            packQueue.Enqueue(pack);
+        }
+
+    
+
+            // packQueue = new Queue<GameNetPackBasic>(newPackList);
 
         DistributeNextPackage();
     }
diff --git a/Main/System/Battle/BattleUtility.cs b/Main/System/Battle/BattleUtility.cs
index 6f54c56..c37887b 100644
--- a/Main/System/Battle/BattleUtility.cs
+++ b/Main/System/Battle/BattleUtility.cs
@@ -251,6 +251,12 @@
         else if (_num == 109) return config.nums[12]; // 'm'
         else if (_num == 98)  return config.nums[13]; // 'b'
         else if (_num == 116) return config.nums[14]; // 't'
+        int targetNum = _num - 48;
+        if (targetNum >= config.nums.Length || targetNum < 0)
+        {
+            Debug.LogError("damage config " + config.TypeID + " _num is " +  _num + " out of range");
+            return _num;
+        }
         return config.nums[_num - 48];
     }
 
diff --git a/Main/System/Battle/RecordPlayer/RecordAction.cs b/Main/System/Battle/RecordPlayer/RecordAction.cs
index f5fc24a..7a992ab 100644
--- a/Main/System/Battle/RecordPlayer/RecordAction.cs
+++ b/Main/System/Battle/RecordPlayer/RecordAction.cs
@@ -14,12 +14,12 @@
 
     protected bool isRunOnce = false;
 
-	public RecordAction(RecordActionType _actionType, BattleField _battleField, BattleObject _battleObj)
-	{
-		actionType = _actionType;
+    public RecordAction(RecordActionType _actionType, BattleField _battleField, BattleObject _battleObj)
+    {
+        actionType = _actionType;
         battleField = _battleField;
         battleObject = _battleObj;
-	}
+    }
 
     public RecordActionType actionType;
 
@@ -30,7 +30,12 @@
 
     public virtual void Run()
     {
-        
+
+    }
+
+    public virtual void ForceFinish()
+    {
+        isFinish = true;
     }
 
 }
\ No newline at end of file
diff --git a/Main/System/Battle/RecordPlayer/RecordPlayer.cs b/Main/System/Battle/RecordPlayer/RecordPlayer.cs
index 14376d4..18fa70a 100644
--- a/Main/System/Battle/RecordPlayer/RecordPlayer.cs
+++ b/Main/System/Battle/RecordPlayer/RecordPlayer.cs
@@ -72,14 +72,13 @@
             for (int i = immediatelyActionList.Count - 1; i >= 0; i--)
             {
                 var action = immediatelyActionList[i];
-                if (action.IsFinished())
-                {
-                    removeIndexList.Add(i);
-                }
-                else
+                if (!action.IsFinished())
                 {
                     action.Run();
+                    continue;
                 }
+
+                removeIndexList.Add(i);
             }
 
             for (int i = removeIndexList.Count - 1; i >= 0; i--)
@@ -154,8 +153,23 @@
 
     public void HaveRest()
     {
+        for (int i = 0; i < immediatelyActionList.Count; i++)
+        {
+            immediatelyActionList[i].ForceFinish();
+        }
+
+        immediatelyActionList.Clear();
+
+        if (currentRecordAction != null)
+        {
+            currentRecordAction.ForceFinish();
+        }
         currentRecordAction = null;
-        recordActionQueue.Clear();
+
+        while (recordActionQueue.Count > 0)
+        {
+            recordActionQueue.Dequeue().ForceFinish();
+        }
     }
 
     public void Release()
diff --git a/Main/System/Battle/Skill/DirectlyHealSkill.cs b/Main/System/Battle/Skill/DirectlyHealSkill.cs
index cefe803..0df1017 100644
--- a/Main/System/Battle/Skill/DirectlyHealSkill.cs
+++ b/Main/System/Battle/Skill/DirectlyHealSkill.cs
@@ -15,33 +15,24 @@
 
 	}
 
-	public override void Run()
-	{
-		if (null != skillEffect)
-		{
-			skillEffect.Run();
-		}
 
-		base.Run();
-	}
+	// //	鍓嶆憞缁撴潫
+	// public override void OnStartSkillFrameEnd()
+	// {
+	// 	skillEffect = SkillEffectFactory.CreateSkillEffect(
+	// 			caster,
+	// 			skillConfig,
+	// 			tagUseSkillAttack
+	// 		);
+	// 	if (skillEffect != null)
+	// 	{
+	// 		skillEffect.Play(OnHitTargets);
+	// 	}
+	// }
 
-	//	鍓嶆憞缁撴潫
-	public override void OnStartSkillFrameEnd()
-	{
-		skillEffect = SkillEffectFactory.CreateSkillEffect(
-				caster,
-				skillConfig,
-				tagUseSkillAttack
-			);
-		if (skillEffect != null)
-		{
-			skillEffect.Play(OnHitTargets);
-		}
-	}
-
-	protected override void OnHitTargets(int _healIndex, List<HB427_tagSCUseSkill.tagSCUseSkillHurt> healList)
-	{
-		base.OnHitTargets(_healIndex, healList);
-    }
+	// protected override void OnHitTargets(int _healIndex, List<HB427_tagSCUseSkill.tagSCUseSkillHurt> healList)
+	// {
+	// 	base.OnHitTargets(_healIndex, healList);
+    // }
 
 }
\ No newline at end of file
diff --git a/Main/System/Battle/Skill/RebornSkill.cs b/Main/System/Battle/Skill/RebornSkill.cs
index 5443761..fefbc14 100644
--- a/Main/System/Battle/Skill/RebornSkill.cs
+++ b/Main/System/Battle/Skill/RebornSkill.cs
@@ -6,7 +6,6 @@
 
 public class RebornSkill : SkillBase
 {
-	protected SkillEffect skillEffect;
 
 	public RebornSkill(BattleObject _caster, SkillConfig _skillCfg,
 			HB427_tagSCUseSkill _vNetData, List<GameNetPackBasic> _packList, BattleField _battleField)
@@ -15,29 +14,6 @@
 
 	}
 
-	public override void Run()
-	{
-		if (null != skillEffect)
-		{
-			skillEffect.Run();
-		}
-
-		base.Run();
-	}
-
-	//	鍓嶆憞缁撴潫
-	public override void OnStartSkillFrameEnd()
-	{
-		skillEffect = SkillEffectFactory.CreateSkillEffect(
-				caster,
-				skillConfig,
-				tagUseSkillAttack
-			);
-		if (skillEffect != null)
-		{
-			skillEffect.Play(OnHitTargets);
-		}
-	}
 
 
 
diff --git a/Main/System/Battle/Skill/SkillBase.cs b/Main/System/Battle/Skill/SkillBase.cs
index 247d755..46a4383 100644
--- a/Main/System/Battle/Skill/SkillBase.cs
+++ b/Main/System/Battle/Skill/SkillBase.cs
@@ -106,7 +106,7 @@
 		switch (skillConfig.castMode)
 		{
 			case SkillCastMode.Self:
-				CastImpl();
+				CastImpl(OnAttackFinish);
 				break;
 			case SkillCastMode.Enemy:
 				CastToEnemy();
@@ -175,12 +175,8 @@
 						() =>
 						{
 							//	鍥炲埌鍘熸潵鐨勪綅缃�
-							MoveToTarget(battleField.GetTeamNode(caster.Camp, caster.teamHero.positionNum), Vector2.zero, moveTime, () =>
-							{
-								TurnBack(null, 1f);
-								caster.motionBase.PlayAnimation(MotionName.idle, true);
-								OnAllAttackMoveFinished();
-							});
+							MoveToTarget(battleField.GetTeamNode(caster.Camp, caster.teamHero.positionNum), Vector2.zero, moveTime, 
+								OnAttackFinish);
 						}
 					, -1f);
 				});
@@ -200,17 +196,13 @@
 			return;
 		}
 
-		var mainHurt = tagUseSkillAttack.HurtList[0];
+		int mainTargetPosNum = BattleUtility.GetMainTargetPositionNum(caster, tagUseSkillAttack.HurtList.ToList(), skillConfig);
 
-		BattleObject mainTarget = battleField.battleObjMgr.GetBattleObject((int)mainHurt.ObjID);
-		if (mainTarget == null)
-		{
-			Debug.LogError("鐩爣涓虹┖ mainTarget == null ObjID : " + mainHurt.ObjID);
-			OnSkillFinished();
-			return;
-		}
+		BattleCamp battleCamp = skillConfig.TagFriendly != 0 ? caster.Camp : caster.GetEnemyCamp();
 
-		MoveToTarget(mainTarget.heroRectTrans, new Vector2(skillConfig.CastDistance, 0), moveTime, () =>
+		RectTransform targetTrans = battleField.GetTeamNode(battleCamp, mainTargetPosNum);
+
+		MoveToTarget(targetTrans, new Vector2(skillConfig.CastDistance, 0), moveTime, () =>
 		{
 			//	鍒颁綅缃浆韬�(涓嶄竴瀹氶潪瑕佽浆韬� 浣嗘槸娴佺▼瑕佸啓)
 			TurnBack(() =>
@@ -222,12 +214,8 @@
 						() =>
 						{
 							//	鍥炲埌鍘熸潵鐨勪綅缃�
-							MoveToTarget(battleField.GetTeamNode(caster.Camp, caster.teamHero.positionNum), Vector2.zero, moveTime, () =>
-							{
-								TurnBack(null, 1f);
-								caster.motionBase.PlayAnimation(MotionName.idle, true);
-								OnAllAttackMoveFinished();
-							});
+							MoveToTarget(battleField.GetTeamNode(caster.Camp, caster.teamHero.positionNum), Vector2.zero, moveTime, 
+								OnAttackFinish);
 						}
 					, -1f);
 				});
@@ -256,17 +244,20 @@
 						() =>
 						{
 							//	鍥炲埌鍘熸潵鐨勪綅缃�
-							MoveToTarget(battleField.GetTeamNode(caster.Camp, caster.teamHero.positionNum), Vector2.zero, moveTime, () =>
-							{
-								TurnBack(null, 1f);
-								caster.motionBase.PlayAnimation(MotionName.idle, true);
-								OnAllAttackMoveFinished();
-							});
+							MoveToTarget(battleField.GetTeamNode(caster.Camp, caster.teamHero.positionNum),
+								Vector2.zero, moveTime, OnAttackFinish);
 						}
 					, -1f);
 				});
 			}, -1f);
 		});
+	}
+
+	protected void OnAttackFinish()
+	{
+		TurnBack(null, 1f);
+		OnAllAttackMoveFinished();
+		caster.motionBase.PlayAnimation(MotionName.idle, true);
 	}
 
 
@@ -294,7 +285,7 @@
 				skillConfig,
 				tagUseSkillAttack
 			);
-		if (skillEffect != null)
+		// if (skillEffect != null)
 		{
 			skillEffect.Play(OnHitTargets);
 		}
@@ -315,7 +306,7 @@
 	/// <param name="times"></param>
 	public virtual void OnMiddleFrameStart(int times)
 	{
-		if (skillEffect != null)
+		// if (skillEffect != null)
 		{
 			skillEffect.OnMiddleFrameStart(times);
 		}
@@ -323,7 +314,7 @@
 
 	public virtual void OnMiddleFrameEnd(int times, int hitIndex)
 	{
-		if (skillEffect != null)
+		// if (skillEffect != null)
 		{
 			skillEffect.OnMiddleFrameEnd(times, hitIndex);
 		}
@@ -334,7 +325,10 @@
 	/// </summary>
 	public virtual void OnFinalFrameStart()
 	{
-
+		// if (skillEffect != null)
+		{
+			skillEffect.OnFinalFrameStart();
+		}
 	}
 
 	/// <summary>
@@ -342,7 +336,12 @@
 	/// </summary>
 	public virtual void OnFinalFrameEnd()
 	{
+		// if (skillEffect != null)
+		{
+			skillEffect.OnFinalFrameEnd();
+		}
 
+		HandleDead();
 	}
 
 
@@ -375,7 +374,7 @@
 
 			OnHitEachTarget(_hitIndex, target, hurt);
 		}
-		HandleDead();
+		
 	}
 
 
@@ -587,7 +586,29 @@
 
 	public virtual void ForceFinished()
 	{
+		skillEffect?.ForceFinished();
 		isFinished = true;
+
+		while (packList.Count > 0)
+		{
+			var pack = packList[0];
+			packList.RemoveAt(0);
+
+			if (pack is CustomHB426CombinePack)
+			{
+				var combinePack = pack as CustomHB426CombinePack;
+				if (combinePack.startTag.Tag.StartsWith("Skill_"))
+				{
+					BattleDebug.LogError("other skill casting " + combinePack.startTag.Tag);
+					otherSkillAction = combinePack.CreateSkillAction();
+
+					//	寮哄埗缁撴潫鍏朵粬鎶�鑳�
+					otherSkillAction.ForceFinish();
+					return;
+				}
+			}
+			PackageRegedit.Distribute(pack);
+		}
 	}
 
 	public void OnSkillFinished()
diff --git a/Main/System/Battle/SkillEffect/BulletCurve/BulletCurve.cs b/Main/System/Battle/SkillEffect/BulletCurve/BulletCurve.cs
index 8e77a6c..7f1bcd3 100644
--- a/Main/System/Battle/SkillEffect/BulletCurve/BulletCurve.cs
+++ b/Main/System/Battle/SkillEffect/BulletCurve/BulletCurve.cs
@@ -74,5 +74,10 @@
         caster.battleField.battleEffectMgr.RemoveEffect(skillConfig.BulletEffectId, bulletEffect);
     }
 
+    public virtual void ForceFinish()
+    {
+        finished = true;
+    }
+
     public bool IsFinished => finished;
 }
\ No newline at end of file
diff --git a/Main/System/Battle/SkillEffect/BulletSkillEffect.cs b/Main/System/Battle/SkillEffect/BulletSkillEffect.cs
index c4112d5..cfa0549 100644
--- a/Main/System/Battle/SkillEffect/BulletSkillEffect.cs
+++ b/Main/System/Battle/SkillEffect/BulletSkillEffect.cs
@@ -127,6 +127,8 @@
 
         var bulletCurve = BulletCurveFactory.CreateBulletCurve(caster, skillConfig, effectPlayer, target, tagUseSkillAttack, (index, hitList) =>
         {
+            if (isFinish)
+                return;
             // 鍑讳腑灏遍攢姣佸瓙寮�
             caster.battleField.battleEffectMgr.RemoveEffect(skillConfig.BulletEffectId, effectPlayer);
             // 鎾斁瀛愬脊鐖嗙偢鐗规晥
@@ -165,6 +167,10 @@
 
         var bulletCurve = BulletCurveFactory.CreateBulletCurve(caster, skillConfig, effectPlayer, target.heroRectTrans, tagUseSkillAttack, (index, hitList) =>
         {
+            if (isFinish)
+                return;
+            
+
             foreach (var hurt in hitList)
             {
                 BattleObject targetObj = caster.battleField.battleObjMgr.GetBattleObject((int)hurt.ObjID);
@@ -218,6 +224,15 @@
         }
     }
 
+    public override void ForceFinished()
+    {
+        base.ForceFinished();
+        foreach (var bulletCurve in bulletCurves)
+        {
+            bulletCurve.ForceFinish();
+        }
+    }
+
     public override bool IsFinished()
     {
         bool isCurveFinish = false;
diff --git a/Main/System/Battle/SkillEffect/NormalSkillEffect.cs b/Main/System/Battle/SkillEffect/NormalSkillEffect.cs
index be52bf9..a124a4a 100644
--- a/Main/System/Battle/SkillEffect/NormalSkillEffect.cs
+++ b/Main/System/Battle/SkillEffect/NormalSkillEffect.cs
@@ -47,6 +47,14 @@
         }
 
         onHit?.Invoke(hitIndex, tagUseSkillAttack.HurtList.ToList());
+    }
+
+    /// <summary>
+    /// 鍚庢憞缁撴潫
+    /// </summary>
+    public override void OnFinalFrameEnd()
+    {
+        base.OnFinalFrameEnd();
         isFinish = true;
     }
 }
\ No newline at end of file
diff --git a/Main/System/Battle/SkillEffect/SkillEffect.cs b/Main/System/Battle/SkillEffect/SkillEffect.cs
index cb0c311..5acf824 100644
--- a/Main/System/Battle/SkillEffect/SkillEffect.cs
+++ b/Main/System/Battle/SkillEffect/SkillEffect.cs
@@ -51,8 +51,29 @@
         caster.battleField.battleEffectMgr.PlayEffect(caster.ObjID, skillConfig.MStartEffectId, caster.heroGo.transform, caster.Camp);
     }
     
+    /// <summary>
+    /// 鍚庢憞寮�濮�
+    /// </summary>
+    public virtual void OnFinalFrameStart()
+    {
+
+    }
+
+    /// <summary>
+    /// 鍚庢憞缁撴潫
+    /// </summary>
+    public virtual void OnFinalFrameEnd()
+    {
+
+    }
+    
     public virtual bool IsFinished()
     {
         return isFinish;
     }
+
+    public virtual void ForceFinished()
+    {
+        isFinish = true;
+    }
 }
\ No newline at end of file

--
Gitblit v1.8.0