yyl
22 小时以前 83ff2cfc367d3227449fa8414a25541374929ecb
125 战斗 命格复活支持
2个文件已添加
37个文件已修改
860 ■■■■ 已修改文件
Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB430_tagSCTurnFightReport.cs 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/ArenaBattleWin.cs 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BaseBattleWin.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleField/BattleField.cs 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleField/BoneBattleField.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleField/RecordActions/DeathRecordAction.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleField/RecordActions/RebornRecordAction.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleField/RecordActions/SkillRecordAction.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleField/StoryBossBattleField.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleField/TianziBillboradBattleField.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleField/WarlordPavilionBattleField.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleObject/BattleObjMgr.cs 45 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleObject/BattleObject.cs 61 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleObject/BattleObjectFactory.cs 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleObject/BattleObjectLayerMgr.cs 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleObject/HeroBattleObject.cs 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleObject/MinggeBattleObject.cs 79 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleUtility.cs 52 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BoneFieldBattleWin.cs 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/Buff/BattleObjectBuffMgr.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/Define/BattleDmgInfo.cs 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/Skill/RebornSkill.cs 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/Skill/SkillBase.cs 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/Skill/SkillFactory.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/SkillEffect/BulletSkillEffect.cs 46 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/SkillEffect/DotSkillEffect.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/SkillEffect/NoEffect.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/SkillEffect/NormalSkillEffect.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/SkillEffect/SkillEffect.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/StoryBossBattleWin.cs 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/TianziBillboradBattleWin.cs 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/UIComp/BattleHeroInfoBar.cs 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/WarlordPavilionBattleWin.cs 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/OtherPlayerDetail/OtherHeroDetailWin.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Settlement/BattleSettlementManager.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Team/TeamBase.cs 38 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Team/TeamMingge.cs 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Team/TeamMingge.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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}]");
                }
                // 特殊处理:显示SkillID对应的技能名字
Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs
@@ -191,7 +191,7 @@
            Debug.LogErrorFormat("封包是否为Null:{0};", _package == null);
            if (_package != null)
            {
                Debug.LogErrorFormat("封包编号是:{0};", _package.cmd);
                Debug.LogErrorFormat("封包编号是:{0}; 名是{1}", _package.cmd, _package.GetType().Name);
            }
        }
    }
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;
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;
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);
            }
        }
    }
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;
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(',');
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);
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} 技能ID:{skillId} 技能名:{skillName}");
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;
        }
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;
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;
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];
                    }
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,Mingge 返回 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 特有,Mingge 返回默认值)
    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);
}
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;
    }
}
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)
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 需要有一个DamageType 服务器应该会给
    protected override BattleDmgInfo PopDamage(BattleHurtParam battleHurtParam)
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;
    }
    
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}"
            );
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;
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);
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;
            }
        }
    }
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);
                    }
                }
            }
        });
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,Mingge 传递 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);
                    }
                }
            }
        }
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;
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);
    }
    //  散射
@@ -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());
                }
                // 表现子弹飞行到目标位置
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());
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());
            }
        }
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());
            }
        }
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>
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;
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;
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;
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;
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;
            }
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:
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;
    }
    
}
}
Main/System/Team/TeamMingge.cs
New file
@@ -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;
    }
}
Main/System/Team/TeamMingge.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 6ad2b68d518148a4e88d41f300995f81
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant: