兼容代理

基本信息

属性 值
类型 第三方 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 的运行时检测。

相关条目