Skip to content

fix: Enable custom messages to be sent to self when running as host. #2296

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 6 commits into from
Nov 9, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion com.unity.netcode.gameobjects/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,12 @@ Additional documentation and release notes are available at [Multiplayer Documen

### Fixed

- Custom messages are now properly received by the local client when they're sent while running in host mode. (#2296)
- 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)
- 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)
- Fixed issue where in-scene placed `NetworkObjects` were not honoring the `AutoObjectParentSync` property. (#2281)
- 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)
- 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)

### Removed
- Removed the `NetworkObject` auto-add and Multiplayer Tools install reminder settings from the Menu interface. (#2285)

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using Unity.Collections;

namespace Unity.Netcode
{
Expand Down Expand Up @@ -68,9 +69,23 @@ public void SendUnnamedMessage(IReadOnlyList<ulong> clientIds, FastBufferWriter

if (clientIds == null)
{
throw new ArgumentNullException("You must pass in a valid clientId List");
throw new ArgumentNullException(nameof(clientIds), "You must pass in a valid clientId List");
}

if (m_NetworkManager.IsHost)
{
for (var i = 0; i < clientIds.Count; ++i)
{
if (clientIds[i] == m_NetworkManager.LocalClientId)
{
InvokeUnnamedMessage(
m_NetworkManager.LocalClientId,
new FastBufferReader(messageBuffer, Allocator.None),
0
);
}
}
}
var message = new UnnamedMessage
{
SendData = messageBuffer
Expand All @@ -92,6 +107,18 @@ public void SendUnnamedMessage(IReadOnlyList<ulong> clientIds, FastBufferWriter
/// <param name="networkDelivery">The delivery type (QoS) to send data with</param>
public void SendUnnamedMessage(ulong clientId, FastBufferWriter messageBuffer, NetworkDelivery networkDelivery = NetworkDelivery.ReliableSequenced)
{
if (m_NetworkManager.IsHost)
{
if (clientId == m_NetworkManager.LocalClientId)
{
InvokeUnnamedMessage(
m_NetworkManager.LocalClientId,
new FastBufferReader(messageBuffer, Allocator.None),
0
);
return;
}
}
var message = new UnnamedMessage
{
SendData = messageBuffer
Expand Down Expand Up @@ -220,6 +247,20 @@ public void SendNamedMessage(string messageName, ulong clientId, FastBufferWrite
hash = XXHash.Hash64(messageName);
break;
}
if (m_NetworkManager.IsHost)
{
if (clientId == m_NetworkManager.LocalClientId)
{
InvokeNamedMessage(
hash,
m_NetworkManager.LocalClientId,
new FastBufferReader(messageStream, Allocator.None),
0
);

return;
}
}

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

if (clientIds == null)
{
throw new ArgumentNullException("You must pass in a valid clientId List");
throw new ArgumentNullException(nameof(clientIds), "You must pass in a valid clientId List");
}

ulong hash = 0;
Expand All @@ -264,6 +305,21 @@ public void SendNamedMessage(string messageName, IReadOnlyList<ulong> clientIds,
hash = XXHash.Hash64(messageName);
break;
}
if (m_NetworkManager.IsHost)
{
for (var i = 0; i < clientIds.Count; ++i)
{
if (clientIds[i] == m_NetworkManager.LocalClientId)
{
InvokeNamedMessage(
hash,
m_NetworkManager.LocalClientId,
new FastBufferReader(messageStream, Allocator.None),
0
);
}
}
}
var message = new NamedMessage
{
Hash = hash,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,10 @@ protected override bool OnHasConditionBeenReached()

if (AllMessagesReceived)
{
return AllMessagesReceived;
foreach (var entry in m_MessageHookEntries)
{
entry.RemoveHook();
}
}

return AllMessagesReceived;
Expand Down Expand Up @@ -110,6 +113,11 @@ internal void AssignMessageType<T>() where T : INetworkMessage
Initialize();
}

internal void RemoveHook()
{
m_NetworkManager.MessagingSystem.Unhook(MessageHooks);
}

internal void AssignMessageType(Type type)
{
MessageType = type.Name;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
using System.Collections.Generic;
using NUnit.Framework;
using Unity.Collections;
using UnityEngine;
using UnityEngine.TestTools;
using Unity.Netcode.TestHelpers.Runtime;

Expand All @@ -27,6 +26,18 @@ protected override NetworkManagerInstatiationMode OnSetIntegrationTestMode()
public IEnumerator NamedMessageIsReceivedOnClientWithContent()
{
var messageName = Guid.NewGuid().ToString();

ulong receivedMessageSender = 0;
var receivedMessageContent = new ForceNetworkSerializeByMemcpy<Guid>(new Guid());
FirstClient.CustomMessagingManager.RegisterNamedMessageHandler(
messageName,
(ulong sender, FastBufferReader reader) =>
{
receivedMessageSender = sender;

reader.ReadValueSafe(out receivedMessageContent);
});

var messageContent = new ForceNetworkSerializeByMemcpy<Guid>(Guid.NewGuid());
var writer = new FastBufferWriter(1300, Allocator.Temp);
using (writer)
Expand All @@ -38,9 +49,20 @@ public IEnumerator NamedMessageIsReceivedOnClientWithContent()
writer);
}

yield return WaitForMessageReceived<NamedMessage>(new List<NetworkManager> { FirstClient });

Assert.AreEqual(messageContent.Value, receivedMessageContent.Value);
Assert.AreEqual(m_ServerNetworkManager.LocalClientId, receivedMessageSender);
}

[Test]
public void NamedMessageIsReceivedOnHostWithContent()
{
var messageName = Guid.NewGuid().ToString();

ulong receivedMessageSender = 0;
var receivedMessageContent = new ForceNetworkSerializeByMemcpy<Guid>(new Guid());
FirstClient.CustomMessagingManager.RegisterNamedMessageHandler(
m_ServerNetworkManager.CustomMessagingManager.RegisterNamedMessageHandler(
messageName,
(ulong sender, FastBufferReader reader) =>
{
Expand All @@ -49,27 +71,26 @@ public IEnumerator NamedMessageIsReceivedOnClientWithContent()
reader.ReadValueSafe(out receivedMessageContent);
});

yield return new WaitForSeconds(0.2f);

Assert.AreEqual(messageContent.Value, receivedMessageContent.Value);
Assert.AreEqual(m_ServerNetworkManager.LocalClientId, receivedMessageSender);
}

[UnityTest]
public IEnumerator NamedMessageIsReceivedOnMultipleClientsWithContent()
{
var messageName = Guid.NewGuid().ToString();
var messageContent = new ForceNetworkSerializeByMemcpy<Guid>(Guid.NewGuid());
var writer = new FastBufferWriter(1300, Allocator.Temp);
using (writer)
{
writer.WriteValueSafe(messageContent);
m_ServerNetworkManager.CustomMessagingManager.SendNamedMessage(
messageName,
new List<ulong> { FirstClient.LocalClientId, SecondClient.LocalClientId },
m_ServerNetworkManager.LocalClientId,
writer);
}

Assert.AreEqual(messageContent.Value, receivedMessageContent.Value);
Assert.AreEqual(m_ServerNetworkManager.LocalClientId, receivedMessageSender);
}

[UnityTest]
public IEnumerator NamedMessageIsReceivedOnMultipleClientsWithContent()
{
var messageName = Guid.NewGuid().ToString();

ulong firstReceivedMessageSender = 0;
var firstReceivedMessageContent = new ForceNetworkSerializeByMemcpy<Guid>(new Guid());
FirstClient.CustomMessagingManager.RegisterNamedMessageHandler(
Expand All @@ -92,26 +113,44 @@ public IEnumerator NamedMessageIsReceivedOnMultipleClientsWithContent()
reader.ReadValueSafe(out secondReceivedMessageContent);
});

yield return new WaitForSeconds(0.2f);
ulong thirdReceivedMessageSender = 0;
var thirdReceivedMessageContent = new ForceNetworkSerializeByMemcpy<Guid>(new Guid());
m_ServerNetworkManager.CustomMessagingManager.RegisterNamedMessageHandler(
messageName,
(ulong sender, FastBufferReader reader) =>
{
thirdReceivedMessageSender = sender;

reader.ReadValueSafe(out thirdReceivedMessageContent);
});

var messageContent = new ForceNetworkSerializeByMemcpy<Guid>(Guid.NewGuid());
var writer = new FastBufferWriter(1300, Allocator.Temp);
using (writer)
{
writer.WriteValueSafe(messageContent);
m_ServerNetworkManager.CustomMessagingManager.SendNamedMessage(
messageName,
new List<ulong> { m_ServerNetworkManager.LocalClientId, FirstClient.LocalClientId, SecondClient.LocalClientId },
writer);
}

yield return WaitForMessageReceived<NamedMessage>(new List<NetworkManager> { FirstClient, SecondClient });

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

Assert.AreEqual(messageContent.Value, secondReceivedMessageContent.Value);
Assert.AreEqual(m_ServerNetworkManager.LocalClientId, secondReceivedMessageSender);

Assert.AreEqual(messageContent.Value, thirdReceivedMessageContent.Value);
Assert.AreEqual(m_ServerNetworkManager.LocalClientId, thirdReceivedMessageSender);
}

[UnityTest]
public IEnumerator WhenSendingNamedMessageToAll_AllClientsReceiveIt()
{
var messageName = Guid.NewGuid().ToString();
var messageContent = new ForceNetworkSerializeByMemcpy<Guid>(Guid.NewGuid());
var writer = new FastBufferWriter(1300, Allocator.Temp);
using (writer)
{
writer.WriteValueSafe(messageContent);
m_ServerNetworkManager.CustomMessagingManager.SendNamedMessageToAll(messageName, writer);
}

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

yield return new WaitForSeconds(0.2f);
ulong thirdReceivedMessageSender = 0;
var thirdReceivedMessageContent = new ForceNetworkSerializeByMemcpy<Guid>(new Guid());
m_ServerNetworkManager.CustomMessagingManager.RegisterNamedMessageHandler(
messageName,
(ulong sender, FastBufferReader reader) =>
{
thirdReceivedMessageSender = sender;

reader.ReadValueSafe(out thirdReceivedMessageContent);
});

var messageContent = new ForceNetworkSerializeByMemcpy<Guid>(Guid.NewGuid());
var writer = new FastBufferWriter(1300, Allocator.Temp);
using (writer)
{
writer.WriteValueSafe(messageContent);
m_ServerNetworkManager.CustomMessagingManager.SendNamedMessageToAll(messageName, writer);
}

yield return WaitForMessageReceived<NamedMessage>(new List<NetworkManager> { FirstClient, SecondClient });

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

Assert.AreEqual(messageContent.Value, secondReceivedMessageContent.Value);
Assert.AreEqual(m_ServerNetworkManager.LocalClientId, secondReceivedMessageSender);

Assert.AreEqual(messageContent.Value, thirdReceivedMessageContent.Value);
Assert.AreEqual(m_ServerNetworkManager.LocalClientId, thirdReceivedMessageSender);
}

[Test]
Expand Down
Loading