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
{
@@ -15,18 +16,6 @@ namespace MLAPI.Messaging
15
16
/// </summary>
16
17
public static class CustomMessagingManager
17
18
{
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
-
30
19
#region Unnamed
31
20
/// <summary>
32
21
/// Delegate used for incoming unnamed messages
@@ -40,23 +29,6 @@ private struct PendingHandlerChange
40
29
/// </summary>
41
30
public static event UnnamedMessageDelegate OnUnnamedMessage ;
42
31
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
-
60
32
internal static void InvokeUnnamedMessage ( ulong clientId , Stream stream )
61
33
{
62
34
if ( OnUnnamedMessage != null )
@@ -112,20 +84,60 @@ public static void SendUnnamedMessage(ulong clientId, BitStream stream, string c
112
84
}
113
85
#endregion
114
86
#region Named
115
-
116
87
/// <summary>
117
88
/// Delegate used to handle named messages
118
89
/// </summary>
119
90
public delegate void HandleNamedMessageDelegate ( ulong sender , Stream payload ) ;
120
91
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
+
123
96
124
97
internal static void InvokeNamedMessage ( ulong hash , ulong sender , Stream stream )
125
98
{
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
127
118
{
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
+ }
129
141
}
130
142
}
131
143
@@ -136,21 +148,9 @@ internal static void InvokeNamedMessage(ulong hash, ulong sender, Stream stream)
136
148
/// <param name="callback">The callback to run when a named message is received.</param>
137
149
public static void RegisterNamedMessageHandler ( string name , HandleNamedMessageDelegate callback )
138
150
{
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 ;
154
154
}
155
155
156
156
/// <summary>
@@ -159,24 +159,9 @@ public static void RegisterNamedMessageHandler(string name, HandleNamedMessageDe
159
159
/// <param name="name">The name of the message.</param>
160
160
public static void UnregisterNamedMessageHandler ( string name )
161
161
{
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 ( ) ) ;
180
165
}
181
166
182
167
/// <summary>
0 commit comments