通用实体 addon(AddonGenericEntities)
基本信息
| 属性 | 值 |
|---|---|
| 文件 | src/main/java/net/darkhax/wawla/addons/generic/AddonGenericEntities.java(142 行) |
| 实现接口 | mcp.mobius.waila.api.IWailaEntityProvider |
| 注册方式 | Wawla.java:48-49 无条件 IMC |
| 注册粒度 | registerBodyProvider + registerNBTProvider,均绑 Entity.class(:132-133)——对所有实体生效 |
| 配置分类 | Wawla-Entity(6 个键,与 原版实体 的 4 个合并成同一分类共 10 个) |
| 跨 mod 依赖 | iguanaman.hungeroverhaul.config.IguanaConfig(类层面 import) |
HUD 行拆解
getWailaBody 里有 4 个互相独立的块。
1. 生物装备与护甲(EntityLiving,潜行)
itemTypes = { "heldItem", "feet", "leggings", "chestplate", "helmet" }(:26)按槽位 0-4 依次取 getEquipmentInSlot(i),非空则输出 手持物品/靴子/护腿/胸甲/头盔: <显示名>。
⚠️ 5 件装备全部要求玩家潜行(data.getPlayer().isSneaking() 在循环内判断),而护甲值不要求潜行。
⚠️ 槽位 0 的 lang 键是 tooltip.wawla.heldItem(手持物品),不是 mainhand 之类——itemTypes[0] 的字符串同时被用作 lang 键。
CONFIG_ARMOR(wawla.showMobArmor)在 getTotalArmorValue() > 0 时输出 护甲值: <N>。
⚠️ itemTypes 声明为 private static String[](非 final),可被反射修改。
2. 宠物主人
判据是 NBT 里的 OwnerUUID 键存在且 length() > 0,然后 Utilities.getUsernameByUUID() 查 UsernameCache,查不到显示 未知玩家。
⚠️ 对 UUID 格式不做校验——见 工具类 的缺陷 4:UUID.fromString 抛 IllegalArgumentException 时 getWailaBody 没有 try/catch。
3. 幼年体剩余时间 / 产仔冷却
| 条件 | 输出 | 门控键 |
|---|---|---|
animal.isChild() && getGrowingAge() != 0 |
成年期: <秒> |
wawla.pets.age |
否则且 getGrowingAge() != 0 |
产仔冷却时间: <秒> |
wawla.pets.cooldown |
两者是 if / else if 关系——wawla.pets.age 的输出条件更严格,但当 age 开关关闭时不会回退到 cooldown,因为 else if 挂在 animal.isChild() 上而非 cfg.getConfig(CONFIG_AGE) 上。这与 配置项 的意图一致(两个开关互斥),但意味着幼年体永远看不到冷却时间。
数值换算:getGrowingAge() / 20.0F * -1.0F * childDurationMultiplier(成年剩余)与 / 20.0F * breedingTimeoutMultiplier(冷却),取 (int) 截断。
4. 已驯服宠物是否待命
entity instanceof EntityTameable && pet.isTamed() 时输出 待命: <true/false>,门控 wawla.pets.sitting。
HungerOverhaul 集成与 ⚠️ 核心缺陷
EntityAnimal 块的倍率来自 HungerOverhaul(Iguana’s Hangover Overhaul):
float breedingTimeoutMultiplier = 1.0F;
float childDurationMultiplier = 1.0F;
if (Loader.isModLoaded("HungerOverhaul")) {
breedingTimeoutMultiplier = IguanaConfig.breedingTimeoutMultiplier;
childDurationMultiplier = IguanaConfig.breedingTimeoutMultiplier; // ← 应为另一个字段
}
⚠️ 缺陷:childDurationMultiplier 被赋成了 breedingTimeoutMultiplier
AddonGenericEntities.java:77-78 两行赋的是同一个 IguanaConfig 字段。这是一处 copy-paste 笔误:幼年体剩余时间(成年期)在装了 HungerOverhaul 时会用产仔冷却的倍率去换算,而两者在原版语义里本应不同(原版都是 400 tick)。
后果:装了 HungerOverhaul 的整合包里,幼年体剩余成年时间这一行会显示错误的秒数。未装 HungerOverhaul 时两个倍率都是 1.0F,不显现。
⚠️ 缺陷:类层面的硬 import 绕过了 isModLoaded 守卫
AddonGenericEntities.java:18 在 import 区就有 iguanaman.hungeroverhaul.config.IguanaConfig。Loader.isModLoaded 只保护字段访问,不保护类加载:
- 装了 HungerOverhaul 但版本不含该字段 →
NoSuchFieldError,守卫拦不住; - 更隐蔽的是:Java 的常量池解析可能让
:77的访问在方法实际执行到该行之前就触发类初始化。
另外 dependencies 里没有声明 HungerOverhaul(见 架构)。
getNBTData 的特殊之处
if (entity == null) return tag;
if (entity instanceof EntityPlayer) return tag; // ← 玩家实体不写 NBT
entity.writeToNBT(tag);
这是唯一主动排除玩家实体的 addon。对 Entity.class 全量注册的 NBT provider 来说,玩家是唯一一个 WAILA 不需要(也不该)传输完整 NBT 的类型。
相关条目
- 配置项 —
Wawla-Entity分类的 10 个键 - 原版实体 addon — 同一配置分类下的兄弟实现
- 工具类 —
getUsernameByUUID的 UUID 解析风险