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)会被误判为过旧而无法连服。

已知缺陷

  1. 无任何注册内容,ItemSchematic / ItemPrinter 等历史物品已被移除。这是从 Lunatrius 原版 Schematica 移植到 GTNH 的结果:原版 1.7.10 分支有「蓝图物品」和「投影器物品」,本仓库全部移除了,改用纯配置 + 键位驱动。因此 wiki 中不能沿用任何原版 Schematica wiki 的物品条目。

  2. CommandSchematicaDownload 是死类。CommonProxy.java:66-72 只注册 Save / List / Remove,CommandSchematicaDownload 全仓无实例化点。下载只能通过 /schematicaList 的交互入口触发。

  3. 保存时 TileEntity 失败会写入基岩。CommonProxy.java:144 在 reloadTileEntity 抛异常时执行 schematic.setBlock(localX, localY, localZ, Blocks.bedrock),即把失败的方块静默替换成基岩。玩家保存含异常 TileEntity 的机器时会得到一个基岩块,且没有聊天提示(只有 log 里的 error)。

  4. enableAlpha 默认 false 但 alpha 默认 1.0。两个配置项互相独立且默认组合意味着「透明度功能关闭 + 不透明度设为 1.0」,玩家必须同时开 alphaEnabled 并调低 alpha 才能看到半透明投影。

  5. destroyBlocks 标注为「仅创造模式」但代码未在此处校验。配置描述(Names.Config.DESC)写 “The printer will destroy blocks (creative mode only)”,实际检查在 client/printer/ 内,本条目未逐一验证其在生存模式下的最终行为。

  6. CommonProxy.GTNH 标志用 Loader.isModLoaded("dreamcraft") 探测(CommonProxy.java:46)。GTNH 整合包里 DreamCraft 与 GTNH 主 mod 同包加载,此探测能工作;但这是用 modid 猜整合包的脆弱做法,若整合包改名即失效。

  7. playerQuotaKilobytes 默认 8192(8 MB),远大于大多数玩家实际用量;但它对所有玩家生效且无分维度 / 分权限例外,服务端管理员需手动调高才能让玩家存大蓝图。

相关条目

  • 配置 - 24 项配置全表,含 9 格快捷栏开关默认值
  • 蓝图格式 - 存档结构、schemplus 格式与 NBT 转换
  • 指令 - 4 条服务器指令与权限