From 249dbaa791e90b8047df2e2f1b546f5a4f9166bf Mon Sep 17 00:00:00 2001 From: GaLi <3096147684@qq.com> Date: Tue, 3 Mar 2026 11:37:26 +0800 Subject: [PATCH] =?UTF-8?q?JEI=E5=86=99=E6=A0=B7=E6=9D=BF=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E6=98=AF=E5=90=A6=E5=90=AF=E7=94=A8=E6=9B=BF=E6=8D=A2?= =?UTF-8?q?=E6=8E=A7=E5=88=B6=EF=BC=8C=E9=85=8D=E6=96=B9=E4=B9=A6=E7=AD=BE?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E5=A4=B1=E8=B4=A5=E5=9B=9E=E9=80=80=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/event/CtrlQPatternKeyHandler.java | 26 +++++--- .../CreateAndUploadPatternC2SPacket.java | 48 +++++++++++++-- .../network/CreateCtrlQPatternC2SPacket.java | 59 +++++++++++++++++-- ...loadEncodedPatternToProviderC2SPacket.java | 1 + .../uploadPattern/CtrlQPendingUploadUtil.java | 12 ++++ 5 files changed, 127 insertions(+), 19 deletions(-) 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 1ca9eee..f377c6c 100644 --- a/src/main/java/com/extendedae_plus/client/event/CtrlQPatternKeyHandler.java +++ b/src/main/java/com/extendedae_plus/client/event/CtrlQPatternKeyHandler.java @@ -46,6 +46,8 @@ public final class CtrlQPatternKeyHandler { int keyCode = event.getKeyCode(); int scanCode = event.getScanCode(); + boolean isAllowSubstitutes = Screen.hasShiftDown(); + boolean isFluidSubstitutes = Screen.hasAltDown(); if (!ModKeybindings.CREATE_PATTERN_KEY.matches(keyCode, scanCode)) { return; } @@ -56,7 +58,7 @@ public final class CtrlQPatternKeyHandler { Optional recipeBookmark = JeiRuntimeProxy.getRecipeBookmarkUnderMouse(); if (recipeBookmark.isPresent()) { - handleRecipeBookmark(recipeBookmark.get()); + handleRecipeBookmark(recipeBookmark.get(), isAllowSubstitutes, isFluidSubstitutes); event.setCanceled(true); return; } @@ -91,16 +93,18 @@ public final class CtrlQPatternKeyHandler { selected.getRecipeId(), selected.isCraftingRecipe(), selectedIngredients, - selectedOutputs + selectedOutputs, + isAllowSubstitutes, + isFluidSubstitutes )); event.setCanceled(true); } - private static void handleRecipeBookmark(Object recipeBookmark) { + private static void handleRecipeBookmark(Object recipeBookmark, boolean isAllowSubstitutes, boolean isFluidSubstitutes) { if (isCraftingRecipe(recipeBookmark)) { - handleCraftingRecipeBookmark(recipeBookmark); + handleCraftingRecipeBookmark(recipeBookmark, isAllowSubstitutes, isFluidSubstitutes); } else { - handleProcessingRecipeBookmark(recipeBookmark); + handleProcessingRecipeBookmark(recipeBookmark, isAllowSubstitutes, isFluidSubstitutes); } } @@ -119,7 +123,7 @@ public final class CtrlQPatternKeyHandler { } } - private static void handleCraftingRecipeBookmark(Object recipeBookmark) { + private static void handleCraftingRecipeBookmark(Object recipeBookmark, boolean isAllowSubstitutes, boolean isFluidSubstitutes) { try { ResourceLocation recipeId = getRecipeId(recipeBookmark); if (recipeId == null) { @@ -158,13 +162,15 @@ public final class CtrlQPatternKeyHandler { recipeId, matching.isCraftingRecipe(), selectedIngredients, - selectedOutputs + selectedOutputs, + isAllowSubstitutes, + isFluidSubstitutes )); } catch (Throwable ignored) { } } - private static void handleProcessingRecipeBookmark(Object recipeBookmark) { + private static void handleProcessingRecipeBookmark(Object recipeBookmark, boolean isAllowSubstitutes, boolean isFluidSubstitutes) { try { ResourceLocation recipeId = getRecipeId(recipeBookmark); if (recipeId == null) { @@ -212,7 +218,9 @@ public final class CtrlQPatternKeyHandler { matching.isCraftingRecipe(), selectedIngredients, selectedOutputs, - true + true, + isAllowSubstitutes, + isFluidSubstitutes )); PacketDistributor.sendToServer(RequestProvidersListC2SPacket.INSTANCE); } catch (Throwable ignored) { diff --git a/src/main/java/com/extendedae_plus/network/CreateAndUploadPatternC2SPacket.java b/src/main/java/com/extendedae_plus/network/CreateAndUploadPatternC2SPacket.java index 1753851..5821876 100644 --- a/src/main/java/com/extendedae_plus/network/CreateAndUploadPatternC2SPacket.java +++ b/src/main/java/com/extendedae_plus/network/CreateAndUploadPatternC2SPacket.java @@ -41,13 +41,24 @@ public class CreateAndUploadPatternC2SPacket implements CustomPacketPayload { buf.writeBoolean(pkt.isCraftingPattern); ItemStack.OPTIONAL_LIST_STREAM_CODEC.encode(buf, pkt.selectedIngredients); ItemStack.OPTIONAL_LIST_STREAM_CODEC.encode(buf, pkt.outputs); + buf.writeBoolean(pkt.isAllowSubstitutes); + buf.writeBoolean(pkt.isFluidSubstitutes); }, buf -> { ResourceLocation recipeId = buf.readResourceLocation(); boolean isCraftingPattern = buf.readBoolean(); List ingredients = ItemStack.OPTIONAL_LIST_STREAM_CODEC.decode(buf); List outputs = ItemStack.OPTIONAL_LIST_STREAM_CODEC.decode(buf); - return new CreateAndUploadPatternC2SPacket(recipeId, isCraftingPattern, ingredients, outputs); + boolean isAllowSubstitutes = buf.readBoolean(); + boolean isFluidSubstitutes = buf.readBoolean(); + return new CreateAndUploadPatternC2SPacket( + recipeId, + isCraftingPattern, + ingredients, + outputs, + isAllowSubstitutes, + isFluidSubstitutes + ); } ); @@ -55,17 +66,32 @@ public class CreateAndUploadPatternC2SPacket implements CustomPacketPayload { private final boolean isCraftingPattern; private final List selectedIngredients; private final List outputs; + private final boolean isAllowSubstitutes; + private final boolean isFluidSubstitutes; public CreateAndUploadPatternC2SPacket( ResourceLocation recipeId, boolean isCraftingPattern, List selectedIngredients, List outputs + ) { + this(recipeId, isCraftingPattern, selectedIngredients, outputs, true, false); + } + + public CreateAndUploadPatternC2SPacket( + ResourceLocation recipeId, + boolean isCraftingPattern, + List selectedIngredients, + List outputs, + boolean isAllowSubstitutes, + boolean isFluidSubstitutes ) { this.recipeId = recipeId; this.isCraftingPattern = isCraftingPattern; this.selectedIngredients = selectedIngredients; this.outputs = outputs; + this.isAllowSubstitutes = isAllowSubstitutes; + this.isFluidSubstitutes = isFluidSubstitutes; } public static void handle(final CreateAndUploadPatternC2SPacket msg, final IPayloadContext ctx) { @@ -92,7 +118,15 @@ public class CreateAndUploadPatternC2SPacket implements CustomPacketPayload { return; } - ItemStack pattern = createPattern(recipeHolder, msg.isCraftingPattern, msg.selectedIngredients, msg.outputs, player); + ItemStack pattern = createPattern( + recipeHolder, + msg.isCraftingPattern, + msg.selectedIngredients, + msg.outputs, + msg.isAllowSubstitutes, + msg.isFluidSubstitutes, + player + ); if (pattern.isEmpty()) { refundBlankPattern(player, grid); player.displayClientMessage(Component.translatable("message.extendedae_plus.pattern_creation_failed"), false); @@ -101,7 +135,9 @@ public class CreateAndUploadPatternC2SPacket implements CustomPacketPayload { boolean uploaded = ExtendedAEPatternUploadUtil.uploadPatternToMatrix(player, pattern, grid); if (!uploaded) { - refundBlankPattern(player, grid); + if(!player.getInventory().add(pattern)){ + player.drop(pattern.copy(),false); + } } }); } @@ -144,6 +180,8 @@ public class CreateAndUploadPatternC2SPacket implements CustomPacketPayload { boolean isCrafting, List selectedIngredients, List selectedOutputs, + boolean isAllowSubstitutes, + boolean isFluidSubstitutes, ServerPlayer player ) { try { @@ -172,8 +210,8 @@ public class CreateAndUploadPatternC2SPacket implements CustomPacketPayload { craftingHolder, inputs, output, - true, - false + isAllowSubstitutes, + isFluidSubstitutes ); CustomData.update(DataComponents.CUSTOM_DATA, encodedPattern, tag -> tag.putString("encodePlayer", player.getGameProfile().getName())); return encodedPattern; diff --git a/src/main/java/com/extendedae_plus/network/CreateCtrlQPatternC2SPacket.java b/src/main/java/com/extendedae_plus/network/CreateCtrlQPatternC2SPacket.java index c5bf75a..a8a0746 100644 --- a/src/main/java/com/extendedae_plus/network/CreateCtrlQPatternC2SPacket.java +++ b/src/main/java/com/extendedae_plus/network/CreateCtrlQPatternC2SPacket.java @@ -42,6 +42,8 @@ public class CreateCtrlQPatternC2SPacket implements CustomPacketPayload { buf.writeBoolean(pkt.isCraftingPattern); ItemStack.OPTIONAL_LIST_STREAM_CODEC.encode(buf, pkt.selectedIngredients); ItemStack.OPTIONAL_LIST_STREAM_CODEC.encode(buf, pkt.outputs); + buf.writeBoolean(pkt.isAllowSubstitutes); + buf.writeBoolean(pkt.isFluidSubstitutes); buf.writeBoolean(pkt.openProviderSelector); }, buf -> { @@ -50,8 +52,18 @@ public class CreateCtrlQPatternC2SPacket implements CustomPacketPayload { List ingredients = ItemStack.OPTIONAL_LIST_STREAM_CODEC.decode(buf); List outputs = ItemStack.OPTIONAL_LIST_STREAM_CODEC.decode(buf); + boolean isAllowSubstitutes = buf.readBoolean(); + boolean isFluidSubstitutes = buf.readBoolean(); boolean openProviderSelector = buf.readableBytes() > 0 && buf.readBoolean(); - return new CreateCtrlQPatternC2SPacket(recipeId, isCraftingPattern, ingredients, outputs, openProviderSelector); + return new CreateCtrlQPatternC2SPacket( + recipeId, + isCraftingPattern, + ingredients, + outputs, + openProviderSelector, + isAllowSubstitutes, + isFluidSubstitutes + ); } ); @@ -60,6 +72,8 @@ public class CreateCtrlQPatternC2SPacket implements CustomPacketPayload { private final List selectedIngredients; private final List outputs; private final boolean openProviderSelector; + private final boolean isAllowSubstitutes; + private final boolean isFluidSubstitutes; public CreateCtrlQPatternC2SPacket( ResourceLocation recipeId, @@ -67,7 +81,7 @@ public class CreateCtrlQPatternC2SPacket implements CustomPacketPayload { List selectedIngredients, List outputs ) { - this(recipeId, isCraftingPattern, selectedIngredients, outputs, false); + this(recipeId, isCraftingPattern, selectedIngredients, outputs, false, true, false); } public CreateCtrlQPatternC2SPacket( @@ -76,12 +90,37 @@ public class CreateCtrlQPatternC2SPacket implements CustomPacketPayload { List selectedIngredients, List outputs, boolean openProviderSelector + ) { + this(recipeId, isCraftingPattern, selectedIngredients, outputs, openProviderSelector, true, false); + } + + public CreateCtrlQPatternC2SPacket( + ResourceLocation recipeId, + boolean isCraftingPattern, + List selectedIngredients, + List outputs, + boolean isAllowSubstitutes, + boolean isFluidSubstitutes + ) { + this(recipeId, isCraftingPattern, selectedIngredients, outputs, false, isAllowSubstitutes, isFluidSubstitutes); + } + + public CreateCtrlQPatternC2SPacket( + ResourceLocation recipeId, + boolean isCraftingPattern, + List selectedIngredients, + List outputs, + boolean openProviderSelector, + boolean isAllowSubstitutes, + boolean isFluidSubstitutes ) { this.recipeId = recipeId; this.isCraftingPattern = isCraftingPattern; this.selectedIngredients = selectedIngredients; this.outputs = outputs; this.openProviderSelector = openProviderSelector; + this.isAllowSubstitutes = isAllowSubstitutes; + this.isFluidSubstitutes = isFluidSubstitutes; } public static void handle(final CreateCtrlQPatternC2SPacket msg, final IPayloadContext ctx) { @@ -102,7 +141,15 @@ public class CreateCtrlQPatternC2SPacket implements CustomPacketPayload { return; } - ItemStack pattern = createPattern(recipeHolder, msg.isCraftingPattern, msg.selectedIngredients, msg.outputs, player); + ItemStack pattern = createPattern( + recipeHolder, + msg.isCraftingPattern, + msg.selectedIngredients, + msg.outputs, + msg.isAllowSubstitutes, + msg.isFluidSubstitutes, + player + ); if (pattern.isEmpty()) { player.getInventory().add(AEItems.BLANK_PATTERN.stack()); player.displayClientMessage(Component.translatable("message.extendedae_plus.pattern_creation_failed"), false); @@ -188,6 +235,8 @@ public class CreateCtrlQPatternC2SPacket implements CustomPacketPayload { boolean isCrafting, List selectedIngredients, List selectedOutputs, + boolean isAllowSubstitutes, + boolean isFluidSubstitutes, ServerPlayer player ) { try { @@ -216,8 +265,8 @@ public class CreateCtrlQPatternC2SPacket implements CustomPacketPayload { craftingHolder, inputs, output, - true, - false + isAllowSubstitutes, + isFluidSubstitutes ); CustomData.update(DataComponents.CUSTOM_DATA, encodedPattern, tag -> tag.putString("encodePlayer", player.getGameProfile().getName())); return encodedPattern; diff --git a/src/main/java/com/extendedae_plus/network/UploadEncodedPatternToProviderC2SPacket.java b/src/main/java/com/extendedae_plus/network/UploadEncodedPatternToProviderC2SPacket.java index f665b9d..16b8773 100644 --- a/src/main/java/com/extendedae_plus/network/UploadEncodedPatternToProviderC2SPacket.java +++ b/src/main/java/com/extendedae_plus/network/UploadEncodedPatternToProviderC2SPacket.java @@ -36,6 +36,7 @@ public class UploadEncodedPatternToProviderC2SPacket implements CustomPacketPayl if (CtrlQPendingUploadUtil.uploadPendingCtrlQPattern(player, msg.providerId)) { return; } + CtrlQPendingUploadUtil.returnPendingCtrlQPatternToInventory(player); } if (!(player.containerMenu instanceof PatternEncodingTermMenu menu)) return; diff --git a/src/main/java/com/extendedae_plus/util/uploadPattern/CtrlQPendingUploadUtil.java b/src/main/java/com/extendedae_plus/util/uploadPattern/CtrlQPendingUploadUtil.java index 2bc3fae..749829e 100644 --- a/src/main/java/com/extendedae_plus/util/uploadPattern/CtrlQPendingUploadUtil.java +++ b/src/main/java/com/extendedae_plus/util/uploadPattern/CtrlQPendingUploadUtil.java @@ -71,6 +71,18 @@ public final class CtrlQPendingUploadUtil { return true; } + public static boolean returnPendingCtrlQPatternToInventory(ServerPlayer player){ + if (player == null) return false; + ItemStack pending = getPendingCtrlQPattern(player); + if(pending.isEmpty()) return false; + + clearPendingCtrlQUpload(player); + if (!(player.getInventory().add(pending))) { + player.drop(pending.copy(),false); + } + return true; + } + public static List listAvailableProvidersFromPlayerNetwork(ServerPlayer player) { return listAvailableProvidersFromGrid(findPlayerGrid(player)); }