blob: a9bed5f26b9a212205fa40d3af602e4df62993ba (
plain)
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
114
115
116
117
118
119
|
using System;
using System.Collections.Generic;
using Sandbox;
namespace MurderGame;
/// <summary>
/// Component designed for movement, only 1 per pawn.
/// </summary>
public class BaseControllerComponent : EntityComponent<Player>, ISingletonComponent
{
internal HashSet<string> Events = new(StringComparer.OrdinalIgnoreCase);
internal HashSet<string> Tags;
public Vector3 WishVelocity { get; set; }
public virtual void Simulate( IClient cl )
{
}
public virtual void FrameSimulate( IClient cl )
{
}
public virtual void BuildInput()
{
}
/// <summary>
/// Call OnEvent for each event
/// </summary>
public virtual void RunEvents( BaseControllerComponent additionalController )
{
if ( Events == null )
{
return;
}
foreach ( var e in Events )
{
OnEvent( e );
additionalController?.OnEvent( e );
}
}
/// <summary>
/// An event has been triggered - maybe handle it
/// </summary>
public virtual void OnEvent( string name )
{
}
/// <summary>
/// Returns true if we have this event
/// </summary>
public bool HasEvent( string eventName )
{
if ( Events == null )
{
return false;
}
return Events.Contains( eventName );
}
/// <summary>
/// </summary>
public bool HasTag( string tagName )
{
if ( Tags == null )
{
return false;
}
return Tags.Contains( tagName );
}
/// <summary>
/// Allows the controller to pass events to other systems
/// while staying abstracted.
/// For example, it could pass a "jump" event, which could then
/// be picked up by the playeranimator to trigger a jump animation,
/// and picked up by the player to play a jump sound.
/// </summary>
public void AddEvent( string eventName )
{
// TODO - shall we allow passing data with the event?
if ( Events == null )
{
Events = new HashSet<string>();
}
if ( Events.Contains( eventName ) )
{
return;
}
Events.Add( eventName );
}
/// <summary>
/// </summary>
public void SetTag( string tagName )
{
// TODO - shall we allow passing data with the event?
Tags ??= new HashSet<string>();
if ( Tags.Contains( tagName ) )
{
return;
}
Tags.Add( tagName );
}
}
|