From 1d9aaac2c221a4e507df4019076f080e74f1a0b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Wed, 20 Jan 2021 23:55:54 +0100 Subject: [PATCH] Fix HOC not propagating DHO results applied on kill `DrawableHitObject.OnKilled()` calls `UpdateResult()` to clean up a hitobject's state definitively with regards to the judgement result before returning the DHO back to the pool. As it turns out, if a consumer was relying on this code path (as taiko was in the case of nested strong hit objects), it would not work properly with pooling, due to `HitObjectContainer` unsubscribing from `On{New,Revert}Result` *before* calling the DHO's `OnKilled()`. This in turn would lead to users potentially getting stuck in gameplay, due to `ScoreProcessor` not receiving all results via that event path. To resolve, change the call ordering to allow hit result changes applied in `OnKilled()` to propagate normally. --- osu.Game/Rulesets/UI/HitObjectContainer.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/osu.Game/Rulesets/UI/HitObjectContainer.cs b/osu.Game/Rulesets/UI/HitObjectContainer.cs index 12e39d4fbf..1972043ccb 100644 --- a/osu.Game/Rulesets/UI/HitObjectContainer.cs +++ b/osu.Game/Rulesets/UI/HitObjectContainer.cs @@ -124,9 +124,11 @@ namespace osu.Game.Rulesets.UI Debug.Assert(drawableMap.ContainsKey(entry)); var drawable = drawableMap[entry]; + + // OnKilled can potentially change the hitobject's result, so it needs to run first before unbinding. + drawable.OnKilled(); drawable.OnNewResult -= onNewResult; drawable.OnRevertResult -= onRevertResult; - drawable.OnKilled(); drawableMap.Remove(entry);