兼容代理
基本信息
| 属性 | 值 |
|---|---|
| 类型 | 第三方 mod 反射桥接 |
| 涉及类 | squeek.wailaharvestability.proxy.ProxyCreativeBlocks、ProxyGregTech、ProxyIguanaTweaks |
| 源码目录 | src/main/java/squeek/wailaharvestability/proxy/ |
| 共同手法 | Class.forName + getDeclaredMethod + invoke,全部 try/catch 吞异常 |
概述
proxy 包下的三个类各自对接一个外部 mod。它们都不注册任何方块或物品——只是读取对方 mod 的方法或 NBT 约定,把判定结果喂给 WailaHandler。
| 代理 | 目标 mod | 绑定时机 | 提供什么 |
|---|---|---|---|
ProxyCreativeBlocks |
CreativeBlocks(CreativeBlocks) |
类静态块首次加载时 | 跳过创造模式方块 |
ProxyGregTech |
GregTech(gregtech) |
类静态块首次加载时 | 方块类型分类 + GT 工具识别 |
ProxyIguanaTweaks |
Iguana Tweaks TConstruct(IguanaTweaksTConstruct) |
FMLPostInitializationEvent |
采集等级名称 |
ProxyCreativeBlocks
注册内容
无注册。它只读不写 CreativeBlocks 的一个静态方法。
| 项 | 值 |
|---|---|
| 目标类 | squeek.creativeblocks.CreativeBlocks |
| 目标方法 | static boolean isCreativeBlock(Block, int) |
| 前置检测 | Loader.isModLoaded("CreativeBlocks") |
| 绑定位置 | 静态初始化块(Class.forName + getDeclaredMethod) |
| 失败处理 | e.printStackTrace(),方法字段保持 null |
作用
isCreativeBlock(block, meta) 是 getWailaBody 的第一个业务判定(取到 block/meta 之后立刻执行):为真则整个方法原样返回,提示栏一行都不追加。
原因是创造模式的方块(如隐藏方块)没有正常的采集属性,强行计算只会给出误导信息。绑定失败时该方法恒返回 false,即退化为"对所有方块都计算",不会出错。
ProxyGregTech
这是三个代理里唯一不靠反射的——它只用 GameRegistry.findUniqueIdentifierFor(block) 与 NBT 键检查。
加载条件
public static boolean isModLoaded = Loader.isModLoaded("gregtech") && !Loader.isModLoaded("gregapi");
即:加载了 GregTech 5(gregtech)且没有加载 gregapi 时才启用。这排除了 gregapi 存在的 GregTech 5 Unstable 变体。
方块类型分类(GTBlockType)
getGTBlockType(Block) 取方块的唯一标识字符串后做前缀/相等匹配:
| 唯一标识 | 枚举值 |
|---|---|
以 gregtech:gt.blockores 开头 |
Ore |
以 gregtech:gt.blockcasings 开头 |
Casing |
等于 gregtech:gt.blockmachines |
Machine |
| 其它 | None |
枚举定义:None、Ore、Casing、Machine。
该分类如何改变判定
GTBlockType |
对 getWailaBody 的影响 |
|---|---|
Ore |
capMeta = false——GT 矿石的 metadata 可超 16,不做 meta >= 16 → 0 的截断保护 |
Casing / Machine |
保留实际方块作为判定对象,不用 WAILA 显示的物品栈反查方块(因为所需挖掘等级由真实方块决定) |
None |
当 WAILA 显示的是 ItemBlock 时,改用 Block.getBlockFromItem(itemStack.getItem()) 与 itemStack.getItemDamage() 判定——即按方块"声称"的身份计算 |
GT 工具识别
isGTTool(ItemStack):isModLoaded && itemStack.hasTagCompound() && itemStack.getTagCompound().hasKey("GT.ToolStats")。
被识别为 GT 工具时,canHarvest 改走 itemHeld.func_150998_b(block)——源码注释说明 GT 工具不看 Material#isToolNotRequired,因此绕开 ToolHelper.canToolHarvestBlock 的第一条短路。
ProxyIguanaTweaks
注册内容
无注册。反射绑定 iguanaman.iguanatweakstconstruct.util.HarvestLevels.getHarvestLevelName(int)。
| 项 | 值 |
|---|---|
| 绑定时机 | FMLPostInitializationEvent,前置 Loader.isModLoaded("IguanaTweaksTConstruct") |
| 绑定调用 | ModWailaHarvestability.init() 中显式 ProxyIguanaTweaks.init() |
| 失败处理 | e.printStackTrace() |
| 调用失败兜底 | 返回字面量 "<Unknown>" |
它只被 StringHelper.getHarvestLevelName 的第 2 级回退使用,详见 采集等级名称解析。
数值
| 数值 | 值 |
|---|---|
| 代理类数 | 3 |
| 用反射的代理数 | 2(CreativeBlocks、IguanaTweaks) |
| 不用反射的代理数 | 1(GregTech) |
| 代理注册的新方块/物品 | 0 |
| 对接的外部 mod 数 | 3 |
GTBlockType 枚举值数 |
4 |
| GregTech 匹配的唯一标识数 | 3 |
源码现状提示
- 三个代理的异常处理风格不一致:
ProxyCreativeBlocks与ProxyIguanaTweaks在反射绑定失败时printStackTrace(),ProxyGregTech与ToolHelper则静默return。前者会在日志留下痕迹,后者完全无声。 ProxyCreativeBlocks在静态初始化块里做绑定,而ProxyIguanaTweaks走显式init()——前者只要类被引用即生效(首个引用点是getWailaBody),后者必须等到 postInit。ProxyGregTech.isModLoaded是public static非 final 字段,在类静态块中一次性求值,之后不再复查。@Mod的dependencies里没有声明这四个 mod(CreativeBlocks、gregtech、IguanaTweaksTConstruct)中的任何一个,加载顺序完全依赖Loader.isModLoaded的运行时检测。
相关条目
- WailaHandler 插件与提示栏组装 - 三处代理调用的具体位置
- 采集等级名称解析 -
ProxyIguanaTweaks的使用场景 - 工具类别与有效工具判定 - GT 工具与 Tinkers 工具的 NBT 约定对比
- 缺失采集信息修正 - 同属启动期的方块数据修补