功能 hack(codechicken.core.featurehack)
基本信息
| 属性 | 值 |
|---|---|
| 包名 | codechicken.core.featurehack(8 类)+ codechicken.core.featurehack.mc(4 类) |
| 公开类型数 | 12 |
| 触发方式 | 配置开关 + 事件 + 反射改写原版私有字段 |
功能
featurehack 包是「用小把戏绕过原版限制」的一组实现:注册虚拟实体当作全局更新/渲染回调、用反射直接改写物品注册表、在贴图拼接阶段替换液体材质、以及作为 TweakTransformer 注入体的落地实现。
实体钩子
FeatureHack(FeatureHack.java)用两个不渲染的虚拟实体充当全局回调点:
| 方法 | 行 | 行为 |
|---|---|---|
enableUpdateHook() |
:13-18 |
幂等(updateHookEnabled 守卫);客户端下调用 enableClientUpdateHook() |
enableRenderHook() |
:20-26 |
@SideOnly(Side.CLIENT),幂等;注册 EntityUpdateHook → RenderNull |
enableClientUpdateHook() |
:28-31 |
注册 EntityRenderHook → RenderEntityRenderHook |
对应两个实体类:
| 类 | 说明 |
|---|---|
EntityUpdateHook extends Entity |
携带 IUpdateCallback(onUpdate() / isValid()),:7-13 |
EntityRenderHook extends Entity |
携带 IRenderCallback(render(float, int) / shouldRenderInPass(int)),:7-13 |
两个 Render 子类:RenderNull(:7-10 的 doRender 是空方法体)与 RenderEntityRenderHook(:10-13,真正调用回调)。
RenderNull.doRender与RenderEntityRenderHook里的具体调用体未逐一核实;此处只记录签名与注册关系。
物品注册表改写
GameDataManipulator(GameDataManipulator.java)通过反射拿到两个私有字段:
| 字段 | 目标 | 行 |
|---|---|---|
f_registryObjects |
RegistrySimple.field_82596_a(Map) |
:20-22 |
f_underlyingIntegerMap |
RegistryNamespaced.field_148759_a(ObjectIntIdentityMap) |
:24-28 |
replaceItem(int id, Item item)(:35-43)把指定数字 ID 的物品原地换成另一个 Item 实例,同时改写名称表与 ID→对象表。两处 catch (Exception e) 都 throw new RuntimeException(e) 重新抛出(:30-32、:40-42),不吞异常。
液体贴图替换
LiquidTextures(LiquidTextures.java)由 CodeChickenCoreModContainer.preInit 客户端分支调用(CodeChickenCoreModContainer.java:61)。
| 配置项 | 行 | 默认值 |
|---|---|---|
tweaks.replaceWaterFX |
:29-30 |
false |
tweaks.replaceLavaFX |
:31-32 |
false |
两者任一为 true 时,向 MinecraftForge.EVENT_BUS 注册自身(:42-46),并反射取 BlockLiquid.field_149806_a([Lnet/minecraft/util/IIcon;)(:44-45)。postStitch(TextureStitchEvent.Post)(:50-68)在贴图拼接完成后,直接改写 Blocks.flowing_lava / Blocks.lava / Blocks.flowing_water / Blocks.water 四个方块的 IIcon[] 数组元素,替换为 1.5 前的旧贴图。
配套贴图类在 codechicken.core.featurehack.mc:TextureWaterFX、TextureWaterFlowFX、TextureLavaFX、TextureLavaFlowFX(各 1 个 texture 字段,对应 newTextures[0..3])。
TweakTransformer 的落地实现
TweakTransformerHelper(TweakTransformerHelper.java)是被 tweaks.asm 注入体直接调用的 Java 侧实现:
| 方法 | 行 | 说明 |
|---|---|---|
quenchFireTick(World, int, int, int, Random) |
:13-32 |
实现「无火源且雨天打雷时熄灭火焰」的 doFireTick 扩展逻辑 |
canPlaceBlockAt(World, int, int, int) |
:34-38 |
判断目标位置是空气或可替换方块 |
相关条目
- CodeChickenCore.cfg -
replaceWaterFX/replaceLavaFX配置项 - TweakTransformer - 调用
quenchFireTick的 ASM 注入体 - 客户端运行时与事件 - 本包的
LiquidTextures是全仓 5 个事件订阅类之一