Ejemplo n.º 1
0
        Task IMultiplayerClient.UserStateChanged(int userId, MultiplayerUserState state)
        {
            if (Room == null)
            {
                return(Task.CompletedTask);
            }

            Schedule(() =>
            {
                if (Room == null)
                {
                    return;
                }

                Room.Users.Single(u => u.UserID == userId).State = state;

                if (state != MultiplayerUserState.Playing)
                {
                    PlayingUsers.Remove(userId);
                }

                RoomChanged?.Invoke();
            });

            return(Task.CompletedTask);
        }
Ejemplo n.º 2
0
        private void updateLocalRoomSettings(MultiplayerRoomSettings settings)
        {
            if (Room == null)
            {
                return;
            }

            Schedule(() =>
            {
                if (Room == null)
                {
                    return;
                }

                Debug.Assert(apiRoom != null);

                // Update a few properties of the room instantaneously.
                Room.Settings      = settings;
                apiRoom.Name.Value = Room.Settings.Name;

                // The playlist update is delayed until an online beatmap lookup (below) succeeds.
                // In-order for the client to not display an outdated beatmap, the playlist is forcefully cleared here.
                apiRoom.Playlist.Clear();

                RoomChanged?.Invoke();

                var req      = new GetBeatmapSetRequest(settings.BeatmapID, BeatmapSetLookupType.BeatmapId);
                req.Success += res => updatePlaylist(settings, res);

                api.Queue(req);
            });
        }
Ejemplo n.º 3
0
        async Task IMultiplayerClient.UserJoined(MultiplayerRoomUser user)
        {
            if (Room == null)
            {
                return;
            }

            await PopulateUser(user);

            Schedule(() =>
            {
                if (Room == null)
                {
                    return;
                }

                // for sanity, ensure that there can be no duplicate users in the room user list.
                if (Room.Users.Any(existing => existing.UserID == user.UserID))
                {
                    return;
                }

                Room.Users.Add(user);

                RoomChanged?.Invoke();
            });
        }
Ejemplo n.º 4
0
        Task IMultiplayerClient.HostChanged(int userId)
        {
            if (Room == null)
            {
                return(Task.CompletedTask);
            }

            Schedule(() =>
            {
                if (Room == null)
                {
                    return;
                }

                Debug.Assert(apiRoom != null);

                var user = Room.Users.FirstOrDefault(u => u.UserID == userId);

                Room.Host          = user;
                apiRoom.Host.Value = user?.User;

                RoomChanged?.Invoke();
            });

            return(Task.CompletedTask);
        }
Ejemplo n.º 5
0
    private void SetupRoom()
    {
        _currentRoom = _controller.GetCurrentRoom();
        _roomID      = _controller._roomID;

        RoomChanged?.Invoke(this, EventArgs.Empty);

        RenderBackground(_currentRoom);
        AddTravelator?.Invoke(this, EventArgs.Empty);
        RenderExit(_currentRoom);
    }
Ejemplo n.º 6
0
    IEnumerator Start()
    {
        _controller = GetComponent <RoomController>();
        while (!_controller._isReady)
        {
            yield return(null);
        }

        RoomChanged?.Invoke(this, EventArgs.Empty);
        SetupRoom();
        _controller.RoomChanged += Room_Changed;
    }
Ejemplo n.º 7
0
        public virtual Task LeaveRoom()
        {
            if (Room == null)
            {
                return(Task.CompletedTask);
            }

            apiRoom = null;
            Room    = null;

            Schedule(() => RoomChanged?.Invoke());

            return(Task.CompletedTask);
        }
Ejemplo n.º 8
0
    /// <summary>
    /// Keep a weather eye on the room number. If it changes, notify
    /// subscribers.
    /// </summary>
    /// <returns></returns>
    IEnumerator Start()
    {
        var lastRoom = _roomID;

        while (true)
        {
            if (lastRoom != _roomID)
            {
                lastRoom = _roomID;
                RoomChanged?.Invoke(this, EventArgs.Empty);
            }

            yield return(null);
        }
    }
Ejemplo n.º 9
0
        private void ConnectToRoomButton_Click(object sender, RoutedEventArgs e)
        {
            if (_control.RoomSelector.SelectedIndex < 0)
            {
                return;
            }

            var dialog = new TextInputDialog();

            dialog.ShowDialog();
            RoomID = _tcpConnection.ConnectToRoom(
                _control.RoomSelector.SelectedItem as string,
                dialog.PasswordTextBox.Text);
            if (RoomID < 0)
            {
                return;
            }

            RoomChanged?.Invoke();
        }
Ejemplo n.º 10
0
        async Task IMultiplayerClient.UserJoined(MultiplayerRoomUser user)
        {
            if (Room == null)
            {
                return;
            }

            await PopulateUser(user);

            Schedule(() =>
            {
                if (Room == null)
                {
                    return;
                }

                Room.Users.Add(user);

                RoomChanged?.Invoke();
            });
        }
Ejemplo n.º 11
0
        Task IMultiplayerClient.UserLeft(MultiplayerRoomUser user)
        {
            if (Room == null)
            {
                return(Task.CompletedTask);
            }

            Schedule(() =>
            {
                if (Room == null)
                {
                    return;
                }

                Room.Users.Remove(user);
                PlayingUsers.Remove(user.UserID);

                RoomChanged?.Invoke();
            });

            return(Task.CompletedTask);
        }
Ejemplo n.º 12
0
        Task IMultiplayerClient.RoomStateChanged(MultiplayerRoomState state)
        {
            if (Room == null)
            {
                return(Task.CompletedTask);
            }

            Schedule(() =>
            {
                if (Room == null)
                {
                    return;
                }

                Debug.Assert(apiRoom != null);

                Room.State = state;

                switch (state)
                {
                case MultiplayerRoomState.Open:
                    apiRoom.Status.Value = new RoomStatusOpen();
                    break;

                case MultiplayerRoomState.Playing:
                    apiRoom.Status.Value = new RoomStatusPlaying();
                    break;

                case MultiplayerRoomState.Closed:
                    apiRoom.Status.Value = new RoomStatusEnded();
                    break;
                }

                RoomChanged?.Invoke();
            });

            return(Task.CompletedTask);
        }
Ejemplo n.º 13
0
        public override Result Execute(CommandID id, string command, string?parameters, Player player)
        {
            if (parameters != null)
            {
                return(Result.Error(GetTexts(TextID.CommandSyntax).ReplaceInAll("{command}", command)));
            }

            Direction?direction = CommandToDirection(id);

            if (direction == null)
            {
                return(Result.Error());
            }

            if (!player.CurrentRoom.Connections.ContainsKey(direction.Value))
            {
                return(Result.Failure(GetTexts(TextID.CantGoThere)));
            }

            Room fromRoom = player.CurrentRoom;
            Room toRoom   = player.CurrentRoom.Connections[direction.Value];

            var args = new RoomChangeRequestedEventArgs(fromRoom.ID, toRoom.ID);

            RoomChangeRequested?.Invoke(args);

            if (args.Cancel)
            {
                return(Result.Failure());
            }

            player.CurrentRoom = toRoom;

            RoomChanged?.Invoke(args);
            CheckPaperRoute(toRoom.ID);

            return(Result.Success());
        }
Ejemplo n.º 14
0
 public void RaiseRoomChanged(object sender, List <UserRoom> rooms)
 {
     RoomChanged?.Invoke(sender, rooms);
 }
Ejemplo n.º 15
0
 protected virtual void OnRoomChanged(string room)
 => RoomChanged?.Invoke(this, room);