yyl
7 天以前 cf4c463b222d57486671191652a6bf06a49349c0
125 战斗  buff控制与解控的表现
6个文件已修改
2个文件已添加
331 ■■■■ 已修改文件
Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB428_tagSCBuffRefresh.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleConst.cs 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleField/BattleField.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleField/RecordActions/BuffUnmountAction.cs 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleField/RecordActions/BuffUnmountAction.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleObject/BattleObject.cs 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/Buff/BattleObjectBuffMgr.cs 192 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/Motion/MotionBase.cs 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB428_tagSCBuffRefresh.cs
@@ -9,6 +9,10 @@
        HB428_tagSCBuffRefresh vNetData = vNetPack as HB428_tagSCBuffRefresh;
        BattleField battleField = BattleManager.Instance.GetBattleField(vNetData.packUID);
// 前端目前应该是承伤盾会用到
// Value1     当前剩余盾值求余亿部分
// Value2     当前剩余盾值整除亿部分
        if (null != battleField)
        {
            battleField.OnRefreshBuff(vNetData);
Main/System/Battle/BattleConst.cs
@@ -181,6 +181,23 @@
    }
    public const int HardControlGroup = 1;
    public const int SoftControlGroup = 2;
    public const int NormalAttackLimitGroup = 3;
    public const int RageAttackLimitGroup = 4;
    public const int PassiveSkillLimitGroup = 5;
    public static readonly int[] BuffLimitGroups = new int[]
    {
        HardControlGroup,
        SoftControlGroup,
        NormalAttackLimitGroup,
        RageAttackLimitGroup,
        PassiveSkillLimitGroup,
    };
}
Main/System/Battle/BattleField/BattleField.cs
@@ -110,6 +110,7 @@
        blueTeamList = _blueTeamList;
        FuncLineID = _FuncLineID;
        extendData = _extendData;
        IsBattleFinish = false;
        round = 0;
        this.turnMax = turnMax;
Main/System/Battle/BattleField/RecordActions/BuffUnmountAction.cs
New file
@@ -0,0 +1,50 @@
using UnityEngine;
using System.Collections.Generic;
using System;
public class BuffUnmountAction : RecordAction
{
    protected List<HB429_tagSCBuffDel> buffDelList;
    protected Action onComplete;
    public BuffUnmountAction(BattleField _battleField, List<HB429_tagSCBuffDel> buffPackList, Action _onComplete = null)
        : base(RecordActionType.Death, _battleField, null)
    {
        isFinish = false;
        buffDelList = buffPackList;
        onComplete = _onComplete;
    }
    public override bool IsFinished()
    {
        return isFinish;
    }
    public override void Run()
    {
        base.Run();
        if (!isRunOnce)
        {
            onComplete?.Invoke();
            isFinish = true;
            return;
        }
    }
    public override void ForceFinish()
    {
        if (isFinish)
        {
            return;
        }
        //  1帧就结束了 不管
        base.ForceFinish();
    }
}
Main/System/Battle/BattleField/RecordActions/BuffUnmountAction.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 4fc52a6124569934d9da56657801ab74
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/System/Battle/BattleObject/BattleObject.cs
@@ -87,6 +87,8 @@
        buffMgr = new BattleObjectBuffMgr();
        buffMgr.Init(this);
        buffMgr.onIsControlChanged += OnControledChange;
        layerMgr = new BattleObjectLayerMgr();
        layerMgr.Init(this);
@@ -127,6 +129,7 @@
        motionBase.Release();
        motionBase = null;
        buffMgr.onIsControlChanged -= OnControledChange;
        buffMgr.Release();
        buffMgr = null;
        teamHero = null;
@@ -136,6 +139,24 @@
        {
            GameObject.DestroyImmediate(heroGo);
            heroGo = null;
        }
    }
    //  有变化了才会调用这个函数
    private void OnControledChange(int groupType, bool value)
    {
        //  这里是受到硬控时候 需要表现的动画
        if (groupType == BattleConst.HardControlGroup)
        {
            //  从没被硬控到被硬控
            if (value)
            {
                motionBase.SetControledAnimation();
            }
            else
            {
                motionBase.CancelControledAnimation();
            }
        }
    }
@@ -280,7 +301,7 @@
        //  这里
        if (dmgInfo.IsType(DamageType.Dodge))
        if (dmgInfo.IsType(DamageType.Dodge) && !buffMgr.isControled[BattleConst.HardControlGroup])
        {
            if (isLastHit)
            {
@@ -317,7 +338,10 @@
            {
                if ((dmgInfo.IsType(DamageType.Damage) || dmgInfo.IsRealdamage()))
                {
                    motionBase.PlayAnimation(MotionName.hit, false);
                    if (!buffMgr.isControled[BattleConst.HardControlGroup])
                    {
                        motionBase.PlayAnimation(MotionName.hit, false);
                    }
                }
            }
Main/System/Battle/Buff/BattleObjectBuffMgr.cs
@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using LitJson;
using Spine.Unity;
using UnityEngine;
@@ -10,20 +11,37 @@
    public Action onBuffChanged;
    public Action<int, bool> onIsControlChanged;
    private Dictionary<int/*EffectId*/, KeyValuePair<BattleEffectPlayer, HashSet<uint/*BuffID*/>>> buffEffectDict = new Dictionary<int, KeyValuePair<BattleEffectPlayer, HashSet<uint>>>();
    private Dictionary<uint, HB428_tagSCBuffRefresh> buffDataDict = new Dictionary<uint, HB428_tagSCBuffRefresh>();
    private BattleObject battleObject;
    private static Dictionary<string, List<int>> buffGroupStateDict = null;
    public Dictionary<int, bool> isControled = new Dictionary<int, bool>()
    {
        { BattleConst.HardControlGroup, false },
        { BattleConst.SoftControlGroup, false },
        { BattleConst.NormalAttackLimitGroup, false },
        { BattleConst.RageAttackLimitGroup, false },
        { BattleConst.PassiveSkillLimitGroup, false },
    };
    public void Init(BattleObject _battleObject)
    {
        battleObject = _battleObject;
        InitBuffGroupStateDict();
    }
    public void Release()
    {
        onBuffChanged = null;
        buffGroupStateDict = null;
        RemoveAllBuff();
    }
    public void Run()
@@ -70,8 +88,7 @@
        buffEffectDict.Clear();
        buffDataDict.Clear();
        battleObject.heroInfoBar.RefreshBuff(buffDataDict.Values.ToList());
        onBuffChanged?.Invoke();
        OnBuffChanged();
    }
    //  删除buff
@@ -79,38 +96,63 @@
    {
        HB428_tagSCBuffRefresh buffData = null;
        bool isRemove = false;
        if (buffDataDict.TryGetValue(vNetData.BuffID, out buffData))
        {
            isRemove = true;
            buffDataDict.Remove(vNetData.BuffID);
        }
        if (buffData != null)
        if (!isRemove)
        {
            SkillConfig skillConfig = SkillConfig.Get((int)buffData.SkillID);
            if (null == skillConfig || skillConfig.BuffEffect <= 0)
            {
                return;
            }
            KeyValuePair<BattleEffectPlayer, HashSet<uint>> effectPair;
            if (buffEffectDict.TryGetValue(skillConfig.BuffEffect, out effectPair))
            {
                effectPair.Value.Remove(vNetData.BuffID);
                if (effectPair.Value.Count == 0)
                {
                    //  没有这个buff了
                    battleObject.battleField.battleEffectMgr.RemoveEffect(skillConfig.BuffEffect, effectPair.Key);
                    buffEffectDict.Remove(skillConfig.BuffEffect);
                }
            }
            return;
        }
        //  不做表现
        battleObject.heroInfoBar.RefreshBuff(buffDataDict.Values.ToList());
        onBuffChanged?.Invoke();
        BuffUnmountAction buffRemoveAction = new BuffUnmountAction(battleObject.battleField, new List<HB429_tagSCBuffDel>() { vNetData }, () =>
        {
            bool isRemoveEffect = false;
            int remainCnt = -1;
            if (buffData != null)
            {
                SkillConfig skillConfig = SkillConfig.Get((int)buffData.SkillID);
                if (null == skillConfig || skillConfig.BuffEffect <= 0)
                {
                    return;
                }
                KeyValuePair<BattleEffectPlayer, HashSet<uint>> effectPair;
                if (buffEffectDict.TryGetValue(skillConfig.BuffEffect, out effectPair))
                {
                    effectPair.Value.Remove(buffData.BuffID);
                    remainCnt = effectPair.Value.Count;
                    if (effectPair.Value.Count == 0)
                    {
                        //  没有这个buff了
                        isRemoveEffect = true;
                        battleObject.battleField.battleEffectMgr.RemoveEffect(skillConfig.BuffEffect, effectPair.Key);
                        buffEffectDict.Remove(skillConfig.BuffEffect);
                    }
                }
                if (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);
                }
            }
            //  不做表现
            OnBuffChanged();
        });
        battleObject.battleField.recordPlayer.PlayRecord(buffRemoveAction);
    }
    //  刷新buff
@@ -146,6 +188,10 @@
        {
            BuffMountAction buffMountAction = new BuffMountAction(battleObject.battleField, new List<HB428_tagSCBuffRefresh>() { vNetData }, () =>
            {
                if (battleObject.IsDead())
                {
                    return;
                }
                if (null != skillConfig && skillConfig.BuffEffect > 0)
                {
                    //  已经存在相同的buff特效
@@ -166,8 +212,13 @@
                        buffEffectDict.Add(skillConfig.BuffEffect, new KeyValuePair<BattleEffectPlayer, HashSet<uint>>(effect, buffIdSet));
                    }
                }
                battleObject.heroInfoBar.RefreshBuff(buffDataDict.Values.ToList());
                onBuffChanged?.Invoke();
                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)
            {
@@ -181,10 +232,91 @@
        else
        {
            //  已经存在的buff 刷新
            battleObject.heroInfoBar.RefreshBuff(buffDataDict.Values.ToList());
            onBuffChanged?.Invoke();
            OnBuffChanged();
        }
    }
    private void InitBuffGroupStateDict()
    {
        if (null == buffGroupStateDict)
        {
            FuncConfigConfig buffGroupStateConfig = FuncConfigConfig.Get("BuffStateGroup");
            buffGroupStateDict = JsonMapper.ToObject<Dictionary<string, List<int>>>(buffGroupStateConfig.Numerical1);
        }
    }
    private void OnBuffChanged()
    {
        UpdateControlState();
        battleObject.heroInfoBar.RefreshBuff(buffDataDict.Values.ToList());
        onBuffChanged?.Invoke();
        // bool isUnderControl = false;
        // foreach (var kv in buffDataDict)
        // {
        //     HB428_tagSCBuffRefresh hB428_TagSCBuffRefresh = kv.Value;
        //     SkillConfig skillConfig = SkillConfig.Get((int)hB428_TagSCBuffRefresh.SkillID);
        //     if (null != skillConfig && skillConfig.IsControlBuff())
        //     {
        //         isUnderControl = true;
        //         break;
        //     }
        // }
    }
    private void UpdateControlState()
    {
        UpdateControlState(BattleConst.HardControlGroup);
        UpdateControlState(BattleConst.SoftControlGroup);
        UpdateControlState(BattleConst.NormalAttackLimitGroup);
        UpdateControlState(BattleConst.RageAttackLimitGroup);
        UpdateControlState(BattleConst.PassiveSkillLimitGroup);
    }
    private void UpdateControlState(int groupType)
    {
        bool isChange = false;
        bool curState = isControled[groupType];
        bool newState = IsUnderControl(groupType);
        isControled[groupType] = newState;
        isChange = curState != newState;
        if (isChange)
        {
            onIsControlChanged?.Invoke(groupType, newState);
        }
    }
    private bool IsUnderControl(int groupType)
    {
        foreach (var kv in buffDataDict)
        {
            HB428_tagSCBuffRefresh hB428_TagSCBuffRefresh = kv.Value;
            SkillConfig skillConfig = SkillConfig.Get((int)hB428_TagSCBuffRefresh.SkillID);
            if (null != skillConfig)
            {
                int buffState = skillConfig.BuffState;
                if (buffGroupStateDict != null && 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);
                        }
                        return true;
                    }
                }
            }
        }
        return false;
    }
    
    public List<HB428_tagSCBuffRefresh> GetBuffList()
    {
Main/System/Battle/Motion/MotionBase.cs
@@ -26,6 +26,8 @@
    private SkeletonIllusionShadow illusionShadow;
    private bool playingSkillAnim = false;
    private bool isUnderControl = false;
    private float pauseTime = 0f;
    private float resumeTime = 0f;
@@ -121,7 +123,6 @@
    private Spine.TrackEntry ExecuteSkillAnim(SkillConfig skillConfig, SkillBase skillBase, Action onComplete,
        Spine.Animation targetAnim, bool hasAnim, bool isSubSkill)
    {
        bool isPangdeSkill = 1003020 == skillConfig.SkillID;
        int loopCount = skillConfig.LoopCount;
@@ -305,7 +306,7 @@
    protected virtual void OnAnimationComplete(Spine.TrackEntry trackEntry)
    {
        if (trackEntry?.Animation?.Name == null) return;
        string animName = trackEntry.Animation.Name.ToLower();
        if (AttackMotionList.Contains(animName))
@@ -318,7 +319,7 @@
            OnHitAnimationComplete?.Invoke();
            PlayAnimation(MotionName.idle, true);
        }
        if (trackEntryCallbacks.TryGetValue(trackEntry, out var callback))
        {
            trackEntryCallbacks.Remove(trackEntry);
@@ -326,6 +327,27 @@
        }
    }
    public void SetControledAnimation()
    {
        //  受到硬控的时候,保持受击动画的第三帧,直到控制结束 或者最后一击死亡,移除控制效果后,恢复到待机状态或者播放死亡动画
        //  这里是受到硬控时候 需要表现的动画
        var entry = PlayAnimation(MotionName.hit, false);
        float threeFrameTrackTime = 3f / BattleConst.skillMotionFps;
        entry.TrackTime = threeFrameTrackTime;
        entry.TimeScale = 0;
        isUnderControl = true;
    }
    public void CancelControledAnimation()
    {
        //  硬控结束,恢复动画播放
        isUnderControl = false;
        PlayAnimation(MotionName.idle, true);
    }
    public virtual void Run()
    {
        for (int i = runningActions.Count - 1; i >= 0; i--)