1
0
mirror of https://github.com/ppy/osu.git synced 2024-09-22 16:47:24 +08:00

Centralise screen exit logic and guard against non-current screen

This commit is contained in:
Dean Herbert 2021-08-13 14:37:43 +09:00
parent 0414ae6afd
commit b9721f5261

View File

@ -274,7 +274,7 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer
isConnected.BindValueChanged(connected => isConnected.BindValueChanged(connected =>
{ {
if (!connected.NewValue) if (!connected.NewValue)
Schedule(this.Exit); handleRoomLost();
}, true); }, true);
currentRoom.BindValueChanged(room => currentRoom.BindValueChanged(room =>
@ -284,7 +284,7 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer
// the room has gone away. // the room has gone away.
// this could mean something happened during the join process, or an external connection issue occurred. // this could mean something happened during the join process, or an external connection issue occurred.
// one specific scenario is where the underlying room is created, but the signalr server returns an error during the join process. this triggers a PartRoom operation (see https://github.com/ppy/osu/blob/7654df94f6f37b8382be7dfcb4f674e03bd35427/osu.Game/Screens/OnlinePlay/Multiplayer/MultiplayerRoomManager.cs#L97) // one specific scenario is where the underlying room is created, but the signalr server returns an error during the join process. this triggers a PartRoom operation (see https://github.com/ppy/osu/blob/7654df94f6f37b8382be7dfcb4f674e03bd35427/osu.Game/Screens/OnlinePlay/Multiplayer/MultiplayerRoomManager.cs#L97)
Schedule(this.Exit); handleRoomLost();
} }
}, true); }, true);
} }
@ -451,13 +451,21 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer
// may happen if the client is kicked or otherwise removed from the room. // may happen if the client is kicked or otherwise removed from the room.
if (client.Room == null) if (client.Room == null)
{ {
Schedule(this.Exit); handleRoomLost();
return; return;
} }
Scheduler.AddOnce(UpdateMods); Scheduler.AddOnce(UpdateMods);
} }
private void handleRoomLost() => Schedule(() =>
{
if (this.IsCurrentScreen())
this.Exit();
else
ValidForResume = false;
});
private void onLoadRequested() private void onLoadRequested()
{ {
if (BeatmapAvailability.Value.State != DownloadState.LocallyAvailable) if (BeatmapAvailability.Value.State != DownloadState.LocallyAvailable)