{"record":{"id":"83008233fae717af","repo":"Anuken/Mindustry","slug":"unknown-matrix-transformation","errorCode":null,"errorMessage":"Unknown matrix transformation: '","messagePattern":"Unknown matrix transformation: '","errorType":"validation","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"core/src/mindustry/mod/ContentParser.java","lineNumber":300,"sourceCode":"                return new Mat3D().translate(data.getFloat(\"x\", 0f), data.getFloat(\"y\", 0f), data.getFloat(\"z\", 0f));\n            }\n\n            //transform array format\n            if(data.isArray() && data.size == 3){\n                return new Mat3D().setToTranslation(new Vec3(data.asFloatArray()));\n            }\n\n            Mat3D mat = new Mat3D();\n\n            //TODO this is kinda bad\n            for(var val : data){\n                switch(val.name){\n                    case \"translate\", \"trans\" -> mat.translate(parser.readValue(Vec3.class, data));\n                    case \"scale\", \"scl\" -> mat.scale(parser.readValue(Vec3.class, data));\n                    case \"rotate\", \"rot\" -> mat.rotate(parser.readValue(Vec3.class, data), data.getFloat(\"degrees\", 0f));\n                    case \"multiply\", \"mul\" -> mat.mul(parser.readValue(Mat3D.class, data));\n                    case \"x\", \"y\", \"z\" -> {}\n                    default -> throw new RuntimeException(\"Unknown matrix transformation: '\" + val.name + \"'\");\n                }\n            }\n\n            return mat;\n        });\n        put(Vec3.class, (type, data) -> {\n            if(data.isArray()) return new Vec3(data.asFloatArray());\n            return new Vec3(data.getFloat(\"x\", 0f), data.getFloat(\"y\", 0f), data.getFloat(\"z\", 0f));\n        });\n        put(Sound.class, (type, data) -> {\n            if(data.isArray()) return new RandomSound(parser.readValue(Sound[].class, data));\n\n            if(headless) return Sounds.none; //no reason to fetch on a server\n\n            var field = fieldOpt(Sounds.class, data);\n            //try grabbing it from the asset manager directly (relevant for data patches)\n            if(field == null) field = Core.assets.getOrNull(data.asString() + \".ogg\", Sound.class);\n            if(field == null) field = Core.assets.getOrNull(data.asString() + \".mp3\", Sound.class);","sourceCodeStart":282,"sourceCodeEnd":318,"githubUrl":"https://github.com/Anuken/Mindustry/blob/f695ad7e60323ebced984fa26d0bcf0bc54296b4/core/src/mindustry/mod/ContentParser.java#L282-L318","documentation":"Thrown by the Mat3D parser when iterating a matrix object's keys and encountering a name outside the allowed set (translate/trans, scale/scl, rotate/rot, multiply/mul, x/y/z). Unrecognized keys are rejected to prevent silent no-ops.","triggerScenarios":"A mod JSON matrix/transformation object contains a key with an unsupported or misspelled transformation name.","commonSituations":"Typos like \"translation\" or \"scaling\", or attempting a transform type Mat3D does not support in this parser.","solutions":["Use one of the supported transformation keys (translate/trans, scale/scl, rotate/rot, multiply/mul).","Check spelling and casing of the key."],"exampleFix":"// before\n{ \"translation\": [1, 0, 0] }\n// after\n{ \"translate\": [1, 0, 0] }","handlingStrategy":"validation","validationCode":"// Validate matrix object keys against the allowed transformation set.\nstatic final Set<String> ALLOWED = Set.of(\"translate\",\"trans\",\"scale\",\"scl\",\"rotate\",\"rot\",\"multiply\",\"mul\",\"x\",\"y\",\"z\");\nboolean validMatrix(JsonValue v) {\n    for (var c : v) if (!ALLOWED.contains(c.name)) return false;\n    return true;\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Use only supported transformation key names.","Double-check spelling/casing of transform keys.","Keep the allowed set documented near your content authoring."],"tags":["modding","json","content-parser","matrix","mat3d"],"backgroundTag":null,"analyzedSha":"f695ad7e60323ebced984fa26d0bcf0bc54296b4","analyzedAt":"2026-08-14T04:31:16.262Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}