From be3bc1dcf8219d2d29931696542c6d4c35292f4a Mon Sep 17 00:00:00 2001 From: XianYuFish001 Date: Wed, 24 Sep 2025 16:48:13 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=86=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E7=AB=AF=E6=89=93=E4=B8=8D=E5=BC=80=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gradle.properties | 2 +- .../extendedae_plus/client/InputEvents.java | 70 +++++++++++-------- .../PatternEncodingTermMenuMixinHelper.java | 5 ++ .../gui/PatternProviderScreenMixin.java | 2 +- .../menu/PatternEncodingTermMenuMixin.java | 21 +++--- .../network/C2SPacketTargetKeyTriggered.java | 47 +++++++++++++ .../extendedae_plus/network/ModNetwork.java | 3 + .../network/ProvidersListS2CPacket.java | 17 +++-- .../resources/extendedae_plus.mixins.json | 2 +- 9 files changed, 122 insertions(+), 47 deletions(-) create mode 100644 src/main/java/com/extendedae_plus/client/PatternEncodingTermMenuMixinHelper.java create mode 100644 src/main/java/com/extendedae_plus/network/C2SPacketTargetKeyTriggered.java diff --git a/gradle.properties b/gradle.properties index 0407709..33f071a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -15,7 +15,7 @@ loader_version_range=[1,) mod_id=extendedae_plus mod_name=ExtendedAE-Plus mod_license=LGPL-3.0-or-later -mod_version=1.0.0 +mod_version=1.0.0fix mod_group_id=com.extendedae_plus mod_authors=GaLicn, XianYuFish001 mod_description= diff --git a/src/main/java/com/extendedae_plus/client/InputEvents.java b/src/main/java/com/extendedae_plus/client/InputEvents.java index 9c50d82..2c0e30a 100644 --- a/src/main/java/com/extendedae_plus/client/InputEvents.java +++ b/src/main/java/com/extendedae_plus/client/InputEvents.java @@ -6,6 +6,7 @@ import appeng.core.AEConfig; import com.extendedae_plus.ExtendedAEPlus; import com.extendedae_plus.mixin.ae2.accessor.MEStorageScreenAccessor; import com.extendedae_plus.mixin.extendedae.accessor.GuiExPatternTerminalAccessor; +import com.extendedae_plus.network.C2SPacketTargetKeyTriggered; import com.extendedae_plus.network.OpenCraftFromJeiC2SPacket; import com.extendedae_plus.network.PullFromJeiOrCraftC2SPacket; import com.glodblock.github.extendedae.client.gui.GuiExPatternTerminal; @@ -78,37 +79,46 @@ public final class InputEvents { @SubscribeEvent public static void onKeyPressedPre(ScreenEvent.KeyPressed.Pre event) { - if (event.getKeyCode() != GLFW.GLFW_KEY_F) return; + if (event.getKeyCode() == GLFW.GLFW_KEY_F) { + // 仅当鼠标确实悬停在 JEI 配料上时触发 + // 大概会在一格有多个(?)stack的时候出bug, 但是真的会有那种时候吗? + List stack = EmiApi.getHoveredStack(false).getStack().getEmiStacks(); + if (stack.isEmpty()) return; + String name = stack.getFirst().getName().getString(); + if (name.isEmpty()) return; - // 仅当鼠标确实悬停在 JEI 配料上时触发 - // 大概会在一格有多个(?)stack的时候出bug, 但是真的会有那种时候吗? - List stack = EmiApi.getHoveredStack(false).getStack().getEmiStacks(); - if (stack.isEmpty()) return; - String name = stack.getFirst().getName().getString(); - if (name.isEmpty()) return; + // 写入 AE2 终端的搜索框 + var screen = Minecraft.getInstance().screen; + if (screen instanceof MEStorageScreen me) { + try { + // 如果用EMI搜索框 + if (AEConfig.instance().isUseExternalSearch()) EmiApi.setSearchText(name); + else { + MEStorageScreenAccessor acc = (MEStorageScreenAccessor) me; + acc.eap$getSearchField().setValue(name); + acc.eap$setSearchText(name); // 同步到 Repo 并刷新 + } + event.setCanceled(true); + } catch (Throwable ignored) { + } + } else if (screen instanceof GuiExPatternTerminal gpt) { + try { + if (AEConfig.instance().isUseExternalSearch()) EmiApi.setSearchText(name); + else { + GuiExPatternTerminalAccessor acc = (GuiExPatternTerminalAccessor) gpt; + acc.getSearchField().setValue(name); + } + event.setCanceled(true); + } catch (Throwable ignored) { + } + } + } else if (event.getKeyCode() == GLFW.GLFW_KEY_LEFT_SHIFT) + PacketDistributor.sendToServer(new C2SPacketTargetKeyTriggered(C2SPacketTargetKeyTriggered.KeyType.SHIFT_DOWN)); + } - // 写入 AE2 终端的搜索框 - var screen = Minecraft.getInstance().screen; - if (screen instanceof MEStorageScreen me) { - try { - // 如果用EMI搜索框 - if (AEConfig.instance().isUseExternalSearch()) EmiApi.setSearchText(name); - else { - MEStorageScreenAccessor acc = (MEStorageScreenAccessor) me; - acc.eap$getSearchField().setValue(name); - acc.eap$setSearchText(name); // 同步到 Repo 并刷新 - } - event.setCanceled(true); - } catch (Throwable ignored) {} - } else if (screen instanceof GuiExPatternTerminal gpt) { - try { - if (AEConfig.instance().isUseExternalSearch()) EmiApi.setSearchText(name); - else { - GuiExPatternTerminalAccessor acc = (GuiExPatternTerminalAccessor) gpt; - acc.getSearchField().setValue(name); - } - event.setCanceled(true); - } catch (Throwable ignored) {} - } + @SubscribeEvent + public static void onKeyReleasePre(ScreenEvent.KeyReleased.Pre event) { + if (event.getKeyCode() == GLFW.GLFW_KEY_LEFT_SHIFT) + PacketDistributor.sendToServer(new C2SPacketTargetKeyTriggered(C2SPacketTargetKeyTriggered.KeyType.SHIFT_UP)); } } diff --git a/src/main/java/com/extendedae_plus/client/PatternEncodingTermMenuMixinHelper.java b/src/main/java/com/extendedae_plus/client/PatternEncodingTermMenuMixinHelper.java new file mode 100644 index 0000000..beb4156 --- /dev/null +++ b/src/main/java/com/extendedae_plus/client/PatternEncodingTermMenuMixinHelper.java @@ -0,0 +1,5 @@ +package com.extendedae_plus.client; + +public interface PatternEncodingTermMenuMixinHelper { + void eaep$setShiftPressed(boolean pressed); +} diff --git a/src/main/java/com/extendedae_plus/mixin/ae2/client/gui/PatternProviderScreenMixin.java b/src/main/java/com/extendedae_plus/mixin/ae2/client/gui/PatternProviderScreenMixin.java index a600bcb..3e43686 100644 --- a/src/main/java/com/extendedae_plus/mixin/ae2/client/gui/PatternProviderScreenMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/ae2/client/gui/PatternProviderScreenMixin.java @@ -24,7 +24,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; /** - * 为 AE2 原版样板供应器界面添加“高级阻挡模式”按钮。 + * 为 AE2 原版样板供应器界面添加“智能阻挡模式”按钮。 * - 位于左侧工具栏 * - 点击仅发送 C2S 切换请求;状态由 AE2 @GuiSync 回传决定 */ diff --git a/src/main/java/com/extendedae_plus/mixin/ae2/menu/PatternEncodingTermMenuMixin.java b/src/main/java/com/extendedae_plus/mixin/ae2/menu/PatternEncodingTermMenuMixin.java index 2cbb08f..8148228 100644 --- a/src/main/java/com/extendedae_plus/mixin/ae2/menu/PatternEncodingTermMenuMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/ae2/menu/PatternEncodingTermMenuMixin.java @@ -8,14 +8,13 @@ import appeng.api.storage.MEStorage; import appeng.api.storage.StorageHelper; import appeng.core.definitions.AEItems; import appeng.helpers.IPatternTerminalMenuHost; -import appeng.menu.me.common.MEStorageMenu; import appeng.menu.me.items.PatternEncodingTermMenu; import appeng.menu.slot.RestrictedInputSlot; import appeng.parts.encoding.EncodingMode; +import com.extendedae_plus.client.PatternEncodingTermMenuMixinHelper; import com.extendedae_plus.config.ModConfig; import com.extendedae_plus.mixin.ae2.accessor.MEStorageMenuAccessor; import com.extendedae_plus.network.C2SPacketEncodeFinished; -import net.minecraft.client.gui.screens.Screen; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.inventory.MenuType; @@ -28,16 +27,21 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(PatternEncodingTermMenu.class) -public abstract class PatternEncodingTermMenuMixin { +public abstract class PatternEncodingTermMenuMixin implements PatternEncodingTermMenuMixinHelper { // 防止重复执行 @Unique private boolean eap$blankAutoFilled = false; - @Shadow private RestrictedInputSlot blankPatternSlot; - @Shadow public EncodingMode mode; + @Unique + public boolean isShiftPressed = false; + + @Unique + public void eaep$setShiftPressed(boolean press) { + isShiftPressed = press; + } @Unique private void eap$tryFill(IPatternTerminalMenuHost host, Inventory ip) { @@ -114,14 +118,14 @@ public abstract class PatternEncodingTermMenuMixin { } // 仅在服务器端执行 var self = (PatternEncodingTermMenu) (Object) this; - var acc = (MEStorageMenuAccessor) (Object) ((MEStorageMenu) self); + var acc = (MEStorageMenuAccessor) self; MEStorage storage = acc.getStorage(); IEnergySource power = acc.getEnergySource(); var player = self.getPlayerInventory().player; if (player.level().isClientSide()) { return; } - boolean canInteract = storage != null && power != null && ((MEStorageMenu) self).getLinkStatus().connected(); + boolean canInteract = storage != null && power != null && self.getLinkStatus().connected(); if (!canInteract) { return; } @@ -161,7 +165,8 @@ public abstract class PatternEncodingTermMenuMixin { @Inject(method = "encode", at = @At("TAIL")) private void eaep$onEncode(CallbackInfo ci) { if (ModConfig.INDEPENDENT_UPLOADING_BUTTON.getAsBoolean()) return; - if (!Screen.hasShiftDown()) return; + if (!isShiftPressed) return; + isShiftPressed = false; var self = (PatternEncodingTermMenu) (Object) this; PacketDistributor.sendToPlayer((ServerPlayer) self.getPlayer(), C2SPacketEncodeFinished.INSTANCE); } diff --git a/src/main/java/com/extendedae_plus/network/C2SPacketTargetKeyTriggered.java b/src/main/java/com/extendedae_plus/network/C2SPacketTargetKeyTriggered.java new file mode 100644 index 0000000..b6081b9 --- /dev/null +++ b/src/main/java/com/extendedae_plus/network/C2SPacketTargetKeyTriggered.java @@ -0,0 +1,47 @@ +package com.extendedae_plus.network; + +import appeng.menu.me.items.PatternEncodingTermMenu; +import com.extendedae_plus.ExtendedAEPlus; +import com.extendedae_plus.client.PatternEncodingTermMenuMixinHelper; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; +import net.neoforged.neoforge.network.codec.NeoForgeStreamCodecs; +import net.neoforged.neoforge.network.handling.IPayloadContext; + +public record C2SPacketTargetKeyTriggered(KeyType keyType) implements CustomPacketPayload{ + public enum KeyType { + SHIFT_DOWN, + SHIFT_UP + } + + @Override + public Type type() { + return TYPE; + } + + public static final Type TYPE = new Type<>( + ResourceLocation.fromNamespaceAndPath(ExtendedAEPlus.MODID, "target_key_pressed")); + + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + NeoForgeStreamCodecs.enumCodec(KeyType.class), C2SPacketTargetKeyTriggered::keyType, + C2SPacketTargetKeyTriggered::new); + + public static void handle(C2SPacketTargetKeyTriggered packet, IPayloadContext context) { + context.enqueueWork(() -> { + if (context.player().level().isClientSide) return; + ServerPlayer player = (ServerPlayer) context.player(); + + if (player.containerMenu instanceof PatternEncodingTermMenu patternMenu) { + if (patternMenu instanceof PatternEncodingTermMenuMixinHelper accessor) { + accessor.eaep$setShiftPressed(switch (packet.keyType) { + case SHIFT_UP -> false; + case SHIFT_DOWN -> true; + }); + } + } + }); + } +} diff --git a/src/main/java/com/extendedae_plus/network/ModNetwork.java b/src/main/java/com/extendedae_plus/network/ModNetwork.java index 349dadf..632ca17 100644 --- a/src/main/java/com/extendedae_plus/network/ModNetwork.java +++ b/src/main/java/com/extendedae_plus/network/ModNetwork.java @@ -36,5 +36,8 @@ public class ModNetwork { registrar.playToClient(C2SPacketEncodeFinished.TYPE, C2SPacketEncodeFinished.STREAM_CODEC, C2SPacketEncodeFinished::handle); + registrar.playToServer(C2SPacketTargetKeyTriggered.TYPE, + C2SPacketTargetKeyTriggered.STREAM_CODEC, + C2SPacketTargetKeyTriggered::handle); } } diff --git a/src/main/java/com/extendedae_plus/network/ProvidersListS2CPacket.java b/src/main/java/com/extendedae_plus/network/ProvidersListS2CPacket.java index 0fa8184..2da91df 100644 --- a/src/main/java/com/extendedae_plus/network/ProvidersListS2CPacket.java +++ b/src/main/java/com/extendedae_plus/network/ProvidersListS2CPacket.java @@ -7,6 +7,8 @@ import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.resources.ResourceLocation; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; import net.neoforged.neoforge.network.handling.IPayloadContext; import java.util.ArrayList; @@ -58,11 +60,14 @@ public class ProvidersListS2CPacket implements CustomPacketPayload { } public static void handle(final ProvidersListS2CPacket msg, final IPayloadContext ctx) { - ctx.enqueueWork(() -> { - var mc = Minecraft.getInstance(); - if (mc == null) return; - var current = mc.screen; - mc.setScreen(new ProviderSelectScreen(current, msg.ids, msg.names, msg.emptySlots)); - }); + ctx.enqueueWork(() -> handleClient(msg)); + } + + @OnlyIn(Dist.CLIENT) + private static void handleClient(ProvidersListS2CPacket msg) { + var mc = Minecraft.getInstance(); + if (mc == null) return; + var current = mc.screen; + mc.setScreen(new ProviderSelectScreen(current, msg.ids, msg.names, msg.emptySlots)); } } diff --git a/src/main/resources/extendedae_plus.mixins.json b/src/main/resources/extendedae_plus.mixins.json index c3c8d69..7387f16 100644 --- a/src/main/resources/extendedae_plus.mixins.json +++ b/src/main/resources/extendedae_plus.mixins.json @@ -6,7 +6,6 @@ "ae2.AEProcessingPatternMixin", "ae2.CraftingCPUClusterMixin", "ae2.EncodedPatternItemMixin", - "ae2.QuartzCuttingKnifeItemMixin", "ae2.accessor.MEStorageMenuAccessor", "ae2.accessor.PatternEncodingTermMenuAccessor", "ae2.accessor.PatternProviderLogicAccessor", @@ -36,6 +35,7 @@ "PickFromWirelessMixin", "accessor.AbstractContainerScreenAccessor", "accessor.ScreenAccessor", + "ae2.QuartzCuttingKnifeItemMixin", "ae2.accessor.AEBaseScreenAccessor", "ae2.accessor.AEBaseScreenInvoker", "ae2.accessor.MEStorageScreenAccessor",