51 lines
1.2 KiB
C#
51 lines
1.2 KiB
C#
using UnityEngine;
|
|
|
|
public class AbsorbInterceptor : BrokerInterceptor
|
|
{
|
|
AbsorbEffectInstance absorbEffect;
|
|
|
|
float finalValue;
|
|
|
|
protected override void Awake()
|
|
{
|
|
base.Awake();
|
|
|
|
absorbEffect = GetComponentInParent<AbsorbEffectInstance>();
|
|
|
|
broker.OnIncomingDamage.Subscribe(HandleAbsorbEffects, GameConstants.BrokerEventPriority.BasicStatMitigation);
|
|
}
|
|
|
|
private void HandleAbsorbEffects(DamageArgs args)
|
|
{
|
|
finalValue = args.currentValue;
|
|
|
|
if (finalValue >= 0) return;
|
|
|
|
AbsorbArgs absorbArgs = CObjectPool<AbsorbArgs>.Get();
|
|
|
|
absorbArgs.user = user;
|
|
absorbArgs.absorbedDamage = false;
|
|
absorbArgs.absorbDepleted = false;
|
|
|
|
|
|
if (absorbEffect.IsActive)
|
|
{
|
|
|
|
finalValue = absorbEffect.AbsorbDamage(finalValue);
|
|
|
|
if (finalValue > 0) //avoid complete absorbs turning into healing
|
|
finalValue = 0;
|
|
|
|
absorbArgs.absorbedDamage = true;
|
|
|
|
absorbArgs.absorbDepleted = absorbEffect.currentAmount <= 0;
|
|
|
|
args.currentValue = finalValue;
|
|
}
|
|
|
|
broker.OnAbsorb.Invoke(absorbArgs);
|
|
|
|
CObjectPool<AbsorbArgs>.Release(absorbArgs);
|
|
}
|
|
}
|