From e8dcbaf29ada1f918b57be38d24f1f273d9ea083 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Tue, 11 Jan 2022 21:32:01 +0900 Subject: [PATCH] Fix intro screen hitting null reference if intro beatmap is unavailable --- osu.Game/Overlays/MusicController.cs | 7 ++++--- osu.Game/Screens/Menu/IntroScreen.cs | 18 +++++------------- 2 files changed, 9 insertions(+), 16 deletions(-) diff --git a/osu.Game/Overlays/MusicController.cs b/osu.Game/Overlays/MusicController.cs index 2731096a00..2497f549b3 100644 --- a/osu.Game/Overlays/MusicController.cs +++ b/osu.Game/Overlays/MusicController.cs @@ -284,11 +284,12 @@ namespace osu.Game.Overlays queuedDirection = TrackChangeDirection.Next; - var playable = BeatmapSets.SkipWhile(i => i.ID != current.BeatmapSetInfo.ID).ElementAtOrDefault(1) ?? BeatmapSets.FirstOrDefault(); + var playableSet = BeatmapSets.SkipWhile(i => i.ID != current.BeatmapSetInfo.ID).ElementAtOrDefault(1) ?? BeatmapSets.FirstOrDefault(); + var playableBeatmap = playableSet?.Beatmaps?.FirstOrDefault(); - if (playable != null) + if (playableBeatmap != null) { - changeBeatmap(beatmaps.GetWorkingBeatmap(playable.Beatmaps.First())); + changeBeatmap(beatmaps.GetWorkingBeatmap(playableBeatmap)); restartTrack(); return true; } diff --git a/osu.Game/Screens/Menu/IntroScreen.cs b/osu.Game/Screens/Menu/IntroScreen.cs index afc5812039..09a9f44558 100644 --- a/osu.Game/Screens/Menu/IntroScreen.cs +++ b/osu.Game/Screens/Menu/IntroScreen.cs @@ -141,24 +141,13 @@ namespace osu.Game.Screens.Menu if (s.Beatmaps.Count == 0) return; - initialBeatmap = beatmaps.GetWorkingBeatmap(s.Beatmaps[0].ToLive(realmContextFactory)); + initialBeatmap = beatmaps.GetWorkingBeatmap(s.Beatmaps.First()); }); return UsingThemedIntro = initialBeatmap != null; } } - protected override void LoadComplete() - { - base.LoadComplete(); - - // TODO: This is temporary to get the setInfo on the update thread, to make things work "better" without using ILive everywhere. - var setInfo = beatmaps.QueryBeatmapSets(b => b.Hash == BeatmapHash).FirstOrDefault(); - - if (setInfo?.Value.Beatmaps.Count > 0) - initialBeatmap = beatmaps.GetWorkingBeatmap(setInfo.Value.Beatmaps.First()); - } - public override void OnResuming(IScreen last) { this.FadeIn(300); @@ -222,7 +211,10 @@ namespace osu.Game.Screens.Menu if (!resuming) { - beatmap.Value = initialBeatmap; + // generally this can never be null + // an exception is running ruleset tests, where the osu! ruleset may not be prsent (causing importing the intro to fail). + if (initialBeatmap != null) + beatmap.Value = initialBeatmap; Track = beatmap.Value.Track; // ensure the track starts at maximum volume