未接线的 addon(死代码)
基本信息
| 属性 | 值 |
|---|---|
| 涉及类 | AddonDeveloperEntities(71 行)、AddonDeveloperTiles(79 行)、AddonMorphEntities(78 行) |
| 合计 | 228 行,3 个类 |
| 是否注册 | ❌ 全部未注册 |
| 是否可达 | ❌ 不可达——没有任何调用点 |
| 配置项 | 0 个(三个类的 addConfig 调用数都是 0) |
这三个类都实现了完整的 WAILA 接口、都有可用的 registerAddon(IWailaRegistrar) 方法,但没有任何代码路径会把它们交给 WAILA。
grep 证据:注册路径断链
Wawla.java 共有 9 处 sendMessage("Waila", "register", ...)(:43 / :45 / :49 / :51 / :58 / :62 / :68 / :73 / :78),没有一条指向 developer 或 morph 包:
$ grep -rn "registerAddon" src/ | grep -v "public static void"
(无输出 —— 三个类的 registerAddon 只有方法声明行)
$ grep -rn "AddonDeveloper\|AddonMorph" src/
src/.../addons/developer/AddonDeveloperEntities.java:17:public class AddonDeveloperEntities implements IWailaEntityProvider {
src/.../addons/developer/AddonDeveloperEntities.java:19: public AddonDeveloperEntities() {
src/.../addons/developer/AddonDeveloperEntities.java:65: public static void registerAddon(IWailaRegistrar register) {
src/.../addons/developer/AddonDeveloperEntities.java:67: AddonDeveloperEntities dataProvider = new AddonDeveloperEntities();
src/.../addons/developer/AddonDeveloperTiles.java:19:public class AddonDeveloperTiles implements IWailaDataProvider {
src/.../addons/developer/AddonDeveloperTiles.java:21: public AddonDeveloperTiles() {
src/.../addons/developer/AddonDeveloperTiles.java:73: public static void registerAddon(IWailaRegistrar register) {
src/.../addons/developer/AddonDeveloperTiles.java:75: AddonDeveloperTiles dataProvider = new AddonDeveloperTiles();
src/.../addons/morph/AddonMorphEntities.java:18:public class AddonMorphEntities implements IWailaEntityProvider {
src/.../addons/morph/AddonMorphEntities.java:70: public static void registerAddon(IWailaRegistrar register) {
src/.../addons/morph/AddonMorphEntities.java:72: AddonMorphEntities dataProvider = new AddonMorphEntities();
每个类只命中自身的方法声明与构造函数行,无任何外部实例化点。
对比:AddonGenericTooltips 也没走 IMC,但它是唯一通过 ProxyClient.java:16 的 MinecraftForge.EVENT_BUS.register(new AddonGenericTooltips()) 生效的——有真实实例化点。三个死代码类连这个都没有。
三个类各自实现了什么
AddonDeveloperEntities(实体调试)
- 唯一实现了
IWailaEntityProvider的开发者工具(另两个都是IWailaDataProvider); - 潜行时输出
Entity: <类全名>(:43); - 按住疾跑键时输出实体的完整 NBT,通过
Utilities.wrapStringToList(data.getNBTData().toString(), 45, true, tip)按 45 字宽强制断长单词(wrapLongWords=true)逐行输出(:45); - 其余 4 个回调全是空实现。
⚠️ 触发条件是 Minecraft.getMinecraft().gameSettings.isKeyDown(keyBindSprint)(:40-41)——读取的是"当前是否按住"而非"本帧刚按下",所以它是按住不放持续刷屏,不是切换开关。
AddonDeveloperTiles(方块调试)
与上者对称,判据用 data.getBlock().getClass() 与 data.getTileEntity().getClass():
- 潜行时输出
Block: <类全名>,有 TileEntity 时再输出Class: <类全名>(:47-49); - 按住疾跑键输出完整 NBT(
:52)。
⚠️ :47 的 data.getBlock() 无 null 保护(对比 通用方块 里至少在隔壁行判过 block != null)。
AddonMorphEntities(Morph 变形集成)
这是三个里最有价值的一个——它实现了 WAILA 的 registerOverrideEntityProvider,也就是替换 WAILA 显示的实体。
| 环节 | 实现 |
|---|---|
NBT 侧(getNBTData) |
从 entity.getEntityData() 逐层下钻 PlayerPersisted → MorphSave → morphData → nextState → entInstanceTag,取 id 字段存进 WawlaMorphID(:58-65) |
覆盖侧(getWailaOverride) |
读 WawlaMorphID,用 EntityList.createEntityByName(morphID, world) 造一个假实体返回;返回 null 时退回真实实体(:23-31) |
| NBT 键常量 | public static final String KEY_MORPH_ID = "WawlaMorphID"(:77) |
| 注册粒度 | registerOverrideEntityProvider(dataProvider, EntityOtherPlayerMP.class) + registerNBTProvider(dataProvider, EntityPlayerMP.class) |
⚠️ 覆盖 provider 绑 EntityOtherPlayerMP(客户端类),NBT provider 绑 EntityPlayerMP(通用类)——两者是不同的类,这是刻意的(WAILA 在客户端用 EntityOtherPlayerMP 做渲染侧数据,服务端用 EntityPlayerMP 传 NBT),但也意味着该实现只能在客户端生效。
⚠️ getWailaOverride 里造出的假实体从未被写入世界,只在 WAILA 渲染时使用;若 morphID 对应的实体类不存在,EntityList.createEntityByName 返回 null,代码用 fakeEntity != null ? ... : data.getEntity() 兜底(:31)——这个兜底是对的。
⚠️ 整条链路依赖 Morph mod 的内部 NBT 结构(PlayerPersisted/MorphSave/morphData/nextState/entInstanceTag),没有任何版本检查,Morph 改结构即失效。而且 Wawla.java 里完全没有对 Morph 的 Loader.isModLoaded 判定——即使这个类被接线,Morph 不在时也会白跑一遍下钻。
为什么会变成死代码
Utilities.isDevMode(Utilities.java:33)默认 false,唯一置 true 的语句在 Wawla.java:31 被注释掉了:
// Utilities.isDevMode = Utilities.getClass("net.minecraft.item.Item") != null;
物品悬浮提示(唯一注册成功的开发者功能)里有一处 if (Utilities.isDevMode) 分支(AddonGenericTooltips.java:75),因此那一行代码也永远不执行。
合理推测:上游原本设计成"开发模式下自动加载 developer addon",后来改成注释掉探测但忘了删掉那两个类。Morph addon 则是 GTNH 之外的集成需求,代码留着但从未接线。
影响
对玩家无任何影响——这三个类不会加载,不会注册任何 provider,不会消耗任何性能。唯一成本是 2388 行里的 228 行(约 9.5%)是死代码,以及给读源码的人造成"WAWLA 支持 Morph"的错误印象(实际上 GTNH 装 Morph 也看不到任何变形相关的 HUD 支持)。
相关条目
- 架构与 WAILA 接入方式 — 13 个 addon 的注册状态总表
- 物品悬浮提示 — 唯一注册成功的开发者功能,同样被
isDevMode门控 - 工具类 —
getDeepTagCompound的唯一调用点与isDevMode字段