RiftMayhem/Assets/Scripts/EventDrivenHooks/EntityEventBroker.cs

84 lines
2.8 KiB
C#

using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
public class EntityEventBroker : MonoBehaviour
{
public OrderedEvent<HealArgs> OnOutgoingHeal = new OrderedEvent<HealArgs>();
public OrderedEvent<HealArgs> OnOutgoingHealProcessed = new OrderedEvent<HealArgs>();
public OrderedEvent<HealArgs> OnIncomingHeal = new OrderedEvent<HealArgs>();
public OrderedEvent<HealArgs> OnIncomingHealProcessed = new OrderedEvent<HealArgs>();
public OrderedEvent<DamageArgs> OnOutgoingDamage = new OrderedEvent<DamageArgs>();
public OrderedEvent<DamageArgs> OnOutgoingDamageProcessed = new OrderedEvent<DamageArgs>();
public OrderedEvent<DamageArgs> OnHit = new OrderedEvent<DamageArgs>();
public OrderedEvent<DamageArgs> OnTick = new OrderedEvent<DamageArgs>();
public OrderedEvent<DamageArgs> OnCrit = new OrderedEvent<DamageArgs>();
public OrderedEvent<DamageArgs> OnKill = new OrderedEvent<DamageArgs>();
public OrderedEvent<DamageArgs> OnIncomingDamage = new OrderedEvent<DamageArgs>();
public OrderedEvent<DamageArgs> OnIncomingDamageProcessed = new OrderedEvent<DamageArgs>();
public OrderedEvent<InvulnerabilityArgs> OnInvulnerable = new OrderedEvent<InvulnerabilityArgs>();
public OrderedEvent<DodgeArgs> OnDodge = new OrderedEvent<DodgeArgs>();
public OrderedEvent<BlockArgs> OnBlock = new OrderedEvent<BlockArgs>();
public OrderedEvent<AbsorbArgs> OnAbsorb = new OrderedEvent<AbsorbArgs>();
public OrderedEvent<DamageType> OnAilmentApplied = new OrderedEvent<DamageType>();
}
// A robust, orderable event system for delegates with priority support
public class OrderedEvent<T>
{
private class Subscriber
{
public int Priority;
public Action<T> Handler;
}
private List<Subscriber> subscribers = new List<Subscriber>();
public void Subscribe(Action<T> handler, int priority = 0)
{
if (handler == null) return;
subscribers.Add(new Subscriber { Priority = priority, Handler = handler });
subscribers.Sort((a, b) => a.Priority.CompareTo(b.Priority));
}
public void Unsubscribe(Action<T> handler)
{
subscribers.RemoveAll(s => s.Handler == handler);
}
public void Invoke(T args)
{
foreach (var sub in subscribers)
{
sub.Handler.Invoke(args);
}
}
}
//Example usage:
/*public class FireHelmetEffect : MonoBehaviour
{
public EntityEventBroker broker;
void OnEnable() {
// Priority 10, runs after lower numbers
broker.OnOutgoingDamage.Subscribe(OnModifyDamage, priority: 10);
}
void OnDisable() {
broker.OnOutgoingDamage.Unsubscribe(OnModifyDamage);
}
void OnModifyDamage(DamageArgs args) {
args.damageType = DamageType.Fire;
args.currentValue *= 1.5f;
}
}*/