diff --git a/osu.Game/Online/Spectator/SpectatorScoreProcessor.cs b/osu.Game/Online/Spectator/SpectatorScoreProcessor.cs
index 90b584a89f..3242e21994 100644
--- a/osu.Game/Online/Spectator/SpectatorScoreProcessor.cs
+++ b/osu.Game/Online/Spectator/SpectatorScoreProcessor.cs
@@ -14,6 +14,7 @@ using osu.Game.Rulesets;
using osu.Game.Rulesets.Mods;
using osu.Game.Rulesets.Scoring;
using osu.Game.Scoring;
+using osu.Game.Scoring.Legacy;
namespace osu.Game.Online.Spectator
{
@@ -46,7 +47,9 @@ namespace osu.Game.Online.Spectator
///
/// The applied s.
///
- public IReadOnlyList Mods => scoreProcessor?.Mods.Value ?? Array.Empty();
+ public IReadOnlyList Mods => scoreInfo?.Mods ?? Array.Empty();
+
+ public Func GetDisplayScore => mode => scoreInfo?.GetDisplayScore(mode) ?? 0;
private IClock? referenceClock;
@@ -70,7 +73,6 @@ namespace osu.Game.Online.Spectator
private readonly int userId;
private SpectatorState? spectatorState;
- private ScoreProcessor? scoreProcessor;
private ScoreInfo? scoreInfo;
public SpectatorScoreProcessor(int userId)
@@ -94,19 +96,15 @@ namespace osu.Game.Online.Spectator
{
if (!spectatorStates.TryGetValue(userId, out var userState) || userState.BeatmapID == null || userState.RulesetID == null)
{
- scoreProcessor?.RemoveAndDisposeImmediately();
- scoreProcessor = null;
scoreInfo = null;
spectatorState = null;
replayFrames.Clear();
return;
}
- if (scoreProcessor != null)
+ if (scoreInfo != null)
return;
- Debug.Assert(scoreInfo == null);
-
RulesetInfo? rulesetInfo = rulesetStore.GetRuleset(userState.RulesetID.Value);
if (rulesetInfo == null)
return;
@@ -114,9 +112,11 @@ namespace osu.Game.Online.Spectator
Ruleset ruleset = rulesetInfo.CreateInstance();
spectatorState = userState;
- scoreInfo = new ScoreInfo { Ruleset = rulesetInfo };
- scoreProcessor = ruleset.CreateScoreProcessor();
- scoreProcessor.Mods.Value = userState.Mods.Select(m => m.ToMod(ruleset)).ToArray();
+ scoreInfo = new ScoreInfo
+ {
+ Ruleset = rulesetInfo,
+ Mods = userState.Mods.Select(m => m.ToMod(ruleset)).ToArray()
+ };
}
private void onNewFrames(int incomingUserId, FrameDataBundle bundle)
@@ -126,7 +126,7 @@ namespace osu.Game.Online.Spectator
Schedule(() =>
{
- if (scoreProcessor == null)
+ if (scoreInfo == null)
return;
replayFrames.Add(new TimedFrame(bundle.Frames.First().Time, bundle.Header));
@@ -140,7 +140,6 @@ namespace osu.Game.Online.Spectator
return;
Debug.Assert(spectatorState != null);
- Debug.Assert(scoreProcessor != null);
int frameIndex = replayFrames.BinarySearch(new TimedFrame(ReferenceClock.CurrentTime));
if (frameIndex < 0)
@@ -150,6 +149,7 @@ namespace osu.Game.Online.Spectator
TimedFrame frame = replayFrames[frameIndex];
Debug.Assert(frame.Header != null);
+ scoreInfo.Accuracy = frame.Header.Accuracy;
scoreInfo.MaxCombo = frame.Header.MaxCombo;
scoreInfo.Statistics = frame.Header.Statistics;
scoreInfo.MaximumStatistics = spectatorState.MaximumStatistics;
@@ -157,6 +157,7 @@ namespace osu.Game.Online.Spectator
Accuracy.Value = frame.Header.Accuracy;
Combo.Value = frame.Header.Combo;
+ TotalScore.Value = frame.Header.TotalScore;
}
protected override void Dispose(bool isDisposing)
diff --git a/osu.Game/Screens/Play/HUD/MultiplayerGameplayLeaderboard.cs b/osu.Game/Screens/Play/HUD/MultiplayerGameplayLeaderboard.cs
index 620f3718c2..922def6174 100644
--- a/osu.Game/Screens/Play/HUD/MultiplayerGameplayLeaderboard.cs
+++ b/osu.Game/Screens/Play/HUD/MultiplayerGameplayLeaderboard.cs
@@ -98,6 +98,7 @@ namespace osu.Game.Screens.Play.HUD
var trackedUser = UserScores[user.Id];
var leaderboardScore = Add(user, user.Id == api.LocalUser.Value.Id);
+ leaderboardScore.GetDisplayScore = trackedUser.ScoreProcessor.GetDisplayScore;
leaderboardScore.Accuracy.BindTo(trackedUser.ScoreProcessor.Accuracy);
leaderboardScore.TotalScore.BindTo(trackedUser.ScoreProcessor.TotalScore);
leaderboardScore.Combo.BindTo(trackedUser.ScoreProcessor.Combo);