终端叠加层

基本信息

属性 值
实现文件 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)。