From ca85c0a70922aa219f6cad5e8af8ad004c3cb4b3 Mon Sep 17 00:00:00 2001
From: yyl <yyl>
Date: 星期三, 05 十一月 2025 14:36:02 +0800
Subject: [PATCH] 125 战斗 天子血条刷新包

---
 Main/System/Battle/BattleField/BattleField.cs                                                 |   16 ++
 Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB419_tagSCObjHPRefresh.cs.meta |   11 +
 Main/Common/EventName.cs                                                                      |    2 
 Main/System/Battle/BattleUtility.cs                                                           |   43 ++++++
 Main/System/Battle/BattleObject/BattleObject.cs                                               |   29 +---
 Main/System/Battle/Skill/SkillBase.cs                                                         |   62 +++++++++
 Main/Core/NetworkPackage/ServerPack/HB4_FightDefine/HB419_tagSCObjHPRefresh.cs.meta           |   11 +
 Main/Core/NetworkPackage/ServerPack/HB4_FightDefine/HB419_tagSCObjHPRefresh.cs                |   25 ++++
 Main/System/Battle/Motion/MotionBase.cs                                                       |   95 +++++++++++++++
 Main/System/Battle/UIComp/BattleHeroInfoBar.cs                                                |   10 +
 Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB419_tagSCObjHPRefresh.cs      |   18 +++
 11 files changed, 288 insertions(+), 34 deletions(-)

diff --git a/Main/Common/EventName.cs b/Main/Common/EventName.cs
index 4b7b3c2..6c9ab2d 100644
--- a/Main/Common/EventName.cs
+++ b/Main/Common/EventName.cs
@@ -16,4 +16,6 @@
 	
 	public const string BATTLE_END = "BATTLE_END";//鎴樻枟缁撴潫
 	public const string RECORDPLAYER_END = "RECORDPLAYER_END"; //鎴樻枟灏忕墖娈电粨鏉�
+
+	public const string BATTLE_TIANZI_REFRESH_HP = "BATTLE_TIANZI_REFRESH_HP";//澶╁瓙鑰冮獙 鍒锋柊琛�閲�
 }
\ No newline at end of file
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB419_tagSCObjHPRefresh.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB419_tagSCObjHPRefresh.cs
new file mode 100644
index 0000000..3a4b134
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB419_tagSCObjHPRefresh.cs
@@ -0,0 +1,18 @@
+using UnityEngine;
+using System.Collections;
+
+// B4 19 瀵硅薄鏈�鏂扮敓鍛藉埛鏂� #tagSCObjHPRefresh
+
+public class DTCB419_tagSCObjHPRefresh : DtcBasic {
+    public override void Done(GameNetPackBasic vNetPack) {
+        base.Done(vNetPack);
+        HB419_tagSCObjHPRefresh vNetData = vNetPack as HB419_tagSCObjHPRefresh;
+
+        BattleField battleField = BattleManager.Instance.GetBattleField(vNetData.packUID);
+        if (null != battleField)
+        {
+            battleField.OnRefreshObjHP(vNetData);
+            battleField.DistributeNextPackage();
+        }
+    }
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB419_tagSCObjHPRefresh.cs.meta b/Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB419_tagSCObjHPRefresh.cs.meta
new file mode 100644
index 0000000..c6d9898
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB419_tagSCObjHPRefresh.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 3d2361817f6a81a4ea0d05eaf7b8f59e
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/ServerPack/HB4_FightDefine/HB419_tagSCObjHPRefresh.cs b/Main/Core/NetworkPackage/ServerPack/HB4_FightDefine/HB419_tagSCObjHPRefresh.cs
new file mode 100644
index 0000000..d8ded2d
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HB4_FightDefine/HB419_tagSCObjHPRefresh.cs
@@ -0,0 +1,25 @@
+using UnityEngine;
+using System.Collections;
+
+// B4 19 瀵硅薄鏈�鏂扮敓鍛藉埛鏂� #tagSCObjHPRefresh
+
+public class HB419_tagSCObjHPRefresh : GameNetPackBasic {
+    public uint ObjID;
+    public uint HP;    // 褰撳墠琛�閲忥紝姹備綑20浜块儴鍒�
+    public uint HPEx;    // 褰撳墠琛�閲忥紝鏁撮櫎20浜块儴鍒�
+    public uint MaxHP;    // 鏈�澶ц閲忥紝姹備綑20浜块儴鍒�
+    public uint MaxHPEx;    // 鏈�澶ц閲忥紝鏁撮櫎20浜块儴鍒�
+
+    public HB419_tagSCObjHPRefresh () {
+        _cmd = (ushort)0xB419;
+    }
+
+    public override void ReadFromBytes (byte[] vBytes) {
+        TransBytes (out ObjID, vBytes, NetDataType.DWORD);
+        TransBytes (out HP, vBytes, NetDataType.DWORD);
+        TransBytes (out HPEx, vBytes, NetDataType.DWORD);
+        TransBytes (out MaxHP, vBytes, NetDataType.DWORD);
+        TransBytes (out MaxHPEx, vBytes, NetDataType.DWORD);
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ServerPack/HB4_FightDefine/HB419_tagSCObjHPRefresh.cs.meta b/Main/Core/NetworkPackage/ServerPack/HB4_FightDefine/HB419_tagSCObjHPRefresh.cs.meta
new file mode 100644
index 0000000..29ebb11
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HB4_FightDefine/HB419_tagSCObjHPRefresh.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 4d172d7090e7f3b42958b6ce5bf20dc3
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Battle/BattleField/BattleField.cs b/Main/System/Battle/BattleField/BattleField.cs
index 34ed0ae..691ac3a 100644
--- a/Main/System/Battle/BattleField/BattleField.cs
+++ b/Main/System/Battle/BattleField/BattleField.cs
@@ -592,4 +592,20 @@
     {
         return null;
     }
+
+    public void OnRefreshObjHP(HB419_tagSCObjHPRefresh vNetData)
+    {
+        BattleObject battleObj = battleObjMgr.GetBattleObject((int)vNetData.ObjID);
+        if (null != battleObj)
+        {
+            battleObj.teamHero.curHp = GeneralDefine.GetFactValue(vNetData.HP, vNetData.HPEx);
+            battleObj.teamHero.maxHp = GeneralDefine.GetFactValue(vNetData.MaxHP, vNetData.MaxHPEx);
+            EventBroadcast.Instance.Broadcast<string, BattleObject>(
+                EventName.BATTLE_TIANZI_REFRESH_HP, guid, battleObj);
+
+            //battleObj.teamHero.curHp, battleObj.teamHero.maxHp
+        }
+
+
+    }
 }
diff --git a/Main/System/Battle/BattleObject/BattleObject.cs b/Main/System/Battle/BattleObject/BattleObject.cs
index f868dee..24b2e63 100644
--- a/Main/System/Battle/BattleObject/BattleObject.cs
+++ b/Main/System/Battle/BattleObject/BattleObject.cs
@@ -293,11 +293,12 @@
 
     public virtual void Hurt(List<long> damageValues, long _totalDamage,
         HB427_tagSCUseSkill.tagSCUseSkillHurt hurt, SkillConfig skillConfig, int hitIndex,
-        BattleDrops battleDrops, HB422_tagMCTurnFightObjDead deadPack)
+        BattleDrops battleDrops, HB422_tagMCTurnFightObjDead deadPack,
+        long fromHp, long toHp)
     {
         bool isLastHit = hitIndex >= skillConfig.DamageDivide.Length - 1;
         bool firstHit = hitIndex == 0;
-        BattleDmgInfo dmgInfo = PopDamage(damageValues, _totalDamage, hurt, skillConfig, isLastHit);
+        BattleDmgInfo dmgInfo = PopDamage(damageValues, _totalDamage, hurt, skillConfig, isLastHit, fromHp, toHp);
 
 
         //  杩欓噷
@@ -346,18 +347,16 @@
             }
 
         }
-
-
     }
 
     public void SuckHp(uint suckHP, SkillConfig skillConfig)
     {
-        teamHero.curHp = Math.Min(teamHero.maxHp, teamHero.curHp + (int)suckHP);
+        // teamHero.curHp = Math.Min(teamHero.maxHp, teamHero.curHp + (int)suckHP);
     }
 
     public void HurtByReflect(uint bounceHP, SkillConfig skillConfig)
     {
-        teamHero.curHp = Math.Max(0, teamHero.curHp - (int)bounceHP);
+        // teamHero.curHp = Math.Max(0, teamHero.curHp - (int)bounceHP);
     }
 
 
@@ -422,22 +421,14 @@
     }
 
     // 浼ゅ杩樿鐪� 鏄惁闂伩 鏆村嚮 and so on 闇�瑕佹湁涓�涓狣amageType 鏈嶅姟鍣ㄥ簲璇ヤ細缁�
-    protected virtual BattleDmgInfo PopDamage(List<long> damageValues, long _totalDamage, HB427_tagSCUseSkill.tagSCUseSkillHurt hurt, SkillConfig skillConfig, bool isLastHit)
+    protected virtual BattleDmgInfo PopDamage(List<long> damageValues, long _totalDamage, 
+        HB427_tagSCUseSkill.tagSCUseSkillHurt hurt, SkillConfig skillConfig, bool isLastHit,
+        long fromHp, long toHp)
     {
         BattleDmgInfo battleDmgInfo = new BattleDmgInfo(battleField.guid, damageValues, this, hurt, skillConfig, isLastHit);
 
-        int currentHurtHp = 0;
-        for (int i = 0; i < damageValues.Count; i++)
-        {
-            currentHurtHp += (int)damageValues[i];
-        }
-
-        bool isRecovery = battleDmgInfo.IsType(DamageType.Recovery);
-
-        long toHp = Math.Max(0, teamHero.curHp + (isRecovery ? currentHurtHp : -currentHurtHp));
-
-        heroInfoBar.UpdateHP(teamHero.curHp, toHp, teamHero.maxHp);
-        teamHero.curHp = toHp;
+        // 浣跨敤浼犲叆鐨� fromHp 鍜� toHp 鏇存柊琛�鏉℃樉绀�
+        heroInfoBar.UpdateHP(fromHp, toHp, teamHero.maxHp);
 
         // YYL TODO 鏄惁闇�瑕佹寕鍦ㄥ湪鑷韩鐨刦ollow鐐逛笂
         EventBroadcast.Instance.Broadcast(EventName.BATTLE_DAMAGE_TAKEN, battleDmgInfo);
diff --git a/Main/System/Battle/BattleUtility.cs b/Main/System/Battle/BattleUtility.cs
index 2f9276c..a315880 100644
--- a/Main/System/Battle/BattleUtility.cs
+++ b/Main/System/Battle/BattleUtility.cs
@@ -302,16 +302,53 @@
     /// </summary>
     public static List<long> DivideDamageToList(int[] damageDivide, long totalDamage)
     {
+        if (damageDivide == null || damageDivide.Length == 0)
+        {
+            Debug.LogError("damageDivide 涓虹┖鎴栭暱搴︿负0");
+            return new List<long> { totalDamage };
+        }
+
         List<long> fixedDamageList = new List<long>();
+        long accumulatedDamage = 0; // 绱宸插垎閰嶇殑浼ゅ
 
         for (int i = 0; i < damageDivide.Length; i++)
         {
-            float fixedDamage = (float)totalDamage * (float)damageDivide[i] / 10000f;
-            fixedDamageList.Add((int)fixedDamage);
+            long damage;
+            
+            // 鏈�鍚庝竴娆″垎閰嶏細鐢ㄦ�讳激瀹冲噺鍘诲凡鍒嗛厤鐨勪激瀹筹紝纭繚鎬诲拰绮剧‘
+            if (i == damageDivide.Length - 1)
+            {
+                damage = totalDamage - accumulatedDamage;
+            }
+            else
+            {
+                // 璁$畻褰撳墠鍒嗘浼ゅ锛堝悜涓嬪彇鏁达級
+                damage = (long)((float)totalDamage * (float)damageDivide[i] / 10000f);
+                accumulatedDamage += damage;
+            }
+            
+            fixedDamageList.Add(damage);
         }
-        
+
         return fixedDamageList;
     }
+    
+    public static HB419_tagSCObjHPRefresh FindObjHPRefreshPack(List<GameNetPackBasic> packList)
+    {
+        for (int i = 0; i < packList.Count; i++)
+        {
+            var pack = packList[i];
+            if (pack is HB419_tagSCObjHPRefresh hpRefreshPack)
+            {
+                return hpRefreshPack;
+            }
+            else if (pack is CustomHB426CombinePack)
+            {
+                break;
+            }
+        }
+        return null;
+    }
 
     public static List<HB422_tagMCTurnFightObjDead> FindDeadPack(List<GameNetPackBasic> packList)
     {
diff --git a/Main/System/Battle/Motion/MotionBase.cs b/Main/System/Battle/Motion/MotionBase.cs
index 5be8665..3a21f7c 100644
--- a/Main/System/Battle/Motion/MotionBase.cs
+++ b/Main/System/Battle/Motion/MotionBase.cs
@@ -23,7 +23,12 @@
     protected Spine.Skeleton skeleton;
     protected float defaultMixDuration = 0f;
     private Spine.TrackEntry currentTrack;
-    private Dictionary<int, Spine.TrackEntry> activeSkillTracks = new Dictionary<int, Spine.TrackEntry>(); // 鏀逛负瀛楀吀锛歵rackIndex -> TrackEntry
+    private Dictionary<int, Spine.TrackEntry> activeSkillTracks = new Dictionary<int, Spine.TrackEntry>();
+    
+    // 瀛愭妧鑳借建閬撴睜绠$悊锛堝湪Init涓垵濮嬪寲锛屼笉瑕佸湪杩欓噷鍒濆鍖栵級
+    private Queue<int> availableSubTracks;
+    private Dictionary<SkillBase, int> subSkillTrackMap = new Dictionary<SkillBase, int>();
+    
     private SkeletonIllusionShadow illusionShadow;
     private bool playingSkillAnim = false;
 
@@ -52,6 +57,11 @@
         if (animState != null)
             animState.Data.DefaultMix = defaultMixDuration;
 
+        // 鍒濆鍖栧瓙鎶�鑳借建閬撴睜
+        availableSubTracks = new Queue<int>();
+        for (int i = 1; i <= 8; i++)
+            availableSubTracks.Enqueue(i);
+
         PlayAnimation(MotionName.idle, true);
         SetupAnimationHandlers();
         
@@ -63,6 +73,8 @@
     {
         trackEntryCallbacks.Clear();
         activeSkillTracks.Clear();
+        availableSubTracks?.Clear();
+        subSkillTrackMap.Clear();
         if (animState != null)
         {
             animState.Complete -= OnAnimationComplete;
@@ -109,8 +121,8 @@
             return null;
         }
 
-        // 瀛愭妧鑳藉己鍒朵娇鐢ㄦ棤鍔ㄧ敾妯″紡锛屾垨鑰呭鏋滄病鏈夊姩鐢诲悕绉�
-        if (isSubSkill || string.IsNullOrEmpty(skillConfig.SkillMotionName))
+        // 濡傛灉娌℃湁鍔ㄧ敾鍚嶇О锛屼娇鐢ㄦ棤鍔ㄧ敾妯″紡
+        if (string.IsNullOrEmpty(skillConfig.SkillMotionName))
         {
             PlaySkillNoAnim(skillConfig, skillBase, onComplete, isSubSkill);
             return null;
@@ -136,13 +148,41 @@
         int frameCount = activeFrames.Length;
         float recoveryFrame = skillConfig.RecoveryFrames;
 
-        // 涓绘妧鑳界敤 track 0锛屽瓙鎶�鑳界敤 track 1
-        int trackIndex = isSubSkill ? 1 : 0;
+        // 杞ㄩ亾鍒嗛厤绛栫暐锛氫富鎶�鑳界敤 track 0锛屽瓙鎶�鑳戒粠杞ㄩ亾姹犲垎閰�
+        int trackIndex = 0;
+        if (isSubSkill)
+        {
+            if (availableSubTracks != null && availableSubTracks.Count > 0)
+            {
+                trackIndex = availableSubTracks.Dequeue();
+                subSkillTrackMap[skillBase] = trackIndex;
+            }
+            else
+            {
+                // 杞ㄩ亾姹犺�楀敖鎴栨湭鍒濆鍖栵紝鍥為��鍒版棤鍔ㄧ敾妯″紡
+                Debug.LogWarning($"瀛愭妧鑳借建閬撴睜宸叉弧鎴栨湭鍒濆鍖栵紝鎶�鑳絳skillConfig.SkillID}浣跨敤鏃犲姩鐢绘ā寮�");
+                PlaySkillNoAnim(skillConfig, skillBase, onComplete, isSubSkill);
+                return null;
+            }
+        }
+        
         Spine.TrackEntry skillTrack = null;
         
         if (hasAnim)
         {
             skillTrack = animState.SetAnimation(trackIndex, targetAnim, false);
+            if (null == skillTrack)
+            {
+                Debug.LogError($"鎶�鑳� {skillConfig.SkillID} 鍔ㄧ敾璁剧疆澶辫触");
+                // 濡傛灉鏄瓙鎶�鑳戒笖鍒嗛厤浜嗚建閬擄紝闇�瑕佸洖鏀�
+                if (isSubSkill && subSkillTrackMap.ContainsKey(skillBase))
+                {
+                    if (availableSubTracks != null)
+                        availableSubTracks.Enqueue(subSkillTrackMap[skillBase]);
+                    subSkillTrackMap.Remove(skillBase);
+                }
+                return null;
+            }
             
             // 鍙湁涓绘妧鑳芥墠鏇存柊 currentTrack
             if (!isSubSkill)
@@ -175,6 +215,14 @@
                 {
                     if (activeSkillTracks[trackIndex] == skillTrack)
                         activeSkillTracks.Remove(trackIndex);
+                }
+                
+                // 鍥炴敹瀛愭妧鑳借建閬�
+                if (isSubSkill && subSkillTrackMap.ContainsKey(skillBase))
+                {
+                    if (availableSubTracks != null)
+                        availableSubTracks.Enqueue(subSkillTrackMap[skillBase]);
+                    subSkillTrackMap.Remove(skillBase);
                 }
                 
                 // 鍙湁褰撴病鏈夊叾浠栨椿璺冩妧鑳芥椂鎵嶅浣� playingSkillAnim
@@ -214,6 +262,15 @@
 
                     // 娓呯悊骞剁‘淇濈姸鎬佸浣�
                     RemoveAction(frameHandler);
+                    
+                    // 鍥炴敹瀛愭妧鑳借建閬�
+                    if (isSubSkill && subSkillTrackMap.ContainsKey(skillBase))
+                    {
+                        if (availableSubTracks != null)
+                            availableSubTracks.Enqueue(subSkillTrackMap[skillBase]);
+                        subSkillTrackMap.Remove(skillBase);
+                    }
+                    
                     if (activeSkillTracks.Count == 0)
                         playingSkillAnim = false;
                     return;
@@ -227,6 +284,15 @@
                     RemoveAction(frameHandler);
                     if (activeSkillTracks.ContainsKey(trackIndex))
                         activeSkillTracks.Remove(trackIndex);
+                    
+                    // 鍥炴敹瀛愭妧鑳借建閬�
+                    if (isSubSkill && subSkillTrackMap.ContainsKey(skillBase))
+                    {
+                        if (availableSubTracks != null)
+                            availableSubTracks.Enqueue(subSkillTrackMap[skillBase]);
+                        subSkillTrackMap.Remove(skillBase);
+                    }
+                    
                     if (activeSkillTracks.Count == 0)
                         playingSkillAnim = false;
                     return;
@@ -303,6 +369,14 @@
                     {
                         if (activeSkillTracks[trackIndex] == skillTrack)
                             activeSkillTracks.Remove(trackIndex);
+                    }
+
+                    // 鍥炴敹瀛愭妧鑳借建閬�
+                    if (isSubSkill && subSkillTrackMap.ContainsKey(skillBase))
+                    {
+                        if (availableSubTracks != null)
+                            availableSubTracks.Enqueue(subSkillTrackMap[skillBase]);
+                        subSkillTrackMap.Remove(skillBase);
                     }
 
                     // 鍙湁褰撴病鏈夊叾浠栨椿璺冩妧鑳芥椂鎵嶅浣� playingSkillAnim
@@ -436,6 +510,17 @@
         trackEntryCallbacks.Clear();
         runningActions.Clear();
         activeSkillTracks.Clear();
+        
+        // 閲嶇疆瀛愭妧鑳借建閬撴睜
+        if (availableSubTracks == null)
+            availableSubTracks = new Queue<int>();
+        else
+            availableSubTracks.Clear();
+            
+        subSkillTrackMap.Clear();
+        for (int i = 1; i <= 8; i++)
+            availableSubTracks.Enqueue(i);
+        
         playingSkillAnim = false;
         PlayAnimation(MotionName.idle, true);
     }
diff --git a/Main/System/Battle/Skill/SkillBase.cs b/Main/System/Battle/Skill/SkillBase.cs
index 1bfa376..3a768c0 100644
--- a/Main/System/Battle/Skill/SkillBase.cs
+++ b/Main/System/Battle/Skill/SkillBase.cs
@@ -339,6 +339,7 @@
     public void OnSkillStart()
     {
         HandleDead();
+        
         skillEffect = SkillEffectFactory.CreateSkillEffect(caster, skillConfig, tagUseSkillAttack);
         skillEffect.Play(OnHitTargets);
         foreach (var subSkillPack in tagUseSkillAttack.subSkillList)
@@ -374,6 +375,7 @@
     // 鎶�鑳藉悗鎽囩粨鏉熷洖璋冿細閫氱煡鎶�鑳芥晥鏋滃鐞嗗悗鎽囩粨鏉�
     public virtual void OnFinalFrameEnd()
     {
+        
         skillEffect?.OnFinalFrameEnd(); // 淇锛氭坊鍔犵┖鍊兼鏌�
     }
 
@@ -432,9 +434,10 @@
         }
     }
 
-    // 澶勭悊鍗曚釜鐩爣琚懡涓細搴旂敤浼ゅ鍜屾柦娉曡�呮晥鏋�
+    // 澶勭悊鍗曚釜鐩爣琚懡涓�:搴旂敤浼ゅ鍜屾柦娉曡�呮晥鏋�
     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)
         {
@@ -453,21 +456,70 @@
             }
         }
 
-        // 浼ゅ鍒嗗竷璁$畻鍜屽簲鐢�
+        // 璁$畻鎬讳激瀹冲拰鍒嗘浼ゅ鍒楄〃
         long totalDamage = GeneralDefine.GetFactValue(hurt.HurtHP, hurt.HurtHPEx);
         List<long> damageList = BattleUtility.DivideDamageToList(damageDivide.ToArray(), totalDamage);
 
-        // 鑾峰彇涓存椂鏁版嵁骞跺簲鐢ㄤ激瀹�
+        // ============ 绗簩姝�:鍒锋柊瀹為檯琛�閲� ============
+        long fromHp = target.teamHero.curHp;
+        
+        // 璁$畻褰撳墠杩欎竴鍑荤殑瀹為檯浼ゅ(鎵�鏈夊垎娈典激瀹充箣鍜�)
+        long currentHitDamage = 0;
+        foreach (long dmg in damageList)
+        {
+            currentHitDamage += dmg;
+        }
+
+        long toHp = Math.Max(0, fromHp - currentHitDamage);
+
+        // 鏇存柊鐩爣琛�閲�
+        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" +
+            $"琛�閲忓彉鍖�: {fromHp} -> {toHp}"
+        );
+#endif
+        
+        // 鍙湪鏈�鍚庝竴鍑绘椂鍚屾HP鍒锋柊鍖�
+        bool isLastHit = _hitIndex >= skillConfig.DamageDivide.Length - 1;
+        if (isLastHit)
+        {
+            HandleRefreshHP(hurt);
+        }
+
+        // ============ 绗笁姝�:鑾峰彇涓存椂鏁版嵁(鎺夎惤銆佹浜$瓑) ============
         int objID = (int)target.ObjID;
         tempDropList.TryGetValue(objID, out BattleDrops battleDrops);
         tempDeadPackList.TryGetValue(objID, out HB422_tagMCTurnFightObjDead deadPack);
-        target.Hurt(damageList, totalDamage, hurt, skillConfig, _hitIndex, battleDrops, deadPack);
 
-        // 澶勭悊鏂芥硶鑰呯浉鍏虫晥鏋�
+        // ============ 绗洓姝�:鎵ц琛ㄧ幇(椋樺瓧銆佸姩鐢荤瓑) ============
+        target.Hurt(damageList, totalDamage, hurt, skillConfig, _hitIndex, battleDrops, deadPack, fromHp, toHp);
+
+        // ============ 绗簲姝�:澶勭悊鏂芥硶鑰呯浉鍏虫晥鏋� ============
         caster.SuckHp(hurt.SuckHP, skillConfig);
         caster.HurtByReflect(hurt.BounceHP, skillConfig);
     }
 
+    // 澶勭悊HP鍒锋柊鍖咃紙绠�鍖栭�昏緫锛�
+    private void HandleRefreshHP(HB427_tagSCUseSkill.tagSCUseSkillHurt hurt)
+    {
+        // 鏌ユ壘HP鍒锋柊鍖�
+        HB419_tagSCObjHPRefresh refreshPack = BattleUtility.FindObjHPRefreshPack(packList);
+
+        if (refreshPack != null)
+        {
+            // 鍒嗗彂HP鍒锋柊鍖�
+            PackageRegedit.Distribute(refreshPack);
+            packList.Remove(refreshPack);
+        }
+    }
+
     // 澶勭悊姝讳骸鐩稿叧閫昏緫锛氬垎閰嶆帀钀藉拰缁忛獙
     protected void HandleDead()
     {
diff --git a/Main/System/Battle/UIComp/BattleHeroInfoBar.cs b/Main/System/Battle/UIComp/BattleHeroInfoBar.cs
index 859cb6b..afa14e0 100644
--- a/Main/System/Battle/UIComp/BattleHeroInfoBar.cs
+++ b/Main/System/Battle/UIComp/BattleHeroInfoBar.cs
@@ -150,11 +150,14 @@
     {
         KillTween(ref hpTween);
         
+        float fromValue = (float)fromHp / (float)maxHp;
         float targetValue = (float)toHp / (float)maxHp;
         
         if (tween)
         {
-            hpTween = sliderHp.DOValue(targetValue, 0.3f);
+            // 鍏抽敭淇:鍏堣缃捣濮嬪��,鍐嶆挱鏀惧姩鐢诲埌鐩爣鍊�
+            sliderHp.value = fromValue;  // 鈫� 杩欒鏄叧閿�!
+            hpTween = sliderHp.DOValue(targetValue, 0.3f).SetAutoKill(false);
             battleObject.battleField.battleTweenMgr.OnPlayTween(hpTween);
         }
         else
@@ -170,11 +173,14 @@
     {
         KillTween(ref xpTween);
         
+        float fromValue = (float)fromXp / (float)maxXp;
         float targetValue = (float)toXp / (float)maxXp;
         
         if (tween)
         {
-            xpTween = sliderXp.DOValue(targetValue, 0.2f);
+            // 鍚屾牱鐨勪慨澶�
+            sliderXp.value = fromValue;  // 鈫� 杩欒鏄叧閿�!
+            xpTween = sliderXp.DOValue(targetValue, 0.2f).SetAutoKill(false);
             battleObject.battleField.battleTweenMgr.OnPlayTween(xpTween);
         }
         else

--
Gitblit v1.8.0