2
0
Fork 0
You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

180 lines
5.8 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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