1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
namespace BehaviorDesigner.Runtime.Tasks
{
[TaskDescription("Returns success as soon as the event specified by eventName has been received.")]
[HelpURL("http://www.opsive.com/assets/BehaviorDesigner/documentation.php?id=123")]
[TaskIcon("{SkinColor}HasReceivedEventIcon.png")]
public class HasReceivedEvent : Conditional
{
[Tooltip("The name of the event to receive")]
public SharedString eventName = "";
[Tooltip("Optionally store the first sent argument")]
[SharedRequired]
public SharedVariable storedValue1;
[Tooltip("Optionally store the second sent argument")]
[SharedRequired]
public SharedVariable storedValue2;
[Tooltip("Optionally store the third sent argument")]
[SharedRequired]
public SharedVariable storedValue3;
private bool eventReceived = false;
private bool registered = false;
public override void OnStart()
{
// Let the behavior tree know that we are interested in receiving the event specified
if (!registered) {
Owner.RegisterEvent(eventName.Value, ReceivedEvent);
Owner.RegisterEvent<object>(eventName.Value, ReceivedEvent);
Owner.RegisterEvent<object, object>(eventName.Value, ReceivedEvent);
Owner.RegisterEvent<object, object, object>(eventName.Value, ReceivedEvent);
registered = true;
}
}
public override TaskStatus OnUpdate()
{
return eventReceived ? TaskStatus.Success : TaskStatus.Failure;
}
public override void OnEnd()
{
if (eventReceived) {
Owner.UnregisterEvent(eventName.Value, ReceivedEvent);
Owner.UnregisterEvent<object>(eventName.Value, ReceivedEvent);
Owner.UnregisterEvent<object, object>(eventName.Value, ReceivedEvent);
Owner.UnregisterEvent<object, object, object>(eventName.Value, ReceivedEvent);
registered = false;
}
eventReceived = false;
}
private void ReceivedEvent()
{
eventReceived = true;
}
private void ReceivedEvent(object arg1)
{
ReceivedEvent();
if (storedValue1 != null && !storedValue1.IsNone) {
storedValue1.SetValue(arg1);
}
}
private void ReceivedEvent(object arg1, object arg2)
{
ReceivedEvent();
if (storedValue1 != null && !storedValue1.IsNone) {
storedValue1.SetValue(arg1);
}
if (storedValue2 != null && !storedValue2.IsNone) {
storedValue2.SetValue(arg2);
}
}
private void ReceivedEvent(object arg1, object arg2, object arg3)
{
ReceivedEvent();
if (storedValue1 != null && !storedValue1.IsNone) {
storedValue1.SetValue(arg1);
}
if (storedValue2 != null && !storedValue2.IsNone) {
storedValue2.SetValue(arg2);
}
if (storedValue3 != null && !storedValue3.IsNone) {
storedValue3.SetValue(arg3);
}
}
public override void OnBehaviorComplete()
{
// Stop receiving the event when the behavior tree is complete
Owner.UnregisterEvent(eventName.Value, ReceivedEvent);
Owner.UnregisterEvent<object>(eventName.Value, ReceivedEvent);
Owner.UnregisterEvent<object, object>(eventName.Value, ReceivedEvent);
Owner.UnregisterEvent<object, object, object>(eventName.Value, ReceivedEvent);
eventReceived = false;
}
public override void OnReset()
{
// Reset the properties back to their original values
eventName = "";
}
}
}
|