diff --git a/osu.Game/Utils/ModUtils.cs b/osu.Game/Utils/ModUtils.cs
index c18125054a..40db981ef0 100644
--- a/osu.Game/Utils/ModUtils.cs
+++ b/osu.Game/Utils/ModUtils.cs
@@ -112,7 +112,16 @@ namespace osu.Game.Utils
/// Invalid mods, if any were found. Will be null if all mods were valid.
/// Whether the input mods were all valid. If false, will contain all invalid entries.
public static bool CheckValidForGameplay(IEnumerable mods, [NotNullWhen(false)] out List? invalidMods)
- => checkValid(mods, m => m.Type != ModType.System && m.HasImplementation && !(m is MultiMod), out invalidMods, true);
+ {
+ mods = mods.ToArray();
+
+ // exclude multi mods from compatibility checks.
+ // the loop below automatically marks all multi mods as not valid for gameplay anyway.
+ if (!CheckCompatibleSet(mods.Where(m => !(m is MultiMod)), out invalidMods))
+ return false;
+
+ return checkValid(mods, m => m.Type != ModType.System && m.HasImplementation && !(m is MultiMod), out invalidMods);
+ }
///
/// Checks that all s in a combination are valid as "required mods" in a multiplayer match session.
@@ -121,7 +130,14 @@ namespace osu.Game.Utils
/// Invalid mods, if any were found. Will be null if all mods were valid.
/// Whether the input mods were all valid. If false, will contain all invalid entries.
public static bool CheckValidRequiredModsForMultiplayer(IEnumerable mods, [NotNullWhen(false)] out List? invalidMods)
- => checkValid(mods, m => m.IsPlayable(ModUsage.MultiplayerGlobal), out invalidMods, true);
+ {
+ mods = mods.ToArray();
+
+ if (!CheckCompatibleSet(mods, out invalidMods))
+ return false;
+
+ return checkValid(mods, m => m.IsPlayable(ModUsage.MultiplayerGlobal), out invalidMods);
+ }
///
/// Checks that all s in a combination are valid as "free mods" in a multiplayer match session.
@@ -130,20 +146,13 @@ namespace osu.Game.Utils
/// Invalid mods, if any were found. Will be null if all mods were valid.
/// Whether the input mods were all valid. If false, will contain all invalid entries.
public static bool CheckValidFreeModsForMultiplayer(IEnumerable mods, [NotNullWhen(false)] out List? invalidMods)
- => checkValid(mods, m => m.IsPlayable(ModUsage.MultiplayerLocal), out invalidMods, false);
+ => checkValid(mods, m => m.IsPlayable(ModUsage.MultiplayerLocal), out invalidMods);
- private static bool checkValid(IEnumerable mods, Predicate valid, [NotNullWhen(false)] out List? invalidMods, bool checkCompatibility)
+ private static bool checkValid(IEnumerable mods, Predicate valid, [NotNullWhen(false)] out List? invalidMods)
{
mods = mods.ToArray();
invalidMods = null;
- if (checkCompatibility)
- {
- // exclude multi mods from compatibility checks.
- // the loop below automatically marks all multi mods as not valid for gameplay anyway.
- CheckCompatibleSet(mods.Where(m => !(m is MultiMod)), out invalidMods);
- }
-
foreach (var mod in mods)
{
if (!valid(mod))