From 45fdf749b1cf48ea1cb7900977f85e669f5919bd Mon Sep 17 00:00:00 2001 From: GaLi <3096147684@qq.com> Date: Tue, 3 Mar 2026 10:53:05 +0800 Subject: [PATCH] =?UTF-8?q?JEI=E5=86=99=E6=A0=B7=E6=9D=BF=E6=94=AF?= =?UTF-8?q?=E6=8C=81shift=E6=8E=A7=E5=88=B6=E5=90=AF=E7=94=A8=E7=89=A9?= =?UTF-8?q?=E5=93=81=E6=9B=BF=E6=8D=A2=EF=BC=8Calt=E5=90=AF=E7=94=A8?= =?UTF-8?q?=E6=B5=81=E4=BD=93=E6=9B=BF=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/event/CtrlQPatternKeyHandler.java | 38 ++++++++++++------- .../CreateAndUploadPatternC2SPacket.java | 20 +++++++--- .../pattern/CreateCtrlQPatternC2SPacket.java | 26 ++++++++----- 3 files changed, 56 insertions(+), 28 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 46b7b49..ddbce6f 100644 --- a/src/main/java/com/extendedae_plus/client/event/CtrlQPatternKeyHandler.java +++ b/src/main/java/com/extendedae_plus/client/event/CtrlQPatternKeyHandler.java @@ -4,6 +4,7 @@ import com.extendedae_plus.ExtendedAEPlus; import com.extendedae_plus.client.ModKeybindings; import com.extendedae_plus.init.ModNetwork; import com.extendedae_plus.integration.jei.JeiRuntimeProxy; +import com.extendedae_plus.network.pattern.CreateAndUploadPatternC2SPacket; import com.extendedae_plus.network.pattern.CreateCtrlQPatternC2SPacket; import com.extendedae_plus.network.provider.RequestProvidersListC2SPacket; import com.extendedae_plus.util.RecipeFinderUtil; @@ -22,7 +23,9 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.ScreenEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; +import org.lwjgl.glfw.GLFW; +import java.sql.SQLOutput; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -42,8 +45,10 @@ public class CtrlQPatternKeyHandler { Screen screen = event.getScreen(); int keyCode = event.getKeyCode(); int scanCode = event.getScanCode(); + boolean isAllowSubstitutes = Screen.hasShiftDown(); + boolean isFluidSubstitutes = Screen.hasAltDown(); - // 使用 KeyMapping 检测按键(包含修饰键) + // 使用 KeyMapping if (!ModKeybindings.CREATE_PATTERN_KEY.matches(keyCode, scanCode)) { return; } @@ -58,7 +63,7 @@ public class CtrlQPatternKeyHandler { if (recipeBookmark.isPresent()) { // 配方书签分支:处理带有配方类型的书签 - handleRecipeBookmark(recipeBookmark.get()); + handleRecipeBookmark(recipeBookmark.get(),isAllowSubstitutes,isFluidSubstitutes); event.setCanceled(true); return; } @@ -106,12 +111,17 @@ public class CtrlQPatternKeyHandler { // 获取输出材料(转换为 ItemStack,流体会被包装) List selectedOutputs = convertOutputsToItemStacks(selectedRecipeInfo); + + System.out.println("sendPackage"); // 发送网络包到服务器 ModNetwork.CHANNEL.sendToServer(new CreateCtrlQPatternC2SPacket( selectedRecipeInfo.getRecipe().getId(), selectedRecipeInfo.isCraftingRecipe(), selectedIngredients, - selectedOutputs + selectedOutputs, + false, + isAllowSubstitutes, + isFluidSubstitutes )); // 消耗事件,防止传播 @@ -123,14 +133,14 @@ public class CtrlQPatternKeyHandler { * * @param recipeBookmark 配方书签对象(RecipeBookmark) */ - 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); } } @@ -163,7 +173,7 @@ public class CtrlQPatternKeyHandler { * * @param recipeBookmark 配方书签对象 */ - private static void handleCraftingRecipeBookmark(Object recipeBookmark) { + private static void handleCraftingRecipeBookmark(Object recipeBookmark,boolean isAllowSubstitutes,boolean isFluidSubstitutes) { try { // 1. 获取配方ID net.minecraft.resources.ResourceLocation recipeId = getRecipeIdCompat(recipeBookmark); @@ -274,11 +284,13 @@ public class CtrlQPatternKeyHandler { List selectedOutputs = convertOutputsToItemStacks(matchingRecipeInfo); // 11. 发送网络包创建样板并上传到装配矩阵 - ModNetwork.CHANNEL.sendToServer(new com.extendedae_plus.network.pattern.CreateAndUploadPatternC2SPacket( + ModNetwork.CHANNEL.sendToServer(new CreateAndUploadPatternC2SPacket( recipeId, matchingRecipeInfo.isCraftingRecipe(), selectedIngredients, - selectedOutputs + selectedOutputs, + isAllowSubstitutes, + isFluidSubstitutes )); } catch (Exception e) { @@ -291,7 +303,7 @@ public class CtrlQPatternKeyHandler { * * @param recipeBookmark 配方书签对象 */ - private static void handleProcessingRecipeBookmark(Object recipeBookmark) { + private static void handleProcessingRecipeBookmark(Object recipeBookmark,boolean isAllowSubstitutes,boolean isFluidSubstitutes) { try { net.minecraft.resources.ResourceLocation recipeId = getRecipeIdCompat(recipeBookmark); if (recipeId == null) { @@ -382,7 +394,9 @@ public class CtrlQPatternKeyHandler { matchingRecipeInfo.isCraftingRecipe(), selectedIngredients, selectedOutputs, - true + true, + isAllowSubstitutes, + isFluidSubstitutes )); ModNetwork.CHANNEL.sendToServer(new RequestProvidersListC2SPacket()); @@ -396,7 +410,6 @@ public class CtrlQPatternKeyHandler { return null; } - // JEI 1.20 分支 try { var getRecipeUidMethod = recipeBookmark.getClass().getMethod("getRecipeUid"); Object recipeId = getRecipeUidMethod.invoke(recipeBookmark); @@ -406,7 +419,6 @@ public class CtrlQPatternKeyHandler { } catch (Throwable ignored) { } - // JEI 1.21+ 分支 try { Object recipe = recipeBookmark.getClass().getMethod("getRecipe").invoke(recipeBookmark); Object recipeCategory = recipeBookmark.getClass().getMethod("getRecipeCategory").invoke(recipeBookmark); diff --git a/src/main/java/com/extendedae_plus/network/pattern/CreateAndUploadPatternC2SPacket.java b/src/main/java/com/extendedae_plus/network/pattern/CreateAndUploadPatternC2SPacket.java index d84a44e..53ab35a 100644 --- a/src/main/java/com/extendedae_plus/network/pattern/CreateAndUploadPatternC2SPacket.java +++ b/src/main/java/com/extendedae_plus/network/pattern/CreateAndUploadPatternC2SPacket.java @@ -42,12 +42,16 @@ public class CreateAndUploadPatternC2SPacket { 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) { + 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 encode(CreateAndUploadPatternC2SPacket msg, FriendlyByteBuf buf) { @@ -61,6 +65,8 @@ public class CreateAndUploadPatternC2SPacket { for (ItemStack stack : msg.outputs) { buf.writeItem(stack); } + buf.writeBoolean(msg.isAllowSubstitutes); + buf.writeBoolean(msg.isFluidSubstitutes); } public static CreateAndUploadPatternC2SPacket decode(FriendlyByteBuf buf) { @@ -76,7 +82,9 @@ public class CreateAndUploadPatternC2SPacket { for (int i = 0; i < outputCount; i++) { outputs.add(buf.readItem()); } - return new CreateAndUploadPatternC2SPacket(recipeId, isCraftingPattern, ingredients, outputs); + boolean isAllowSubstitutes = buf.readBoolean(); + boolean isFluidSubstitutes = buf.readBoolean(); + return new CreateAndUploadPatternC2SPacket(recipeId, isCraftingPattern, ingredients, outputs,isAllowSubstitutes,isFluidSubstitutes); } public static void handle(CreateAndUploadPatternC2SPacket msg, Supplier ctxSupplier) { @@ -121,7 +129,7 @@ public class CreateAndUploadPatternC2SPacket { } // 4. 创建样板 - ItemStack pattern = createPattern(recipe, msg.isCraftingPattern, msg.selectedIngredients, msg.outputs, player); + ItemStack pattern = createPattern(recipe, msg.isCraftingPattern, msg.selectedIngredients, msg.outputs,msg.isAllowSubstitutes,msg.isFluidSubstitutes, player); if (pattern.isEmpty()) { // 创建失败,退还空白样板到网络 @@ -222,7 +230,7 @@ public class CreateAndUploadPatternC2SPacket { /** * 从配方创建样板 */ - private static ItemStack createPattern(Recipe recipe, boolean isCrafting, List selectedIngredients, List selectedOutputs, ServerPlayer player) { + private static ItemStack createPattern(Recipe recipe, boolean isCrafting, List selectedIngredients, List selectedOutputs, boolean isAllowSubstitutes, boolean isFluidSubstitutes, ServerPlayer player) { try { if (isCrafting && recipe instanceof CraftingRecipe craftingRecipe) { // 合成样板 @@ -241,8 +249,8 @@ public class CreateAndUploadPatternC2SPacket { craftingRecipe, inputs, output, - true, - false + isAllowSubstitutes, + isFluidSubstitutes ); encodedPattern.getOrCreateTag().putString("encodePlayer", player.getName().getString()); diff --git a/src/main/java/com/extendedae_plus/network/pattern/CreateCtrlQPatternC2SPacket.java b/src/main/java/com/extendedae_plus/network/pattern/CreateCtrlQPatternC2SPacket.java index 0f012ef..7a3e80a 100644 --- a/src/main/java/com/extendedae_plus/network/pattern/CreateCtrlQPatternC2SPacket.java +++ b/src/main/java/com/extendedae_plus/network/pattern/CreateCtrlQPatternC2SPacket.java @@ -41,17 +41,21 @@ public class CreateCtrlQPatternC2SPacket { private final List selectedIngredients; private final List outputs; private final boolean openProviderSelector; + private final boolean isAllowSubstitutes; + private final boolean isFluidSubstitutes; - public CreateCtrlQPatternC2SPacket(ResourceLocation recipeId, boolean isCraftingPattern, List selectedIngredients, List outputs) { - this(recipeId, isCraftingPattern, selectedIngredients, outputs, 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) { + 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 encode(CreateCtrlQPatternC2SPacket msg, FriendlyByteBuf buf) { @@ -65,6 +69,8 @@ public class CreateCtrlQPatternC2SPacket { for (ItemStack stack : msg.outputs) { buf.writeItem(stack); } + buf.writeBoolean(msg.isAllowSubstitutes); + buf.writeBoolean(msg.isFluidSubstitutes); buf.writeBoolean(msg.openProviderSelector); } @@ -84,8 +90,10 @@ public class CreateCtrlQPatternC2SPacket { outputs.add(buf.readItem()); } + 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); } public static void handle(CreateCtrlQPatternC2SPacket msg, Supplier ctxSupplier) { @@ -110,7 +118,7 @@ public class CreateCtrlQPatternC2SPacket { return; } - ItemStack pattern = createPattern(recipe, msg.isCraftingPattern, msg.selectedIngredients, msg.outputs, player); + ItemStack pattern = createPattern(recipe, 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); @@ -235,7 +243,7 @@ public class CreateCtrlQPatternC2SPacket { return false; } - private static ItemStack createPattern(Recipe recipe, boolean isCrafting, List selectedIngredients, List selectedOutputs, ServerPlayer player) { + private static ItemStack createPattern(Recipe recipe, boolean isCrafting, List selectedIngredients, List selectedOutputs, boolean isAllowSubstitutes,boolean isFluidSubstitutes, ServerPlayer player) { try { if (isCrafting && recipe instanceof CraftingRecipe craftingRecipe) { ItemStack[] inputs = new ItemStack[9]; @@ -252,8 +260,8 @@ public class CreateCtrlQPatternC2SPacket { craftingRecipe, inputs, output, - true, - false + isAllowSubstitutes, + isFluidSubstitutes ); encodedPattern.getOrCreateTag().putString("encodePlayer", player.getName().getString()); @@ -302,4 +310,4 @@ public class CreateCtrlQPatternC2SPacket { return ItemStack.EMPTY; } } -} \ No newline at end of file +}