From c70479e3cf9084446f85562e6233c721f38d0124 Mon Sep 17 00:00:00 2001 From: GaLicn <3096147684@qq.com> Date: Thu, 14 Aug 2025 11:58:56 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0jei=E4=B8=AD=E9=BC=A0?= =?UTF-8?q?=E6=A0=87=E4=B8=AD=E5=BB=BA=E5=8F=AF=E4=BB=A5=E7=9B=B4=E6=8E=A5?= =?UTF-8?q?=E4=B8=8B=E5=8D=95=E5=8A=9F=E8=83=BD=EF=BC=8C=E5=B9=B6=E4=B8=94?= =?UTF-8?q?=E9=80=82=E9=85=8Dcurios=E9=80=82=E9=85=8D=E6=A7=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../host/CuriosWirelessTerminalMenuHost.java | 46 +++++++++++++++++++ .../menu/locator/CuriosItemLocator.java | 28 +++++++++-- 2 files changed, 70 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/extendedae_plus/menu/host/CuriosWirelessTerminalMenuHost.java diff --git a/src/main/java/com/extendedae_plus/menu/host/CuriosWirelessTerminalMenuHost.java b/src/main/java/com/extendedae_plus/menu/host/CuriosWirelessTerminalMenuHost.java new file mode 100644 index 0000000..d7a46a4 --- /dev/null +++ b/src/main/java/com/extendedae_plus/menu/host/CuriosWirelessTerminalMenuHost.java @@ -0,0 +1,46 @@ +package com.extendedae_plus.menu.host; + +import org.jetbrains.annotations.Nullable; + +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.item.ItemStack; + +import appeng.api.implementations.menuobjects.ItemMenuHost; +import appeng.helpers.WirelessTerminalMenuHost; +import appeng.menu.ISubMenu; +import appeng.api.storage.ISubMenuHost; + +// Curios API +import top.theillusivec4.curios.api.type.inventory.ICurioStacksHandler; + +/** + * 针对 Curios 槽位的无线终端菜单宿主。 + * 关键点:在 onBroadcastChanges 周期性把 getItemStack() 回写到 Curios 槽位, + * 以持久化能量消耗等 NBT 变化。 + */ +public class CuriosWirelessTerminalMenuHost extends WirelessTerminalMenuHost implements ISubMenuHost { + private final ICurioStacksHandler curiosHandler; + private final int curiosIndex; + + public CuriosWirelessTerminalMenuHost(Player player, + ItemStack itemStack, + ICurioStacksHandler curiosHandler, + int curiosIndex, + java.util.function.BiConsumer returnToMainMenu) { + super(player, null, itemStack, returnToMainMenu); + this.curiosHandler = curiosHandler; + this.curiosIndex = curiosIndex; + } + + @Override + public boolean onBroadcastChanges(AbstractContainerMenu menu) { + // 将当前 ItemStack 写回 Curios 槽位,保证 NBT 改动(如耗电)持久化 + try { + ItemStack current = getItemStack(); + curiosHandler.getStacks().setStackInSlot(curiosIndex, current); + } catch (Throwable ignored) { + } + return super.onBroadcastChanges(menu); + } +} diff --git a/src/main/java/com/extendedae_plus/menu/locator/CuriosItemLocator.java b/src/main/java/com/extendedae_plus/menu/locator/CuriosItemLocator.java index 419d8b6..1d3a145 100644 --- a/src/main/java/com/extendedae_plus/menu/locator/CuriosItemLocator.java +++ b/src/main/java/com/extendedae_plus/menu/locator/CuriosItemLocator.java @@ -8,7 +8,12 @@ import net.minecraft.world.item.ItemStack; import appeng.api.implementations.menuobjects.IMenuItem; import appeng.api.implementations.menuobjects.ItemMenuHost; +import appeng.helpers.WirelessTerminalMenuHost; +import appeng.items.tools.powered.WirelessTerminalItem; +import appeng.menu.MenuOpener; +import appeng.menu.me.common.MEStorageMenu; import appeng.menu.locator.MenuLocator; +import com.extendedae_plus.menu.host.CuriosWirelessTerminalMenuHost; // Curios API (软依赖) import top.theillusivec4.curios.api.CuriosApi; @@ -29,10 +34,25 @@ public record CuriosItemLocator(String slotId, int index) implements MenuLocator ICurioStacksHandler stacksHandler = handler.getCurios().get(slotId); if (stacksHandler != null) { ItemStack it = stacksHandler.getStacks().getStackInSlot(index); - if (!it.isEmpty() && it.getItem() instanceof IMenuItem guiItem) { - ItemMenuHost menuHost = guiItem.getMenuHost(player, -1, it, null); - if (hostInterface.isInstance(menuHost)) { - return hostInterface.cast(menuHost); + if (!it.isEmpty()) { + if (it.getItem() instanceof WirelessTerminalItem) { + // 为 Curios 构建一个带回写能力的宿主 + WirelessTerminalMenuHost host = new CuriosWirelessTerminalMenuHost( + player, + it, + stacksHandler, + index, + (p, sub) -> MenuOpener.open(MEStorageMenu.WIRELESS_TYPE, p, this) + ); + if (hostInterface.isInstance(host)) { + return hostInterface.cast(host); + } + } else if (it.getItem() instanceof IMenuItem guiItem) { + // 回退:非无线终端,按常规 IMenuItem 处理 + ItemMenuHost menuHost = guiItem.getMenuHost(player, -1, it, null); + if (hostInterface.isInstance(menuHost)) { + return hostInterface.cast(menuHost); + } } } }