diff --git a/src/main/java/com/extendedae_plus/client/event/CtrlQPatternKeyHandler.java b/src/main/java/com/extendedae_plus/client/event/CtrlQPatternKeyHandler.java
index 2a2467f..5199b25 100644
--- a/src/main/java/com/extendedae_plus/client/event/CtrlQPatternKeyHandler.java
+++ b/src/main/java/com/extendedae_plus/client/event/CtrlQPatternKeyHandler.java
@@ -7,6 +7,7 @@ import com.extendedae_plus.integration.jei.JeiRuntimeProxy;
import com.extendedae_plus.network.pattern.CreateCtrlQPatternC2SPacket;
import com.extendedae_plus.util.RecipeFinderUtil;
import com.extendedae_plus.util.RecipeInfo;
+import mezz.jei.api.constants.RecipeTypes;
import mezz.jei.api.constants.VanillaTypes;
import mezz.jei.api.ingredients.ITypedIngredient;
import net.minecraft.client.Minecraft;
@@ -28,7 +29,6 @@ import java.util.concurrent.atomic.AtomicInteger;
/**
* Ctrl+Q键快速创建样板事件监听器
*
- *
监听 Ctrl+Q 组合键,自动创建样板并掉落到玩家脚下
* 应用 JEI 书签优先级选择材料,优先选择工作台配方
*/
@Mod.EventBusSubscriber(modid = ExtendedAEPlus.MODID, value = Dist.CLIENT)
@@ -50,6 +50,17 @@ public class CtrlQPatternKeyHandler {
return;
}
+ // 检查鼠标下是否为配方书签
+ Optional> recipeBookmark = JeiRuntimeProxy.getRecipeBookmarkUnderMouse();
+
+ if (recipeBookmark.isPresent()) {
+ // 配方书签分支:处理带有配方类型的书签
+ handleRecipeBookmark(recipeBookmark.get());
+ event.setCanceled(true);
+ return;
+ }
+
+ // 普通书签分支:保持原有逻辑
// 获取鼠标悬浮的物品
Optional> ingredient = JeiRuntimeProxy.getIngredientUnderMouse();
@@ -88,7 +99,7 @@ public class CtrlQPatternKeyHandler {
// 应用JEI书签优先级选择材料
List selectedIngredients = selectIngredientsWithJeiPriority(selectedRecipeInfo);
-
+
// 获取输出材料(转换为 ItemStack,流体会被包装)
List selectedOutputs = convertOutputsToItemStacks(selectedRecipeInfo);
@@ -104,6 +115,64 @@ public class CtrlQPatternKeyHandler {
event.setCanceled(true);
}
+ /**
+ * 处理配方书签的逻辑
+ *
+ * @param recipeBookmark 配方书签对象(RecipeBookmark, ?>)
+ */
+ private static void handleRecipeBookmark(Object recipeBookmark) {
+ // 判断配方类型
+ if (isCraftingRecipe(recipeBookmark)) {
+ // 合成配方分支
+ handleCraftingRecipeBookmark(recipeBookmark);
+ } else {
+ // 其他配方分支(加工配方等)
+ handleProcessingRecipeBookmark(recipeBookmark);
+ }
+ }
+
+ /**
+ * 判断配方书签是否为合成配方
+ *
+ * @param recipeBookmark 配方书签对象
+ * @return true 如果是合成配方
+ */
+ private static boolean isCraftingRecipe(Object recipeBookmark) {
+ try {
+ // 通过反射获取 RecipeBookmark 的 recipeCategory
+ var getRecipeCategoryMethod = recipeBookmark.getClass().getMethod("getRecipeCategory");
+ Object recipeCategory = getRecipeCategoryMethod.invoke(recipeBookmark);
+
+ // 获取 recipeCategory 的 recipeType
+ var getRecipeTypeMethod = recipeCategory.getClass().getMethod("getRecipeType");
+ Object recipeType = getRecipeTypeMethod.invoke(recipeCategory);
+
+ // 判断是否为 RecipeTypes.CRAFTING
+ return RecipeTypes.CRAFTING.equals(recipeType);
+ } catch (Exception e) {
+ e.printStackTrace();
+ return false;
+ }
+ }
+
+ /**
+ * 处理合成配方书签
+ *
+ * @param recipeBookmark 配方书签对象
+ */
+ private static void handleCraftingRecipeBookmark(Object recipeBookmark) {
+ System.out.println("合成书签");
+ }
+
+ /**
+ * 处理加工配方书签
+ *
+ * @param recipeBookmark 配方书签对象
+ */
+ private static void handleProcessingRecipeBookmark(Object recipeBookmark) {
+ System.out.println("处理书签");
+ }
+
/**
* 应用JEI书签优先级选择配方材料
*
diff --git a/src/main/java/com/extendedae_plus/integration/jei/JeiBookmarkBridge.java b/src/main/java/com/extendedae_plus/integration/jei/JeiBookmarkBridge.java
index 9e1572d..e855d5b 100644
--- a/src/main/java/com/extendedae_plus/integration/jei/JeiBookmarkBridge.java
+++ b/src/main/java/com/extendedae_plus/integration/jei/JeiBookmarkBridge.java
@@ -160,6 +160,46 @@ public final class JeiBookmarkBridge {
return typeField;
}
+ /**
+ * 获取鼠标下的配方书签(如果存在)
+ *
+ * @return 配方书签对象(RecipeBookmark, ?>),如果不是配方书签则返回空
+ */
+ public static Optional> getRecipeBookmarkUnderMouse() {
+ IJeiRuntime rt = getRuntime();
+ if (rt == null) return Optional.empty();
+
+ IBookmarkOverlay bookmarkOverlay = rt.getBookmarkOverlay();
+ if (!(bookmarkOverlay instanceof BookmarkOverlayAccessor accessor)) {
+ return Optional.empty();
+ }
+
+ // 获取鼠标下的元素
+ Optional> ingredientOpt = bookmarkOverlay.getIngredientUnderMouse();
+ if (ingredientOpt.isEmpty()) {
+ return Optional.empty();
+ }
+
+ // 遍历书签列表,查找匹配的配方书签
+ BookmarkList bookmarkList = accessor.eap$getBookmarkList();
+ for (IElement> element : bookmarkList.getElements()) {
+ // 检查元素的 TypedIngredient 是否匹配
+ if (element.getTypedIngredient().equals(ingredientOpt.get())) {
+ // 检查是否有关联的书签
+ Optional> bookmarkOpt = element.getBookmark();
+ if (bookmarkOpt.isPresent()) {
+ Object bookmark = bookmarkOpt.get();
+ // 判断是否为 RecipeBookmark(而非 IngredientBookmark)
+ if (bookmark.getClass().getSimpleName().equals("RecipeBookmark")) {
+ return Optional.of(bookmark);
+ }
+ }
+ }
+ }
+
+ return Optional.empty();
+ }
+
/**
* 从 JEI 书签移除物品
*/
diff --git a/src/main/java/com/extendedae_plus/integration/jei/JeiRuntimeProxy.java b/src/main/java/com/extendedae_plus/integration/jei/JeiRuntimeProxy.java
index 38c3541..089ea9b 100644
--- a/src/main/java/com/extendedae_plus/integration/jei/JeiRuntimeProxy.java
+++ b/src/main/java/com/extendedae_plus/integration/jei/JeiRuntimeProxy.java
@@ -167,6 +167,23 @@ public final class JeiRuntimeProxy {
}
}
+ /**
+ * 获取鼠标下的配方书签(如果存在)
+ *
+ * @return 配方书签对象(RecipeBookmark, ?>),如果不是配方书签则返回空
+ */
+ public static Optional> getRecipeBookmarkUnderMouse() {
+ try {
+ Class> bridge = Class.forName("com.extendedae_plus.integration.jei.JeiBookmarkBridge");
+ var m = bridge.getMethod("getRecipeBookmarkUnderMouse");
+ @SuppressWarnings("unchecked")
+ Optional> result = (Optional>) m.invoke(null);
+ return result == null ? Optional.empty() : result;
+ } catch (Throwable ignored) {
+ return Optional.empty();
+ }
+ }
+
// Note: helper methods moved to bridge to avoid referencing JEI GUI at class load time.
/**