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;
}
///