A game about forced loneliness, made by TACStudios
1using System;
2
3namespace Unity.VisualScripting
4{
5 public static class XEventGraph
6 {
7 public static void TriggerEventHandler<TArgs>(this GraphReference reference, Func<EventHook, bool> predicate, TArgs args, Func<IGraphParentElement, bool> recurse, bool force)
8 {
9 Ensure.That(nameof(reference)).IsNotNull(reference);
10
11 foreach (var element in reference.graph.elements)
12 {
13 if (element is IGraphEventHandler<TArgs> handler && (predicate?.Invoke(handler.GetHook(reference)) ?? true))
14 {
15 if (force || handler.IsListening(reference))
16 {
17 handler.Trigger(reference, args);
18 }
19 }
20
21 if (element is IGraphParentElement parentElement && recurse(parentElement))
22 {
23 reference.ChildReference(parentElement, false, 0)?.TriggerEventHandler(predicate, args, recurse, force);
24 }
25 }
26 }
27
28 public static void TriggerEventHandler<TArgs>(this GraphStack stack, Func<EventHook, bool> predicate, TArgs args, Func<IGraphParentElement, bool> recurse, bool force)
29 {
30 Ensure.That(nameof(stack)).IsNotNull(stack);
31
32 GraphReference reference = null;
33
34 foreach (var element in stack.graph.elements)
35 {
36 if (element is IGraphEventHandler<TArgs> handler)
37 {
38 if (reference == null)
39 {
40 reference = stack.ToReference();
41 }
42
43 if (predicate == null || predicate.Invoke(handler.GetHook(reference)))
44 {
45 if (force || handler.IsListening(reference))
46 {
47 handler.Trigger(reference, args);
48 }
49 }
50 }
51
52 if (element is IGraphParentElement parentElement && recurse(parentElement))
53 {
54 if (stack.TryEnterParentElementUnsafe(parentElement))
55 {
56 stack.TriggerEventHandler(predicate, args, recurse, force);
57 stack.ExitParentElement();
58 }
59 }
60 }
61 }
62 }
63}