{"record":{"id":"29f9e5d4cf167a26","repo":"ppy/osu","slug":"unknown-hit-object-type-split-3","errorCode":null,"errorMessage":"Unknown hit object type: {split[3]}","messagePattern":"Unknown hit object type: (.+?)","errorType":"exception","errorClass":"InvalidDataException","httpStatus":null,"severity":"error","filePath":"osu.Game/Rulesets/Objects/Legacy/ConvertHitObjectParser.cs","lineNumber":181,"sourceCode":"            }\r\n            else if (type.HasFlag(LegacyHitObjectType.Hold))\r\n            {\r\n                // Note: Hold is generated by BMS converts\r\n\r\n                double endTime = Math.Max(startTime, Parsing.ParseDouble(split[2]));\r\n\r\n                if (split.Length > 5 && !string.IsNullOrEmpty(split[5]))\r\n                {\r\n                    string[] ss = split[5].Split(':');\r\n                    endTime = Math.Max(startTime, Parsing.ParseDouble(ss[0]));\r\n                    readCustomSampleBanks(string.Join(':', ss.Skip(1)), bankInfo);\r\n                }\r\n\r\n                result = createHold(pos, endTime + offset - startTime);\r\n            }\r\n\r\n            if (result == null)\r\n                throw new InvalidDataException($\"Unknown hit object type: {split[3]}\");\r\n\r\n            result.StartTime = startTime;\r\n            result.LegacyType = type;\r\n\r\n            if (result.Samples.Count == 0)\r\n                result.Samples = convertSoundType(soundType, bankInfo);\r\n\r\n            firstObject = false;\r\n\r\n            return result;\r\n        }\r\n\r\n        private void readCustomSampleBanks(string str, SampleBankInfo bankInfo, bool banksOnly = false)\r\n        {\r\n            if (string.IsNullOrEmpty(str))\r\n                return;\r\n\r\n            string[] split = str.Split(':');\r","sourceCodeStart":163,"sourceCodeEnd":199,"githubUrl":"https://github.com/ppy/osu/blob/d9c73e12adff2feaae4a3e158d36fe5883faf6ca/osu.Game/Rulesets/Objects/Legacy/ConvertHitObjectParser.cs#L163-L199","documentation":"Thrown as InvalidDataException by ConvertHitObjectParser when, after dispatching on the type flags, no branch produced a hit object (result is still null). The type field did not match any known LegacyHitObjectType combination the parser handles.","triggerScenarios":"A beatmap hit-object line whose type field (split[3]) does not contain a recognized combination of flags (circle/slider/spinner/hold), or contains an unsupported combination.","commonSituations":"Corrupt beatmap; beatmap authored by a newer editor using type flags this parser version does not recognise; truncated/garbled line.","solutions":["Use a valid, non-corrupt beatmap file.","Update the parser/client to a version supporting the beatmap's format.","Catch InvalidDataException during import and skip the malformed beatmap."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"// type-field validity depends on the full LegacyHitObjectType flag set;\n// pre-validate that the type contains a recognised base flag before parsing.","typeGuard":"bool HasRecognisedType(LegacyHitObjectType t)\n    => t.HasFlag(LegacyHitObjectType.Circle) || t.HasFlag(LegacyHitObjectType.Slider)\n       || t.HasFlag(LegacyHitObjectType.Spinner) || t.HasFlag(LegacyHitObjectType.Hold);","tryCatchPattern":"try { parser.ParseLine(line); }\ncatch (InvalidDataException) { /* unknown type: skip or quarantine beatmap */ }","preventionTips":["Use beatmaps from trusted sources / the correct format version.","Update the parser for newer beatmap formats.","Catch and quarantine malformed beatmaps at import."],"tags":["beatmap","parser","validation","invalid-data"],"backgroundTag":null,"analyzedSha":"d9c73e12adff2feaae4a3e158d36fe5883faf6ca","analyzedAt":"2026-08-13T14:12:54.015Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}