private void OnStateChange(NetworkState newState, bool force = false, NetworkStateChanges changes = NetworkStateChanges.All)
    {
        if (myId == newState.MessageId && !force)
        {
            return;
        }

        localState.Merge(newState, changes);
        if (!isServer)  // everybody keeps a local copy of the server state in case they become the server
        {
            serverState = localState;
        }

        if (changes.HasFlag(NetworkStateChanges.Scale))
        {
            MasterController.Instance.DoSetStageScale(localState.StageScale);
        }
        if (changes.HasFlag(NetworkStateChanges.Offset))
        {
            MasterController.Instance.DoSetVerticalOffset(localState.StageOffset);
        }
        if (changes.HasFlag(NetworkStateChanges.Rotation))
        {
            MasterController.Instance.DoSetStageRotation(localState.StageRotation);
        }
        if (changes.HasFlag(NetworkStateChanges.Explode))
        {
            MasterController.Instance.DoSetExplode(localState.Explode);
        }
        if (changes.HasFlag(NetworkStateChanges.Asset))
        {
            MasterController.Instance.DoLoadBundle(localState.AssetInfo);
        }
    }
    void OnSetStateRequestMessage(NetworkMessage netMsg)
    {
        var message = netMsg.ReadMessage <NetworkStateMessage>();

        NetworkServer.SendToAll(SetStateResponseMsg, message);
        serverState.Merge(message.State, message.StatesChanged);
        if (!BypassNetwork)
        {
            OnStateChange(message.State, true, message.StatesChanged);
        }
    }