增加jei中鼠标中建可以直接下单功能,并且适配curios适配槽

This commit is contained in:
GaLicn 2025-08-14 11:58:56 +08:00
parent 04ea2681da
commit c70479e3cf
2 changed files with 70 additions and 4 deletions

View File

@ -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<Player, ISubMenu> 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);
}
}

View File

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