NEI Custom Diagram

[!INFO] Git Commit: 见 relation.md | Minecraft 1.7.10 / Forge 10.13.4.1614

为 NEI(NotEnoughItems) 提供自定义「图表页」的客户端框架。 它不注册任何方块、物品或实体,而是在 NEI 的配方页里渲染自绘的示意图。

简介

NEI Custom Diagram(modid neicustomdiagram)是 Minecraft 1.7.10 Forge mod, 纯客户端(acceptableRemoteVersions = "*",所有逻辑在 Side.CLIENT 早退):

  • 图表组(DiagramGroup) —— 15 个已注册生成器,每个对应 NEI 的一个标签页。
  • 声明式 API —— DiagramGenerator + DiagramGroupInfo + Layout/Diagram Builder。
  • 匹配器(Matcher) —— 决定「哪些物品/流体能查到本组图」。
  • 3 种可见性闸门 —— 缺依赖、硬禁用、软禁用,效果各不相同。
  • 1 个 mixin —— @Invoker 暴露 NEI GuiRecipe.getCurrentRecipeId(客户端侧)。

依赖:required-after:NotEnoughItems、required-after:gtnhlib; 软依赖 after: dreamcraft / gregtech / bartworks / miscutils / detravscannermod / MineTweaker3 / EnderStorage。

mcmod.info 全文为 ${modId} / ${modName} / ${modVersion} / ${minecraftVersion} 占位符,真实 modid 与版本只能从 NeiCustomDiagram.java 与 gradle.properties 实读。

概念总览

概念 摘要 关联条目
注册真源 枚举单例,15 条 RegistryEntry + 三道过滤闸门 Registry
生成器接口 info() + generate() 两个方法 Diagram Generator
组元数据 AutoValue;工厂默认值 width=166、ignoreNbt=true Diagram Group Info
处理器 同时实现 ICraftingHandler + IUsageHandler Diagram Group
检索层 3 种 Matcher;组件与图是多对多 Diagram Matcher
可见性 7 个枚举值;DISABLED 会跳过初始化 Diagram Group Visibility
动画状态 TICKS_PER_CYCLE=20;cycle() 可为负 Diagram State

Diagram Group 列表(注册真源,共 15 个)

调试(2 个)

  • Debug Ruler — 像素标尺,唯一自定义宽度(332px);也可用作 NBT 查看器与指南针
  • NBT Viewer — pretty-print NBT

EnderStorage(2 个,需 EnderStorage)

Forge 通用(3 个)

GregTech 5(8 个,均需 gregtech 且版本非 GT6)

设置列表

API 列表

图表核心

组实现

组件

交互与提示

匹配与工具

EnderStorage 适配

Mixin

依赖范围说明

modid 收录状态
NotEnoughItems ❌ 不在收录范围(relation.md 无行),不建分类
gtnhlib ✅ 已登记,尚未成文(条目内按前向引用处理)
gregtech ✅ 已登记并成文
EnderStorage ✅ 已登记并成文
bartworks / miscutils / detravscannermod / dreamcraft / MineTweaker3 ❌ 不在收录范围

相关分类:gregtech、enderstorage。

源码缺陷

  1. Registry.java:70 —— 硬依赖闸门用 Mods.GREGTECH_5,其判别依赖 Loader...getVersion()。若 GT 的 modid 缺失,返回 false,行为正确; 但 Mods 的缓存字段 loaded 在 isLoaded() 里先判 !Loader.isModLoaded 写 false、else 分支才测版本,两条路径都会缓存,语义正确。
  2. DiagramGroup.java / AdaptiveWidthDiagramGroup.onUpdate() —— 硬取 this.diagrams.get(0),若被喂入空列表则 IndexOutOfBoundsException。 依赖上层 emptyDiagramPredicate 保证非空,是隐式前置条件。
  3. DiagramState.tick() —— ConfigOptions.CTRL_FAST_FORWARD.get() 在每个 tick 读取配置热路径;ticks 可无限增长(int 溢出), 源码注释已说明可为负但未做上限。
  4. ConfigGuiFactory.java:21 —— 依赖字符串字面量与反射类名一致, 重命名包即触发 IllegalStateException(有自检,设计如此)。