Skip to content

Commit b1e02e3

Browse files
authored
fix: change ownership of owner-read network variables mtt-5009 #2286 (#2301)
1 parent 86afb0a commit b1e02e3

File tree

3 files changed

+79
-4
lines changed

3 files changed

+79
-4
lines changed

com.unity.netcode.gameobjects/Runtime/Spawning/NetworkSpawnManager.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,9 @@ internal void ChangeOwnership(NetworkObject networkObject, ulong clientId)
270270

271271
networkObject.OwnerClientId = clientId;
272272

273+
networkObject.MarkVariablesDirty(true);
274+
NetworkManager.BehaviourUpdater.AddForUpdate(networkObject);
275+
273276
// Server adds entries for all client ownership
274277
UpdateOwnershipTable(networkObject, networkObject.OwnerClientId);
275278

com.unity.netcode.gameobjects/Tests/Runtime/DeferredMessagingTests.cs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -794,17 +794,23 @@ public IEnumerator WhenSpawnTriggeredMessagesAreDeferredBeforeThePrefabIsAdded_A
794794

795795
serverObject.GetComponent<NetworkObject>().ChangeOwnership(m_ClientNetworkManagers[0].LocalClientId);
796796

797-
yield return WaitForAllClientsToReceive<ChangeOwnershipMessage>();
797+
yield return WaitForAllClientsToReceive<ChangeOwnershipMessage, NetworkVariableDeltaMessage>();
798+
799+
// wait three ticks
800+
yield return NetcodeIntegrationTestHelpers.WaitForTicks(m_ServerNetworkManager, 3);
801+
yield return NetcodeIntegrationTestHelpers.WaitForTicks(m_ClientNetworkManagers[0], 3);
798802

799803
// Validate messages are deferred and pending
800804
foreach (var client in m_ClientNetworkManagers)
801805
{
802806
var manager = (TestDeferredMessageManager)client.DeferredMessageManager;
803807
Assert.IsTrue(manager.DeferMessageCalled);
804808
Assert.IsFalse(manager.ProcessTriggersCalled);
805-
Assert.AreEqual(4, manager.DeferredMessageCountTotal());
806-
Assert.AreEqual(3, manager.DeferredMessageCountForType(IDeferredMessageManager.TriggerType.OnSpawn));
807-
Assert.AreEqual(3, manager.DeferredMessageCountForKey(IDeferredMessageManager.TriggerType.OnSpawn, serverObject.GetComponent<NetworkObject>().NetworkObjectId));
809+
810+
Assert.AreEqual(5, manager.DeferredMessageCountTotal());
811+
812+
Assert.AreEqual(4, manager.DeferredMessageCountForType(IDeferredMessageManager.TriggerType.OnSpawn));
813+
Assert.AreEqual(4, manager.DeferredMessageCountForKey(IDeferredMessageManager.TriggerType.OnSpawn, serverObject.GetComponent<NetworkObject>().NetworkObjectId));
808814
Assert.AreEqual(1, manager.DeferredMessageCountForType(IDeferredMessageManager.TriggerType.OnAddPrefab));
809815
Assert.AreEqual(1, manager.DeferredMessageCountForKey(IDeferredMessageManager.TriggerType.OnAddPrefab, serverObject.GetComponent<NetworkObject>().GlobalObjectIdHash));
810816
AddPrefabsToClient(client);

com.unity.netcode.gameobjects/Tests/Runtime/NetworkShowHideTests.cs

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ public class ShowHideObject : NetworkBehaviour
1313
public static List<ShowHideObject> ClientTargetedNetworkObjects = new List<ShowHideObject>();
1414
public static ulong ClientIdToTarget;
1515
public static bool Silent;
16+
public static int ValueAfterOwnershipChange = 0;
1617

1718
public static NetworkObject GetNetworkObjectById(ulong networkObjectId)
1819
{
@@ -57,13 +58,35 @@ public override void OnNetworkDespawn()
5758

5859
public NetworkVariable<int> MyNetworkVariable;
5960
public NetworkList<int> MyListSetOnSpawn;
61+
public NetworkVariable<int> MyOwnerReadNetworkVariable;
62+
static public NetworkManager NetworkManagerOfInterest;
63+
64+
internal static int GainOwnershipCount = 0;
6065

6166
private void Awake()
6267
{
68+
// Debug.Log($"Awake {NetworkManager.LocalClientId}");
6369
MyNetworkVariable = new NetworkVariable<int>();
6470
MyNetworkVariable.OnValueChanged += Changed;
6571

6672
MyListSetOnSpawn = new NetworkList<int>();
73+
74+
MyOwnerReadNetworkVariable = new NetworkVariable<int>(readPerm: NetworkVariableReadPermission.Owner);
75+
MyOwnerReadNetworkVariable.OnValueChanged += OwnerReadChanged;
76+
}
77+
78+
public override void OnGainedOwnership()
79+
{
80+
GainOwnershipCount++;
81+
base.OnGainedOwnership();
82+
}
83+
84+
public void OwnerReadChanged(int before, int after)
85+
{
86+
if (NetworkManager == NetworkManagerOfInterest)
87+
{
88+
ValueAfterOwnershipChange = after;
89+
}
6790
}
6891

6992
public void Changed(int before, int after)
@@ -328,5 +351,48 @@ public IEnumerator NetworkHideChangeOwnership()
328351

329352
Assert.True(ShowHideObject.ClientTargetedNetworkObjects[0].OwnerClientId == m_ClientNetworkManagers[0].LocalClientId);
330353
}
354+
355+
[UnityTest]
356+
public IEnumerator NetworkHideChangeOwnershipNotHidden()
357+
{
358+
ShowHideObject.ClientTargetedNetworkObjects.Clear();
359+
ShowHideObject.ClientIdToTarget = m_ClientNetworkManagers[1].LocalClientId;
360+
ShowHideObject.Silent = true;
361+
362+
var spawnedObject1 = SpawnObject(m_PrefabToSpawn, m_ServerNetworkManager);
363+
m_NetSpawnedObject1 = spawnedObject1.GetComponent<NetworkObject>();
364+
365+
// wait for host to have spawned and gained ownership
366+
while (ShowHideObject.GainOwnershipCount == 0)
367+
{
368+
yield return new WaitForSeconds(0.0f);
369+
}
370+
371+
// change the value
372+
m_NetSpawnedObject1.GetComponent<ShowHideObject>().MyOwnerReadNetworkVariable.Value++;
373+
374+
// wait for three ticks
375+
yield return NetcodeIntegrationTestHelpers.WaitForTicks(m_ServerNetworkManager, 3);
376+
377+
// check we'll actually be changing owners
378+
Assert.False(ShowHideObject.ClientTargetedNetworkObjects[0].OwnerClientId == m_ClientNetworkManagers[0].LocalClientId);
379+
380+
// only check for value change on one specific client
381+
ShowHideObject.NetworkManagerOfInterest = m_ClientNetworkManagers[0];
382+
383+
// change ownership
384+
m_NetSpawnedObject1.ChangeOwnership(m_ClientNetworkManagers[0].LocalClientId);
385+
386+
// wait three ticks
387+
yield return NetcodeIntegrationTestHelpers.WaitForTicks(m_ServerNetworkManager, 3);
388+
yield return NetcodeIntegrationTestHelpers.WaitForTicks(m_ClientNetworkManagers[0], 3);
389+
390+
// verify ownership changed
391+
Assert.True(ShowHideObject.ClientTargetedNetworkObjects[0].OwnerClientId == m_ClientNetworkManagers[0].LocalClientId);
392+
393+
// verify the expected client got the OnValueChanged. (Only client 1 sets this value)
394+
Assert.True(ShowHideObject.ValueAfterOwnershipChange == 1);
395+
}
396+
331397
}
332398
}

0 commit comments

Comments
 (0)