yyl
2026-01-21 ad58c25ad98e333336afcd22ad8ab7e8c5f1ada9
125 战斗 修复偶尔死亡会触发多次死亡技能的问题
4个文件已修改
94 ■■■■■ 已修改文件
Main/Core/NetworkPackage/CustomServerPack/CustomHB426CombinePack.cs 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleUtility.cs 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/RecordPlayer/RecordAction.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/Skill/SkillBase.cs 58 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/CustomServerPack/CustomHB426CombinePack.cs
@@ -18,6 +18,8 @@
    public List<GameNetPackBasic> packList = new List<GameNetPackBasic>();
    private bool isCreated = false;
    public override void ReadFromBytes(byte[] vBytes)
    {
        base.ReadFromBytes(vBytes);
@@ -216,14 +218,14 @@
        }
        return false;
    }
    public void Distribute(RecordAction parentAction = null)
    public bool Distribute(RecordAction parentAction = null)
    {
        BattleField battleField = BattleManager.Instance.GetBattleField(guid);
        if (null == battleField)
        {
            Debug.LogError("BattleField not found for guid: " + guid);
            return;
            return false;
        }
        var skillAction = CreateSkillAction();
@@ -241,7 +243,10 @@
        else
        {
            battleField.DistributeNextPackage();
            return false;
        }
        return true;
    }
@@ -306,6 +311,12 @@
            return null;
        }
        if (isCreated)
        {
            Debug.LogError("create skill twice check the code");
            return null;
        }
        //  服务器修改了 现在第一个不一定是B427 也有可能是B428 先放Buff
        while (packList.Count > 0)
        {
@@ -352,7 +363,7 @@
            BattleObject _caster = battleField.battleObjMgr.GetBattleObject((int)skill.ObjID);
            // BattleDebug.LogError("_caster == null : " + (_caster == null) + " skill.ObjID : " + skill.ObjID);
            isCreated = true;
            SkillRecordAction skillAction = new SkillRecordAction(battleField, _caster, skill, packList);
            return skillAction;
        }
Main/System/Battle/BattleUtility.cs
@@ -711,6 +711,7 @@
                    if (null == hB427_TagSCUseSkill)
                    {
                        Debug.LogError("combine pack没找到主技能包");
                        break;
                    }
                    else
@@ -718,7 +719,13 @@
                        var skillID = hB427_TagSCUseSkill.SkillID;
                        var skillConfig = SkillConfig.Get((int)skillID);
                        if (skillConfig != null && (SkillTriggerTiming)skillConfig.ClientTriggerTiming == SkillTriggerTiming.Death)
                        if (null == skillConfig)
                        {
                            Debug.LogError("skill config 为空 无法判断是否为死亡触发技能 " + skillID);
                            break;
                        }
                        if ((SkillTriggerTiming)skillConfig.ClientTriggerTiming == SkillTriggerTiming.Death)
                        {
                            for (int j = 0 ; j < deadPacks.Count; j ++)
                            {
@@ -742,6 +749,11 @@
                    break;
                }
            }
            else if (pack is HB427_tagSCUseSkill hB427_TagSCUseSkill1)
            {
                Debug.LogError("找到没包起来的技能: " + hB427_TagSCUseSkill1.SkillID);
                break;
            }
        }
        // Debug.LogError("find dead pack " + deadPacks.Count);
        return deadPacks;
Main/System/Battle/RecordPlayer/RecordAction.cs
@@ -5,6 +5,10 @@
public class RecordAction
{
    public int actionID;
    private static int autoincreser = 0;
    protected BattleField battleField;
    //  本次Action的主角
@@ -47,6 +51,7 @@
    public RecordAction(RecordActionType _actionType, BattleField _battleField, BattleObject _battleObj)
    {
        actionID = autoincreser++;
        actionType = _actionType;
        battleField = _battleField;
        battleObject = _battleObj;
Main/System/Battle/Skill/SkillBase.cs
@@ -484,9 +484,11 @@
            return;
        }
        ProcessSubSkill();
        //  先把死亡包收集了
        HandleDead();
        //  再处理 内嵌技能
        ProcessSubSkill();
        skillEffect = SkillEffectFactory.CreateSkillEffect(this, caster, skillConfig, tagUseSkillAttack);
        skillEffect.Play(OnHitTargets);
@@ -545,7 +547,11 @@
        foreach (var (packUID, recordAction) in allSubSkills)
        {
            battleField.recordPlayer.ImmediatelyPlay(recordAction);
            currentWaitingSkill.Add(recordAction);
            if (recordAction.IsNeedWaiting())
            {
                currentWaitingSkill.Add(recordAction);
            }
        }
    }
@@ -914,27 +920,26 @@
        List<BattleDeadPack> deadPackList = BattleUtility.FindDeadPack(packList);
        if (deadPackList.Count <= 0) return;
        // 找到最大的死亡包 packUID(包括死亡包和死亡触发技能)
        foreach (var deadPack in deadPackList)
        {
            packList.Remove(deadPack.deadPack);
            packList.Remove(deadPack.deadTriggerSkill);
        }
        // 找到最大的死亡包 packUID
        BattleDeadPack lastBattleDeadPack = null;
        ulong maxDeathPackUID = 0;
        foreach (var deadPack in deadPackList)
        {
            if (deadPack.deadPack != null && deadPack.deadPack.packUID > maxDeathPackUID)
            {
                maxDeathPackUID = deadPack.deadPack.packUID;
            }
            if (deadPack.deadTriggerSkill != null)
            {
                var skillPack = deadPack.deadTriggerSkill.GetMainHB427SkillPack();
                if (skillPack != null && skillPack.packUID > maxDeathPackUID)
                {
                    maxDeathPackUID = skillPack.packUID;
                }
                lastBattleDeadPack = deadPack;
            }
        }
        
        // 如果找到了死亡包,收集所有 packUID > maxDeathPackUID 的包
        if (maxDeathPackUID > 0)
        if (maxDeathPackUID > 0 && lastBattleDeadPack != null)
        {
            BattleDebug.LogError($"SkillBase.HandleDead: 找到死亡包,maxDeathPackUID = {maxDeathPackUID},开始收集死亡后的包");
            
@@ -946,26 +951,19 @@
                if (packUID > maxDeathPackUID)
                {
                    // 排除经验包和掉落包,它们属于当前死亡事件的一部分,不是"死亡后"的包
                    if (pack is HB405_tagMCAddExp ||
                    if (pack is HB405_tagMCAddExp expPack && expPack.Source == 2 ||
                        (pack is H0704_tagRolePackRefresh h0704 && h0704.PackType == (byte)PackType.DropItem && h0704.IsBind == 1))
                    {
                        continue; // 跳过经验包和掉落包,让 CheckAfterDeadhPack() 处理它们
                    }
                    
                    BattleDebug.LogError($"SkillBase.HandleDead: 从packList收集死亡后的包 - Type: {pack.GetType().Name}, UID: {packUID}");
                    foreach (var deadPack in deadPackList)
                    {
                        deadPack.packListAfterDeath.Add(pack);
                    }
                    lastBattleDeadPack.packListAfterDeath.Add(pack);
                    packsToRemove.Add(pack);
                }
            }
            // 从 packList 中移除这些包
            foreach (var pack in packsToRemove)
            {
                packList.Remove(pack);
            }
            packList.RemoveAll(p => packsToRemove.Contains(p));
        }
        CheckAfterDeadhPack();
@@ -992,8 +990,8 @@
        // 构造BattleDrops并缓存
        for (int i = 0; i < deadPackList.Count; i++)
        {
            BattleDeadPack battleDeadPack = deadPackList[i];
            int objID = (int)battleDeadPack.deadPack.ObjID;
            BattleDeadPack bdp = deadPackList[i];
            int objID = (int)bdp.deadPack.ObjID;
            BattleObject deadTarget = battleField.battleObjMgr.GetBattleObject(objID);
            
            // 修复:添加空值检查
@@ -1253,9 +1251,6 @@
            return false;
        }
        // 检查最终完成状态
        if (isFinished && moveFinished)
        {
@@ -1280,7 +1275,8 @@
                DeathRecordAction recordAction = battleField.OnObjsDead(new List<BattleDeadPack>(tempDeadPackList.Values));
                if (null != recordAction)
                {
                    parentRecordAction.GetInnerRecordPlayer().ImmediatelyPlay(recordAction, parentRecordAction, true);
                    parentRecordAction.GetInnerRecordPlayer().ImmediatelyPlay(recordAction);
                    tempDeadPackList.Clear();
                    return false;
                }
            }