66using MLAPI . Security ;
77using MLAPI . Serialization ;
88using MLAPI . Serialization . Pooled ;
9+ using MLAPI . Hashing ;
910
1011namespace MLAPI . Messaging
1112{
@@ -15,18 +16,6 @@ namespace MLAPI.Messaging
1516 /// </summary>
1617 public static class CustomMessagingManager
1718 {
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-
3019 #region Unnamed
3120 /// <summary>
3221 /// Delegate used for incoming unnamed messages
@@ -40,23 +29,6 @@ private struct PendingHandlerChange
4029 /// </summary>
4130 public static event UnnamedMessageDelegate OnUnnamedMessage ;
4231
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-
6032 internal static void InvokeUnnamedMessage ( ulong clientId , Stream stream )
6133 {
6234 if ( OnUnnamedMessage != null )
@@ -112,20 +84,60 @@ public static void SendUnnamedMessage(ulong clientId, BitStream stream, string c
11284 }
11385 #endregion
11486 #region Named
115-
11687 /// <summary>
11788 /// Delegate used to handle named messages
11889 /// </summary>
11990 public delegate void HandleNamedMessageDelegate ( ulong sender , Stream payload ) ;
12091
121- private static readonly Queue < PendingHandlerChange > pendingRegistrations = new Queue < PendingHandlerChange > ( ) ;
122- private static readonly Dictionary < ulong , HandleNamedMessageDelegate > namedMessageHandlers = new Dictionary < ulong , HandleNamedMessageDelegate > ( ) ;
92+ private static readonly Dictionary < ulong , HandleNamedMessageDelegate > namedMessageHandlers16 = new Dictionary < ulong , HandleNamedMessageDelegate > ( ) ;
93+ private static readonly Dictionary < ulong , HandleNamedMessageDelegate > namedMessageHandlers32 = new Dictionary < ulong , HandleNamedMessageDelegate > ( ) ;
94+ private static readonly Dictionary < ulong , HandleNamedMessageDelegate > namedMessageHandlers64 = new Dictionary < ulong , HandleNamedMessageDelegate > ( ) ;
95+
12396
12497 internal static void InvokeNamedMessage ( ulong hash , ulong sender , Stream stream )
12598 {
126- if ( namedMessageHandlers . ContainsKey ( hash ) )
99+ if ( NetworkingManager . Singleton == null )
100+ {
101+ // We dont know what size to use. Try every (more collision prone)
102+ if ( namedMessageHandlers16 . ContainsKey ( hash ) )
103+ {
104+ namedMessageHandlers16 [ hash ] ( sender , stream ) ;
105+ }
106+
107+ if ( namedMessageHandlers32 . ContainsKey ( hash ) )
108+ {
109+ namedMessageHandlers32 [ hash ] ( sender , stream ) ;
110+ }
111+
112+ if ( namedMessageHandlers64 . ContainsKey ( hash ) )
113+ {
114+ namedMessageHandlers64 [ hash ] ( sender , stream ) ;
115+ }
116+ }
117+ else
127118 {
128- namedMessageHandlers [ hash ] ( sender , stream ) ;
119+ // Only check the right size.
120+ if ( NetworkingManager . Singleton . NetworkConfig . RpcHashSize == HashSize . VarIntTwoBytes )
121+ {
122+ if ( namedMessageHandlers16 . ContainsKey ( hash ) )
123+ {
124+ namedMessageHandlers16 [ hash ] ( sender , stream ) ;
125+ }
126+ }
127+ else if ( NetworkingManager . Singleton . NetworkConfig . RpcHashSize == HashSize . VarIntFourBytes )
128+ {
129+ if ( namedMessageHandlers32 . ContainsKey ( hash ) )
130+ {
131+ namedMessageHandlers32 [ hash ] ( sender , stream ) ;
132+ }
133+ }
134+ else if ( NetworkingManager . Singleton . NetworkConfig . RpcHashSize == HashSize . VarIntEightBytes )
135+ {
136+ if ( namedMessageHandlers64 . ContainsKey ( hash ) )
137+ {
138+ namedMessageHandlers64 [ hash ] ( sender , stream ) ;
139+ }
140+ }
129141 }
130142 }
131143
@@ -136,21 +148,9 @@ internal static void InvokeNamedMessage(ulong hash, ulong sender, Stream stream)
136148 /// <param name="callback">The callback to run when a named message is received.</param>
137149 public static void RegisterNamedMessageHandler ( string name , HandleNamedMessageDelegate callback )
138150 {
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- }
151+ namedMessageHandlers16 [ name . GetStableHash16 ( ) ] = callback ;
152+ namedMessageHandlers32 [ name . GetStableHash32 ( ) ] = callback ;
153+ namedMessageHandlers64 [ name . GetStableHash64 ( ) ] = callback ;
154154 }
155155
156156 /// <summary>
@@ -159,24 +159,9 @@ public static void RegisterNamedMessageHandler(string name, HandleNamedMessageDe
159159 /// <param name="name">The name of the message.</param>
160160 public static void UnregisterNamedMessageHandler ( string name )
161161 {
162- if ( NetworkingManager . Singleton != null )
163- {
164- ulong hash = NetworkedBehaviour . HashMethodName ( name ) ;
165-
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- }
162+ namedMessageHandlers16 . Remove ( name . GetStableHash16 ( ) ) ;
163+ namedMessageHandlers32 . Remove ( name . GetStableHash32 ( ) ) ;
164+ namedMessageHandlers64 . Remove ( name . GetStableHash64 ( ) ) ;
180165 }
181166
182167 /// <summary>
0 commit comments