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();
}
}
}