Skip to content

Commit

Permalink
Merge pull request #28572 from bdach/fix-playlist-duration-death
Browse files Browse the repository at this point in the history
Fix crash on calculating playlist duration when rate-changing mods are present
  • Loading branch information
peppy authored Jun 25, 2024
2 parents 2c4809c + 0d2a471 commit a12f325
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 4 deletions.
5 changes: 3 additions & 2 deletions osu.Game/Online/Rooms/PlaylistExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
using Humanizer;
using Humanizer.Localisation;
using osu.Framework.Bindables;
using osu.Game.Rulesets;
using osu.Game.Utils;

namespace osu.Game.Online.Rooms
Expand Down Expand Up @@ -42,14 +43,14 @@ public static IEnumerable<PlaylistItem> GetUpcomingItems(this IEnumerable<Playli
/// <summary>
/// Returns the total duration from the <see cref="PlaylistItem"/> in playlist order from the supplied <paramref name="playlist"/>,
/// </summary>
public static string GetTotalDuration(this BindableList<PlaylistItem> playlist) =>
public static string GetTotalDuration(this BindableList<PlaylistItem> playlist, RulesetStore rulesetStore) =>
playlist.Select(p =>
{
double rate = 1;

if (p.RequiredMods.Length > 0)
{
var ruleset = p.Beatmap.Ruleset.CreateInstance();
var ruleset = rulesetStore.GetRuleset(p.RulesetID)!.CreateInstance();
rate = ModUtils.CalculateRateWithMods(p.RequiredMods.Select(mod => mod.ToMod(ruleset)));
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,17 @@
// Copyright (c) ppy Pty Ltd <[email protected]>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.

using osu.Framework.Allocation;
using osu.Game.Online.Rooms;
using osu.Game.Rulesets;

namespace osu.Game.Screens.OnlinePlay.Components
{
public partial class OverlinedPlaylistHeader : OverlinedHeader
{
[Resolved]
private RulesetStore rulesets { get; set; } = null!;

public OverlinedPlaylistHeader()
: base("Playlist")
{
Expand All @@ -16,7 +21,7 @@ protected override void LoadComplete()
{
base.LoadComplete();

Playlist.BindCollectionChanged((_, _) => Details.Value = Playlist.GetTotalDuration(), true);
Playlist.BindCollectionChanged((_, _) => Details.Value = Playlist.GetTotalDuration(rulesets), true);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
using osu.Game.Screens.OnlinePlay.Match.Components;
using osuTK;
using osu.Game.Localisation;
using osu.Game.Rulesets;

namespace osu.Game.Screens.OnlinePlay.Playlists
{
Expand Down Expand Up @@ -78,6 +79,9 @@ protected partial class MatchSettings : OnlinePlayComposite
[Resolved]
private IAPIProvider api { get; set; } = null!;

[Resolved]
private RulesetStore rulesets { get; set; } = null!;

private IBindable<APIUser> localUser = null!;

private readonly Room room;
Expand Down Expand Up @@ -366,7 +370,7 @@ protected override void Update()
public void SelectBeatmap() => editPlaylistButton.TriggerClick();

private void onPlaylistChanged(object? sender, NotifyCollectionChangedEventArgs e) =>
playlistLength.Text = $"Length: {Playlist.GetTotalDuration()}";
playlistLength.Text = $"Length: {Playlist.GetTotalDuration(rulesets)}";

private bool hasValidSettings => RoomID.Value == null && NameField.Text.Length > 0 && Playlist.Count > 0
&& hasValidDuration;
Expand Down

0 comments on commit a12f325

Please sign in to comment.