1
0
mirror of https://github.com/ppy/osu.git synced 2025-01-12 21:02:54 +08:00

Move score token to BeginPlaying

This commit is contained in:
Dan Balasescu 2022-12-12 13:59:27 +09:00
parent 4a65f5c864
commit caa0b7c290
8 changed files with 17 additions and 18 deletions

View File

@ -261,7 +261,7 @@ namespace osu.Game.Tests.Visual.Gameplay
[Test] [Test]
public void TestFinalFramesPurgedBeforeEndingPlay() 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", () => AddStep("send frames and finish play", () =>
{ {

View File

@ -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; spectatorClient.OnNewFrames += onNewFrames;
}); });
} }

View File

@ -15,8 +15,9 @@ namespace osu.Game.Online.Spectator
/// <summary> /// <summary>
/// Signal the start of a new play session. /// Signal the start of a new play session.
/// </summary> /// </summary>
/// <param name="scoreToken">The score submission token.</param>
/// <param name="state">The state of gameplay.</param> /// <param name="state">The state of gameplay.</param>
Task BeginPlaySession(SpectatorState state); Task BeginPlaySession(long? scoreToken, SpectatorState state);
/// <summary> /// <summary>
/// Send a bundle of frame data for the current play session. /// Send a bundle of frame data for the current play session.

View File

@ -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) if (!IsConnected.Value)
return; return;
@ -56,7 +56,7 @@ namespace osu.Game.Online.Spectator
try try
{ {
await connection.InvokeAsync(nameof(ISpectatorServer.BeginPlaySession), state); await connection.InvokeAsync(nameof(ISpectatorServer.BeginPlaySession), scoreToken, state);
} }
catch (Exception exception) catch (Exception exception)
{ {
@ -65,7 +65,7 @@ namespace osu.Game.Online.Spectator
Debug.Assert(connector != null); Debug.Assert(connector != null);
await connector.Reconnect(); 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. // Exceptions can occur if, for instance, the locally played beatmap doesn't have a server-side counterpart.

View File

@ -76,6 +76,7 @@ namespace osu.Game.Online.Spectator
private IBeatmap? currentBeatmap; private IBeatmap? currentBeatmap;
private Score? currentScore; private Score? currentScore;
private long? currentScoreToken;
private readonly Queue<FrameDataBundle> pendingFrameBundles = new Queue<FrameDataBundle>(); private readonly Queue<FrameDataBundle> pendingFrameBundles = new Queue<FrameDataBundle>();
@ -108,7 +109,7 @@ namespace osu.Game.Online.Spectator
// re-send state in case it wasn't received // re-send state in case it wasn't received
if (IsPlaying) if (IsPlaying)
// TODO: this is likely sent out of order after a reconnect scenario. needs further consideration. // TODO: this is likely sent out of order after a reconnect scenario. needs further consideration.
BeginPlayingInternal(currentState); BeginPlayingInternal(currentScoreToken, currentState);
} }
else else
{ {
@ -159,7 +160,7 @@ namespace osu.Game.Online.Spectator
return Task.CompletedTask; 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`. // This schedule is only here to match the one below in `EndPlaying`.
Schedule(() => Schedule(() =>
@ -175,12 +176,12 @@ namespace osu.Game.Online.Spectator
currentState.Mods = score.ScoreInfo.Mods.Select(m => new APIMod(m)).ToArray(); currentState.Mods = score.ScoreInfo.Mods.Select(m => new APIMod(m)).ToArray();
currentState.State = SpectatedUserState.Playing; currentState.State = SpectatedUserState.Playing;
currentState.MaximumScoringValues = state.ScoreProcessor.MaximumScoringValues; currentState.MaximumScoringValues = state.ScoreProcessor.MaximumScoringValues;
currentState.ScoreToken = token;
currentBeatmap = state.Beatmap; currentBeatmap = state.Beatmap;
currentScore = score; 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); protected abstract Task SendFramesInternal(FrameDataBundle bundle);

View File

@ -33,17 +33,14 @@ namespace osu.Game.Online.Spectator
[Key(4)] [Key(4)]
public ScoringValues MaximumScoringValues { get; set; } public ScoringValues MaximumScoringValues { get; set; }
[Key(5)]
public long? ScoreToken { get; set; }
public bool Equals(SpectatorState other) public bool Equals(SpectatorState other)
{ {
if (ReferenceEquals(null, other)) return false; if (ReferenceEquals(null, other)) return false;
if (ReferenceEquals(this, other)) return true; 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}";
} }
} }

View File

@ -148,7 +148,7 @@ namespace osu.Game.Screens.Play
realmBeatmap.LastPlayed = DateTimeOffset.Now; realmBeatmap.LastPlayed = DateTimeOffset.Now;
}); });
spectatorClient.BeginPlaying(GameplayState, Score, token); spectatorClient.BeginPlaying(token, GameplayState, Score);
} }
public override bool OnExiting(ScreenExitEvent e) public override bool OnExiting(ScreenExitEvent e)

View File

@ -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. // Track the local user's playing beatmap ID.
Debug.Assert(state.BeatmapID != null); Debug.Assert(state.BeatmapID != null);