@@ -15,6 +15,18 @@ namespace MLAPI.Messaging
15
15
/// </summary>
16
16
public static class CustomMessagingManager
17
17
{
18
+ private enum HandlerChange
19
+ {
20
+ Add ,
21
+ Remove
22
+ }
23
+ private struct PendingHandlerChange
24
+ {
25
+ public HandlerChange change ;
26
+ public string name ;
27
+ public HandleNamedMessageDelegate method ;
28
+ }
29
+
18
30
#region Unnamed
19
31
/// <summary>
20
32
/// Delegate used for incoming unnamed messages
@@ -28,6 +40,23 @@ public static class CustomMessagingManager
28
40
/// </summary>
29
41
public static event UnnamedMessageDelegate OnUnnamedMessage ;
30
42
43
+ internal static void OnGainedSingleton ( )
44
+ {
45
+ while ( pendingRegistrations . Count > 0 )
46
+ {
47
+ PendingHandlerChange change = pendingRegistrations . Dequeue ( ) ;
48
+
49
+ if ( change . change == HandlerChange . Add )
50
+ {
51
+ RegisterNamedMessageHandler ( change . name , change . method ) ;
52
+ }
53
+ else if ( change . change == HandlerChange . Remove )
54
+ {
55
+ UnregisterNamedMessageHandler ( change . name ) ;
56
+ }
57
+ }
58
+ }
59
+
31
60
internal static void InvokeUnnamedMessage ( ulong clientId , Stream stream )
32
61
{
33
62
if ( OnUnnamedMessage != null )
@@ -89,6 +118,7 @@ public static void SendUnnamedMessage(ulong clientId, BitStream stream, string c
89
118
/// </summary>
90
119
public delegate void HandleNamedMessageDelegate ( ulong sender , Stream payload ) ;
91
120
121
+ private static readonly Queue < PendingHandlerChange > pendingRegistrations = new Queue < PendingHandlerChange > ( ) ;
92
122
private static readonly Dictionary < ulong , HandleNamedMessageDelegate > namedMessageHandlers = new Dictionary < ulong , HandleNamedMessageDelegate > ( ) ;
93
123
94
124
internal static void InvokeNamedMessage ( ulong hash , ulong sender , Stream stream )
@@ -106,9 +136,47 @@ internal static void InvokeNamedMessage(ulong hash, ulong sender, Stream stream)
106
136
/// <param name="callback">The callback to run when a named message is received.</param>
107
137
public static void RegisterNamedMessageHandler ( string name , HandleNamedMessageDelegate callback )
108
138
{
109
- ulong hash = NetworkedBehaviour . HashMethodName ( name ) ;
139
+ if ( NetworkingManager . Singleton != null )
140
+ {
141
+ ulong hash = NetworkedBehaviour . HashMethodName ( name ) ;
142
+
143
+ namedMessageHandlers [ hash ] = callback ;
144
+ }
145
+ else
146
+ {
147
+ pendingRegistrations . Enqueue ( new PendingHandlerChange ( )
148
+ {
149
+ change = HandlerChange . Add ,
150
+ method = callback ,
151
+ name = name
152
+ } ) ;
153
+ }
154
+ }
155
+
156
+ /// <summary>
157
+ /// Unregisters a named message handler.
158
+ /// </summary>
159
+ /// <param name="name">The name of the message.</param>
160
+ public static void UnregisterNamedMessageHandler ( string name )
161
+ {
162
+ if ( NetworkingManager . Singleton != null )
163
+ {
164
+ ulong hash = NetworkedBehaviour . HashMethodName ( name ) ;
110
165
111
- namedMessageHandlers [ hash ] = callback ;
166
+ if ( namedMessageHandlers . ContainsKey ( hash ) )
167
+ {
168
+ namedMessageHandlers . Remove ( hash ) ;
169
+ }
170
+ }
171
+ else
172
+ {
173
+ pendingRegistrations . Enqueue ( new PendingHandlerChange ( )
174
+ {
175
+ change = HandlerChange . Remove ,
176
+ method = null ,
177
+ name = name
178
+ } ) ;
179
+ }
112
180
}
113
181
114
182
/// <summary>
0 commit comments