WAWLA
[!INFO] Git Commit:
8d6099a| Tag:1.3.3-GTNH| Updated: 2026-01-01
WAWLA(modid wawla,全称 What Are We Looking At)不是内容 mod,也��是 WAILA 的 fork。它是 Darkhax 写的、依附于 WAILA 运行的插件(addon)包:自己在游戏里不注册任何方块、物品、实体、方块实体、配方、指令或热键,全部功能都是"往 WAILA 的 HUD 上追加信息行",以及一小部分直接挂 Forge 事件的物品悬浮提示。
mcmod.info 的自述是:“Greatly expands upon the functionality of Waila by providing many new forms of information along with bridging support between Waila and many other popular minecraft mods.”
⚠️ 最重要的结论:wawla / waila / wailaplugins / wailaharvestability 的关系
任务简报把 wawla 描述为"WAILA 的 fork、本体还是另一个东西",这三种猜测全部错误。核实结论:
wawla是一个 WAILA 插件(addon)包,与wailaplugins、wailaharvestability属于同一类;它依赖 WAILA 但不是 WAILA。真正的 WAILA 本体是分类waila。
源码里的四条硬证据:
| 证据 | 位置 |
|---|---|
@Mod(dependencies = "required-after:Waila") —— 单向硬依赖 WAILA |
Wawla.java:19 |
全部 9 处 FMLInterModComms.sendMessage("Waila", "register", ...) —— 通过 IMC 把自己的 provider 交给 WAILA |
Wawla.java:40-78 |
13 个 addon 类实现的都是 WAILA 的 API 接口 mcp.mobius.waila.api.IWailaDataProvider / IWailaEntityProvider |
全部 addon 包 |
| README 把 ProfMobius(WAILA 作者)列为独立致谢对象,并写明 “Required Mods: WAILA” | README.md |
若 WAWLA 是 WAILA 的 fork,不可能存在这种"分离的署名 + Required Mods"关系,也不可能需要用 IMC 把自己注册进 WAILA。
四个仓库的定位对照:
| 分类 | 是什么 | 与 WAILA 的关系 | 规模 |
|---|---|---|---|
waila |
WAILA 本体 —— HUD 框架、配置、渲染、provider 注册表 | 就是 WAILA | 178 文件 |
wawla(本页) |
Darkhax 的 WAILA 插件包 —— 一组 provider 实现 | required-after:Waila,通过 IMC 注册 |
18 文件 |
wailaplugins |
WAILA 插件(上游社区维护) | 同上 | — |
wailaharvestability |
WAILA 插件(只做采集判定) | 同上 | — |
⚠️ 命名极易混淆:wawla 目录名看起来像 “WAWLA 版 WAILA”,但它与 waila 是依赖方与被依赖方,不是同族。判断一个目录是不是 WAILA 本体,要看 @Mod 注解的 dependencies 与 IMC 目标,不能看目录名。
基本信息
| 属性 | 值 |
|---|---|
| 仓库目录 | wawla(GTNewHorizons fork,上游 Darkhax-Minecraft/WAWLA) |
| modid | wawla(Constants.java:7,@Mod(modid = Constants.MODID)) |
| 显示名 | What Are We Looking At(Constants.java:8) |
@Mod 类 |
net.darkhax.wawla.Wawla(Wawla.java:14-20) |
| 根包 | net.darkhax.wawla |
| 硬依赖 | required-after:Waila(唯一声明的依赖) |
acceptableRemoteVersions |
"*"(不需要服务端也装) |
| Minecraft | 1.7.10 / Forge 10.13.4.1614 |
| 源码规模 | 18 个 .java,共 2388 行 |
| 版本 | tag 1.3.3-GTNH(Constants.VERSION 是构建期占位符 GRADLETOKEN_VERSION) |
| 事件处理器 | 2 个(preInit / init),无 postInit |
| 内容维度 | setting(4 条)+ addon(10 条),共 14 个条目 |
| 配置文件 | 无自己的 .cfg(55 个开关全部注册进 WAILA 的配置) |
| 依赖库 | com.gtnewhorizon.gtnhlib(VillagerNames)、org.apache.commons.lang3、llibrary(更新检查) |
⚠️ 本 mod 没有什么(对任务简报的核心修正)
简报预设了"方块/物品/实体注册、config、API 库、handler 机制核心库"等多种可能。源码核实后,除 handler 与 config 外全部为零:
| 维度 | 检索命令(在 /Users/evlos/a/mirror/wawla/ 下) |
结果 |
|---|---|---|
| 方块注册 | grep -rn "registerBlock|new Block(|Block.register" |
0 命中 |
| 物品注册 | grep -rn "registerItem|new Item(|Item.register|new BlockItem" |
0 命中 |
| 实体注册 | grep -rn "registerModEntity|registerEntity|EntityRegistry|extends Entity" |
0 命中 |
| TileEntity 注册 | grep -rn "registerTileEntity|GameRegistry.register" |
0 命中 |
| 世界生成 / 维度 / 群系 / 结构 | grep -rn "IWorldGenerator|WorldGen|BiomeGen|registerDimension|WorldProvider|addGenerator" |
0 命中 |
| 多方块 | grep -rn "Multiblock|IMultiblock|Controller" |
0 命中 |
| 附魔注册 | grep -rn "Enchantment\b.*=|registerEnchantment|EnchantmentHelper" |
0 命中(lang 里的 description.enchantment.* 是文本,不是注册) |
| Buff / 成就 | grep -rn "PotionEffect|registerPotionEffect|Achievement" |
0 命中 |
| 配方 / 矿词典 | grep -rn "addRecipe|ShapedRecipes|ShapelessRecipes|OreDictionary" |
0 命中 |
| 指令 | grep -rn "addChatCommand|ICommand|CommandBase" |
0 命中 |
| 热键 | grep -rn "KeyBinding|registerKeyBinding|keybinding" |
0 命中 |
| 自身配置 | grep -rn "new Configuration|@Config|ForgeConfigSpec" |
0 命中(55 个开关走 WAILA 的 addConfig) |
| AT / mixin / coremod | accessTransformersFile、coreModClass、mixins.*.json |
不存在 |
| 网络 | SimpleNetworkWrapper|NetworkRegistry |
0 命中(只有 1 条 llibrary 更新检查 IMC) |
唯一 @Mod 注解 |
grep -rn "@Mod(" |
仅 1 处:Wawla.java:14 |
因此 block、item、entity、multiblock、enchantment、dimension、keybinding、potioneffect、biome、structure、achievement、item-effect 共 12 个标准维度一个都不建。
全部 14 个条目
机制与设定(4 个)
| 条目 | 内容 |
|---|---|
| 架构与 WAILA 接入方式 | @Mod 注解的 4 项证据、9 条 IMC 注册全表、13 个 addon 类的注册状态、反射取类机制、双向代理 |
| 配置项 | 7 个分类、55 个注册开关全表、代码/lang/注册三方一致性审计、4 个具体缺陷 |
| 工具类 | Utilities 的 15 个静态方法逐个说明 + 6 处源码缺陷(含 getInventoryStacks 返 null、round(x,0) 空操作) |
| 随包资源 | 5 个资源文件、mcmod.info 全文、4 份 lang 的翻译缺陷(zh_CN 有 49 个未翻译英文值) |
WAILA addon(10 个)
| 条目 | 内容 |
|---|---|
| 通用方块 addon | AddonGenericTiles —— 注册在 Block.class,采集判定/亮度/硬度/挖掘进度/床状态 5 组 HUD 行 |
| 通用实体 addon | AddonGenericEntities —— 注册在 Entity.class,装备/护甲/宠物主人/成年期/产仔冷却/待命 |
| 原版方块 addon | AddonVanillaTiles —— 只有信标/熔炉/玩家头颅 3 个原版方块 |
| 原版实体 addon | AddonVanillaEntities —— 马/村民/僵尸/女巫/TNT/物品展示框 6 类实体 |
| 物品悬浮提示 addon | AddonGenericTooltips —— ⚠️ 唯一不走 IMC 的功能,附魔书描述/护甲值/附魔点数 |
| Pixelmon 集成 | 实体 8 键 + 栗子树 2 键;EnumNature/EnumGrowth 反射转字符串数组 |
| 神秘时代集成 | 精华罐/魔镜/脑缸/基座/法杖基座/解构台,9 个键 |
| Tinkers 集成 | 晾干架/半砖熔炉/地雷伪装;唯一反射调用 Method,并提供跨 addon 的 canHarvest |
| JewelryCraft 集成 | 熔炉/成型台 4 键;⚠️ modid 不一致 + 注册粒度错误双重失效 |
| 未接线的 addon | developer ×2 + morph 三个类,228 行死代码,零注册零调用 |
架构速览
@Mod("wawla") Wawla ← dependencies = "required-after:Waila"
│
├─ preInit → ProxyClient.preInit() ← 仅客户端
│ ├─ EVENT_BUS.register(AddonGenericTooltips) ← 绕过 WAILA 的唯一功能
│ ├─ 反射缓存 PlayerControllerMP.g → Utilities.currentBlockDamage
│ └─ llibrary update-checker IMC
│
└─ init → 向 "Waila" 发 9 条 "register" IMC ← 全部注册逻辑
├─ 无条件 4 条:VanillaEntities / VanillaTiles / GenericEntities / GenericTiles
└─ 条件 5 条:pixelmon(×2) / Thaumcraft / TConstruct / Jewelrycraft
ProxyCommon 与 ProxyClient 的 init() 都是空的;两者的 postInit() 也都存在但 Wawla 类里没有 postInit 事件处理器,永远不会被调用(死代码)。
55 个配置开关(7 个分类)
| 分类 | 键数 | 控制什么 |
|---|---|---|
Wawla-General |
10 | 通用方块 HUD:采集/工具/等级/进度/亮度/硬度/抗性/床 |
Wawla-Entity |
10 | 实体 HUD:装备/护甲/宠物 ×4/马 ×2/职业/TNT |
Wawla-Blocks |
8 | 信标 ×3/熔炉 ×4/玩家头颅 |
Pixelmon |
10 | 神奇宝贝 ×8 + 栗子树 ×2 |
Thaumcraft |
9 | 罐 ×3/魔镜 ×2/缸/法杖 ×2/基座/解构 |
Tinkers' Construct |
4 | 地雷伪装/晾干 ×2/半砖熔炉 |
Jewelrycraft |
4 | 熔融量/未熔量/熔化时间/冷却 |
全表见 配置项。默认只有 wawla.info.showHardness 与 wawla.info.showResistance 是 false,其余 53 个为 true。
跨 mod 集成矩阵
| 目标 mod | modid 判定 | 编译期依赖 | GTNH 是否加载 | 状态 |
|---|---|---|---|---|
| Waila | required-after |
✅ mcp.mobius.waila.api |
✅ | 正常 |
| HungerOverhaul | isModLoaded |
⚠️ 类层面 import IguanaConfig |
视整合包 | 有缺陷(见下) |
| Thaumcraft | isModLoaded("Thaumcraft") |
❌ 反射 | ✅ | 正常,1 个显示缺陷 |
| TConstruct | isModLoaded("TConstruct") |
❌ 反射 + 2 个 Method | ✅ | ⚠️ 初始化顺序缺陷 |
| Pixelmon | isModLoaded("pixelmon") |
❌ 反射 | ❌ 整合包不含 | 未加载 |
| JewelryCraft | ⚠️ "Jewelrycraft" / "Jewelrycraft2" 不一致 |
❌ 反射 | ✅ 装了但不生效 | ⚠️ 双重失效 |
| Morph | ⚠️ Wawla.java 里完全没有判定 |
❌ 反射 | — | ❌ 代码存在但未接线 |
⚠️ 源码缺陷与矛盾汇总
以下均为原文现状,未修正。完整的行级说明见各条目。
功能性缺陷(会导致显示错误或崩溃)
| # | 位置 | 现象 |
|---|---|---|
| 1 | AddonThaumcraftTiles.java:153 |
地元素充能因整除永远显示 0.0 —— 6 个要素里只有 terra 写成 / 100(整型),其余 5 个是 / 100f |
| 2 | AddonTinkersTiles.java:27 |
isEnabled 在 try 之前置 true —— 反射失败时 isEnabled 仍为真而 Class 字段为 null,canHarvest(:205/:218)NPE;该方法被 AddonGenericTiles.java:59 无条件调用 → TConstruct 版本不匹配会导致通用方块 HUD 大面积崩溃 |
| 3 | AddonGenericEntities.java:77-78 |
childDurationMultiplier 被赋成 breedingTimeoutMultiplier —— 装了 HungerOverhaul 时幼年体剩余时间用错倍率 |
| 4 | Utilities.java:145 + 6 个调用点 |
getInventoryStacks 无 Items 键时返回 null,而 AddonVanillaTiles.java:79、AddonThaumcraftTiles.java:125/:138、AddonTinkersTiles.java:69/:96/:133 全部直接下标访问 → 空熔炉/空基座/空晾干架/未伪装地雷会 NPE |
| 5 | AddonVanillaEntities.java:65 |
TNT 引信显示 tick 而非秒 —— 未做 / 20,与同文件其它时间显示不一致(熔炉做了 /20) |
| 6 | AddonPixelmonEntities.java:66/:80 |
natureList[tag.getShort(...)] 无边界检查 —— NBT 驱动的数组下标可为负或越界 → AIOOBE |
| 7 | AddonVanillaTiles.java:58/:62 |
Potion.potionTypes[primary] 无边界检查 —— 同类问题 |
| 8 | AddonPixelmonTiles.java:118 |
product.substring(9, length - 5) 硬编码魔数切片 —— 注册名不匹配即抛 StringIndexOutOfBoundsException,全 mod 最脆的字符串处理 |
| 9 | AddonThaumcraftTiles.java:99 |
DimensionManager.getProvider(dimId) 返回 null 未处理 → NPE |
| 10 | AddonJewelrycraftTiles.java:109-112 |
Item.getItemById 返回 null 未处理 → new ItemStack(null,...) 抛异常;getByte("Count") 为负时也抛 |
| 11 | AddonPixelmonEntities.java:88-89 |
loadItemStackFromNBT 返回 null 未处理 → NPE |
| 12 | Utilities.java:264 |
UUID.fromString 对非法 UUID 抛异常,而 AddonGenericEntities.java:64-65 只校验 length() > 0、无 try/catch |
| 13 | AddonThaumcraftTiles.java:153 附近 |
6 个要素都用 (float)(int / 100f) 强转,暴露 float 精度误差(如 0.01f 显示为 0.009999999) |
配置与注册缺陷
| # | 位置 | 现象 |
|---|---|---|
| 14 | AddonTinkersTiles.java:118 vs :180-183 |
wawla.tinkers.showBurnTime 被 getConfig 读取但从未 addConfig 注册 —— 配置界面里没有这个开关;同行还额外硬编码要求 "wawla.furnace.burntime",双重门控 → 燃烧时间行正常配置下永不显示 |
| 15 | Wawla.java:75 vs AddonJewelrycraftTiles.java:24 |
modid 不一致(Jewelrycraft / Jewelrycraft2)—— 两处必须同时为真,故该 addon 在两种 modid 下都不生效 |
| 16 | AddonJewelrycraftTiles.java:139-142 |
把 TileEntity 类传给 registerBodyProvider —— WAILA 期望 Block 类,故两个 provider 不会被调用(对比 Thaumcraft/Tinkers 都先 Class.forName 出 Block 类) |
| 17 | AddonTinkersTiles.java:184-187 |
classFurnaceSlab 缺 registerNBTProvider,但 handler 读 getNBTData().getInteger("Fuel") |
| 18 | AddonVanillaTiles.java:145-146 |
BlockSkull 缺 registerNBTProvider,但 handler 读 hasKey("Owner") |
| 19 | AddonTinkersTiles.java:122/:135/:141/:147 |
硬编码复用 AddonVanillaTiles 的 4 个熔炉配置键 —— 隐式耦合,原版 addon 若被移除则静默失效 |
| 20 | Wawla.java:19 |
dependencies 只声明 Waila —— 未声明实际需要的 HungerOverhaul(且是类层面 import,isModLoaded 守卫拦不住 NoSuchFieldError)、Thaumcraft、TConstruct、Jewelrycraft |
死代码与不一致
| # | 位置 | 现象 |
|---|---|---|
| 21 | 3 个类共 228 行(占全 mod 9.5%) | AddonDeveloperEntities / AddonDeveloperTiles / AddonMorphEntities 零注册零调用 —— Wawla.java 的 9 条 IMC 无一指向它们,也无任何 new 实例化点。Morph 集成因此完全不存在 |
| 22 | Wawla.java:31 |
isDevMode 的赋值被注释掉 —— Utilities.isDevMode 恒为 false,导致 AddonGenericTooltips.java:75 的调试行也是死代码 |
| 23 | ProxyCommon.java:13 / ProxyClient.java:31 |
postInit() 存在但 Wawla 类无对应事件处理器 —— 永不调用 |
| 24 | Utilities.java:154 |
越界保护写错对象 —— if (!(i > list.tagCount())) 恒为真(死代码),且就算改成 i < inventory.length 也拦不住真正越界的 Slot 值 |
| 25 | Utilities.java:105 |
round(value, 0) 是空操作 —— places > 0 才取整,AddonPixelmonTiles.java:113 正是这样调的,成长百分比会显示 83.333336% |
| 26 | AddonThaumcraftTiles.java:76/:80/:136 |
三处 if (true && ...) 调试残留 —— :76/:80 的 aspect != null 判定也是死代码(getString 永不返回 null) |
| 27 | AddonPixelmonEntities.java:149-150 |
natureList/sizeList 赋值在 registerBodyProvider 之后 —— 顺序倒置 |
| 28 | AddonThaumcraftTiles.java:229-240 |
8 个 TileEntity 字段是实例字段、4 个 Block 字段是 static,同批字段两套生命周期 |
| 29 | AddonGenericEntities.java:18 |
类层面 import IguanaConfig —— isModLoaded 只保护字段访问不保护类加载 |
| 30 | AddonGenericTooltips.java:66 |
instanceof 在 null 检查之前 —— !(x instanceof T) && x != null 逻辑上安全(instanceof 对 null 返回 false)但反模式 |
| 31 | AddonPixelmonEntities.java:59 等 |
用 compareByClass(忽略大小写比类名字符串)而非 isInstance —— 不匹配子类;对比 AddonTinkersTiles.canHarvest 用 isInstance 是对的 |
| 32 | 4 份 lang | tooltip.wawla.item 在 zh_CN/ru_RU(7,26) 与 es_MX(13,51) 重复定义 |
| 33 | 4 份 lang | wawla.pixelmon.useSneak 全部缺失(grep -c useSneak *.lang 4 个文件全为 0)—— 该键已注册且被读取,配置界面显示裸键名 |
| 34 | es_MX.lang:94 / ru_RU.lang:48 |
option.wawla.showhead 大小写不匹配(代码用 wawla.showHead)→ 这两种语言拿不到翻译;zh_CN 是对的 |
| 35 | es_MX.lang:126 |
option.wawla.villagerZombie 是死键 —— 已被 wawla.showProfession 取代 |
| 36 | zh_CN.lang:62 |
option.wawla.showEnchDesc 是死键 —— 既不注册也不引用 |
| 37 | zh_CN.lang |
49 个值完全未翻译 —— 含 JewelryCraft 整段 8 键、Special Mobs 6 键、More Swords Mod 19 键等 |
| 38 | Constants.java:15 / Utilities.java:239 |
FACTORY 字段与 getClass(String) 零引用 —— 死代码 |
| 39 | ProxyClient.java:19-22 |
更新检查指向上游 Darkhax-Minecraft/WAWLA,不是 GTNewHorizons 的 fork |
| 40 | mcmod.info |
dependencies 只有 mod_MinecraftForge、没有 Waila;"parent": "" 不声明父子关系 —— 判定 WAWLA 身份的唯一依据是 @Mod 注解与 9 条 IMC |
未接线的 3 个 addon(228 行死代码)
| 类 | 意图 | 是否注册 |
|---|---|---|
AddonDeveloperEntities |
潜行显示实体类名 + 按住疾跑键显示完整 NBT | ❌ |
AddonDeveloperTiles |
潜行显示方块/TE 类名 + 按住疾跑键显示完整 NBT | ❌ |
AddonMorphEntities |
registerOverrideEntityProvider —— 让 WAILA 显示变形后的实体 |
❌ |
AddonMorphEntities 是三者中唯一实现了 WAILA 实体覆盖 provider 的类,走 PlayerPersisted/MorphSave/morphData/nextState/entInstanceTag 深层 NBT 路径读取变形目标 id。它看起来是一个完成度很高但从未接线的集成——GTNH 玩家装了 Morph 也得不到任何变形 HUD 支持。详见 未接线的 addon。
相关条目
- 架构与 WAILA 接入方式 — 从这里开始读,含 modid 判定与注册状态总表
- 配置项 — 55 个开关全表与三方一致性审计
- 工具类 — 6 处缺陷的完整分析
- 未接线的 addon — 3 个死代码类