RiftMayhem/Assets/Scripts/AbilitySystem/Effects/BaseDamageOverTimeEffectInstance.cs
2025-02-21 18:35:51 +00:00

97 lines
2.5 KiB
C#

using UnityEngine;
using UnityEngine.Events;
using System.Collections;
public abstract class BaseDamageOverTimeEffectInstance : StatusEffectInstance
{
public DamageType mitigationType;
public float currentDamagePerTick;
public abstract DamageOverTimeType DamageType { get; }
//public UnityEvent OnEffectApplied = new UnityEvent();
public UnityEvent OnEffectTick = new UnityEvent();
//public UnityEvent OnEffectEnded = new UnityEvent();
protected float nextTickTime;
protected override void Awake()
{
base.Awake();
}
protected override void AddStack(StatusEffect addedEffect, float value)
{
DamageOverTimeEffect dotEffect = (DamageOverTimeEffect)addedEffect;
currentDamagePerTick += value;
base.AddStack(addedEffect, value);
}
protected override void RefreshEffect(StatusEffect effect, float value)
{
base.RefreshEffect(effect, value);
currentDamagePerTick = GetHighestDamagePerTick(value);
OnEffectStackAdded();
}
protected override IEnumerator EffectStateCoroutine()
{
nextTickTime = Time.time + ((DamageOverTimeEffect)activeStacks[0]).tickRate;
while (Time.time < endEffectTime)
{
if (Time.time >= nextTickTime)
{
ApplyDamage();
nextTickTime = Time.time + ((DamageOverTimeEffect)activeStacks[0]).tickRate;
}
yield return null;
}
EffectStateEnded();
}
protected virtual void ApplyDamage()
{
Health targetHealth = GetComponent<Health>();
if (targetHealth != null)
{
targetHealth.ChangeValue(-currentDamagePerTick, (int)mitigationType);
}
OnEffectTick.Invoke();
}
protected override void EffectStateStarted()
{
base.EffectStateStarted();
OnEffectStackAddedEvent.Invoke();
}
protected override void EffectStateEnded()
{
currentDamagePerTick = 0;
OnEffectEnded.Invoke();
base.EffectStateEnded();
}
private float GetHighestDamagePerTick(float value)
{
float highestDamage = value;
for (int i = activeStacks.Count - 1; i >= 0; i--)
{
if (((DamageOverTimeEffect)activeStacks[i]).baseDamagePerTick > highestDamage)
highestDamage = ((DamageOverTimeEffect)activeStacks[i]).baseDamagePerTick;
}
return highestDamage;
}
}
public enum DamageOverTimeType
{
Burn,
Poison,
Bleed
// Add more types as needed
}