From 83ff2cfc367d3227449fa8414a25541374929ecb Mon Sep 17 00:00:00 2001
From: yyl <yyl>
Date: 星期四, 29 一月 2026 15:43:50 +0800
Subject: [PATCH] 125 战斗 命格复活支持

---
 Main/System/Battle/BattleField/BoneBattleField.cs                                           |    2 
 Main/System/Battle/SkillEffect/NormalSkillEffect.cs                                         |    4 
 Main/System/Team/TeamMingge.cs                                                              |   35 ++
 Main/System/Battle/SkillEffect/NoEffect.cs                                                  |    4 
 Main/System/Battle/BattleObject/BattleObjectFactory.cs                                      |   17 
 Main/System/Battle/BattleObject/MinggeBattleObject.cs                                       |   79 ++++
 Main/System/Battle/BoneFieldBattleWin.cs                                                    |   42 +-
 Main/System/Battle/BaseBattleWin.cs                                                         |    5 
 Main/System/Battle/Buff/BattleObjectBuffMgr.cs                                              |    2 
 Main/System/Battle/TianziBillboradBattleWin.cs                                              |   28 +
 Main/System/Battle/BattleObject/BattleObjectLayerMgr.cs                                     |   17 
 Main/System/Battle/BattleField/WarlordPavilionBattleField.cs                                |    2 
 Main/System/Battle/Define/BattleDmgInfo.cs                                                  |   18 
 Main/System/OtherPlayerDetail/OtherHeroDetailWin.cs                                         |    4 
 Main/System/Battle/BattleField/BattleField.cs                                               |   22 +
 Main/System/Settlement/BattleSettlementManager.cs                                           |    4 
 Main/System/Battle/BattleObject/BattleObject.cs                                             |   61 +++-
 Main/System/Team/TeamMingge.cs.meta                                                         |   11 
 Main/System/Battle/UIComp/BattleHeroInfoBar.cs                                              |   29 +
 Main/System/Battle/SkillEffect/DotSkillEffect.cs                                            |    2 
 Main/System/Team/TeamBase.cs                                                                |   38 +
 Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB430_tagSCTurnFightReport.cs |   26 
 Main/System/Battle/BattleField/TianziBillboradBattleField.cs                                |    2 
 Main/System/Battle/Skill/SkillFactory.cs                                                    |    2 
 Main/System/Battle/BattleUtility.cs                                                         |   52 +-
 Main/System/Battle/BattleField/StoryBossBattleField.cs                                      |    2 
 Main/System/Battle/Skill/RebornSkill.cs                                                     |   11 
 Main/System/Battle/SkillEffect/SkillEffect.cs                                               |    8 
 Main/System/Battle/BattleObject/HeroBattleObject.cs                                         |   82 +++++
 Main/System/Battle/SkillEffect/BulletSkillEffect.cs                                         |   46 +-
 Main/System/Battle/WarlordPavilionBattleWin.cs                                              |   38 +
 Main/System/Battle/BattleField/RecordActions/RebornRecordAction.cs                          |    2 
 Main/System/Battle/StoryBossBattleWin.cs                                                    |   49 ++-
 Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs                                        |    2 
 Main/System/Battle/Skill/SkillBase.cs                                                       |   40 +
 Main/System/Battle/BattleObject/BattleObjMgr.cs                                             |   45 ++
 Main/System/Battle/BattleField/RecordActions/DeathRecordAction.cs                           |    4 
 Main/System/Battle/BattleField/RecordActions/SkillRecordAction.cs                           |    2 
 Main/System/Battle/ArenaBattleWin.cs                                                        |   21 
 39 files changed, 612 insertions(+), 248 deletions(-)

diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB430_tagSCTurnFightReport.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB430_tagSCTurnFightReport.cs
index afc28f1..28d9ef3 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB430_tagSCTurnFightReport.cs
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB430_tagSCTurnFightReport.cs
@@ -374,9 +374,9 @@
                 if (battleField != null)
                 {
                     var battleObj = battleField.battleObjMgr.GetBattleObject((int)skill.ObjID);
-                    if (battleObj != null && battleObj.teamHero != null)
+                    if (battleObj != null)
                     {
-                        heroName = battleObj.teamHero.name;
+                        heroName = battleObj.GetName();
                     }
                 }
                 
@@ -395,9 +395,9 @@
                         if (battleField != null)
                         {
                             var targetObj = battleField.battleObjMgr.GetBattleObject((int)hurt.ObjID);
-                            if (targetObj != null && targetObj.teamHero != null)
+                            if (targetObj != null)
                             {
-                                targetName = targetObj.teamHero.name;
+                                targetName = targetObj.GetName();
                             }
                         }
                         result += $"{indentStr}    [{j}] Target - ObjID:{hurt.ObjID} Name:{targetName} HurtHP:{hurt.HurtHP} AttackTypes:{hurt.AttackTypes}\n";
@@ -413,9 +413,9 @@
                                 if (battleField != null)
                                 {
                                     var targetExObj = battleField.battleObjMgr.GetBattleObject((int)hurtEx.ObjID);
-                                    if (targetExObj != null && targetExObj.teamHero != null)
+                                    if (targetExObj != null)
                                     {
-                                        targetExName = targetExObj.teamHero.name;
+                                        targetExName = targetExObj.GetName();
                                     }
                                 }
                                 result += $"{indentStr}        [{k}] ExTarget - ObjID:{hurtEx.ObjID} Name:{targetExName} HurtHP:{hurtEx.HurtHP} AttackTypes:{hurtEx.AttackTypes}\n";
@@ -435,9 +435,9 @@
                         if (battleField != null)
                         {
                             var targetExObj = battleField.battleObjMgr.GetBattleObject((int)hurtEx.ObjID);
-                            if (targetExObj != null && targetExObj.teamHero != null)
+                            if (targetExObj != null)
                             {
-                                targetExName = targetExObj.teamHero.name;
+                                targetExName = targetExObj.GetName();
                             }
                         }
                         result += $"{indentStr}    [{j}] ExTarget - ObjID:{hurtEx.ObjID} Name:{targetExName} HurtHP:{hurtEx.HurtHP} AttackTypes:{hurtEx.AttackTypes}\n";
@@ -455,9 +455,9 @@
                     if (battleField != null)
                     {
                         var battleObj = battleField.battleObjMgr.GetBattleObject((int)mainSkill.ObjID);
-                        if (battleObj != null && battleObj.teamHero != null)
+                        if (battleObj != null)
                         {
-                            heroName = battleObj.teamHero.name;
+                            heroName = battleObj.GetName();
                         }
                     }
                 }
@@ -475,9 +475,9 @@
                 if (battleField != null)
                 {
                     var battleObj = battleField.battleObjMgr.GetBattleObject((int)deadPack.ObjID);
-                    if (battleObj != null && battleObj.teamHero != null)
+                    if (battleObj != null)
                     {
-                        heroName = battleObj.teamHero.name;
+                        heroName = battleObj.GetName();
                     }
                 }
                 result += $"{indentStr}[{i}] HB422_tagMCTurnFightObjDead - ObjID:{deadPack.ObjID} HeroName:{heroName} UID:{deadPack.packUID}\n";
@@ -664,7 +664,7 @@
                 if (field.Name == "ObjID" && value is uint objId && battleField != null)
                 {
                     var battleObj = battleField.battleObjMgr.GetBattleObject((int)objId);
-                    string heroName = battleObj?.teamHero?.name ?? "Unknown";
+                    string heroName = battleObj?.GetName() ?? "Unknown";
                     sb.AppendLine(indentStr + $"  {field.Name} ({fieldType.Name}): {value} [{heroName}]");
                 }
                 // 鐗规畩澶勭悊锛氭樉绀篠killID瀵瑰簲鐨勬妧鑳藉悕瀛�
diff --git a/Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs b/Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs
index 8228824..01570dc 100644
--- a/Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs
+++ b/Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs
@@ -191,7 +191,7 @@
             Debug.LogErrorFormat("灏佸寘鏄惁涓篘ull:{0};", _package == null);
             if (_package != null)
             {
-                Debug.LogErrorFormat("灏佸寘缂栧彿鏄�:{0};", _package.cmd);
+                Debug.LogErrorFormat("灏佸寘缂栧彿鏄�:{0}; 鍚嶆槸{1}", _package.cmd, _package.GetType().Name);
             }
         }
     }
diff --git a/Main/System/Battle/ArenaBattleWin.cs b/Main/System/Battle/ArenaBattleWin.cs
index 610f251..5150f26 100644
--- a/Main/System/Battle/ArenaBattleWin.cs
+++ b/Main/System/Battle/ArenaBattleWin.cs
@@ -181,9 +181,9 @@
         long res = 0;
         foreach (var obj in Team)
         {
-            if (obj.teamHero == null)
+            if (obj is not HeroBattleObject)
                 continue;
-            res += obj.teamHero.fightPower;
+            res += obj.GetFightPower();
         }
         return res;
     }
@@ -221,10 +221,10 @@
 
         for (int i = 0; i < myHeroHeads.Count; i++)
         {
-            if (i < myTeam.Count)
+            if (i < myTeam.Count && myTeam[i] is HeroBattleObject heroBattleObject)
             {
                 myHeroHeads[i].SetActive(true);
-                var teamHero = myTeam[i].teamHero;
+                var teamHero = heroBattleObject.teamHero;
                 myHeroHeads[i].Display(teamHero.heroId, teamHero.SkinID, teamHero.level);
             }
             else
@@ -238,10 +238,10 @@
         {
             int teamIndex = enemyHeroHeads.Count - 1 - i;  // 寤虹珛鍙嶅悜鏄犲皠
 
-            if (teamIndex < enemyTeam.Count)
+            if (teamIndex < enemyTeam.Count && enemyTeam[teamIndex] is HeroBattleObject heroBattleObject)
             {
                 enemyHeroHeads[i].SetActive(true);
-                var teamHero = enemyTeam[teamIndex].teamHero;  // 浣跨敤鏄犲皠鍚庣殑绱㈠紩
+                var teamHero = heroBattleObject.teamHero;  // 浣跨敤鏄犲皠鍚庣殑绱㈠紩
                 enemyHeroHeads[i].Display(teamHero.heroId, teamHero.SkinID, teamHero.level);
             }
             else
@@ -258,7 +258,7 @@
         {
             for (int i = 0; i < battleObjects.Count; i++)
             {
-                sun += (ulong)battleObjects[i].teamHero.maxHp;
+                sun += (ulong)battleObjects[i].GetMaxHp();
             }
         }
         return sun;
@@ -271,7 +271,7 @@
         {
             for (int i = 0; i < battleObjects.Count; i++)
             {
-                sun += (ulong)battleObjects[i].teamHero.curHp;
+                sun += (ulong)battleObjects[i].GetCurHp();
             }
         }
         return sun;
@@ -284,7 +284,10 @@
             return teamHeroes;
         foreach (var item in teams)
         {
-            teamHeroes.Add(item.teamHero);
+            if (item is HeroBattleObject heroBattleObject)
+            {
+                teamHeroes.Add(heroBattleObject.teamHero);
+            }
         }
         return teamHeroes;
 
diff --git a/Main/System/Battle/BaseBattleWin.cs b/Main/System/Battle/BaseBattleWin.cs
index 1089591..7d3a226 100644
--- a/Main/System/Battle/BaseBattleWin.cs
+++ b/Main/System/Battle/BaseBattleWin.cs
@@ -407,6 +407,11 @@
         if (battleField == null || battleField.guid != guid)
             return;
 
+        if (null == teamHero)
+        {
+            return;
+        }
+
         BattleObject battleObject = battleField.battleObjMgr.GetBattleObject(teamHero.ObjID);
         if (battleObject == null)
             return;
diff --git a/Main/System/Battle/BattleField/BattleField.cs b/Main/System/Battle/BattleField/BattleField.cs
index 89453cc..9ef715c 100644
--- a/Main/System/Battle/BattleField/BattleField.cs
+++ b/Main/System/Battle/BattleField/BattleField.cs
@@ -588,7 +588,7 @@
 
     public RectTransform GetTeamNode(BattleCamp battleCamp, BattleObject target)
     {
-        int index = target.teamHero.positionNum;
+        int index = target.GetPositionNum();
         return GetTeamNode(battleCamp, index);
     }
 
@@ -600,7 +600,13 @@
 
     public RectTransform GetTeamNode(BattleCamp battleCamp, int index)
     {
-        if (index < 0 || index >= battleRootNode.redTeamNodeList.Count)
+        if (index == 99)
+        {
+            return battleCamp == BattleCamp.Red ? battleRootNode.redTeamNodeList[0].transform as RectTransform 
+                : battleRootNode.blueTeamNodeList[0].transform as RectTransform;
+        }
+        
+        if (index < 0 || index >= battleRootNode.redTeamNodeList.Count )
         {
             Debug.LogError($"GetTeamNode: Index {index} is out of range for {battleCamp} camp.");
             return null;
@@ -799,7 +805,11 @@
         BattleObject battleObj = battleObjMgr.GetBattleObject((int)vNetData.ObjID);
         if (null != battleObj)
         {
-            battleObj.buffMgr.RefreshBuff(vNetData);
+            var buffMgr = battleObj.GetBuffMgr();
+            if (buffMgr != null) // 鍛芥牸涓嶆湁 buff 绠$悊鍣�
+            {
+                buffMgr.RefreshBuff(vNetData);
+            }
         }
     }
 
@@ -826,7 +836,11 @@
         BattleObject battleObj = battleObjMgr.GetBattleObject((int)vNetData.ObjID);
         if (null != battleObj)
         {
-            battleObj.buffMgr.RemoveBuff(vNetData);
+            var buffMgr = battleObj.GetBuffMgr();
+            if (buffMgr != null) // 鍛芥牸涓嶆湁 buff 绠$悊鍣�
+            {
+                buffMgr.RemoveBuff(vNetData);
+            }
         }
     }
 
diff --git a/Main/System/Battle/BattleField/BoneBattleField.cs b/Main/System/Battle/BattleField/BoneBattleField.cs
index c0146ed..e861272 100644
--- a/Main/System/Battle/BattleField/BoneBattleField.cs
+++ b/Main/System/Battle/BattleField/BoneBattleField.cs
@@ -128,7 +128,7 @@
         if (config != null)
         {
             int bossId = config.BossID;
-            BattleObject bo = battleObjMgr.allBattleObjDict.Values.FirstOrDefault(bo => bo.teamHero.NPCID == bossId);
+            BattleObject bo = battleObjMgr.allBattleObjDict.Values.FirstOrDefault(bo => bo.GetNPCID() == bossId);
             return bo;
         }
         return null;
diff --git a/Main/System/Battle/BattleField/RecordActions/DeathRecordAction.cs b/Main/System/Battle/BattleField/RecordActions/DeathRecordAction.cs
index a184d25..772fa97 100644
--- a/Main/System/Battle/BattleField/RecordActions/DeathRecordAction.cs
+++ b/Main/System/Battle/BattleField/RecordActions/DeathRecordAction.cs
@@ -33,7 +33,7 @@
         // for (int i = 0; i < deadPackList.Count; i++)
         // {
         //     BattleObject battleObject = battleField.battleObjMgr.GetBattleObject((int)deadPackList[i].deadPack.ObjID);
-        //     Debug.LogError($"DeathRecordAction: 鍒濆鍖栨浜″姩浣滐紝姝讳骸瀵硅薄鍚嶅瓧={battleObject?.teamHero.name}, hasDeathTriggerSkill={deadPackList[i].deadTriggerSkill != null}");
+        //     Debug.LogError($"DeathRecordAction: 鍒濆鍖栨浜″姩浣滐紝姝讳骸瀵硅薄鍚嶅瓧={battleObject?.GetName()}, hasDeathTriggerSkill={deadPackList[i].deadTriggerSkill != null}");
         // }
 
         parentSkillAction = _parentSkillAction;
@@ -391,7 +391,7 @@
             foreach (var deadPack in deadPackList)
             {
                 BattleObject deadObj = battleField.battleObjMgr.GetBattleObject((int)deadPack.deadPack.ObjID);
-                string name = deadObj?.teamHero?.name ?? "Unknown";
+                string name = deadObj?.GetName() ?? "Unknown";
                 deadNames += name + ",";
             }
             deadNames = deadNames.TrimEnd(',');
diff --git a/Main/System/Battle/BattleField/RecordActions/RebornRecordAction.cs b/Main/System/Battle/BattleField/RecordActions/RebornRecordAction.cs
index 9a3bb9b..fe4793f 100644
--- a/Main/System/Battle/BattleField/RecordActions/RebornRecordAction.cs
+++ b/Main/System/Battle/BattleField/RecordActions/RebornRecordAction.cs
@@ -78,7 +78,7 @@
             Sequence sequence = DOTween.Sequence();
 
             //  鎾斁澶嶆椿鐗规晥
-            battleField.battleEffectMgr.PlayEffect(battleObj, BattleConst.RebornEffectID, battleObj.GetRectTransform(), battleObj.Camp, battleObj.teamHero.modelScale);
+            battleField.battleEffectMgr.PlayEffect(battleObj, BattleConst.RebornEffectID, battleObj.GetRectTransform(), battleObj.Camp, battleObj.GetModelScale());
 
             //  娓愬彉
             battleObj.SetSkeletonAlpha(0f);
diff --git a/Main/System/Battle/BattleField/RecordActions/SkillRecordAction.cs b/Main/System/Battle/BattleField/RecordActions/SkillRecordAction.cs
index c2a705d..1005937 100644
--- a/Main/System/Battle/BattleField/RecordActions/SkillRecordAction.cs
+++ b/Main/System/Battle/BattleField/RecordActions/SkillRecordAction.cs
@@ -196,7 +196,7 @@
 	{
 		if (skillBase != null && skillBase.caster != null)
 		{
-			string casterName = skillBase.caster.teamHero?.name ?? "Unknown";
+			string casterName = skillBase.caster.GetName();
 			int skillId = skillBase.skillConfig?.SkillID ?? 0;
 			string skillName = skillBase.skillConfig?.SkillName ?? "Unknown";
 			Debug.LogError($"[SkillRecordAction棣栨Run] 鏂芥硶鑰�:{casterName} 鎶�鑳絀D:{skillId} 鎶�鑳藉悕:{skillName}");
diff --git a/Main/System/Battle/BattleField/StoryBossBattleField.cs b/Main/System/Battle/BattleField/StoryBossBattleField.cs
index efd3f12..32e8ec9 100644
--- a/Main/System/Battle/BattleField/StoryBossBattleField.cs
+++ b/Main/System/Battle/BattleField/StoryBossBattleField.cs
@@ -162,7 +162,7 @@
         {
             int bossId = lineupConfig.BossID;
 
-            BattleObject bo = battleObjMgr.allBattleObjDict.Values.FirstOrDefault(bo => bo.teamHero.NPCID == bossId);
+            BattleObject bo = battleObjMgr.allBattleObjDict.Values.FirstOrDefault(bo => bo.GetNPCID() == bossId);
 
             return bo;
         }
diff --git a/Main/System/Battle/BattleField/TianziBillboradBattleField.cs b/Main/System/Battle/BattleField/TianziBillboradBattleField.cs
index 20d0ba9..68fba4c 100644
--- a/Main/System/Battle/BattleField/TianziBillboradBattleField.cs
+++ b/Main/System/Battle/BattleField/TianziBillboradBattleField.cs
@@ -130,7 +130,7 @@
         if (config != null)
         {
             int bossId = config.BossID;
-            BattleObject bo = battleObjMgr.allBattleObjDict.Values.FirstOrDefault(bo => bo.teamHero.NPCID == bossId);
+            BattleObject bo = battleObjMgr.allBattleObjDict.Values.FirstOrDefault(bo => bo.GetNPCID() == bossId);
             return bo;
         }
         return null;
diff --git a/Main/System/Battle/BattleField/WarlordPavilionBattleField.cs b/Main/System/Battle/BattleField/WarlordPavilionBattleField.cs
index 46371d5..4d2ec9c 100644
--- a/Main/System/Battle/BattleField/WarlordPavilionBattleField.cs
+++ b/Main/System/Battle/BattleField/WarlordPavilionBattleField.cs
@@ -127,7 +127,7 @@
         if (config != null)
         {
             int bossId = config.BossID;
-            BattleObject bo = battleObjMgr.allBattleObjDict.Values.FirstOrDefault(bo => bo.teamHero.NPCID == bossId);
+            BattleObject bo = battleObjMgr.allBattleObjDict.Values.FirstOrDefault(bo => bo.GetNPCID() == bossId);
             return bo;
         }
         return null;
diff --git a/Main/System/Battle/BattleObject/BattleObjMgr.cs b/Main/System/Battle/BattleObject/BattleObjMgr.cs
index 145cdac..5913231 100644
--- a/Main/System/Battle/BattleObject/BattleObjMgr.cs
+++ b/Main/System/Battle/BattleObject/BattleObjMgr.cs
@@ -14,6 +14,10 @@
 
     public Dictionary<int, BattleObject> allBattleObjDict = new Dictionary<int, BattleObject>();
 
+    public MinggeBattleObject redMingge = null;
+
+    public MinggeBattleObject blueMingge = null;
+
     protected BattleField battleField;
 
     public void Init(BattleField _battleField, TeamBase _redTeam, TeamBase _blueTeam)
@@ -48,8 +52,24 @@
                 BattleObject battleObj = BattleObjectFactory.CreateBattleObject(battleField, posNodeList, teamHero, _Camp);
                 battleObj.SetActive(active);
                 allBattleObjDict.Add(battleObj.ObjID, battleObj);
-                campDict.Add(teamHero.positionNum, battleObj);
+                campDict.Add(battleObj.GetPositionNum(), battleObj);
                 battleObj.SetSpeedRatio(battleField.speedRatio);
+            }
+        }
+
+        if (teamBase.teamMingge != null)
+        {
+            BattleObject minggeObj = BattleObjectFactory.CreateMinggeBattleObject(battleField, teamBase, _Camp);
+            allBattleObjDict.Add(minggeObj.ObjID, minggeObj);
+            campDict.Add(minggeObj.GetPositionNum(), minggeObj);
+            minggeObj.SetSpeedRatio(battleField.speedRatio);
+            if (_Camp == BattleCamp.Red)
+            {
+                redMingge = minggeObj as MinggeBattleObject;
+            }
+            else
+            {
+                blueMingge = minggeObj as MinggeBattleObject;
             }
         }
     }
@@ -60,6 +80,17 @@
         {
             return battleObj;
         }
+
+        if (blueMingge != null && blueMingge.ObjID == objId)
+        {
+            return blueMingge;
+        }
+
+        if (redMingge != null && redMingge.ObjID == objId)
+        {
+            return redMingge;
+        }
+
         return null;
     }
 
@@ -114,11 +145,11 @@
             {
                 if (battleObj.Camp == BattleCamp.Red)
                 {
-                    redCampDict.Remove(battleObj.teamHero.positionNum);
+                    redCampDict.Remove(battleObj.GetPositionNum());
                 }
                 else
                 {
-                    blueCampDict.Remove(battleObj.teamHero.positionNum);
+                    blueCampDict.Remove(battleObj.GetPositionNum());
                 }
                 allBattleObjDict.Remove((int)objID);
                 BattleObjectFactory.DestroyBattleObject((int)objID, battleObj);
@@ -166,6 +197,8 @@
         DestroyTeam(redCampDict);
         DestroyTeam(blueCampDict);
         allBattleObjDict.Clear();
+        redMingge = null;
+        blueMingge = null;
     }
 
     public void Run()
@@ -290,7 +323,7 @@
                 //鏆傛椂娌℃湁鍙敜鐗�
                 // 鏀惧湪绗�7鏍肩殑BOSS鍚庢帓鐨勩�傘�備綅缃斁鍦ㄦ涓棿
                 // a)鍓嶆帓,1銆�2銆�3鍙蜂负鍓嶆帓,鍓嶆帓鍏ㄩ儴闃典骸鍚�,4銆�5銆�6鍙峰嵆鏄墠鎺掍篃鏄悗鎺� 7鍏跺疄涔熸槸鍚庢帓
-                List<BattleObject> frontList = new List<BattleObject>(from BO in returnList where BO.teamHero.positionNum < 3 && !BO.IsDead() select BO);
+                List<BattleObject> frontList = new List<BattleObject>(from BO in returnList where BO.GetPositionNum() < 3 && !BO.IsDead() select BO);
                 if (frontList.Count == 0)
                 {
                     frontList.AddRange(returnList);
@@ -298,7 +331,7 @@
                 returnList = frontList;                
                 break;
             case SkillTargetRangeType.Back:
-                List<BattleObject> backList = new List<BattleObject>(from BO in returnList where BO.teamHero.positionNum >= 3 && !BO.IsDead() select BO);
+                List<BattleObject> backList = new List<BattleObject>(from BO in returnList where BO.GetPositionNum() >= 3 && !BO.IsDead() select BO);
                 if (backList.Count == 0)
                 {
                     backList.AddRange(returnList);
@@ -336,7 +369,7 @@
                         loweastHpObj = returnList[i];
                         continue;
                     }
-                    if (returnList[i].teamHero.curHp < loweastHpObj.teamHero.curHp)
+                    if (returnList[i].GetCurHp() < loweastHpObj.GetCurHp())
                     {
                         loweastHpObj = returnList[i];
                     }
diff --git a/Main/System/Battle/BattleObject/BattleObject.cs b/Main/System/Battle/BattleObject/BattleObject.cs
index 76287ac..e0b1078 100644
--- a/Main/System/Battle/BattleObject/BattleObject.cs
+++ b/Main/System/Battle/BattleObject/BattleObject.cs
@@ -30,22 +30,45 @@
 {
     public BattleField battleField;
 
-    public BattleObjectBuffMgr buffMgr;
-
     public BattleObjectLayerMgr layerMgr;
 
     public int ObjID { get; set; }
 
     public BattleCamp Camp { get; protected set; }
 
-    public TeamHero teamHero { get; protected set; }
-
     public BattleObject(BattleField _battleField)
     {
         battleField = _battleField;
     }
 
-    public abstract void Init(TeamHero _teamHero, BattleCamp _camp);
+    // ============ 鎶借薄璁块棶鏂规硶锛堝瓙绫昏繑鍥炲悇鑷殑Team绫诲瀷淇℃伅锛� ============
+    
+    public abstract int GetPositionNum();
+    public abstract float GetModelScale();
+    public abstract string GetName();
+    
+    // Buff 绠$悊鍣ㄨ闂柟娉曪紙Hero 鏈� buff锛孧ingge 杩斿洖 null锛�
+    public abstract BattleObjectBuffMgr GetBuffMgr();
+    
+    // 鐘舵�佹煡璇㈡娊璞℃柟娉�
+    protected abstract bool GetIsStunned();
+    protected abstract bool GetIsFrozen();
+    protected abstract bool GetIsStoned();
+    protected abstract bool GetIsSlient();
+    protected abstract bool GetIsDisarmed();
+    protected abstract bool GetIsInvincible();
+    protected abstract bool GetIsDead();
+    public abstract int GetRage();
+    
+    // 琛�閲忕浉鍏虫娊璞℃柟娉曪紙Hero 鐗规湁锛孧ingge 杩斿洖榛樿鍊硷級
+    public abstract long GetCurHp();
+    public abstract long GetMaxHp();
+    public abstract void SetCurHp(long value);
+    public abstract void SetIsDead(bool value);
+    
+    // 鍏朵粬灞炴�ц闂柟娉�
+    public abstract int GetNPCID();
+    public abstract long GetFightPower();
 
     public abstract void Run();
 
@@ -200,43 +223,43 @@
     //  鐪╂檿
     public bool IsStunned()
     {
-        return teamHero.isStunned;
+        return GetIsStunned();
     }
 
     //  鍐板喕
     public bool IsFrozen()
     {
-        return teamHero.isFrozen;
+        return GetIsFrozen();
     }
 
     //  鐭冲寲
     public bool IsStoned()
     {
-        return teamHero.isStoned;
+        return GetIsStoned();
     }
 
     //  琚矇榛�
     public bool IsSlient()
     {
-        return teamHero.isSlient;
+        return GetIsSlient();
     }
 
     //  琚即姊�
     public bool IsDisarmed()
     {
-        return teamHero.isDisarmed;
+        return GetIsDisarmed();
     }
 
     //  鏄惁鏃犳晫
     public bool IsInvincable()
     {
-        return teamHero.isInvinceble;
+        return GetIsInvincible();
     }
 
     //  鏄惁姝讳骸
     public bool IsDead()
     {
-        return teamHero.isDead;
+        return GetIsDead();
     }
 
     //  鏄惁琚帶浣忎簡
@@ -260,7 +283,7 @@
         }
 
         //  鐪嬬湅鎬掓皵鏄惁杈惧埌閲婃斁瑕佹眰
-        return teamHero.rage >= 100;
+        return GetRage() >= 100;
     }
 
     public virtual bool IsCanNormalAttack()
@@ -392,7 +415,8 @@
         if (hasReflectHp && casterDmgInfo.casterDamageList != null && casterDmgInfo.casterDamageList.Count > 0)
         {
             long totalReflect = casterDmgInfo.casterDamageList.Sum(d => d.damage);
-            if (totalReflect > 0 && !buffMgr.isControled[BattleConst.HardControlGroup])
+            var buffMgr = GetBuffMgr();
+            if (totalReflect > 0 && buffMgr != null && !buffMgr.isControled[BattleConst.HardControlGroup])
             {
                 OnPlayHitAnimation();
             }
@@ -406,8 +430,8 @@
     {
         BattleCastObj caster = battleHurtParam.caster;
         
-        // 搴旂敤琛�閲忓彉鍖�
-        teamHero.curHp = caster.toHp;
+        // 搴旂敤琛�閲忓彉鍖栵紙鐢卞瓙绫诲疄鐜帮級
+        ApplyCasterHpChange(caster.toHp);
 
         //  鎵撳嵃鎵�鏈夎鑹茬殑鍚嶅瓧鍜屽綋鍓嶈閲忚窡鎬昏閲�
         // foreach (var obj in battleField.battleObjMgr.allBattleObjDict.Values)
@@ -435,4 +459,9 @@
     /// 鎾斁鍙楀嚮鍔ㄧ敾锛堝彧鏈� Hero 鏈夊疄鐜帮紝Mingge 鐣欑┖锛�
     /// </summary>
     protected abstract void OnPlayHitAnimation();
+    
+    /// <summary>
+    /// 搴旂敤鏂芥硶鑰呰閲忓彉鍖栵紙鍚歌/鍙嶄激锛�
+    /// </summary>
+    protected abstract void ApplyCasterHpChange(long newHp);
 }
\ No newline at end of file
diff --git a/Main/System/Battle/BattleObject/BattleObjectFactory.cs b/Main/System/Battle/BattleObject/BattleObjectFactory.cs
index 2728efc..7101554 100644
--- a/Main/System/Battle/BattleObject/BattleObjectFactory.cs
+++ b/Main/System/Battle/BattleObject/BattleObjectFactory.cs
@@ -79,17 +79,14 @@
         {
             heroBattleObject.Init(realGO, teamHero, _Camp);
         }
-        else
-        {
-            battleObject.Init(teamHero, _Camp);
-        }
+        // 鍏朵粬绫诲瀷锛堝MinggeBattleObject锛変笉鍦ㄨ繖閲屽垱寤猴紝鏈夊崟鐙殑鍒涘缓閫昏緫
 
 #if UNITY_EDITOR
         BattleDebug.LogError(
             "鍒濆鍖� 鏈鍔�" +
             (battleObject.Camp == BattleCamp.Red ? "銆愮孩鏂广��" : "銆愯摑鏂广�� ") +
-            $"姝﹀皢: {battleObject.teamHero.name}\n" +
-            $"褰撳墠琛�閲�: {battleObject.teamHero.curHp} -> 鏈�澶ц閲弡battleObject.teamHero.maxHp}\n"
+            $"姝﹀皢: {battleObject.GetName()}\n" +
+            $"褰撳墠琛�閲�: {battleObject.GetCurHp()} -> 鏈�澶ц閲弡battleObject.GetMaxHp()}\n"
         );
 #endif
 
@@ -123,4 +120,12 @@
         battleObj.Destroy();
         battleObj = null;
     }
+
+    public static BattleObject CreateMinggeBattleObject(BattleField battleField, TeamBase teamBase, BattleCamp camp)
+    {
+        MinggeBattleObject minggeBattleObject = new MinggeBattleObject(battleField);
+        minggeBattleObject.Init(teamBase, teamBase.teamMingge, camp);
+        minggeBattleObject.ObjID = teamBase.teamMingge.ObjID;
+        return minggeBattleObject;
+    }
 }
\ No newline at end of file
diff --git a/Main/System/Battle/BattleObject/BattleObjectLayerMgr.cs b/Main/System/Battle/BattleObject/BattleObjectLayerMgr.cs
index 5a8bd2d..1989ad4 100644
--- a/Main/System/Battle/BattleObject/BattleObjectLayerMgr.cs
+++ b/Main/System/Battle/BattleObject/BattleObjectLayerMgr.cs
@@ -22,12 +22,21 @@
     public void Init(BattleObject battleObj)
     {
         this.battleObj = battleObj;
-        frontCharRendererAdjuster = battleObj.GetGameObject()?.AddMissingComponent<RendererAdjuster>();
-        behindCharRendererAdjuster = battleObj.GetRectTransform()?.Find("Hero/Follower/BattleHeroInfoBar/BehindHero")?.gameObject?.AddMissingComponent<RendererAdjuster>();
+
+        if (battleObj is MinggeBattleObject)
+        {
+
+        }
+        else
+        {
+            frontCharRendererAdjuster = battleObj.GetGameObject()?.AddMissingComponent<RendererAdjuster>();
+            behindCharRendererAdjuster = battleObj.GetRectTransform()?.Find("Hero/Follower/BattleHeroInfoBar/BehindHero")?.gameObject?.AddMissingComponent<RendererAdjuster>();
 
 
-        frontCharRendererAdjuster.canvasOffset = BattleConst.BattleFrontCharUIOffset;
-        behindCharRendererAdjuster.canvasOffset = BattleConst.BattleBehindCharUIOffset;
+            frontCharRendererAdjuster.canvasOffset = BattleConst.BattleFrontCharUIOffset;
+            behindCharRendererAdjuster.canvasOffset = BattleConst.BattleBehindCharUIOffset;
+        }
+
     }
 
     public void SetSortingOrder(int sortingOrder)
diff --git a/Main/System/Battle/BattleObject/HeroBattleObject.cs b/Main/System/Battle/BattleObject/HeroBattleObject.cs
index 9218667..363f3e9 100644
--- a/Main/System/Battle/BattleObject/HeroBattleObject.cs
+++ b/Main/System/Battle/BattleObject/HeroBattleObject.cs
@@ -15,6 +15,11 @@
     public GameObject heroGo => _heroGo;
 
     public MotionBase motionBase;
+    
+    public TeamHero teamHero { get; private set; }
+    
+    // Buff 绠$悊鍣紙鍙湁 Hero 鏈� buff 绯荤粺锛�
+    public BattleObjectBuffMgr buffMgr;
 
     private RectTransform m_heroRectTrans;
 
@@ -53,13 +58,15 @@
     public void Init(GameObject _heroGo, TeamHero _teamHero, BattleCamp _camp)
     {
         this._heroGo = _heroGo;
-        Init(_teamHero, _camp);
-    }
-
-    public override void Init(TeamHero _teamHero, BattleCamp _camp)
-    {
         teamHero = _teamHero;
         Camp = _camp;
+        ObjID = _teamHero.ObjID;
+        InitInternal();
+    }
+
+    
+    private void InitInternal()
+    {
         motionBase = new MotionBase();
         motionBase.Init(_heroGo.GetComponentInChildren<SkeletonAnimation>(true));
         buffMgr = new BattleObjectBuffMgr();
@@ -89,6 +96,41 @@
             heroInfoBar.SetActive(true);
         }
         SetFront();
+
+        if (battleField.ToString() != BattleConst.StoryBattleField &&
+            battleField.ToString() != BattleConst.TianziBillboradBattleField)
+        {
+            var hitArea = heroGo.GetComponent<Image>();
+            if (hitArea == null)
+            {
+                hitArea = heroGo.AddComponent<Image>();
+                hitArea.color = new Color(0, 0, 0, 0); //璁╁皠绾挎娴嬪埌
+            }
+
+            var btn = heroGo.GetComponent<ButtonEx>();
+            if (btn == null)
+            {
+                btn = heroGo.AddComponent<ButtonEx>();
+                btn.interval = 0.5f;// 闃叉棰戠箒杩炵画鐐瑰嚮
+            }
+
+            btn.AddListener(() =>
+            {
+                // 鍒ゆ柇鐐瑰嚮鐨勬槸鎴戞柟闃佃惀杩樻槸鏁屾柟闃佃惀锛岀洰鍓嶅乏杈归兘鏄垜鏂归樀钀�
+                bool isMySide = Camp == BattleCamp.Red;
+                EventBroadcast.Instance.Broadcast(EventName.BATTLE_CLICK_HERO, new BattleClickHeroData()
+                {
+                    battleName = battleField.ToString(),
+                    isMySide = isMySide,
+                    mapID = battleField.MapID,
+                    funcLineID = battleField.FuncLineID,
+                    npcID = teamHero.NPCID,
+                    posNum = teamHero.positionNum,
+                    heroID = teamHero.heroId,
+                    teams = battleField?.battleObjMgr.GetBattleObjList(isMySide ? BattleCamp.Red : BattleCamp.Blue),
+                });
+            });
+        }
     }
 
     public override void Run()
@@ -481,6 +523,36 @@
         motionBase.ResetForReborn(false);
         isReborning = false;
     }
+    
+    // ============ 瀹炵幇鎶借薄璁块棶鏂规硶 ============
+    
+    public override BattleObjectBuffMgr GetBuffMgr() => buffMgr;
+    
+    public override int GetPositionNum() => teamHero.positionNum;
+    public override float GetModelScale() => teamHero.modelScale;
+    public override string GetName() => teamHero.name;
+    
+    protected override bool GetIsStunned() => teamHero.isStunned;
+    protected override bool GetIsFrozen() => teamHero.isFrozen;
+    protected override bool GetIsStoned() => teamHero.isStoned;
+    protected override bool GetIsSlient() => teamHero.isSlient;
+    protected override bool GetIsDisarmed() => teamHero.isDisarmed;
+    protected override bool GetIsInvincible() => teamHero.isInvinceble;
+    protected override bool GetIsDead() => teamHero.isDead;
+    public override int GetRage() => teamHero.rage;
+    
+    protected override void ApplyCasterHpChange(long newHp)
+    {
+        teamHero.curHp = newHp;
+    }
+    
+    public override long GetCurHp() => teamHero.curHp;
+    public override long GetMaxHp() => teamHero.maxHp;
+    public override void SetCurHp(long value) { teamHero.curHp = value; }
+    public override void SetIsDead(bool value) { teamHero.isDead = value; }
+    
+    public override int GetNPCID() => teamHero.NPCID;
+    public override long GetFightPower() => teamHero.fightPower;
 
     // 浼ゅ杩樿鐪� 鏄惁闂伩 鏆村嚮 and so on 闇�瑕佹湁涓�涓狣amageType 鏈嶅姟鍣ㄥ簲璇ヤ細缁�
     protected override BattleDmgInfo PopDamage(BattleHurtParam battleHurtParam)
diff --git a/Main/System/Battle/BattleObject/MinggeBattleObject.cs b/Main/System/Battle/BattleObject/MinggeBattleObject.cs
index c575e93..35d7aea 100644
--- a/Main/System/Battle/BattleObject/MinggeBattleObject.cs
+++ b/Main/System/Battle/BattleObject/MinggeBattleObject.cs
@@ -8,18 +8,19 @@
 /// </summary>
 public class MinggeBattleObject : BattleObject
 {
+    public TeamMingge teamMingge { get; private set; }
+    
     public MinggeBattleObject(BattleField _battleField) : base(_battleField)
     {
     }
 
-    public override void Init(TeamHero _teamHero, BattleCamp _camp)
+    public virtual void Init(TeamBase teamBase, TeamMingge _teamMingge, BattleCamp _camp)
     {
-        teamHero = _teamHero;
+        teamMingge = _teamMingge;
         Camp = _camp;
+        ObjID = teamMingge.ObjID;
         
-        // 鍛芥牸鍙渶瑕� buff 绠$悊鍣ㄧ敤浜庢妧鑳芥晥鏋�
-        buffMgr = new BattleObjectBuffMgr();
-        buffMgr.Init(this);
+        // 鍛芥牸涓嶉渶瑕� buff 绠$悊鍣紙鍛芥牸閲婃斁鎶�鑳戒絾鑷韩涓嶄細鏈� buff锛�
         
         layerMgr = new BattleObjectLayerMgr();
         layerMgr.Init(this);
@@ -42,11 +43,38 @@
 
     public override void Destroy()
     {
-        if (buffMgr != null)
-        {
-            buffMgr.Release();
-        }
+        // 鍛芥牸娌℃湁闇�瑕佹竻鐞嗙殑璧勬簮
     }
+
+    // ============ 瀹炵幇鎶借薄璁块棶鏂规硶 ============
+    
+    public override BattleObjectBuffMgr GetBuffMgr() => null; // 鍛芥牸涓嶆湁 buff 绯荤粺
+    
+    public override int GetPositionNum() => teamMingge.positionNum;
+    public override float GetModelScale() => teamMingge.modelScale;
+    public override string GetName() => teamMingge.name;
+    
+    protected override bool GetIsStunned() => teamMingge.isStunned;
+    protected override bool GetIsFrozen() => teamMingge.isFrozen;
+    protected override bool GetIsStoned() => teamMingge.isStoned;
+    protected override bool GetIsSlient() => teamMingge.isSlient;
+    protected override bool GetIsDisarmed() => teamMingge.isDisarmed;
+    protected override bool GetIsInvincible() => teamMingge.isInvinceble;
+    protected override bool GetIsDead() => teamMingge.isDead;
+    public override int GetRage() => teamMingge.rage;
+    
+    protected override void ApplyCasterHpChange(long newHp)
+    {
+        // 鍛芥牸娌℃湁琛�閲忥紝蹇界暐
+    }
+    
+    public override long GetCurHp() => 0;
+    public override long GetMaxHp() => 0;
+    public override void SetCurHp(long value) { }
+    public override void SetIsDead(bool value) { }
+    
+    public override int GetNPCID() => 0;
+    public override long GetFightPower() => 0;
 
     // ============ 鍔ㄧ敾鐩稿叧鏂规硶瀹炵幇锛堝懡鏍兼病鏈夊姩鐢伙級 ============
     
@@ -62,8 +90,39 @@
     
     public override Spine.TrackEntry PlaySkillAnimation(SkillConfig skillConfig, SkillBase skillBase, bool isCounter, Action onComplete)
     {
-        // 鍛芥牸娌℃湁鎶�鑳藉姩鐢伙紝鐩存帴瀹屾垚
+        // 鍛芥牸娌℃湁鎶�鑳藉姩鐢伙紝绔嬪嵆瑙﹀彂鎵�鏈夊抚浜嬩欢
+        int loopCount = skillConfig.LoopCount + 1; //榛樿浼氭湁涓�娆�
+        int frameCount = skillConfig.ActiveFrames.Length;
+        
+        // 1. 鎶�鑳藉紑濮�
+        skillBase.OnSkillStart();
+        
+        // 2. 鍓嶆憞缁撴潫
+        skillBase.OnStartSkillFrameEnd();
+        
+        // 3. 寰幆鎵ц涓憞
+        int triggerCount = 0;
+        for (int currentLoop = 0; currentLoop < loopCount; currentLoop++)
+        {
+            // 姣忎釜 loop 寮�濮嬫椂璋冪敤 OnMiddleFrameStart
+            skillBase.OnMiddleFrameStart(currentLoop);
+            
+            // 瑙﹀彂璇� loop 鐨勬墍鏈� ActiveFrame
+            for (int i = 0; i < frameCount; i++)
+            {
+                skillBase.OnMiddleFrameEnd(currentLoop, triggerCount++);
+            }
+        }
+        
+        // 4. 鍚庢憞寮�濮�
+         skillBase.OnFinalFrameStart();
+        
+        // 5. 瀹屾垚鍥炶皟
         onComplete?.Invoke();
+        
+        // 6. 鍚庢憞缁撴潫
+        skillBase.OnFinalFrameEnd();
+        
         return null;
     }
     
diff --git a/Main/System/Battle/BattleUtility.cs b/Main/System/Battle/BattleUtility.cs
index bb5744e..6bde282 100644
--- a/Main/System/Battle/BattleUtility.cs
+++ b/Main/System/Battle/BattleUtility.cs
@@ -180,7 +180,7 @@
                 {
                     uint objId = targetList[0].ObjID;
                     BattleObject target = caster.battleField.battleObjMgr.GetBattleObject((int)objId);
-                    return target.teamHero.positionNum;
+                    return target.GetPositionNum();
                 }
                 break;
             case 1:
@@ -191,7 +191,7 @@
                     BattleObject battleObject = caster.battleField.battleObjMgr.GetBattleObject((int)targetList[0].ObjID);
                     if (battleObject != null)
                     {
-                        returnIndex = battleObject.teamHero.positionNum;
+                        returnIndex = battleObject.GetPositionNum();
                     }
                     else
                     {
@@ -213,12 +213,12 @@
                 {
                     uint objId = targetList[0].ObjID;
                     BattleObject target = caster.battleField.battleObjMgr.GetBattleObject((int)objId);
-                    returnIndex = target.teamHero.positionNum;
+                    returnIndex = target.GetPositionNum();
                 }
                 else
                 {
                     //  鐪嬬湅瀵归潰鍓嶆帓鏄惁閮芥椿鐫�
-                    List<BattleObject> front = new List<BattleObject>(from bo in targetObjList where !bo.IsDead() && bo.teamHero.positionNum < 3 select bo);
+                    List<BattleObject> front = new List<BattleObject>(from bo in targetObjList where !bo.IsDead() && bo.GetPositionNum() < 3 select bo);
                     if (front.Count > 0)
                     {
                         returnIndex = 1;
@@ -234,12 +234,12 @@
                 {
                     uint objId = targetList[0].ObjID;
                     BattleObject target = caster.battleField.battleObjMgr.GetBattleObject((int)objId);
-                    returnIndex = target.teamHero.positionNum;
+                    returnIndex = target.GetPositionNum();
                 }
                 else
                 {
                     //  鐪嬬湅瀵归潰鍚庢帓鏄惁閮芥椿鐫�
-                    List<BattleObject> back = new List<BattleObject>(from bo in targetObjList where !bo.IsDead() && bo.teamHero.positionNum >= 3 select bo);
+                    List<BattleObject> back = new List<BattleObject>(from bo in targetObjList where !bo.IsDead() && bo.GetPositionNum() >= 3 select bo);
                     if (back.Count > 0)
                     {
                         returnIndex = 4;
@@ -264,13 +264,13 @@
                     }
                     else
                     {
-                        returnIndex = Mathf.Min(returnIndex, target.teamHero.positionNum);
+                        returnIndex = Mathf.Min(returnIndex, target.GetPositionNum());
                     }
                 }
                 break;
             // 5    鑷繁锛岄粯璁ゅ彧閫夎嚜宸�
             case 5:
-                returnIndex = caster.teamHero.positionNum;
+                returnIndex = caster.GetPositionNum();
                 break;
             case 6:
                 //  璺熼殢涓绘妧鑳界殑鐩爣
@@ -359,7 +359,7 @@
             }
             battleField.recordPlayer.EnableForceFinish(false);
         }
-        catch (System.Exception ex)
+        catch (System.Exception)
         {
             battleField.recordPlayer.EnableForceFinish(false);
         }
@@ -411,8 +411,9 @@
         BattleHurtObj hurter = new BattleHurtObj();
         hurter.hurtObj = target;
         hurter.damageList = damageList;
-        hurter.fromHp = target.teamHero.curHp;
-        hurter.fromShieldValue = target.buffMgr.GetShieldValue();
+        hurter.fromHp = target.GetCurHp();
+        var buffMgr = target.GetBuffMgr();
+        hurter.fromShieldValue = buffMgr != null ? buffMgr.GetShieldValue() : 0; // 鍛芥牸娌℃湁鎶ょ浘
 
         // 鍒ゆ柇鏄惁鏄渶鍚庝竴鍑�
         bool isLastHit = hitIndex >= skillConfig.DamageDivide.Length - 1;
@@ -429,7 +430,7 @@
         else
         {
             // 闈炴渶鍚庝竴鍑伙細瀹㈡埛绔绠椾腑闂磋閲�
-            long maxHp = target.teamHero.maxHp;
+            long maxHp = target.GetMaxHp();
 
             if (isHealing)
             {
@@ -442,13 +443,13 @@
                 if (hurter.fromShieldValue >= currentHitDamage)
                 {
                     hurter.toHp = hurter.fromHp;
-                    target.teamHero.curHp = hurter.toHp; // 淇濇寔涓�鑷存��
+                    target.SetCurHp(hurter.toHp); // 淇濇寔涓�鑷存��
                 }
                 else
                 {
                     long remainingDamage = currentHitDamage - hurter.fromShieldValue;
                     hurter.toHp = Math.Max(0, hurter.fromHp - remainingDamage);
-                    target.teamHero.curHp = hurter.toHp; // 淇濇寔涓�鑷存��
+                    target.SetCurHp(hurter.toHp); // 淇濇寔涓�鑷存��
                 }
             }
         }
@@ -481,9 +482,10 @@
         caster.reflectHpList = reflectHpList;
 
         // 鑾峰彇鏂芥硶鑰呭綋鍓嶇姸鎬�
-        long casterFromHp = skillBase.caster.teamHero.curHp;
-        long casterMaxHp = skillBase.caster.teamHero.maxHp;
-        long casterFromShield = skillBase.caster.buffMgr.GetShieldValue();
+        long casterFromHp = skillBase.caster.GetCurHp();
+        long casterMaxHp = skillBase.caster.GetMaxHp();
+        var buffMgr = skillBase.caster.GetBuffMgr();
+        long casterFromShield = buffMgr != null ? buffMgr.GetShieldValue() : 0; // 鍛芥牸娌℃湁鎶ょ浘
 
         caster.fromHp = casterFromHp;
         caster.fromShieldValue = casterFromShield;
@@ -517,7 +519,7 @@
 
         caster.toHp = casterToHp;
         caster.toShieldValue = casterToShield;
-        skillBase.caster.teamHero.curHp = caster.toHp; // 淇濇寔涓�鑷存��
+        skillBase.caster.SetCurHp(caster.toHp); // 淇濇寔涓�鑷存��
         
         return caster;
     }
@@ -807,7 +809,7 @@
         
         BattleDebug.LogError(
             $"{logColor}========== 琛�閲忎竴鑷存�ч獙璇� [{context}] {resultStr} ==========</color>\n" +
-            $"鐩爣: {hurter.hurtObj.teamHero.name} (ObjID:{hurter.hurtObj.ObjID})\n" +
+            $"鐩爣: {hurter.hurtObj.GetName()} (ObjID:{hurter.hurtObj.ObjID})\n" +
             $"鍑绘暟: 绗瑊hurtParam.hitIndex + 1}鍑� (鏈�鍚庝竴鍑�)\n" +
             $"鏈嶅姟鍣ㄦ渶缁堣閲�: {serverFinalHp}\n" +
             $"瀹㈡埛绔绠楄閲�: {clientFinalHp}\n" +
@@ -817,7 +819,7 @@
             $"鍒濆琛�閲�: {hurter.fromHp}\n" +
             $"鏈浼ゅ/娌荤枟: {(hurter.damageList != null ? hurter.damageList.Sum() : 0)}\n" +
             $"鏈�缁堣閲�: {clientFinalHp}\n" +
-            $"鏈�澶ц閲�: {hurter.hurtObj.teamHero.maxHp}\n" +
+            $"鏈�澶ц閲�: {hurter.hurtObj.GetMaxHp()}\n" +
             $"\n" +
             $"---- 鎶ょ浘鍙樺寲杩囩▼ ----\n" +
             $"鍒濆鎶ょ浘: {hurter.fromShieldValue}\n" +
@@ -829,7 +831,7 @@
         if (!isConsistent)
         {
             Debug.LogWarning(
-                $"[琛�閲忛獙璇佸け璐 鐩爣:{hurter.hurtObj.teamHero.name} " +
+                $"[琛�閲忛獙璇佸け璐 鐩爣:{hurter.hurtObj.GetName()} " +
                 $"鏈嶅姟鍣�:{serverFinalHp} vs 瀹㈡埛绔�:{clientFinalHp} " +
                 $"宸紓:{clientFinalHp - serverFinalHp}"
             );
@@ -860,7 +862,7 @@
         // 搴旂敤鍚歌
         if (totalSuckHp > 0)
         {
-            expectedHp = Math.Min(caster.casterObj.teamHero.maxHp, expectedHp + totalSuckHp);
+            expectedHp = Math.Min(caster.casterObj.GetMaxHp(), expectedHp + totalSuckHp);
         }
         
         // 搴旂敤鍙嶄激
@@ -885,7 +887,7 @@
         
         BattleDebug.LogError(
             $"{logColor}========== 鏂芥硶鑰呰閲忛獙璇� [{context}] {resultStr} ==========</color>\n" +
-            $"鏂芥硶鑰�: {caster.casterObj.teamHero.name} (ObjID:{caster.casterObj.ObjID})\n" +
+            $"鏂芥硶鑰�: {caster.casterObj.GetName()} (ObjID:{caster.casterObj.ObjID})\n" +
             $"鍑绘暟: 绗瑊hurtParam.hitIndex + 1}鍑� (鏈�鍚庝竴鍑�)\n" +
             $"棰勬湡鏈�缁堣閲�: {expectedHp}\n" +
             $"瀹為檯鏈�缁堣閲�: {clientFinalHp}\n" +
@@ -896,7 +898,7 @@
             $"鍚歌鎬婚噺: {totalSuckHp}\n" +
             $"鍙嶄激鎬婚噺: {totalReflectHp}\n" +
             $"鏈�缁堣閲�: {clientFinalHp}\n" +
-            $"鏈�澶ц閲�: {caster.casterObj.teamHero.maxHp}\n" +
+            $"鏈�澶ц閲�: {caster.casterObj.GetMaxHp()}\n" +
             $"\n" +
             $"---- 鎶ょ浘鍙樺寲杩囩▼ ----\n" +
             $"鍒濆鎶ょ浘: {caster.fromShieldValue}\n" +
@@ -909,7 +911,7 @@
         if (!isConsistent)
         {
             Debug.LogWarning(
-                $"[鏂芥硶鑰呰閲忚绠楅敊璇痌 {caster.casterObj.teamHero.name} " +
+                $"[鏂芥硶鑰呰閲忚绠楅敊璇痌 {caster.casterObj.GetName()} " +
                 $"棰勬湡:{expectedHp} vs 瀹為檯:{clientFinalHp} " +
                 $"宸紓:{clientFinalHp - expectedHp}"
             );
diff --git a/Main/System/Battle/BoneFieldBattleWin.cs b/Main/System/Battle/BoneFieldBattleWin.cs
index d720d7b..9d5df31 100644
--- a/Main/System/Battle/BoneFieldBattleWin.cs
+++ b/Main/System/Battle/BoneFieldBattleWin.cs
@@ -50,9 +50,10 @@
 
         if (bossBattleObject != null)
         {
-            if (bossBattleObject.buffMgr != null)
+            var buffMgr = bossBattleObject.GetBuffMgr();
+            if (buffMgr != null)
             {
-                bossBattleObject.buffMgr.onBuffChanged -= OnBuffChanged;
+                buffMgr.onBuffChanged -= OnBuffChanged;
             }
             bossBattleObject = null;
         }
@@ -126,9 +127,10 @@
 
         if (bossBattleObject != null)
         {
-            if (bossBattleObject.buffMgr != null)
+            var buffMgr = bossBattleObject.GetBuffMgr();
+            if (buffMgr != null)
             {
-                bossBattleObject.buffMgr.onBuffChanged -= OnBuffChanged;
+                buffMgr.onBuffChanged -= OnBuffChanged;
             }
             bossBattleObject = null;
         }
@@ -137,15 +139,19 @@
 
         DisplaySkillWordsList(lineupConfig);
 
-        if (null != bossBattleObject)
+        if (null != bossBattleObject && bossBattleObject is HeroBattleObject heroBattleObject)
         {
-            TeamHero teamHero = bossBattleObject.teamHero;
+            TeamHero teamHero = heroBattleObject.teamHero;
             bossHeadCell.SetTeamHero(teamHero);
             txtBossName.text = teamHero.name;
             NPCConfig npcConfig = NPCConfig.Get(teamHero.NPCID);
             bossLifeBar.SetBaseInfo(Mathf.Max(1, npcConfig.LifeBarCount), (ulong)teamHero.curHp, (ulong)teamHero.maxHp);
-            bossBattleObject.buffMgr.onBuffChanged -= OnBuffChanged;
-            bossBattleObject.buffMgr.onBuffChanged += OnBuffChanged;
+            var buffMgr = bossBattleObject.GetBuffMgr();
+            if (buffMgr != null)
+            {
+                buffMgr.onBuffChanged -= OnBuffChanged;
+                buffMgr.onBuffChanged += OnBuffChanged;
+            }
         }
         else
         {
@@ -172,16 +178,17 @@
         var buffList = new List<HB428_tagSCBuffRefresh>();
         if (null != bossBattleObject)
         {
-            buffList = bossBattleObject.buffMgr.GetBuffIconList();
+            var buffMgr = bossBattleObject.GetBuffMgr();
+            buffList = buffMgr != null ? buffMgr.GetBuffIconList() : new List<HB428_tagSCBuffRefresh>();
         }
         RefreshBuff(buffList);
     }
 
     private void RefreshHP()
     {
-        if (null != bossBattleObject)
+        if (null != bossBattleObject && bossBattleObject is HeroBattleObject heroBattleObject)
         {
-            TeamHero teamHero = bossBattleObject.teamHero;
+            TeamHero teamHero = heroBattleObject.teamHero;
             bossLifeBar.Show((ulong)teamHero.curHp, (ulong)teamHero.maxHp);
         }
     }
@@ -198,13 +205,13 @@
             return;
 
         // 鈽呪槄鈽� 瀹屽叏浣跨敤 StoryBossBattleWin 鐨勯�昏緫 鈽呪槄鈽�
-        if (info.battleHurtParam.hurter.hurtObj != null && bossBattleObject.teamHero.ObjID == info.battleHurtParam.hurter.hurtObj.teamHero.ObjID)
+        if (info.battleHurtParam.hurter.hurtObj != null && bossBattleObject.ObjID == info.battleHurtParam.hurter.hurtObj.ObjID)
         {
-            bossLifeBar.Show((ulong)info.battleHurtParam.hurter.toHp, (ulong)bossBattleObject.teamHero.maxHp);
+            bossLifeBar.Show((ulong)info.battleHurtParam.hurter.toHp, (ulong)bossBattleObject.GetMaxHp());
         }
-        else if (info.battleHurtParam.caster.casterObj != null && bossBattleObject.teamHero.ObjID == info.battleHurtParam.caster.casterObj.teamHero.ObjID)
+        else if (info.battleHurtParam.caster.casterObj != null && bossBattleObject.ObjID == info.battleHurtParam.caster.casterObj.ObjID)
         {
-            bossLifeBar.Show((ulong)info.battleHurtParam.caster.toHp, (ulong)bossBattleObject.teamHero.maxHp);
+            bossLifeBar.Show((ulong)info.battleHurtParam.caster.toHp, (ulong)bossBattleObject.GetMaxHp());
         }
     }
 
@@ -285,7 +292,10 @@
             return teamHeroes;
         foreach (var item in teams)
         {
-            teamHeroes.Add(item.teamHero);
+            if (item is HeroBattleObject heroBattleObject)
+            {
+                teamHeroes.Add(heroBattleObject.teamHero);
+            }
         }
         return teamHeroes;
 
diff --git a/Main/System/Battle/Buff/BattleObjectBuffMgr.cs b/Main/System/Battle/Buff/BattleObjectBuffMgr.cs
index 51420d4..6dcbb85 100644
--- a/Main/System/Battle/Buff/BattleObjectBuffMgr.cs
+++ b/Main/System/Battle/Buff/BattleObjectBuffMgr.cs
@@ -297,7 +297,7 @@
             else
             {
                 BattleEffectPlayer effect = battleObject.battleField.battleEffectMgr
-                    .PlayEffect(battleObject, skillConfig.BuffEffect, battleObject.GetRectTransform(), battleObject.Camp, battleObject.teamHero.modelScale);
+                    .PlayEffect(battleObject, skillConfig.BuffEffect, battleObject.GetRectTransform(), battleObject.Camp, battleObject.GetModelScale());
 
                 effect.BindBone(battleObject, effect.effectConfig.nodeName);
 
diff --git a/Main/System/Battle/Define/BattleDmgInfo.cs b/Main/System/Battle/Define/BattleDmgInfo.cs
index 8fd36fc..b01c645 100644
--- a/Main/System/Battle/Define/BattleDmgInfo.cs
+++ b/Main/System/Battle/Define/BattleDmgInfo.cs
@@ -518,17 +518,16 @@
             if (hurtObj == null)
                 return 0;
 
-            if (hurtObj.teamHero == null)
+            if (hurtObj is not HeroBattleObject)
                 return 0;
 
-            return hurtObj.teamHero.maxHp;
+            return hurtObj.GetMaxHp();
         }
         set
         {
-            if (hurtObj != null)
+            if (hurtObj is HeroBattleObject heroBattleObject)
             {
-                if (hurtObj.teamHero != null)
-                    hurtObj.teamHero.maxHp = value;
+                heroBattleObject.teamHero.maxHp = value;
             }
         }
     }
@@ -572,17 +571,16 @@
             if (null == casterObj)
                 return 0;
 
-            if (null == casterObj.teamHero)
+            if (casterObj is not HeroBattleObject)
                 return 0;
 
-            return casterObj.teamHero.maxHp;
+            return casterObj.GetMaxHp();
         }
         set
         {
-            if (casterObj != null)
+            if (casterObj is HeroBattleObject heroBattleObject)
             {
-                if (casterObj.teamHero != null)
-                    casterObj.teamHero.maxHp = value;
+                heroBattleObject.teamHero.maxHp = value;
             }
         }
     }
diff --git a/Main/System/Battle/Skill/RebornSkill.cs b/Main/System/Battle/Skill/RebornSkill.cs
index 27c2d90..df6fb7b 100644
--- a/Main/System/Battle/Skill/RebornSkill.cs
+++ b/Main/System/Battle/Skill/RebornSkill.cs
@@ -28,7 +28,7 @@
 			BattleObject battleObject = battleField.battleObjMgr.GetBattleObject((int)hitList[i].ObjID);
 			if (battleObject != null)
 			{
-				battleObject.OnReborn(hurt, hurt.ObjID == caster.teamHero.ObjID, ownRecordAction);
+				battleObject.OnReborn(hurt, hurt.ObjID == caster.ObjID, ownRecordAction);
 				rebornTargets.Add(battleObject);
 			}
 		}
@@ -42,10 +42,13 @@
 				if (battleObject != null)
 				{
 					battleField.OnObjReborn(tagUseSkillAttack.HurtList[i].ObjID);
-					battleObject.teamHero.curHp = GeneralDefine.GetFactValue(hurt.CurHP, hurt.CurHPEx);
 					
-					// Debug.LogError("OnReborn " + teamHero.curHp);
-					battleObject.teamHero.isDead = false;
+					// 濡傛灉鏄� HeroBattleObject锛屾洿鏂板叾 curHp 鍜� isDead
+					if (battleObject is HeroBattleObject heroBattleObject)
+					{
+						heroBattleObject.SetCurHp(GeneralDefine.GetFactValue(hurt.CurHP, hurt.CurHPEx));
+						heroBattleObject.SetIsDead(false);
+					}
 				}
 			}
         });
diff --git a/Main/System/Battle/Skill/SkillBase.cs b/Main/System/Battle/Skill/SkillBase.cs
index 501e71f..8f6daea 100644
--- a/Main/System/Battle/Skill/SkillBase.cs
+++ b/Main/System/Battle/Skill/SkillBase.cs
@@ -92,7 +92,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);
             
@@ -125,7 +125,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);
                 
@@ -240,7 +240,13 @@
     {
         // 骞挎挱鎶�鑳介噴鏀句簨浠�
         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)
@@ -327,7 +333,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();
@@ -352,7 +358,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, () =>
             {
@@ -375,7 +381,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();
@@ -681,7 +687,7 @@
     // 鍛戒腑鐩爣鍥炶皟锛氬鐞嗘墍鏈夎鍛戒腑鐨勭洰鏍囷紙鍖呮嫭涓荤洰鏍囥�佸脊灏勭洰鏍囥�佹簠灏勭洰鏍囷級
     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();
@@ -789,7 +795,7 @@
                         Hint(battleObject, hintConfig);
                         battleField.battleEffectMgr.PlayEffect(battleObject, 
                             BattleConst.BreakArmorEffectID, battleObject.GetRectTransform(), battleObject.Camp, 
-                            battleObject.teamHero.modelScale);
+                            battleObject.GetModelScale());
                     }
                 }
                 else if ((hurt.AttackTypes & (int)DamageType.Parry) == (int)DamageType.Parry)
@@ -801,7 +807,7 @@
                         Hint(battleObject, hintConfig);
                         battleField.battleEffectMgr.PlayEffect(battleObject, 
                             BattleConst.ParryEffectID, battleObject.GetRectTransform(), battleObject.Camp, 
-                            battleObject.teamHero.modelScale);
+                            battleObject.GetModelScale());
                     }
                 }
             }
@@ -889,8 +895,8 @@
         
         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" +
             $"\n" +
@@ -1552,7 +1558,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)
@@ -1560,7 +1570,11 @@
                 BattleObject battleObj = battleField.battleObjMgr.GetBattleObject((int)buffDel.ObjID);
                 if (battleObj != null)
                 {
-                    battleObj.buffMgr.RemoveBuff(buffDel, false);
+                    var buffMgr = battleObj.GetBuffMgr();
+                    if (buffMgr != null) // 鍛芥牸涓嶆湁 buff 绠$悊鍣�
+                    {
+                        buffMgr.RemoveBuff(buffDel, false);
+                    }
                 }
             }
         }
diff --git a/Main/System/Battle/Skill/SkillFactory.cs b/Main/System/Battle/Skill/SkillFactory.cs
index 6eaa2ae..7fcf750 100644
--- a/Main/System/Battle/Skill/SkillFactory.cs
+++ b/Main/System/Battle/Skill/SkillFactory.cs
@@ -75,7 +75,7 @@
 			case 5:
 			case 6:
 			case 14:
-			case 15:
+			case 15: 
 				skill = new MountBuffSkill(_caster, skillConfig, vNetData, packList, battleField);
 				break;
 
diff --git a/Main/System/Battle/SkillEffect/BulletSkillEffect.cs b/Main/System/Battle/SkillEffect/BulletSkillEffect.cs
index e5e7f6d..8681814 100644
--- a/Main/System/Battle/SkillEffect/BulletSkillEffect.cs
+++ b/Main/System/Battle/SkillEffect/BulletSkillEffect.cs
@@ -146,9 +146,9 @@
                     continue;
                 }
 
-                minimumIndex = Mathf.Min(target.teamHero.positionNum, minimumIndex);
+                minimumIndex = Mathf.Min(target.GetPositionNum(), minimumIndex);
 
-                if (target.Camp == battleCamp && target.teamHero.positionNum < 3)
+                if (target.Camp == battleCamp && target.GetPositionNum() < 3)
                 {
                     targetIndex = 1;
                     break;
@@ -172,7 +172,7 @@
     private void ShotToIndex(BattleCamp camp, int targetIndex, int bulletIndex)
     {
         RectTransform targetTransform = caster.battleField.GetTeamNode(camp, targetIndex);
-        BattleEffectPlayer effectPlayer = caster.battleField.battleEffectMgr.PlayEffect(caster, skillConfig.BulletEffectId, caster.GetRectTransform(), caster.Camp, caster.teamHero.modelScale);
+        BattleEffectPlayer effectPlayer = caster.battleField.battleEffectMgr.PlayEffect(caster, skillConfig.BulletEffectId, caster.GetRectTransform(), caster.Camp, caster.GetModelScale());
 
         RectTransform effectTrans = effectPlayer.transform as RectTransform;
 
@@ -198,8 +198,8 @@
                     continue;
                 }
 
-                PlayExplosionEffect(skillConfig.ExplosionEffect3, targetObj.GetTransform(), caster.Camp, targetObj.teamHero.modelScale);
-                PlayExplosionEffect(skillConfig.ExplosionEffect4, targetObj.GetTransform(), caster.Camp, targetObj.teamHero.modelScale);
+                PlayExplosionEffect(skillConfig.ExplosionEffect3, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale());
+                PlayExplosionEffect(skillConfig.ExplosionEffect4, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale());
             }
 
             // 琛ㄧ幇瀛愬脊椋炶鍒扮洰鏍囦綅缃�
@@ -238,13 +238,13 @@
                     continue;
                 }
 
-                if (target.Camp == battleCamp && target.teamHero.positionNum > 3)
+                if (target.Camp == battleCamp && target.GetPositionNum() > 3)
                 {
                     targetIndex = 4;
                     break;
                 }
 
-                maxinumIndex = Mathf.Max(target.teamHero.positionNum, maxinumIndex);
+                maxinumIndex = Mathf.Max(target.GetPositionNum(), maxinumIndex);
             }
 
             if (targetIndex == int.MaxValue)
@@ -276,7 +276,7 @@
                 continue;
             }
 
-            minimumIndex = Mathf.Min(target.teamHero.positionNum, minimumIndex);
+            minimumIndex = Mathf.Min(target.GetPositionNum(), minimumIndex);
         }
 
         if (minimumIndex != int.MaxValue)
@@ -296,7 +296,7 @@
     private void SelfShoting(int index)
     {
         // 榛樿鍙�夎嚜宸憋紝鑷繁涓轰富鐩爣
-        ShotToIndex(caster.Camp, caster.teamHero.positionNum, index);
+        ShotToIndex(caster.Camp, caster.GetPositionNum(), index);
     }
 
     //  鏁e皠
@@ -328,7 +328,7 @@
 
     private void ScatterShot(BattleObject target, HB427_tagSCUseSkill.tagSCUseSkillHurt hurt, int bulletIndex, int order)
     {
-        BattleEffectPlayer effectPlayer = caster.battleField.battleEffectMgr.PlayEffect(caster, skillConfig.BulletEffectId, caster.GetRectTransform(), caster.Camp, caster.teamHero.modelScale);
+        BattleEffectPlayer effectPlayer = caster.battleField.battleEffectMgr.PlayEffect(caster, skillConfig.BulletEffectId, caster.GetRectTransform(), caster.Camp, caster.GetModelScale());
 
         bool shotToSelf = target.ObjID == caster.ObjID;
 
@@ -348,10 +348,10 @@
                     continue;
                 }
 
-                PlayExplosionEffect(skillConfig.ExplosionEffectId, targetObj.GetTransform(), caster.Camp, targetObj.teamHero.modelScale);
-                PlayExplosionEffect(skillConfig.ExplosionEffect2, targetObj.GetTransform(), caster.Camp, targetObj.teamHero.modelScale);
-                PlayExplosionEffect(skillConfig.ExplosionEffect3, targetObj.GetTransform(), caster.Camp, targetObj.teamHero.modelScale);
-                PlayExplosionEffect(skillConfig.ExplosionEffect4, targetObj.GetTransform(), caster.Camp, targetObj.teamHero.modelScale);
+                PlayExplosionEffect(skillConfig.ExplosionEffectId, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale());
+                PlayExplosionEffect(skillConfig.ExplosionEffect2, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale());
+                PlayExplosionEffect(skillConfig.ExplosionEffect3, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale());
+                PlayExplosionEffect(skillConfig.ExplosionEffect4, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale());
             }
 
             // 琛ㄧ幇瀛愬脊椋炶鍒扮洰鏍囦綅缃�
@@ -374,7 +374,7 @@
 
     protected void ShotToTarget(BattleObject target, int bulletIndex)
     {
-        BattleEffectPlayer effectPlayer = caster.battleField.battleEffectMgr.PlayEffect(caster, skillConfig.BulletEffectId, caster.GetRectTransform(), caster.Camp, caster.teamHero.modelScale);
+        BattleEffectPlayer effectPlayer = caster.battleField.battleEffectMgr.PlayEffect(caster, skillConfig.BulletEffectId, caster.GetRectTransform(), caster.Camp, caster.GetModelScale());
 
         bool shotToSelf = target.ObjID == caster.ObjID;
 
@@ -396,10 +396,10 @@
                 BattleObject targetObj = caster.battleField.battleObjMgr.GetBattleObject((int)hurt.ObjID);
                 if (targetObj != null)
                 {
-                    PlayExplosionEffect(skillConfig.ExplosionEffectId, targetObj.GetTransform(), caster.Camp, targetObj.teamHero.modelScale);
-                    PlayExplosionEffect(skillConfig.ExplosionEffect2, targetObj.GetTransform(), caster.Camp, targetObj.teamHero.modelScale);
-                    PlayExplosionEffect(skillConfig.ExplosionEffect3, targetObj.GetTransform(), caster.Camp, targetObj.teamHero.modelScale);
-                    PlayExplosionEffect(skillConfig.ExplosionEffect4, targetObj.GetTransform(), caster.Camp, targetObj.teamHero.modelScale);
+                    PlayExplosionEffect(skillConfig.ExplosionEffectId, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale());
+                    PlayExplosionEffect(skillConfig.ExplosionEffect2, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale());
+                    PlayExplosionEffect(skillConfig.ExplosionEffect3, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale());
+                    PlayExplosionEffect(skillConfig.ExplosionEffect4, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale());
                 }
                 else
                 {
@@ -433,10 +433,10 @@
                         continue;
                     }
 
-                    PlayExplosionEffect(skillConfig.ExplosionEffectId, targetObj.GetTransform(), caster.Camp, targetObj.teamHero.modelScale);
-                    PlayExplosionEffect(skillConfig.ExplosionEffect2, targetObj.GetTransform(), caster.Camp, targetObj.teamHero.modelScale);
-                    PlayExplosionEffect(skillConfig.ExplosionEffect3, targetObj.GetTransform(), caster.Camp, targetObj.teamHero.modelScale);
-                    PlayExplosionEffect(skillConfig.ExplosionEffect4, targetObj.GetTransform(), caster.Camp, targetObj.teamHero.modelScale);
+                    PlayExplosionEffect(skillConfig.ExplosionEffectId, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale());
+                    PlayExplosionEffect(skillConfig.ExplosionEffect2, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale());
+                    PlayExplosionEffect(skillConfig.ExplosionEffect3, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale());
+                    PlayExplosionEffect(skillConfig.ExplosionEffect4, targetObj.GetTransform(), caster.Camp, targetObj.GetModelScale());
                 }
 
                 // 琛ㄧ幇瀛愬脊椋炶鍒扮洰鏍囦綅缃�
diff --git a/Main/System/Battle/SkillEffect/DotSkillEffect.cs b/Main/System/Battle/SkillEffect/DotSkillEffect.cs
index 8acbe08..955e189 100644
--- a/Main/System/Battle/SkillEffect/DotSkillEffect.cs
+++ b/Main/System/Battle/SkillEffect/DotSkillEffect.cs
@@ -31,7 +31,7 @@
                 Debug.LogError($"DotSkillEffect 鎵句笉鍒扮洰鏍囷紝GUID={hurtInfo.ObjID}");
                 continue;
             }
-            target.battleField.battleEffectMgr.PlayEffect(caster, skillConfig.TriggerEffect, target.GetRectTransform(), caster.Camp, target.teamHero.modelScale);
+            target.battleField.battleEffectMgr.PlayEffect(caster, skillConfig.TriggerEffect, target.GetRectTransform(), caster.Camp, target.GetModelScale());
         }
 
         onHit?.Invoke(0, tagUseSkillAttack.HurtList.ToList());
diff --git a/Main/System/Battle/SkillEffect/NoEffect.cs b/Main/System/Battle/SkillEffect/NoEffect.cs
index a473f36..2f29323 100644
--- a/Main/System/Battle/SkillEffect/NoEffect.cs
+++ b/Main/System/Battle/SkillEffect/NoEffect.cs
@@ -50,11 +50,11 @@
 
             if (skillConfig.ExplosionEffect3 > 0)
             {
-                caster.battleField.battleEffectMgr.PlayEffect(target, skillConfig.ExplosionEffect3, target.GetTransform(), caster.Camp, target.teamHero.modelScale);
+                caster.battleField.battleEffectMgr.PlayEffect(target, skillConfig.ExplosionEffect3, target.GetTransform(), caster.Camp, target.GetModelScale());
             }
             if (skillConfig.ExplosionEffect4 > 0)
             {
-                caster.battleField.battleEffectMgr.PlayEffect(target, skillConfig.ExplosionEffect4, target.GetTransform(), caster.Camp, target.teamHero.modelScale);
+                caster.battleField.battleEffectMgr.PlayEffect(target, skillConfig.ExplosionEffect4, target.GetTransform(), caster.Camp, target.GetModelScale());
             }
         }
 
diff --git a/Main/System/Battle/SkillEffect/NormalSkillEffect.cs b/Main/System/Battle/SkillEffect/NormalSkillEffect.cs
index a8ee564..45326f3 100644
--- a/Main/System/Battle/SkillEffect/NormalSkillEffect.cs
+++ b/Main/System/Battle/SkillEffect/NormalSkillEffect.cs
@@ -49,11 +49,11 @@
 
             if (skillConfig.ExplosionEffect3 > 0)
             {
-                caster.battleField.battleEffectMgr.PlayEffect(target, skillConfig.ExplosionEffect3, target.GetTransform(), caster.Camp, target.teamHero.modelScale);
+                caster.battleField.battleEffectMgr.PlayEffect(target, skillConfig.ExplosionEffect3, target.GetTransform(), caster.Camp, target.GetModelScale());
             }
             if (skillConfig.ExplosionEffect4 > 0)
             {
-                caster.battleField.battleEffectMgr.PlayEffect(target, skillConfig.ExplosionEffect4, target.GetTransform(), caster.Camp, target.teamHero.modelScale);
+                caster.battleField.battleEffectMgr.PlayEffect(target, skillConfig.ExplosionEffect4, target.GetTransform(), caster.Camp, target.GetModelScale());
             }
         }
 
diff --git a/Main/System/Battle/SkillEffect/SkillEffect.cs b/Main/System/Battle/SkillEffect/SkillEffect.cs
index e0ffdd3..538dc6b 100644
--- a/Main/System/Battle/SkillEffect/SkillEffect.cs
+++ b/Main/System/Battle/SkillEffect/SkillEffect.cs
@@ -29,13 +29,13 @@
         onHit = _onHit;
         if (skillConfig.EffectId > 0)
         {
-            caster.battleField.battleEffectMgr.PlayEffect(caster, skillConfig.EffectId, caster.GetRectTransform(), caster.Camp, caster.teamHero.modelScale);
+            caster.battleField.battleEffectMgr.PlayEffect(caster, skillConfig.EffectId, caster.GetRectTransform(), caster.Camp, caster.GetModelScale());
         }
         if (skillConfig.EffectId2 > 0)
         {
-            caster.battleField.battleEffectMgr.PlayEffect(caster, skillConfig.EffectId2, caster.GetRectTransform(), caster.Camp, caster.teamHero.modelScale);
+            caster.battleField.battleEffectMgr.PlayEffect(caster, skillConfig.EffectId2, caster.GetRectTransform(), caster.Camp, caster.GetModelScale());
         }
-    }
+     }
 
     public virtual void Run()
     {
@@ -52,7 +52,7 @@
         if (skillConfig.MStartEffectId <= 0)
             return;
         //  涓憞鍥哄畾鐗规晥
-        caster.battleField.battleEffectMgr.PlayEffect(caster, skillConfig.MStartEffectId, caster.GetTransform(), caster.Camp, caster.teamHero.modelScale);
+        caster.battleField.battleEffectMgr.PlayEffect(caster, skillConfig.MStartEffectId, caster.GetTransform(), caster.Camp, caster.GetModelScale());
     }
     
     /// <summary>
diff --git a/Main/System/Battle/StoryBossBattleWin.cs b/Main/System/Battle/StoryBossBattleWin.cs
index c6fb4bf..7092850 100644
--- a/Main/System/Battle/StoryBossBattleWin.cs
+++ b/Main/System/Battle/StoryBossBattleWin.cs
@@ -37,7 +37,11 @@
 
         if (null != bossBattleObject)
         {
-            bossBattleObject.buffMgr.onBuffChanged -= OnBuffChanged;
+            var buffMgr = bossBattleObject.GetBuffMgr();
+            if (buffMgr != null)
+            {
+                buffMgr.onBuffChanged -= OnBuffChanged;
+            }
             bossBattleObject = null;
         }
 
@@ -103,7 +107,11 @@
 
         if (null != bossBattleObject)
         {
-            bossBattleObject.buffMgr.onBuffChanged -= OnBuffChanged;
+            var buffMgr = bossBattleObject.GetBuffMgr();
+            if (buffMgr != null)
+            {
+                buffMgr.onBuffChanged -= OnBuffChanged;
+            }
             bossBattleObject = null;
         }
 
@@ -111,15 +119,19 @@
 
         DisplaySkillWordsList(lineupConfig);
 
-        if (null != bossBattleObject)
+        if (null != bossBattleObject && bossBattleObject is HeroBattleObject heroBattleObject)
         {
-            TeamHero teamHero = bossBattleObject.teamHero;
+            TeamHero teamHero = heroBattleObject.teamHero;
             bossHeadCell.SetTeamHero(teamHero);
             txtBossName.text = teamHero.name;
             NPCConfig npcConfig = NPCConfig.Get(teamHero.NPCID);
             bossLifeBar.SetBaseInfo(Mathf.Max(1, npcConfig.LifeBarCount), (ulong)teamHero.curHp, (ulong)teamHero.maxHp);
-            bossBattleObject.buffMgr.onBuffChanged -= OnBuffChanged;
-            bossBattleObject.buffMgr.onBuffChanged += OnBuffChanged;
+            var buffMgr = bossBattleObject.GetBuffMgr();
+            if (buffMgr != null)
+            {
+                buffMgr.onBuffChanged -= OnBuffChanged;
+                buffMgr.onBuffChanged += OnBuffChanged;
+            }
         }
         else
         {
@@ -146,16 +158,20 @@
         var buffList = new List<HB428_tagSCBuffRefresh>();
         if (null != bossBattleObject)
         {
-            buffList = bossBattleObject.buffMgr.GetBuffIconList();
+            var buffMgr = bossBattleObject.GetBuffMgr();
+            if (buffMgr != null) // 鍛芥牸涓嶆湁 buff
+            {
+                buffList = buffMgr.GetBuffIconList();
+            }
         }
         RefreshBuff(buffList);
     }
 
     private void RefreshHP()
     {
-        if (null != bossBattleObject)
+        if (null != bossBattleObject && bossBattleObject is HeroBattleObject heroBattleObject)
         {
-            TeamHero teamHero = bossBattleObject.teamHero;
+            TeamHero teamHero = heroBattleObject.teamHero;
             bossLifeBar.Show((ulong)teamHero.curHp, (ulong)teamHero.maxHp);
         }
     }
@@ -170,16 +186,16 @@
         if (null == bossBattleObject)
             return;
         
-        if (null == bossBattleObject.teamHero)
+        if (null == bossBattleObject || bossBattleObject is not HeroBattleObject)
             return;
 
-        if (info.battleHurtParam.hurter.hurtObj != null && info.battleHurtParam.hurter.hurtObj.teamHero != null && bossBattleObject.teamHero.ObjID == info.battleHurtParam.hurter.hurtObj.teamHero.ObjID)
+        if (info.battleHurtParam.hurter.hurtObj != null && info.battleHurtParam.hurter.hurtObj is HeroBattleObject && bossBattleObject.ObjID == info.battleHurtParam.hurter.hurtObj.ObjID)
         {
-            bossLifeBar.Show((ulong)info.battleHurtParam.hurter.toHp, (ulong)bossBattleObject.teamHero.maxHp);
+            bossLifeBar.Show((ulong)info.battleHurtParam.hurter.toHp, (ulong)bossBattleObject.GetMaxHp());
         }
-        else if (info.battleHurtParam.caster.casterObj != null && info.battleHurtParam.caster.casterObj.teamHero != null && bossBattleObject.teamHero.ObjID == info.battleHurtParam.caster.casterObj.teamHero.ObjID)
+        else if (info.battleHurtParam.caster.casterObj != null && info.battleHurtParam.caster.casterObj is HeroBattleObject && bossBattleObject.ObjID == info.battleHurtParam.caster.casterObj.ObjID)
         {
-            bossLifeBar.Show((ulong)info.battleHurtParam.caster.toHp, (ulong)bossBattleObject.teamHero.maxHp);
+            bossLifeBar.Show((ulong)info.battleHurtParam.caster.toHp, (ulong)bossBattleObject.GetMaxHp());
         }
     }
 
@@ -250,7 +266,10 @@
             return teamHeroes;
         foreach (var item in teams)
         {
-            teamHeroes.Add(item.teamHero);
+            if (item is HeroBattleObject heroBattleObject)
+            {
+                teamHeroes.Add(heroBattleObject.teamHero);
+            }
         }
         return teamHeroes;
 
diff --git a/Main/System/Battle/TianziBillboradBattleWin.cs b/Main/System/Battle/TianziBillboradBattleWin.cs
index 336dcec..0b28f1f 100644
--- a/Main/System/Battle/TianziBillboradBattleWin.cs
+++ b/Main/System/Battle/TianziBillboradBattleWin.cs
@@ -69,9 +69,10 @@
 
         if (bossBattleObject != null)
         {
-            if (bossBattleObject.buffMgr != null)
+            var buffMgr = bossBattleObject.GetBuffMgr();
+            if (buffMgr != null)
             {
-                bossBattleObject.buffMgr.onBuffChanged -= OnBuffChanged;
+                buffMgr.onBuffChanged -= OnBuffChanged;
             }
             bossBattleObject = null;
         }
@@ -175,9 +176,10 @@
 
         if (bossBattleObject != null)
         {
-            if (bossBattleObject.buffMgr != null)
+            var buffMgr = bossBattleObject.GetBuffMgr();
+            if (buffMgr != null)
             {
-                bossBattleObject.buffMgr.onBuffChanged -= OnBuffChanged;
+                buffMgr.onBuffChanged -= OnBuffChanged;
             }
             bossBattleObject = null;
         }
@@ -189,14 +191,18 @@
 
         tianziDamageBar.Init();
 
-        if (null != bossBattleObject)
+        if (null != bossBattleObject && bossBattleObject is HeroBattleObject heroBattleObject)
         {
-            TeamHero teamHero = bossBattleObject.teamHero;
+            TeamHero teamHero = heroBattleObject.teamHero;
             bossHeadCell.SetTeamHero(teamHero);
             txtBossName.text = teamHero.name;
             NPCConfig npcConfig = NPCConfig.Get(teamHero.NPCID);
-            bossBattleObject.buffMgr.onBuffChanged -= OnBuffChanged;
-            bossBattleObject.buffMgr.onBuffChanged += OnBuffChanged;
+            var buffMgr = bossBattleObject.GetBuffMgr();
+            if (buffMgr != null)
+            {
+                buffMgr.onBuffChanged -= OnBuffChanged;
+                buffMgr.onBuffChanged += OnBuffChanged;
+            }
         }
         else
         {
@@ -235,7 +241,8 @@
         var buffList = new List<HB428_tagSCBuffRefresh>();
         if (null != bossBattleObject)
         {
-            buffList = bossBattleObject.buffMgr.GetBuffIconList();
+            var buffMgr = bossBattleObject.GetBuffMgr();
+            buffList = buffMgr != null ? buffMgr.GetBuffIconList() : new List<HB428_tagSCBuffRefresh>();
         }
         RefreshBuff(buffList);
     }
@@ -335,7 +342,8 @@
             return teamHeroes;
         foreach (var item in teams)
         {
-            teamHeroes.Add(item.teamHero);
+            if (item is HeroBattleObject heroObj)
+                teamHeroes.Add(heroObj.teamHero);
         }
         return teamHeroes;
 
diff --git a/Main/System/Battle/UIComp/BattleHeroInfoBar.cs b/Main/System/Battle/UIComp/BattleHeroInfoBar.cs
index 0d68a2c..4f7371b 100644
--- a/Main/System/Battle/UIComp/BattleHeroInfoBar.cs
+++ b/Main/System/Battle/UIComp/BattleHeroInfoBar.cs
@@ -80,20 +80,28 @@
     public void SetBattleObject(BattleObject _battleObject)
     {
         battleObject = _battleObject;
-        heroInfoContainer.SetHeroInfo(battleObject.teamHero);
+        if (battleObject is HeroBattleObject heroBattleObject)
+        {
+            heroInfoContainer.SetHeroInfo(heroBattleObject.teamHero);
+        }
         CleanupTips();
-        RefreshBuff(battleObject.buffMgr.GetBuffIconList());
+        
+        var buffMgr = battleObject.GetBuffMgr();
+        if (buffMgr != null) // 鍛芥牸涓嶆湁 buff
+        {
+            RefreshBuff(buffMgr.GetBuffIconList());
+        }
 
         if (!battleObject.IsTianziBoss())
         {
-            UpdateHP(battleObject.teamHero.curHp, battleObject.teamHero.curHp, battleObject.teamHero.maxHp, false);
+            UpdateHP(battleObject.GetCurHp(), battleObject.GetCurHp(), battleObject.GetMaxHp(), false);
         }
 
-        UpdateXP(battleObject.teamHero.rage, battleObject.teamHero.rage, 100, false);
+        UpdateXP(battleObject.GetRage(), battleObject.GetRage(), 100, false);
 
-        long shieldValue = battleObject.buffMgr.GetShieldValue();
-        long curHp = battleObject.teamHero.curHp;
-        long maxHp = battleObject.teamHero.maxHp;
+        long shieldValue = buffMgr != null ? buffMgr.GetShieldValue() : 0; // 鍛芥牸娌℃湁鎶ょ浘
+        long curHp = battleObject.GetCurHp();
+        long maxHp = battleObject.GetMaxHp();
         
         // 璁板綍璁剧疆鍓嶇殑鎶ょ浘鍊�
         float oldShield1Value = sliderShield1.value;
@@ -149,9 +157,10 @@
         }
 
         // check shield buff
-        long shieldValue = battleObject.buffMgr.GetShieldValue();
-        long curHp = battleObject.teamHero.curHp;
-        long maxHp = battleObject.teamHero.maxHp;
+        var buffMgr = battleObject.GetBuffMgr();
+        long shieldValue = buffMgr != null ? buffMgr.GetShieldValue() : 0; // 鍛芥牸娌℃湁鎶ょ浘
+        long curHp = battleObject.GetCurHp();
+        long maxHp = battleObject.GetMaxHp();
         
         // 璁板綍璁剧疆鍓嶇殑鎶ょ浘鍊�
         float oldShield1Value = sliderShield1.value;
diff --git a/Main/System/Battle/WarlordPavilionBattleWin.cs b/Main/System/Battle/WarlordPavilionBattleWin.cs
index da520a4..fd81a7c 100644
--- a/Main/System/Battle/WarlordPavilionBattleWin.cs
+++ b/Main/System/Battle/WarlordPavilionBattleWin.cs
@@ -50,9 +50,10 @@
 
         if (bossBattleObject != null)
         {
-            if (bossBattleObject.buffMgr != null)
+            var buffMgr = bossBattleObject.GetBuffMgr();
+            if (buffMgr != null)
             {
-                bossBattleObject.buffMgr.onBuffChanged -= OnBuffChanged;
+                buffMgr.onBuffChanged -= OnBuffChanged;
             }
             bossBattleObject = null;
         }
@@ -126,9 +127,10 @@
 
         if (bossBattleObject != null)
         {
-            if (bossBattleObject.buffMgr != null)
+            var buffMgr = bossBattleObject.GetBuffMgr();
+            if (buffMgr != null)
             {
-                bossBattleObject.buffMgr.onBuffChanged -= OnBuffChanged;
+                buffMgr.onBuffChanged -= OnBuffChanged;
             }
             bossBattleObject = null;
         }
@@ -140,15 +142,19 @@
 
         DisplaySkillWordsList(lineupConfig);
 
-        if (null != bossBattleObject)
+        if (null != bossBattleObject && bossBattleObject is HeroBattleObject heroBattleObject)
         {
-            TeamHero teamHero = bossBattleObject.teamHero;
+            TeamHero teamHero = heroBattleObject.teamHero;
             bossHeadCell.SetTeamHero(teamHero);
             //txtBossName.text = teamHero.name;
             NPCConfig npcConfig = NPCConfig.Get(teamHero.NPCID);
             //bossLifeBar.SetBaseInfo(Mathf.Max(1, npcConfig.LifeBarCount), (ulong)teamHero.curHp, (ulong)teamHero.maxHp);
-            bossBattleObject.buffMgr.onBuffChanged -= OnBuffChanged;
-            bossBattleObject.buffMgr.onBuffChanged += OnBuffChanged;
+            var buffMgr = bossBattleObject.GetBuffMgr();
+            if (buffMgr != null)
+            {
+                buffMgr.onBuffChanged -= OnBuffChanged;
+                buffMgr.onBuffChanged += OnBuffChanged;
+            }
         }
         else
         {
@@ -175,16 +181,17 @@
         var buffList = new List<HB428_tagSCBuffRefresh>();
         if (null != bossBattleObject)
         {
-            buffList = bossBattleObject.buffMgr.GetBuffIconList();
+            var buffMgr = bossBattleObject.GetBuffMgr();
+            buffList = buffMgr != null ? buffMgr.GetBuffIconList() : new List<HB428_tagSCBuffRefresh>();
         }
         RefreshBuff(buffList);
     }
 
     private void RefreshHP()
     {
-        if (null != bossBattleObject)
+        if (null != bossBattleObject && bossBattleObject is HeroBattleObject heroBattleObject)
         {
-            TeamHero teamHero = bossBattleObject.teamHero;
+            TeamHero teamHero = heroBattleObject.teamHero;
             //bossLifeBar.Show((ulong)teamHero.curHp, (ulong)teamHero.maxHp);
         }
     }
@@ -201,11 +208,11 @@
             return;
 
         // 鈽呪槄鈽� 瀹屽叏浣跨敤 StoryBossBattleWin 鐨勯�昏緫 鈽呪槄鈽�
-        if (info.battleHurtParam.hurter.hurtObj != null && bossBattleObject.teamHero.ObjID == info.battleHurtParam.hurter.hurtObj.teamHero.ObjID)
+        if (info.battleHurtParam.hurter.hurtObj != null && bossBattleObject.ObjID == info.battleHurtParam.hurter.hurtObj.ObjID)
         {
             //bossLifeBar.Show((ulong)info.battleHurtParam.hurter.toHp, (ulong)bossBattleObject.teamHero.maxHp);
         }
-        else if (info.battleHurtParam.caster.casterObj != null && bossBattleObject.teamHero.ObjID == info.battleHurtParam.caster.casterObj.teamHero.ObjID)
+        else if (info.battleHurtParam.caster.casterObj != null && bossBattleObject.ObjID == info.battleHurtParam.caster.casterObj.ObjID)
         {
             //bossLifeBar.Show((ulong)info.battleHurtParam.caster.toHp, (ulong)bossBattleObject.teamHero.maxHp);
         }
@@ -288,7 +295,10 @@
             return teamHeroes;
         foreach (var item in teams)
         {
-            teamHeroes.Add(item.teamHero);
+            if (item is HeroBattleObject heroBattleObject)
+            {
+                teamHeroes.Add(heroBattleObject.teamHero);
+            }
         }
         return teamHeroes;
 
diff --git a/Main/System/OtherPlayerDetail/OtherHeroDetailWin.cs b/Main/System/OtherPlayerDetail/OtherHeroDetailWin.cs
index ae02354..4fc74f0 100644
--- a/Main/System/OtherPlayerDetail/OtherHeroDetailWin.cs
+++ b/Main/System/OtherPlayerDetail/OtherHeroDetailWin.cs
@@ -391,11 +391,11 @@
         }
         for (int i = 0; i < teams.Count; i++)
         {
-            if (teams[i].teamHero == null)
+            if (!(teams[i] is HeroBattleObject heroObj) || heroObj.teamHero == null)
             {
                 continue;
             }
-            if (teams[i].teamHero.heroId == heroID)
+            if (heroObj.teamHero.heroId == heroID)
             {
                 return true;
             }
diff --git a/Main/System/Settlement/BattleSettlementManager.cs b/Main/System/Settlement/BattleSettlementManager.cs
index effc78c..bd29530 100644
--- a/Main/System/Settlement/BattleSettlementManager.cs
+++ b/Main/System/Settlement/BattleSettlementManager.cs
@@ -347,9 +347,9 @@
             case BattleConst.TianziBillboradBattleField:
             case BattleConst.WarlordPavilionBattleField:
                 BattleObject bossBattleObject = battleField.FindBoss();
-                if (bossBattleObject == null || bossBattleObject.teamHero == null)
+                if (bossBattleObject == null || bossBattleObject is not HeroBattleObject)
                     return detailName;
-                detailName = bossBattleObject.teamHero.name;
+                detailName = bossBattleObject.GetName();
                 break;
             // 鏁屾柟鍚嶅瓧鏄鏂圭帺瀹跺悕瀛�
             case BattleConst.ArenaBattleField:
diff --git a/Main/System/Team/TeamBase.cs b/Main/System/Team/TeamBase.cs
index 4ae329e..6d4913f 100644
--- a/Main/System/Team/TeamBase.cs
+++ b/Main/System/Team/TeamBase.cs
@@ -31,6 +31,8 @@
 
     public TeamHero[] serverHeroes { get; private set; } = new TeamHero[TeamConst.MaxTeamHeroCount];
 
+    public TeamMingge teamMingge { get; private set; }
+
     public TeamBase(int _teamType)
     {
         teamType = _teamType;
@@ -51,17 +53,30 @@
 
         for (int i = 0; i < lineUp.ObjCnt; i++)
         {
-            if (i < tempHeroes.Length)
-            {
+            // if (i < tempHeroes.Length)
+            // {
                 var fightObj = lineUp.ObjList[i];
-                TeamHero hero = new TeamHero(fightObj, this);
-                tempHeroes[hero.positionNum] = hero;
-                serverHeroes[hero.positionNum] = hero;
-            }
-            else
-            {
-                Debug.LogError("TeamBase: Too many heroes in lineup, exceeding MaxTeamHeroCount.");
-            }
+
+                // 鍦ㄦ湰闃靛涓殑绔欎綅锛屼粠1寮�濮嬪埌7涓烘灏� 99涓哄懡鏍� 101鍙婁互涓婁负鐏靛吔
+                if (fightObj.PosNum == 99)
+                {
+                    teamMingge = new TeamMingge(fightObj, this);
+                }
+                else if (fightObj.PosNum >= 101)
+                {
+                    
+                }
+                else if (fightObj.PosNum >= 1 && fightObj.PosNum <= 7)
+                {
+                    TeamHero hero = new TeamHero(fightObj, this);
+                    tempHeroes[hero.positionNum] = hero;
+                    serverHeroes[hero.positionNum] = hero;
+                }
+            // }
+            // else
+            // {
+            //     Debug.LogError("TeamBase: Too many heroes in lineup, exceeding MaxTeamHeroCount.");
+            // }
         }
 
         // 鍒锋柊鏈嶅姟鍣ㄦ暟鎹�
@@ -464,4 +479,5 @@
         if (tempHeroes[index2] != null) tempHeroes[index2].positionNum = index2;
     }
     
-}
\ No newline at end of file
+}
+
diff --git a/Main/System/Team/TeamMingge.cs b/Main/System/Team/TeamMingge.cs
new file mode 100644
index 0000000..3b8b957
--- /dev/null
+++ b/Main/System/Team/TeamMingge.cs
@@ -0,0 +1,35 @@
+
+
+public class TeamMingge
+{
+    private HB424_tagSCTurnFightInit.tagSCTurnFightObj fightObj;
+
+    public TeamBase teamBase { get; private set; }
+    
+    // 鍩烘湰灞炴��
+    public int ObjID { get; set; }
+    public int positionNum { get; set; }
+    public string name { get; set; }
+    public float modelScale { get; set; }
+    
+    // 鍛芥牸鐨勭姸鎬侊紙鍛芥牸涓嶅彈鎺у埗锛屼笉浼氭浜★級
+    public bool isStunned => false;
+    public bool isFrozen => false;
+    public bool isStoned => false;
+    public bool isSlient => false;
+    public bool isDisarmed => false;
+    public bool isInvinceble => false;
+    public bool isDead => false;
+    public int rage => 100; // 鍛芥牸鎬绘槸鏈夋�掓皵鍙互閲婃斁鎶�鑳�
+
+    public TeamMingge(HB424_tagSCTurnFightInit.tagSCTurnFightObj fightObj, TeamBase _teamBase)
+    {
+        this.fightObj = fightObj;
+        this.teamBase = _teamBase;
+        
+        this.ObjID = (int)fightObj.ObjID;
+        this.positionNum = 99; // 鍛芥牸鍥哄畾浣嶇疆
+        this.name = "鍛芥牸";
+        this.modelScale = 1f;
+    }
+}
\ No newline at end of file
diff --git a/Main/System/Team/TeamMingge.cs.meta b/Main/System/Team/TeamMingge.cs.meta
new file mode 100644
index 0000000..d2a3cde
--- /dev/null
+++ b/Main/System/Team/TeamMingge.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 6ad2b68d518148a4e88d41f300995f81
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

--
Gitblit v1.8.0