using System;
using System.Collections.Generic;
using System.Linq;
using Spine.Unity;
using UnityEngine;
public class BattleObjectBuffMgr
{
private Dictionary>> buffEffectDict = new Dictionary>>();
private Dictionary buffDataDict = new Dictionary();
private BattleObject battleObject;
public void Init(BattleObject _battleObject)
{
battleObject = _battleObject;
}
public void Release()
{
}
public void Run()
{
List removeEffectList = new List();
// 跟随BattleObject
foreach (var kv in buffEffectDict)
{
BattleEffectPlayer effectPlayer = kv.Value.Key;
if (null != effectPlayer)
{
if (effectPlayer.isBindBone)
{
continue;
}
effectPlayer.transform.position = battleObject.heroRectTrans.position;
var effectPos = effectPlayer.effectConfig.effectPos;
if (null != effectPos && effectPos.Length >= 2)
{
effectPlayer.rectTrans.anchoredPosition += new Vector2(effectPos[0], effectPos[1]);
}
}
else
{
removeEffectList.Add(kv.Key);
}
}
foreach (var effectId in removeEffectList)
{
buffEffectDict.Remove(effectId);
}
}
public void RemoveAllBuff()
{
foreach (var kv in buffEffectDict)
{
KeyValuePair> pair = kv.Value;
battleObject.battleField.battleEffectMgr.RemoveEffect(kv.Key, pair.Key);
}
buffEffectDict.Clear();
buffDataDict.Clear();
battleObject.heroInfoBar.RefreshBuff(buffDataDict.Values.ToList());
}
// 删除buff
public void RemoveBuff(HB429_tagSCBuffDel vNetData)
{
HB428_tagSCBuffRefresh buffData = null;
if (buffDataDict.TryGetValue(vNetData.BuffID, out buffData))
{
buffDataDict.Remove(vNetData.BuffID);
}
if (buffData != null)
{
SkillConfig skillConfig = SkillConfig.Get((int)buffData.SkillID);
if (null == skillConfig || skillConfig.BuffEffect <= 0)
{
return;
}
KeyValuePair> 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);
}
}
}
// 不做表现
battleObject.heroInfoBar.RefreshBuff(buffDataDict.Values.ToList());
}
// 刷新buff
public void RefreshBuff(HB428_tagSCBuffRefresh vNetData, bool insert = false)
{
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);
}
if (vNetData.IsAdd != 0)
{
BuffMountAction buffMountAction = new BuffMountAction(battleObject.battleField, new List(){ vNetData}, () =>
{
if (null != skillConfig && skillConfig.BuffEffect > 0)
{
// 已经存在相同的buff特效
if (buffEffectDict.TryGetValue(skillConfig.BuffEffect, out KeyValuePair> pair))
{
pair.Value.Add(vNetData.BuffID);
}
else
{
BattleEffectPlayer effect = battleObject.battleField.battleEffectMgr.PlayEffect(battleObject, skillConfig.BuffEffect, battleObject.heroRectTrans, battleObject.Camp);
BoneFollower boneFollower = effect.AddMissingComponent();
effect.BindBone(battleObject.motionBase.skeletonAnim, "hit");
HashSet buffIdSet = new HashSet();
buffIdSet.Add(vNetData.BuffID);
buffEffectDict.Add(skillConfig.BuffEffect, new KeyValuePair>(effect, buffIdSet));
}
}
battleObject.heroInfoBar.RefreshBuff(buffDataDict.Values.ToList());
});
if (insert)
{
battleObject.battleField.recordPlayer.ImmediatelyPlay(buffMountAction);
}
else
{
battleObject.battleField.recordPlayer.PlayRecord(buffMountAction);
}
}
else
{
// 已经存在的buff 刷新
battleObject.heroInfoBar.RefreshBuff(buffDataDict.Values.ToList());
}
}
public void InsertBuff(HB428_tagSCBuffRefresh vNetData)
{
RefreshBuff(vNetData, true);
}
}