using Entitas; using UnityEngine; using Game; using Articy.Touhou.Templates; /// /// buff和元素触发在此管理 /// public class BuffData { public string BuffId; public EState State; public BuffTemplate BuffCfg; public float TimeMax; public float TimePast; public MetaData Level = new MetaData(); public MetaData TimeLeft = new MetaData(); public int Owner; public int Target; public bool IsShow;//是否在ui中显示 } [Game] public class BuffComponent : IComponent { public MetaDictionary BuffMap = new MetaDictionary(); } namespace Game { public abstract partial class Util { public static void AddBuff(int owner, int target, string buffId, float timeS = 0, int level = 1, bool isShowInfo = true) { var e = Util.GetEntity(target); if (e == null) { return; } if (!UtilBuff.BuffPreCheck(owner, target, buffId)) { return; } if (isShowInfo) { UtilBuff.SendHitBuff(target, buffId); } var buff = e.buff; var buffCfgData = Util.GetBuffConfigData(buffId); var buffCfg = Util.GetBuffConfig(buffId); var isNew = false; if (buffCfg.Buff.IsAliveForever) { timeS = -1; } if (!buff.BuffMap.ContainsKey(buffId)) { //新建buff TODO 池化 buff.BuffMap[buffId] = new BuffData { BuffId = buffCfgData.TechnicalName, State = EState.Enter, BuffCfg = buffCfg, Owner = owner, Target = target, IsShow = !GameConst.BuffUnShowed.Contains(buffId), }; isNew = true; } // Util.Print("AddBuff", buffCfg.Buff.Name); var buffData = buff.BuffMap[buffId]; var timeLeft = (timeS == 0 ? buffCfg.Buff.AliveTime : timeS); var levelMax = buffCfg.Buff.LevelMax; buffData.TimeLeft.Value = timeLeft; buffData.TimeMax = timeLeft; buffData.Level.Value += level; buffData.Level.Value = Mathf.Min(buffData.Level.Value, levelMax); if (isNew) { UtilBuff.BuffEffect(buffData, EBuffEffectTimingType.Enter); } if (buffData.Level.Value == levelMax) { UtilBuff.BuffEffect(buffData, EBuffEffectTimingType.LevelFull); } } public static void RemoveBuff(int entity, string buffId) { var e = Util.GetEntity(entity); if (e == null) { return; } var buff = e.buff; if (!buff.BuffMap.ContainsKey(buffId)) { return; } var buffData = buff.BuffMap[buffId]; buff.BuffMap.Remove(buffId); UtilBuff.BuffEffect(buffData, EBuffEffectTimingType.Leave); } public static void AddStaggerBuff(int entity, float timeS) { //硬直buff特殊计算,包含浮空 AddBuff(entity, entity, GameConst.BuffStagger, timeS, 1, false); Util.EntityStopMove(entity); } public static void AddSetSpeedBuff(int entity, float timeS) { //设置速度buff AddBuff(entity, entity, GameConst.BuffSetSpeed, timeS, 1, false); } public static void AddHitDownBuff(int entity) { //击落buff 落地时反弹 AddBuff(entity, entity, GameConst.BuffHitdown, -1, 1, false); } public static void RemoveSetSpeedBuff(int entity) { //清除设置速度buff RemoveBuff(entity, GameConst.BuffSetSpeed); } public static void RemoveHitDownBuff(int entity) { //清除击落buff RemoveBuff(entity, GameConst.BuffHitdown); } public static void RemoveControlBuffAll(int entity) { //清除所有控制buff RemoveBuff(entity, GameConst.BuffStagger); RemoveBuff(entity, GameConst.BuffSetSpeed); RemoveBuff(entity, GameConst.BuffHitdown); } public static bool HasHitDownBuff(int entity) { return HasBuff(entity, GameConst.BuffHitdown); } public static bool HasSetSpeedBuff(int entity) { return HasBuff(entity, GameConst.BuffSetSpeed); } public static bool HasStunBuff(int entity) { return HasBuff(entity, GameConst.BuffStun); } public static void AddStunBuff(int entity) { AddBuff(entity, entity, GameConst.BuffStun, 0, 1, false); Util.EntityStopMove(entity); } public static void AddExecuteBuff(int entity) { AddBuff(entity, entity, GameConst.BuffExecute, 0, 1, false); Util.EntityStopMove(entity); } public static bool HasBuff(int entity, string buffId) { var e = Util.GetEntity(entity); if (e == null) { return false; } if (!e.hasBuff) { return false; } var buff = e.buff; return buff.BuffMap.ContainsKey(buffId); } public static void ClearBuff(GameEntity entity) { var buff = entity.buff; buff.BuffMap.Clear(); } } }