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

Make ScoreInfo.BeatmapInfo nullable

This commit is contained in:
Dean Herbert 2023-07-04 14:50:34 +09:00
parent f6939223b3
commit d74b1e148d
15 changed files with 21 additions and 26 deletions

View File

@ -187,7 +187,7 @@ namespace osu.Desktop
return edit.BeatmapInfo.ToString() ?? string.Empty; return edit.BeatmapInfo.ToString() ?? string.Empty;
case UserActivity.WatchingReplay watching: case UserActivity.WatchingReplay watching:
return watching.BeatmapInfo.ToString(); return watching.BeatmapInfo?.ToString() ?? string.Empty;
case UserActivity.InLobby lobby: case UserActivity.InLobby lobby:
return privacyMode.Value == DiscordRichPresenceMode.Limited ? string.Empty : lobby.Room.Name.Value; return privacyMode.Value == DiscordRichPresenceMode.Limited ? string.Empty : lobby.Room.Name.Value;

View File

@ -42,7 +42,7 @@ namespace osu.Game.Rulesets.Taiko.Difficulty
effectiveMissCount = Math.Max(1.0, 1000.0 / totalSuccessfulHits) * countMiss; effectiveMissCount = Math.Max(1.0, 1000.0 / totalSuccessfulHits) * countMiss;
// TODO: The detection of rulesets is temporary until the leftover old skills have been reworked. // TODO: The detection of rulesets is temporary until the leftover old skills have been reworked.
bool isConvert = score.BeatmapInfo.Ruleset.OnlineID != 1; bool isConvert = score.BeatmapInfo!.Ruleset.OnlineID != 1;
double multiplier = 1.13; double multiplier = 1.13;

View File

@ -87,10 +87,10 @@ namespace osu.Game.Tests.Models
var mock = new Mock<IScoreInfo>(); var mock = new Mock<IScoreInfo>();
mock.Setup(m => m.User).Returns(new APIUser { Username = "user" }); // TODO: temporary. mock.Setup(m => m.User).Returns(new APIUser { Username = "user" }); // TODO: temporary.
mock.Setup(m => m.Beatmap.Metadata.Artist).Returns("artist"); mock.Setup(m => m.Beatmap!.Metadata.Artist).Returns("artist");
mock.Setup(m => m.Beatmap.Metadata.Title).Returns("title"); mock.Setup(m => m.Beatmap!.Metadata.Title).Returns("title");
mock.Setup(m => m.Beatmap.Metadata.Author.Username).Returns("author"); mock.Setup(m => m.Beatmap!.Metadata.Author.Username).Returns("author");
mock.Setup(m => m.Beatmap.DifficultyName).Returns("difficulty"); mock.Setup(m => m.Beatmap!.DifficultyName).Returns("difficulty");
Assert.That(mock.Object.GetDisplayString(), Is.EqualTo("user playing artist - title (author) [difficulty]")); Assert.That(mock.Object.GetDisplayString(), Is.EqualTo("user playing artist - title (author) [difficulty]"));
} }

View File

@ -33,7 +33,7 @@ namespace osu.Game.Tests.Visual.Ranking
AddStep("show excess mods score", () => AddStep("show excess mods score", () =>
{ {
var score = TestResources.CreateTestScoreInfo(); var score = TestResources.CreateTestScoreInfo();
score.Mods = score.BeatmapInfo.Ruleset.CreateInstance().CreateAllMods().ToArray(); score.Mods = score.BeatmapInfo!.Ruleset.CreateInstance().CreateAllMods().ToArray();
showPanel(CreateWorkingBeatmap(CreateBeatmap(new OsuRuleset().RulesetInfo)), score); showPanel(CreateWorkingBeatmap(CreateBeatmap(new OsuRuleset().RulesetInfo)), score);
}); });
} }

View File

@ -896,7 +896,7 @@ namespace osu.Game.Database
var scores = migration.NewRealm.All<ScoreInfo>(); var scores = migration.NewRealm.All<ScoreInfo>();
foreach (var score in scores) foreach (var score in scores)
score.BeatmapHash = score.BeatmapInfo.Hash; score.BeatmapHash = score.BeatmapInfo?.Hash ?? string.Empty;
break; break;
} }

View File

@ -185,7 +185,7 @@ namespace osu.Game.Online.Spectator
IsPlaying = true; IsPlaying = true;
// transfer state at point of beginning play // transfer state at point of beginning play
currentState.BeatmapID = score.ScoreInfo.BeatmapInfo.OnlineID; currentState.BeatmapID = score.ScoreInfo.BeatmapInfo!.OnlineID;
currentState.RulesetID = score.ScoreInfo.RulesetID; currentState.RulesetID = score.ScoreInfo.RulesetID;
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;

View File

@ -28,7 +28,7 @@ namespace osu.Game.Scoring
double? PP { get; } double? PP { get; }
IBeatmapInfo Beatmap { get; } IBeatmapInfo? Beatmap { get; }
IRulesetInfo Ruleset { get; } IRulesetInfo Ruleset { get; }

View File

@ -65,7 +65,7 @@ namespace osu.Game.Scoring.Legacy
{ {
sw.Write((byte)(score.ScoreInfo.Ruleset.OnlineID)); sw.Write((byte)(score.ScoreInfo.Ruleset.OnlineID));
sw.Write(LATEST_VERSION); sw.Write(LATEST_VERSION);
sw.Write(score.ScoreInfo.BeatmapInfo.MD5Hash); sw.Write(score.ScoreInfo.BeatmapInfo!.MD5Hash);
sw.Write(score.ScoreInfo.User.Username); sw.Write(score.ScoreInfo.User.Username);
sw.Write(FormattableString.Invariant($"lazer-{score.ScoreInfo.User.Username}-{score.ScoreInfo.Date}").ComputeMD5Hash()); sw.Write(FormattableString.Invariant($"lazer-{score.ScoreInfo.User.Username}-{score.ScoreInfo.Date}").ComputeMD5Hash());
sw.Write((ushort)(score.ScoreInfo.GetCount300() ?? 0)); sw.Write((ushort)(score.ScoreInfo.GetCount300() ?? 0));

View File

@ -64,6 +64,8 @@ namespace osu.Game.Scoring
protected override void Populate(ScoreInfo model, ArchiveReader? archive, Realm realm, CancellationToken cancellationToken = default) protected override void Populate(ScoreInfo model, ArchiveReader? archive, Realm realm, CancellationToken cancellationToken = default)
{ {
Debug.Assert(model.BeatmapInfo != null);
// Ensure the beatmap is not detached. // Ensure the beatmap is not detached.
if (!model.BeatmapInfo.IsManaged) if (!model.BeatmapInfo.IsManaged)
model.BeatmapInfo = realm.Find<BeatmapInfo>(model.BeatmapInfo.ID); model.BeatmapInfo = realm.Find<BeatmapInfo>(model.BeatmapInfo.ID);
@ -99,7 +101,7 @@ namespace osu.Game.Scoring
if (score.MaximumStatistics.Select(kvp => kvp.Value).Sum() > 0) if (score.MaximumStatistics.Select(kvp => kvp.Value).Sum() > 0)
return; return;
var beatmap = score.BeatmapInfo.Detach(); var beatmap = score.BeatmapInfo?.Detach();
var ruleset = score.Ruleset.Detach(); var ruleset = score.Ruleset.Detach();
var rulesetInstance = ruleset.CreateInstance(); var rulesetInstance = ruleset.CreateInstance();

View File

@ -36,7 +36,7 @@ namespace osu.Game.Scoring
/// <remarks> /// <remarks>
/// When setting this, make sure to also set <see cref="BeatmapHash"/> to allow relational consistency when a beatmap is potentially changed. /// When setting this, make sure to also set <see cref="BeatmapHash"/> to allow relational consistency when a beatmap is potentially changed.
/// </remarks> /// </remarks>
public BeatmapInfo BeatmapInfo { get; set; } = null!; public BeatmapInfo? BeatmapInfo { get; set; }
/// <summary> /// <summary>
/// The <see cref="osu.Game.Beatmaps.BeatmapInfo.Hash"/> at the point in time when the score was set. /// The <see cref="osu.Game.Beatmaps.BeatmapInfo.Hash"/> at the point in time when the score was set.
@ -129,14 +129,12 @@ namespace osu.Game.Scoring
public int RankInt { get; set; } public int RankInt { get; set; }
IRulesetInfo IScoreInfo.Ruleset => Ruleset; IRulesetInfo IScoreInfo.Ruleset => Ruleset;
IBeatmapInfo IScoreInfo.Beatmap => BeatmapInfo; IBeatmapInfo? IScoreInfo.Beatmap => BeatmapInfo;
IUser IScoreInfo.User => User; IUser IScoreInfo.User => User;
IEnumerable<INamedFileUsage> IHasNamedFiles.Files => Files; IEnumerable<INamedFileUsage> IHasNamedFiles.Files => Files;
#region Properties required to make things work with existing usages #region Properties required to make things work with existing usages
public Guid BeatmapInfoID => BeatmapInfo.ID;
public int UserID => RealmUser.OnlineID; public int UserID => RealmUser.OnlineID;
public int RulesetID => Ruleset.OnlineID; public int RulesetID => Ruleset.OnlineID;

View File

@ -13,7 +13,7 @@ namespace osu.Game.Scoring
/// <summary> /// <summary>
/// A user-presentable display title representing this score. /// A user-presentable display title representing this score.
/// </summary> /// </summary>
public static string GetDisplayTitle(this IScoreInfo scoreInfo) => $"{scoreInfo.User.Username} playing {scoreInfo.Beatmap.GetDisplayTitle()}"; public static string GetDisplayTitle(this IScoreInfo scoreInfo) => $"{scoreInfo.User.Username} playing {scoreInfo.Beatmap?.GetDisplayTitle() ?? "unknown"}";
/// <summary> /// <summary>
/// Orders an array of <see cref="ScoreInfo"/>s by total score. /// Orders an array of <see cref="ScoreInfo"/>s by total score.

View File

@ -34,7 +34,7 @@ namespace osu.Game.Scoring
{ {
var score = lookup.ScoreInfo; var score = lookup.ScoreInfo;
var attributes = await difficultyCache.GetDifficultyAsync(score.BeatmapInfo, score.Ruleset, score.Mods, token).ConfigureAwait(false); var attributes = await difficultyCache.GetDifficultyAsync(score.BeatmapInfo!, score.Ruleset, score.Mods, token).ConfigureAwait(false);
// Performance calculation requires the beatmap and ruleset to be locally available. If not, return a default value. // Performance calculation requires the beatmap and ruleset to be locally available. If not, return a default value.
if (attributes?.Attributes == null) if (attributes?.Attributes == null)

View File

@ -63,7 +63,7 @@ namespace osu.Game.Screens.Ranking
protected override APIRequest? FetchScores(Action<IEnumerable<ScoreInfo>>? scoresCallback) protected override APIRequest? FetchScores(Action<IEnumerable<ScoreInfo>>? scoresCallback)
{ {
if (Score.BeatmapInfo.OnlineID <= 0 || Score.BeatmapInfo.Status <= BeatmapOnlineStatus.Pending) if (Score.BeatmapInfo!.OnlineID <= 0 || Score.BeatmapInfo.Status <= BeatmapOnlineStatus.Pending)
return null; return null;
getScoreRequest = new GetScoresRequest(Score.BeatmapInfo, Score.Ruleset); getScoreRequest = new GetScoresRequest(Score.BeatmapInfo, Score.Ruleset);

View File

@ -4,9 +4,7 @@
using osu.Framework.Allocation; using osu.Framework.Allocation;
using osu.Game.Overlays.Dialog; using osu.Game.Overlays.Dialog;
using osu.Game.Scoring; using osu.Game.Scoring;
using System.Diagnostics;
using osu.Framework.Graphics.Sprites; using osu.Framework.Graphics.Sprites;
using osu.Game.Beatmaps;
namespace osu.Game.Screens.Select namespace osu.Game.Screens.Select
{ {
@ -20,11 +18,8 @@ namespace osu.Game.Screens.Select
} }
[BackgroundDependencyLoader] [BackgroundDependencyLoader]
private void load(BeatmapManager beatmapManager, ScoreManager scoreManager) private void load(ScoreManager scoreManager)
{ {
BeatmapInfo? beatmapInfo = beatmapManager.QueryBeatmap(b => b.ID == score.BeatmapInfoID);
Debug.Assert(beatmapInfo != null);
BodyText = $"{score.User} ({score.DisplayAccuracy}, {score.Rank})"; BodyText = $"{score.User} ({score.DisplayAccuracy}, {score.Rank})";
Icon = FontAwesome.Regular.TrashAlt; Icon = FontAwesome.Regular.TrashAlt;

View File

@ -111,7 +111,7 @@ namespace osu.Game.Users
protected string Username => score.User.Username; protected string Username => score.User.Username;
public BeatmapInfo BeatmapInfo => score.BeatmapInfo; public BeatmapInfo? BeatmapInfo => score.BeatmapInfo;
public WatchingReplay(ScoreInfo score) public WatchingReplay(ScoreInfo score)
{ {