1
0
mirror of https://github.com/ppy/osu.git synced 2026-05-13 20:33:35 +08:00

Fix edge case allowing almost-zero-length sliders to be placed during distance snapping

This commit is contained in:
Dean Herbert
2025-03-11 16:17:44 +09:00
Unverified
parent d4f0fc0fde
commit 23891b1994
6 changed files with 9 additions and 6 deletions
@@ -143,7 +143,7 @@ namespace osu.Game.Rulesets.Catch.Edit.Blueprints.Components
{
base.UpdateHitObjectFromPath(hitObject);
if (hitObject.Path.ControlPoints.Count <= 1 || !hitObject.Path.HasValidLength)
if (hitObject.Path.ControlPoints.Count <= 1 || !hitObject.Path.HasValidLengthForPlacement)
EditorBeatmap?.Remove(hitObject);
}
}
@@ -484,7 +484,7 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders.Components
// Snap the path to the current beat divisor before checking length validity.
hitObject.SnapTo(distanceSnapProvider);
if (!hitObject.Path.HasValidLength)
if (!hitObject.Path.HasValidLengthForPlacement)
{
for (int i = 0; i < hitObject.Path.ControlPoints.Count; i++)
hitObject.Path.ControlPoints[i].Position = oldControlPoints[i];
@@ -58,7 +58,7 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders
private readonly IncrementalBSplineBuilder bSplineBuilder = new IncrementalBSplineBuilder { Degree = 4 };
protected override bool IsValidForPlacement => HitObject.Path.HasValidLength;
protected override bool IsValidForPlacement => HitObject.Path.HasValidLengthForPlacement;
public SliderPlacementBlueprint()
: base(new Slider())
@@ -476,7 +476,7 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders
HitObject.SnapTo(distanceSnapProvider);
// If there are 0 or 1 remaining control points, or the slider has an invalid length, it is in a degenerate form and should be deleted
if (controlPoints.Count <= 1 || !HitObject.Path.HasValidLength)
if (controlPoints.Count <= 1 || !HitObject.Path.HasValidLengthForPlacement)
{
placementHandler?.Delete(HitObject);
return;
@@ -180,7 +180,7 @@ namespace osu.Game.Rulesets.Osu.Edit
Quad scaledQuad = GeometryUtils.GetSurroundingQuad(new OsuHitObject[] { slider });
(bool xInBounds, bool yInBounds) = isQuadInBounds(scaledQuad);
if (xInBounds && yInBounds && slider.Path.HasValidLength)
if (xInBounds && yInBounds && slider.Path.HasValidLengthForPlacement)
return;
for (int i = 0; i < slider.Path.ControlPoints.Count; i++)
+4 -1
View File
@@ -31,7 +31,10 @@ namespace osu.Game.Rulesets.Objects
/// </summary>
public readonly Bindable<double?> ExpectedDistance = new Bindable<double?>();
public bool HasValidLength => Precision.DefinitelyBigger(Distance, 0);
/// <summary>
/// Should be used to check whether placement can continue after a user editor operation.
/// </summary>
public bool HasValidLengthForPlacement => Precision.DefinitelyBigger(Distance, 0, 1);
/// <summary>
/// The control points of the path.