mirror of
https://github.com/ppy/osu.git
synced 2024-12-15 09:42:54 +08:00
Merge pull request #18423 from smoogipoo/fix-multiplayer-race
Fix multiplayer race condition when starting gameplay
This commit is contained in:
commit
0d760e707e
@ -149,9 +149,16 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer
|
||||
|
||||
protected override void StartGameplay()
|
||||
{
|
||||
// We can enter this screen one of two ways:
|
||||
// 1. Via the automatic natural progression of PlayerLoader into Player.
|
||||
// We'll arrive here in a Loaded state, and we need to let the server know that we're ready to start.
|
||||
// 2. Via the server forcefully starting gameplay because players have been hanging out in PlayerLoader for too long.
|
||||
// We'll arrive here in a Playing state, and we should neither show the loading spinner nor tell the server that we're ready to start (gameplay has already started).
|
||||
//
|
||||
// The base call is blocked here because in both cases gameplay is started only when the server says so via onGameplayStarted().
|
||||
|
||||
if (client.LocalUser?.State == MultiplayerUserState.Loaded)
|
||||
{
|
||||
// block base call, but let the server know we are ready to start.
|
||||
loadingDisplay.Show();
|
||||
client.ChangeState(MultiplayerUserState.ReadyForGameplay);
|
||||
}
|
||||
|
@ -26,8 +26,13 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer
|
||||
}
|
||||
|
||||
protected override bool ReadyForGameplay =>
|
||||
base.ReadyForGameplay
|
||||
// The server is forcefully starting gameplay.
|
||||
(
|
||||
// The user is ready to enter gameplay.
|
||||
base.ReadyForGameplay
|
||||
// And the server has received the message that we're loaded.
|
||||
&& multiplayerClient.LocalUser?.State == MultiplayerUserState.Loaded
|
||||
)
|
||||
// Or the server is forcefully starting gameplay.
|
||||
|| multiplayerClient.LocalUser?.State == MultiplayerUserState.Playing;
|
||||
|
||||
protected override void OnPlayerLoaded()
|
||||
|
Loading…
Reference in New Issue
Block a user