diff --git a/osu.Game.Tests/Mods/ModUtilsTest.cs b/osu.Game.Tests/Mods/ModUtilsTest.cs index b05b4c00b95c..f0f08e5a31fc 100644 --- a/osu.Game.Tests/Mods/ModUtilsTest.cs +++ b/osu.Game.Tests/Mods/ModUtilsTest.cs @@ -7,8 +7,10 @@ using Moq; using NUnit.Framework; using NUnit.Framework.Legacy; +using osu.Framework.Bindables; using osu.Framework.Extensions.TypeExtensions; using osu.Framework.Localisation; +using osu.Game.Configuration; using osu.Game.Online.Rooms; using osu.Game.Rulesets; using osu.Game.Rulesets.Catch; @@ -33,6 +35,17 @@ public void TestModIsNotCompatibleWithItself() Assert.That(invalid, Is.EquivalentTo(new[] { mod.Object })); } + [Test] + public void TestModIsNotCompatibleWithItselfEvenIfSettingsDiffer() + { + var mod1 = new Mock(); + var mod2 = new Mock(); + mod2.Setup(m => m.Setting).Returns(new BindableBool(true)); + + Assert.That(ModUtils.CheckCompatibleSet(new[] { mod1.Object, mod2.Object }, out var invalid), Is.False); + Assert.That(invalid, Is.EquivalentTo(new[] { mod2.Object })); + } + [Test] public void TestModIsCompatibleByItself() { @@ -397,6 +410,12 @@ public abstract class CustomMod2 : Mod, IModCompatibilitySpecification { } + public abstract class CustomMod3 : Mod, IModCompatibilitySpecification + { + [SettingSource("Setting")] + public virtual BindableBool Setting { get; } = new BindableBool(); + } + private class InvalidMultiplayerMod : Mod { public override string Name => string.Empty; diff --git a/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerMatchSubScreen.cs b/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerMatchSubScreen.cs index 379a589ca964..7a72178645ad 100644 --- a/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerMatchSubScreen.cs +++ b/osu.Game.Tests/Visual/Multiplayer/TestSceneMultiplayerMatchSubScreen.cs @@ -330,6 +330,33 @@ public void TestModSelectOverlay() AddAssert("score multiplier = 1.20", () => this.ChildrenOfType().Single().ModMultiplier.Value, () => Is.EqualTo(1.2).Within(0.01)); } + [Test] + public void TestModSelectOverlayNonDefaultSettings() + { + AddStep("add playlist item", () => + { + room.Playlist = + [ + new PlaylistItem(new TestBeatmap(new OsuRuleset().RulesetInfo).BeatmapInfo) + { + RulesetID = new OsuRuleset().RulesetInfo.OnlineID, + RequiredMods = + [ + new APIMod(new OsuModSuddenDeath { FailOnSliderTail = { Value = true } }), + ], + AllowedMods = [], + Freestyle = true + } + ]; + }); + ClickButtonWhenEnabled(); + + AddUntilStep("wait for join", () => RoomJoined); + + ClickButtonWhenEnabled(); + AddAssert("sudden death not visible", () => this.ChildrenOfType().Single().ChildrenOfType().Single(m => m.Mod is ModSuddenDeath).Visible == false); + } + [Test] public void TestChangeSettingsButtonVisibleForHost() { diff --git a/osu.Game/Utils/ModUtils.cs b/osu.Game/Utils/ModUtils.cs index e944b188f16b..01b0aab46b63 100644 --- a/osu.Game/Utils/ModUtils.cs +++ b/osu.Game/Utils/ModUtils.cs @@ -63,7 +63,7 @@ public static bool CheckCompatibleSet(IEnumerable combination, [NotNullWhen { var m = mods[j]; - if (candidate.Equals(m)) + if (candidate.GetType() == m.GetType()) { invalidMods ??= new List(); invalidMods.Add(m);