奇点物品类名单(classNameList)

基本信息

属性 值
配置键 S:classNameList(category general)
类型 字符串列表
读取阶段 preInit(CommonProxy.java:40-47)
存储 CommonProxy.classSet(Set<Class<?>>,行 32)
匹配方式 Class.forName(className) 后按物品 Java 类比对

作用

指定哪些 mod 的奇点物品要被从 Avaritia 无限催化剂配方里抽走, 并成为 Eternal Singularity 聚合配方的输入。

默认值

CommonProxy.java:43-45 的 4 项:

类名 所属 mod @Mod 中的依赖强度
com.rcx.aobdsingularities.item.AOBDItemSingularity AOBD Singularities after:aobdsingularities(软)
fox.spiteful.avaritia.items.ItemSingularity Avaritia required-after:Avaritia(硬)
wanion.thermsingul.ThermalSingularityItem ThermSingul after:thermsingul(软)
wealthyturtle.uiesingularities.UniversalSingularityItem Universal Singularities after:universalsingularities(软)

后三项都是 after:(软依赖),因此未安装时也能加载, 但对应的类找不到,会走下面的容错分支。

容错与后果

for (final String className : classNameList) {
    try { classSet.add(Class.forName(className)); }
    catch (ClassNotFoundException e) {
        EternalSingularityMod.logger.warn("Couldn't find " + className);
    }
}

(CommonProxy.java:48-54)

类找不到只打 WARN 并继续。所以:

  • 缺席的奇点 mod 不会导致崩溃,只是其奇点不参与聚合
  • 若名单里全部类都不存在,classSet 为空 → postInit 在行 67 早退,永恒奇点无任何配方(见 无限催化剂配方替换)

匹配的是类,不是注册名

判定条件是 classSet.contains(item.getClass()) (CommonProxy.java:77),即精确 Java 类:

情况 是否命中
该 mod 的奇点类与名单完全一致 ✅
同名但不同包/不同类名的奇点 ❌ 需自行加入全限定名
该物品有子类(继承) ❌ getClass() 不做父类匹配

因此自定义奇点 mod 需把自己的全限定类名加进本列表。

已知源码问题

  • Configuration 被 new 了两次且首次未保存检查: config.getStringList(...) 在行 40-46 读取,config.hasChanged() 判定在行 47。 但 preInit 的 configFile 字段赋值(行 39 new Configuration(configFile = file)) 与 postInit 的 new Configuration(configFile)(行 82)是两个独立对象, 后者会重新读同一个文件。preInit 写入的默认值在 postInit 侧依赖磁盘落盘。 源码未复用同一实例。
  • 无格式校验:classNameList 是自由文本列表,填入非法类名时 Class.forName 抛的是 ClassNotFoundException(行 51)可被捕获, 但拼写错误的类名同样只表现为 WARN,与「mod 未安装」无法区分。
  • 不影响已有存档的 classSet 语义:classSet 在 postInit 末尾被置 null (行 68 / 126),但没有任何代码读取它为 null 的情况, 属单纯的引用释放(注释写 // Destroy reference)。

相关条目