Skip to content

Commit d4678fd

Browse files
fix: fixing MTT-1299 (#1227)
* fix: fixing MTT-1299
1 parent c215d15 commit d4678fd

File tree

3 files changed

+49
-16
lines changed

3 files changed

+49
-16
lines changed

com.unity.netcode.gameobjects/Runtime/Core/NetworkBehaviour.cs

Lines changed: 42 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -69,17 +69,20 @@ internal void __sendServerRpc(FastBufferWriter writer, uint rpcMethodId, ServerR
6969
RpcData = writer
7070
};
7171

72+
var rpcMessageSize = 0;
73+
7274
// If we are a server/host then we just no op and send to ourself
7375
if (IsHost || IsServer)
7476
{
75-
var tempBuffer = new FastBufferReader(writer, Allocator.Temp);
76-
message.Handle(tempBuffer, NetworkManager, NetworkBehaviourId);
77-
tempBuffer.Dispose();
78-
79-
return;
77+
using var tempBuffer = new FastBufferReader(writer, Allocator.Temp);
78+
message.Handle(tempBuffer, NetworkManager, NetworkManager.ServerClientId);
79+
rpcMessageSize = tempBuffer.Length;
80+
}
81+
else
82+
{
83+
rpcMessageSize = NetworkManager.SendMessage(message, networkDelivery, NetworkManager.ServerClientId);
8084
}
8185

82-
var rpcMessageSize = NetworkManager.SendMessage(message, networkDelivery, NetworkManager.ServerClientId, true);
8386

8487
#if DEVELOPMENT_BUILD || UNITY_EDITOR
8588
if (NetworkManager.__rpc_name_table.TryGetValue(rpcMethodId, out var rpcMethodName))
@@ -129,17 +132,48 @@ internal unsafe void __sendClientRpc(FastBufferWriter writer, uint rpcMethodId,
129132
};
130133
int messageSize;
131134

135+
// We check to see if we need to shortcut for the case where we are the host/server and we can send a clientRPC
136+
// to ourself. Sadly we have to figure that out from the list of clientIds :(
137+
bool shouldSendToHost = false;
138+
132139
if (rpcParams.Send.TargetClientIds != null)
133140
{
134-
messageSize = NetworkManager.SendMessage(message, networkDelivery, in rpcParams.Send.TargetClientIds, true);
141+
foreach (var clientId in rpcParams.Send.TargetClientIds)
142+
{
143+
if (clientId == NetworkManager.ServerClientId)
144+
{
145+
shouldSendToHost = true;
146+
break;
147+
}
148+
}
149+
150+
messageSize = NetworkManager.SendMessage(message, networkDelivery, in rpcParams.Send.TargetClientIds);
135151
}
136152
else if (rpcParams.Send.TargetClientIdsNativeArray != null)
137153
{
154+
foreach (var clientId in rpcParams.Send.TargetClientIdsNativeArray)
155+
{
156+
if (clientId == NetworkManager.ServerClientId)
157+
{
158+
shouldSendToHost = true;
159+
break;
160+
}
161+
}
162+
138163
messageSize = NetworkManager.SendMessage(message, networkDelivery, rpcParams.Send.TargetClientIdsNativeArray.Value);
139164
}
140165
else
141166
{
142-
messageSize = NetworkManager.SendMessage(message, networkDelivery, NetworkManager.ConnectedClientsIds, true);
167+
shouldSendToHost = IsHost;
168+
messageSize = NetworkManager.SendMessage(message, networkDelivery, NetworkManager.ConnectedClientsIds);
169+
}
170+
171+
// If we are a server/host then we just no op and send to ourself
172+
if (shouldSendToHost)
173+
{
174+
using var tempBuffer = new FastBufferReader(writer, Allocator.Temp);
175+
message.Handle(tempBuffer, NetworkManager, NetworkManager.ServerClientId);
176+
messageSize = tempBuffer.Length;
143177
}
144178

145179
#if DEVELOPMENT_BUILD || UNITY_EDITOR

com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1297,12 +1297,12 @@ private void HandleRawTransportPoll(NetworkEvent networkEvent, ulong clientId, A
12971297
}
12981298
}
12991299

1300-
public unsafe int SendMessage<TMessageType, TClientIdListType>(in TMessageType message, NetworkDelivery delivery, in TClientIdListType clientIds, bool serverCanSendToServerId = false)
1300+
public unsafe int SendMessage<TMessageType, TClientIdListType>(in TMessageType message, NetworkDelivery delivery, in TClientIdListType clientIds)
13011301
where TMessageType : INetworkMessage
13021302
where TClientIdListType : IReadOnlyList<ulong>
13031303
{
13041304
// Prevent server sending to itself
1305-
if (IsServer && !serverCanSendToServerId)
1305+
if (IsServer)
13061306
{
13071307
ulong* nonServerIds = stackalloc ulong[clientIds.Count];
13081308
int newIdx = 0;
@@ -1326,11 +1326,11 @@ public unsafe int SendMessage<TMessageType, TClientIdListType>(in TMessageType m
13261326
}
13271327

13281328
public unsafe int SendMessage<T>(in T message, NetworkDelivery delivery,
1329-
ulong* clientIds, int numClientIds, bool serverCanSendToServerId = false)
1329+
ulong* clientIds, int numClientIds)
13301330
where T : INetworkMessage
13311331
{
13321332
// Prevent server sending to itself
1333-
if (IsServer && !serverCanSendToServerId)
1333+
if (IsServer)
13341334
{
13351335
ulong* nonServerIds = stackalloc ulong[numClientIds];
13361336
int newIdx = 0;
@@ -1360,11 +1360,11 @@ internal unsafe int SendMessage<T>(in T message, NetworkDelivery delivery, in Na
13601360
return SendMessage(message, delivery, (ulong*)clientIds.GetUnsafePtr(), clientIds.Length);
13611361
}
13621362

1363-
public int SendMessage<T>(in T message, NetworkDelivery delivery, ulong clientId, bool serverCanSendToServerId = false)
1363+
public int SendMessage<T>(in T message, NetworkDelivery delivery, ulong clientId)
13641364
where T : INetworkMessage
13651365
{
13661366
// Prevent server sending to itself
1367-
if (IsServer && clientId == ServerClientId && !serverCanSendToServerId)
1367+
if (IsServer && clientId == ServerClientId)
13681368
{
13691369
return 0;
13701370
}

testproject/Assets/Tests/Runtime/MessageOrdering.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ public IEnumerator SpawnRpcDespawn()
147147
int expectedCount = Support.SpawnRpcDespawn.ClientUpdateCount + 1;
148148
const int maxFrames = 240;
149149
var doubleCheckTime = Time.realtimeSinceStartup + 5.0f;
150-
while (Support.SpawnRpcDespawn.ClientUpdateCount < expectedCount)
150+
while (Support.SpawnRpcDespawn.ClientUpdateCount < expectedCount && !handler.WasSpawned)
151151
{
152152
if (Time.frameCount > maxFrames)
153153
{
@@ -165,7 +165,6 @@ public IEnumerator SpawnRpcDespawn()
165165

166166
Assert.AreEqual(NetworkUpdateStage.EarlyUpdate, Support.SpawnRpcDespawn.StageExecutedByReceiver);
167167
Assert.AreEqual(Support.SpawnRpcDespawn.ServerUpdateCount, Support.SpawnRpcDespawn.ClientUpdateCount);
168-
Assert.True(handler.WasSpawned);
169168
var lastFrameNumber = Time.frameCount + 1;
170169
yield return new WaitUntil(() => Time.frameCount >= lastFrameNumber);
171170
Assert.True(handler.WasDestroyed);

0 commit comments

Comments
 (0)