diff --git a/osu.Game/Rulesets/Edit/Checks/CheckMutedObjects.cs b/osu.Game/Rulesets/Edit/Checks/CheckMutedObjects.cs
index 5b59a81f91..a2ae1764dd 100644
--- a/osu.Game/Rulesets/Edit/Checks/CheckMutedObjects.cs
+++ b/osu.Game/Rulesets/Edit/Checks/CheckMutedObjects.cs
@@ -64,7 +64,7 @@ namespace osu.Game.Rulesets.Edit.Checks
yield break;
// Samples that allow themselves to be overridden by control points have a volume of 0.
- int maxVolume = sampledHitObject.Samples.Max(sample => sample.Volume > 0 ? sample.Volume : sampledHitObject.SampleControlPoint.SampleVolume);
+ int maxVolume = sampledHitObject.Samples.Max(sample => sample.Volume);
double samplePlayTime = sampledHitObject.GetEndTime();
EdgeType edgeType = getEdgeAtTime(hitObject, samplePlayTime);
diff --git a/osu.Game/Rulesets/Edit/PlacementBlueprint.cs b/osu.Game/Rulesets/Edit/PlacementBlueprint.cs
index f810f51027..91dd7754d0 100644
--- a/osu.Game/Rulesets/Edit/PlacementBlueprint.cs
+++ b/osu.Game/Rulesets/Edit/PlacementBlueprint.cs
@@ -74,9 +74,9 @@ namespace osu.Game.Rulesets.Edit
/// Whether this call is committing a value for HitObject.StartTime and continuing with further adjustments.
protected void BeginPlacement(bool commitStart = false)
{
- var nearestSampleControlPoint = beatmap.HitObjects.LastOrDefault(h => h.GetEndTime() < HitObject.StartTime)?.SampleControlPoint?.DeepClone() as SampleControlPoint;
-
- HitObject.SampleControlPoint = nearestSampleControlPoint ?? new SampleControlPoint();
+ // Take the hitnormal sample of the last hit object
+ var lastHitNormal = beatmap.HitObjects.LastOrDefault(h => h.GetEndTime() < HitObject.StartTime)?.Samples?.FirstOrDefault(o => o.Name == HitSampleInfo.HIT_NORMAL);
+ HitObject.Samples.Add(lastHitNormal);
placementHandler.BeginPlacement(HitObject);
if (commitStart)
diff --git a/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs b/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs
index f6c3452e48..79fc778287 100644
--- a/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs
+++ b/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs
@@ -357,13 +357,7 @@ namespace osu.Game.Rulesets.Objects.Drawables
if (samples.Length <= 0)
return;
- if (HitObject.SampleControlPoint == null)
- {
- throw new InvalidOperationException($"{nameof(HitObject)}s must always have an attached {nameof(HitObject.SampleControlPoint)}."
- + $" This is an indication that {nameof(HitObject.ApplyDefaults)} has not been invoked on {this}.");
- }
-
- Samples.Samples = samples.Select(s => HitObject.SampleControlPoint.ApplyTo(s)).Cast().ToArray();
+ Samples.Samples = samples.Cast().ToArray();
}
private void onSamplesChanged(object sender, NotifyCollectionChangedEventArgs e) => LoadSamples();
diff --git a/osu.Game/Rulesets/UI/GameplaySampleTriggerSource.cs b/osu.Game/Rulesets/UI/GameplaySampleTriggerSource.cs
index e1c03e49e3..d4510a4519 100644
--- a/osu.Game/Rulesets/UI/GameplaySampleTriggerSource.cs
+++ b/osu.Game/Rulesets/UI/GameplaySampleTriggerSource.cs
@@ -52,7 +52,6 @@ namespace osu.Game.Rulesets.UI
return;
var samples = nextObject.Samples
- .Select(s => nextObject.SampleControlPoint.ApplyTo(s))
.Cast()
.ToArray();
diff --git a/osu.Game/Rulesets/UI/Playfield.cs b/osu.Game/Rulesets/UI/Playfield.cs
index b1c3b78e67..6016a53918 100644
--- a/osu.Game/Rulesets/UI/Playfield.cs
+++ b/osu.Game/Rulesets/UI/Playfield.cs
@@ -293,10 +293,10 @@ namespace osu.Game.Rulesets.UI
{
// prepare sample pools ahead of time so we're not initialising at runtime.
foreach (var sample in hitObject.Samples)
- prepareSamplePool(hitObject.SampleControlPoint.ApplyTo(sample));
+ prepareSamplePool(sample);
foreach (var sample in hitObject.AuxiliarySamples)
- prepareSamplePool(hitObject.SampleControlPoint.ApplyTo(sample));
+ prepareSamplePool(sample);
foreach (var nestedObject in hitObject.NestedHitObjects)
preloadSamples(nestedObject);