{"record":{"id":"7806ed507d72824a","repo":"Anuken/Mindustry","slug":"no-constructor-set-up-for-unit-assign-constr","errorCode":null,"errorMessage":"No constructor set up for unit '@': Assign `constructor = [your unit constructor]`. Vanilla defaults are:\n  \"flying\": UnitEntity::create\n  \"mech\": MechUnit::create\n  \"legs\": LegsUnit::create\n  \"naval\": UnitWaterMove::create\n  \"payload\": PayloadUnit::create\n  \"missile\": TimedKillUnit::create\n  \"tank\": TankUnit::create\n  \"hover\": ElevationMoveUnit::create\n  \"tether\": BuildingTetherPayloadUnit::create\n  \"crawl\": CrawlUnit::create","messagePattern":"No constructor set up for unit '@': Assign `constructor = \\[your unit constructor\\]`\\. Vanilla defaults are:\n  \"flying\": UnitEntity::create\n  \"mech\": MechUnit::create\n  \"legs\": LegsUnit::create\n  \"naval\": UnitWaterMove::create\n  \"payload\": PayloadUnit::create\n  \"missile\": TimedKillUnit::create\n  \"tank\": TankUnit::create\n  \"hover\": ElevationMoveUnit::create\n  \"tether\": BuildingTetherPayloadUnit::create\n  \"crawl\": CrawlUnit::create","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"core/src/mindustry/type/UnitType.java","lineNumber":854,"sourceCode":"        }\n\n        var reqs = getFirstRequirements();\n\n        if(reqs != null){\n            stats.add(Stat.buildCost, StatValues.items(reqs));\n        }\n\n        if(weapons.any()){\n            stats.add(Stat.weapons, StatValues.weapons(this, weapons));\n        }\n\n        if(immunities.size > 0){\n            stats.add(Stat.immunities, StatValues.statusEffects(immunities.toSeq().sort()));\n        }\n    }\n\n    protected void checkEntityMapping(Unit example){\n        if(constructor == null) throw new IllegalArgumentException(Strings.format(\"\"\"\n            No constructor set up for unit '@': Assign `constructor = [your unit constructor]`. Vanilla defaults are:\n              \"flying\": UnitEntity::create\n              \"mech\": MechUnit::create\n              \"legs\": LegsUnit::create\n              \"naval\": UnitWaterMove::create\n              \"payload\": PayloadUnit::create\n              \"missile\": TimedKillUnit::create\n              \"tank\": TankUnit::create\n              \"hover\": ElevationMoveUnit::create\n              \"tether\": BuildingTetherPayloadUnit::create\n              \"crawl\": CrawlUnit::create\n            \"\"\", name));\n\n        // Often modders improperly only sets `constructor = ...` without mapping. Try to mitigate that.\n        // In most cases, if the constructor is a Vanilla class, things should work just fine.\n        if(EntityMapping.map(name) == null) EntityMapping.nameMap.put(name, constructor);\n\n        // Sanity checks; this is an EXTREMELY COMMON pitfalls Java modders fall into.","sourceCodeStart":836,"sourceCodeEnd":872,"githubUrl":"https://github.com/Anuken/Mindustry/blob/f695ad7e60323ebced984fa26d0bcf0bc54296b4/core/src/mindustry/type/UnitType.java#L836-L872","documentation":"UnitType.checkEntityMapping requires a non-null constructor (the entity factory, e.g. UnitEntity::create) so the unit type can spawn entities. If constructor is null it throws IllegalArgumentException listing the vanilla defaults keyed by movement type. This runs during content init.","triggerScenarios":"A UnitType is defined (JSON or code) without assigning constructor before checkEntityMapping runs.","commonSituations":"Custom unit type with no constructor field; JSON omits the constructor; subclass forgets to set it in its constructor/init.","solutions":["Assign a constructor matching your unit's movement type (see the listed defaults).","For custom entity classes, register an entity mapping and supply your own factory.","Set constructor in code if defining the UnitType programmatically."],"exampleFix":"// before\npublic class MyUnitType extends UnitType {\n    public MyUnitType(String name){ super(name); } // constructor null -> throws\n}\n\n// after\npublic class MyUnitType extends UnitType {\n    public MyUnitType(String name){\n        super(name);\n        constructor = UnitEntity::create;\n    }\n}","handlingStrategy":"validation","validationCode":"// Ensure every UnitType has a constructor before init.\nif(unitType.constructor == null) {\n    throw new IllegalArgumentException(\"UnitType '\" + unitType.name + \"' has no constructor\");\n}","typeGuard":"boolean hasConstructor(UnitType t){ return t != null && t.constructor != null; }","tryCatchPattern":"try {\n    type.checkEntityMapping(example);\n} catch(IllegalArgumentException e) {\n    if(e.getMessage().startsWith(\"No constructor set up for unit\")) { /* assign constructor */ }\n    else throw e;\n}","preventionTips":["Always set constructor in the UnitType constructor for custom types.","In JSON, include the constructor assignment where supported.","Pick the factory matching your unit's movement type."],"tags":["modding","units","entities","content","api-misuse"],"backgroundTag":null,"analyzedSha":"f695ad7e60323ebced984fa26d0bcf0bc54296b4","analyzedAt":"2026-08-14T04:31:16.262Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}