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