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 命中——这是一个已移除的历史开关,被显式清理以免旧配置文件里的残留项造成困惑。
相关条目
- CodeChickenCore.cfg -
tweaks配置组的全部标签与默认值 - 功能 hack -
quenchFireTick等由 ASM 注入体调用的 Java 实现 - CodeChickenCorePlugin - 调用
TweakTransformer.load()的位置