RiftMayhem/Assets/Scripts/EventDrivenHooks/EntityEventBroker.cs
2025-09-28 21:10:46 +01:00

63 lines
1.6 KiB
C#

using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
public class EntityEventBroker : MonoBehaviour
{
public OrderedEvent<DamageArgs> OnOutgoingDamage = new OrderedEvent<DamageArgs>();
public OrderedEvent<DamageArgs> OnIncomingDamage = new OrderedEvent<DamageArgs>();
}
// 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;
}
}*/