OpenModsLib

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

OpenModsLib 是 OpenMods 团队的基础库模组(mcmod.info 描述为 “Boring stuff for all that silly Open* mods”),为同团队的 OpenBlocks、OpenPeripheral、OpenComputers 提供共享代码。它不注册任何方块、物品或合成配方——全部价值在代码与 API:1 个 coremod(6 个原版类字节码补丁)、1 个数学表达式引擎(213 个类、5 种数值后端)、4 条网络通道、19 个可混入的公开接口,以及 9 条玩家指令。

项目起源是 OpenBlocks 与 OpenPeripheral 的公共代码抽取。README 明确警告:“NEVER LET IT GO ABOVE 0.10.x”,因为其它 mod 依赖其 0.10.x 的 API 形态。维护者为 Mikee、NeverCast、boq、Lyqyd,官网 https://openmods.info/。

五个名称互不相同

本条目涉及 5 个独立字符串,没有任何两个完全相同(除分类名与资源域恰好同形外),阅读源码或排查资源问题时必须分别确认:

名称类型 实际值 来源
modid OpenMods src/main/java/openmods/OpenMods.java:52 的 public static final String MODID = "OpenMods",并作为 @Mod(modid = OpenMods.MODID) 使用(:46)
资源域 openmodslib 资源目录 src/main/resources/assets/openmodslib/(lang / sounds.json / textures 均在此下)
分类名 openmodslib data/relation.md 分类行(驼峰转小写规则)
仓库目录名 OpenModsLib /Users/evlos/a/mirror/OpenModsLib(大小写经 git ls-files 与 os.listdir 双重确认;同目录另有独立仓库 OpenModularTurrets,勿混淆)
jar 名 OpenModsLibs gradle.properties 的 customArchiveBaseName = OpenModsLibs(注意结尾多一个 s)

modid OpenMods ≠ 分类名 openmodslib,且资源域又是第三种写法。查找资源文件时应搜 assets/openmodslib/,查找 mod 注册名时应搜 OpenMods。

另有一个 FML 容器 modid OpenModsCore(src/main/java/openmods/core/OpenModsCore.java:23-24),由 @Mod(dependencies = "required-after:OpenModsCore")(OpenMods.java:48)声明为硬前置 —— 但它由本 mod 自身的 coremod 提供,不是外部依赖。

版本与语言

  • Minecraft 1.7.10 / Forge 10.13.4.1614 —— 证据为 gradle.properties 的 minecraftVersion = 1.7.10 与 forgeVersion = 10.13.4.1614;OpenModsCorePlugin 另标注 @MCVersion("1.7.10")(src/main/java/openmods/core/OpenModsCorePlugin.java:16)
  • 纯 Java:712 个 .java 文件(src/main/java 675 + src/test/java 37),0 个 .kt、0 个 .scala
  • 引用提交 e5e8177f2dd2297d5aea6bb733955a67ffa63c95(git cat-file -t 验证为 commit)。未采用 git describe 作为版本判据:该仓库是 depth-1 浅克隆(git rev-list --count HEAD = 1,存在 .git/shallow),轻量标签 0.10.14 虽与 versionPattern = 0.10.d+(-pre|-snapshot)? 吻合,但浅克隆的标签不足以证明工作树的 MC 版本,故以 gradle.properties 的显式声明为准
  • 构建使用 com.gtnewhorizons.gtnhconvention 插件(RetroFuturaGradle 系),故 version_gate.py 的形态 ① 可正常解析

依赖关系

类型 内容 依据
硬依赖 无外部 mod @Mod(dependencies = "required-after:OpenModsCore") 指向自带的 coremod 容器(OpenMods.java:48)
软依赖(编译期) com.github.GTNewHorizons:BuildCraft:7.1.57:api dependencies.gradle:4 声明为 compileOnly;仅 BuildCraftPipes.java:9 导入 buildcraft.api.transport.IPipeTile,并在 :18 用 classExists(...) 做运行时探测
软依赖(运行时探测) TConstruct、ExtraUtilities、BiomesOPlenty src/main/java/openmods/utils/render/PaintUtils.java:38,41,44 的 Loader.isModLoaded(...)
仅声明未使用 Mods.java 中另外 55 个 modid 常量 src/main/java/openmods/Mods.java 共声明 58 个 modid 常量(:6-64),但全仓库仅 3 个被实际引用(见下)

Mods.java 的常量清单极易被误读为依赖列表。逐条核对 Mods.<NAME> 的真实引用点后确认:58 个常量中只有 TINKERSCONSTRUCT(“TConstruct”)、EXTRAUTILITIES(“ExtraUtilities”)、BIOMESOPLENTY(“BiomesOPlenty”)出现在 PaintUtils.java,其余 55 个(如 OpenComputers、ArsMagica2、Thaumcraft)在全仓库无任何引用,属历史遗留清单,不构成依赖。

源码中不存在 FML 的 @Optional 依赖声明(@OptionalArgs 是计算器引擎的函数派发注解,与依赖无关)。

注册内容(仅计生效项)

类别 数量 说明
@Mod 类 1 openmods.OpenMods(OpenMods.java:51)
DummyModContainer 子类 1 openmods.core.OpenModsCore(非 @Mod,coremod 专用)
IFMLLoadingPlugin 实现 1 openmods.core.OpenModsCorePlugin
方块 0 GameRegistry.registerBlock 仅出现在 GameConfigProvider(供下游用的 API),OpenModsLib 自身未调用
物品 0 同上,GameRegistry.registerItem 仅在 GameConfigProvider.java:210,213
TileEntity 0 GameRegistry.registerTileEntity 仅在 GameConfigProvider.java:291,299
实体 1 EntityBlock,id 804(OpenMods.java:54 常量、:107 注册)
合成配方 0 无
原版类 ASM 补丁 6 见coremod 补丁
网络通道 4 见网络与同步 API
指令 9 见指令总览
键位 1 CalcKey,默认 =,名称 “Open Calculator”
配置 GUI 1 GuiFactory.ConfigScreen(@Mod(guiFactory = "openmods.GuiFactory"),OpenMods.java:49)
崩溃报告条目 3 变换器状态、注入器安全检查、模板缓冲状态
配置属性 4 见OpenModsLib 配置
语言文件 5 en_US / zh_CN / es_ES / ru_RU / pt_BR,均属资源域 openmodslib

玩家功能总览

对玩家而言,OpenModsLib 只有一个直接可见的功能:数学计算器。按 = 键即在聊天框预填 = ,可用 /=eval、/=let、/=fun、/=config、/=execute 求值表达式、定义变量函数、切换 5 种数值后端(浮点 / 分数 / 大整数 / 布尔 / 多类型)并执行 <游戏目录>/scripts 下的脚本。另有 /om_config_* 配置读写与 /om_source_* 类来源诊断。

其余 90% 的功能(coremod 补丁、接口混入、网络层、渲染钩子)都是为下游 mod 提供的基础设施,在游戏内不可见。

已核实缺陷

以下 4 项均经源码逐行核对,可在对应条目查看完整证据:

  1. TypedCalcConstants 常量名与取值互换 —— SYMBOL_FALSE = "true"、SYMBOL_TRUE = "false"(TypedCalcConstants.java:14-15)。求值行为正确,仅命名误导。见多类型值系统
  2. /=config push 与 /=config pop 指令名与行为互换 —— 指令名与所调用的 CalcState 方法相反。见计算器指令
  3. 语言文件引用不存在的指令 /om_config_m —— 仅见于 5 个 .lang 文件,源码中无此注册。见指令总览
  4. BIGINT 后端 gcd 符号重复注册 —— BigIntCalculatorFactory.java:98 与 :106 实现相同,后者覆盖前者。见类型后端

另有两处易被误判为缺陷、实为设计的写法,特此说明以免后续重复排查:SyncChannelHolder.ensureLoaded()(SyncChannelHolder.java:49)方法体为空但通过类初始化完成通道注册;echo 未注册为顶层指令但可在 /=execute 脚本内使用。

计算器列表

  • 计算器引擎 - 分词→解析→编译→执行流水线、算符字典、3 种表达式模式与栈操作内建函数
  • 类型后端 - 5 套数值实现的全局符号与算符对照表(DOUBLE / FRACTION / BIGINT / BOOL / MULTI)
  • 多类型值系统 - MULTI 后端的 12 种注册类型、6 个转换器与 19 档算符优先级

指令列表

  • 指令总览 - 全部 9 条已注册指令、权限模型与 /om_config_*、/om_source_* 子命令
  • 计算器指令 - =config / =eval / =fun / =let / =execute 指令树与脚本执行

配置列表

  • OpenModsLib 配置 - LibConfig 4 个属性的默认值、读取点与配置 GUI
  • 特性注册 API - 供下游 mod 使用的 @RegisterBlock / @RegisterItem 注解式注册层

核心与字节码列表

  • coremod 补丁 - OpenModsCorePlugin 入口、6 个原版类补丁与其配置开关
  • 类注入与 include - 动态类生成协议与 @IncludeInterface 接口混入的字节码实现

API 列表

  • 公开 API 接口 - openmods.api 的 19 个接口,覆盖方块回调、掉落物、GUI 与值传递
  • 网络与同步 API - 4 条 FML 通道:ID 同步、RPC、状态同步与网络事件