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/DiagramBuilder。 - 匹配器(Matcher) —— 决定「哪些物品/流体能查到本组图」。
- 3 种可见性闸门 —— 缺依赖、硬禁用、软禁用,效果各不相同。
- 1 个 mixin ——
@Invoker暴露 NEIGuiRecipe.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)
- Ender Storage Chest Overview — 每页 4 图
- Ender Storage Tank Overview — 每页 2 图
Forge 通用(3 个)
- World-Gen Loot — 唯一显式 ALWAYS_SHOWN
- Forge Fluid Containers
- Forge Ore Dictionary
GregTech 5(8 个,均需 gregtech 且版本非 GT6)
- GregTech Circuits — 每页 1 图
- GregTech Lenses — 17 种透镜颜色
- GregTech Material Parts
- GregTech Material Tools — 唯一覆盖
ignoreNbt=false的 GT 组 - GregTech Ore Dictionary
- GregTech Ore Prefixes
- GregTech Ore Processing
- GregTech Recipe Debugger — 诊断工具,源码自述「quite heavy」
设置列表
- Config Options —
<config>/NEICustomDiagram.cfg,9 个注册项 + 1 个独立开关 - Registry — 15 组注册表与三道闸门
- Mods — 8 个依赖常量;GT5/GT6 靠版本判别
- DiagramGroupVisibility — 7 个取值
- ConfigGui — 客户端配置界面
API 列表
图表核心
- Diagram —
slotInsertions()是ImmutableMultiset - Layout — 槽位键是 API 契约
- DiagramState — 负值
%陷阱 - Grid — 14×7 网格;
TOTAL_WIDTH=166 - DiagramGenerator
- DiagramGroupInfo
组实现
- DiagramGroup
- CustomDiagramGroup
- AdaptiveWidthDiagramGroup — 宽度 = 首图宽 + 3
组件
- Component / ItemComponent / FluidComponent
- DisplayComponent —
stackSize是Optional - ImmutableNbtWrapper
交互与提示
匹配与工具
- DiagramMatcher
- OreDictUtil / GT Ore Dict Util
- FluidDictUtil / GT Fluid Dict Util
- BartWorks Ore Dict Util
- GT Diagram Util / NbtUtil
- LensColour — 包私有,17 个常量
EnderStorage 适配
- EnderStorageUtil —
MAX_FREQUENCY = 0xFFF - EnderStorageFrequency
- StorageListener
Mixin
- GuiRecipe Accessor — 目标为第三方 NEI 类
依赖范围说明
| modid | 收录状态 |
|---|---|
NotEnoughItems |
❌ 不在收录范围(relation.md 无行),不建分类 |
gtnhlib |
✅ 已登记,尚未成文(条目内按前向引用处理) |
gregtech |
✅ 已登记并成文 |
EnderStorage |
✅ 已登记并成文 |
bartworks / miscutils / detravscannermod / dreamcraft / MineTweaker3 |
❌ 不在收录范围 |
相关分类:gregtech、enderstorage。
源码缺陷
Registry.java:70—— 硬依赖闸门用Mods.GREGTECH_5,其判别依赖Loader...getVersion()。若 GT 的 modid 缺失,返回false,行为正确; 但Mods的缓存字段loaded在isLoaded()里先判!Loader.isModLoaded写false、else 分支才测版本,两条路径都会缓存,语义正确。DiagramGroup.java/AdaptiveWidthDiagramGroup.onUpdate()—— 硬取this.diagrams.get(0),若被喂入空列表则IndexOutOfBoundsException。 依赖上层emptyDiagramPredicate保证非空,是隐式前置条件。DiagramState.tick()——ConfigOptions.CTRL_FAST_FORWARD.get()在每个 tick 读取配置热路径;ticks可无限增长(int溢出), 源码注释已说明可为负但未做上限。ConfigGuiFactory.java:21—— 依赖字符串字面量与反射类名一致, 重命名包即触发IllegalStateException(有自检,设计如此)。