未接线的 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 支持)。

相关条目