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

  1. Ensure the ruleset assembly for RulesetId is installed and enabled.
  2. Filter scores whose RulesetId is not in rulesets.AvailableRulesets before calling CreateScoreInfo.
  3. 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

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


AI-assisted analysis of ppy/osu@d9c73e12ad (2026-08-13). Data as JSON: /api/errors/fd4314e94a2cbca0. Report an issue: GitHub.