diff --git a/osu.Game.Tests/Visual/Gameplay/TestSceneSpectator.cs b/osu.Game.Tests/Visual/Gameplay/TestSceneSpectator.cs
index 4f319a7c34..ffd034e4d2 100644
--- a/osu.Game.Tests/Visual/Gameplay/TestSceneSpectator.cs
+++ b/osu.Game.Tests/Visual/Gameplay/TestSceneSpectator.cs
@@ -261,7 +261,7 @@ namespace osu.Game.Tests.Visual.Gameplay
[Test]
public void TestFinalFramesPurgedBeforeEndingPlay()
{
- AddStep("begin playing", () => spectatorClient.BeginPlaying(TestGameplayState.Create(new OsuRuleset()), new Score(), 0));
+ AddStep("begin playing", () => spectatorClient.BeginPlaying(0, TestGameplayState.Create(new OsuRuleset()), new Score()));
AddStep("send frames and finish play", () =>
{
diff --git a/osu.Game.Tests/Visual/Gameplay/TestSceneSpectatorPlayback.cs b/osu.Game.Tests/Visual/Gameplay/TestSceneSpectatorPlayback.cs
index a949c0d79d..794860b9ec 100644
--- a/osu.Game.Tests/Visual/Gameplay/TestSceneSpectatorPlayback.cs
+++ b/osu.Game.Tests/Visual/Gameplay/TestSceneSpectatorPlayback.cs
@@ -147,7 +147,7 @@ namespace osu.Game.Tests.Visual.Gameplay
}
};
- spectatorClient.BeginPlaying(TestGameplayState.Create(new OsuRuleset()), recordingScore, 0);
+ spectatorClient.BeginPlaying(0, TestGameplayState.Create(new OsuRuleset()), recordingScore);
spectatorClient.OnNewFrames += onNewFrames;
});
}
diff --git a/osu.Game/Online/Spectator/ISpectatorServer.cs b/osu.Game/Online/Spectator/ISpectatorServer.cs
index 25785f60a4..fa9d04792a 100644
--- a/osu.Game/Online/Spectator/ISpectatorServer.cs
+++ b/osu.Game/Online/Spectator/ISpectatorServer.cs
@@ -15,8 +15,9 @@ namespace osu.Game.Online.Spectator
///
/// Signal the start of a new play session.
///
+ /// The score submission token.
/// The state of gameplay.
- Task BeginPlaySession(SpectatorState state);
+ Task BeginPlaySession(long? scoreToken, SpectatorState state);
///
/// Send a bundle of frame data for the current play session.
diff --git a/osu.Game/Online/Spectator/OnlineSpectatorClient.cs b/osu.Game/Online/Spectator/OnlineSpectatorClient.cs
index d69bd81b57..d5c1e56761 100644
--- a/osu.Game/Online/Spectator/OnlineSpectatorClient.cs
+++ b/osu.Game/Online/Spectator/OnlineSpectatorClient.cs
@@ -47,7 +47,7 @@ namespace osu.Game.Online.Spectator
}
}
- protected override async Task BeginPlayingInternal(SpectatorState state)
+ protected override async Task BeginPlayingInternal(long? scoreToken, SpectatorState state)
{
if (!IsConnected.Value)
return;
@@ -56,7 +56,7 @@ namespace osu.Game.Online.Spectator
try
{
- await connection.InvokeAsync(nameof(ISpectatorServer.BeginPlaySession), state);
+ await connection.InvokeAsync(nameof(ISpectatorServer.BeginPlaySession), scoreToken, state);
}
catch (Exception exception)
{
@@ -65,7 +65,7 @@ namespace osu.Game.Online.Spectator
Debug.Assert(connector != null);
await connector.Reconnect();
- await BeginPlayingInternal(state);
+ await BeginPlayingInternal(scoreToken, state);
}
// Exceptions can occur if, for instance, the locally played beatmap doesn't have a server-side counterpart.
diff --git a/osu.Game/Online/Spectator/SpectatorClient.cs b/osu.Game/Online/Spectator/SpectatorClient.cs
index c532cb266d..71b1896922 100644
--- a/osu.Game/Online/Spectator/SpectatorClient.cs
+++ b/osu.Game/Online/Spectator/SpectatorClient.cs
@@ -76,6 +76,7 @@ namespace osu.Game.Online.Spectator
private IBeatmap? currentBeatmap;
private Score? currentScore;
+ private long? currentScoreToken;
private readonly Queue pendingFrameBundles = new Queue();
@@ -108,7 +109,7 @@ namespace osu.Game.Online.Spectator
// re-send state in case it wasn't received
if (IsPlaying)
// TODO: this is likely sent out of order after a reconnect scenario. needs further consideration.
- BeginPlayingInternal(currentState);
+ BeginPlayingInternal(currentScoreToken, currentState);
}
else
{
@@ -159,7 +160,7 @@ namespace osu.Game.Online.Spectator
return Task.CompletedTask;
}
- public void BeginPlaying(GameplayState state, Score score, long? token)
+ public void BeginPlaying(long? scoreToken, GameplayState state, Score score)
{
// This schedule is only here to match the one below in `EndPlaying`.
Schedule(() =>
@@ -175,12 +176,12 @@ namespace osu.Game.Online.Spectator
currentState.Mods = score.ScoreInfo.Mods.Select(m => new APIMod(m)).ToArray();
currentState.State = SpectatedUserState.Playing;
currentState.MaximumScoringValues = state.ScoreProcessor.MaximumScoringValues;
- currentState.ScoreToken = token;
currentBeatmap = state.Beatmap;
currentScore = score;
+ currentScoreToken = scoreToken;
- BeginPlayingInternal(currentState);
+ BeginPlayingInternal(currentScoreToken, currentState);
});
}
@@ -265,7 +266,7 @@ namespace osu.Game.Online.Spectator
});
}
- protected abstract Task BeginPlayingInternal(SpectatorState state);
+ protected abstract Task BeginPlayingInternal(long? scoreToken, SpectatorState state);
protected abstract Task SendFramesInternal(FrameDataBundle bundle);
diff --git a/osu.Game/Online/Spectator/SpectatorState.cs b/osu.Game/Online/Spectator/SpectatorState.cs
index 34dbefd2a5..766b274e63 100644
--- a/osu.Game/Online/Spectator/SpectatorState.cs
+++ b/osu.Game/Online/Spectator/SpectatorState.cs
@@ -33,17 +33,14 @@ namespace osu.Game.Online.Spectator
[Key(4)]
public ScoringValues MaximumScoringValues { get; set; }
- [Key(5)]
- public long? ScoreToken { get; set; }
-
public bool Equals(SpectatorState other)
{
if (ReferenceEquals(null, other)) return false;
if (ReferenceEquals(this, other)) return true;
- return BeatmapID == other.BeatmapID && Mods.SequenceEqual(other.Mods) && RulesetID == other.RulesetID && State == other.State && ScoreToken == other.ScoreToken;
+ return BeatmapID == other.BeatmapID && Mods.SequenceEqual(other.Mods) && RulesetID == other.RulesetID && State == other.State;
}
- public override string ToString() => $"Beatmap:{BeatmapID} Mods:{string.Join(',', Mods)} Ruleset:{RulesetID} State:{State} Token:{ScoreToken}";
+ public override string ToString() => $"Beatmap:{BeatmapID} Mods:{string.Join(',', Mods)} Ruleset:{RulesetID} State:{State}";
}
}
diff --git a/osu.Game/Screens/Play/SubmittingPlayer.cs b/osu.Game/Screens/Play/SubmittingPlayer.cs
index 81c4e9ab2a..4c507f8c67 100644
--- a/osu.Game/Screens/Play/SubmittingPlayer.cs
+++ b/osu.Game/Screens/Play/SubmittingPlayer.cs
@@ -148,7 +148,7 @@ namespace osu.Game.Screens.Play
realmBeatmap.LastPlayed = DateTimeOffset.Now;
});
- spectatorClient.BeginPlaying(GameplayState, Score, token);
+ spectatorClient.BeginPlaying(token, GameplayState, Score);
}
public override bool OnExiting(ScreenExitEvent e)
diff --git a/osu.Game/Tests/Visual/Spectator/TestSpectatorClient.cs b/osu.Game/Tests/Visual/Spectator/TestSpectatorClient.cs
index a76f6c7052..1db35b3aaa 100644
--- a/osu.Game/Tests/Visual/Spectator/TestSpectatorClient.cs
+++ b/osu.Game/Tests/Visual/Spectator/TestSpectatorClient.cs
@@ -126,7 +126,7 @@ namespace osu.Game.Tests.Visual.Spectator
}
}
- protected override Task BeginPlayingInternal(SpectatorState state)
+ protected override Task BeginPlayingInternal(long? scoreToken, SpectatorState state)
{
// Track the local user's playing beatmap ID.
Debug.Assert(state.BeatmapID != null);