diff --git a/osu.Game.Rulesets.Osu/UI/OsuPlayfield.cs b/osu.Game.Rulesets.Osu/UI/OsuPlayfield.cs
index 994b3d9718..db8a47e4a2 100644
--- a/osu.Game.Rulesets.Osu/UI/OsuPlayfield.cs
+++ b/osu.Game.Rulesets.Osu/UI/OsuPlayfield.cs
@@ -90,7 +90,14 @@ namespace osu.Game.Rulesets.Osu.UI
private bool checkHittable(DrawableOsuHitObject osuHitObject)
{
- var lastObject = HitObjectContainer.AliveObjects.GetPrevious(osuHitObject);
+ DrawableHitObject lastObject = osuHitObject;
+
+ // Get the last hitobject that contributes to note lock
+ while ((lastObject = HitObjectContainer.AliveObjects.GetPrevious(lastObject)) != null)
+ {
+ if (contributesToNoteLock(lastObject.HitObject))
+ break;
+ }
// If there is no previous object alive, allow the hit.
if (lastObject == null)
@@ -166,10 +173,19 @@ namespace osu.Game.Rulesets.Osu.UI
}
///
- /// Whether a can be missed and causes other hitobjects to be missed during notelock.
+ /// Whether a is contributes to note lock.
+ /// Future contributing s will not be hittable until the start time of the last contributing is reached.
///
/// The to test.
- /// Whether contributes to notelock misses.
+ /// Whether causes note lock.
+ private bool contributesToNoteLock(HitObject hitObject)
+ => hitObject is HitCircle || hitObject is Slider;
+
+ ///
+ /// Whether a can be missed and causes other s to be missed when hit out-of-order during note lock.
+ ///
+ /// The to test.
+ /// Whether contributes to note lock misses.
private bool causesNoteLockMisses(HitObject hitObject)
=> hitObject is HitCircle && !(hitObject is SliderTailCircle);