ASM 变换器(AsmTransformers)
基本信息
| 属性 | 值 |
|---|---|
| 早期枚举 | core/fml/AsmTransformers.java —— 9 个条目 |
| 晚期枚举 | core/fml/LateAsmTransformers.java —— 1 个条目 |
| 框架 | com.gtnewhorizon.gtnhmixins.builders.ITransformers / TransformerBuilder(GTNHMixins) |
| 变换器实现目录 | core/fml/transformers/(early/ fml/ mc/ optifine/ thermos/ 五个子包) |
| 关联 | Coremod 引导、ASM 配置 |
下表中的变换器类名是相对简写:省略了公共前缀
com.mitchej123.hodgepodge.core.fml.transformers.。例如mc.SpeedupLongIntHashMapTransformer的全限定名是com.mitchej123.hodgepodge.core.fml.transformers.mc.SpeedupLongIntHashMapTransformer。12 个类均已逐一核实存在。
功能
Mixin 改不动的地方(方法体太小、字段访问、私有方法、泛型擦除)由 ASM 变换器接手。与 Mixin 不同,变换器没有 @Mixin 注解和配置门控,由枚举 + 字符串类名注册。
早期变换器(AsmTransformers,9 项)
由 HodgepodgeCore.getASMTransformerClass() 经 ITransformers.getTransformers(AsmTransformers.class) 取得(HodgepodgeCore.java:115-120)。
| 枚举条目 | 门控配置 | 侧 | 变换器类 | 排除模组 |
|---|---|---|---|---|
SPEEDUP_PROGRESS_BAR |
ASMConfig.speedupProgressBar |
CLIENT | fml.SpeedupProgressBarTransformer |
— |
SPEEDUP_LONG_INT_HASHMAP |
ASMConfig.speedupLongIntHashMap |
COMMON | mc.SpeedupLongIntHashMapTransformer |
FastCraft、Bukkit |
SPEEDUP_NBT_TAG_COMPOUND_COPY |
ASMConfig.speedupNBTTagCompoundCopy |
COMMON | mc.NBTTagCompoundHashMapTransformer |
FastCraft、Bukkit |
SPEEDUP_PLAYER_MANAGER |
ASMConfig.speedupPlayerManager |
COMMON | mc.PlayerManagerTransformer |
FastCraft、Bukkit |
REMOVE_VARARG_SPAM |
ASMConfig.dissectVarargs |
COMMON | mc.VarargDissector |
— |
FIX_BOGUS_INTEGRATED_SERVER_NPE |
FixesConfig.fixBogusIntegratedServerNPEs |
COMMON | fml.FMLIndexedMessageToMessageCodecTransformer |
— |
FIX_FORGE_OPTIONAL_INTERFACE_SIGNATURE |
FixesConfig.fixForgeOptionalInterfaceSignature |
COMMON | fml.ModAPITransformerSignaturePatch |
— |
THERMOS_SLEDGEHAMMER_FURNACE_FIX |
SpeedupsConfig.speedupVanillaFurnace |
COMMON | thermos.ThermosFurnaceSledgeHammer |
需 Bukkit |
OPTIFINE_REMOVE_GLERROR_LOGGING |
TweaksConfig.removeOptifineGLErrors |
CLIENT | optifine.GLErrorLoggingTransformer |
— |
三条值得注意的设计:
- FastCraft / Bukkit 双排除:
SPEEDUP_LONG_INT_HASHMAP、SPEEDUP_NBT_TAG_COMPOUND_COPY、SPEEDUP_PLAYER_MANAGER都排除这两个模组 —— 它们对LongHashMap做了自己的重写,重定义方法会让变换器产出错误字节码。 THERMOS_SLEDGEHAMMER_FURNACE_FIX是唯一带addRequiredMod的条目:只在有 Bukkit 时才安装,描述为「Take a sledgehammer to CraftServer.resetRecipes() to prevent it from breaking our Furnace Fix」。它是修复另一个修复的补丁。- 门控配置跨 4 个分类:
AsmTransformers从ASMConfig、FixesConfig、SpeedupsConfig、TweaksConfig各取开关,不是只有ASMConfig。
晚期变换器(LateAsmTransformers,1 项)
SPEEDUP_FORGE_ORE_DICTIONARY(LateAsmTransformers.java:18-23):
| 属性 | 值 |
|---|---|
| 门控 | ASMConfig.speedupOreDictionary |
| 侧 | COMMON |
| 变换器 | mc.SpeedupOreDictionaryTransformer |
| 排除模组 | FastCraft、Bukkit、Ultramine |
| 额外副作用 | TargetedMod.FALSETWEAKS_LT_433 的版本判定里会 Launch.blackboard.remove("hodgepodge.FixesConfig.fixBottomFaceUV")(TargetedMod.java:34-38) |
晚期的含义
LateAsmTransformers 的注册方式与早期不同:不是 coremod 的 getASMTransformerClass(),而是反射调用静态方法 registerLateTransformers()(:40-45),后者遍历枚举并 Launch.classLoader.registerTransformer(...)。
源码注释(:14):「Transformers registered at the END of LaunchClassLoader.transformers, via HodgepodgeLateTweaker」—— 即 HodgepodgeCore.injectData 追加的 HodgepodgeLateTweaker 在 FML 的 TweakClasses 阶段挂上,那时 Forge 的物品字典结构才最终定型。
合计
| 分类 | 条目数 | 变换器类数 |
|---|---|---|
早期(AsmTransformers) |
9 | 9 |
晚期(LateAsmTransformers) |
1 | 1 |
| 合计 | 10 | 10 |
全部 10 个字符串引用的变换器类均已核实存在于
core/fml/transformers/下(逐个os.path.exists校验,缺失 0 个)。
另有 2 个不在上述枚举中的变换器,由 HodgepodgeCore 构造器直接注册(core/coremod-bootstrap):early.ModContainerFactoryTransformer、early.ModCandidateTransformer。计入则为 12 个 ASM 变换器。
相关条目
- ASM 配置 - 6 个
ASMConfig开关 +thermosCraftServerClass - Coremod 引导 - 变换器的注册时机
- 目标模组列表 - 排除/依赖判定所用的枚举