Network Ownership desyncs
tracked
Occala
Ownership can permanently desync between clients in an unexpected way
The included script can generate such a desync, please assign a TMP text field to view it, then join with 2 clients
---
Of note for anyone experiencing this, I've had some success mitigating it by overriding OnOwnershipRequest and returning true
public override bool OnOwnershipRequest(VRCPlayerApi requestingPlayer, VRCPlayerApi requestedOwner)
{ return true; }
Log In
Fax
tracked
Occala
It's been suggested that this issue is only reproduced reliably at low latency (~25ms in my case)
Z0NE
Thanks! The hack you suggested works to a degree and some values do sync but it seems very random which will and which won't, so while it does mitigate the problem a little, many random values and other things seem to fail to sync due to weird ownership behavior.
Z0NE
I noticed ownership issues as of today but things were working fine earlier in the week before the recent VRC patch. Many variables are no longer syncing because ownership is not being correctly taken. For example, I have a gameObject as part of a UI for my game. The person using it will eventually run this:
public void MultiPlayerLockout(bool state)
{
if (!Networking.IsOwner(gameObject))
{
Networking.SetOwner(Networking.LocalPlayer, gameObject);
}
multiLockout = state;
RequestSerialization();
}
multiLockout is an [UdonSynced] bool on a script with manual sync but only the person running this method sees it update. I ran this in Update on the script to see who owns the gameObject:
testCube.SetActive(Networking.IsOwner(gameObject));
And as soon as one user (Master or otherwise) tries to run MultiPlayerLockout, the testCube gameObject appears on everyone's screen.
Here is a movie of it happening (the upside-down 'GO' in the center is the testCube GameObject and the bool is supposed to be synced when the one player selects 'MultiPlayer' on the menu. You can see that as soon as they select it and run that method, everyone thinks they now own the GameObject with the script on it as the cube appears for everyone, thus the bool is not synced)
Only one user is trying to take ownership and this also happens on multiple other random scripts that do very simple things. For example, here is a method that is in a script on a gameobject that is run by 1 user when they try to reserve a car to use in the world. It will no longer sync for anyone but it is very simple:
public void Occupied(bool state)
{
if (!Networking.IsOwner(gameObject))
{
Networking.SetOwner(localPlayer, gameObject);
}
occupied = state;
RequestSerialization();
}
I have gone back and used very old versions of my world to see if maybe I just changed something weird but those are also now broken. I did not notice this prior to the recent VRC patch (2025.2.1, build 1626_
BoatFloater
I noticed this behavior as early as 04/12, either on live or open-beta.