From f67c28fe96abe274452829420c1900dd229d7cd2 Mon Sep 17 00:00:00 2001 From: Pedro Gomes Date: Sun, 28 Sep 2025 21:10:46 +0100 Subject: [PATCH] Event Driven Broker --- Assets/Scripts/AbilitySystem/DamageType.cs | 7 +++ Assets/Scripts/EventDrivenHooks.meta | 8 +++ .../EventDrivenHooks/EntityEventBroker.cs | 63 +++++++++++++++++++ .../EntityEventBroker.cs.meta | 2 + .../EventDrivenHooks/EventBrokerArgs.cs | 14 +++++ .../EventDrivenHooks/EventBrokerArgs.cs.meta | 2 + 6 files changed, 96 insertions(+) create mode 100644 Assets/Scripts/EventDrivenHooks.meta create mode 100644 Assets/Scripts/EventDrivenHooks/EntityEventBroker.cs create mode 100644 Assets/Scripts/EventDrivenHooks/EntityEventBroker.cs.meta create mode 100644 Assets/Scripts/EventDrivenHooks/EventBrokerArgs.cs create mode 100644 Assets/Scripts/EventDrivenHooks/EventBrokerArgs.cs.meta diff --git a/Assets/Scripts/AbilitySystem/DamageType.cs b/Assets/Scripts/AbilitySystem/DamageType.cs index 113c4251..a0ad0873 100644 --- a/Assets/Scripts/AbilitySystem/DamageType.cs +++ b/Assets/Scripts/AbilitySystem/DamageType.cs @@ -5,3 +5,10 @@ public enum DamageType Attack, Spell, } + +[System.Serializable] +public enum DamageApplicationMethod +{ + Hit, + Tick +} \ No newline at end of file diff --git a/Assets/Scripts/EventDrivenHooks.meta b/Assets/Scripts/EventDrivenHooks.meta new file mode 100644 index 00000000..e6d4bedb --- /dev/null +++ b/Assets/Scripts/EventDrivenHooks.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 52c2c97a7fdbe454e9c104a1db581634 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/EventDrivenHooks/EntityEventBroker.cs b/Assets/Scripts/EventDrivenHooks/EntityEventBroker.cs new file mode 100644 index 00000000..bd28fc7a --- /dev/null +++ b/Assets/Scripts/EventDrivenHooks/EntityEventBroker.cs @@ -0,0 +1,63 @@ +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; + } +}*/ \ No newline at end of file diff --git a/Assets/Scripts/EventDrivenHooks/EntityEventBroker.cs.meta b/Assets/Scripts/EventDrivenHooks/EntityEventBroker.cs.meta new file mode 100644 index 00000000..4a529424 --- /dev/null +++ b/Assets/Scripts/EventDrivenHooks/EntityEventBroker.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 45e09b6617beed447a13265764139f69 \ No newline at end of file diff --git a/Assets/Scripts/EventDrivenHooks/EventBrokerArgs.cs b/Assets/Scripts/EventDrivenHooks/EventBrokerArgs.cs new file mode 100644 index 00000000..5607cff5 --- /dev/null +++ b/Assets/Scripts/EventDrivenHooks/EventBrokerArgs.cs @@ -0,0 +1,14 @@ +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.Events; + + +public class DamageArgs +{ + public Taggable user; + public List targets; + public float currentValue; + public DamageType damageType; + public DamageApplicationMethod applicationMethod; + public bool isCrit; +} \ No newline at end of file diff --git a/Assets/Scripts/EventDrivenHooks/EventBrokerArgs.cs.meta b/Assets/Scripts/EventDrivenHooks/EventBrokerArgs.cs.meta new file mode 100644 index 00000000..dc7eba27 --- /dev/null +++ b/Assets/Scripts/EventDrivenHooks/EventBrokerArgs.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 6bfae0d27b1543948886b9ee5f166c2c \ No newline at end of file