TweakTransformer

基本信息

属性 值
类全名 codechicken.core.asm.TweakTransformer
实现接口 net.minecraft.launchwrapper.IClassTransformer
ASM 资源 /assets/codechickencore/asm/tweaks.asm(TweakTransformer.java:29-30)
ASM 资源行数 40
可调开关数 4(另含 1 个已废弃项、2 个由 LiquidTextures 读取)

功能

TweakTransformer 用一份文本格式的 ASM 指令清单去改写原版 Minecraft 的方法体,是本模组对游戏机制施加影响的主通道。

load()(TweakTransformer.java:33-43)由 coremod 的 injectData() 调用。流程是:先 loadTransformersFromConfig() 按配置把 MethodReplacer / MethodTransformer / MethodWriter 加进静态 ModularASMTransformer;若最终 transformer.isEmpty(),打 debug 日志并直接返回,不注册(:35-39)。否则调用 Launch.classLoader.registerTransformer(TweakTransformer.class.getName())(:40-42)。

指令清单格式

assets/codechickencore/asm/tweaks.asm 是自定义 DSL,以 list <名字> 开头定义指令块,块内用 Java 风格助记符,标签以 L 开头。

指令块 行 含义
d_environmentallyFriendlyCreepers :3-8 匹配序列:读取 EntityCreeper.worldObj → getGameRules() → 载入 "mobGriefing"
environmentallyFriendlyCreepers :10-11 替换体:单条 ICONST_0,即恒返回 false
softLeafReplace :13-20 替换体:仅当 isAir 为真时返回 true
n_doFireTick :22-25 匹配序列 + 标签 LRET:IFEQ 判定 doFireTick 游戏规则
doFireTick :27-34 注入体:转发到 TweakTransformerHelper.quenchFireTick,标签 LSKIP
finiteWater :36-40 匹配序列:读取 BlockDynamicLiquid.field_149815_a,ICONST_2 + IF_ICMPLT LEND

其中 doFireTick 块调用的 codechicken/core/featurehack/TweakTransformerHelper.quenchFireTick(tweaks.asm:33)是真实存在的 Java 方法(TweakTransformerHelper.java:12)——已核对,非悬空引用。

四个开关

配置项 行 默认值 生效条件 目标方法
environmentallyFriendlyCreepers :50-58 false 为 true 时 EntityCreeper.func_146077_cc()V,用 MethodReplacer 整段替换为常量 false
softLeafReplace :60-70 false 为 false 时(取反) 新增覆写 Block.canBeReplacedByLeaves(IBlockAccess;III)Z,用 MethodWriter
doFireTickOut :72-93 true 为 true 时 BlockFire.func_149674_a(...) 前注入跳转,用 MethodTransformer
finiteWater :95-112 false 为 true 时 BlockDynamicLiquid.func_149674_a(...) 前注入跳转

默认状态下实际注册 2 个:softLeafReplace(因条件取反,默认 false 即命中)与 doFireTickOut(默认 true)。因此 TweakTransformer 在纯净配置下不会走 isEmpty() 早退分支,恒定注册。

三处转换都用 ObfMapping 指定「类 / MCP 名 / 描述符」三元组,再由 ASMReader 在 tweaks.asm 文本与运行时 SRG 名之间做映射。

已废弃项

tweaks.removeTag("persistantLava")(TweakTransformer.java:48)在读配置时主动删除 persistantLava 标签。tweaks.asm 中没有任何对应的指令块,src/main/java 下也没有 persistantLava 命中——这是一个已移除的历史开关,被显式清理以免旧配置文件里的残留项造成困惑。

相关条目