You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Problem:
When calling ServerManager.StopConnection(true) in host mode, SyncVar values are
reset to their initial values BEFORE OnStopServer executes on server-side.
This causes any cleanup logic in OnStopServer that reads SyncVars to get null/default values.
Proposed fix:
One-line change in SyncBase.CanReset() — skip client-side reset when
OnStartServerCalled is still true (server hasn't run OnStopServer yet).
File to modify: Assets/FishNet/Runtime/Object/Synchronizing/SyncBase.cs
protected bool CanReset(bool asServer)
{
bool clientStarted = IsNetworkInitialized && NetworkManager.IsClientStarted;
- return (asServer && !clientStarted) || (!asServer && NetworkBehaviour.IsDeinitializing); //remove
+
+ if (asServer)
+ return !clientStarted;
+
+ // Skip client-side reset if the server's OnStopServer hasn't been called yet.
+ // The server-side Deinitialize will handle the reset after OnStopServer completes.
+ if (NetworkBehaviour.OnStartServerCalled)
+ return false;
+
+ return NetworkBehaviour.IsDeinitializing;
}
Note
Kindly provided by YefersonCC 🙏
Version: 4.7.2R
Mode: Host (Server + Client on same instance)
Discord URL: https://discord.com/channels/424284635074134018/923983677980045382/1497131094003290173
Problem:
When calling ServerManager.StopConnection(true) in host mode, SyncVar values are
reset to their initial values BEFORE OnStopServer executes on server-side.
This causes any cleanup logic in OnStopServer that reads SyncVars to get null/default values.
Root cause:
In ServerManager.Transport_OnServerConnectionState:
Started = false (IsServerStarted becomes false)
ClientManager.Objects.OnServerConnectionState(args) → triggers client-side teardown
→ DespawnWithoutSynchronization(asServer: false) → Deinitialize(false)
→ IsDeinitializing = true (because !IsServerStarted)
→ ResetState_SyncTypes(false) → CanReset(false) = true → SyncVars reset here
Objects.DespawnWithoutSynchronization(asServer: true) → server-side teardown
→ OnStopServer() → SyncVars are already null/default
Proposed fix:
One-line change in SyncBase.CanReset() — skip client-side reset when
OnStartServerCalled is still true (server hasn't run OnStopServer yet).
File to modify:
Assets/FishNet/Runtime/Object/Synchronizing/SyncBase.cs