From 89343a7a0909e5244a3b69c4db1294de4536243b Mon Sep 17 00:00:00 2001
From: lcy <1459594991@qq.com>
Date: 星期一, 15 十二月 2025 18:15:22 +0800
Subject: [PATCH] 262 幻境阁系统-客户端 新增仅适用武将解锁的头像和形象的红点移除规则

---
 Main/System/Battle/BattleObject/BattleObject.cs |  450 +++++++++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 393 insertions(+), 57 deletions(-)

diff --git a/Main/System/Battle/BattleObject/BattleObject.cs b/Main/System/Battle/BattleObject/BattleObject.cs
index f7b532a..41176c9 100644
--- a/Main/System/Battle/BattleObject/BattleObject.cs
+++ b/Main/System/Battle/BattleObject/BattleObject.cs
@@ -32,13 +32,13 @@
 
     public BattleObjectBuffMgr buffMgr;
 
+    public BattleObjectLayerMgr layerMgr;
+
     public int ObjID { get; set; }
 
     public BattleCamp Camp { get; protected set; }
 
     public TeamHero teamHero { get; protected set; }
-
-    // public BuffMgr buffMgr;
 
     public MotionBase motionBase;
 
@@ -48,7 +48,7 @@
         private set;
     }
 
-    protected BattleDrops battleDrops;
+    protected BattleDrops m_battleDrops;
 
     private RectTransform m_heroRectTrans;
 
@@ -83,10 +83,14 @@
         teamHero = _teamHero;
         Camp = _camp;
         motionBase = new MotionBase();
-        motionBase.Init(heroGo.GetComponentInChildren<SkeletonGraphic>(true));
-        motionBase.onAnimationComplete += OnAnimationComplete;
+        motionBase.Init(heroGo.GetComponentInChildren<SkeletonAnimation>(true));
         buffMgr = new BattleObjectBuffMgr();
         buffMgr.Init(this);
+
+        buffMgr.onIsControlChanged += OnControledChange;
+
+        layerMgr = new BattleObjectLayerMgr();
+        layerMgr.Init(this);
 
         renderers = heroGo.GetComponentsInChildren<Renderer>(true);
 
@@ -97,7 +101,16 @@
         var heroInfoBarScale = heroInfoBar.transform.localScale;
         heroInfoBarScale.x *= Camp == BattleCamp.Red ? 1 : -1;
         heroInfoBar.transform.localScale = heroInfoBarScale;
-
+        if (battleField is StoryBattleField && (battleField as StoryBattleField).battleState == StoryBattleState.Break)
+        {
+            //涓荤嚎鍏冲崱浼戞伅涓殑涓嶆樉绀鸿鏉�
+            heroInfoBar.SetActive(false);
+        }
+        else
+        {
+            heroInfoBar.SetActive(true);
+        }
+        SetFront();
     }
 
 
@@ -105,6 +118,7 @@
     {
         motionBase.Run();
         heroInfoBar.Run();
+        buffMgr.Run();
     }
 
     public virtual void Pause()
@@ -119,10 +133,12 @@
 
     public virtual void Destroy()
     {
-        motionBase.onAnimationComplete -= OnAnimationComplete;
 
         motionBase.Release();
         motionBase = null;
+        buffMgr.onIsControlChanged -= OnControledChange;
+        buffMgr.Release();
+        buffMgr = null;
         teamHero = null;
         ObjID = 0;
 
@@ -133,28 +149,80 @@
         }
     }
 
+    //  鏈夊彉鍖栦簡鎵嶄細璋冪敤杩欎釜鍑芥暟
+    private void OnControledChange(int groupType, bool value)
+    {
+        //  杩欓噷鏄彈鍒扮‖鎺ф椂鍊� 闇�瑕佽〃鐜扮殑鍔ㄧ敾
+        if (groupType == BattleConst.HardControlGroup)
+        {
+            //  浠庢病琚‖鎺у埌琚‖鎺�
+            if (value)
+            {
+                motionBase.SetControledAnimation();
+            }
+            else
+            {
+                motionBase.CancelControledAnimation();
+            }
+        }
+    }
+
     public void OnObjInfoRefresh(H0418_tagObjInfoRefresh _refreshInfo)
     {
+        // 澶╁瓙鐨勬寫鎴樻嫤鎴鏉�,涓嶆嫤鎴�掓皵
+        BattleObject boss = battleField.FindBoss();
+        if (boss != null && battleField.MapID == 30020 && boss.ObjID == _refreshInfo.ObjID && _refreshInfo.RefreshType != (ushort)PlayerDataType.XP)
+            return;
         switch ((PlayerDataType)_refreshInfo.RefreshType)
         {
             case PlayerDataType.HP:
                 long toHp = GeneralDefine.GetFactValue(_refreshInfo.Value, _refreshInfo.ValueEx);
-                heroInfoBar.UpdateHP(teamHero.curHp, toHp, teamHero.maxHp);
+                heroInfoBar.UpdateHP(teamHero.curHp, toHp, teamHero.maxHp, false);
                 teamHero.curHp = GeneralDefine.GetFactValue(_refreshInfo.Value, _refreshInfo.ValueEx);
+                // Debug.LogError("OnObjInfoRefresh " + teamHero.curHp);
                 break;
             case PlayerDataType.MaxHP:
                 teamHero.maxHp = GeneralDefine.GetFactValue(_refreshInfo.Value, _refreshInfo.ValueEx);
+                heroInfoBar.UpdateHP(teamHero.curHp, teamHero.curHp, teamHero.maxHp, false);
                 break;
             case PlayerDataType.XP:
                 long toXp = GeneralDefine.GetFactValue(_refreshInfo.Value, _refreshInfo.ValueEx);
-                heroInfoBar.UpdateHP(teamHero.rage, toXp, 100);
+                heroInfoBar.UpdateXP(teamHero.rage, toXp, 100);
                 teamHero.rage = (int)GeneralDefine.GetFactValue(_refreshInfo.Value, _refreshInfo.ValueEx);
                 break;
             default:
-                BattleDebug.LogError("BattleObject.ObjInfoRefresh 鍑虹幇鎰忓绫诲瀷 " + _refreshInfo.RefreshType.ToString());
+                Debug.LogError("BattleObject.ObjInfoRefresh 鍑虹幇鎰忓绫诲瀷 " + _refreshInfo.RefreshType.ToString());
                 break;
         }
     }
+
+    // public void ObjPropertyRefreshView(HB418_tagSCObjPropertyRefreshView vNetData)
+    // {
+    //     // 澶╁瓙鐨勬寫鎴樻嫤鎴鏉�,涓嶆嫤鎴�掓皵
+    //     BattleObject boss = battleField.FindBoss();
+    //     if (boss != null && battleField.MapID == 30020 && boss.ObjID == vNetData.ObjID && vNetData.RefreshType != (ushort)PlayerDataType.XP)
+    //         return;
+    //     switch ((PlayerDataType)vNetData.RefreshType)
+    //     {
+    //         case PlayerDataType.HP:
+    //             long toHp = GeneralDefine.GetFactValue(vNetData.Value, vNetData.ValueEx);
+    //             heroInfoBar.UpdateHP(teamHero.curHp, toHp, teamHero.maxHp, false);
+    //             teamHero.curHp = GeneralDefine.GetFactValue(vNetData.Value, vNetData.ValueEx);
+    //             break;
+    //         case PlayerDataType.MaxHP:
+    //             teamHero.maxHp = GeneralDefine.GetFactValue(vNetData.Value, vNetData.ValueEx);
+    //             heroInfoBar.UpdateHP(teamHero.curHp, teamHero.curHp, teamHero.maxHp, false);
+    //             break;
+    //         case PlayerDataType.XP:
+    //             long toXp = GeneralDefine.GetFactValue(vNetData.Value, vNetData.ValueEx);
+    //             heroInfoBar.UpdateXP(teamHero.rage, toXp, 100);
+    //             teamHero.rage = (int)GeneralDefine.GetFactValue(vNetData.Value, vNetData.ValueEx);
+    //             break;
+    //         default:
+    //             Debug.LogError("BattleObject.ObjPropertyRefreshView 鍑虹幇鎰忓绫诲瀷 " + vNetData.RefreshType.ToString());
+    //             break;
+    //     }
+    // }
 
     //  鐪╂檿
     public bool IsStunned()
@@ -239,97 +307,229 @@
         return true;
     }
 
-    public virtual void Hurt(List<long> damageValues, long _totalDamage, uint attackType)
+    public virtual void Hurt(BattleHurtParam battleHurtParam)
     {
-        PopDamage(teamHero.curHp, damageValues, attackType);
-
-        motionBase.PlayAnimation(MotionName.hit, false);
-
-        //  鎵h
+        bool isLastHit = battleHurtParam.hitIndex >= battleHurtParam.skillConfig.DamageDivide.Length - 1;
+        bool firstHit = battleHurtParam.hitIndex == 0;
         
-        teamHero.curHp -= _totalDamage;
+        // 娣诲姞璋冭瘯鏃ュ織
+        bool isHealing = BattleUtility.IsHealing(battleHurtParam.hurt);
+    
+        BattleDmgInfo dmgInfo = PopDamage(battleHurtParam);
+
+
+        // ============ 搴旂敤鐩爣鐨勮閲忓拰鎶ょ浘鍙樺寲 ============
+        ApplyHurtToTarget(battleHurtParam, isLastHit);
+
+        //  杩欓噷
+        if (dmgInfo.IsType(DamageType.Dodge) /*&& !buffMgr.isControled[BattleConst.HardControlGroup]*/)//濡傛灉琚帶鍒朵簡杩橀棯閬夸簡 瑕佺湅鐪嬫湇鍔″櫒鎬庝箞澶勭悊浜�
+        {
+            if (isLastHit)
+            {
+                DodgeFinishAction dodgeFinish = new DodgeFinishAction(battleField, this);
+                battleField.recordPlayer.InsertRecord(dodgeFinish);
+            }
+
+            if (firstHit)
+            {
+                OnDodgeBegin();
+            }
+        }
+
+        bool isFatalAttack = (null != battleHurtParam.deadPack) && isLastHit;
+
+        if (isFatalAttack)
+        {
+            if (null != battleHurtParam.battleDrops)
+            {
+                PushDropItems(battleHurtParam.battleDrops);
+            }
+            battleField.OnObjsDead(new List<BattleDeadPack>() { battleHurtParam.deadPack });
+
+        }
+        else
+        {
+            if (dmgInfo.IsType(DamageType.Block))
+            {
+                battleField.battleEffectMgr.PlayEffect(this, BattleConst.BlockEffectID, heroRectTrans, Camp, teamHero.modelScale);
+            }
+            // else
+            // {
+            if ((dmgInfo.IsType(DamageType.Damage) || dmgInfo.IsRealdamage()))
+            {
+                if (!buffMgr.isControled[BattleConst.HardControlGroup])
+                {
+                    battleField.soundManager.PlayEffectSound(teamHero.heroConfig.HitSFX, false);
+                    motionBase.PlayAnimation(MotionName.hit, false);
+                }
+            }
+            // }
+
+        }
     }
 
-    public void SuckHp(uint suckHP)
+    /// <summary>
+    /// 搴旂敤鐩爣鐨勮閲忓拰鎶ょ浘鍙樺寲
+    /// </summary>
+    private void ApplyHurtToTarget(BattleHurtParam battleHurtParam, bool isLastHit)
     {
-
-    }
-
-    public void HurtByReflect(uint bounceHP)
-    {
+        BattleHurtObj hurter = battleHurtParam.hurter;
         
+        // 搴旂敤琛�閲忓彉鍖�
+        teamHero.curHp = hurter.toHp;
+        
+        // foreach (var obj in battleField.battleObjMgr.allBattleObjDict.Values)
+        // {
+        //     Debug.LogError($"[ApplyHurtToTarget] ObjID: {obj.ObjID}, Name: {obj.teamHero.heroConfig.Name}, CurHp: {obj.teamHero.curHp}, MaxHp: {obj.teamHero.maxHp} Skill {battleHurtParam.hB427_TagSCUseSkill.packUID} ");
+        // }
+
+
+#if UNITY_EDITOR
+        // 鏈�鍚庝竴鍑绘椂楠岃瘉琛�閲忔槸鍚︿笌鏈嶅姟鍣ㄤ竴鑷�
+        if (isLastHit)
+        {
+            BattleUtility.ValidateHpConsistency(battleHurtParam, "鐩爣鍙椾激");
+        }
+#endif
     }
 
+    const float pingpongTime = 0.4f;
     //  闂伩寮�濮�
     public virtual void OnDodgeBegin()
     {
-        float pingpongTime = 0.2f;
         RectTransform rectTrans = heroRectTrans;
-        var tween = rectTrans.DOAnchorPos(new Vector3(-50, 50, 0), pingpongTime)
+        var tween = rectTrans.DOAnchorPos(new Vector3(-30, 0, 0), pingpongTime)
             .SetEase(Ease.OutCubic);
+
+        motionBase.ShowIllusionShadow(true);
+
+        DamageNumConfig damageNumConfig = DamageNumConfig.Get((int)DamageType.Dodge);
+
+        string dodgeStr = ((char)damageNumConfig.prefix).ToString();
+
+        heroInfoBar.ShowTips(dodgeStr, true, false);
+
+        tween.onComplete += () =>
+        {
+            motionBase.ShowIllusionShadow(false);
+        };
+
+
+        battleField.soundManager.PlayEffectSound(BattleConst.DodgeSoundID);
 
         battleField.battleTweenMgr.OnPlayTween(tween);
     }
 
     //  闂伩缁撴潫
-    public virtual void OnDodgeEnd()
+    public virtual void OnDodgeEnd(Action _complete = null)
     {
-        float pingpongTime = 0.2f;
         RectTransform rectTrans = heroRectTrans;
 
         var tween = rectTrans.DOAnchorPos(Vector3.zero, pingpongTime)
                             .SetEase(Ease.OutCubic);
 
+        tween.onComplete += () =>
+        {
+            _complete?.Invoke();
+        };
+
         battleField.battleTweenMgr.OnPlayTween(tween);
     }
 
-    public virtual void OnDeath(Action _onDeathAnimationComplete)
+    public virtual void OnDeath(Action _onDeathAnimationComplete, bool withoutAnime = false)
     {
-        BattleDebug.LogError(ObjID + " OnDeath called");
-        onDeathAnimationComplete = _onDeathAnimationComplete;
-        motionBase.PlayAnimation(MotionName.dead, false);
+        buffMgr.RemoveAllBuff();
+        battleField.soundManager.PlayEffectSound(teamHero.heroConfig.DeathSFX, false);
+        if (withoutAnime)
+        {
+            SetDeath();
+            _onDeathAnimationComplete?.Invoke();
+        }
+        else
+        {
+            motionBase.PlayDeadAnimation(() =>
+            {
+                SetDeath();
+                _onDeathAnimationComplete?.Invoke();
+            });
+        }
     }
 
-    protected virtual void OnAnimationComplete(MotionName motionName)
+    public void SetDeath()
     {
-        if (motionName == MotionName.dead)
-        {
-            OnDeadAnimationComplete();
-            onDeathAnimationComplete?.Invoke();
-            onDeathAnimationComplete = null;
-        }
+        teamHero.isDead = true;
+        OnDeadAnimationComplete();
     }
 
     protected virtual void OnDeadAnimationComplete()
     {
         //  鎴栬鐪嬬湅婧惰В鐗规晥锛� YYL TODO
         heroGo.SetActive(false);
+
+        //  闃叉缁欐浜″璞″張涓奲uff
+        buffMgr.RemoveAllBuff();
     }
 
-    public void OnReborn(HB423_tagMCTurnFightObjReborn vNetData)
+    public void OnReborn(HB427_tagSCUseSkill.tagSCUseSkillHurt vNetData)
     {
         // 澶勭悊澶嶆椿閫昏緫
-        teamHero.curHp = GeneralDefine.GetFactValue(vNetData.HP, vNetData.HPEx);
-        heroGo.SetActive(true);
-        motionBase.PlayAnimation(MotionName.idle, true);
+        RebornRecordAction recordAction = new RebornRecordAction(battleField, this, () =>
+        {
+            battleField.OnObjReborn((uint)ObjID);
+
+            teamHero.curHp = GeneralDefine.GetFactValue(vNetData.CurHP, vNetData.CurHPEx);
+            heroRectTrans.anchoredPosition = Vector2.zero;
+            // Debug.LogError("OnReborn " + teamHero.curHp);
+            teamHero.isDead = false;
+            heroGo.SetActive(true);
+            motionBase.ResetForReborn();
+        });
+        battleField.recordPlayer.InsertRecord(recordAction);
     }
 
     // 浼ゅ杩樿鐪� 鏄惁闂伩 鏆村嚮 and so on 闇�瑕佹湁涓�涓狣amageType 鏈嶅姟鍣ㄥ簲璇ヤ細缁�
-    protected virtual void PopDamage(long curHp, List<long> damageValues, uint attackType)
+    protected virtual BattleDmgInfo PopDamage(BattleHurtParam battleHurtParam)
     {
-        //  鍏跺疄搴旇閫氱煡鍑哄幓缁橴I鐣岄潰瑙h�� 璁︰I鐣岄潰鑷繁鏉ユ樉绀虹殑 YYL TODO
-        //  鎾斁浼ゅ鏁板瓧
-        //  杩欓噷鍙互瀹炵幇涓�涓激瀹虫暟瀛楃殑寮瑰嚭鏁堟灉
-        //  姣斿浣跨敤涓�涓猆I缁勪欢鏉ユ樉绀轰激瀹虫暟瀛�
-        foreach (var damage in damageValues)
+        BattleDmgInfo battleDmgInfo = new BattleDmgInfo(battleField.guid, battleHurtParam);
+        // 澶╁瓙鐨勬寫鎴樻嫤鎴鏉¢�昏緫
+        BattleObject boss = battleField.FindBoss();
+        // 淇锛歜attleHurtParam.hurtObj.ObjID -> battleHurtParam.hurter.hurtObj.ObjID
+        if (boss != null && battleField.MapID == 30020 && boss.ObjID == battleHurtParam.hurter.hurtObj.ObjID)
         {
-            Debug.Log($"Damage: {damage}");
+            EventBroadcast.Instance.Broadcast(EventName.BATTLE_DAMAGE_TAKEN, battleDmgInfo);
+            return battleDmgInfo;
+        }
+        else
+        {
+            heroInfoBar.UpdateDamage(battleDmgInfo);
+
+            // YYL TODO 鏄惁闇�瑕佹寕鍦ㄥ湪鑷韩鐨刦ollow鐐逛笂
+            EventBroadcast.Instance.Broadcast(EventName.BATTLE_DAMAGE_TAKEN, battleDmgInfo);
+            return battleDmgInfo;
         }
 
-        BattleDmgInfo battleDmgInfo = new BattleDmgInfo(battleField.guid, damageValues, this, (int)attackType);
+    }
 
-        // YYL TODO 鏄惁闇�瑕佹寕鍦ㄥ湪鑷韩鐨刦ollow鐐逛笂
-        EventBroadcast.Instance.Broadcast(EventName.BATTLE_DAMAGE_TAKEN, battleDmgInfo);
+    /// <summary>
+    /// 涓烘柦娉曡�呭垱寤轰激瀹充俊鎭紙鍚歌/鍙嶄激锛�
+    /// </summary>
+    protected virtual BattleDmgInfo PopDamageForCaster(BattleHurtParam battleHurtParam)
+    {
+        // 浼犲叆 isCasterView=true 琛ㄧず杩欐槸鏂芥硶鑰呰瑙�
+        BattleDmgInfo battleDmgInfo = new BattleDmgInfo(battleField.guid, battleHurtParam, isCasterView: true);
+        
+        BattleObject boss = battleField.FindBoss();
+        if (boss != null && battleField.MapID == 30020 && boss.ObjID == this.ObjID)
+        {
+            EventBroadcast.Instance.Broadcast(EventName.BATTLE_DAMAGE_TAKEN, battleDmgInfo);
+            return battleDmgInfo;
+        }
+        else
+        {
+            heroInfoBar.UpdateDamage(battleDmgInfo);
+            EventBroadcast.Instance.Broadcast(EventName.BATTLE_DAMAGE_TAKEN, battleDmgInfo);
+            return battleDmgInfo;
+        }
     }
 
     public RectTransform GetAliasTeamNode()
@@ -353,31 +553,105 @@
         //  浼戞伅鐘舵��
         //  澶氫竴涓獄zz鐨勪竴涓壒鏁�
         heroGo.SetActive(true);
-        motionBase.PlayAnimation(MotionName.idle, true);
+        motionBase.HaveRest();
         heroRectTrans.anchoredPosition = Vector2.zero;
+
+        heroInfoBar.SetActive(false);
+        SetFront();
     }
 
     public void PushDropItems(BattleDrops _battleDrops)
     {
-        battleDrops = _battleDrops;
+        m_battleDrops = _battleDrops;
     }
 
     public void PerformDrop()
     {
-        if (null == battleDrops)
+        if (null == m_battleDrops)
             return;
 
         EventBroadcast.Instance.Broadcast<string, BattleDrops, Action>(
-            EventName.BATTLE_DROP_ITEMS, battleField.guid, battleDrops, OnPerformDropFinish);
+            EventName.BATTLE_DROP_ITEMS, battleField.guid, m_battleDrops, OnPerformDropFinish);
     }
 
     protected void OnPerformDropFinish()
     {
-        battleDrops = null;
+        m_battleDrops = null;
     }
 
+    public void SetBack()
+    {
+        layerMgr.SetBack();
+    }
+
+    public void SetFront()
+    {
+        layerMgr.SetFront();
+    }
+
+    public void SetSpeedRatio(float ratio)
+    {
+        motionBase.SetSpeedRatio(ratio);
+        heroInfoBar.SetSpeedRatio(ratio);
+    }
+
+    public void OnObjPropertyRefreshView(HB418_tagSCObjPropertyRefreshView vNetData)
+    {
+        // 澶╁瓙鐨勬寫鎴樻嫤鎴鏉�,涓嶆嫤鎴�掓皵
+        BattleObject boss = battleField.FindBoss();
+        if (boss != null && battleField.MapID == 30020 && boss.ObjID == vNetData.ObjID && vNetData.RefreshType != (ushort)PlayerDataType.XP)
+            return;
+
+        // public uint ObjID;
+        // public ushort RefreshType;    // 鍚�0418鍒锋柊绫诲瀷锛屽琛�閲忋�佹�掓皵
+        // public uint AttackTypes;    // 椋樺瓧绫诲瀷姹囨�伙紝鏀寔澶氱绫诲瀷骞跺瓨锛屽鏃犺闃插尽涓旀毚鍑诲悓鏃惰鏍兼尅锛屼簩杩涘埗鎴栬繍绠楁渶缁堝�硷紱0-澶辫触锛�1-鏅�氾紱2-鍥炶锛�5-鏍兼尅锛�6-鏃犺闃插尽锛�7-鏆村嚮锛�9-闂伩
+        // public uint Value;    // 鏇存柊鍊�
+        // public uint ValueEx;    // 鏇存柊鍊硷紝濡傛灉鏄ぇ鏁板�肩殑姝ゅ�间负鏁撮櫎浜块儴鍒�
+        // public byte DiffType;    // 鍙樺寲绫诲瀷锛�0-鍑忓皯锛�1-澧炲姞
+        // public uint DiffValue;    // 鍙樺寲鍊�
+        // public uint DiffValueEx;    // 鍙樺寲鍊硷紝濡傛灉鏄ぇ鏁板�肩殑姝ゅ�间负鏁撮櫎浜块儴鍒�
+        // public uint SkillID;    // 浣跨敤鐨勬妧鑳借〃ID
+        // public uint RelatedSkillID;    // 鍏宠仈鐨勬妧鑳絀D锛屼竴鑸槸涓绘妧鑳絀D锛岄潪涓绘妧鑳介澶栬Е鍙戠殑涓�0
+
+        long diffValue = GeneralDefine.GetFactValue(vNetData.DiffValue, vNetData.DiffValueEx);
+        diffValue *= vNetData.DiffType == 0 ? -1 : 1;
+
+        long newValue = GeneralDefine.GetFactValue(vNetData.Value, vNetData.ValueEx);
 
 
+        switch ((PlayerDataType)vNetData.RefreshType)
+        {
+            case PlayerDataType.HP:
+                long toHp = GeneralDefine.GetFactValue(vNetData.Value, vNetData.ValueEx);
+                heroInfoBar.UpdateHP(teamHero.curHp, toHp, teamHero.maxHp, true);
+                teamHero.curHp = newValue;
+                // Debug.LogError("OnObjPropertyRefreshView " + teamHero.curHp);
+                break;
+            case PlayerDataType.MaxHP:
+                teamHero.maxHp = newValue;
+                heroInfoBar.UpdateHP(teamHero.curHp, teamHero.curHp, teamHero.maxHp, true);
+                break;
+            case PlayerDataType.XP:
+                long toXp = newValue;
+                heroInfoBar.UpdateXP(teamHero.rage, toXp, 100);
+                teamHero.rage = (int)newValue;
+
+                DamageNumConfig damageNumConfig = DamageNumConfig.Get((int)DamageType.RageUp);
+                string message = BattleUtility.ConvertToArtFont(damageNumConfig, diffValue);
+                heroInfoBar.ShowTips(new BattleHeroInfoBar.TipsInfo()
+                {
+                    message = message,
+                    useArtText = true,
+                    followCharacter = true,
+                    scaleRatio = 1f,
+                    isRage = true
+                });
+                break;
+            default:
+                Debug.LogError("BattleObject.ObjPropertyRefreshView 鍑虹幇鎰忓绫诲瀷 " + vNetData.RefreshType.ToString());
+                break;
+        }
+    }
 
 
 #if UNITY_EDITOR_STOP_USING
@@ -408,4 +682,66 @@
     }
 #endif
 
+    // BattleObject.cs
+
+    public virtual void OnHurtTarget(BattleHurtParam battleHurtParam)
+    {
+        // 妫�鏌ユ槸鍚︽湁鍚歌鎴栧弽浼�
+        bool hasSuckHp = battleHurtParam.caster.suckHpList != null && battleHurtParam.caster.suckHpList.Count > 0;
+        bool hasReflectHp = battleHurtParam.caster.reflectHpList != null && battleHurtParam.caster.reflectHpList.Count > 0;
+        
+        if (!hasSuckHp && !hasReflectHp)
+        {
+            return;
+        }
+
+        // ============ 搴旂敤鏂芥硶鑰呯殑琛�閲忓拰鎶ょ浘鍙樺寲 ============
+        bool isLastHit = battleHurtParam.hitIndex >= battleHurtParam.skillConfig.DamageDivide.Length - 1;
+        ApplyHurtToCaster(battleHurtParam, isLastHit);
+
+        // 鍜孒urt涓�鏍凤紝璋冪敤PopDamage澶勭悊鍚歌/鍙嶄激鐨勬樉绀�
+        BattleDmgInfo casterDmgInfo = PopDamageForCaster(battleHurtParam);
+        
+        // 濡傛灉鏈夊弽浼わ紝鏂芥硶鑰呮挱鏀惧彈鍑诲姩鐢�
+        if (hasReflectHp && casterDmgInfo.casterDamageList != null && casterDmgInfo.casterDamageList.Count > 0)
+        {
+            long totalReflect = casterDmgInfo.casterDamageList.Sum(d => d.damage);
+            if (totalReflect > 0 && !buffMgr.isControled[BattleConst.HardControlGroup])
+            {
+                motionBase.PlayAnimation(MotionName.hit, false);
+            }
+        }
+    }
+
+    /// <summary>
+    /// 搴旂敤鏂芥硶鑰呯殑琛�閲忓拰鎶ょ浘鍙樺寲锛堝惛琛�鍜屽弽浼わ級
+    /// </summary>
+    private void ApplyHurtToCaster(BattleHurtParam battleHurtParam, bool isLastHit)
+    {
+        BattleCastObj caster = battleHurtParam.caster;
+        
+        // 搴旂敤琛�閲忓彉鍖�
+        teamHero.curHp = caster.toHp;
+
+        //  鎵撳嵃鎵�鏈夎鑹茬殑鍚嶅瓧鍜屽綋鍓嶈閲忚窡鎬昏閲�
+        // foreach (var obj in battleField.battleObjMgr.allBattleObjDict.Values)
+        // {
+        //     Debug.LogError($"[ApplyHurtToCaster] ObjID: {obj.ObjID}, Name: {obj.teamHero.heroConfig.Name}, CurHp: {obj.teamHero.curHp}, MaxHp: {obj.teamHero.maxHp} Skill {battleHurtParam.hB427_TagSCUseSkill.packUID} " );
+        // }
+        
+        // 鎶ょ浘鍊肩敱buff绯荤粺鑷姩绠$悊锛屼笉闇�瑕佹墜鍔ㄨ缃�
+        
+#if UNITY_EDITOR
+        // 鏈�鍚庝竴鍑绘椂楠岃瘉琛�閲忔槸鍚︿笌鏈嶅姟鍣ㄤ竴鑷�
+        if (isLastHit)
+        {
+            BattleUtility.ValidateHpConsistencyForCaster(battleHurtParam, "鏂芥硶鑰呭惛琛�/鍙嶄激");
+        }
+#endif
+    }
+
+    public bool IsTianziBoss()
+    {
+        return battleField.MapID == 30020 && battleField.FindBoss() == this;
+    }
 }
\ No newline at end of file

--
Gitblit v1.8.0