A game about forced loneliness, made by TACStudios
1using System.Collections.Generic;
2using System.Linq;
3using UnityEngine;
4
5namespace Unity.VisualScripting
6{
7 /// <summary>
8 /// Triggers a custom event.
9 /// </summary>
10 [UnitSurtitle("Custom Event")]
11 [UnitShortTitle("Trigger")]
12 [TypeIcon(typeof(CustomEvent))]
13 [UnitCategory("Events")]
14 [UnitOrder(1)]
15 public sealed class TriggerCustomEvent : Unit
16 {
17 [SerializeAs(nameof(argumentCount))]
18 private int _argumentCount;
19
20 [DoNotSerialize]
21 public List<ValueInput> arguments { get; private set; }
22
23 [DoNotSerialize]
24 [Inspectable, UnitHeaderInspectable("Arguments")]
25 public int argumentCount
26 {
27 get => _argumentCount;
28 set => _argumentCount = Mathf.Clamp(value, 0, 10);
29 }
30
31 /// <summary>
32 /// The entry point to trigger the event.
33 /// </summary>
34 [DoNotSerialize]
35 [PortLabelHidden]
36 public ControlInput enter { get; private set; }
37
38 /// <summary>
39 /// The name of the event.
40 /// </summary>
41 [DoNotSerialize]
42 [PortLabelHidden]
43 public ValueInput name { get; private set; }
44
45 /// <summary>
46 /// The target of the event.
47 /// </summary>
48 [DoNotSerialize]
49 [PortLabelHidden]
50 [NullMeansSelf]
51 public ValueInput target { get; private set; }
52
53 /// <summary>
54 /// The action to do after the event has been triggered.
55 /// </summary>
56 [DoNotSerialize]
57 [PortLabelHidden]
58 public ControlOutput exit { get; private set; }
59
60 protected override void Definition()
61 {
62 enter = ControlInput(nameof(enter), Trigger);
63
64 exit = ControlOutput(nameof(exit));
65
66 name = ValueInput(nameof(name), string.Empty);
67
68 target = ValueInput<GameObject>(nameof(target), null).NullMeansSelf();
69
70 arguments = new List<ValueInput>();
71
72 for (var i = 0; i < argumentCount; i++)
73 {
74 var argument = ValueInput<object>("argument_" + i);
75 arguments.Add(argument);
76 Requirement(argument, enter);
77 }
78
79 Requirement(name, enter);
80 Requirement(target, enter);
81 Succession(enter, exit);
82 }
83
84 private ControlOutput Trigger(Flow flow)
85 {
86 var target = flow.GetValue<GameObject>(this.target);
87 var name = flow.GetValue<string>(this.name);
88 var arguments = this.arguments.Select(flow.GetConvertedValue).ToArray();
89
90 CustomEvent.Trigger(target, name, arguments);
91
92 return exit;
93 }
94 }
95}