@@ -15,6 +15,18 @@ namespace MLAPI.Messaging
1515 /// </summary>
1616 public static class CustomMessagingManager
1717 {
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+
1830 #region Unnamed
1931 /// <summary>
2032 /// Delegate used for incoming unnamed messages
@@ -28,6 +40,23 @@ public static class CustomMessagingManager
2840 /// </summary>
2941 public static event UnnamedMessageDelegate OnUnnamedMessage ;
3042
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+
3160 internal static void InvokeUnnamedMessage ( ulong clientId , Stream stream )
3261 {
3362 if ( OnUnnamedMessage != null )
@@ -89,6 +118,7 @@ public static void SendUnnamedMessage(ulong clientId, BitStream stream, string c
89118 /// </summary>
90119 public delegate void HandleNamedMessageDelegate ( ulong sender , Stream payload ) ;
91120
121+ private static readonly Queue < PendingHandlerChange > pendingRegistrations = new Queue < PendingHandlerChange > ( ) ;
92122 private static readonly Dictionary < ulong , HandleNamedMessageDelegate > namedMessageHandlers = new Dictionary < ulong , HandleNamedMessageDelegate > ( ) ;
93123
94124 internal static void InvokeNamedMessage ( ulong hash , ulong sender , Stream stream )
@@ -106,9 +136,47 @@ internal static void InvokeNamedMessage(ulong hash, ulong sender, Stream stream)
106136 /// <param name="callback">The callback to run when a named message is received.</param>
107137 public static void RegisterNamedMessageHandler ( string name , HandleNamedMessageDelegate callback )
108138 {
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 ) ;
110165
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+ }
112180 }
113181
114182 /// <summary>
0 commit comments