Script made for DOTs using DamageProcessor. Have fun
using Opsive.Shared.Game;
using Opsive.UltimateCharacterController.Traits.Damage;
using UnityEngine;
using EventHandler = Opsive.Shared.Events.EventHandler;
[CreateAssetMenu(fileName = "DamageOverTime",
menuName = "Ultimate Character Controller/Damage Processors/DamageOverTime")]
public class DamageOverTime : DamageProcessor
{
[Tooltip("Specifies the Number of Damage Ticks")] [SerializeField]
protected int m_NumberOfTicks = 2;
[Tooltip("Specifies the Time between each of the Ticks")] [SerializeField]
protected float m_TimePerTick = 1f;
private IDamageTarget m_Target;
private DamageData m_DamageData;
private ScheduledEventBase m_scheduledEventBase;
public int NumberOfTicks
{
get { return m_NumberOfTicks; }
set { m_NumberOfTicks = value; }
}
public float TimePerTick
{
get { return m_TimePerTick; }
set { m_TimePerTick = value; }
}
/// <summary>
/// Processes the DamageData on the DamageTarget.
/// </summary>
/// <param name="target">The object receiving the damage.</param>
/// <param name="damageData">The damage data to be applied to the target.</param>
public override void Process(IDamageTarget target, DamageData damageData)
{
m_Target = target;
m_DamageData = damageData;
//EventHandler.RegisterEvent(m_Target.Owner, "OnDeath", OnTargetDeath);
EventHandler.RegisterEvent<Vector3, Vector3, GameObject>(m_Target.Owner, "OnDeath", OnDeath);
for (int i = 0; i < m_NumberOfTicks; i++)
{
m_scheduledEventBase = Scheduler.Schedule(i * m_TimePerTick, ApplyDamageToTarget);
}
m_scheduledEventBase = Scheduler.Schedule(m_NumberOfTicks * m_TimePerTick, RemoveEvent);
}
private void ApplyDamageToTarget()
{
m_Target.Damage(m_DamageData);
}
private void RemoveEvent()
{
EventHandler.UnregisterEvent<Vector3, Vector3, GameObject>(m_Target.Owner, "OnDeath", OnDeath);
}
private void RemoveSchedule()
{
SchedulerBase.Cancel( m_scheduledEventBase );
}
private void OnDeath(Vector3 v3, Vector3 v31, GameObject go)
{
RemoveEvent();
RemoveSchedule();
}
}