diff --git a/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/PathControlPointVisualiser.cs b/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/PathControlPointVisualiser.cs
index cbc2a20328..974b611533 100644
--- a/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/PathControlPointVisualiser.cs
+++ b/osu.Game.Rulesets.Osu/Edit/Blueprints/Sliders/Components/PathControlPointVisualiser.cs
@@ -117,14 +117,6 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders.Components
return true;
}
- // Make control points relative
- Vector2 first = slider.Path.ControlPoints[0].Position.Value;
- for (int i = 0; i < slider.Path.ControlPoints.Count; i++)
- slider.Path.ControlPoints[i].Position.Value = slider.Path.ControlPoints[i].Position.Value - first;
-
- // The slider's position defines the position of the first control point, and all further control points are relative to that point
- slider.Position += first;
-
// Since pieces are re-used, they will not point to the deleted control points while remaining selected
foreach (var piece in Pieces)
piece.IsSelected.Value = false;
diff --git a/osu.Game.Rulesets.Osu/Objects/Slider.cs b/osu.Game.Rulesets.Osu/Objects/Slider.cs
index b68595c67e..09657b2d47 100644
--- a/osu.Game.Rulesets.Osu/Objects/Slider.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Slider.cs
@@ -100,6 +100,8 @@ namespace osu.Game.Rulesets.Osu.Objects
{
SamplesBindable.ItemsAdded += _ => updateNestedSamples();
SamplesBindable.ItemsRemoved += _ => updateNestedSamples();
+
+ Path.OffsetChanged += offset => Position += offset;
}
protected override void ApplyDefaultsToSelf(ControlPointInfo controlPointInfo, BeatmapDifficulty difficulty)
diff --git a/osu.Game/Rulesets/Objects/SliderPath.cs b/osu.Game/Rulesets/Objects/SliderPath.cs
index f6e7c40e12..969cdcc463 100644
--- a/osu.Game/Rulesets/Objects/SliderPath.cs
+++ b/osu.Game/Rulesets/Objects/SliderPath.cs
@@ -16,6 +16,12 @@ namespace osu.Game.Rulesets.Objects
{
public class SliderPath
{
+ ///
+ /// Invoked when the offset of the path changes.
+ /// The provided value indicates the offset, and should be used to re-calculate the position of the containing drawable.
+ ///
+ public event Action OffsetChanged;
+
///
/// The current version of this . Updated when any change to the path occurs.
///
@@ -62,6 +68,20 @@ namespace osu.Game.Rulesets.Objects
foreach (var c in items)
c.Changed -= invalidate;
+ // Make all control points relative to the first one
+ if (ControlPoints.Count > 0)
+ {
+ Vector2 first = ControlPoints[0].Position.Value;
+
+ if (first != Vector2.Zero)
+ {
+ foreach (var c in ControlPoints)
+ c.Position.Value -= first;
+
+ OffsetChanged?.Invoke(first);
+ }
+ }
+
invalidate();
};
}