OpenBlocks

[!INFO] Git Commit: ed3d366 | Updated: 2026-10-02

OpenBlocks 是 GTNH 上体量最大的 1.7.10 模组之一,由 OpenMods 团队(作者 Mikee、NeverCast、boq、Lyqyd)维护,mcmod.info 描述语是 “All the things you never thought you will ever need”。它没有单一主题,而是把建筑辅助、垂直物流、液体经验、投影建造、地图绘制、装饰收集六套互不相干的系统塞进同一个 jar,条目跨度极大:40 个方块、29 个注册物品(展开为 52 个 meta 物品)、10 个实体、3 个附魔、17 个 FlimFlam 效果、25 种奖杯、7 个自定义配方、92 个配置项、1 个游戏规则、3 个指令。

身份标识

本模组的标识字符串分散在六个位置且大小写不一致,逐项核对如下:

# 字符串 值 来源
1 modid OpenBlocks(首字母大写) OpenBlocks.java:225 的 MODID,用于 @Mod(modid = OpenBlocks.MODID)(:218)
2 FML coremod 类 openblocks.OpenBlocksCorePlugin gradle.properties 的 coreModClass 与 modGroup 拼接;类实现在 OpenBlocksCorePlugin.java
3 资源域 openblocks(全小写) src/main/resources/assets/openblocks/;Stencil.java:37-38 的 "openblocks:stencil_" 与 "openblocks:stencilcover_" 直接印证
4 分类名 openblocks relation.md
5 目录名 openblocks data/openblocks/
6 jar 名 无法从本仓库单独确定 gradle.properties 中 customArchiveBaseName 被注释掉,jar 名由 GTNH 的 convention 插件决定;对比同族的 OpenModsLib(customArchiveBaseName = OpenModsLibs,注意多一个 s)可知这类项目常单独覆写,但 openblocks 没有

三处额外的大小写不一致

  • 经验液体的本地化前缀是大写 OpenBlocks.:Fluid.setUnlocalizedName("OpenBlocks.xpjuice")(OpenBlocks.java:505),对应语言键 fluid.OpenBlocks.xpjuice
  • coremod 依赖声明用的是 OpenModsLib 的 modid OpenMods,不是仓库名:dependencies = "required-after:OpenMods@[0.10.1,)"(OpenBlocks.java:230)
  • 注册名大小写不统一:blockPlacer / itemDropper 是驼峰(OpenBlocks.java:350、:353),其余方块全小写

依赖

硬依赖(1 个)

  • OpenModsLib(modid OpenMods,gradle.properties 的 api('com.github.GTNewHorizons:OpenModsLib:0.10.14:dev'),dependencies.gradle:4)。@Mod(dependencies) 要求版本 ≥ 0.10.1
  • 隐式依赖 Forge 10.13.4.1614(gradle.properties),未在 @Mod 中重复声明

软依赖(有真实代码路径)

  • OpenPeripheralCore —— 4 个外设适配器(ModuleAdapters.java:15-17)
  • ComputerCraft —— 1 个磁铁海龟升级,需与 OpenPeripheralCore 同时存在(ModuleTurtles.java:19-23)
  • Backhand —— 滑翔翼副手(EntityHangGlider.java:55)
  • Et Futurum Requiem —— 滑翔翼接管鞘翅(EntityHangGlider.java:167)
  • MFR —— 启动时无条件发 IMC 把行李箱加入刷怪笼黑名单(OpenBlocks.java:720-723)
  • NotEnoughItems —— IConfigureNEI 实现,但仓库内无 new NEIOpenBlocksConfig(),靠 NEI 的类路径扫描发现
  • Baubles / AdventureBackpack2 / CosmeticArmorReworked / GalacticCraft / Minecraft-Backpack-Mod / TinkersConstruct —— 墓碑自动收纳,按 common/ModPresence.java 的 7 个 Loader.isModLoaded 开关判断

参考 / 开发期依赖(devOnlyNonPublishable,不随 jar 分发)

Mobs-Info、Holoinventory、waila、NotEnoughItems。这三个在源码中无 import,用途无法从 openblocks 仓库核实。

技术要点

  • 无 @RegisterEntity 注解:实体全部手写 EntityRegistry.registerModEntity(OpenBlocks.java:637-698),共 10 个,ID 701~710
  • 只有一个 @Mod 类:openblocks.OpenBlocks(OpenBlocks.java:217-223)
  • coremod 与 ASM:OpenBlocksCorePlugin 只有一个 ASM 变换器 openblocks.asm.OpenBlocksClassTransformer,在 EntityPlayer.isInBed 上打补丁;它要求 OpenModsCorePlugin.CORE_MARKER 黑板键存在,否则 throw new IllegalStateException("OpenModsLib not present, not yet loaded or too old (needs at least 0.7.1)")
  • 配置有两套:Config.java 的 92 个 @ConfigProperty(28 分类),加上 ItemHangGlider.loadConfig 自建的 general.BlacklistedDimensions(39 个维度,默认禁用)
  • 已确认的缺陷:sponge.spongeRange 配置键被声明两次(Config.java:467 与 :471),导致海绵方块与海绵棒无法分别设置半径。详见配置页
  • 确认的死代码:MetasGeneric.cursor 被故意保留为空 meta 以稳定已有物品的索引,注释明确说明了理由(MetasGeneric.java:216-219)
  • 确认的容错缺陷:PlayerDeathHandler.java:320-322 的 Log.warn 未传入异常对象,堆栈被完全丢弃

方块列表

40 个方块按子系统归为 7 页:

物品列表

29 个注册物品展开为 52 个可获得物品(4 个 meta 家族展开),归为 5 页:

附魔列表

实体列表

  • 实体(10 个) - 无 @RegisterEntity 注解,全部手写注册;ID 701~710;12 个实体类中 3 个未注册

设置列表

集成列表

  • 外部模组集成 - 1 个硬依赖 + 7 个功能软依赖 + 6 个墓碑软依赖;磁铁海龟升级 ID 9260 作者自陈为临时值

API 列表

  • 模组 API 与扩展点 - 1 个静态门面 + 6 个 RPC 接口 + 5 个供外部实现的标记接口;IElevatorBlock 是最实质的对外扩展点

奖杯列表