功能 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 判断目标位置是空气或可替换方块

相关条目