终端叠加层
基本信息
| 属性 | 值 |
|---|---|
| 实现文件 | src/main/java/com/github/vfyjxf/nee/nei/ |
| 相关类数 | 8(6 个 handler + NEETerminalOverlayButton + NEECraftingPreviewHandler) |
| 注册入口 | NEINeeConfig.loadConfig()(NEINeeConfig.java:48-81) |
| 作用 | 把 AE2 / ThE / Avaritia 系终端接进 NEI,并在 NEI 侧加「Request」按钮 |
mcmod.info 的 description 一句话点明了动机:「This mod replaces AE2’s default NEI integration for the Pattern Terminal.」
8 个相关类
| 类 | 挂载目标 | 类型 |
|---|---|---|
NEEPatternTerminalHandler |
GuiPatternTerm、GuiPatternTermEx |
GuiOverlayHandler |
NEECraftingTerminalHandler |
GuiCraftingTerm、GuiWirelessCraftingTerminal |
GuiOverlayHandler |
NEEKnowledgeInscriberHandler |
GuiKnowledgeInscriber(ThE) |
GuiOverlayHandler |
NEEExtremeAutoCrafterHandler |
GuiExtremeAutoCrafter(Avaritia Addons) |
GuiOverlayHandler |
NEETerminalBookmarkContainerHandler |
6 个 GUI,见下 | BookmarkContainerHandler |
GT6StackStringifyHandler |
全局 | StackStringifyHandler |
NEETerminalOverlayButton |
被前两个 terminal handler 调用 | GuiOverlayButton 子类 |
NEECraftingPreviewHandler |
挂在 MinecraftForge.EVENT_BUS,非 NEI handler |
单例 + TemplateRecipeHandler 辅助 |
各 handler 都是单例(instance 字段),在 ClientProxy.init 里注册到 MinecraftForge.EVENT_BUS(ClientProxy.java:25-29)。
NEETerminalOverlayButton
不是独立 handler,而是被 NEEPatternTerminalHandler(:281)与 NEECraftingTerminalHandler(:182)在渲染按钮列表时调用的工具类。它提供 updateRecipeButtons(guiRecipe, event.buttonList),把 AE2 自己的配方按钮就地替换成 NEETerminalOverlayButton(:146),使按钮支持 NEI 的物品悬浮信息。内含嵌套类 NEEItemOverlayState(:27)作为 ItemOverlayState 载体。
NEECraftingPreviewHandler
单例(:49),在 ClientProxy.init 注册到 MinecraftForge.EVENT_BUS(ClientProxy.java:29)。它实现「合成预览」:监听 GuiOpenEvent / GuiScreenEvent,在 AE2 的 GuiCraftAmount / GuiCraftConfirm 界面上绘制配方树,并可用 nee.nopreview 键切换成「不预览」模式(:64 NEIClientConfig.isKeyHashDown("nee.nopreview"))。它内部跟踪样板接口是否存在(isPatternInterfaceExists,:51),并通过 PacketCraftingRequest 把请求发到服务端。
挂载矩阵
样板终端(无条件)
GuiPatternTerm 与 GuiPatternTermEx 对所有标识符注册叠加层(NEINeeConfig.java:63-66、:216-219)。标识符集合 = 6 个原版 + 全部已加载 配方处理器 的 getAllOverlayIdentifier()。
GuiPatternTermEx 会排除 crafting / crafting2x2(:213-214)。
合成终端
GuiCraftingTerm 注册 crafting 与 crafting2x2 两个标识符(:153-156)。无线合成终端(ae2wct 存在时)同样注册这两个(:160-168)。
Thaumic Energistics 知识编码台
仅当 thaumicenergistics 加载时,且 Class.forName 成功(:174-209),注册 5 个标识符:
| 标识符 | 内容 |
|---|---|
arcaneshapedrecipes |
奥术有序合成 |
arcaneshapelessSrecipes |
奥术无序合成(注意源码里首字母大写的 S) |
thaumcraft.arcane.shaped |
Thaumcraft 奥术有序 |
thaumcraft.arcane.shapeless |
Thaumcraft 奥术无序 |
thaumcraft.wands |
魔杖 |
Class.forName 失败时整段被 catch (ClassNotFoundException ignored) 静默跳过(:207)。
Avaritia 系
- 极致合成台(
Avaritia):注册extreme标识符,偏移 9, 5,但 handler 用 NEI 自带的DefaultOverlayHandler(:247-248)——本 mod 不接管极致合成台,只补了叠加层位置 - 极致自动合成机(
avaritiaddons):注册extreme标识符,偏移 181, 15,handler 为NEEExtremeAutoCrafterHandler(:231-235)
书签容器
NEETerminalBookmarkContainerHandler 挂到 6 个 GUI(:84-100):
| GUI | 条件 |
|---|---|
GuiPatternTerm |
无条件 |
GuiPatternTermEx |
无条件 |
GuiCraftingTerm |
无条件 |
GuiMEMonitorable |
无条件 |
GuiMEPortableCell |
无条件 |
GuiWirelessCraftingTerminal |
ae2wct 存在 |
GuiArcaneCraftingTerminal |
thaumicenergistics 存在 |
NEIController 替换
replaceNEIController()(:128-150)遍历 GuiContainerManager.inputHandlers,找到 NEIController 后移除原对象、插入一个匿名子类,唯一覆写是 mouseScrolled:当 GUI 的精确 class 在 transferBlacklist(GuiInterface、GuiPatternTerm,:44-45)里时返回 false,否则走原逻辑。
意图是让这两个界面里的滚轮不触发 NEI 的输入转移。
if (controllerIndex > 0)(:136)意味着索引为 0 时不替换——若 NEIController 恰好排在 inputHandlers 首位,功能会静默失效。
替换成功时打日志「NEIController replaced success」(:148),是排查该功能是否生效的第一现场。
GT6 栈字符串化
CommonProxy.init(proxy/CommonProxy.java:35-37)在 gregapi 与 gregapi_post 同时加载时注册 GT6StackStringifyHandler,让 NEI 正确显示 GT6 的物品 ID。GTNH 用的是 GT5(modid gregtech),因此在 GTNH 上这段代码不会执行。
客户端事件
GuiEventHandler 同时注册到 FML bus 与 MinecraftForge.EVENT_BUS(ClientProxy.java:23-24),并被 API.registerNEIGuiHandler 注册(NEINeeConfig.java:122)及 GuiContainerManager.addTooltipHandler 注册(:123)。