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 ce96613..3965a63 100644 --- a/src/main/java/com/extendedae_plus/integration/jei/JeiRuntimeProxy.java +++ b/src/main/java/com/extendedae_plus/integration/jei/JeiRuntimeProxy.java @@ -7,7 +7,9 @@ import mezz.jei.api.runtime.IBookmarkOverlay; import mezz.jei.api.runtime.IIngredientListOverlay; import mezz.jei.api.runtime.IJeiRuntime; import mezz.jei.gui.bookmarks.BookmarkList; +import mezz.jei.gui.bookmarks.IngredientBookmark; import mezz.jei.gui.overlay.elements.IElement; +import net.minecraft.world.item.ItemStack; import javax.annotation.Nullable; import java.util.Collections; @@ -132,4 +134,42 @@ public final class JeiRuntimeProxy { } return Collections.emptyList(); } + + /** + * 将物品添加到 JEI 书签 + */ + public static void addBookmark(ItemStack stack) { + IJeiRuntime rt = RUNTIME; + if (rt == null) return; + + IBookmarkOverlay overlay = rt.getBookmarkOverlay(); + if (overlay instanceof BookmarkOverlayAccessor accessor) { + BookmarkList list = accessor.eap$getBookmarkList(); + Optional> typedOpt = rt.getIngredientManager() + .createTypedIngredient(VanillaTypes.ITEM_STACK, stack); + typedOpt.ifPresent(typed -> { + IngredientBookmark bookmark = IngredientBookmark.create(typed, rt.getIngredientManager()); + list.add(bookmark); // add 内部会自动保存到配置 + }); + } + } + + /** + * 从 JEI 书签移除物品 + */ + public static void removeBookmark(ItemStack stack) { + IJeiRuntime rt = RUNTIME; + if (rt == null) return; + + IBookmarkOverlay overlay = rt.getBookmarkOverlay(); + if (overlay instanceof BookmarkOverlayAccessor accessor) { + BookmarkList list = accessor.eap$getBookmarkList(); + Optional> typedOpt = rt.getIngredientManager() + .createTypedIngredient(VanillaTypes.ITEM_STACK, stack); + typedOpt.ifPresent(typed -> { + IngredientBookmark bookmark = IngredientBookmark.create(typed, rt.getIngredientManager()); + list.remove(bookmark); + }); + } + } } diff --git a/src/main/java/com/extendedae_plus/mixin/ae2/menu/CraftConfirmMenuGoBackMixin.java b/src/main/java/com/extendedae_plus/mixin/ae2/menu/CraftConfirmMenuGoBackMixin.java new file mode 100644 index 0000000..0bbc164 --- /dev/null +++ b/src/main/java/com/extendedae_plus/mixin/ae2/menu/CraftConfirmMenuGoBackMixin.java @@ -0,0 +1,52 @@ +package com.extendedae_plus.mixin.ae2.menu; + +import appeng.menu.me.crafting.CraftConfirmMenu; +import appeng.menu.me.crafting.CraftingPlanSummary; +import appeng.menu.me.crafting.CraftingPlanSummaryEntry; +import com.extendedae_plus.integration.jei.JeiRuntimeProxy; +import net.minecraft.client.gui.screens.Screen; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.util.List; + +/** + * Inject into CraftConfirmMenu.goBack() after it finishes and read the plan entries. + */ +@Mixin(CraftConfirmMenu.class) +public class CraftConfirmMenuGoBackMixin { + + @Inject(method = "goBack", at = @At("RETURN"), remap = false) + private void afterGoBack(CallbackInfo ci) { + CraftConfirmMenu self = (CraftConfirmMenu) (Object) this; + + try { + // 只在客户端执行此逻辑,服务端直接返回 + if (!self.isClientSide()) return; + + // 检测本地客户端是否按下了 shift 键 + boolean shiftDown = false; + try { + shiftDown = Screen.hasShiftDown(); + } catch (Throwable ignored) {} + if (!shiftDown) return; + + // 获取合成计划摘要 + CraftingPlanSummary plan = self.getPlan(); + if (plan == null) return; + + // 获取合成计划条目列表 + List entries = plan.getEntries(); + if (entries == null || entries.isEmpty()) return; + + // 仅在按住 shift 时为缺失的条目添加 JEI 书签 + for (CraftingPlanSummaryEntry entry : entries) { + if (entry.getMissingAmount() > 0) { + JeiRuntimeProxy.addBookmark(entry.getWhat().wrapForDisplayOrFilter()); + } + } + } catch (Throwable ignored) {} + } +} \ No newline at end of file diff --git a/src/main/resources/extendedae_plus.mixins.json b/src/main/resources/extendedae_plus.mixins.json index 6b6f79d..5037016 100644 --- a/src/main/resources/extendedae_plus.mixins.json +++ b/src/main/resources/extendedae_plus.mixins.json @@ -46,6 +46,7 @@ "ae2.helpers.PatternProviderLogicAdvancedMixin", "ae2.helpers.PatternProviderLogicDoublingMixin", "ae2.menu.ContainerPatternEncodingTermMenuMixin", + "ae2.menu.CraftConfirmMenuGoBackMixin", "ae2.menu.MEStorageMenuMixin", "ae2.menu.PatternEncodingTermMenuMixin", "ae2.menu.PatternProviderMenuAdvancedMixin",