Litematic Format Notes
本文记录 Phase 1 已验证或明确采用的.litematic 语义。实现参考 Litematica
上游(LGPL-3.0)的公开源码,不复制其代码:
- LitematicaSchematic.java
- LitematicaBitArray.java
- SchematicMetadata.java
- 旧版 tight packing 对照:TightLongBackedIntArray.java
Standalone-Litematic-Renderer 没有 LICENSE,只用于观察行为,不作为代码或
资产来源。
1. 顶层结构
根 tag 是 Compound:Version 当前实现支持 1..=7。缺失或超出范围返回
UNSUPPORTED_LITEMATIC_VERSION。MinecraftDataVersion 缺失时记为 -1。
Metadata 和 Regions 缺失、类型错误或 Regions 为空时返回
INVALID_LITEMATIC。
2. Metadata
我们读取以下字段,缺失时保留None。这些值只作为提示,统计以实际方块数据
为准:
RegionCount、TotalVolume、TotalBlocks、BlockEntityCount、
BlockTickCount 与实际计算不一致时,产出 METADATA_MISMATCH 诊断。
EnclosingSize 与场景 bounds 不一致时同样产出诊断。
3. Region 字段
每个 region 是 Compound:Position 和 Size 也接受 List<Int>[3] 作为兼容形式。
3.1 负尺寸与坐标归一化
Litematica 的Size 是从 Position 指向对角的方向向量,因此可以是负数。
归一化规则:
Position = [10,20,30],Size = [-2,-3,-4],则
origin = [9,18,27],size = [2,3,4],体积 24。
任一轴 Size == 0、坐标超出配置范围或体积溢出时返回
INVALID_REGION_BOUNDS。
3.2 索引顺序
局部方块索引使用 x 最快、z 次之、y 最慢:4. BlockStatePalette 与 BlockStates
4.1 Palette
每个 palette 项是 Compound:- 没有命名空间时补
minecraft:。 Properties按键排序存入BTreeMap,形成规范BlockStateKey。- 空名称、含空白、多个冒号或非字符串属性返回
UNSUPPORTED_PALETTE_FORMAT/INVALID_PALETTE。 - 不执行 Minecraft datafixer 重命名。pre-1.13.2 数据版本保留原始名称并产出
UNSUPPORTED_DATA_VERSION诊断。
4.2 位宽
4.3 Packing
BlockStates 使用紧密 LSB-first packing,条目可以跨 64-bit 边界:
64 - start_bit 后拼接。bits 最大为 32,mask 为 (1 << bits) - 1。
LongArray 长度必须等于:
BLOCK_STATE_DATA_LENGTH_MISMATCH。每个索引必须小于 palette 长度,
否则返回 INVALID_PALETTE_INDEX,错误信息包含局部坐标。
示例:bits = 2,值 [0,1,2],打包结果为 0b10_01_00 = 36。
5. Block Entity
5.1 v1
TileEntities 元素是 wrapper:
5.2 v2+
TileEntities 元素直接是方块实体 NBT:
Pos: List<Int>[3] 作为兼容形式。
5.3 策略
- 坐标必须在
[0, size)内。越界条目产出OUT_OF_BOUNDS_BLOCK_ENTITY警告并丢弃,不让整个任务失败。 - 同一坐标重复时后一个覆盖前一个,产出
DUPLICATE_BLOCK_ENTITY警告。 - 缺少
id时使用unknown,产出MISSING_BLOCK_ENTITY_ID警告。 - 缺少位置或
TileNBT等结构错误返回INVALID_BLOCK_ENTITY。 BlockEntity.data保留完整原始 NBT,id和local_pos是提取出的索引。
6. Entities 与 Pending Ticks
Phase 1 只计数,不执行、不渲染:entity_countpending_block_tick_countpending_fluid_tick_count
ENTITIES_IGNORED / PENDING_TICKS_IGNORED 信息诊断。清单中保留
计数,后续渲染阶段再决定是否支持实体或 tick 状态。
7. Region 顺序与重叠
Regions 在 NBT 中是 Compound,解码后按键名字典序排序。该顺序是确定性的:
- 渲染时按排序后的 region 顺序覆盖,后面的 region 覆盖前面的 region。
- 每对重叠 region 产出
REGION_OVERLAP警告,包含重叠体积;最多输出 64 条, 其余合并为一条汇总诊断。 - 材料统计按 region 分别计数,重叠部分会在每个 region 中各计一次。清单中的
statistics.volume是各 region 体积之和,bounds.volume是联合包围盒体积, 两者可能不同。
8. 输入限制
默认值定义在LitematicLimits 和 DecodeLimits:
所有乘法、偏移和长度检查使用 checked arithmetic。超限返回
RESOURCE_LIMIT
或对应的专用错误。
9. 错误码
10. 验证
crates/litematic/tests/container.rs:容器、metadata、负尺寸、限额。crates/litematic/tests/region_data.rs:palette、packing、block entity。crates/litematic/tests/scene.rs:Scene、统计、metadata 诊断、重叠。crates/cli/tests/golden.rs:v1/v6/v7、多 region、负尺寸、全空气、33 项 palette 的 golden manifest。crates/litematic/tests/real_files.rs:通过LITEMATIC_FIXTURES_DIR运行 私有真实文件,默认 ignored。crates/nbt/tests/properties.rs与crates/scene/tests/properties.rs: 随机字节不 panic、packed index 往返。
11. 已知未覆盖
- pre-1.13 的 datafixer 重命名和旧 palette 变体。
- 实体与 pending tick 的执行/渲染。
- 方块实体类型化渲染(箱子、告示牌、旗帜等)。
- 资源包加载、模型 JSON、材质动画。
- 超过 64 对 region 重叠时诊断会汇总;完整重叠图需要后续阶段。