|  |  | using Entitas;
 | 
						
						
						
							|  |  | using UnityEngine;
 | 
						
						
						
							|  |  | using Game;
 | 
						
						
						
							|  |  | using Articy.Touhou.Templates;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | /// <summary>
 | 
						
						
						
							|  |  | /// buff和元素触发在此管理
 | 
						
						
						
							|  |  | /// </summary>
 | 
						
						
						
							|  |  | public class BuffData
 | 
						
						
						
							|  |  | {
 | 
						
						
						
							|  |  |     public string BuffId;
 | 
						
						
						
							|  |  |     public EState State;
 | 
						
						
						
							|  |  |     public BuffTemplate BuffCfg;
 | 
						
						
						
							|  |  |     public float TimeMax;
 | 
						
						
						
							|  |  |     public float TimePast;
 | 
						
						
						
							|  |  |     public MetaData<int> Level = new MetaData<int>();
 | 
						
						
						
							|  |  |     public MetaData<float> TimeLeft = new MetaData<float>();
 | 
						
						
						
							|  |  |     public int Owner;
 | 
						
						
						
							|  |  |     public int Target;
 | 
						
						
						
							|  |  |     public bool IsShow;//是否在ui中显示
 | 
						
						
						
							|  |  | }
 | 
						
						
						
							|  |  | [Game]
 | 
						
						
						
							|  |  | public class BuffComponent : IComponent
 | 
						
						
						
							|  |  | {
 | 
						
						
						
							|  |  |     public MetaDictionary<string, BuffData> BuffMap = new MetaDictionary<string, BuffData>();
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | }
 | 
						
						
						
							|  |  | 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();
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |     }
 | 
						
						
						
							|  |  | } |