OnPlayerDataUpdated is called twice for remote clients. I assume it's expected to only be called once.
We wait until OnPlayerRestored() has been called for every player before we press 'L' or do anything inside of OnPlayerDataUpdated.
World SDK 3.7.5
Local User "A":
PlayerData.SetBool("MY_TEST_KEY", false);
-> OnPlayerDataUpdated(A, MY_TEST_KEY)
Remote User "B":
-> OnPlayerDataUpdated(A, MY_TEST_KEY)
-> OnPlayerDataUpdated(A, MY_TEST_KEY)
Here's my code:
public override void OnPlayerDataUpdated(VRCPlayerApi player, PlayerData.Info[] infos)
{
Debug.Log("OnPlayerDataUpdated for playerID: " + player.playerId);
foreach (PlayerData.Info info in infos)
{
switch (info.State)
{
case PlayerData.State.Unchanged:
Debug.Log("key: " + info.Key + " Unchanged - " + player.playerId);
break;
case PlayerData.State.Added:
Debug.Log("key: " + info.Key + " Added - " + player.playerId);
break;
case PlayerData.State.Removed:
Debug.Log("key: " + info.Key + " Removed - " + player.playerId);
break;
case PlayerData.State.Changed:
Debug.Log("key: " + info.Key + " Changed - " + player.playerId);
break;
case PlayerData.State.Restored:
Debug.Log("key: " + info.Key + " RESTORED - Key will be skipped - " + player.playerId);
break;
}
}
}
private void Update()
{
if (Input.GetKeyDown(KeyCode.L) && Networking.LocalPlayer.isLocal)
{
PlayerData.SetBool("MY_TEST_KEY", false);
}
}

Photo Viewer

View photos in a modal