1
0
mirror of https://github.com/ppy/osu.git synced 2025-02-13 15:03:13 +08:00

Fix starting gameplay too early after import

This commit is contained in:
Dan Balasescu 2021-12-11 22:47:08 +09:00
parent 6057037e35
commit 25b274c323
3 changed files with 46 additions and 23 deletions

View File

@ -391,9 +391,9 @@ namespace osu.Game.Tests.Visual.Multiplayer
} }
}); });
AddStep("set user ready", () => client.ChangeState(MultiplayerUserState.Ready)); pressReadyButton();
AddStep("delete beatmap", () => beatmaps.Delete(importedSet));
AddStep("delete beatmap", () => beatmaps.Delete(importedSet));
AddUntilStep("user state is idle", () => client.LocalUser?.State == MultiplayerUserState.Idle); AddUntilStep("user state is idle", () => client.LocalUser?.State == MultiplayerUserState.Idle);
} }
@ -413,6 +413,8 @@ namespace osu.Game.Tests.Visual.Multiplayer
} }
}); });
pressReadyButton();
AddStep("Enter song select", () => AddStep("Enter song select", () =>
{ {
var currentSubScreen = ((Screens.OnlinePlay.Multiplayer.Multiplayer)multiplayerScreenStack.CurrentScreen).CurrentSubScreen; var currentSubScreen = ((Screens.OnlinePlay.Multiplayer.Multiplayer)multiplayerScreenStack.CurrentScreen).CurrentSubScreen;
@ -592,19 +594,8 @@ namespace osu.Game.Tests.Visual.Multiplayer
} }
}); });
AddUntilStep("wait for ready button to be enabled", () => readyButton.ChildrenOfType<OsuButton>().Single().Enabled.Value); pressReadyButton();
pressReadyButton();
AddStep("click ready button", () =>
{
InputManager.MoveMouseTo(readyButton);
InputManager.Click(MouseButton.Left);
});
AddUntilStep("wait for player to be ready", () => client.Room?.Users[0].State == MultiplayerUserState.Ready);
AddUntilStep("wait for ready button to be enabled", () => readyButton.ChildrenOfType<OsuButton>().Single().Enabled.Value);
AddStep("click start button", () => InputManager.Click(MouseButton.Left));
AddUntilStep("wait for player", () => multiplayerScreenStack.CurrentScreen is Player); AddUntilStep("wait for player", () => multiplayerScreenStack.CurrentScreen is Player);
// Gameplay runs in real-time, so we need to incrementally check if gameplay has finished in order to not time out. // Gameplay runs in real-time, so we need to incrementally check if gameplay has finished in order to not time out.
@ -665,7 +656,24 @@ namespace osu.Game.Tests.Visual.Multiplayer
}); });
} }
private MultiplayerReadyButton readyButton => this.ChildrenOfType<MultiplayerReadyButton>().Single(); private ReadyButton readyButton => this.ChildrenOfType<ReadyButton>().Single();
private void pressReadyButton()
{
AddUntilStep("wait for ready button to be enabled", () => readyButton.Enabled.Value);
MultiplayerUserState lastState = MultiplayerUserState.Idle;
AddStep("click ready button", () =>
{
lastState = client.LocalUser?.State ?? MultiplayerUserState.Idle;
InputManager.MoveMouseTo(readyButton);
InputManager.Click(MouseButton.Left);
});
AddUntilStep("wait for state change", () => client.LocalUser?.State != lastState);
}
private void createRoom(Func<Room> room) private void createRoom(Func<Room> room)
{ {

View File

@ -302,7 +302,7 @@ namespace osu.Game.Screens.OnlinePlay.Match
public override void OnResuming(IScreen last) public override void OnResuming(IScreen last)
{ {
base.OnResuming(last); base.OnResuming(last);
updateWorkingBeatmap(); UpdateWorkingBeatmap();
beginHandlingTrack(); beginHandlingTrack();
Scheduler.AddOnce(UpdateMods); Scheduler.AddOnce(UpdateMods);
} }
@ -345,7 +345,7 @@ namespace osu.Game.Screens.OnlinePlay.Match
private void selectedItemChanged() private void selectedItemChanged()
{ {
updateWorkingBeatmap(); UpdateWorkingBeatmap();
var selected = SelectedItem.Value; var selected = SelectedItem.Value;
@ -374,9 +374,9 @@ namespace osu.Game.Screens.OnlinePlay.Match
} }
} }
private void beatmapUpdated(BeatmapSetInfo set) => Schedule(updateWorkingBeatmap); private void beatmapUpdated(BeatmapSetInfo set) => Schedule(UpdateWorkingBeatmap);
private void updateWorkingBeatmap() protected virtual void UpdateWorkingBeatmap()
{ {
var beatmap = SelectedItem.Value?.Beatmap.Value; var beatmap = SelectedItem.Value?.Beatmap.Value;

View File

@ -15,6 +15,7 @@ using osu.Framework.Screens;
using osu.Framework.Threading; using osu.Framework.Threading;
using osu.Game.Beatmaps; using osu.Game.Beatmaps;
using osu.Game.Configuration; using osu.Game.Configuration;
using osu.Game.Extensions;
using osu.Game.Online; using osu.Game.Online;
using osu.Game.Online.Multiplayer; using osu.Game.Online.Multiplayer;
using osu.Game.Online.Rooms; using osu.Game.Online.Rooms;
@ -326,10 +327,24 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer
if (client.LocalUser?.State == MultiplayerUserState.Ready) if (client.LocalUser?.State == MultiplayerUserState.Ready)
client.ChangeState(MultiplayerUserState.Idle); client.ChangeState(MultiplayerUserState.Idle);
} }
else }
protected override void UpdateWorkingBeatmap()
{
var lastBeatmap = Beatmap.Value;
base.UpdateWorkingBeatmap();
if (Beatmap.Value.BeatmapInfo.MatchesOnlineID(lastBeatmap.BeatmapInfo))
return;
if (!Beatmap.Value.BeatmapInfo.MatchesOnlineID(SelectedItem.Value?.Beatmap.Value))
return;
if (client.LocalUser?.State == MultiplayerUserState.Spectating
&& (client.Room?.State == MultiplayerRoomState.WaitingForLoad || client.Room?.State == MultiplayerRoomState.Playing))
{ {
if (client.LocalUser?.State == MultiplayerUserState.Spectating && (client.Room?.State == MultiplayerRoomState.WaitingForLoad || client.Room?.State == MultiplayerRoomState.Playing)) onLoadRequested();
onLoadRequested();
} }
} }