| | |
| | | using Spine.Unity; |
| | | using UnityEngine; |
| | | |
| | | |
| | | public class BattleObjectBuffMgr |
| | | { |
| | | |
| | |
| | | private Dictionary<uint, HB428_tagSCBuffRefresh> buffDataDict = new Dictionary<uint, HB428_tagSCBuffRefresh>(); |
| | | |
| | | private BattleObject battleObject; |
| | | |
| | | |
| | | public Dictionary<int, bool> isControled = new Dictionary<int, bool>() |
| | | { |
| | |
| | | // 刷新buff |
| | | public void RefreshBuff(HB428_tagSCBuffRefresh vNetData, bool insert = false) |
| | | { |
| | | if (vNetData == null) |
| | | return; |
| | | |
| | | if (battleObject.IsDead()) |
| | | { |
| | | Debug.LogError("给死亡对象刷新buff 检查服务器代码"); |
| | |
| | | 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() |
| | | { |
| | |
| | | { |
| | | // 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; |
| | | } |