yyl
4 天以前 a38e02687f52e6d81e6fb6c1dcbf85ee76938325
125 战斗 修复因为自己技能造成自身死亡的卡死问题
2个文件已修改
73 ■■■■■ 已修改文件
Main/System/Battle/BattleField/BattleField.cs 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/Skill/SkillBase.cs 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleField/BattleField.cs
@@ -73,6 +73,8 @@
    // 记录正在处理死亡的角色ID,防止重复处理
    private HashSet<uint> processingDeathObjIds = new HashSet<uint>();
    private Dictionary<long, List<SkillBase>> castingSkillDict = new Dictionary<long, List<SkillBase>>();
    public BattleSoundManager soundManager;
#if UNITY_EDITOR
@@ -97,6 +99,42 @@
        processingDeathObjIds = new HashSet<uint>();
    }
    public void AddCastingSkill(long objID, SkillBase skill)
    {
        List<SkillBase> skillBases = null;
        if (castingSkillDict.TryGetValue(objID, out skillBases))
        {
            skillBases.Add(skill);
        }
        else
        {
            skillBases = new List<SkillBase>();
            skillBases.Add(skill);
            castingSkillDict.Add(objID, skillBases);
        }
    }
    public void RemoveCastingSkill(long objID, SkillBase skillBase)
    {
        List<SkillBase> skillBases = null;
        if (castingSkillDict.TryGetValue(objID, out skillBases))
        {
            skillBases.Remove(skillBase);
            if (skillBases.Count == 0)
            {
                castingSkillDict.Remove(objID);
            }
        }
    }
    public bool IsCastingSkill(long objID)
    {
        return castingSkillDict.ContainsKey(objID);
    }
    public virtual void Init(int _MapID, int _FuncLineID, JsonData _extendData,
        List<TeamBase> _redTeamList, List<TeamBase> _blueTeamList, byte turnMax)
    {
Main/System/Battle/Skill/SkillBase.cs
@@ -27,6 +27,9 @@
    protected List<SkillRecordAction> otherSkillActionList = new List<SkillRecordAction>();
    protected List<H0704_tagRolePackRefresh> dropPackList = new List<H0704_tagRolePackRefresh>();
    protected List<HB405_tagMCAddExp> expPackList = new List<HB405_tagMCAddExp>();
    protected List<BattleDeadPack> endDeadPackList = new List<BattleDeadPack>();
    protected bool moveFinished = false;
    public SkillBase fromSkill;
    public bool isPlay = false;
@@ -48,6 +51,12 @@
        tagUseSkillAttack = vNetData;
        battleField = _battleField;
        packList = _packList;
        // 注册正在释放的技能
        if (battleField != null && caster != null)
        {
            battleField.AddCastingSkill(caster.ObjID, this);
        }
        SafetyCheck();
#if UNITY_EDITOR
@@ -711,6 +720,12 @@
        tempDropList.TryGetValue(objID, out BattleDrops battleDrops);
        tempDeadPackList.TryGetValue(objID, out BattleDeadPack deadPack);
        // 如果目标正在释放技能,跳过死亡处理(延迟到技能结束)
        if (battleField != null && battleField.IsCastingSkill(target.ObjID))
        {
            deadPack = null;
        }
        bool clearSuckHp = tagUseSkillAttack.HurtList.ToList().IndexOf(hurt) != 0;
        // ============ 参数打包 ============
@@ -736,8 +751,14 @@
        // ============ 获取临时数据(掉落、死亡等) ============
        int objID = (int)target.ObjID;
        tempDropList.TryGetValue(objID, out BattleDrops battleDrops);
        tempDeadPackList.TryGetValue(objID, out BattleDeadPack deadPack);
        // 如果目标正在释放技能,跳过死亡处理(延迟到技能结束)
        if (battleField != null && battleField.IsCastingSkill(target.ObjID))
        {
            deadPack = null;
        }
        // ============ 参数打包(将 tagSCUseSkillHurtEx 转换为 tagSCUseSkillHurt)============
        HB427_tagSCUseSkill.tagSCUseSkillHurt hurt = new HB427_tagSCUseSkill.tagSCUseSkillHurt
        {
@@ -1062,6 +1083,14 @@
                return false;
            }
            // 技能完全结束,移除技能注册并触发延迟的死亡判定
            if (battleField != null && caster != null)
            {
                battleField.RemoveCastingSkill(caster.ObjID, this);
                battleField.OnObjsDead(new List<BattleDeadPack>(tempDeadPackList.Values));
            }
            return true;
        }
@@ -1075,6 +1104,12 @@
        if (isFinished)
            return;
        // 移除技能注册
        if (battleField != null && caster != null)
        {
            battleField.RemoveCastingSkill(caster.ObjID, this);
        }
        // 1. 强制结束技能效果
        skillEffect?.ForceFinished();
        skillEffect = null;