diff --git a/osu.Game/Rulesets/Difficulty/DifficultyCalculator.cs b/osu.Game/Rulesets/Difficulty/DifficultyCalculator.cs
index db8bdde6bb..f31cce3c5f 100644
--- a/osu.Game/Rulesets/Difficulty/DifficultyCalculator.cs
+++ b/osu.Game/Rulesets/Difficulty/DifficultyCalculator.cs
@@ -37,6 +37,8 @@ namespace osu.Game.Rulesets.Difficulty
/// A structure describing the difficulty of the beatmap.
public DifficultyAttributes Calculate(params Mod[] mods)
{
+ mods = mods.Select(m => m.CreateCopy()).ToArray();
+
beatmap.Mods.Value = mods;
IBeatmap playableBeatmap = beatmap.GetPlayableBeatmap(ruleset.RulesetInfo);
@@ -55,9 +57,9 @@ namespace osu.Game.Rulesets.Difficulty
foreach (var combination in CreateDifficultyAdjustmentModCombinations())
{
if (combination is MultiMod multi)
- yield return Calculate(multi.Mods);
+ yield return Calculate(multi.Mods.Select(m => m.CreateCopy()).ToArray());
else
- yield return Calculate(combination);
+ yield return Calculate(combination.CreateCopy());
}
}
diff --git a/osu.Game/Rulesets/Mods/Mod.cs b/osu.Game/Rulesets/Mods/Mod.cs
index 705c5c4ef6..1f9907caa7 100644
--- a/osu.Game/Rulesets/Mods/Mod.cs
+++ b/osu.Game/Rulesets/Mods/Mod.cs
@@ -65,5 +65,10 @@ namespace osu.Game.Rulesets.Mods
///
[JsonIgnore]
public virtual Type[] IncompatibleMods => new Type[] { };
+
+ ///
+ /// Creates a copy of this initialised to a default state.
+ ///
+ public virtual Mod CreateCopy() => (Mod)Activator.CreateInstance(GetType());
}
}