Anuken/Mindustry · error · IOException

Invalid schematic: Too many blocks.

Error message

Invalid schematic: Too many blocks.

What it means

Thrown by Schematics.read when limitSchematicSize is enabled and the total block count read from the stream exceeds 128*128 (16384). This is the area-based cap complementing the dimension cap: even a small footprint schematic could in theory pack many blocks, so the total is bounded by the maximum grid area.

Solutions

  1. Reduce the block count (split or simplify the schematic) to <= 16384 tiles.
  2. Set Schematics.limitSchematicSize = false if oversized schematics are intentional.
  3. Re-export from a valid editor selection that fits the cap.

Example fix

// before
Schematic s = Schematics.read(input); // throws if total > 16384

// after
Schematics.limitSchematicSize = false;
Schematic s = Schematics.read(input);
Defensive patterns

Strategy: validation

Validate before calling

// if you know block count ahead of time
if(limitSchematicSize && total > 128*128){
    ui.showErrorMessage("Too many blocks (max " + (128*128) + ")");
    return;
}

Try / catch

try{ Schematic s = Schematics.read(input); }catch(IOException e){ ui.showErrorMessage("Schematic has too many blocks"); }

Prevention

When it happens

Trigger: A schematic whose 'total' field (stream.readInt()) is > 16384 with limitSchematicSize == true. Block count exceeding the 128x128 grid capacity.

Common situations: Densely packed schematics; schematics created by automation that exceed the block budget; combined/merged schematics that overflow.

Related errors


AI-assisted analysis of Anuken/Mindustry@f695ad7e60 (2026-08-14). Data as JSON: /api/errors/b6d744897c907b49. Report an issue: GitHub.

Appendix: source

Thrown at core/src/mindustry/game/Schematics.java:625

            String[] labels = null;

            //try to read the categories, but skip if it fails
            try{
                labels = JsonIO.read(String[].class, map.get("labels", "[]"));
            }catch(Exception ignored){}

            IntMap<Block> blocks = new IntMap<>();
            int length = stream.readUnsignedByte();
            for(int i = 0; i < length; i++){
                String name = stream.readUTF();
                Block block = Vars.content.getByName(ContentType.block, SaveFileReader.fallback.get(name, name));
                blocks.put(i, block == null || block instanceof LegacyBlock ? Blocks.air : block);
            }

            int total = stream.readInt();

            if(limitSchematicSize && total > 128 * 128) throw new IOException("Invalid schematic: Too many blocks.");

            Reads read = new Reads(stream);

            Seq<Stile> tiles = new Seq<>(total);
            for(int i = 0; i < total; i++){
                Block block = blocks.get(stream.readByte());
                int position = stream.readInt();
                Object config = ver == 0 ? mapConfig(block, stream.readInt(), position) : TypeIO.readObject(read, false, mapper);
                byte rotation = stream.readByte();
                if(block != Blocks.air){
                    tiles.add(new Stile(block, Point2.x(position), Point2.y(position), config, rotation));
                }
            }

            Schematic out = new Schematic(tiles, map, width, height);
            if(labels != null) out.labels.addAll(labels);
            return out;
        }

View on GitHub (pinned to f695ad7e60)