通用实体 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 的类型。

相关条目