public override void Deserialize(NetworkReader reader)
        {
            StatesChanged = (NetworkStateChanges)reader.ReadInt16();

            State           = new NetworkState();
            State.MessageId = reader.ReadInt32();
            if (StatesChanged.HasFlag(NetworkStateChanges.Scale))
            {
                State.StageScale = reader.ReadSingle();
            }
            if (StatesChanged.HasFlag(NetworkStateChanges.Offset))
            {
                State.StageOffset = reader.ReadSingle();
            }
            if (StatesChanged.HasFlag(NetworkStateChanges.Explode))
            {
                State.Explode = reader.ReadBoolean();
            }
            if (StatesChanged.HasFlag(NetworkStateChanges.Rotation))
            {
                State.StageRotation = reader.ReadSingle();
            }
            if (StatesChanged.HasFlag(NetworkStateChanges.Asset))
            {
                State.AssetInfo = AssetInfo.Deserialize(reader);
            }
        }
    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);
        }
    }
    private void SendStateToServer(NetworkState state, NetworkStateChanges changes = NetworkStateChanges.All)
    {
        state.MessageId = myId;

        if (BypassNetwork || NetworkManager.singleton == null || NetworkManager.singleton.client == null)
        {
            OnStateChange(state, true, changes);
        }
        else
        {
            NetworkManager.singleton.client.Send(SetStateRequestMsg, new NetworkStateMessage(state, changes));

            if (!isServer)
            {
                OnStateChange(state, true, changes);
            }
        }
    }
 public void Merge(NetworkState other, NetworkStateChanges changes)
 {
     MessageId = other.MessageId;
     if (changes.HasFlag(NetworkStateChanges.Scale))
     {
         StageScale = other.StageScale;
     }
     if (changes.HasFlag(NetworkStateChanges.Offset))
     {
         StageOffset = other.StageOffset;
     }
     if (changes.HasFlag(NetworkStateChanges.Rotation))
     {
         StageRotation = other.StageRotation;
     }
     if (changes.HasFlag(NetworkStateChanges.Explode))
     {
         Explode = other.Explode;
     }
     if (changes.HasFlag(NetworkStateChanges.Asset))
     {
         AssetInfo = other.AssetInfo;
     }
 }
 public NetworkStateMessage(NetworkState state, NetworkStateChanges changes = NetworkStateChanges.All)
 {
     State         = state;
     StatesChanged = changes;
 }