Skip to content

Commit a4ea6e9

Browse files
committed
feat: Added unregister custom message and fixed pre singleton registration
1 parent 32a59c5 commit a4ea6e9

File tree

2 files changed

+74
-3
lines changed

2 files changed

+74
-3
lines changed

MLAPI/Core/NetworkingManager.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -591,11 +591,14 @@ private void OnEnable()
591591
else
592592
{
593593
Singleton = this;
594-
if (OnSingletonReady != null) OnSingletonReady();
594+
if (OnSingletonReady != null)
595+
OnSingletonReady();
595596
if (DontDestroy)
596597
DontDestroyOnLoad(gameObject);
597598
if (RunInBackground)
598599
Application.runInBackground = true;
600+
601+
CustomMessagingManager.OnGainedSingleton();
599602
}
600603
}
601604

MLAPI/Messaging/CustomMessageManager.cs

Lines changed: 70 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,18 @@ namespace MLAPI.Messaging
1515
/// </summary>
1616
public static class CustomMessagingManager
1717
{
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+
1830
#region Unnamed
1931
/// <summary>
2032
/// Delegate used for incoming unnamed messages
@@ -28,6 +40,23 @@ public static class CustomMessagingManager
2840
/// </summary>
2941
public static event UnnamedMessageDelegate OnUnnamedMessage;
3042

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+
3160
internal static void InvokeUnnamedMessage(ulong clientId, Stream stream)
3261
{
3362
if (OnUnnamedMessage != null)
@@ -89,6 +118,7 @@ public static void SendUnnamedMessage(ulong clientId, BitStream stream, string c
89118
/// </summary>
90119
public delegate void HandleNamedMessageDelegate(ulong sender, Stream payload);
91120

121+
private static readonly Queue<PendingHandlerChange> pendingRegistrations = new Queue<PendingHandlerChange>();
92122
private static readonly Dictionary<ulong, HandleNamedMessageDelegate> namedMessageHandlers = new Dictionary<ulong, HandleNamedMessageDelegate>();
93123

94124
internal static void InvokeNamedMessage(ulong hash, ulong sender, Stream stream)
@@ -106,9 +136,47 @@ internal static void InvokeNamedMessage(ulong hash, ulong sender, Stream stream)
106136
/// <param name="callback">The callback to run when a named message is received.</param>
107137
public static void RegisterNamedMessageHandler(string name, HandleNamedMessageDelegate callback)
108138
{
109-
ulong hash = NetworkedBehaviour.HashMethodName(name);
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+
}
154+
}
155+
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+
if (NetworkingManager.Singleton != null)
163+
{
164+
ulong hash = NetworkedBehaviour.HashMethodName(name);
110165

111-
namedMessageHandlers[hash] = callback;
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+
}
112180
}
113181

114182
/// <summary>

0 commit comments

Comments
 (0)