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 的原因。