物品悬浮提示 addon(AddonGenericTooltips)

基本信息

属性 值
文件 src/main/java/net/darkhax/wawla/addons/generic/AddonGenericTooltips.java(80 行)
实现接口 无——它不实现任何 WAILA 接口
监听事件 net.minecraftforge.event.entity.player.ItemTooltipEvent(@SubscribeEvent)
注册方式 ⚠️ 不走 IMC:ProxyClient.java:16 的 MinecraftForge.EVENT_BUS.register(new AddonGenericTooltips())
配置项 0 个(addConfig 调用数为 0)
侧 纯客户端(Minecraft.getMinecraft() + isRemote)

这是 WAWLA 里唯一一个不经过 WAILA 的功能。它绕过 WAILA 的 provider 体系,直接挂在 Forge 事件总线上,影响物品栏与任何物品悬浮提示(包括 NEI/REI 的物品列表)。它也是 WAWLA 唯一被 ProxyClient 而非 Wawla.init 初始化的 addon。

3 类输出

onTooltip 的前置守卫链:event.entityPlayer != null && event.entityPlayer.worldObj != null → 再套一层 worldObj.isRemote。

1. 附魔书描述(ItemEnchantedBook)

条件 输出
未按 Shift 按住Shift来查看附魔介绍(tooltip.wawla.shiftEnch)
按 Shift 且查到描述 附魔的多行描述(按 45 字宽折行)
按 Shift 且查不到描述 未找到这种附魔的描述.(tooltip.wawla.missingEnch)

实现细节:

  • 用 Utilities.getEnchantmentsFromStack(event.itemStack, true) 读 StoredEnchantments,只取 enchArr[0](enchArr.length > 0 时)——附魔书有多个附魔时只显示第一个;
  • 查表键是 "description." + ench.getName();
  • 用 translation.startsWith("description.") 判定"查不到"(StatCollector 未命中时原样返回键)——这个判定有误判风险:若某个附魔的描述文本本身以 description. 开头会被误判,实际不成立;
  • 折行参数是 45 字宽 + wrapLongWords=false(不切断长单词)。

这些 description.enchantment.* 文本全部来自 随包资源 的 4 份 lang——这是 lang 里 200+ 行的 description.* 键的唯一消费者。本 mod 不注册任何附魔。

2. 护甲防护值(ItemArmor)

无条件输出一行 保护: <damageReduceAmount>,直接读 ItemArmor.damageReduceAmount 字段(半颗心单位,1 = 2 点护甲)。注意这与 ItemStack.getItemDamage() 不是一回事。

3. 附魔点数(任何对应方块的物品)

Block.getBlockFromItem(item) 非 BlockAir 时,读 block.getEnchantPowerBonus(world, 0, 0, 0),> 0 输出 附魔点数: <值>。

⚠️ 传的是硬编码坐标 (0, 0, 0),不是物品实际所在的方块位置。绝大多数方块的 getEnchantPowerBonus 与坐标无关,所以实践上没问题,但这是明确的语义偏差。

4. 开发者调试行

Utilities.isDevMode 为真时输出 Item.itemRegistry.getNameForObject(item)(注册名)。

⚠️ isDevMode 永远是 false:Utilities.java:33 初始化为 false,而唯一会把它置 true 的那行代码在 Wawla.java:31 是被注释掉的:

// Utilities.isDevMode = Utilities.getClass("net.minecraft.item.Item") != null;

所以这行代码在任何环境下都不会执行。相关联的还有 未接线的 addon 里的开发者工具。

⚠️ 源码缺陷

缺陷 1:instanceof 与 null 检查顺序颠倒(无害但是反模式)

:66:

if (!(block instanceof BlockAir) && block != null) {

instanceof 对 null 返回 false,!(false) = true,所以逻辑上不会 NPE(block == null 时整个条件为 false)。但正确写法应是 block != null && !(block instanceof BlockAir)——null 检查永远应该在前。这里只是碰巧安全。

缺陷 2:附魔书只显示第一个附魔

enchArr[0](:37)。附魔书存多个附魔时,玩家潜行只能看到第一条描述,且没有任何"还有 N 条"的提示。

缺陷 3:getEnchantPowerBonus 用硬编码坐标 (0,0,0)

见上。

缺陷 4:devMode 探测被注释掉,但代码路径仍在

AddonGenericTooltips.java:75 的分支与 Wawla.java:31 的注释共同构成死代码。若将来取消注释,判定逻辑是 getClass("net.minecraft.item.Item") != null——在正式环境该类始终存在,所以这条判定在原设计下也永远不会为 true(注释掉的原意应该是判断 net.minecraft.client.Minecraft 之类的开发环境专有类)。

缺陷 5:服务端安全依赖代理分离而非注解

类里直接 import net.minecraft.client.Minecraft 并调用 Minecraft.getMinecraft(),没有 @SideOnly。它只因为在 ProxyClient.preInit()(客户端专用)里被 EVENT_BUS.register 才不会在服务端加载。MinecraftForge 的 EVENT_BUS 静态注册表是按类名去重的,若哪天这段注册被移到 ProxyCommon,服务端会直接崩。

相关条目