Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 20 additions & 1 deletion Assets/FishNet/Runtime/Object/NetworkObject/NetworkObject.QOL.cs
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,9 @@ public bool IsOwner
/// </summary>
private NetworkConnection _owner;
/// <summary>
/// </summary>
private NetworkConnection _hostCachedOwner;
/// <summary>
/// Owner of this object.
/// </summary>
public NetworkConnection Owner
Expand All @@ -241,6 +244,22 @@ public NetworkConnection Owner
}
private set { _owner = value; }
}

/// <summary>
/// Host value of Owner of this object.
/// </summary>
private NetworkConnection HostCachedOwner
{
get
{
// Ensures a null Owner is never returned.
if (_hostCachedOwner == null)
return NetworkManager.EmptyConnection;

return _hostCachedOwner;
}
set { _hostCachedOwner = value; }
}
/// <summary>
/// ClientId for this NetworkObject owner.
/// </summary>
Expand Down Expand Up @@ -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;
Expand Down
29 changes: 22 additions & 7 deletions Assets/FishNet/Runtime/Object/NetworkObject/NetworkObject.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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()}");
Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -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))
Expand All @@ -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
Expand Down Expand Up @@ -1296,9 +1297,23 @@ internal void InitializePredictedObject_Client(NetworkManager manager, int objec
/// </summary>
/// <param name = "owner"></param>
/// <param name = "allowNull"></param>
private void SetOwner(NetworkConnection owner)
private void SetOwner(NetworkConnection owner, bool asServer)
{
Owner = owner;
if (!asServer && IsServerStarted)
HostCachedOwner = owner;
else Owner = owner;
}

/// <summary>
/// Gets the owner of this object.
/// </summary>
/// <param name = "owner"></param>
/// <param name = "allowNull"></param>
private NetworkConnection GetOwner(bool asServer)
{
if (!asServer && IsServerStarted)
return HostCachedOwner;
return Owner;
}

/// <summary>
Expand Down