From 826f966a46c703a099b61d0707fae79757a09c77 Mon Sep 17 00:00:00 2001 From: Kogepan229 <73163994+Kogepan229@users.noreply.github.com> Date: Tue, 7 Oct 2025 01:39:30 +0900 Subject: [PATCH] Allows open the Level Emitter GUI from Level Terminal (#332) Co-authored-by: Martin Robertz --- .../client/gui/GuiFluidLevelEmitter.java | 81 +++++++++++++- .../client/gui/GuiLevelEmitterProxy.java | 104 ++++++++++++++++++ .../github/client/gui/GuiLevelMaintainer.java | 2 +- .../github/client/gui/GuiLevelTerminal.java | 2 +- .../github/inventory/gui/GuiType.java | 16 +++ .../network/CPacketLevelTerminalCommands.java | 37 ++++++- 6 files changed, 232 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/glodblock/github/client/gui/GuiLevelEmitterProxy.java diff --git a/src/main/java/com/glodblock/github/client/gui/GuiFluidLevelEmitter.java b/src/main/java/com/glodblock/github/client/gui/GuiFluidLevelEmitter.java index 848fdf46..8e5a9a7f 100644 --- a/src/main/java/com/glodblock/github/client/gui/GuiFluidLevelEmitter.java +++ b/src/main/java/com/glodblock/github/client/gui/GuiFluidLevelEmitter.java @@ -2,22 +2,35 @@ package com.glodblock.github.client.gui; import net.minecraft.client.gui.GuiButton; import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.util.ForgeDirection; import org.lwjgl.input.Keyboard; import org.lwjgl.opengl.GL11; import com.glodblock.github.FluidCraft; import com.glodblock.github.client.gui.container.ContainerFluidLevelEmitter; +import com.glodblock.github.common.item.ItemWirelessUltraTerminal; import com.glodblock.github.common.parts.PartFluidLevelEmitter; +import com.glodblock.github.common.parts.PartLevelTerminal; +import com.glodblock.github.inventory.gui.GuiType; +import com.glodblock.github.inventory.item.IWirelessTerminal; +import com.glodblock.github.inventory.item.WirelessLevelTerminalInventory; +import com.glodblock.github.loader.ItemAndBlockHolder; +import com.glodblock.github.network.CPacketLevelTerminalCommands; import com.glodblock.github.network.CPacketValueConfig; import com.glodblock.github.util.NameConst; +import com.glodblock.github.util.Util; import appeng.api.config.RedstoneMode; import appeng.api.config.Settings; import appeng.api.storage.data.IAEFluidStack; +import appeng.api.util.DimensionalCoord; import appeng.client.gui.implementations.GuiUpgradeable; import appeng.client.gui.widgets.GuiImgButton; +import appeng.client.gui.widgets.GuiTabButton; import appeng.client.gui.widgets.MEGuiTextField; +import appeng.container.AEBaseContainer; import appeng.core.AEConfig; import appeng.core.localization.GuiColors; import appeng.core.localization.GuiText; @@ -28,6 +41,11 @@ public class GuiFluidLevelEmitter extends GuiUpgradeable { private MEGuiTextField amountTextField; + protected GuiType originalGui; + protected Util.DimensionalCoordSide originalBlockPos; + protected ItemStack originalGuiIcon; + protected GuiTabButton originalGuiBtn; + private GuiButton plus1; private GuiButton plus10; private GuiButton plus100; @@ -43,6 +61,43 @@ public class GuiFluidLevelEmitter extends GuiUpgradeable { public GuiFluidLevelEmitter(final InventoryPlayer inventoryPlayer, final PartFluidLevelEmitter te) { super(new ContainerFluidLevelEmitter(inventoryPlayer, te)); + + if (inventoryPlayer.player.openContainer instanceof AEBaseContainer container) { + var target = container.getTarget(); + if (target instanceof PartLevelTerminal terminal) { + originalGuiIcon = ItemAndBlockHolder.LEVEL_TERMINAL.stack(); + originalGui = GuiType.LEVEL_TERMINAL; + DimensionalCoord blockPos = new DimensionalCoord(terminal.getTile()); + originalBlockPos = new Util.DimensionalCoordSide( + blockPos.x, + blockPos.y, + blockPos.z, + blockPos.getDimension(), + terminal.getSide(), + ""); + } else if (target instanceof IWirelessTerminal terminal && terminal.isUniversal(target)) { + originalGuiIcon = ItemAndBlockHolder.WIRELESS_ULTRA_TERM.stack(); + originalGui = ItemWirelessUltraTerminal.readMode(terminal.getItemStack()); + originalBlockPos = new Util.DimensionalCoordSide( + terminal.getInventorySlot(), + Util.GuiHelper.encodeType(0, Util.GuiHelper.GuiType.ITEM), + 0, + inventoryPlayer.player.worldObj.provider.dimensionId, + ForgeDirection.UNKNOWN, + ""); + } else if (target instanceof WirelessLevelTerminalInventory terminal) { + originalGuiIcon = ItemAndBlockHolder.WIRELESS_LEVEL_TERM.stack(); + originalGui = GuiType.WIRELESS_LEVEL_TERMINAL; + originalBlockPos = new Util.DimensionalCoordSide( + terminal.getInventorySlot(), + Util.GuiHelper.encodeType(0, Util.GuiHelper.GuiType.ITEM), + 0, + inventoryPlayer.player.worldObj.provider.dimensionId, + ForgeDirection.UNKNOWN, + ""); + + } + } } @Override @@ -55,6 +110,17 @@ public class GuiFluidLevelEmitter extends GuiUpgradeable { this.amountTextField.setFocused(true); ((ContainerFluidLevelEmitter) this.inventorySlots).setTextField(this.amountTextField); this.validateText(); + + if (this.originalGuiIcon != null) { + this.originalGuiBtn = new GuiTabButton( + this.guiLeft + 151, + this.guiTop - 4, + this.originalGuiIcon, + this.originalGuiIcon.getDisplayName(), + itemRender); + this.originalGuiBtn.setHideEdge(13); + this.buttonList.add(originalGuiBtn); + } } @Override @@ -143,9 +209,18 @@ public class GuiFluidLevelEmitter extends GuiUpgradeable { @Override protected void actionPerformed(final GuiButton btn) { - super.actionPerformed(btn); - if (btn == this.setButton && this.setButton.enabled) { + if (btn == this.originalGuiBtn) { + CPacketLevelTerminalCommands message = new CPacketLevelTerminalCommands( + CPacketLevelTerminalCommands.Action.BACK, + originalBlockPos.x, + originalBlockPos.y, + originalBlockPos.z, + originalBlockPos.getDimension(), + originalBlockPos.getSide()); + message.setOriginalGui(originalGui.ordinal()); + FluidCraft.proxy.netHandler.sendToServer(message); + } else if (btn == this.setButton && this.setButton.enabled) { final long amount = this.getAmountLong(); this.amountTextField.setText(Long.toString(amount)); @@ -161,6 +236,8 @@ public class GuiFluidLevelEmitter extends GuiUpgradeable { if (isPlus || isMinus) { long result = addOrderAmount(this.getQty(btn)); this.amountTextField.setText(Long.toString(result)); + } else { + super.actionPerformed(btn); } } } diff --git a/src/main/java/com/glodblock/github/client/gui/GuiLevelEmitterProxy.java b/src/main/java/com/glodblock/github/client/gui/GuiLevelEmitterProxy.java new file mode 100644 index 00000000..4a747ee0 --- /dev/null +++ b/src/main/java/com/glodblock/github/client/gui/GuiLevelEmitterProxy.java @@ -0,0 +1,104 @@ +package com.glodblock.github.client.gui; + +import net.minecraft.client.gui.GuiButton; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.util.ForgeDirection; + +import com.glodblock.github.FluidCraft; +import com.glodblock.github.common.item.ItemWirelessUltraTerminal; +import com.glodblock.github.common.parts.PartLevelTerminal; +import com.glodblock.github.inventory.gui.GuiType; +import com.glodblock.github.inventory.item.IWirelessTerminal; +import com.glodblock.github.inventory.item.WirelessLevelTerminalInventory; +import com.glodblock.github.loader.ItemAndBlockHolder; +import com.glodblock.github.network.CPacketLevelTerminalCommands; +import com.glodblock.github.util.Util; + +import appeng.api.util.DimensionalCoord; +import appeng.client.gui.implementations.GuiLevelEmitter; +import appeng.client.gui.widgets.GuiTabButton; +import appeng.container.AEBaseContainer; +import appeng.parts.automation.PartLevelEmitter; + +public class GuiLevelEmitterProxy extends GuiLevelEmitter { + + protected GuiType originalGui; + protected Util.DimensionalCoordSide originalBlockPos; + protected ItemStack originalGuiIcon; + protected GuiTabButton originalGuiBtn; + + public GuiLevelEmitterProxy(final InventoryPlayer inventoryPlayer, final PartLevelEmitter te) { + super(inventoryPlayer, te); + + if (inventoryPlayer.player.openContainer instanceof AEBaseContainer container) { + var target = container.getTarget(); + if (target instanceof PartLevelTerminal terminal) { + originalGuiIcon = ItemAndBlockHolder.LEVEL_TERMINAL.stack(); + originalGui = GuiType.LEVEL_TERMINAL; + DimensionalCoord blockPos = new DimensionalCoord(terminal.getTile()); + originalBlockPos = new Util.DimensionalCoordSide( + blockPos.x, + blockPos.y, + blockPos.z, + blockPos.getDimension(), + terminal.getSide(), + ""); + } else if (target instanceof IWirelessTerminal terminal && terminal.isUniversal(target)) { + originalGuiIcon = ItemAndBlockHolder.WIRELESS_ULTRA_TERM.stack(); + originalGui = ItemWirelessUltraTerminal.readMode(terminal.getItemStack()); + originalBlockPos = new Util.DimensionalCoordSide( + terminal.getInventorySlot(), + Util.GuiHelper.encodeType(0, Util.GuiHelper.GuiType.ITEM), + 0, + inventoryPlayer.player.worldObj.provider.dimensionId, + ForgeDirection.UNKNOWN, + ""); + } else if (target instanceof WirelessLevelTerminalInventory terminal) { + originalGuiIcon = ItemAndBlockHolder.WIRELESS_LEVEL_TERM.stack(); + originalGui = GuiType.WIRELESS_LEVEL_TERMINAL; + originalBlockPos = new Util.DimensionalCoordSide( + terminal.getInventorySlot(), + Util.GuiHelper.encodeType(0, Util.GuiHelper.GuiType.ITEM), + 0, + inventoryPlayer.player.worldObj.provider.dimensionId, + ForgeDirection.UNKNOWN, + ""); + + } + } + } + + @Override + public void initGui() { + super.initGui(); + + if (this.originalGuiIcon != null) { + this.originalGuiBtn = new GuiTabButton( + this.guiLeft + 151, + this.guiTop - 4, + this.originalGuiIcon, + this.originalGuiIcon.getDisplayName(), + itemRender); + this.originalGuiBtn.setHideEdge(13); + this.buttonList.add(originalGuiBtn); + } + } + + @Override + protected void actionPerformed(GuiButton btn) { + if (btn == this.originalGuiBtn) { + CPacketLevelTerminalCommands message = new CPacketLevelTerminalCommands( + CPacketLevelTerminalCommands.Action.BACK, + originalBlockPos.x, + originalBlockPos.y, + originalBlockPos.z, + originalBlockPos.getDimension(), + originalBlockPos.getSide()); + message.setOriginalGui(originalGui.ordinal()); + FluidCraft.proxy.netHandler.sendToServer(message); + } else { + super.actionPerformed(btn); + } + } +} diff --git a/src/main/java/com/glodblock/github/client/gui/GuiLevelMaintainer.java b/src/main/java/com/glodblock/github/client/gui/GuiLevelMaintainer.java index 4a63527f..2c3af402 100644 --- a/src/main/java/com/glodblock/github/client/gui/GuiLevelMaintainer.java +++ b/src/main/java/com/glodblock/github/client/gui/GuiLevelMaintainer.java @@ -105,7 +105,7 @@ public class GuiLevelMaintainer extends AEBaseGui implements INEIGuiHandler { ForgeDirection.UNKNOWN, ""); } else if (target instanceof WirelessLevelTerminalInventory terminal) { - icon = ItemAndBlockHolder.LEVEL_TERMINAL.stack(); + icon = ItemAndBlockHolder.WIRELESS_LEVEL_TERM.stack(); originalGui = GuiType.WIRELESS_LEVEL_TERMINAL; originalBlockPos = new Util.DimensionalCoordSide( terminal.getInventorySlot(), diff --git a/src/main/java/com/glodblock/github/client/gui/GuiLevelTerminal.java b/src/main/java/com/glodblock/github/client/gui/GuiLevelTerminal.java index 98c8b78f..2d1aa548 100644 --- a/src/main/java/com/glodblock/github/client/gui/GuiLevelTerminal.java +++ b/src/main/java/com/glodblock/github/client/gui/GuiLevelTerminal.java @@ -1241,7 +1241,7 @@ public class GuiLevelTerminal extends FCBaseMEGui implements IDropToFillTextFiel dim, ForgeDirection.getOrientation(side), ""); - if (isCtrlKeyDown() && isShiftKeyDown() && hasInfinityBoosterCard(mc.thePlayer)) { + if (isCtrlKeyDown() && isShiftKeyDown()) { FluidCraft.proxy.netHandler.sendToServer( new CPacketLevelTerminalCommands( Action.EDIT, diff --git a/src/main/java/com/glodblock/github/inventory/gui/GuiType.java b/src/main/java/com/glodblock/github/inventory/gui/GuiType.java index 2959f71e..236e5e21 100644 --- a/src/main/java/com/glodblock/github/inventory/gui/GuiType.java +++ b/src/main/java/com/glodblock/github/inventory/gui/GuiType.java @@ -31,6 +31,7 @@ import com.glodblock.github.client.gui.GuiFluidTerminal; import com.glodblock.github.client.gui.GuiIngredientBuffer; import com.glodblock.github.client.gui.GuiInterfaceWireless; import com.glodblock.github.client.gui.GuiLargeIngredientBuffer; +import com.glodblock.github.client.gui.GuiLevelEmitterProxy; import com.glodblock.github.client.gui.GuiLevelMaintainer; import com.glodblock.github.client.gui.GuiLevelTerminal; import com.glodblock.github.client.gui.GuiLevelWireless; @@ -91,10 +92,12 @@ import com.google.common.collect.ImmutableList; import appeng.api.storage.ITerminalHost; import appeng.container.implementations.ContainerCraftAmount; import appeng.container.implementations.ContainerCraftingStatus; +import appeng.container.implementations.ContainerLevelEmitter; import appeng.container.implementations.ContainerPatternItemRenamer; import appeng.container.implementations.ContainerPriority; import appeng.helpers.IInterfaceHost; import appeng.helpers.IPriorityHost; +import appeng.parts.automation.PartLevelEmitter; public enum GuiType { @@ -123,6 +126,19 @@ public enum GuiType { } }), + LEVEL_EMITTER_PROXY(new PartGuiFactory<>(PartLevelEmitter.class) { + + @Override + protected Object createServerGui(EntityPlayer player, PartLevelEmitter inv) { + return new ContainerLevelEmitter(player.inventory, inv); + } + + @Override + protected Object createClientGui(EntityPlayer player, PartLevelEmitter inv) { + return new GuiLevelEmitterProxy(player.inventory, inv); + } + }), + FLUID_LEVEL_EMITTER(new PartGuiFactory<>(PartFluidLevelEmitter.class) { @Override diff --git a/src/main/java/com/glodblock/github/network/CPacketLevelTerminalCommands.java b/src/main/java/com/glodblock/github/network/CPacketLevelTerminalCommands.java index 0c786a96..3848122d 100644 --- a/src/main/java/com/glodblock/github/network/CPacketLevelTerminalCommands.java +++ b/src/main/java/com/glodblock/github/network/CPacketLevelTerminalCommands.java @@ -5,10 +5,14 @@ import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.DimensionManager; import net.minecraftforge.common.util.ForgeDirection; +import com.glodblock.github.common.parts.PartFluidLevelEmitter; import com.glodblock.github.inventory.InventoryHandler; import com.glodblock.github.inventory.gui.GuiType; import com.glodblock.github.util.BlockPos; +import appeng.api.parts.IPart; +import appeng.api.parts.IPartHost; +import appeng.parts.automation.PartLevelEmitter; import cpw.mods.fml.common.network.simpleimpl.IMessage; import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; import cpw.mods.fml.common.network.simpleimpl.MessageContext; @@ -110,12 +114,33 @@ public class CPacketLevelTerminalCommands implements IMessage { case EDIT -> { TileEntity tile = DimensionManager.getWorld(message.dim) .getTileEntity(message.x, message.y, message.z); - InventoryHandler.openGui( - player, - player.worldObj, - new BlockPos(tile), - message.side, - GuiType.LEVEL_MAINTAINER); + + if (tile instanceof IPartHost host) { + IPart part = host.getPart(message.side); + if (part instanceof PartLevelEmitter) { + InventoryHandler.openGui( + player, + tile.getWorldObj(), + new BlockPos(tile), + message.side, + GuiType.LEVEL_EMITTER_PROXY); + } else if (part instanceof PartFluidLevelEmitter) { + InventoryHandler.openGui( + player, + tile.getWorldObj(), + new BlockPos(tile), + message.side, + GuiType.FLUID_LEVEL_EMITTER); + } + } else { + + InventoryHandler.openGui( + player, + tile.getWorldObj(), + new BlockPos(tile), + message.side, + GuiType.LEVEL_MAINTAINER); + } } case BACK -> { GuiType originalGui = GuiType.getByOrdinal(message.originalGui);