ppy/osu · error · InvalidOperationException
Couldn't create score with unknown ruleset: {RulesetId}
Error message
Couldn't create score with unknown ruleset: {RulesetId} What it means
Thrown by MultiplayerScore.CreateScoreInfo when building a ScoreInfo from a multiplayer score and the score's RulesetId is not present in the local RulesetStore. Mirrors the SoloScoreInfo case but in the multiplayer results context.
Source
Thrown at osu.Game/Online/Rooms/MultiplayerScore.cs:90
/// <summary>
/// Any scores in the room around this score.
/// </summary>
[JsonProperty("scores_around")]
[CanBeNull]
public MultiplayerScoresAround ScoresAround { get; set; }
[JsonProperty("ruleset_id")]
public int RulesetId { get; set; }
[JsonProperty("beatmap_id")]
public int BeatmapId { get; set; }
public ScoreInfo CreateScoreInfo(ScoreManager scoreManager, RulesetStore rulesets, [NotNull] BeatmapInfo beatmap)
{
var ruleset = rulesets.GetRuleset(RulesetId);
if (ruleset == null)
throw new InvalidOperationException($"Couldn't create score with unknown ruleset: {RulesetId}");
var rulesetInstance = ruleset.CreateInstance();
var scoreInfo = new ScoreInfo
{
OnlineID = ID,
TotalScore = TotalScore,
MaxCombo = MaxCombo,
BeatmapInfo = beatmap,
Ruleset = ruleset,
Passed = Passed,
Statistics = Statistics,
MaximumStatistics = MaximumStatistics,
User = User,
Accuracy = Accuracy,
Date = EndedAt,
HasOnlineReplay = HasReplay,
Rank = Rank,
View on GitHub (pinned to d9c73e12ad)
Solutions
- Ensure the ruleset assembly for RulesetId is installed and enabled.
- Filter scores whose RulesetId is not in rulesets.AvailableRulesets before calling CreateScoreInfo.
- Catch InvalidOperationException at the results-rendering loop and skip the unresolvable score.
Example fix
// before var info = score.CreateScoreInfo(scoreManager, rulesets, beatmap); // after if (rulesets.GetRuleset(score.RulesetId) == null) continue; var info = score.CreateScoreInfo(scoreManager, rulesets, beatmap);
Defensive patterns
Strategy: validation
Validate before calling
if (rulesets.GetRuleset(score.RulesetId) == null)
continue; // skip scores whose ruleset is unavailable locally Type guard
RulesetInfo? ResolveRuleset(RulesetStore store, MultiplayerScore score)
=> store.GetRuleset(score.RulesetId); Try / catch
try { var info = score.CreateScoreInfo(scoreManager, rulesets, beatmap); }
catch (InvalidOperationException) { /* ruleset unavailable: skip the score */ } Prevention
- Filter multiplayer results by AvailableRulesets before creating ScoreInfo.
- Keep client rulesets in sync with the server's supported set.
- Log unresolved RulesetId for telemetry.
When it happens
Trigger: Calling CreateScoreInfo(scoreManager, rulesets, beatmap) where rulesets.GetRuleset(RulesetId) returns null. The multiplayer results payload references a ruleset the client cannot instantiate.
Common situations: Viewing multiplayer match results for a ruleset the client lacks (custom ruleset, version mismatch, disabled ruleset).
Related errors
- Ruleset with ID of {RulesetID} not found locally
- Ruleset with ID of {Score.RulesetID} not found locally
- Cannot create a multiplayer room while already in one.
- Cannot join a multiplayer room while already in one.
- Cannot join an inactive room.
AI-assisted analysis of ppy/osu@d9c73e12ad (2026-08-13).
Data as JSON: /api/errors/fd4314e94a2cbca0.
Report an issue: GitHub.