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):

  1. basicClass == null 或 transformedName == null,或类名以 com.dreammaster.coremod. 开头 → 原样返回(:41-42)
  2. 以 transformedName 查 transformerMap 哈希表,命中为空 → 原样返回(:43-44)
  3. 命中则 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 前提:目标模组未安装时其字节码根本不会被加载,变换自然不发生。

相关条目