diff --git a/osu.Game/Online/Multiplayer/IMultiplayerRoomServer.cs b/osu.Game/Online/Multiplayer/IMultiplayerRoomServer.cs
index 73fda78d00..200539def7 100644
--- a/osu.Game/Online/Multiplayer/IMultiplayerRoomServer.cs
+++ b/osu.Game/Online/Multiplayer/IMultiplayerRoomServer.cs
@@ -77,6 +77,11 @@ namespace osu.Game.Online.Multiplayer
/// If an attempt to start the game occurs when the game's (or users') state disallows it.
Task StartMatch();
+ ///
+ /// Aborts an ongoing gameplay load.
+ ///
+ Task AbortLoad();
+
///
/// Adds an item to the playlist.
///
diff --git a/osu.Game/Online/Multiplayer/MultiplayerClient.cs b/osu.Game/Online/Multiplayer/MultiplayerClient.cs
index 55b4def908..78d8362170 100644
--- a/osu.Game/Online/Multiplayer/MultiplayerClient.cs
+++ b/osu.Game/Online/Multiplayer/MultiplayerClient.cs
@@ -333,6 +333,8 @@ namespace osu.Game.Online.Multiplayer
public abstract Task StartMatch();
+ public abstract Task AbortLoad();
+
public abstract Task AddPlaylistItem(MultiplayerPlaylistItem item);
public abstract Task EditPlaylistItem(MultiplayerPlaylistItem item);
diff --git a/osu.Game/Online/Multiplayer/OnlineMultiplayerClient.cs b/osu.Game/Online/Multiplayer/OnlineMultiplayerClient.cs
index d268d2bf69..3062cf8b99 100644
--- a/osu.Game/Online/Multiplayer/OnlineMultiplayerClient.cs
+++ b/osu.Game/Online/Multiplayer/OnlineMultiplayerClient.cs
@@ -154,6 +154,14 @@ namespace osu.Game.Online.Multiplayer
return connection.InvokeAsync(nameof(IMultiplayerServer.StartMatch));
}
+ public override Task AbortLoad()
+ {
+ if (!IsConnected.Value)
+ return Task.CompletedTask;
+
+ return connection.InvokeAsync(nameof(IMultiplayerServer.AbortLoad));
+ }
+
public override Task AddPlaylistItem(MultiplayerPlaylistItem item)
{
if (!IsConnected.Value)
diff --git a/osu.Game/Screens/OnlinePlay/Multiplayer/Multiplayer.cs b/osu.Game/Screens/OnlinePlay/Multiplayer/Multiplayer.cs
index 58b5b7bbeb..c299fd285a 100644
--- a/osu.Game/Screens/OnlinePlay/Multiplayer/Multiplayer.cs
+++ b/osu.Game/Screens/OnlinePlay/Multiplayer/Multiplayer.cs
@@ -1,6 +1,7 @@
// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
+using System.Diagnostics;
using osu.Framework.Allocation;
using osu.Framework.Screens;
using osu.Game.Online.Multiplayer;
@@ -18,8 +19,24 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer
{
base.OnResuming(last);
- if (client.Room != null && client.LocalUser?.State != MultiplayerUserState.Spectating)
- client.ChangeState(MultiplayerUserState.Idle);
+ if (client.Room == null)
+ return;
+
+ Debug.Assert(client.LocalUser != null);
+
+ switch (client.LocalUser.State)
+ {
+ case MultiplayerUserState.Spectating:
+ break;
+
+ case MultiplayerUserState.WaitingForLoad:
+ client.AbortLoad();
+ break;
+
+ default:
+ client.ChangeState(MultiplayerUserState.Idle);
+ break;
+ }
}
protected override string ScreenTitle => "Multiplayer";
diff --git a/osu.Game/Tests/Visual/Multiplayer/TestMultiplayerClient.cs b/osu.Game/Tests/Visual/Multiplayer/TestMultiplayerClient.cs
index d22f0415e6..c928cfd137 100644
--- a/osu.Game/Tests/Visual/Multiplayer/TestMultiplayerClient.cs
+++ b/osu.Game/Tests/Visual/Multiplayer/TestMultiplayerClient.cs
@@ -242,6 +242,11 @@ namespace osu.Game.Tests.Visual.Multiplayer
public override Task ChangeState(MultiplayerUserState newState)
{
+ Debug.Assert(Room != null);
+
+ if (newState == MultiplayerUserState.Idle && LocalUser?.State == MultiplayerUserState.WaitingForLoad)
+ return Task.CompletedTask;
+
ChangeUserState(api.LocalUser.Value.Id, newState);
return Task.CompletedTask;
}
@@ -303,6 +308,16 @@ namespace osu.Game.Tests.Visual.Multiplayer
return ((IMultiplayerClient)this).LoadRequested();
}
+ public override Task AbortLoad()
+ {
+ Debug.Assert(Room != null);
+ Debug.Assert(LocalUser != null);
+
+ ChangeUserState(LocalUser.UserID, MultiplayerUserState.Idle);
+
+ return Task.CompletedTask;
+ }
+
public async Task AddUserPlaylistItem(int userId, MultiplayerPlaylistItem item)
{
Debug.Assert(Room != null);