mirror of
https://github.com/ppy/osu.git
synced 2024-11-06 12:17:46 +08:00
Add header class and basic flow for propagating data updates
This commit is contained in:
parent
1793385e96
commit
64a2526678
@ -17,6 +17,7 @@ using osu.Game.Replays.Legacy;
|
|||||||
using osu.Game.Rulesets.Osu;
|
using osu.Game.Rulesets.Osu;
|
||||||
using osu.Game.Rulesets.Osu.Replays;
|
using osu.Game.Rulesets.Osu.Replays;
|
||||||
using osu.Game.Rulesets.UI;
|
using osu.Game.Rulesets.UI;
|
||||||
|
using osu.Game.Scoring;
|
||||||
using osu.Game.Screens.Play;
|
using osu.Game.Screens.Play;
|
||||||
using osu.Game.Tests.Beatmaps.IO;
|
using osu.Game.Tests.Beatmaps.IO;
|
||||||
using osu.Game.Users;
|
using osu.Game.Users;
|
||||||
@ -272,7 +273,7 @@ namespace osu.Game.Tests.Visual.Gameplay
|
|||||||
frames.Add(new LegacyReplayFrame(i * 100, RNG.Next(0, 512), RNG.Next(0, 512), buttonState));
|
frames.Add(new LegacyReplayFrame(i * 100, RNG.Next(0, 512), RNG.Next(0, 512), buttonState));
|
||||||
}
|
}
|
||||||
|
|
||||||
var bundle = new FrameDataBundle(frames);
|
var bundle = new FrameDataBundle(new ScoreInfo(), frames);
|
||||||
((ISpectatorClient)this).UserSentFrames(StreamingUser.Id, bundle);
|
((ISpectatorClient)this).UserSentFrames(StreamingUser.Id, bundle);
|
||||||
|
|
||||||
if (!sentState)
|
if (!sentState)
|
||||||
|
@ -1,20 +1,26 @@
|
|||||||
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
||||||
// See the LICENCE file in the repository root for full licence text.
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
|
#nullable enable
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using osu.Game.Replays.Legacy;
|
using osu.Game.Replays.Legacy;
|
||||||
|
using osu.Game.Scoring;
|
||||||
|
|
||||||
namespace osu.Game.Online.Spectator
|
namespace osu.Game.Online.Spectator
|
||||||
{
|
{
|
||||||
[Serializable]
|
[Serializable]
|
||||||
public class FrameDataBundle
|
public class FrameDataBundle
|
||||||
{
|
{
|
||||||
|
public FrameHeader Header { get; set; }
|
||||||
|
|
||||||
public IEnumerable<LegacyReplayFrame> Frames { get; set; }
|
public IEnumerable<LegacyReplayFrame> Frames { get; set; }
|
||||||
|
|
||||||
public FrameDataBundle(IEnumerable<LegacyReplayFrame> frames)
|
public FrameDataBundle(ScoreInfo score, IEnumerable<LegacyReplayFrame> frames)
|
||||||
{
|
{
|
||||||
Frames = frames;
|
Frames = frames;
|
||||||
|
Header = new FrameHeader(score);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
35
osu.Game/Online/Spectator/FrameHeader.cs
Normal file
35
osu.Game/Online/Spectator/FrameHeader.cs
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
||||||
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
|
#nullable enable
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using osu.Game.Rulesets.Scoring;
|
||||||
|
using osu.Game.Scoring;
|
||||||
|
|
||||||
|
namespace osu.Game.Online.Spectator
|
||||||
|
{
|
||||||
|
[Serializable]
|
||||||
|
public class FrameHeader
|
||||||
|
{
|
||||||
|
public int Combo { get; set; }
|
||||||
|
|
||||||
|
public int MaxCombo { get; set; }
|
||||||
|
|
||||||
|
public Dictionary<HitResult, int> Statistics = new Dictionary<HitResult, int>();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Construct header summary information from a point-in-time reference to a score which is actively being played.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="score">The score for reference.</param>
|
||||||
|
public FrameHeader(ScoreInfo score)
|
||||||
|
{
|
||||||
|
Combo = score.Combo;
|
||||||
|
MaxCombo = score.MaxCombo;
|
||||||
|
|
||||||
|
foreach (var kvp in score.Statistics)
|
||||||
|
Statistics[kvp.Key] = kvp.Value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -21,6 +21,7 @@ using osu.Game.Rulesets;
|
|||||||
using osu.Game.Rulesets.Mods;
|
using osu.Game.Rulesets.Mods;
|
||||||
using osu.Game.Rulesets.Replays;
|
using osu.Game.Rulesets.Replays;
|
||||||
using osu.Game.Rulesets.Replays.Types;
|
using osu.Game.Rulesets.Replays.Types;
|
||||||
|
using osu.Game.Scoring;
|
||||||
using osu.Game.Screens.Play;
|
using osu.Game.Screens.Play;
|
||||||
|
|
||||||
namespace osu.Game.Online.Spectator
|
namespace osu.Game.Online.Spectator
|
||||||
@ -52,6 +53,9 @@ namespace osu.Game.Online.Spectator
|
|||||||
[CanBeNull]
|
[CanBeNull]
|
||||||
private IBeatmap currentBeatmap;
|
private IBeatmap currentBeatmap;
|
||||||
|
|
||||||
|
[CanBeNull]
|
||||||
|
private Score currentScore;
|
||||||
|
|
||||||
[Resolved]
|
[Resolved]
|
||||||
private IBindable<RulesetInfo> currentRuleset { get; set; }
|
private IBindable<RulesetInfo> currentRuleset { get; set; }
|
||||||
|
|
||||||
@ -203,7 +207,7 @@ namespace osu.Game.Online.Spectator
|
|||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void BeginPlaying(GameplayBeatmap beatmap)
|
public void BeginPlaying(GameplayBeatmap beatmap, Score score)
|
||||||
{
|
{
|
||||||
if (isPlaying)
|
if (isPlaying)
|
||||||
throw new InvalidOperationException($"Cannot invoke {nameof(BeginPlaying)} when already playing");
|
throw new InvalidOperationException($"Cannot invoke {nameof(BeginPlaying)} when already playing");
|
||||||
@ -216,6 +220,8 @@ namespace osu.Game.Online.Spectator
|
|||||||
currentState.Mods = currentMods.Value.Select(m => new APIMod(m));
|
currentState.Mods = currentMods.Value.Select(m => new APIMod(m));
|
||||||
|
|
||||||
currentBeatmap = beatmap.PlayableBeatmap;
|
currentBeatmap = beatmap.PlayableBeatmap;
|
||||||
|
currentScore = score;
|
||||||
|
|
||||||
beginPlaying();
|
beginPlaying();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -308,7 +314,9 @@ namespace osu.Game.Online.Spectator
|
|||||||
|
|
||||||
pendingFrames.Clear();
|
pendingFrames.Clear();
|
||||||
|
|
||||||
SendFrames(new FrameDataBundle(frames));
|
Debug.Assert(currentScore != null);
|
||||||
|
|
||||||
|
SendFrames(new FrameDataBundle(currentScore.ScoreInfo, frames));
|
||||||
|
|
||||||
lastSendTime = Time.Current;
|
lastSendTime = Time.Current;
|
||||||
}
|
}
|
||||||
|
@ -49,7 +49,7 @@ namespace osu.Game.Rulesets.UI
|
|||||||
|
|
||||||
inputManager = GetContainingInputManager();
|
inputManager = GetContainingInputManager();
|
||||||
|
|
||||||
spectatorStreaming?.BeginPlaying(gameplayBeatmap);
|
spectatorStreaming?.BeginPlaying(gameplayBeatmap, target);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void Dispose(bool isDisposing)
|
protected override void Dispose(bool isDisposing)
|
||||||
|
Loading…
Reference in New Issue
Block a user