From 1ca8c8c48e422744b660d13ea944ff91f8e77be9 Mon Sep 17 00:00:00 2001 From: C-H716 <1536152356@qq.com> Date: Tue, 2 Sep 2025 12:46:23 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=88=B6=E4=BD=9C=E4=B8=AD=E6=89=93?= =?UTF-8?q?=E5=BC=80=E4=BE=9B=E5=BA=94=E5=99=A8=E8=B7=B3=E8=BD=AC=E5=88=B0?= =?UTF-8?q?=E5=AF=B9=E5=BA=94=E6=A0=B7=E6=9D=BF=E6=89=80=E5=9C=A8=E7=9A=84?= =?UTF-8?q?=E9=A1=B5=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/gui/GuiExPatternProviderMixin.java | 7 ++- .../CraftingMonitorOpenProviderC2SPacket.java | 30 ++++++++-- .../extendedae_plus/network/ModNetwork.java | 6 ++ .../network/SetProviderPageS2CPacket.java | 58 +++++++++++++++++++ 4 files changed, 92 insertions(+), 9 deletions(-) create mode 100644 src/main/java/com/extendedae_plus/network/SetProviderPageS2CPacket.java diff --git a/src/main/java/com/extendedae_plus/mixin/extendedae/client/gui/GuiExPatternProviderMixin.java b/src/main/java/com/extendedae_plus/mixin/extendedae/client/gui/GuiExPatternProviderMixin.java index c4286d4..42b1ce2 100644 --- a/src/main/java/com/extendedae_plus/mixin/extendedae/client/gui/GuiExPatternProviderMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/extendedae/client/gui/GuiExPatternProviderMixin.java @@ -21,6 +21,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.lang.reflect.Field; +import java.lang.reflect.Method; import static com.extendedae_plus.util.ExtendedAELogger.LOGGER; @@ -49,8 +50,8 @@ public abstract class GuiExPatternProviderMixin extends PatternProviderScreen= 0) { + int pageId = foundSlot / 36; + if (pageId > 0) { + // 发送 S2C 包通知客户端切换到指定页(客户端会写入 mixin 字段并重排槽位) + ModNetwork.CHANNEL.sendTo(new SetProviderPageS2CPacket(pageId), player.connection.connection, NetworkDirection.PLAY_TO_CLIENT); + } + } context.setPacketHandled(true); return; } catch (Throwable t) { diff --git a/src/main/java/com/extendedae_plus/network/ModNetwork.java b/src/main/java/com/extendedae_plus/network/ModNetwork.java index 8b4599c..78e3adb 100644 --- a/src/main/java/com/extendedae_plus/network/ModNetwork.java +++ b/src/main/java/com/extendedae_plus/network/ModNetwork.java @@ -66,6 +66,12 @@ public class ModNetwork { .consumerNetworkThread(SetPatternHighlightS2CPacket::handle) .add(); + CHANNEL.messageBuilder(SetProviderPageS2CPacket.class, nextId(), NetworkDirection.PLAY_TO_CLIENT) + .encoder(SetProviderPageS2CPacket::encode) + .decoder(SetProviderPageS2CPacket::decode) + .consumerNetworkThread(SetProviderPageS2CPacket::handle) + .add(); + CHANNEL.messageBuilder(ToggleAdvancedBlockingC2SPacket.class, nextId(), NetworkDirection.PLAY_TO_SERVER) .encoder(ToggleAdvancedBlockingC2SPacket::encode) .decoder(ToggleAdvancedBlockingC2SPacket::decode) diff --git a/src/main/java/com/extendedae_plus/network/SetProviderPageS2CPacket.java b/src/main/java/com/extendedae_plus/network/SetProviderPageS2CPacket.java new file mode 100644 index 0000000..1c57644 --- /dev/null +++ b/src/main/java/com/extendedae_plus/network/SetProviderPageS2CPacket.java @@ -0,0 +1,58 @@ +package com.extendedae_plus.network; + +import appeng.menu.SlotSemantics; +import com.glodblock.github.extendedae.client.gui.GuiExPatternProvider; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraftforge.network.NetworkEvent; + +import java.lang.reflect.Field; +import java.util.function.Supplier; + +/** + * S2C: 指示客户端在已打开的样板供应器界面切换到指定页 + */ +public class SetProviderPageS2CPacket { + private final int page; + + public SetProviderPageS2CPacket(int page) { + this.page = page; + } + + public static void encode(SetProviderPageS2CPacket msg, FriendlyByteBuf buf) { + buf.writeVarInt(msg.page); + } + + public static SetProviderPageS2CPacket decode(FriendlyByteBuf buf) { + int p = buf.readVarInt(); + return new SetProviderPageS2CPacket(p); + } + + public static void handle(SetProviderPageS2CPacket msg, Supplier ctxSupplier) { + var ctx = ctxSupplier.get(); + ctx.enqueueWork(() -> { + try { + Screen screen = Minecraft.getInstance().screen; + if (screen instanceof GuiExPatternProvider guiExPatternProvider) { + Field currentPage = screen.getClass().getDeclaredField("eap$currentPage"); + currentPage.setAccessible(true); + currentPage.setInt(guiExPatternProvider, msg.page); + + + guiExPatternProvider.repositionSlots(SlotSemantics.ENCODED_PATTERN); + guiExPatternProvider.repositionSlots(SlotSemantics.STORAGE); + + Field hs = screen.getClass().getDeclaredField("hoveredSlot"); + hs.setAccessible(true); + hs.set(screen, null); + } + } catch (Throwable ignored) { + } + } + ); + ctx.setPacketHandled(true); + } +} + +