diff --git a/osu.Game/Rulesets/Mods/IMod.cs b/osu.Game/Rulesets/Mods/IMod.cs
index d5d1de91de..cda59bae55 100644
--- a/osu.Game/Rulesets/Mods/IMod.cs
+++ b/osu.Game/Rulesets/Mods/IMod.cs
@@ -39,6 +39,18 @@ namespace osu.Game.Rulesets.Mods
///
bool UserPlayable { get; }
+ ///
+ /// Whether this mod is playable in a multiplayer match.
+ /// Should be false for mods that affect the gameplay progress based on user input (e.g. ).
+ ///
+ bool PlayableInMultiplayer { get; }
+
+ ///
+ /// Whether this mod is valid to be a "free mod" in a multiplayer match.
+ /// Should be false for mods that affect the gameplay progress (e.g. and ).
+ ///
+ bool ValidFreeModInMultiplayer { get; }
+
///
/// Create a fresh instance based on this mod.
///
diff --git a/osu.Game/Rulesets/Mods/Mod.cs b/osu.Game/Rulesets/Mods/Mod.cs
index b2d4be54ce..a6562b4f4c 100644
--- a/osu.Game/Rulesets/Mods/Mod.cs
+++ b/osu.Game/Rulesets/Mods/Mod.cs
@@ -94,6 +94,12 @@ namespace osu.Game.Rulesets.Mods
[JsonIgnore]
public virtual bool UserPlayable => true;
+ [JsonIgnore]
+ public virtual bool PlayableInMultiplayer => UserPlayable;
+
+ [JsonIgnore]
+ public virtual bool ValidFreeModInMultiplayer => PlayableInMultiplayer;
+
[Obsolete("Going forward, the concept of \"ranked\" doesn't exist. The only exceptions are automation mods, which should now override and set UserPlayable to false.")] // Can be removed 20211009
public virtual bool Ranked => false;