Skip to content

Commit 8fb7c61

Browse files
authored
fix: Enable custom messages to be sent to self when running as host. (#2296)
1 parent 9b3a07d commit 8fb7c61

File tree

5 files changed

+225
-48
lines changed

5 files changed

+225
-48
lines changed

com.unity.netcode.gameobjects/CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,12 @@ Additional documentation and release notes are available at [Multiplayer Documen
1919

2020
### Fixed
2121

22+
- Custom messages are now properly received by the local client when they're sent while running in host mode. (#2296)
2223
- Fixed issue where the host would receive more than one event completed notification when loading or unloading a scene only when no clients were connected. (#2292)
2324
- Fixed an issue in `UnityTransport` where an error would be logged if the 'Use Encryption' flag was enabled with a Relay configuration that used a secure protocol. (#2289)
2425
- Fixed issue where in-scene placed `NetworkObjects` were not honoring the `AutoObjectParentSync` property. (#2281)
2526
- Fixed the issue where `NetworkManager.OnClientConnectedCallback` was being invoked before in-scene placed `NetworkObject`s had been spawned when starting `NetworkManager` as a host. (#2277)
2627
- Creating a `FastBufferReader` with `Allocator.None` will not result in extra memory being allocated for the buffer (since it's owned externally in that scenario). (#2265)
27-
2828
### Removed
2929
- Removed the `NetworkObject` auto-add and Multiplayer Tools install reminder settings from the Menu interface. (#2285)
3030

com.unity.netcode.gameobjects/Runtime/Messaging/CustomMessageManager.cs

Lines changed: 58 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Generic;
3+
using Unity.Collections;
34

45
namespace Unity.Netcode
56
{
@@ -68,9 +69,23 @@ public void SendUnnamedMessage(IReadOnlyList<ulong> clientIds, FastBufferWriter
6869

6970
if (clientIds == null)
7071
{
71-
throw new ArgumentNullException("You must pass in a valid clientId List");
72+
throw new ArgumentNullException(nameof(clientIds), "You must pass in a valid clientId List");
7273
}
7374

75+
if (m_NetworkManager.IsHost)
76+
{
77+
for (var i = 0; i < clientIds.Count; ++i)
78+
{
79+
if (clientIds[i] == m_NetworkManager.LocalClientId)
80+
{
81+
InvokeUnnamedMessage(
82+
m_NetworkManager.LocalClientId,
83+
new FastBufferReader(messageBuffer, Allocator.None),
84+
0
85+
);
86+
}
87+
}
88+
}
7489
var message = new UnnamedMessage
7590
{
7691
SendData = messageBuffer
@@ -92,6 +107,18 @@ public void SendUnnamedMessage(IReadOnlyList<ulong> clientIds, FastBufferWriter
92107
/// <param name="networkDelivery">The delivery type (QoS) to send data with</param>
93108
public void SendUnnamedMessage(ulong clientId, FastBufferWriter messageBuffer, NetworkDelivery networkDelivery = NetworkDelivery.ReliableSequenced)
94109
{
110+
if (m_NetworkManager.IsHost)
111+
{
112+
if (clientId == m_NetworkManager.LocalClientId)
113+
{
114+
InvokeUnnamedMessage(
115+
m_NetworkManager.LocalClientId,
116+
new FastBufferReader(messageBuffer, Allocator.None),
117+
0
118+
);
119+
return;
120+
}
121+
}
95122
var message = new UnnamedMessage
96123
{
97124
SendData = messageBuffer
@@ -220,6 +247,20 @@ public void SendNamedMessage(string messageName, ulong clientId, FastBufferWrite
220247
hash = XXHash.Hash64(messageName);
221248
break;
222249
}
250+
if (m_NetworkManager.IsHost)
251+
{
252+
if (clientId == m_NetworkManager.LocalClientId)
253+
{
254+
InvokeNamedMessage(
255+
hash,
256+
m_NetworkManager.LocalClientId,
257+
new FastBufferReader(messageStream, Allocator.None),
258+
0
259+
);
260+
261+
return;
262+
}
263+
}
223264

224265
var message = new NamedMessage
225266
{
@@ -251,7 +292,7 @@ public void SendNamedMessage(string messageName, IReadOnlyList<ulong> clientIds,
251292

252293
if (clientIds == null)
253294
{
254-
throw new ArgumentNullException("You must pass in a valid clientId List");
295+
throw new ArgumentNullException(nameof(clientIds), "You must pass in a valid clientId List");
255296
}
256297

257298
ulong hash = 0;
@@ -264,6 +305,21 @@ public void SendNamedMessage(string messageName, IReadOnlyList<ulong> clientIds,
264305
hash = XXHash.Hash64(messageName);
265306
break;
266307
}
308+
if (m_NetworkManager.IsHost)
309+
{
310+
for (var i = 0; i < clientIds.Count; ++i)
311+
{
312+
if (clientIds[i] == m_NetworkManager.LocalClientId)
313+
{
314+
InvokeNamedMessage(
315+
hash,
316+
m_NetworkManager.LocalClientId,
317+
new FastBufferReader(messageStream, Allocator.None),
318+
0
319+
);
320+
}
321+
}
322+
}
267323
var message = new NamedMessage
268324
{
269325
Hash = hash,

com.unity.netcode.gameobjects/TestHelpers/Runtime/MessageHooksConditional.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,10 @@ protected override bool OnHasConditionBeenReached()
3939

4040
if (AllMessagesReceived)
4141
{
42-
return AllMessagesReceived;
42+
foreach (var entry in m_MessageHookEntries)
43+
{
44+
entry.RemoveHook();
45+
}
4346
}
4447

4548
return AllMessagesReceived;
@@ -110,6 +113,11 @@ internal void AssignMessageType<T>() where T : INetworkMessage
110113
Initialize();
111114
}
112115

116+
internal void RemoveHook()
117+
{
118+
m_NetworkManager.MessagingSystem.Unhook(MessageHooks);
119+
}
120+
113121
internal void AssignMessageType(Type type)
114122
{
115123
MessageType = type.Name;

com.unity.netcode.gameobjects/Tests/Runtime/Messaging/NamedMessageTests.cs

Lines changed: 83 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
using System.Collections.Generic;
44
using NUnit.Framework;
55
using Unity.Collections;
6-
using UnityEngine;
76
using UnityEngine.TestTools;
87
using Unity.Netcode.TestHelpers.Runtime;
98

@@ -27,6 +26,18 @@ protected override NetworkManagerInstatiationMode OnSetIntegrationTestMode()
2726
public IEnumerator NamedMessageIsReceivedOnClientWithContent()
2827
{
2928
var messageName = Guid.NewGuid().ToString();
29+
30+
ulong receivedMessageSender = 0;
31+
var receivedMessageContent = new ForceNetworkSerializeByMemcpy<Guid>(new Guid());
32+
FirstClient.CustomMessagingManager.RegisterNamedMessageHandler(
33+
messageName,
34+
(ulong sender, FastBufferReader reader) =>
35+
{
36+
receivedMessageSender = sender;
37+
38+
reader.ReadValueSafe(out receivedMessageContent);
39+
});
40+
3041
var messageContent = new ForceNetworkSerializeByMemcpy<Guid>(Guid.NewGuid());
3142
var writer = new FastBufferWriter(1300, Allocator.Temp);
3243
using (writer)
@@ -38,9 +49,20 @@ public IEnumerator NamedMessageIsReceivedOnClientWithContent()
3849
writer);
3950
}
4051

52+
yield return WaitForMessageReceived<NamedMessage>(new List<NetworkManager> { FirstClient });
53+
54+
Assert.AreEqual(messageContent.Value, receivedMessageContent.Value);
55+
Assert.AreEqual(m_ServerNetworkManager.LocalClientId, receivedMessageSender);
56+
}
57+
58+
[Test]
59+
public void NamedMessageIsReceivedOnHostWithContent()
60+
{
61+
var messageName = Guid.NewGuid().ToString();
62+
4163
ulong receivedMessageSender = 0;
4264
var receivedMessageContent = new ForceNetworkSerializeByMemcpy<Guid>(new Guid());
43-
FirstClient.CustomMessagingManager.RegisterNamedMessageHandler(
65+
m_ServerNetworkManager.CustomMessagingManager.RegisterNamedMessageHandler(
4466
messageName,
4567
(ulong sender, FastBufferReader reader) =>
4668
{
@@ -49,27 +71,26 @@ public IEnumerator NamedMessageIsReceivedOnClientWithContent()
4971
reader.ReadValueSafe(out receivedMessageContent);
5072
});
5173

52-
yield return new WaitForSeconds(0.2f);
53-
54-
Assert.AreEqual(messageContent.Value, receivedMessageContent.Value);
55-
Assert.AreEqual(m_ServerNetworkManager.LocalClientId, receivedMessageSender);
56-
}
57-
58-
[UnityTest]
59-
public IEnumerator NamedMessageIsReceivedOnMultipleClientsWithContent()
60-
{
61-
var messageName = Guid.NewGuid().ToString();
6274
var messageContent = new ForceNetworkSerializeByMemcpy<Guid>(Guid.NewGuid());
6375
var writer = new FastBufferWriter(1300, Allocator.Temp);
6476
using (writer)
6577
{
6678
writer.WriteValueSafe(messageContent);
6779
m_ServerNetworkManager.CustomMessagingManager.SendNamedMessage(
6880
messageName,
69-
new List<ulong> { FirstClient.LocalClientId, SecondClient.LocalClientId },
81+
m_ServerNetworkManager.LocalClientId,
7082
writer);
7183
}
7284

85+
Assert.AreEqual(messageContent.Value, receivedMessageContent.Value);
86+
Assert.AreEqual(m_ServerNetworkManager.LocalClientId, receivedMessageSender);
87+
}
88+
89+
[UnityTest]
90+
public IEnumerator NamedMessageIsReceivedOnMultipleClientsWithContent()
91+
{
92+
var messageName = Guid.NewGuid().ToString();
93+
7394
ulong firstReceivedMessageSender = 0;
7495
var firstReceivedMessageContent = new ForceNetworkSerializeByMemcpy<Guid>(new Guid());
7596
FirstClient.CustomMessagingManager.RegisterNamedMessageHandler(
@@ -92,26 +113,44 @@ public IEnumerator NamedMessageIsReceivedOnMultipleClientsWithContent()
92113
reader.ReadValueSafe(out secondReceivedMessageContent);
93114
});
94115

95-
yield return new WaitForSeconds(0.2f);
116+
ulong thirdReceivedMessageSender = 0;
117+
var thirdReceivedMessageContent = new ForceNetworkSerializeByMemcpy<Guid>(new Guid());
118+
m_ServerNetworkManager.CustomMessagingManager.RegisterNamedMessageHandler(
119+
messageName,
120+
(ulong sender, FastBufferReader reader) =>
121+
{
122+
thirdReceivedMessageSender = sender;
123+
124+
reader.ReadValueSafe(out thirdReceivedMessageContent);
125+
});
126+
127+
var messageContent = new ForceNetworkSerializeByMemcpy<Guid>(Guid.NewGuid());
128+
var writer = new FastBufferWriter(1300, Allocator.Temp);
129+
using (writer)
130+
{
131+
writer.WriteValueSafe(messageContent);
132+
m_ServerNetworkManager.CustomMessagingManager.SendNamedMessage(
133+
messageName,
134+
new List<ulong> { m_ServerNetworkManager.LocalClientId, FirstClient.LocalClientId, SecondClient.LocalClientId },
135+
writer);
136+
}
137+
138+
yield return WaitForMessageReceived<NamedMessage>(new List<NetworkManager> { FirstClient, SecondClient });
96139

97140
Assert.AreEqual(messageContent.Value, firstReceivedMessageContent.Value);
98141
Assert.AreEqual(m_ServerNetworkManager.LocalClientId, firstReceivedMessageSender);
99142

100143
Assert.AreEqual(messageContent.Value, secondReceivedMessageContent.Value);
101144
Assert.AreEqual(m_ServerNetworkManager.LocalClientId, secondReceivedMessageSender);
145+
146+
Assert.AreEqual(messageContent.Value, thirdReceivedMessageContent.Value);
147+
Assert.AreEqual(m_ServerNetworkManager.LocalClientId, thirdReceivedMessageSender);
102148
}
103149

104150
[UnityTest]
105151
public IEnumerator WhenSendingNamedMessageToAll_AllClientsReceiveIt()
106152
{
107153
var messageName = Guid.NewGuid().ToString();
108-
var messageContent = new ForceNetworkSerializeByMemcpy<Guid>(Guid.NewGuid());
109-
var writer = new FastBufferWriter(1300, Allocator.Temp);
110-
using (writer)
111-
{
112-
writer.WriteValueSafe(messageContent);
113-
m_ServerNetworkManager.CustomMessagingManager.SendNamedMessageToAll(messageName, writer);
114-
}
115154

116155
ulong firstReceivedMessageSender = 0;
117156
var firstReceivedMessageContent = new ForceNetworkSerializeByMemcpy<Guid>(new Guid());
@@ -135,13 +174,35 @@ public IEnumerator WhenSendingNamedMessageToAll_AllClientsReceiveIt()
135174
reader.ReadValueSafe(out secondReceivedMessageContent);
136175
});
137176

138-
yield return new WaitForSeconds(0.2f);
177+
ulong thirdReceivedMessageSender = 0;
178+
var thirdReceivedMessageContent = new ForceNetworkSerializeByMemcpy<Guid>(new Guid());
179+
m_ServerNetworkManager.CustomMessagingManager.RegisterNamedMessageHandler(
180+
messageName,
181+
(ulong sender, FastBufferReader reader) =>
182+
{
183+
thirdReceivedMessageSender = sender;
184+
185+
reader.ReadValueSafe(out thirdReceivedMessageContent);
186+
});
187+
188+
var messageContent = new ForceNetworkSerializeByMemcpy<Guid>(Guid.NewGuid());
189+
var writer = new FastBufferWriter(1300, Allocator.Temp);
190+
using (writer)
191+
{
192+
writer.WriteValueSafe(messageContent);
193+
m_ServerNetworkManager.CustomMessagingManager.SendNamedMessageToAll(messageName, writer);
194+
}
195+
196+
yield return WaitForMessageReceived<NamedMessage>(new List<NetworkManager> { FirstClient, SecondClient });
139197

140198
Assert.AreEqual(messageContent.Value, firstReceivedMessageContent.Value);
141199
Assert.AreEqual(m_ServerNetworkManager.LocalClientId, firstReceivedMessageSender);
142200

143201
Assert.AreEqual(messageContent.Value, secondReceivedMessageContent.Value);
144202
Assert.AreEqual(m_ServerNetworkManager.LocalClientId, secondReceivedMessageSender);
203+
204+
Assert.AreEqual(messageContent.Value, thirdReceivedMessageContent.Value);
205+
Assert.AreEqual(m_ServerNetworkManager.LocalClientId, thirdReceivedMessageSender);
145206
}
146207

147208
[Test]

0 commit comments

Comments
 (0)