{"record":{"id":"7b71dd530d8318c2","repo":"Anuken/Mindustry","slug":"unknown-team-data-asstring-team-must-either","errorCode":null,"errorMessage":"Unknown team: ${data.asString()}. Team must either be a string or a number.","messagePattern":"Unknown team: (.+?)\\. Team must either be a string or a number\\.","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"core/src/mindustry/mod/ContentParser.java","lineNumber":397,"sourceCode":"        put(ConsumeLiquidBase.class, (type, data) -> {\n            var oc = resolve(data.getString(\"type\", \"\"), ConsumeLiquidBase.class);\n            data.remove(\"type\");\n            var consume = make(oc);\n            readFields(consume, data);\n            return consume;\n        });\n        put(Team.class, (type, data) -> {\n            if(data.isString()){\n                Team out = Structs.find(Team.baseTeams, t -> t.name.equals(data.asString()));\n                if(out == null) throw new IllegalArgumentException(\"Unknown team: \" + data.asString());\n                return out;\n            }else if(data.isNumber()){\n                if(data.asInt() >= Team.all.length || data.asInt() < 0){\n                    throw new IllegalArgumentException(\"Unknown team: \" + data.asString());\n                }\n                return Team.get(data.asInt());\n            }else{\n                throw new IllegalArgumentException(\"Unknown team: \" + data.asString() + \". Team must either be a string or a number.\");\n            }\n        });\n    }};\n    /** Stores things that need to be parsed fully, e.g. reading fields of content.\n     * This is done to accommodate binding of content names first.*/\n    private Seq<Runnable> reads = new Seq<>();\n    private Seq<Runnable> postreads = new Seq<>();\n    private ObjectSet<Object> toBeParsed = new ObjectSet<>();\n\n    @Nullable LoadedMod currentMod;\n    @Nullable Content currentContent;\n    @Nullable Fi currentFile;\n\n    private Json parser = new Json(){\n        @Override\n        protected <T> Class<T> resolveClass(String className){\n            if(allowClassResolution){\n                return super.resolveClass(className);","sourceCodeStart":379,"sourceCodeEnd":415,"githubUrl":"https://github.com/Anuken/Mindustry/blob/f695ad7e60323ebced984fa26d0bcf0bc54296b4/core/src/mindustry/mod/ContentParser.java#L379-L415","documentation":"Thrown by the Team parser when data is neither a string nor a number (e.g. an object, array, or boolean). Teams can only be addressed by base-team name or numeric ID.","triggerScenarios":"A mod JSON team field is an object or other non-scalar JSON value.","commonSituations":"Misformatted team value, e.g. wrapping the team in an object or passing a boolean.","solutions":["Provide the team as a string base-team name.","Or provide the team as a numeric ID."],"exampleFix":"// before\n\"team\": { \"name\": \"crux\" }\n// after\n\"team\": \"crux\"","handlingStrategy":"type-guard","validationCode":null,"typeGuard":"// Guard: team value must be a string or number.\nboolean isTeamRef(JsonValue v) { return v.isString() || v.isNumber(); }","tryCatchPattern":null,"preventionTips":["Provide team as a string name or numeric ID only.","Do not wrap team values in objects.","Lint JSON value types in mod files."],"tags":["modding","json","content-parser","team"],"backgroundTag":null,"analyzedSha":"f695ad7e60323ebced984fa26d0bcf0bc54296b4","analyzedAt":"2026-08-14T04:31:16.262Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}