using System; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; public class EntityEventBroker : MonoBehaviour { public OrderedEvent OnOutgoingDamage = new OrderedEvent(); public OrderedEvent OnIncomingDamage = new OrderedEvent(); } // A robust, orderable event system for delegates with priority support public class OrderedEvent { private class Subscriber { public int Priority; public Action Handler; } private List subscribers = new List(); public void Subscribe(Action 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 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; } }*/