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..b5e76f7 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,44 @@ public final class JeiRuntimeProxy { } return Collections.emptyList(); } + + /** + * 将物品添加到 JEI 书签 + */ + public static void addBookmark(ItemStack stack) { + IJeiRuntime rt = RUNTIME; + if (rt == null || stack == null || stack.isEmpty()) return; + + IBookmarkOverlay overlay = rt.getBookmarkOverlay(); + if (overlay instanceof BookmarkOverlayAccessor accessor) { + BookmarkList list = accessor.eap$getBookmarkList(); + try { + var typedOpt = rt.getIngredientManager().createTypedIngredient(VanillaTypes.ITEM_STACK, stack); + typedOpt.ifPresent(typed -> { + IngredientBookmark bookmark = IngredientBookmark.create(typed, rt.getIngredientManager()); + list.add(bookmark); // add 内部会自动保存到配置 + }); + } catch (Throwable ignored) {} + } + } + + /** + * 从 JEI 书签移除物品 + */ + public static void removeBookmark(ItemStack stack) { + IJeiRuntime rt = RUNTIME; + if (rt == null || stack == null || stack.isEmpty()) return; + + IBookmarkOverlay overlay = rt.getBookmarkOverlay(); + if (overlay instanceof BookmarkOverlayAccessor accessor) { + BookmarkList list = accessor.eap$getBookmarkList(); + try { + var typedOpt = rt.getIngredientManager().createTypedIngredient(VanillaTypes.ITEM_STACK, stack); + typedOpt.ifPresent(typed -> { + IngredientBookmark bookmark = IngredientBookmark.create(typed, rt.getIngredientManager()); + list.remove(bookmark); + }); + } catch (Throwable ignored) {} + } + } } 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..9280311 --- /dev/null +++ b/src/main/java/com/extendedae_plus/mixin/ae2/menu/CraftConfirmMenuGoBackMixin.java @@ -0,0 +1,56 @@ +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; + +/** + * 在 CraftConfirmMenu.goBack() 结束后(RETURN)处理: + * 若客户端按住 Shift,则将缺失条目添加到 JEI 书签,便于后续合成或标记。 + */ +@Mixin(value = CraftConfirmMenu.class, remap = false) +public class CraftConfirmMenuGoBackMixin { + + @Inject(method = "goBack", at = @At("RETURN")) + private void eap$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; + + // 为缺失的条目添加 JEI 书签 + for (CraftingPlanSummaryEntry entry : entries) { + if (entry.getMissingAmount() > 0) { + try { + var display = entry.getWhat().wrapForDisplayOrFilter(); + if (display != null && !display.isEmpty()) { + // wrapForDisplayOrFilter 返回 ItemStack + JeiRuntimeProxy.addBookmark(display); + } + } catch (Throwable ignored) {} + } + } + } catch (Throwable ignored) {} + } +} diff --git a/src/main/resources/extendedae_plus.mixins.json b/src/main/resources/extendedae_plus.mixins.json index 451920a..3f9f3e1 100644 --- a/src/main/resources/extendedae_plus.mixins.json +++ b/src/main/resources/extendedae_plus.mixins.json @@ -36,6 +36,7 @@ "PickFromWirelessMixin", "accessor.AbstractContainerScreenAccessor", "accessor.ScreenAccessor", + "ae2.menu.CraftConfirmMenuGoBackMixin", "ae2.accessor.AEBaseScreenAccessor", "ae2.accessor.AEBaseScreenInvoker", "ae2.accessor.MEStorageScreenAccessor",