CoreMod 配方破坏器
基本信息
| 属性 | 值 |
|---|---|
| 调度类 | com.dreammaster.coremod.DreamClassTransformer(DreamClassTransformer.java:16) |
| 接口 | IClassTransformer |
| 单个变换器接口 | com.dreammaster.coremod.IDreamTransformer |
| 变换器数量 | 3(DreamClassTransformer.java:24-26) |
| 目标包 | com.dreammaster.coremod.transformers.recipenukers |
| 自身豁免 | 以 com.dreammaster.coremod. 开头的类名直接原样返回(DreamClassTransformer.java:41-42) |
功能
DreamClassTransformer 在类加载期用 ASM 改写其它模组的字节码,作用是移除或替换它们自带的配方/机器注册代码 —— 因为 GTNH 整合包要对这些配方做统一重定义。
transform 的分派逻辑(DreamClassTransformer.java:40-52):
basicClass == null或transformedName == null,或类名以com.dreammaster.coremod.开头 → 原样返回(:41-42)- 以
transformedName查transformerMap哈希表,命中为空 → 原样返回(:43-44) - 命中则
ClassReader→ClassNode→ 应用变换 →ClassWriter(0)重新序列化(:45-51)
映射表在构造函数中一次性建好(DreamClassTransformer.java:22-27),每个 IDreamTransformer 自报 targetedClasses() 数组(DreamClassTransformer.java:29-33)。源码注释指出若将来出现两个变换器 targeting 同一类,需要改成 Map<String, List<IDreamTransformer>>(DreamClassTransformer.java:18-19)。
三个变换器
| 变换器 | 目标类 | 手法 |
|---|---|---|
AdvancedSolarPanelTransformer |
advsolar.common.AdvancedSolarPanel |
两个方法都改:afterModsLoaded 清空指令后重写为 MTAPI.manager = MTRecipeManager.instance;preInit 从压缩机字段起删除后续指令 |
BibliocraftTransformer |
jds.bibliocraft.blocks.BlockLoader、jds.bibliocraft.items.ItemLoader、jds.bibliowood.forestrywood.WoodsLoader、jds.bibliowood.naturawood.WoodsLoader、jds.bibliowood.bopwood.WoodsLoader |
命中方法名 addRecipies 或 initRecipes 且描述符 ()V 时清空方法体 |
GraviSuiteTransformer |
gravisuite.GraviSuite |
afterModsLoaded 中从首个 NEW net/minecraft/item/ItemStack 指令起删除其后全部指令,再补一条 RETURN |
AdvancedSolarPanelTransformer 是三者中唯一处理两个方法名的:afterModsLoaded 分支先 mn.instructions.clear(),再压入 GETSTATIC advsolar/utils/MTRecipeManager.instance 与 PUTSTATIC advsolar/api/MTAPI.manager(AdvancedSolarPanelTransformer.java:33-45),最后追加 RETURN(:46);preInit 分支的源码注释写明意图是 // deletes the 4 lines of Recipes.compressor.addRecipe.....(AdvancedSolarPanelTransformer.java:51),从压缩机字段节点起迭代删除(:52-60)。
GraviSuiteTransformer 同样以 afterModsLoaded 为目标,删除条件是遇到 TypeInsnNode 且 opcode 为 NEW、desc 为 net/minecraft/item/ItemStack(GraviSuiteTransformer.java:31-34),随后补 RETURN(:40)。
BibliocraftTransformer 是唯一一个覆盖 5 个目标类的变换器(BibliocraftTransformer.java:14-16),也是唯一走「整方法置空」路线的 —— 命中时打印 Taking a sledgehammer to {}.{}{} 日志后调用 emptyMethodNode(mn)(BibliocraftTransformer.java:21-23)。
数值
| 数值名 | 值 |
|---|---|
ClassWriter 标志 |
0(不重算帧,DreamClassTransformer.java:48) |
| 目标类总数 | 7(3 个变换器:1 + 5 + 1) |
| 每个变换器扫描的方法数 | 遍历该类 ClassNode 的全部 MethodNode(:21 / :22 / :26) |
交互
这三个变换器对玩家不可见,没有任何 GUI、指令或物品。它们只在类加载瞬间生效一次,且全部带 isModLoaded 前提:目标模组未安装时其字节码根本不会被加载,变换自然不发生。
相关条目
- DreamCoreMod - 加载本调度器的 coremod 入口