diff --git a/osu.Game/Overlays/MusicController.cs b/osu.Game/Overlays/MusicController.cs
index 116e60a014..b6553779bc 100644
--- a/osu.Game/Overlays/MusicController.cs
+++ b/osu.Game/Overlays/MusicController.cs
@@ -133,7 +133,7 @@ namespace osu.Game.Overlays
return;
Logger.Log($"{nameof(MusicController)} skipping next track to {nameof(EnsurePlayingSomething)}");
- NextTrack();
+ NextTrack(allowProtectedTracks: true);
}
else if (!IsPlaying)
{
@@ -207,9 +207,10 @@ namespace osu.Game.Overlays
/// Play the previous track or restart the current track if it's current time below .
///
/// Invoked when the operation has been performed successfully.
- public void PreviousTrack(Action? onSuccess = null) => Schedule(() =>
+ /// Whether to include beatmap sets when navigating.
+ public void PreviousTrack(Action? onSuccess = null, bool allowProtectedTracks = false) => Schedule(() =>
{
- PreviousTrackResult res = prev();
+ PreviousTrackResult res = prev(allowProtectedTracks);
if (res != PreviousTrackResult.None)
onSuccess?.Invoke(res);
});
@@ -217,8 +218,9 @@ namespace osu.Game.Overlays
///
/// Play the previous track or restart the current track if it's current time below .
///
+ /// Whether to include beatmap sets when navigating.
/// The that indicate the decided action.
- private PreviousTrackResult prev()
+ private PreviousTrackResult prev(bool allowProtectedTracks)
{
if (beatmap.Disabled || !AllowTrackControl.Value)
return PreviousTrackResult.None;
@@ -233,8 +235,8 @@ namespace osu.Game.Overlays
queuedDirection = TrackChangeDirection.Prev;
- var playableSet = getBeatmapSets().AsEnumerable().TakeWhile(i => !i.Equals(current?.BeatmapSetInfo)).LastOrDefault()
- ?? getBeatmapSets().LastOrDefault();
+ var playableSet = getBeatmapSets().AsEnumerable().TakeWhile(i => !i.Equals(current?.BeatmapSetInfo)).LastOrDefault(s => !s.Protected || allowProtectedTracks)
+ ?? getBeatmapSets().AsEnumerable().LastOrDefault(s => !s.Protected || allowProtectedTracks);
if (playableSet != null)
{
@@ -250,10 +252,11 @@ namespace osu.Game.Overlays
/// Play the next random or playlist track.
///
/// Invoked when the operation has been performed successfully.
+ /// Whether to include beatmap sets when navigating.
/// A of the operation.
- public void NextTrack(Action? onSuccess = null) => Schedule(() =>
+ public void NextTrack(Action? onSuccess = null, bool allowProtectedTracks = false) => Schedule(() =>
{
- bool res = next();
+ bool res = next(allowProtectedTracks);
if (res)
onSuccess?.Invoke();
});
@@ -306,15 +309,15 @@ namespace osu.Game.Overlays
Scheduler.AddDelayed(() => duckOperation.Dispose(), delayUntilRestore);
}
- private bool next()
+ private bool next(bool allowProtectedTracks)
{
if (beatmap.Disabled || !AllowTrackControl.Value)
return false;
queuedDirection = TrackChangeDirection.Next;
- var playableSet = getBeatmapSets().AsEnumerable().SkipWhile(i => !i.Equals(current?.BeatmapSetInfo)).ElementAtOrDefault(1)
- ?? getBeatmapSets().FirstOrDefault();
+ var playableSet = getBeatmapSets().AsEnumerable().SkipWhile(i => !i.Equals(current?.BeatmapSetInfo) && (!i.Protected || allowProtectedTracks)).ElementAtOrDefault(1)
+ ?? getBeatmapSets().AsEnumerable().FirstOrDefault(i => !i.Protected || allowProtectedTracks);
var playableBeatmap = playableSet?.Beatmaps.FirstOrDefault();
@@ -432,7 +435,7 @@ namespace osu.Game.Overlays
private void onTrackCompleted()
{
if (!CurrentTrack.Looping && !beatmap.Disabled && AllowTrackControl.Value)
- NextTrack();
+ NextTrack(allowProtectedTracks: true);
}
private bool applyModTrackAdjustments;