Schematica
GTNH 的蓝图(schematic)文件导入导出与投影打印工具(原作者 Lunatrius)。它把世界区域存成 .schematic 文件、读回来,并在世界里渲染成半透明投影后逐格放置。
⚠️ 本 mod 注册 0 个方块、0 个物品、0 个实体、0 个 TileEntity、0 个多方块。 全部源码检索均无 registerItem / registerBlock / registerTileEntity 调用。它是本批 4 个 mod 中唯一完全零注册内容的一个。
| 项目 | 值 |
|---|---|
| modid | Schematica(首字母大写),见 Reference.java:8 的 MODID = "Schematica",与 gradle.properties 的 modId 一致 |
| 资源域 | 小写 schematica(assets/schematica/),与 modid 大小写不一致 |
| 网络通道 | schematica(PacketHandler.java:18,Reference.MODID.toLowerCase()) |
| 源仓库 | http://mc.lunatri.us/(mcmod.info 的 url) |
| 源 commit | 3b03ee9(2025-05-25) |
| Minecraft | 1.7.10 / Forge 10.13.4.1614 |
| 硬依赖 | LunatriusCore@[1.1.5,)(mcmod.info + dependencies.gradle 的 1.2.1-GTNH) |
| 可选依赖 | curse.maven:lotr-423748:4091561(compileOnly,Lord of the Rings Mod,仅编译期) |
| 主类 | com.github.lunatrius.schematica.Schematica(@Mod 在 Schematica.java:21) |
| 主源文件数 | 80 |
| GUI 配置界面 | 有(guiFactory = Reference.GUI_FACTORY) |
| 语言文件 | 33 个(en_US、zh_CN、ja_JP、ru_RU 等) |
方块 / 物品 / 实体 / 维度 / 多方块
全部为零。 这是本条目最重要的结论,逐条给证据:
$ grep -rn "registerItem(\|registerBlock(\|registerTileEntity(" src/main/java
(无输出)
$ grep -rn "GameRegistry.register" src/main/java
(无输出)
- 没有「投影器」(printer)方块。
client/printer/包下是渲染与放置逻辑,作用对象是玩家当前手持的原版物品(默认 TNT,见 键位与槽位 的swapSlot),而非某个专用方块。 - 没有「打印机」物品。保存 / 加载 / 投影全部通过配置项 + 键位 + 指令触发,不占用物品栏格子。
- 无 TileEntity,无多方块,无机器,无 GUI 容器。
- 不注册维度 / 群系 / 世界生成。
存档格式与投影流程
| 环节 | 实现 |
|---|---|
| 保存 | CommonProxy.saveSchematic(CommonProxy.java:171-216)按对角两点算包围盒,width/height/length 三轴各存 short |
| 逐区块复制 | copyChunkToSchematic(:112-169)逐方块读 getBlock + getBlockMetadata,有 TileEntity 的额外走 NBTHelper.reloadTileEntity |
| 失败降级 | TileEntity 转换失败时把该方块替换为 Blocks.bedrock(:144)而不是跳过 |
| 实体 | 保存区域内 getEntitiesWithinAABB 抓到的全部实体,逐个 reloadEntity 后写入(:160-168) |
| 投影渲染 | client/renderer/ + client/renderer/shader/alpha.frag(唯一的自定义着色器资源) |
| 放置 | client/printer/ + QueueTickHandler 队列,延迟逐格放置 |
格式开关:useSchematicplusFormat(默认 false)切换为支持更多方块 ID 的 schemplus 格式,且开启后只加载该格式的蓝图。
指令(4 条)
CommonProxy.serverStarting()(CommonProxy.java:66-72)在 serversideSchematicsEnabled 为 true 时注册。全部继承 1.7.10 原版 CommandBase,权限等级见 CommandSchematicaBase。
| 指令 | 类 | 作用 |
|---|---|---|
/schematicaSave |
CommandSchematicaSave |
保存指定区域为蓝图 |
/schematicaList |
CommandSchematicaList |
分页列出服务器蓝图(可下载 / 删除) |
/schematicaRemove |
CommandSchematicaRemove |
删除服务器蓝图(需二次确认) |
/schematicaDownload |
CommandSchematicaDownload |
下载服务器蓝图到本地 |
⚠️ CommandSchematicaDownload 存在但从未注册。CommonProxy.java:68-70 只注册了 Save / List / Remove 三个。下载功能通过 schematicaList 的交互入口完成(Names.Command.List.Message.DOWNLOAD),CommandSchematicaDownload 是死类。
配置(24 项,7 个 category)
ConfigurationHandler(handler/ConfigurationHandler.java),category 常量在 Names.Config.Category:debug / render / printer / printer.swapslots / tooltip / general / server。
render(7 项)
| 键 | 默认 | 作用 |
|---|---|---|
alphaEnabled |
false | 启用透明贴图 |
alpha |
1.0 | 投影不透明度(1.0 全不透明,0.5 半透明,0.0 全透明) |
highlight |
true | 高亮非法放置的方块与待放置方块 |
highlightAir |
true | 高亮「本应是空气」的方块 |
blockDelta |
0.005 | 高亮的深度偏移,出现 z-fighting 时调高 |
drawQuads |
true | 绘制面 |
drawLines |
true | 绘制轮廓线 |
printer(8 项 + 9 个槽位开关)
| 键 | 默认 | 作用 |
|---|---|---|
placeDelay |
1 | 两次放置尝试之间的间隔(tick) |
timeout |
10 | 重新尝试失败方块前的超时(tick) |
placeInstantly |
false | 一 tick 内放完所有可放置方块 |
destroyBlocks |
false | 打印机破坏方块(仅创造模式) |
destroyInstantly |
false | 一 tick 内破坏所有可破坏方块 |
placeAdjacent |
true | 仅当相邻位置有方块时才放置 |
tooltipEnabled |
true | 悬停蓝图方块时显示 tooltip |
tooltipX / tooltipY |
— | tooltip 相对偏移 |
printer.swapslots 类别下有 9 个 swapSlot 布尔项(对应 9 格快捷栏),默认值数组为 {false, false, false, false, false, true, true, true, true}——第 1–5 格禁用,第 6–9 格启用。
general(5 项)
| 键 | 默认 | 作用 |
|---|---|---|
useSchematicplusFormat |
false | 切换 schemplus 格式(支持更多方块 ID,但只加载该格式) |
schematicDirectory |
<数据目录>/schematics |
蓝图目录 |
extraAirBlocks |
{} |
渲染时视为空气的额外方块列表 |
sortType |
"" |
材料列表默认排序方式 |
showDebugInfo(debug 类) |
true | F3 调试屏显示额外信息 |
server(3 项)
| 键 | 默认 | 作用 |
|---|---|---|
printerEnabled |
true | 允许玩家使用投影打印 |
saveEnabled |
true | 允许保存蓝图 |
loadEnabled |
true | 允许加载蓝图 |
playerQuotaKilobytes |
8192 KB(8 MB) | 每玩家的服务器蓝图存储配额 |
serversideSchematicsEnabled |
true | 允许服务器端保存 / 下载 / 浏览蓝图(决定 4 条指令是否注册) |
网络封包(6 条)
PacketHandler.init()(network/PacketHandler.java:18-27):
| ID | 类 | 方向 |
|---|---|---|
| 0 | MessageCapabilities |
Side.CLIENT |
| 1 | MessageDownloadBegin |
Side.CLIENT |
| 2 | MessageDownloadBeginAck |
Side.SERVER |
| 3 | MessageDownloadChunk |
Side.CLIENT |
| 4 | MessageDownloadChunkAck |
Side.SERVER |
| 5 | MessageDownloadEnd |
Side.CLIENT |
下载走 network/transfer/ 包的分块传输协议(Begin → Ack → Chunk → Ack → End)。
供其他 mod 调用的 API
api/ISchematic.java(含 api/package-info.java 与 api/event/)暴露蓝图数据模型:
| 方法 | 用途 |
|---|---|
setBlock(x, y, z, block, metadata) |
写入方块 |
getBlockMetadata(x, y, z) |
读元数据 |
setTileEntity(x, y, z, tileEntity) |
写入 TileEntity |
setIcon(ItemStack) |
设置蓝图图标 |
getWidth() / getLength() / getHeight() |
三轴尺寸 |
client/printer/registry/ 另有打印机注册表,供其它 mod 注册自定义放置行为。
客户端版本闸门
Schematica.java:36-45 有 @NetworkCheckHandler:低于 1.11.0 的客户端被拒绝加入服务器,以保证配置项在客户端 / 服务端两侧一致。这是本 mod 唯一的服务端准入控制。
⚠️ 注意 mcmod.info 的 version 字段是 ${modVersion} 占位符,实际版本由 SchematicaVersion(generateGradleTokenClass)在构建期注入。判定用的是完整版本号字符串与 1.11.0 比较,因此 dev 构建(版本号形如 0.0.0)会被误判为过旧而无法连服。
已知缺陷
-
无任何注册内容,
ItemSchematic/ItemPrinter等历史物品已被移除。这是从 Lunatrius 原版 Schematica 移植到 GTNH 的结果:原版 1.7.10 分支有「蓝图物品」和「投影器物品」,本仓库全部移除了,改用纯配置 + 键位驱动。因此 wiki 中不能沿用任何原版 Schematica wiki 的物品条目。 -
CommandSchematicaDownload是死类。CommonProxy.java:66-72只注册 Save / List / Remove,CommandSchematicaDownload全仓无实例化点。下载只能通过/schematicaList的交互入口触发。 -
保存时 TileEntity 失败会写入基岩。
CommonProxy.java:144在reloadTileEntity抛异常时执行schematic.setBlock(localX, localY, localZ, Blocks.bedrock),即把失败的方块静默替换成基岩。玩家保存含异常 TileEntity 的机器时会得到一个基岩块,且没有聊天提示(只有 log 里的error)。 -
enableAlpha默认 false 但alpha默认 1.0。两个配置项互相独立且默认组合意味着「透明度功能关闭 + 不透明度设为 1.0」,玩家必须同时开alphaEnabled并调低alpha才能看到半透明投影。 -
destroyBlocks标注为「仅创造模式」但代码未在此处校验。配置描述(Names.Config.DESC)写 “The printer will destroy blocks (creative mode only)”,实际检查在client/printer/内,本条目未逐一验证其在生存模式下的最终行为。 -
CommonProxy.GTNH标志用Loader.isModLoaded("dreamcraft")探测(CommonProxy.java:46)。GTNH 整合包里 DreamCraft 与 GTNH 主 mod 同包加载,此探测能工作;但这是用 modid 猜整合包的脆弱做法,若整合包改名即失效。 -
playerQuotaKilobytes默认 8192(8 MB),远大于大多数玩家实际用量;但它对所有玩家生效且无分维度 / 分权限例外,服务端管理员需手动调高才能让玩家存大蓝图。