Skip to content

Commit 7cee329

Browse files
committed
fix: Ensured CustomMessageManager is persistant across sessions
1 parent a4ea6e9 commit 7cee329

File tree

1 file changed

+52
-67
lines changed

1 file changed

+52
-67
lines changed

MLAPI/Messaging/CustomMessageManager.cs

Lines changed: 52 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using MLAPI.Security;
77
using MLAPI.Serialization;
88
using MLAPI.Serialization.Pooled;
9+
using MLAPI.Hashing;
910

1011
namespace 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

Comments
 (0)