diff --git a/osu.Game.Tests/Visual/Online/TestSceneBeatmapSetOverlay.cs b/osu.Game.Tests/Visual/Online/TestSceneBeatmapSetOverlay.cs
index a27c4ddad2..d9763ef6c8 100644
--- a/osu.Game.Tests/Visual/Online/TestSceneBeatmapSetOverlay.cs
+++ b/osu.Game.Tests/Visual/Online/TestSceneBeatmapSetOverlay.cs
@@ -86,6 +86,7 @@ namespace osu.Game.Tests.Visual.Online
StarRating = 9.99,
DifficultyName = @"TEST",
Length = 456000,
+ HitLength = 400000,
RulesetID = 3,
CircleSize = 1,
DrainRate = 2.3f,
diff --git a/osu.Game/Beatmaps/IBeatmapInfo.cs b/osu.Game/Beatmaps/IBeatmapInfo.cs
index 4f2c08f63d..b8c69cc525 100644
--- a/osu.Game/Beatmaps/IBeatmapInfo.cs
+++ b/osu.Game/Beatmaps/IBeatmapInfo.cs
@@ -33,7 +33,7 @@ namespace osu.Game.Beatmaps
IBeatmapSetInfo? BeatmapSet { get; }
///
- /// The playable length in milliseconds of this beatmap.
+ /// The total length in milliseconds of this beatmap.
///
double Length { get; }
diff --git a/osu.Game/Beatmaps/IBeatmapOnlineInfo.cs b/osu.Game/Beatmaps/IBeatmapOnlineInfo.cs
index e1634e7d24..707a0696ba 100644
--- a/osu.Game/Beatmaps/IBeatmapOnlineInfo.cs
+++ b/osu.Game/Beatmaps/IBeatmapOnlineInfo.cs
@@ -59,5 +59,10 @@ namespace osu.Game.Beatmaps
int PassCount { get; }
APIFailTimes? FailTimes { get; }
+
+ ///
+ /// The playable length in milliseconds of this beatmap.
+ ///
+ double HitLength { get; }
}
}
diff --git a/osu.Game/Online/API/Requests/Responses/APIBeatmap.cs b/osu.Game/Online/API/Requests/Responses/APIBeatmap.cs
index 7d6740ee46..902b651be9 100644
--- a/osu.Game/Online/API/Requests/Responses/APIBeatmap.cs
+++ b/osu.Game/Online/API/Requests/Responses/APIBeatmap.cs
@@ -63,6 +63,16 @@ namespace osu.Game.Online.API.Requests.Responses
set => Length = TimeSpan.FromSeconds(value).TotalMilliseconds;
}
+ [JsonIgnore]
+ public double HitLength { get; set; }
+
+ [JsonProperty(@"hit_length")]
+ private double hitLengthInSeconds
+ {
+ get => TimeSpan.FromMilliseconds(HitLength).TotalSeconds;
+ set => HitLength = TimeSpan.FromSeconds(value).TotalMilliseconds;
+ }
+
[JsonProperty(@"convert")]
public bool Convert { get; set; }
diff --git a/osu.Game/Overlays/BeatmapSet/BasicStats.cs b/osu.Game/Overlays/BeatmapSet/BasicStats.cs
index 4a9a3d8089..3cc655d561 100644
--- a/osu.Game/Overlays/BeatmapSet/BasicStats.cs
+++ b/osu.Game/Overlays/BeatmapSet/BasicStats.cs
@@ -68,13 +68,13 @@ namespace osu.Game.Overlays.BeatmapSet
}
else
{
- length.TooltipText = BeatmapsetsStrings.ShowStatsTotalLength(TimeSpan.FromMilliseconds(beatmapInfo.Length).ToFormattedDuration());
length.Value = TimeSpan.FromMilliseconds(beatmapInfo.Length).ToFormattedDuration();
- var onlineInfo = beatmapInfo as IBeatmapOnlineInfo;
+ if (beatmapInfo is not IBeatmapOnlineInfo onlineInfo) return;
- circleCount.Value = (onlineInfo?.CircleCount ?? 0).ToLocalisableString(@"N0");
- sliderCount.Value = (onlineInfo?.SliderCount ?? 0).ToLocalisableString(@"N0");
+ circleCount.Value = onlineInfo.CircleCount.ToLocalisableString(@"N0");
+ sliderCount.Value = onlineInfo.SliderCount.ToLocalisableString(@"N0");
+ length.TooltipText = BeatmapsetsStrings.ShowStatsTotalLength(TimeSpan.FromMilliseconds(onlineInfo.HitLength).ToFormattedDuration());
}
}