84 lines
2.8 KiB
C#
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;
|
|
}
|
|
}*/ |