物品悬浮提示 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,服务端会直接崩。
相关条目
- 随包资源 —
description.enchantment.*文本库的翻译缺陷 - 架构与 WAILA 接入方式 — 唯一不走 IMC 的接入点
- 工具类 —
getEnchantmentsFromStack与isDevMode - 未接线的 addon — 另外两个开发者调试实现