{"record":{"id":"fd4314e94a2cbca0","repo":"ppy/osu","slug":"couldn-t-create-score-with-unknown-ruleset-rules","errorCode":null,"errorMessage":"Couldn't create score with unknown ruleset: {RulesetId}","messagePattern":"Couldn't create score with unknown ruleset: (.+?)","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"osu.Game/Online/Rooms/MultiplayerScore.cs","lineNumber":90,"sourceCode":"\r\n        /// <summary>\r\n        /// Any scores in the room around this score.\r\n        /// </summary>\r\n        [JsonProperty(\"scores_around\")]\r\n        [CanBeNull]\r\n        public MultiplayerScoresAround ScoresAround { get; set; }\r\n\r\n        [JsonProperty(\"ruleset_id\")]\r\n        public int RulesetId { get; set; }\r\n\r\n        [JsonProperty(\"beatmap_id\")]\r\n        public int BeatmapId { get; set; }\r\n\r\n        public ScoreInfo CreateScoreInfo(ScoreManager scoreManager, RulesetStore rulesets, [NotNull] BeatmapInfo beatmap)\r\n        {\r\n            var ruleset = rulesets.GetRuleset(RulesetId);\r\n            if (ruleset == null)\r\n                throw new InvalidOperationException($\"Couldn't create score with unknown ruleset: {RulesetId}\");\r\n\r\n            var rulesetInstance = ruleset.CreateInstance();\r\n\r\n            var scoreInfo = new ScoreInfo\r\n            {\r\n                OnlineID = ID,\r\n                TotalScore = TotalScore,\r\n                MaxCombo = MaxCombo,\r\n                BeatmapInfo = beatmap,\r\n                Ruleset = ruleset,\r\n                Passed = Passed,\r\n                Statistics = Statistics,\r\n                MaximumStatistics = MaximumStatistics,\r\n                User = User,\r\n                Accuracy = Accuracy,\r\n                Date = EndedAt,\r\n                HasOnlineReplay = HasReplay,\r\n                Rank = Rank,\r","sourceCodeStart":72,"sourceCodeEnd":108,"githubUrl":"https://github.com/ppy/osu/blob/d9c73e12adff2feaae4a3e158d36fe5883faf6ca/osu.Game/Online/Rooms/MultiplayerScore.cs#L72-L108","documentation":"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.","triggerScenarios":"Calling CreateScoreInfo(scoreManager, rulesets, beatmap) where rulesets.GetRuleset(RulesetId) returns null. The multiplayer results payload references a ruleset the client cannot instantiate.","commonSituations":"Viewing multiplayer match results for a ruleset the client lacks (custom ruleset, version mismatch, disabled ruleset).","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."],"exampleFix":"// before\nvar info = score.CreateScoreInfo(scoreManager, rulesets, beatmap);\n\n// after\nif (rulesets.GetRuleset(score.RulesetId) == null) continue;\nvar info = score.CreateScoreInfo(scoreManager, rulesets, beatmap);","handlingStrategy":"validation","validationCode":"if (rulesets.GetRuleset(score.RulesetId) == null)\n    continue; // skip scores whose ruleset is unavailable locally","typeGuard":"RulesetInfo? ResolveRuleset(RulesetStore store, MultiplayerScore score)\n    => store.GetRuleset(score.RulesetId);","tryCatchPattern":"try { var info = score.CreateScoreInfo(scoreManager, rulesets, beatmap); }\ncatch (InvalidOperationException) { /* ruleset unavailable: skip the score */ }","preventionTips":["Filter multiplayer results by AvailableRulesets before creating ScoreInfo.","Keep client rulesets in sync with the server's supported set.","Log unresolved RulesetId for telemetry."],"tags":["multiplayer","score","ruleset","invalid-operation"],"backgroundTag":null,"analyzedSha":"d9c73e12adff2feaae4a3e158d36fe5883faf6ca","analyzedAt":"2026-08-13T14:12:54.015Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}