mirror of
https://github.com/ppy/osu.git
synced 2025-01-28 04:02:57 +08:00
86a8ab6db6
Closes https://github.com/ppy/osu/issues/25247. The scenario involved here is as follows: 1. User completes beatmap by hitting all notes. 2. `checkScoreCompleted()` determines completion, and calls `progressToResults(withDelay: true)`. 3. `progressToResults()` schedules `resultsDisplayDelegate`, which includes a call to `prepareAndImportScoreAsync()`, a second in the future. 4. User presses quick retry hotkey. This calls `Player.Restart(quickRestart: true)`, which invokes `Player.RestartRequested`, which in turn calls `PlayerLoader.restartRequested(true)`, which in turn causes `PlayerLoader` to make itself current, which means that `Player.OnExiting()` will get called. 5. `Player.OnExiting()` sees that `prepareScoreForDisplayTask` is null (because `prepareAndImportScoreAsync()` - which sets it - is scheduled to happen in the future), and as such assumes that the score did not complete. Thus, it marks the score as failed. 6. `Player.Restart()` after invoking `RestartRequested` calls `PerformExit(false)`, which then will unconditionally call `prepareAndImportScoreAsync()`. But the score has already been marked as failed. The flow above can be described as "convoluted", but I'm not sure I have it in me right now to try and refactor it again. Therefore, to fix, switch the `prepareScoreForDisplayTask` null check in `Player.OnExiting()` to check `GameplayState.HasPassed` instead, as it is not susceptible to the same out-of-order read issue. |
||
---|---|---|
.. | ||
Break | ||
HUD | ||
PlayerSettings | ||
ArgonKeyCounter.cs | ||
ArgonKeyCounterDisplay.cs | ||
BeatmapMetadataDisplay.cs | ||
BreakOverlay.cs | ||
BreakTracker.cs | ||
ComboEffects.cs | ||
DimmableStoryboard.cs | ||
EpilepsyWarning.cs | ||
FailAnimationContainer.cs | ||
FailOverlay.cs | ||
GameplayClockContainer.cs | ||
GameplayClockExtensions.cs | ||
GameplayMenuOverlay.cs | ||
GameplayState.cs | ||
HotkeyExitOverlay.cs | ||
HotkeyRetryOverlay.cs | ||
HUDOverlay.cs | ||
IGameplayClock.cs | ||
ILocalUserPlayInfo.cs | ||
MasterGameplayClockContainer.cs | ||
OffsetCorrectionClock.cs | ||
PauseOverlay.cs | ||
Player.cs | ||
PlayerConfiguration.cs | ||
PlayerLoader.cs | ||
ReplayPlayer.cs | ||
ReplayPlayerLoader.cs | ||
ResumeOverlay.cs | ||
RoomSubmittingPlayer.cs | ||
SaveFailedScoreButton.cs | ||
ScreenSuspensionHandler.cs | ||
ScreenWithBeatmapBackground.cs | ||
SkipOverlay.cs | ||
SoloPlayer.cs | ||
SoloSpectator.cs | ||
SoloSpectatorPlayer.cs | ||
SpectatorPlayer.cs | ||
SpectatorPlayerLoader.cs | ||
SpectatorResultsScreen.cs | ||
SquareGraph.cs | ||
SubmittingPlayer.cs |