蓝图格式
基本信息
| 属性 | 值 |
|---|---|
| 抽象基类 | com.github.lunatrius.schematica.world.schematic.SchematicFormat |
| 已注册格式数 | 2(Alpha、Litematica) |
| 默认格式 | FORMAT_DEFAULT = Names.NBT.FORMAT_ALPHA = "Alpha"(world/schematic/SchematicFormat.java:107) |
| 注册表 | static final Map<String, SchematicFormat> FORMATS(world/schematic/SchematicFormat.java:20) |
| 格式标识键 | NBT 根节点下的 Materials 字段(reference/Names.java:245、:246-247) |
| 压缩写出 | CompressedStreamTools.writeCompressed(tag, FileOutputStream)(world/schematic/SchematicFormat.java:89) |
注册表在静态块中填充(world/schematic/SchematicFormat.java:103-108):
FORMATS.put(Names.NBT.FORMAT_ALPHA, new SchematicAlpha());
FORMATS.put("Litematica", new SchematicLitematica());
FORMAT_DEFAULT = Names.NBT.FORMAT_ALPHA;
⚠️ Names.NBT.FORMAT_CLASSIC = "Classic"(reference/Names.java:246)是死常量——全仓库只有这一处声明,FORMATS 中没有注册任何 Classic 格式实现。读入 Materials 为 Classic 的旧版蓝图会在 SchematicFormat.readFromFile 抛 UnsupportedFormatException(:59-61)。
功能
读取分派
SchematicFormat.readFromFile(File)(world/schematic/SchematicFormat.java:32-69)按文件后缀分派:
- 文件名小写后以
.litematic结尾 → 走LitematicaNBTReader.readFromFile自定义解析器,交给FORMATS.get("Litematica")(:35-52)。自定义解析器用于处理TAG_Long_Array(1.7.10 NBT 无此类型,:34注释),读完后调clearLongArrayStore()释放旁路存储(:45、:48)。 - 其余 → 走标准
SchematicUtil.readTagCompoundFromFile,读根节点Materials字符串查表(:54-57)。查不到则抛UnsupportedFormatException(:59-61)。
writeToFile 在序列化前向 MinecraftForge.EVENT_BUS 投递 PostSchematicCaptureEvent(:77-78),写完用 FORMAT_DEFAULT 对应的实现(:82-83)。
Alpha 格式
com.github.lunatrius.schematica.world.schematic.SchematicAlpha(:32)是本仓库自有的扩展 ID 格式,读与写各有两套分支。
写出时写入的 NBT 字段(world/schematic/SchematicAlpha.java:195-197、:281-284 与 :300-302、:393-397):
| 字段 | 类型 | 含义 |
|---|---|---|
Materials |
String | 固定写 Names.NBT.FORMAT_ALPHA = "Alpha"(:281、:393) |
Width / Length / Height |
short | 三轴尺寸(:195-197、:300-302) |
Blocks |
byte[] | 方块 ID |
Data |
byte[] | 元数据 |
AddBlocks / Add |
byte[] | 超出 byte 范围的扩展方块 ID(Names.NBT.BLOCKS / ADD_BLOCKS / ADD_BLOCKS_SCHEMATICA,reference/Names.java:250,252,253) |
SchematicaMapping |
NBTTagCompound | 旧 ID → 新 ID 映射(Names.NBT.MAPPING_SCHEMATICA,reference/Names.java:258;写出见 :273-278、:385-390) |
其他 NBT 键定义在 Names.NBT(reference/Names.java:241-262):Schematic(根)、Icon、TileEntities、Entities、ExtendedMetadata、Materials、Format 相关、以及 MAPPING = "..."(带 // TODO: use this once MCEdit adds support for it 注释,:257)。
读入时若 useSchematicplusFormat 为 true,走扩展 ID 分支,并从 SchematicaMapping 复合标签重建 oldToNew 映射(world/schematic/SchematicAlpha.java:38-57)。
写出前投递 PreSchematicSaveEvent(world/schematic/SchematicAlpha.java:273、:385),其携带 extendedMetadata 与 replaceMapping 方法(api/event/PreSchematicSaveEvent.java:27,53)供其他 mod 改写映射。
SchematicFormat.saveNBT(默认 true)与 saveEntities(默认 false)控制 TileEntity NBT 与实体的保存(world/schematic/SchematicFormat.java:24-26)。
Litematica 格式
com.github.lunatrius.schematica.world.schematic.SchematicLitematica(:31)只读不写:writeToNBT 直接打 warn 日志 "Writing .litematic format is not supported." 并返回 false(world/schematic/SchematicLitematica.java:44-47)。
这是本仓库自身实现的 1.7.10 端 .litematic 解析器,不是 Litematica mod 的 API 集成——它不依赖 Litematica mod 加载,直接按 .litematic 的 NBT 结构解析:Version、Metadata、Regions 三个根字段(world/schematic/SchematicLitematica.java:50-54),Regions 为空则报 "No regions found in .litematic file!" 并返回 null(:56-59)。
每个 region 读 Position 与 Size 复合标签(:72-77),并用 globalMinX/Y/Z、globalMaxX/Y/Z 六个变量做全图包围盒归一(:67-70)。
读取依赖 compat/ 包的翻译层:BlockStateTranslator / EntityTranslator / TileEntityTranslator / BlockMapping(world/schematic/SchematicLitematica.java:22-25),见 API 与兼容。
⚠️ 跨版本内容隔离说明:.litematic 是 Minecraft 1.13+ 时代的存档格式,Litematica 是 1.21 mod。本仓库不依赖 Litematica mod,仅自行实现其文件格式的读取器;本条目不涉及仓库外 Litematica mod 的任何行为。
数值
| 数值名 | 值 | 来源 |
|---|---|---|
| 已注册格式数 | 2 | world/schematic/SchematicFormat.java:104-105 |
| 默认格式 | Alpha |
world/schematic/SchematicFormat.java:107 |
.litematic 可写 |
否(writeToNBT 返回 false) |
world/schematic/SchematicLitematica.java:44-47 |
saveNBT 默认 |
true |
world/schematic/SchematicFormat.java:24 |
saveEntities 默认 |
false |
world/schematic/SchematicFormat.java:26 |
| 死格式常量 | Classic |
reference/Names.java:246(无注册) |
保存时的三轴尺寸在 CommonProxy.saveSchematic 中各取 short(proxy/CommonProxy.java:224-226)。
交互
保存失败时 writeToNBT 抛异常会被 writeToFile 捕获并打 error 日志返回 false(world/schematic/SchematicFormat.java:92-95)。
保存过程中若某个 TileEntity 的 NBT 转换失败,copyChunkToSchematic 会把该方块替换为 Blocks.bedrock(proxy/CommonProxy.java:173-176)而非跳过,且无聊天提示(仅 log error)。
实体转换失败则只记 error 并跳过该实体(proxy/CommonProxy.java:197-198)。
保存时优先从服务端世界取 TileEntity 以获得完整 NBT(库存等),拿不到才回退客户端世界(proxy/CommonProxy.java:120-133、:162-166)。