原版方块 addon(AddonVanillaTiles)
基本信息
| 属性 | 值 |
|---|---|
| 文件 | src/main/java/net/darkhax/wawla/addons/vanillamc/AddonVanillaTiles.java(157 行) |
| 实现接口 | mcp.mobius.waila.api.IWailaDataProvider |
| 注册方式 | Wawla.java:44-45 无条件 IMC |
| 目标 | 只有 3 个原版方块:BlockBeacon、BlockFurnace、BlockSkull |
| 配置分类 | Wawla-Blocks(8 个键) |
它与 通用方块 addon 的区别是:后者注册在 Block.class 上做通用判定(采集/亮度/硬度),本类只针对 3 个原版方块做专用解析,且判据是 TileEntity 类型而非方块类型。
注册明细
| 目标类 | Body | NBT |
|---|---|---|
BlockBeacon.class |
✅ | ✅ |
BlockFurnace.class |
✅ | ✅ |
BlockSkull.class |
✅ | ❌ 只注册了 body |
⚠️ BlockSkull 缺 registerNBTProvider(:145-146 只有两行 body),但 getWailaBody 里读 data.getNBTData().hasKey("Owner")(:103)。若 WAILA 未从别处补上头颅的 NBT,owner 行会静默永不显示——这是三个目标里唯一一个 NBT 注册缺失的。
三种 TileEntity 的 HUD 行
判据全部用 data.getTileEntity() instanceof X,且都是 else if 链(信标 → 熔炉),但玩家头颅是独立的 if(:102),因此头颅可以和前两者同时出现(实际上不会)。
1. 信标(TileEntityBeacon)
从 NBT 读 Levels / Primary / Secondary(均为 int):
| 门控键 | 输出 | 附加条件 |
|---|---|---|
wawla.beacon.showLevels |
信标等级: <Levels> |
— |
wawla.beacon.showPrimary |
主增益效果: <效果名> |
Primary > 0 |
wawla.beacon.showSecondary |
副增益效果: <效果名> |
Secondary > 0 |
效果名走 StatCollector.translateToLocal(Potion.potionTypes[primary].getName())。
⚠️ Potion.potionTypes[primary] 是无边界检查的数组下标(:58 / :62)。Primary 来自 TileEntity 的 NBT,正常范围 0-27;若存档被破坏或被别的 mod 写入越界值,会抛 ArrayIndexOutOfBoundsException。
2. 熔炉(TileEntityFurnace)
| 门控键 | 输出 | 附加条件 |
|---|---|---|
wawla.furnace.burntime |
燃烧时间: <N> 秒 |
BurnTime / 20 > 0 |
wawla.furnace.input |
烧制物品: <名> X <数量> |
潜行 且 Items[0] != null |
wawla.furnace.fuel |
燃料: <名> X <数量> |
潜行 且 Items[1] != null |
wawla.furnace.output |
成品: <名> X <数量> |
潜行 且 Items[2] != null |
槽位下标 0/1/2 = 输入/燃料/成品,与原版 TileEntityFurnace 的内部顺序一致。
3. 玩家头颅(TileEntitySkull)
wawla.showHead 开启且 NBT 有 Owner 复合标签时,输出 主人: <名字>,名字经 NBTUtil.func_152459_a(tag.getCompoundTag("Owner")).getName() 解出(这是 1.7.10 里从 GameProfile 存储取名的标准做法)。
⚠️ 源码缺陷
缺陷 1:BlockSkull 缺 NBT provider(见上)
AddonVanillaTiles.java:145-146 只调用 registerBodyProvider。对比同文件 :134-135(信标)、:141-142(熔炉)都是 body + NBT 成对。
缺陷 2:Potion.potionTypes[] 无边界检查
AddonVanillaTiles.java:58 与 :62。与 Pixelmon 的 natureList[tag.getShort(...)] 是同一类问题。
缺陷 3:熔炉内容物读取可能 NPE
:79 的 Utilities.getInventoryStacks(data.getNBTData(), 3) 在 NBT 无 Items 键时返回 null,随后 furnaceStacks[0] 立即 NPE。空熔炉是常见状态。详见 工具类 的缺陷 2。
缺陷 4:熔炉槽位语义与通用方块 addon 重复但键名硬编码
通用方块 与本类都用 wawla.furnace.* 这 4 个键;Tinkers 里同样用到了这 4 个键但是硬编码字符串。三个 addon 共享同一套开关,耦合是隐式的。
相关条目
- 配置项 —
Wawla-Blocks的 8 个键 - 通用方块 addon — 同为
Block粒度、内容互补 - Tinkers 集成 — 硬编码复用本类的 4 个熔炉键
- 工具类 —
getInventoryStacks的 null 返回