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 变换器。

相关条目