From 23dcd69a3902ecc7442dde5d38aee24567637e56 Mon Sep 17 00:00:00 2001 From: GaLicn <133291877+GaLicn@users.noreply.github.com> Date: Thu, 18 Sep 2025 16:26:20 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8C=E6=AD=A5ME=E6=89=A9=E5=B1=95=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ae2/client/gui/InterfaceScreenMixin.java | 26 +++++++++++++--- .../InterfaceAdjustConfigAmountC2SPacket.java | 31 +++++++++---------- 2 files changed, 35 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/extendedae_plus/mixin/ae2/client/gui/InterfaceScreenMixin.java b/src/main/java/com/extendedae_plus/mixin/ae2/client/gui/InterfaceScreenMixin.java index 06906b5..72757a1 100644 --- a/src/main/java/com/extendedae_plus/mixin/ae2/client/gui/InterfaceScreenMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/ae2/client/gui/InterfaceScreenMixin.java @@ -44,8 +44,8 @@ public abstract class InterfaceScreenMixin { @Inject(method = "init", at = @At("TAIL")) private void eap$addScaleButtons(CallbackInfo ci) { - // 仅在 InterfaceScreen 实例中添加 - if (!(((Object) this) instanceof InterfaceScreen)) { + // 仅在 AE2 接口界面或 ExtendedAE 扩展接口界面中添加 + if (!eap$isSupportedInterfaceScreen()) { return; } try { LogUtils.getLogger().info("[EAP][InterfaceMixin] init tail reached, preparing scale buttons."); } catch (Throwable ignored) {} @@ -115,7 +115,7 @@ public abstract class InterfaceScreenMixin { @Inject(method = "containerTick", at = @At("TAIL")) private void eap$ensureButtons(CallbackInfo ci) { - if (!(((Object) this) instanceof InterfaceScreen)) { + if (!eap$isSupportedInterfaceScreen()) { return; } var accessor = (ScreenAccessor) (Object) this; @@ -171,7 +171,7 @@ public abstract class InterfaceScreenMixin { private void eap$sendAdjustForHoveredConfig(boolean divide, int factor) { try { // 仅在 InterfaceScreen 中生效 - if (!(((Object) this) instanceof InterfaceScreen)) { + if (!eap$isSupportedInterfaceScreen()) { return; } // 获取悬停槽位 @@ -229,7 +229,7 @@ public abstract class InterfaceScreenMixin { @Unique private void eap$sendAdjustForAllConfigs(boolean divide, int factor) { try { - if (!(((Object) this) instanceof InterfaceScreen)) { + if (!eap$isSupportedInterfaceScreen()) { return; } // 直接发送 -1 表示对所有 CONFIG 槽生效 @@ -237,6 +237,22 @@ public abstract class InterfaceScreenMixin { } catch (Throwable ignored) {} } + @Unique + private boolean eap$isSupportedInterfaceScreen() { + // AE2 原版接口界面 + if (((Object) this) instanceof InterfaceScreen) { + return true; + } + // ExtendedAE 扩展接口界面(使用类名判断避免编译期硬依赖) + try { + String cn = ((Object) this).getClass().getName(); + if ("com.glodblock.github.extendedae.client.gui.GuiExInterface".equals(cn)) { + return true; + } + } catch (Throwable ignored) {} + return false; + } + @Unique private void eap$relayoutButtons() { try { diff --git a/src/main/java/com/extendedae_plus/network/InterfaceAdjustConfigAmountC2SPacket.java b/src/main/java/com/extendedae_plus/network/InterfaceAdjustConfigAmountC2SPacket.java index 8afc583..8d899ed 100644 --- a/src/main/java/com/extendedae_plus/network/InterfaceAdjustConfigAmountC2SPacket.java +++ b/src/main/java/com/extendedae_plus/network/InterfaceAdjustConfigAmountC2SPacket.java @@ -43,27 +43,24 @@ public class InterfaceAdjustConfigAmountC2SPacket { ctx.enqueueWork(() -> { ServerPlayer player = ctx.getSender(); if (player == null) return; - if (!(player.containerMenu instanceof InterfaceMenu menu)) return; + // 支持 AE2 原版接口和 ExtendedAE 扩展接口 + InterfaceMenu menu = null; + com.glodblock.github.extendedae.container.ContainerExInterface exMenu = null; + if (player.containerMenu instanceof InterfaceMenu im) { + menu = im; + } else if (player.containerMenu instanceof com.glodblock.github.extendedae.container.ContainerExInterface cem) { + exMenu = cem; + } else { + return; + } try { - var logic = menu.getHost().getInterfaceLogic(); + var logic = (menu != null ? menu.getHost() : exMenu.getHost()).getInterfaceLogic(); var config = logic.getConfig(); if (msg.slotIndex == -1) { - // 对所有 CONFIG 槽位生效 - var configSlots = menu.getSlots(SlotSemantics.CONFIG); - if (configSlots == null || configSlots.isEmpty()) return; - for (var s : configSlots) { - int idx = -1; - try { - var f = s.getClass().getDeclaredField("slot"); - f.setAccessible(true); - Object v = f.get(s); - if (v instanceof Integer i) idx = i; - } catch (Throwable ignored) {} - if (idx < 0) { - idx = configSlots.indexOf(s); - } - + // 对所有配置槽统一生效(不依赖槽位语义,直接按 config.size() 遍历) + int size = config.size(); + for (int idx = 0; idx < size; idx++) { var st = config.getStack(idx); if (st == null) continue;