void IPunObservable.OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info) { #if USE_PUN if (stream.isWriting) { stream.SendNext(inPlayMode); stream.SendColor(currentTint); bool toolActive = locallyActiveTool != null; stream.SendNext(toolActive); if (toolActive) { stream.SendNext(locallyActiveTool.GetToolEffectName()); stream.SendNext(locallyActiveTool.GetToolEffectActive()); stream.SendNext(locallyActiveTool.GetToolEffectTargetViewId()); stream.SendNext(locallyActiveTool.GetToolEffectTargetPosition()); stream.SendNext(locallyActiveTool.GetCreatePreviewSettingsJson()); } stream.SendNext(playAvatarRendererEnabled); } else { if (!setupCalled) { Setup(false); } SetInPlayMode((bool)stream.ReceiveNext()); SetTint(stream.ReceiveColor()); if ((bool)stream.ReceiveNext()) { // Tool is active. SetToolEffectName((string)stream.ReceiveNext()); bool isActive = (bool)stream.ReceiveNext(); // IMPORTANT keep a local var, since the ?. may not call receive toolEffectReplicant?.SetActive(isActive); receivedToolTargetViewId = (int)stream.ReceiveNext(); lastReceivedTargetPos = (Vector3)stream.ReceiveNext(); // IMPORTANT keep a local var, since the ?. may not call receive SetCreatePreviewSettingsJson((string)stream.ReceiveNext()); } else { DestroyToolEffectReplicant(); SetCreatePreviewSettingsJson(null); lerpedTargetPos = Vector3.positiveInfinity; lastReceivedTargetPos = Vector3.positiveInfinity; } // "Render enabled" field not present in earlier versions, defaults to true: SetPlayerVisible((bool)stream.ReceiveNext()); } #endif }