GuiRecipe Accessor

基本信息

mixin.GuiRecipe_Accessor —— 本分类唯一的 mixin,用 @Invoker 把 NEI GuiRecipe 的私有静态方法暴露出来。

@Mixin(value = GuiRecipe.class, remap = false)
public interface GuiRecipe_Accessor {
    @Invoker("getCurrentRecipeId")
    static RecipeId invokeGetCurrentRecipeId(GuiScreen gui) {
        throw new UnsupportedOperationException();
    }
}
项 值
目标类 codechicken.nei.recipe.GuiRecipe(第三方 NEI 类)
remap false —— 目标不是 Minecraft 映射类,不做混淆重映射
暴露方法 getCurrentRecipeId(GuiScreen) —— static
调用形式 GuiRecipe_Accessor.invokeGetCurrentRecipeId(Minecraft.getMinecraft().currentScreen)

Mixin 配置

src/main/resources/mixins.neicustomdiagram.json:

{
  "required": true,
  "minVersion": "0.0.1",
  "package": "com.github.dcysteine.neicustomdiagram.mixin",
  "target": "@env(DEFAULT)",
  "compatibilityLevel": "JAVA_8",
  "mixins": [],
  "client": ["GuiRecipe_Accessor"],
  "server": []
}
字段 值 判读
required true 目标类缺失 → 启动即崩
mixins [](空数组) 无通用注入
client ["GuiRecipe_Accessor"] 唯一注入,客户端侧
server [] 服务端无注入
package com.github.dcysteine.neicustomdiagram.mixin 与实际目录一致

⚠️ 数 JSON 会得 0 的陷阱:这里 mixins 数组是空的, 唯一的注入在 client 数组里。必须同时看两个数组。 与 coretweaks 靠 MixinConfigPlugin 动态注册的情况不同 —— 本 mod 是静态 JSON 声明,没有 plugin 字段。

依赖安全性

目标 GuiRecipe 来自 NEI,而 NEI 是 @Mod 里声明的 required-after:NotEnoughItems 硬依赖 —— 因此目标类必然存在, required: true 是安全的。缺少 addRequiredMod 保护的 第三方目标 + required: true 组合才会造成缺 mod 时启动崩溃 (参见 infohud 的缺陷)。

唯一调用点

StorageListener 的 clientStorageUpdate —— 拿到当前 NEI 配方 ID,判断刷新目标。

相关条目

源码

  • src/main/java/com/github/dcysteine/neicustomdiagram/mixin/GuiRecipe_Accessor.java
  • src/main/resources/mixins.neicustomdiagram.json