66using MLAPI . Security ;
77using MLAPI . Serialization ;
88using MLAPI . Serialization . Pooled ;
9+ using MLAPI . Hashing ;
910
1011namespace MLAPI . Messaging
1112{
@@ -83,19 +84,60 @@ public static void SendUnnamedMessage(ulong clientId, BitStream stream, string c
8384 }
8485 #endregion
8586 #region Named
86-
8787 /// <summary>
8888 /// Delegate used to handle named messages
8989 /// </summary>
9090 public delegate void HandleNamedMessageDelegate ( ulong sender , Stream payload ) ;
9191
92- 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+
9396
9497 internal static void InvokeNamedMessage ( ulong hash , ulong sender , Stream stream )
9598 {
96- if ( namedMessageHandlers . ContainsKey ( hash ) )
99+ if ( NetworkingManager . Singleton == null )
97100 {
98- namedMessageHandlers [ hash ] ( sender , stream ) ;
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
118+ {
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+ }
99141 }
100142 }
101143
@@ -106,9 +148,20 @@ internal static void InvokeNamedMessage(ulong hash, ulong sender, Stream stream)
106148 /// <param name="callback">The callback to run when a named message is received.</param>
107149 public static void RegisterNamedMessageHandler ( string name , HandleNamedMessageDelegate callback )
108150 {
109- ulong hash = NetworkedBehaviour . HashMethodName ( name ) ;
151+ namedMessageHandlers16 [ name . GetStableHash16 ( ) ] = callback ;
152+ namedMessageHandlers32 [ name . GetStableHash32 ( ) ] = callback ;
153+ namedMessageHandlers64 [ name . GetStableHash64 ( ) ] = callback ;
154+ }
110155
111- namedMessageHandlers [ hash ] = callback ;
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+ namedMessageHandlers16 . Remove ( name . GetStableHash16 ( ) ) ;
163+ namedMessageHandlers32 . Remove ( name . GetStableHash32 ( ) ) ;
164+ namedMessageHandlers64 . Remove ( name . GetStableHash64 ( ) ) ;
112165 }
113166
114167 /// <summary>
0 commit comments