diff --git a/Assets/FishNet/Runtime/Object/NetworkObject/NetworkObject.QOL.cs b/Assets/FishNet/Runtime/Object/NetworkObject/NetworkObject.QOL.cs index e6749bc2..26c7a625 100644 --- a/Assets/FishNet/Runtime/Object/NetworkObject/NetworkObject.QOL.cs +++ b/Assets/FishNet/Runtime/Object/NetworkObject/NetworkObject.QOL.cs @@ -227,6 +227,9 @@ public bool IsOwner /// private NetworkConnection _owner; /// + /// + private NetworkConnection _hostCachedOwner; + /// /// Owner of this object. /// public NetworkConnection Owner @@ -241,6 +244,22 @@ public NetworkConnection Owner } private set { _owner = value; } } + + /// + /// Host value of Owner of this object. + /// + private NetworkConnection HostCachedOwner + { + get + { + // Ensures a null Owner is never returned. + if (_hostCachedOwner == null) + return NetworkManager.EmptyConnection; + + return _hostCachedOwner; + } + set { _hostCachedOwner = value; } + } /// /// ClientId for this NetworkObject owner. /// @@ -372,7 +391,7 @@ public void Spawn(NetworkObject nob, NetworkConnection ownerConnection = null, U public void SetLocalOwnership(NetworkConnection caller, bool recursive) { NetworkConnection prevOwner = Owner; - SetOwner(caller); + SetOwner(caller, false); int count; count = NetworkBehaviours.Count; diff --git a/Assets/FishNet/Runtime/Object/NetworkObject/NetworkObject.cs b/Assets/FishNet/Runtime/Object/NetworkObject/NetworkObject.cs index 28d78af2..48dfd5f1 100644 --- a/Assets/FishNet/Runtime/Object/NetworkObject/NetworkObject.cs +++ b/Assets/FishNet/Runtime/Object/NetworkObject/NetworkObject.cs @@ -643,7 +643,8 @@ internal void InitializeEarly(NetworkManager networkManager, int objectId, Netwo PredictionManager = networkManager.PredictionManager; RollbackManager = networkManager.RollbackManager; - SetOwner(owner); + SetOwner(owner, true); + SetOwner(owner, false); if (ObjectId != UNSET_OBJECTID_VALUE) NetworkManager.LogError($"Object was initialized twice without being reset. Object {ToString()}"); @@ -1145,7 +1146,7 @@ public void ResetState(bool asServer) // if (IsNested) // gameObject.SetActive(WasActiveDuringEdit); // - SetOwner(NetworkManager.EmptyConnection); + SetOwner(NetworkManager.EmptyConnection, asServer); if (NetworkObserver != null) NetworkObserver.Deinitialize(false); @@ -1200,7 +1201,7 @@ internal void GiveOwnership(NetworkConnection newOwner, bool asServer, bool recu } // If the same owner don't bother sending a message, just ignore request. - if (newOwner == Owner) + if (newOwner == GetOwner(asServer)) return; if (newOwner != null && newOwner.IsActive && !newOwner.LoadedStartScenes(true)) @@ -1212,11 +1213,11 @@ internal void GiveOwnership(NetworkConnection newOwner, bool asServer, bool recu bool activeNewOwner = newOwner != null && newOwner.IsActive; // Set prevOwner, disallowing null. - NetworkConnection prevOwner = Owner; + NetworkConnection prevOwner = GetOwner(asServer); if (prevOwner == null) prevOwner = NetworkManager.EmptyConnection; - SetOwner(newOwner); + SetOwner(newOwner, asServer); /* Only modify objects if asServer or not * host. When host, server would * have already modified objects @@ -1296,9 +1297,23 @@ internal void InitializePredictedObject_Client(NetworkManager manager, int objec /// /// /// - private void SetOwner(NetworkConnection owner) + private void SetOwner(NetworkConnection owner, bool asServer) { - Owner = owner; + if (!asServer && IsServerStarted) + HostCachedOwner = owner; + else Owner = owner; + } + + /// + /// Gets the owner of this object. + /// + /// + /// + private NetworkConnection GetOwner(bool asServer) + { + if (!asServer && IsServerStarted) + return HostCachedOwner; + return Owner; } ///