core mod 与 ASM 容器

[!INFO] Git Commit: d3dbd5f | Updated: 2026-10-01

gradle.properties 中 coreModClass = ASM.CropStickTransformer_plugin,但读完这两个文件后可以确认: 这个 core mod 不做任何字节码转换,只在模组列表里插入一条元信息。

CropStickTransformer_plugin

IFMLLoadingPlugin 的 5 个回调全部返回 null 或空实现:

接口方法 返回值 源码行
getASMTransformerClass() null CropStickTransformer_plugin.java:16
getModContainerClass() "com.github.bartimaeusnek.ASM.CropLoadCoreASM" :21
getSetupClass() null :26
injectData(Map) 空实现 :30
getAccessTransformerClass() null :34

getASMTransformerClass() 返回 null 意味着 FML 不会加载任何 IClassTransformer, getSetupClass() 与 getAccessTransformerClass() 返回 null 同样不挂载任何 setup 类或 AT。 因此本 core mod 的唯一运行时效果就是构造并注入一个 DummyModContainer。

两个类级别的注解:

@IFMLLoadingPlugin.MCVersion("1.7.10")
@IFMLLoadingPlugin.TransformerExclusions({ "com.github.bartimaeusnek.ASM" })
@IFMLLoadingPlugin.Name(CropStickTransformer_plugin.NAME)   // NAME = "CroploadCore ASM Core"

@IFMLLoadingPlugin.Name 的值是 "CroploadCore ASM Core"(大写 C、小写 l,即 “Cropload”), 与 mod 名称 CropLoadCore(大写 L)拼写不同。

@IFMLLoadingPlugin.TransformerExclusions 排除 com.github.bartimaeusnek.ASM 包—— 但由于没有加载任何 transformer,这条排除规则当前不起实际作用,属于防御性声明。

CropLoadCoreASM 虚拟容器

extends DummyModContainer,构造时手工填充元信息(CropLoadCoreASM.java:19-29):

元信息字段 值
metadata.modId CropLoadCoreASM
metadata.name "CroploadCore ASM Core"
metadata.version "0.0.2"(硬编码,不随 mod 版本变化)
metadata.authorList bartimaeusnek
metadata.parent berriespp
metadata.dependencies IC2(必需)
metadata.dependants berriespp(必需)

这是仓库中出现的第三个 modid 风格的字符串:CropLoadCoreASM 是首字母大写的驼峰形式, 不符合 GTNH 惯例的小写 modid。它是 DummyModContainer 的元信息 id,会出现在模组列表中, 但不是 @Mod 声明的 modid,也无法用 /give 之类的方式引用。

parent 与 dependants 都指向 berriespp(Berries++ / BerriesPP,作者的浆果作物 mod), dependencies 只有 IC2 一条——注意这与 CropLoadCore 主类上那 14 条 after: 软依赖是两套独立声明。

registerBus 注册了一个没有订阅者的对象

@Override
public boolean registerBus(EventBus bus, LoadController controller) {
    bus.register(this);
    return true;
}

CropLoadCoreASM.java:46-49。bus.register(this) 把 DummyModContainer 自身挂到事件总线上, 但 CropLoadCoreASM 类中没有任何 @SubscribeEvent 方法,也没有继承来带处理器的方法 (DummyModContainer 本身不提供事件处理)。所以这次注册是一个纯粹的空操作。

结论

综合三点:没有 transformer 类、没有 setup 类、没有 AT、注册的容器无事件处理器—— CropStickTransformer_plugin 是一个仅用于在模组列表中显示元信息的占位 core mod。 名字中的 “CropStickTransformer” 暗示它原本打算给 IC2 的作物锄(ItemWeedingTrowel)做字节码转换, 但该功能已改由 Mixin 实现(见 IC2 作物 Mixin),core mod 部分被遗留为空壳。

注意 mixins = true 但 coreModClass 与 mixinPlugin 之外,本 mod 的 core mod 与 mixin 是 两套独立机制:core mod 由 FML 的 IFMLLoadingPlugin 加载(在 mod 扫描之前), mixin 由 GTNH 的 LateMixin 机制在 IC2 类加载之后才应用(见 IC2 作物 Mixin)。

与 ModsLoaded 的关系

core mod 阶段的 CropLoadCoreASM 不做任何 mod 加载状态探测——它的 getDependencies() 硬编码返回 IC2,不看实际环境。真正的环境探测发生在 preInit 的 ModsLoaded.check_init(...) 中(见 mod 元信息与打包数据)。 core mod 运行在 mod 容器构造期,此时 Loader.isModLoaded 尚不可靠,这正是把探测推迟到 preInit 的原因。