Ensure a non-null hitobject entry has a non-null Result

This commit is contained in:
ekrctb 2021-04-20 15:18:36 +09:00
parent 8a8b9084ef
commit c6ee4e900e

View File

@ -171,7 +171,10 @@ namespace osu.Game.Rulesets.Objects.Drawables
protected DrawableHitObject([CanBeNull] HitObject initialHitObject = null)
{
if (initialHitObject != null)
{
lifetimeEntry = new UnmanagedHitObjectEntry(initialHitObject);
ensureEntryHasResult();
}
}
[BackgroundDependencyLoader]
@ -239,13 +242,7 @@ namespace osu.Game.Rulesets.Objects.Drawables
LifetimeStart = lifetimeEntry.LifetimeStart;
LifetimeEnd = lifetimeEntry.LifetimeEnd;
// Ensure this DHO has a result.
lifetimeEntry.Result ??= CreateResult(HitObject.CreateJudgement())
?? throw new InvalidOperationException($"{GetType().ReadableName()} must provide a {nameof(JudgementResult)} through {nameof(CreateResult)}.");
// Copy back the result to the entry for potential future retrieval.
if (lifetimeEntry != null)
lifetimeEntry.Result = Result;
ensureEntryHasResult();
foreach (var h in HitObject.NestedHitObjects)
{
@ -799,6 +796,13 @@ namespace osu.Game.Rulesets.Objects.Drawables
/// <param name="judgement">The <see cref="Judgement"/> that provides the scoring information.</param>
protected virtual JudgementResult CreateResult(Judgement judgement) => new JudgementResult(HitObject, judgement);
private void ensureEntryHasResult()
{
Debug.Assert(lifetimeEntry != null);
lifetimeEntry.Result ??= CreateResult(HitObject.CreateJudgement())
?? throw new InvalidOperationException($"{GetType().ReadableName()} must provide a {nameof(JudgementResult)} through {nameof(CreateResult)}.");
}
protected override void Dispose(bool isDisposing)
{
base.Dispose(isDisposing);