Event Driven Broker

This commit is contained in:
Pedro Gomes 2025-09-28 21:10:46 +01:00
parent b198b5d4fb
commit f67c28fe96
6 changed files with 96 additions and 0 deletions

View File

@ -5,3 +5,10 @@ public enum DamageType
Attack,
Spell,
}
[System.Serializable]
public enum DamageApplicationMethod
{
Hit,
Tick
}

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 52c2c97a7fdbe454e9c104a1db581634
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,63 @@
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;
}
}*/

View File

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 45e09b6617beed447a13265764139f69

View File

@ -0,0 +1,14 @@
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
public class DamageArgs
{
public Taggable user;
public List<Taggable> targets;
public float currentValue;
public DamageType damageType;
public DamageApplicationMethod applicationMethod;
public bool isCrit;
}

View File

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 6bfae0d27b1543948886b9ee5f166c2c