Skip to content

Commit 40011ed

Browse files
authored
fix: issue #1151 - client RPCs invoked in OnNetworkSpawn being dropped (#1218)
* fix: issue #1151 - client RPCs invoked in OnNetworkSpawn being dropped
1 parent 0b80225 commit 40011ed

File tree

9 files changed

+251
-46
lines changed

9 files changed

+251
-46
lines changed

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

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,16 @@ internal void __sendServerRpc(FastBufferWriter writer, uint rpcMethodId, ServerR
7575
if (IsHost || IsServer)
7676
{
7777
using var tempBuffer = new FastBufferReader(writer, Allocator.Temp);
78-
message.Handle(tempBuffer, NetworkManager, NetworkManager.ServerClientId);
78+
var context = new NetworkContext
79+
{
80+
SenderId = NetworkManager.ServerClientId,
81+
Timestamp = Time.realtimeSinceStartup,
82+
SystemOwner = NetworkManager,
83+
// header information isn't valid since it's not a real message.
84+
// Passing false to canDefer prevents it being accessed.
85+
Header = new MessageHeader()
86+
};
87+
message.Handle(tempBuffer, context, NetworkManager, NetworkManager.ServerClientId, false);
7988
rpcMessageSize = tempBuffer.Length;
8089
}
8190
else
@@ -172,7 +181,16 @@ internal unsafe void __sendClientRpc(FastBufferWriter writer, uint rpcMethodId,
172181
if (shouldSendToHost)
173182
{
174183
using var tempBuffer = new FastBufferReader(writer, Allocator.Temp);
175-
message.Handle(tempBuffer, NetworkManager, NetworkManager.ServerClientId);
184+
var context = new NetworkContext
185+
{
186+
SenderId = NetworkManager.ServerClientId,
187+
Timestamp = Time.realtimeSinceStartup,
188+
SystemOwner = NetworkManager,
189+
// header information isn't valid since it's not a real message.
190+
// Passing false to canDefer prevents it being accessed.
191+
Header = new MessageHeader()
192+
};
193+
message.Handle(tempBuffer, context, NetworkManager, NetworkManager.ServerClientId, false);
176194
messageSize = tempBuffer.Length;
177195
}
178196

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

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ internal static string PrefabDebugHelper(NetworkPrefab networkPrefab)
5656
internal SnapshotSystem SnapshotSystem { get; private set; }
5757
internal NetworkBehaviourUpdater BehaviourUpdater { get; private set; }
5858

59-
private MessagingSystem m_MessagingSystem;
59+
internal MessagingSystem MessagingSystem { get; private set; }
6060

6161
private NetworkPrefabHandler m_PrefabHandler;
6262

@@ -244,7 +244,7 @@ public ulong LocalClientId
244244
internal set
245245
{
246246
m_LocalClientId = value;
247-
m_MessagingSystem.SetLocalClientId(value);
247+
MessagingSystem.SetLocalClientId(value);
248248
}
249249
}
250250

@@ -497,15 +497,15 @@ private void Initialize(bool server)
497497
this.RegisterNetworkUpdate(NetworkUpdateStage.EarlyUpdate);
498498
this.RegisterNetworkUpdate(NetworkUpdateStage.PostLateUpdate);
499499

500-
m_MessagingSystem = new MessagingSystem(new NetworkManagerMessageSender(this), this, ulong.MaxValue);
500+
MessagingSystem = new MessagingSystem(new NetworkManagerMessageSender(this), this, ulong.MaxValue);
501501

502-
m_MessagingSystem.Hook(new NetworkManagerHooks(this));
502+
MessagingSystem.Hook(new NetworkManagerHooks(this));
503503
#if DEVELOPMENT_BUILD || UNITY_EDITOR
504-
m_MessagingSystem.Hook(new ProfilingHooks());
504+
MessagingSystem.Hook(new ProfilingHooks());
505505
#endif
506506

507507
#if MULTIPLAYER_TOOLS
508-
m_MessagingSystem.Hook(new MetricHooks(this));
508+
MessagingSystem.Hook(new MetricHooks(this));
509509
#endif
510510
LocalClientId = ulong.MaxValue;
511511

@@ -847,7 +847,7 @@ public SocketTasks StartClient()
847847
}
848848

849849
Initialize(false);
850-
m_MessagingSystem.ClientConnected(ServerClientId);
850+
MessagingSystem.ClientConnected(ServerClientId);
851851

852852
var socketTasks = NetworkConfig.NetworkTransport.StartClient();
853853

@@ -893,7 +893,7 @@ public SocketTasks StartHost()
893893
Initialize(true);
894894

895895
var socketTasks = NetworkConfig.NetworkTransport.StartServer();
896-
m_MessagingSystem.ClientConnected(ServerClientId);
896+
MessagingSystem.ClientConnected(ServerClientId);
897897
LocalClientId = ServerClientId;
898898
NetworkMetrics.SetConnectionId(LocalClientId);
899899

@@ -1003,9 +1003,9 @@ public void Shutdown()
10031003
if (IsServer)
10041004
{
10051005
// make sure all messages are flushed before transport disconnect clients
1006-
if (m_MessagingSystem != null)
1006+
if (MessagingSystem != null)
10071007
{
1008-
m_MessagingSystem.ProcessSendQueues();
1008+
MessagingSystem.ProcessSendQueues();
10091009
}
10101010

10111011
var disconnectedIds = new HashSet<ulong>();
@@ -1066,10 +1066,10 @@ public void Shutdown()
10661066
NetworkTickSystem = null;
10671067
}
10681068

1069-
if (m_MessagingSystem != null)
1069+
if (MessagingSystem != null)
10701070
{
1071-
m_MessagingSystem.Dispose();
1072-
m_MessagingSystem = null;
1071+
MessagingSystem.Dispose();
1072+
MessagingSystem = null;
10731073
}
10741074

10751075
NetworkConfig.NetworkTransport.OnTransportEvent -= HandleRawTransportPoll;
@@ -1145,7 +1145,7 @@ private void OnNetworkEarlyUpdate()
11451145
// Only do another iteration if: there are no more messages AND (there is no limit to max events or we have processed less than the maximum)
11461146
} while (IsListening && networkEvent != NetworkEvent.Nothing);
11471147

1148-
m_MessagingSystem.ProcessIncomingMessageQueue();
1148+
MessagingSystem.ProcessIncomingMessageQueue();
11491149

11501150
#if DEVELOPMENT_BUILD || UNITY_EDITOR
11511151
s_TransportPoll.End();
@@ -1177,8 +1177,9 @@ private void OnNetworkPreUpdate()
11771177

11781178
private void OnNetworkPostLateUpdate()
11791179
{
1180-
m_MessagingSystem.ProcessSendQueues();
1180+
MessagingSystem.ProcessSendQueues();
11811181
NetworkMetrics.DispatchFrame();
1182+
SpawnManager.CleanupStaleTriggers();
11821183
}
11831184

11841185
/// <summary>
@@ -1240,7 +1241,7 @@ private void HandleRawTransportPoll(NetworkEvent networkEvent, ulong clientId, A
12401241
#if DEVELOPMENT_BUILD || UNITY_EDITOR
12411242
s_TransportConnect.Begin();
12421243
#endif
1243-
m_MessagingSystem.ClientConnected(clientId);
1244+
MessagingSystem.ClientConnected(clientId);
12441245
if (IsServer)
12451246
{
12461247
if (NetworkLog.CurrentLogLevel <= LogLevel.Developer)
@@ -1332,9 +1333,9 @@ internal unsafe int SendMessage<TMessageType, TClientIdListType>(in TMessageType
13321333
{
13331334
return 0;
13341335
}
1335-
return m_MessagingSystem.SendMessage(message, delivery, nonServerIds, newIdx);
1336+
return MessagingSystem.SendMessage(message, delivery, nonServerIds, newIdx);
13361337
}
1337-
return m_MessagingSystem.SendMessage(message, delivery, clientIds);
1338+
return MessagingSystem.SendMessage(message, delivery, clientIds);
13381339
}
13391340

13401341
internal unsafe int SendMessage<T>(in T message, NetworkDelivery delivery,
@@ -1360,10 +1361,10 @@ internal unsafe int SendMessage<T>(in T message, NetworkDelivery delivery,
13601361
{
13611362
return 0;
13621363
}
1363-
return m_MessagingSystem.SendMessage(message, delivery, nonServerIds, newIdx);
1364+
return MessagingSystem.SendMessage(message, delivery, nonServerIds, newIdx);
13641365
}
13651366

1366-
return m_MessagingSystem.SendMessage(message, delivery, clientIds, numClientIds);
1367+
return MessagingSystem.SendMessage(message, delivery, clientIds, numClientIds);
13671368
}
13681369

13691370
internal unsafe int SendMessage<T>(in T message, NetworkDelivery delivery, in NativeArray<ulong> clientIds)
@@ -1380,7 +1381,7 @@ internal int SendMessage<T>(in T message, NetworkDelivery delivery, ulong client
13801381
{
13811382
return 0;
13821383
}
1383-
return m_MessagingSystem.SendMessage(message, delivery, clientId);
1384+
return MessagingSystem.SendMessage(message, delivery, clientId);
13841385
}
13851386

13861387
internal void HandleIncomingData(ulong clientId, ArraySegment<byte> payload, float receiveTime)
@@ -1389,7 +1390,7 @@ internal void HandleIncomingData(ulong clientId, ArraySegment<byte> payload, flo
13891390
s_HandleIncomingData.Begin();
13901391
#endif
13911392

1392-
m_MessagingSystem.HandleIncomingData(clientId, payload, receiveTime);
1393+
MessagingSystem.HandleIncomingData(clientId, payload, receiveTime);
13931394

13941395
#if DEVELOPMENT_BUILD || UNITY_EDITOR
13951396
s_HandleIncomingData.End();
@@ -1485,7 +1486,7 @@ private void OnClientDisconnectFromServer(ulong clientId)
14851486

14861487
m_ConnectedClients.Remove(clientId);
14871488
}
1488-
m_MessagingSystem.ClientDisconnected(clientId);
1489+
MessagingSystem.ClientDisconnected(clientId);
14891490
}
14901491

14911492
private void SyncTime()

com.unity.netcode.gameobjects/Runtime/Messaging/Messages/ChangeOwnershipMessage.cs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,14 @@ public static void Receive(FastBufferReader reader, in NetworkContext context)
1818
return;
1919
}
2020
reader.ReadValueSafe(out ChangeOwnershipMessage message);
21-
message.Handle(context.SenderId, networkManager, reader.Length);
21+
message.Handle(reader, context, context.SenderId, networkManager, reader.Length);
2222
}
2323

24-
public void Handle(ulong senderId, NetworkManager networkManager, int messageSize)
24+
public void Handle(FastBufferReader reader, in NetworkContext context, ulong senderId, NetworkManager networkManager, int messageSize)
2525
{
2626
if (!networkManager.SpawnManager.SpawnedObjects.TryGetValue(NetworkObjectId, out var networkObject))
2727
{
28-
if (NetworkLog.CurrentLogLevel <= LogLevel.Normal)
29-
{
30-
NetworkLog.LogWarning($"Trying to handle owner change but {nameof(NetworkObject)} #{NetworkObjectId} does not exist in {nameof(NetworkSpawnManager.SpawnedObjects)} anymore!");
31-
}
32-
28+
networkManager.SpawnManager.TriggerOnSpawn(NetworkObjectId, reader, context);
3329
return;
3430
}
3531

com.unity.netcode.gameobjects/Runtime/Messaging/Messages/NetworkVariableDeltaMessage.cs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -106,10 +106,10 @@ public static void Receive(FastBufferReader reader, in NetworkContext context)
106106
}
107107
reader.ReadValue(out message.NetworkObjectId);
108108
reader.ReadValue(out message.NetworkBehaviourIndex);
109-
message.Handle(context.SenderId, reader, networkManager);
109+
message.Handle(context.SenderId, reader, context, networkManager);
110110
}
111111

112-
public void Handle(ulong senderId, FastBufferReader reader, NetworkManager networkManager)
112+
public void Handle(ulong senderId, FastBufferReader reader, in NetworkContext context, NetworkManager networkManager)
113113
{
114114
if (networkManager.SpawnManager.SpawnedObjects.TryGetValue(NetworkObjectId, out NetworkObject networkObject))
115115
{
@@ -214,12 +214,9 @@ public void Handle(ulong senderId, FastBufferReader reader, NetworkManager netwo
214214
}
215215
}
216216
}
217-
else if (networkManager.IsServer)
217+
else
218218
{
219-
if (NetworkLog.CurrentLogLevel <= LogLevel.Normal)
220-
{
221-
NetworkLog.LogWarning($"Network variable delta message received for a non-existent object with {nameof(NetworkObjectId)}: {NetworkObjectId}. This delta was lost.");
222-
}
219+
networkManager.SpawnManager.TriggerOnSpawn(NetworkObjectId, reader, context);
223220
}
224221
}
225222
}

com.unity.netcode.gameobjects/Runtime/Messaging/Messages/ParentSyncMessage.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,20 +47,20 @@ public static void Receive(FastBufferReader reader, in NetworkContext context)
4747
}
4848
}
4949

50-
message.Handle(networkManager);
50+
message.Handle(reader, context, networkManager);
5151
}
5252

53-
public void Handle(NetworkManager networkManager)
53+
public void Handle(FastBufferReader reader, in NetworkContext context, NetworkManager networkManager)
5454
{
5555
if (networkManager.SpawnManager.SpawnedObjects.ContainsKey(NetworkObjectId))
5656
{
5757
var networkObject = networkManager.SpawnManager.SpawnedObjects[NetworkObjectId];
5858
networkObject.SetNetworkParenting(IsReparented, LatestParent);
5959
networkObject.ApplyNetworkParenting();
6060
}
61-
else if (NetworkLog.CurrentLogLevel <= LogLevel.Developer)
61+
else
6262
{
63-
NetworkLog.LogWarning($"Read {nameof(ParentSyncMessage)} for {nameof(NetworkObject)} #{NetworkObjectId} but could not find it in the {nameof(networkManager.SpawnManager.SpawnedObjects)}");
63+
networkManager.SpawnManager.TriggerOnSpawn(NetworkObjectId, reader, context);
6464
}
6565
}
6666
}

com.unity.netcode.gameobjects/Runtime/Messaging/Messages/RpcMessage.cs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,15 +40,23 @@ public static void Receive(FastBufferReader reader, in NetworkContext context)
4040
throw new OverflowException("Not enough space in the buffer to read RPC data.");
4141
}
4242
reader.ReadValue(out message.Header);
43-
message.Handle(reader, (NetworkManager)context.SystemOwner, context.SenderId);
43+
message.Handle(reader, context, (NetworkManager)context.SystemOwner, context.SenderId, true);
4444
}
4545

46-
public void Handle(FastBufferReader reader, NetworkManager networkManager, ulong senderId)
46+
public void Handle(FastBufferReader reader, in NetworkContext context, NetworkManager networkManager, ulong senderId, bool canDefer)
4747
{
4848
if (NetworkManager.__rpc_func_table.ContainsKey(Header.NetworkMethodId))
4949
{
5050
if (!networkManager.SpawnManager.SpawnedObjects.ContainsKey(Header.NetworkObjectId))
5151
{
52+
if (canDefer)
53+
{
54+
networkManager.SpawnManager.TriggerOnSpawn(Header.NetworkObjectId, reader, context);
55+
}
56+
else
57+
{
58+
NetworkLog.LogError($"Tried to invoke an RPC on a non-existent {nameof(NetworkObject)} with {nameof(canDefer)}=false");
59+
}
5260
return;
5361
}
5462

0 commit comments

Comments
 (0)