RiftMayhem/Assets/Scripts/AbilitySystem/Effects/BaseDamageOverTimeEffectInstance.cs
Pedro Gomes 2773ef7d6e Player Death Update
- Players can now die (finally)
- Solo players have a single cheat death per scene (reviving automatically after the first death)
- group players have revive mechanic, where a player faints when his health gets to 0, creating a revive circle around him, other players can stand on it to revive him. if after x seconds they don't get revived they bleed out and stay perma death until scene changes or all players die
- Multiple VFX added using post processing for cheat death, fainting, reviving, and perma death events.
- stopped players from moving and pressing keys when dead
- enemies now change target if they try to attack a dead/fainted target.
2024-07-20 19:49:14 +01:00

117 lines
3.2 KiB
C#

using UnityEngine;
using UnityEngine.Events;
using System.Collections;
using Photon.Pun;
public abstract class BaseDamageOverTimeEffectInstance : StatusEffectInstance
{
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();
if (owner.IsMine)
{
OnEffectStackAddedEvent.AddListener(() => owner.RPC(nameof(RPC_EffectApplied) + DamageType.ToString(), RpcTarget.Others));
OnEffectEnded.AddListener(() => owner.RPC(nameof(RPC_EffectEnded) + DamageType.ToString(), RpcTarget.Others));
}
}
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);
}
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;
}
[PunRPC]
public void RPC_ApplyDamageOverTimeEffect(int effectIndex, float value)
{
ApplyEffect(StatusEffectIndexer.Instance.StatusEffects[effectIndex], value);
}
[PunRPC]
public void RPC_EffectApplied()
{
OnEffectStackAddedEvent.Invoke();
}
[PunRPC]
public void RPC_EffectEnded()
{
OnEffectEnded.Invoke();
}
}
public enum DamageOverTimeType
{
Burn,
Poison,
Bleed
// Add more types as needed
}