1
0
mirror of https://github.com/ppy/osu.git synced 2025-03-05 16:43:04 +08:00

Enable spectating multiplayer matches

This commit is contained in:
smoogipoo 2021-04-09 21:03:45 +09:00
parent 3e46d6401e
commit 6eddc6c59e
3 changed files with 20 additions and 9 deletions

View File

@ -96,9 +96,6 @@ namespace osu.Game.Online.Multiplayer
if (!IsConnected.Value) if (!IsConnected.Value)
return Task.CompletedTask; return Task.CompletedTask;
if (newState == MultiplayerUserState.Spectating)
return Task.CompletedTask; // Not supported yet.
return connection.InvokeAsync(nameof(IMultiplayerServer.ChangeState), newState); return connection.InvokeAsync(nameof(IMultiplayerServer.ChangeState), newState);
} }

View File

@ -148,10 +148,12 @@ namespace osu.Game.Screens.OnlinePlay.Match
return base.OnExiting(next); return base.OnExiting(next);
} }
protected void StartPlay(Func<Player> player) protected void StartPlay(Func<Player> player) => PushTopLevelScreen(() => new PlayerLoader(player));
protected void PushTopLevelScreen(Func<Screen> screen)
{ {
sampleStart?.Play(); sampleStart?.Play();
ParentScreen?.Push(new PlayerLoader(player)); ParentScreen?.Push(screen());
} }
private void selectedItemChanged() private void selectedItemChanged()

View File

@ -25,6 +25,7 @@ using osu.Game.Screens.OnlinePlay.Match;
using osu.Game.Screens.OnlinePlay.Match.Components; using osu.Game.Screens.OnlinePlay.Match.Components;
using osu.Game.Screens.OnlinePlay.Multiplayer.Match; using osu.Game.Screens.OnlinePlay.Multiplayer.Match;
using osu.Game.Screens.OnlinePlay.Multiplayer.Participants; using osu.Game.Screens.OnlinePlay.Multiplayer.Participants;
using osu.Game.Screens.OnlinePlay.Multiplayer.Spectate;
using osu.Game.Screens.Play.HUD; using osu.Game.Screens.Play.HUD;
using osu.Game.Users; using osu.Game.Users;
using osuTK; using osuTK;
@ -405,11 +406,22 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer
} }
} }
private void onRoomUpdated() private void onRoomUpdated() => Scheduler.Add(() =>
{ {
// user mods may have changed. if (client.Room == null)
Scheduler.AddOnce(UpdateMods); return;
}
Debug.Assert(client.LocalUser != null);
UpdateMods();
if (client.LocalUser.State == MultiplayerUserState.Spectating
&& (client.Room.State == MultiplayerRoomState.Playing || client.Room.State == MultiplayerRoomState.WaitingForLoad)
&& ParentScreen.IsCurrentScreen())
{
PushTopLevelScreen(() => new MultiplayerSpectator(client.CurrentMatchPlayingUserIds.ToArray()));
}
});
private void onLoadRequested() private void onLoadRequested()
{ {