The table format uses a table with the following mandatory fields:
*`size`: Size of the schematic in nodes, vector
*`node_names`: List of node names
*`nodes`: List of node indices (into the `node_names` table)
*`param2s`: List of node `param2` values (numbers)
and the following optional fields:
*`light_values`: List of node `param1` (light) values (numbers)
*`metas`: Map from indices in the cuboid to metadata tables as produced by `minetest.get_meta(pos):to_table()`
A "vector" is a table with fields `x`, `y`, `z` for the 3 coordinates.
The `nodes`, `param2s` and `light_values` lists are in the order dictated by `VoxelArea:iterp` (Z-Y-X).
The cuboid indices for the `metas` table are calculated as `(z * size.y) + y * size.x + x` where `x`, `y`, `z` are relative to the min pos of the cuboid.
## Binary Format
The binary format uses modlib's Bluon to write the table format.
Since `param2s` (and optionally `light_values`) are all bytes, they are converted from lists of numbers to (byte)strings before writing.
For uncompressed files, it uses `MLBS` (short for "ModLib Bluon Schematic") for the magic bytes,
followed by the raw Bluon binary data.
For compressed files, it uses `MLZS` (short for "ModLib Zlib-compressed Schematic") for the magic bytes,
followed by the zlib-compressed Bluon binary data.
## API
### `schematic.setmetatable(obj)`
Sets the metatable of a table `obj` to the schematic metatable.
Useful if you've deserialized a schematic or want to create a schematic from the table format.
### `schematic.create(params, pos_min, pos_max)`
Creates a schematic from a map cuboid
*`params`: Table with fields
*`metas` (default `true`): Whether to store metadata
*`light_values`: Whether to bake light values (`param1`).
Usually not recommended, default `false`.
*`pos_min`: Minimum position of the cuboid, inclusive
*`pos_max`: Maximum position of the cuboid, inclusive
### `schematic:place(pos_min)`
"Inverse" to `schematic.create`: Places the schematic `self` starting at `pos_min`.
Content IDs (nodes), param1s, param2s, and metadata in the area will be completely erased and replaced; if light data is present, param1s will simply be set, otherwise they will be recalculated.
### `schematic:write_zlib_bluon(path)`
Write a binary file containing the schematic in *zlib-compressed* binary format to `path`.
**You should generally prefer this over `schematic:write_bluon`: zlib compression comes with massive size reductions.**
### `schematic.read_zlib_bluon(path)`
"Inverse": Read a binary file containing a schematic in *zlib-compressed* binary format from `path`, returning a `schematic` instance.
**You should generally prefer this over `schematic.read_bluon`: zlib compression comes with massive size reductions.**
### `schematic:write_bluon(path)`
Write a binary file containing the schematic in uncompressed binary format to `path`.
Useful only if you want to eliminate the time spent compressing.
### `schematic.read_bluon(path)`
"Inverse": Read a binary file containing a schematic in uncompressed binary format from `path`, returning a `schematic` instance.
Useful only if you want to eliminate the time spent decompressing.