diff --git a/osu.Game/Online/RealtimeMultiplayer/StatefulMultiplayerClient.cs b/osu.Game/Online/RealtimeMultiplayer/StatefulMultiplayerClient.cs
index 60960f4929..b846d6732f 100644
--- a/osu.Game/Online/RealtimeMultiplayer/StatefulMultiplayerClient.cs
+++ b/osu.Game/Online/RealtimeMultiplayer/StatefulMultiplayerClient.cs
@@ -77,7 +77,9 @@ namespace osu.Game.Online.RealtimeMultiplayer
/// The API .
public async Task JoinRoom(Room room)
{
- Debug.Assert(Room == null);
+ if (Room != null)
+ throw new InvalidOperationException("Cannot join a multiplayer room while already in one.");
+
Debug.Assert(room.RoomID.Value != null);
apiRoom = room;
@@ -166,6 +168,9 @@ namespace osu.Game.Online.RealtimeMultiplayer
Task IMultiplayerClient.RoomStateChanged(MultiplayerRoomState state)
{
+ if (Room == null)
+ return Task.CompletedTask;
+
Schedule(() =>
{
if (Room == null)
@@ -198,6 +203,9 @@ namespace osu.Game.Online.RealtimeMultiplayer
async Task IMultiplayerClient.UserJoined(MultiplayerRoomUser user)
{
+ if (Room == null)
+ return;
+
await PopulateUser(user);
Schedule(() =>
@@ -213,6 +221,9 @@ namespace osu.Game.Online.RealtimeMultiplayer
Task IMultiplayerClient.UserLeft(MultiplayerRoomUser user)
{
+ if (Room == null)
+ return Task.CompletedTask;
+
Schedule(() =>
{
if (Room == null)
@@ -229,6 +240,9 @@ namespace osu.Game.Online.RealtimeMultiplayer
Task IMultiplayerClient.HostChanged(int userId)
{
+ if (Room == null)
+ return Task.CompletedTask;
+
Schedule(() =>
{
if (Room == null)
@@ -255,6 +269,9 @@ namespace osu.Game.Online.RealtimeMultiplayer
Task IMultiplayerClient.UserStateChanged(int userId, MultiplayerUserState state)
{
+ if (Room == null)
+ return Task.CompletedTask;
+
Schedule(() =>
{
if (Room == null)
@@ -273,6 +290,9 @@ namespace osu.Game.Online.RealtimeMultiplayer
Task IMultiplayerClient.LoadRequested()
{
+ if (Room == null)
+ return Task.CompletedTask;
+
Schedule(() =>
{
if (Room == null)
@@ -286,7 +306,9 @@ namespace osu.Game.Online.RealtimeMultiplayer
Task IMultiplayerClient.MatchStarted()
{
- Debug.Assert(Room != null);
+ if (Room == null)
+ return Task.CompletedTask;
+
var players = Room.Users.Where(u => u.State == MultiplayerUserState.Playing).Select(u => u.UserID).ToList();
Schedule(() =>
@@ -304,6 +326,9 @@ namespace osu.Game.Online.RealtimeMultiplayer
Task IMultiplayerClient.ResultsReady()
{
+ if (Room == null)
+ return Task.CompletedTask;
+
Schedule(() =>
{
if (Room == null)
diff --git a/osu.Game/Screens/Multi/RealtimeMultiplayer/RealtimeRoomManager.cs b/osu.Game/Screens/Multi/RealtimeMultiplayer/RealtimeRoomManager.cs
index 4f73ee3865..d2a03da714 100644
--- a/osu.Game/Screens/Multi/RealtimeMultiplayer/RealtimeRoomManager.cs
+++ b/osu.Game/Screens/Multi/RealtimeMultiplayer/RealtimeRoomManager.cs
@@ -49,7 +49,7 @@ namespace osu.Game.Screens.Multi.RealtimeMultiplayer
var joinedRoom = JoinedRoom;
base.PartRoom();
- multiplayerClient.LeaveRoom().Wait();
+ multiplayerClient.LeaveRoom();
// Todo: This is not the way to do this. Basically when we're the only participant and the room closes, there's no way to know if this is actually the case.
RemoveRoom(joinedRoom);