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)); }