Skip to content

Commit 3ce47d2

Browse files
committed
Ensure all clients can re-parent objects in DA mode
1 parent 2f5591f commit 3ce47d2

File tree

1 file changed

+10
-8
lines changed

1 file changed

+10
-8
lines changed

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

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1622,13 +1622,11 @@ internal void OnDespawnObject(NetworkObject networkObject, bool destroyGameObjec
16221622
}
16231623

16241624
var distributedAuthority = NetworkManager.DistributedAuthorityMode;
1625-
var hasDAAuthority = distributedAuthority && (networkObject.HasAuthority || (NetworkManager.DAHost && authorityOverride));
1626-
var hasClientServerAuthority = !distributedAuthority && NetworkManager.IsServer;
1627-
var hasAuthority = hasDAAuthority || hasClientServerAuthority;
16281625

16291626
// If we are shutting down the NetworkManager, then ignore resetting the parent
1630-
// and only attempt to remove the child's parent on the server-side
1631-
if (!NetworkManager.ShutdownInProgress && hasAuthority)
1627+
// Remove the child's parent server-side or in distributedAuthorityMode
1628+
// DistributedAuthorityMode: All clients need to remove the parent locally due to mixed-authority hierarchies and race-conditions
1629+
if (!NetworkManager.ShutdownInProgress && (NetworkManager.IsServer || distributedAuthority))
16321630
{
16331631
if (destroyGameObject && networkObject.IsSceneObject == true && !NetworkManager.SceneManager.IsSceneUnloading(networkObject))
16341632
{
@@ -1654,7 +1652,7 @@ internal void OnDespawnObject(NetworkObject networkObject, bool destroyGameObjec
16541652
}
16551653
// For mixed authority hierarchies, if the parent is despawned then any removal of children
16561654
// is considered "authority approved". Set the AuthorityAppliedParenting flag.
1657-
spawnedNetObj.AuthorityAppliedParenting = authorityOverride;
1655+
spawnedNetObj.AuthorityAppliedParenting = distributedAuthority && !networkObject.HasAuthority;
16581656

16591657
// Try to remove the parent using the cached WorldPositionStays value
16601658
// Note: WorldPositionStays will still default to true if this was an
@@ -1677,7 +1675,12 @@ internal void OnDespawnObject(NetworkObject networkObject, bool destroyGameObjec
16771675

16781676
networkObject.InvokeBehaviourNetworkDespawn();
16791677

1680-
if (!NetworkManager.ShutdownInProgress && hasAuthority)
1678+
// Whether we are in distributedAuthority mode and have authority on this object
1679+
var hasDAAuthority = distributedAuthority && (networkObject.HasAuthority || (NetworkManager.DAHost && authorityOverride));
1680+
1681+
// Don't send messages if shutting down
1682+
// Otherwise send messages if we are the authority (either the server, or the DA mode authority of this object).
1683+
if (!NetworkManager.ShutdownInProgress && (hasDAAuthority || (!distributedAuthority && NetworkManager.IsServer)))
16811684
{
16821685
if (NetworkManager.NetworkConfig.RecycleNetworkIds)
16831686
{
@@ -1692,7 +1695,6 @@ internal void OnDespawnObject(NetworkObject networkObject, bool destroyGameObjec
16921695
/*
16931696
* Configure message targets
16941697
*/
1695-
16961698
// If we are using distributed authority and are not the DAHost, send a message to the Server (CMBService or DAHost)
16971699
if (hasDAAuthority && !NetworkManager.DAHost)
16981700
{

0 commit comments

Comments
 (0)