| | |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Linq; |
| | | using LitJson; |
| | | using Spine.Unity; |
| | | using UnityEngine; |
| | | |
| | |
| | | |
| | | 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() |
| | |
| | | buffEffectDict.Clear(); |
| | | buffDataDict.Clear(); |
| | | |
| | | battleObject.heroInfoBar.RefreshBuff(buffDataDict.Values.ToList()); |
| | | onBuffChanged?.Invoke(); |
| | | OnBuffChanged(); |
| | | } |
| | | |
| | | // 删除buff |
| | |
| | | { |
| | | 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 |
| | |
| | | { |
| | | BuffMountAction buffMountAction = new BuffMountAction(battleObject.battleField, new List<HB428_tagSCBuffRefresh>() { vNetData }, () => |
| | | { |
| | | if (battleObject.IsDead()) |
| | | { |
| | | return; |
| | | } |
| | | if (null != skillConfig && skillConfig.BuffEffect > 0) |
| | | { |
| | | // 已经存在相同的buff特效 |
| | |
| | | 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) |
| | | { |
| | |
| | | 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() |
| | | { |