diff --git a/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModStrictTracking.cs b/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModStrictTracking.cs index 66a60e3542..170d9830f2 100644 --- a/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModStrictTracking.cs +++ b/osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModStrictTracking.cs @@ -49,5 +49,59 @@ namespace osu.Game.Rulesets.Osu.Tests.Mods }, PassCondition = () => Player.ScoreProcessor.Combo.Value == 2 }); + + [Test] + public void TestRewind() + { + bool seekedBack = false; + bool missRecorded = false; + + CreateModTest(new ModTestData + { + Mod = new OsuModStrictTracking(), + Autoplay = false, + CreateBeatmap = () => new Beatmap + { + HitObjects = new List + { + new Slider + { + StartTime = 1000, + Path = new SliderPath + { + ControlPoints = + { + new PathControlPoint(), + new PathControlPoint(new Vector2(0, 100)) + } + } + } + } + }, + ReplayFrames = new List + { + new OsuReplayFrame(0, new Vector2(100, 0)), + new OsuReplayFrame(1000, new Vector2(100, 0)), + new OsuReplayFrame(1050, new Vector2()), + new OsuReplayFrame(1100, new Vector2(), OsuAction.LeftButton), + new OsuReplayFrame(1750, new Vector2(0, 100), OsuAction.LeftButton), + new OsuReplayFrame(1751, new Vector2(0, 100)), + }, + PassCondition = () => seekedBack && !missRecorded, + }); + AddStep("subscribe to new judgements", () => Player.ScoreProcessor.NewJudgement += j => + { + if (!j.IsHit) + missRecorded = true; + }); + AddUntilStep("wait for gameplay completion", () => Player.GameplayState.HasCompleted); + AddAssert("no misses", () => missRecorded, () => Is.False); + AddStep("seek back", () => + { + Player.GameplayClockContainer.Stop(); + Player.Seek(1040); + seekedBack = true; + }); + } } } diff --git a/osu.Game.Rulesets.Osu/Mods/OsuModStrictTracking.cs b/osu.Game.Rulesets.Osu/Mods/OsuModStrictTracking.cs index 7d2fd628f6..5ee8814b5a 100644 --- a/osu.Game.Rulesets.Osu/Mods/OsuModStrictTracking.cs +++ b/osu.Game.Rulesets.Osu/Mods/OsuModStrictTracking.cs @@ -16,6 +16,7 @@ using osu.Game.Rulesets.Osu.Judgements; using osu.Game.Rulesets.Osu.Objects; using osu.Game.Rulesets.Osu.Objects.Drawables; using osu.Game.Rulesets.UI; +using osu.Game.Screens.Play; namespace osu.Game.Rulesets.Osu.Mods { @@ -39,6 +40,9 @@ namespace osu.Game.Rulesets.Osu.Mods if (slider.Time.Current < slider.HitObject.StartTime) return; + if ((slider.Clock as IGameplayClock)?.IsRewinding == true) + return; + var tail = slider.NestedHitObjects.OfType().First(); if (!tail.Judged)