hch
3 小时以前 03942026b95aba9f0af1c637749ad27de399b932
Main/System/Battle/Buff/BattleObjectBuffMgr.cs
@@ -5,7 +5,6 @@
using Spine.Unity;
using UnityEngine;
public class BattleObjectBuffMgr
{
@@ -19,8 +18,6 @@
    private BattleObject battleObject;
    private static Dictionary<string, List<int>> buffGroupStateDict = null;
    public Dictionary<int, bool> isControled = new Dictionary<int, bool>()
    {
        { BattleConst.HardControlGroup, false },
@@ -33,13 +30,11 @@
    public void Init(BattleObject _battleObject)
    {
        battleObject = _battleObject;
        InitBuffGroupStateDict();
    }
    public void Release()
    {
        onBuffChanged = null;
        buffGroupStateDict = null;
        RemoveAllBuff();
    }
@@ -94,23 +89,24 @@
    //  删除buff
    public void RemoveBuff(HB429_tagSCBuffDel vNetData)
    {
        HB428_tagSCBuffRefresh buffData = null;
        bool isRemove = false;
        if (buffDataDict.TryGetValue(vNetData.BuffID, out buffData))
        {
            isRemove = true;
            buffDataDict.Remove(vNetData.BuffID);
        }
        if (!isRemove)
        {
            return;
        }
        var tempvNetData = vNetData;
        BuffUnmountAction buffRemoveAction = new BuffUnmountAction(battleObject.battleField, new List<HB429_tagSCBuffDel>() { vNetData }, () =>
        {
            HB428_tagSCBuffRefresh buffData = null;
            bool isRemove = false;
            if (buffDataDict.TryGetValue(tempvNetData.BuffID, out buffData))
            {
                isRemove = true;
                buffDataDict.Remove(tempvNetData.BuffID);
            }
            if (!isRemove)
            {
                return;
            }
            bool isRemoveEffect = false;
            int remainCnt = -1;
@@ -141,9 +137,9 @@
                    }
                }
                if (buffGroupStateDict[BattleConst.HardControlGroup.ToString()].Contains(skillConfig.BuffState))
                if (FuncConfigConfig.buffGroupStateDict[BattleConst.HardControlGroup.ToString()].Contains(skillConfig.BuffState))
                {
                    BattleDebug.LogError("[BattleObjectBuffMgr]移除对象 " + battleObject.ObjID + " 的buff id " + vNetData.BuffID + " BuffState is " + skillConfig.BuffState + " 是否删除了字典内的内容 " + isRemove.ToString() + " 是否删除了特效 " + isRemoveEffect.ToString() + " pack uid 是 " + vNetData.packUID);
                    BattleDebug.LogError("[BattleObjectBuffMgr]移除对象 " + battleObject.ObjID + " 的buff id " + tempvNetData.BuffID + " BuffState is " + skillConfig.BuffState + " 是否删除了字典内的内容 " + isRemove.ToString() + " 是否删除了特效 " + isRemoveEffect.ToString() + " pack uid 是 " + vNetData.packUID);
                }
            }
@@ -158,6 +154,9 @@
    //  刷新buff
    public void RefreshBuff(HB428_tagSCBuffRefresh vNetData, bool insert = false)
    {
        if (vNetData == null)
            return;
        if (battleObject.IsDead())
        {
            Debug.LogError("给死亡对象刷新buff 检查服务器代码");
@@ -165,83 +164,130 @@
            return;
        }
        SkillConfig skillConfig = SkillConfig.Get((int)vNetData.SkillID);
        if (null == skillConfig)
        {
            Debug.LogError("buff对应的技能不存在,skillId : " + vNetData.SkillID);
            return;
        }
        // bool isNew = false;
        if (buffDataDict.ContainsKey(vNetData.BuffID))
        {
            buffDataDict[vNetData.BuffID] = vNetData;
        }
        else
        {
            // isNew = true;
            buffDataDict.Add(vNetData.BuffID, vNetData);
        }
        // IsAdd != 0 表示是添加/覆盖,需要播放动画
        if (vNetData.IsAdd != 0)
        {
            BuffMountAction buffMountAction = new BuffMountAction(battleObject.battleField, new List<HB428_tagSCBuffRefresh>() { vNetData }, () =>
            {
                if (battleObject.IsDead())
            var tempvNetData = vNetData;
            BuffMountAction buffMountAction = new BuffMountAction(
                battleObject.battleField,
                new List<HB428_tagSCBuffRefresh> { vNetData },
                () =>
                {
                    return;
                }
                if (null != skillConfig && skillConfig.BuffEffect > 0)
                {
                    //  已经存在相同的buff特效
                    if (buffEffectDict.TryGetValue(skillConfig.BuffEffect, out KeyValuePair<BattleEffectPlayer, HashSet<uint>> pair))
                    {
                        pair.Value.Add(vNetData.BuffID);
                    }
                    else
                    {
                        BattleEffectPlayer effect = battleObject.battleField.battleEffectMgr.PlayEffect(battleObject, skillConfig.BuffEffect, battleObject.heroRectTrans, battleObject.Camp);
                    ApplyBuffAddition(tempvNetData);
                    OnBuffChanged();
                });
                        BoneFollower boneFollower = effect.AddMissingComponent<BoneFollower>();
                        effect.BindBone(battleObject.motionBase.skeletonAnim, effect.effectConfig.nodeName);
                        HashSet<uint> buffIdSet = new HashSet<uint>();
                        buffIdSet.Add(vNetData.BuffID);
                        buffEffectDict.Add(skillConfig.BuffEffect, new KeyValuePair<BattleEffectPlayer, HashSet<uint>>(effect, buffIdSet));
                    }
                }
                if (buffGroupStateDict[BattleConst.HardControlGroup.ToString()].Contains(skillConfig.BuffState))
                {
                    BattleDebug.LogError("[BattleObjectBuffMgr]添加对象 " + battleObject.ObjID + " 的buff id " + vNetData.BuffID + " pack uid 是 " + vNetData.packUID + " BuffState is " + skillConfig.BuffState);
                }
                OnBuffChanged();
            });
            if (insert)
            {
                battleObject.battleField.recordPlayer.ImmediatelyPlay(buffMountAction);
            }
            else
            {
                battleObject.battleField.recordPlayer.PlayRecord(buffMountAction);
            }
        }
        else
        {
            //  已经存在的buff 刷新
            OnBuffChanged();
            // IsAdd == 0 只是数据刷新,直接更新数据不播放动画
            if (buffDataDict.ContainsKey(vNetData.BuffID))
            {
                buffDataDict[vNetData.BuffID] = vNetData;
                OnBuffChanged();
            }
        }
    }
    private void InitBuffGroupStateDict()
    public void RefreshBuff(List<HB428_tagSCBuffRefresh> vNetDataList, bool insert = false)
    {
        if (null == buffGroupStateDict)
        if (vNetDataList == null || vNetDataList.Count == 0)
            return;
        if (battleObject.IsDead())
        {
            FuncConfigConfig buffGroupStateConfig = FuncConfigConfig.Get("BuffStateGroup");
            buffGroupStateDict = JsonMapper.ToObject<Dictionary<string, List<int>>>(buffGroupStateConfig.Numerical1);
            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}");
        }
    }
@@ -301,13 +347,13 @@
            {
                int buffState = skillConfig.BuffState;
                
                if (buffGroupStateDict != null && buffGroupStateDict.TryGetValue(groupType.ToString(), out List<int> buffGroupState))
                if (FuncConfigConfig.buffGroupStateDict.TryGetValue(groupType.ToString(), out List<int> buffGroupState))
                {
                    if (buffGroupState.Contains(buffState))
                    {
                        // 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;
                    }
@@ -317,12 +363,37 @@
        return false;
    }
    public List<HB428_tagSCBuffRefresh> GetBuffList()
    {
        return buffDataDict.Values.ToList();
    }
    public long GetShieldValue()
    {
        // 承伤盾判断,当释放方式为1003时可以视为承伤盾
        // 前端目前应该是承伤盾会用到
        // Value1     当前剩余盾值求余亿部分
        // Value2     当前剩余盾值整除亿部分
        return GetBuffValue(BattleConst.ShieldBuffAttackType);
    }
    public long GetBuffValue(int buffAtkType)
    {
        long values = 0;
        foreach (var kv in buffDataDict)
        {
            HB428_tagSCBuffRefresh hB428_TagSCBuffRefresh = kv.Value;
            SkillConfig skillConfig = SkillConfig.Get((int)hB428_TagSCBuffRefresh.SkillID);
            if (null != skillConfig && skillConfig.AtkType == buffAtkType)
            {
                values += GeneralDefine.GetFactValue(hB428_TagSCBuffRefresh.Value1, hB428_TagSCBuffRefresh.Value2);
            }
        }
        return values;
    }
    public void InsertBuff(HB428_tagSCBuffRefresh vNetData)
    {
        RefreshBuff(vNetData, true);