6
6
using MLAPI . Security ;
7
7
using MLAPI . Serialization ;
8
8
using MLAPI . Serialization . Pooled ;
9
+ using MLAPI . Hashing ;
9
10
10
11
namespace MLAPI . Messaging
11
12
{
@@ -83,19 +84,60 @@ public static void SendUnnamedMessage(ulong clientId, BitStream stream, string c
83
84
}
84
85
#endregion
85
86
#region Named
86
-
87
87
/// <summary>
88
88
/// Delegate used to handle named messages
89
89
/// </summary>
90
90
public delegate void HandleNamedMessageDelegate ( ulong sender , Stream payload ) ;
91
91
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
+
93
96
94
97
internal static void InvokeNamedMessage ( ulong hash , ulong sender , Stream stream )
95
98
{
96
- if ( namedMessageHandlers . ContainsKey ( hash ) )
99
+ if ( NetworkingManager . Singleton == null )
97
100
{
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
+ }
99
141
}
100
142
}
101
143
@@ -106,9 +148,20 @@ internal static void InvokeNamedMessage(ulong hash, ulong sender, Stream stream)
106
148
/// <param name="callback">The callback to run when a named message is received.</param>
107
149
public static void RegisterNamedMessageHandler ( string name , HandleNamedMessageDelegate callback )
108
150
{
109
- ulong hash = NetworkedBehaviour . HashMethodName ( name ) ;
151
+ namedMessageHandlers16 [ name . GetStableHash16 ( ) ] = callback ;
152
+ namedMessageHandlers32 [ name . GetStableHash32 ( ) ] = callback ;
153
+ namedMessageHandlers64 [ name . GetStableHash64 ( ) ] = callback ;
154
+ }
110
155
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 ( ) ) ;
112
165
}
113
166
114
167
/// <summary>
0 commit comments