@@ -1171,7 +1171,14 @@ private bool InternalHasAuthority()
11711171 /// <summary>
11721172 /// Gets if the object is owned by the local player or if the object is the local player object
11731173 /// </summary>
1174- public bool IsOwner => NetworkManager != null && OwnerClientId == NetworkManager . LocalClientId ;
1174+ public bool IsOwner
1175+ {
1176+ get
1177+ {
1178+ Debug . Log ( $ "[Client-{ NetworkManager . LocalClientId } ][Object-{ NetworkObjectId } ] Owned by { OwnerClientId } ") ;
1179+ return NetworkManager != null && OwnerClientId == NetworkManager . LocalClientId ;
1180+ }
1181+ }
11751182
11761183 /// <summary>
11771184 /// Gets Whether or not the object is owned by anyone
@@ -2222,6 +2229,7 @@ public bool TrySetParent(NetworkObject parent, bool worldPositionStays = true)
22222229 // If we are shutting down and don't have authority then allow it.
22232230 if ( ! isAuthority && ! NetworkManager . ShutdownInProgress )
22242231 {
2232+ Debug . LogError ( "We don't have authority here" ) ;
22252233 return false ;
22262234 }
22272235
@@ -2285,6 +2293,7 @@ private void OnTransformParentChanged()
22852293 // With distributed authority, we need to track "valid authoritative" parenting changes.
22862294 // So, either the authority or AuthorityAppliedParenting is considered a "valid parenting change".
22872295 isAuthority = HasAuthority || AuthorityAppliedParenting || ( AllowOwnerToParent && IsOwner ) ;
2296+ Debug . Log ( $ "[Client-{ NetworkManager . LocalClientId } ][Object-{ NetworkObjectId } ] OnTransformParentChanged. HasAuthority={ HasAuthority } , AuthorityAppliedParenting={ AuthorityAppliedParenting } , AllowOwnerToParent && IsOwner={ AllowOwnerToParent && IsOwner } ") ;
22882297 var distributedAuthority = NetworkManager . DistributedAuthorityMode ;
22892298
22902299 // If we do not have authority and we are spawned
@@ -2355,6 +2364,8 @@ private void OnTransformParentChanged()
23552364 var authorityApplied = AuthorityAppliedParenting ;
23562365 ApplyNetworkParenting ( removeParent ) ;
23572366
2367+
2368+
23582369 var message = new ParentSyncMessage
23592370 {
23602371 NetworkObjectId = NetworkObjectId ,
@@ -2376,47 +2387,29 @@ private void OnTransformParentChanged()
23762387 m_CachedWorldPositionStays = true ;
23772388 }
23782389
2379- // If we are connected to a CMB service or we are running a mock CMB service then send to the "server" identifier
2380- if ( distributedAuthority || ( ! distributedAuthority && AllowOwnerToParent && IsOwner && ! NetworkManager . IsServer ) )
2390+ // If we're not the server, we should tell the server about this parent change
2391+ if ( ! NetworkManager . IsServer )
23812392 {
2382- if ( ! NetworkManager . DAHost )
2393+ // Don't send a message in DA mode if we're the only observers of this object (we're the only authority).
2394+ if ( distributedAuthority && Observers . Count <= 1 )
23832395 {
2384- NetworkManager . ConnectionManager . SendMessage ( ref message , MessageDeliveryType < ParentSyncMessage > . DefaultDelivery , 0 ) ;
23852396 return ;
23862397 }
2387- else
2388- {
2389- foreach ( var clientId in NetworkManager . ConnectionManager . ConnectedClientIds )
2390- {
2391- if ( clientId == NetworkManager . ServerClientId )
2392- {
2393- continue ;
2394- }
2395- NetworkManager . ConnectionManager . SendMessage ( ref message , MessageDeliveryType < ParentSyncMessage > . DefaultDelivery , clientId ) ;
2396- }
2397- }
2398+
2399+ NetworkManager . ConnectionManager . SendMessage ( ref message , MessageDeliveryType < ParentSyncMessage > . DefaultDelivery , NetworkManager . ServerClientId ) ;
2400+ return ;
23982401 }
2399- else
2402+
2403+ // Otherwise we are a Server (client-server or DAHost). Send to all observers
2404+ foreach ( var clientId in NetworkManager . ConnectionManager . ConnectedClientIds )
24002405 {
2401- // Otherwise we are running in client-server =or= this has to be a DAHost instance.
2402- // Send to all connected clients.
2403- unsafe
2406+ if ( clientId == NetworkManager . ServerClientId )
24042407 {
2405- var maxCount = NetworkManager . ConnectedClientsIds . Count ;
2406- ulong * clientIds = stackalloc ulong [ maxCount ] ;
2407- int idx = 0 ;
2408- foreach ( var clientId in NetworkManager . ConnectionManager . ConnectedClientIds )
2409- {
2410- if ( clientId == NetworkManager . ServerClientId )
2411- {
2412- continue ;
2413- }
2414- if ( Observers . Contains ( clientId ) )
2415- {
2416- clientIds [ idx ++ ] = clientId ;
2417- }
2418- }
2419- NetworkManager . ConnectionManager . SendMessage ( ref message , MessageDeliveryType < ParentSyncMessage > . DefaultDelivery , clientIds , idx ) ;
2408+ continue ;
2409+ }
2410+ if ( Observers . Contains ( clientId ) )
2411+ {
2412+ NetworkManager . ConnectionManager . SendMessage ( ref message , MessageDeliveryType < ParentSyncMessage > . DefaultDelivery , clientId ) ;
24202413 }
24212414 }
24222415 }
0 commit comments