yyl
9 天以前 d591b5c972cdd4f290e114bc08ef443a051aecad
125 战斗  buff合并展示
2个文件已修改
349 ■■■■■ 已修改文件
Main/System/Battle/Buff/BattleObjectBuffMgr.cs 184 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/Skill/SkillBase.cs 165 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/Buff/BattleObjectBuffMgr.cs
@@ -5,7 +5,6 @@
using Spine.Unity;
using UnityEngine;
public class BattleObjectBuffMgr
{
@@ -18,7 +17,6 @@
    private Dictionary<uint, HB428_tagSCBuffRefresh> buffDataDict = new Dictionary<uint, HB428_tagSCBuffRefresh>();
    private BattleObject battleObject;
    public Dictionary<int, bool> isControled = new Dictionary<int, bool>()
    {
@@ -156,6 +154,9 @@
    //  刷新buff
    public void RefreshBuff(HB428_tagSCBuffRefresh vNetData, bool insert = false)
    {
        if (vNetData == null)
            return;
        if (battleObject.IsDead())
        {
            Debug.LogError("给死亡对象刷新buff 检查服务器代码");
@@ -163,87 +164,132 @@
            return;
        }
        SkillConfig skillConfig = SkillConfig.Get((int)vNetData.SkillID);
        if (null == skillConfig)
        // IsAdd != 0 表示是添加/覆盖,需要播放动画
        if (vNetData.IsAdd != 0)
        {
            Debug.LogError("buff对应的技能不存在,skillId : " + vNetData.SkillID);
            return;
        }
        var tempvNetData = vNetData;
        if (tempvNetData.IsAdd != 0)
        {
            BuffMountAction buffMountAction = new BuffMountAction(battleObject.battleField, new List<HB428_tagSCBuffRefresh>() { tempvNetData }, () =>
            {
                if (buffDataDict.ContainsKey(tempvNetData.BuffID))
            var tempvNetData = vNetData;
            BuffMountAction buffMountAction = new BuffMountAction(
                battleObject.battleField,
                new List<HB428_tagSCBuffRefresh> { vNetData },
                () =>
                {
                    buffDataDict[tempvNetData.BuffID] = tempvNetData;
                }
                else
                {
                    buffDataDict.Add(tempvNetData.BuffID, tempvNetData);
                }
                    ApplyBuffAddition(tempvNetData);
                    OnBuffChanged();
                });
                if (battleObject.IsDead())
                {
                    return;
                }
                if (null != skillConfig && skillConfig.BuffEffect > 0)
                {
                    //  已经存在相同的buff特效
                    if (buffEffectDict.TryGetValue(skillConfig.BuffEffect, out KeyValuePair<BattleEffectPlayer, HashSet<uint>> pair))
                    {
                        pair.Value.Add(tempvNetData.BuffID);
                    }
                    else
                    {
                        BattleEffectPlayer effect = battleObject.battleField.battleEffectMgr.PlayEffect(battleObject, skillConfig.BuffEffect, battleObject.heroRectTrans, battleObject.Camp);
                        BoneFollower boneFollower = effect.AddMissingComponent<BoneFollower>();
                        effect.BindBone(battleObject.motionBase.skeletonAnim, effect.effectConfig.nodeName);
                        HashSet<uint> buffIdSet = new HashSet<uint>();
                        buffIdSet.Add(tempvNetData.BuffID);
                        buffEffectDict.Add(skillConfig.BuffEffect, new KeyValuePair<BattleEffectPlayer, HashSet<uint>>(effect, buffIdSet));
                    }
                }
                if (skillConfig != null && FuncConfigConfig.buffGroupStateDict[BattleConst.HardControlGroup.ToString()].Contains(skillConfig.BuffState))
                {
                    BattleDebug.LogError("[BattleObjectBuffMgr]添加对象 " + battleObject.ObjID + " 的buff id " + tempvNetData.BuffID + " pack uid 是 " + tempvNetData.packUID + " BuffState is " + skillConfig.BuffState);
                }
                OnBuffChanged();
            });
            if (insert)
            {
                battleObject.battleField.recordPlayer.ImmediatelyPlay(buffMountAction);
            }
            else
            {
                battleObject.battleField.recordPlayer.PlayRecord(buffMountAction);
            }
        }
        else
        {
            if (buffDataDict.ContainsKey(tempvNetData.BuffID))
            // IsAdd == 0 只是数据刷新,直接更新数据不播放动画
            if (buffDataDict.ContainsKey(vNetData.BuffID))
            {
                buffDataDict[tempvNetData.BuffID] = tempvNetData;
                buffDataDict[vNetData.BuffID] = vNetData;
                OnBuffChanged();
            }
            else
            {
                buffDataDict.Add(tempvNetData.BuffID, tempvNetData);
            }
            //  已经存在的buff 刷新
            OnBuffChanged();
        }
    }
    public void RefreshBuff(List<HB428_tagSCBuffRefresh> vNetDataList, bool insert = false)
    {
        if (vNetDataList == null || vNetDataList.Count == 0)
            return;
        if (battleObject.IsDead())
        {
            Debug.LogError("给死亡对象刷新buff(批量) 检查服务器代码");
            RemoveAllBuff();
            return;
        }
        var buffList = vNetDataList.Where(buff => buff != null && buff.IsAdd != 0).ToList();
        var refreshList = vNetDataList.Where(buff => buff != null && buff.IsAdd == 0).ToList();
        // 处理需要播放动画的buff (IsAdd != 0)
        if (buffList.Count > 0)
        {
            BuffMountAction buffMountAction = new BuffMountAction(
                battleObject.battleField,
                buffList,
                () =>
                {
                    foreach (var temp in buffList)
                        ApplyBuffAddition(temp);
                    OnBuffChanged();
                });
            if (insert)
                battleObject.battleField.recordPlayer.ImmediatelyPlay(buffMountAction);
            else
                battleObject.battleField.recordPlayer.PlayRecord(buffMountAction);
        }
        // 处理只刷新数据的buff (IsAdd == 0)
        if (refreshList.Count > 0)
        {
            bool hasChanged = false;
            foreach (var buff in refreshList)
            {
                if (buffDataDict.ContainsKey(buff.BuffID))
                {
                    buffDataDict[buff.BuffID] = buff;
                    hasChanged = true;
                }
            }
            if (hasChanged)
            {
                OnBuffChanged();
            }
        }
    }
    private void ApplyBuffAddition(HB428_tagSCBuffRefresh buffRefresh)
    {
        SkillConfig skillConfig = SkillConfig.Get((int)buffRefresh.SkillID);
        if (skillConfig == null)
        {
            Debug.LogError($"buff对应的技能不存在,skillId : {buffRefresh.SkillID}");
            return;
        }
        if (buffDataDict.ContainsKey(buffRefresh.BuffID))
            buffDataDict[buffRefresh.BuffID] = buffRefresh;
        else
            buffDataDict.Add(buffRefresh.BuffID, buffRefresh);
        if (battleObject.IsDead())
            return;
        if (skillConfig.BuffEffect > 0)
        {
            if (buffEffectDict.TryGetValue(skillConfig.BuffEffect, out var pair))
            {
                pair.Value.Add(buffRefresh.BuffID);
            }
            else
            {
                BattleEffectPlayer effect = battleObject.battleField.battleEffectMgr
                    .PlayEffect(battleObject, skillConfig.BuffEffect, battleObject.heroRectTrans, battleObject.Camp);
                effect.BindBone(battleObject.motionBase.skeletonAnim, effect.effectConfig.nodeName);
                var buffIdSet = new HashSet<uint> { buffRefresh.BuffID };
                buffEffectDict.Add(
                    skillConfig.BuffEffect,
                    new KeyValuePair<BattleEffectPlayer, HashSet<uint>>(effect, buffIdSet));
            }
        }
        if (FuncConfigConfig.buffGroupStateDict[BattleConst.HardControlGroup.ToString()]
            .Contains(skillConfig.BuffState))
        {
            BattleDebug.LogError(
                $"[BattleObjectBuffMgr]添加对象 {battleObject.ObjID} 的buff id {buffRefresh.BuffID} pack uid 是 {buffRefresh.packUID} BuffState is {skillConfig.BuffState}");
        }
    }
    private void OnBuffChanged()
    {
@@ -307,7 +353,7 @@
                    {
                        // if (groupType == 1)
                        // {
                        //     // Debug.LogError("对象 " + battleObject.ObjID + " 受到了 " + skillConfig.SkillID + " 的控制效果,BuffState:" + buffState + " buffGroup :" + groupType + " buff id is " + hB428_TagSCBuffRefresh.BuffID + "  ralate skill id is " + hB428_TagSCBuffRefresh.RelatedSkillID + " pack uid is " + hB428_TagSCBuffRefresh.packUID);
                        //     // Debug.LogError("对象 " + battleObject.ObjID + " 受到了 " + skillConfig.SkillID + " 的控制效果,BuffState:" + buffState + " buffGroup :" + groupType + " buff id is " + hB428_TagSCBuffRefresh.BuffID + "  ralate skill id is " + hB428_TagSCBuffRefresh.RelatedSkillID + " pack uid is " + hB428_TagSCBuffRefresh.packUID);
                        // }
                        return true;
                    }
Main/System/Battle/Skill/SkillBase.cs
@@ -36,6 +36,9 @@
    private Dictionary<int, BattleDrops> tempDropList = new Dictionary<int, BattleDrops>();
    private Dictionary<int, HB422_tagMCTurnFightObjDead> tempDeadPackList = new Dictionary<int, HB422_tagMCTurnFightObjDead>();
    protected List<HB428_tagSCBuffRefresh> buffCollections = new List<HB428_tagSCBuffRefresh>();
    // 构造函数:初始化技能基础数据
    public SkillBase(BattleObject _caster, SkillConfig _skillCfg, HB427_tagSCUseSkill vNetData, List<GameNetPackBasic> _packList, BattleField _battleField = null)
    {
@@ -712,76 +715,118 @@
        // 修复:使用循环代替递归,避免栈溢出风险
        // try
        // {
            while (true)
        while (true)
        {
            // 验证技能效果是否完成
            if (skillEffect != null && !skillEffect.IsFinished())
                return;
            if (skillEffect != null)
            {
                // 验证技能效果是否完成
                if (skillEffect != null && !skillEffect.IsFinished())
                    return;
                if (skillEffect != null)
                skillEffect = null;
                continue; // 使用continue代替递归调用
            }
            // 验证其他技能动作是否完成
            if (otherSkillActionList.Count > 0)
            {
                bool hasFinishedAction = false;
                for (int i = otherSkillActionList.Count - 1; i >= 0; i--)
                {
                    skillEffect = null;
                    var action = otherSkillActionList[i];
                    if (action.IsFinished())
                    {
                        otherSkillActionList.RemoveAt(i);
                        hasFinishedAction = true;
                    }
                }
                if (hasFinishedAction)
                {
                    continue; // 使用continue代替递归调用
                }
                // 验证其他技能动作是否完成
                if (otherSkillActionList.Count > 0)
                {
                    bool hasFinishedAction = false;
                    for (int i = otherSkillActionList.Count - 1; i >= 0; i--)
                    {
                        var action = otherSkillActionList[i];
                        if (action.IsFinished())
                        {
                            otherSkillActionList.RemoveAt(i);
                            hasFinishedAction = true;
                        }
                    }
                    if (hasFinishedAction)
                    {
                        continue; // 使用continue代替递归调用
                    }
                    return;
                }
                break; // 没有更多需要处理的,退出循环
                return;
            }
            // 处理剩余包
            while (packList.Count > 0)
            {
                var pack = packList[0];
                packList.RemoveAt(0);
            break; // 没有更多需要处理的,退出循环
        }
                if (pack is CustomHB426CombinePack combinePack && combinePack.startTag.Tag.StartsWith("Skill_"))
                {
                    BattleDebug.LogError("other skill casting " + combinePack.startTag.Tag);
                    var otherSkillAction = combinePack.CreateSkillAction();
                    otherSkillAction.fromSkillId = skillConfig.SkillID;
                    otherSkillActionList.Add(otherSkillAction);
                    return;
                }
                if (pack is CustomB421ActionPack actionPack)
                {
                    actionPack.Distribute();
                }
                else
                {
                    PackageRegedit.Distribute(pack);
                }
            }
        // }
        // catch (Exception ex)
        // {
        //     Debug.LogError($"OnSkillFinished异常: {ex.Message},技能ID={skillConfig.SkillID}");
        //     // 确保状态一致性,即使出现异常也要标记完成
        //     isFinished = true;
        //     throw; // 重新抛出异常供上层处理
        // }
        // 处理剩余包
        if (!ResolvePackList())
        {
            return;
        }
            // }
            // catch (Exception ex)
            // {
            //     Debug.LogError($"OnSkillFinished异常: {ex.Message},技能ID={skillConfig.SkillID}");
            //     // 确保状态一致性,即使出现异常也要标记完成
            //     isFinished = true;
            //     throw; // 重新抛出异常供上层处理
            // }
        isFinished = true;
    }
    protected virtual bool ResolvePackList()
    {
        while (packList.Count > 0)
        {
            var pack = packList[0];
            packList.RemoveAt(0);
            if (pack is CustomHB426CombinePack combinePack && combinePack.startTag.Tag.StartsWith("Skill_"))
            {
                BattleDebug.LogError("other skill casting " + combinePack.startTag.Tag);
                var otherSkillAction = combinePack.CreateSkillAction();
                otherSkillAction.fromSkillId = skillConfig.SkillID;
                otherSkillActionList.Add(otherSkillAction);
                return false;
            }
            else if (pack is HB428_tagSCBuffRefresh buffRefresh)
            {
                //    从找到第一个HB428开始 找出连续的HB428_tagSCBuffRefresh包 如果找到一个B428后 之后碰到非HB428包就停止
                buffCollections.Add(buffRefresh);
                while (packList.Count > 0)
                {
                    var nextPack = packList[0];
                    if (nextPack is HB428_tagSCBuffRefresh nextBuffRefresh)
                    {
                        buffCollections.Add(nextBuffRefresh);
                        packList.RemoveAt(0);
                    }
                    else
                    {
                        break;
                    }
                }
                // 同时刷新所有对象的buff,不分组
                foreach (var buff in buffCollections)
                {
                    BattleObject battleObj = battleField.battleObjMgr.GetBattleObject((int)buff.ObjID);
                    if (battleObj != null)
                    {
                        battleObj.buffMgr.RefreshBuff(buff, true);
                    }
                }
                // 清空已处理的buff集合
                buffCollections.Clear();
                continue;
            }
            if (pack is CustomB421ActionPack actionPack)
            {
                actionPack.Distribute();
            }
            else
            {
                PackageRegedit.Distribute(pack);
            }
        }
        return true;
    }
    // 添加清理方法:防止内存泄漏
    public virtual void Cleanup()