From 4e2b59e1bc5c7e4ff9e0a762c8cb1692267580b9 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Sun, 11 May 2025 01:10:04 -0400 Subject: [PATCH 001/136] start on input bus --- .../appeng/MetaTileEntityMEInputBus.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java index 23f1ab2899b..c4cffd96d48 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java @@ -19,6 +19,7 @@ import gregtech.api.metatileentity.multiblock.IMultiblockAbilityPart; import gregtech.api.metatileentity.multiblock.MultiblockAbility; import gregtech.api.metatileentity.multiblock.MultiblockControllerBase; +import gregtech.api.mui.GTGuis; import gregtech.api.util.GTUtility; import gregtech.client.renderer.texture.Textures; import gregtech.common.gui.widget.appeng.AEItemConfigWidget; @@ -48,6 +49,11 @@ import codechicken.lib.render.CCRenderState; import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.factory.PosGuiData; +import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.widgets.SlotGroupWidget; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -182,6 +188,20 @@ public void removeFromMultiBlock(MultiblockControllerBase controllerBase) { } } + @Override + public boolean usesMui2() { + return true; + } + + @Override + public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) { + return GTGuis.createPanel(this, 176, 18 + 18 * 4 + 94) + .child(IKey.lang(getMetaFullName()).asWidget().pos(5, 5)) + .child(SlotGroupWidget.playerInventory().left(7).bottom(7)) + .child(IKey.dynamic(() -> isOnline ? I18n.format("gregtech.gui.me_network.online") : + I18n.format("gregtech.gui.me_network.offline")).asWidget().pos(5, 15)); + } + @Override protected final ModularUI createUI(EntityPlayer player) { ModularUI.Builder builder = createUITemplate(player); From b911ee4fb8dd6e7980a52d77d086fde3ba5f4b41 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Sun, 18 May 2025 22:38:44 -0400 Subject: [PATCH 002/136] Item Input: extra slot, circuit, arrow --- .../java/gregtech/api/mui/GTGuiTextures.java | 8 +++ .../appeng/MetaTileEntityMEInputBus.java | 51 +++++++------------ 2 files changed, 26 insertions(+), 33 deletions(-) diff --git a/src/main/java/gregtech/api/mui/GTGuiTextures.java b/src/main/java/gregtech/api/mui/GTGuiTextures.java index f34c08a936a..1fea174eb4c 100644 --- a/src/main/java/gregtech/api/mui/GTGuiTextures.java +++ b/src/main/java/gregtech/api/mui/GTGuiTextures.java @@ -512,6 +512,14 @@ public static class IDs { // MISC + // ME hatch/bus + public static final UITexture NUMBER_BACKGROUND = fullImage("textures/gui/widget/number_background.png"); + public static final UITexture CONFIG_ARROW = fullImage("textures/gui/widget/config_arrow.png"); + public static final UITexture CONFIG_ARROW_DARK = fullImage("textures/gui/widget/config_arrow_dark.png"); + public static final UITexture SELECT_BOX = fullImage("textures/gui/widget/select_box.png"); + public static final UITexture BUTTON_AUTO_PULL = fullImage("textures/gui/widget/button_me_auto_pull.png"); + public static final UITexture ARROW_DOUBLE = fullImage("textures/gui/widget/arrow_double.png"); + public static void init() {/**/} private static UITexture fullImage(String path) { diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java index c4cffd96d48..0a6b1d4699d 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java @@ -11,18 +11,16 @@ import gregtech.api.capability.impl.NotifiableItemStackHandler; import gregtech.api.gui.GuiTextures; import gregtech.api.gui.ModularUI; -import gregtech.api.gui.widgets.GhostCircuitSlotWidget; -import gregtech.api.gui.widgets.SlotWidget; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.metatileentity.multiblock.AbilityInstances; import gregtech.api.metatileentity.multiblock.IMultiblockAbilityPart; import gregtech.api.metatileentity.multiblock.MultiblockAbility; import gregtech.api.metatileentity.multiblock.MultiblockControllerBase; +import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuis; import gregtech.api.util.GTUtility; import gregtech.client.renderer.texture.Textures; -import gregtech.common.gui.widget.appeng.AEItemConfigWidget; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEItemList; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEItemSlot; import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedItemStack; @@ -53,7 +51,10 @@ import com.cleanroommc.modularui.factory.PosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.value.sync.SyncHandlers; +import com.cleanroommc.modularui.widgets.ItemSlot; import com.cleanroommc.modularui.widgets.SlotGroupWidget; +import com.cleanroommc.modularui.widgets.layout.Flow; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -195,11 +196,24 @@ public boolean usesMui2() { @Override public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) { + guiSyncManager.registerSlotGroup("extra_slot", 1); + return GTGuis.createPanel(this, 176, 18 + 18 * 4 + 94) .child(IKey.lang(getMetaFullName()).asWidget().pos(5, 5)) .child(SlotGroupWidget.playerInventory().left(7).bottom(7)) .child(IKey.dynamic(() -> isOnline ? I18n.format("gregtech.gui.me_network.online") : - I18n.format("gregtech.gui.me_network.offline")).asWidget().pos(5, 15)); + I18n.format("gregtech.gui.me_network.offline")).asWidget().pos(5, 15)) + .child(Flow.column() + .pos(7 + 18 * 4, 25 + 18) + .size(18, 18 * 4) + .child(GTGuiTextures.ARROW_DOUBLE.asWidget()) + .child(new gregtech.api.mui.widget.GhostCircuitSlotWidget() + .slot(SyncHandlers.itemSlot(circuitInventory, 0)) + .background(GTGuiTextures.SLOT, GTGuiTextures.INT_CIRCUIT_OVERLAY)) + .child(new ItemSlot() + .slot(SyncHandlers.itemSlot(extraSlotInventory, 0) + .slotGroup("extra_slot")) + .addTooltipLine(IKey.lang("gregtech.gui.me_bus.extra_slot")))); } @Override @@ -212,35 +226,6 @@ protected ModularUI.Builder createUITemplate(EntityPlayer player) { ModularUI.Builder builder = ModularUI .builder(GuiTextures.BACKGROUND, 176, 18 + 18 * 4 + 94) .label(10, 5, getMetaFullName()); - // ME Network status - builder.dynamicLabel(10, 15, () -> this.isOnline ? - I18n.format("gregtech.gui.me_network.online") : - I18n.format("gregtech.gui.me_network.offline"), - 0x404040); - - // Config slots - builder.widget(new AEItemConfigWidget(7, 25, this.getAEItemHandler())); - - // Ghost circuit slot - SlotWidget circuitSlot = new GhostCircuitSlotWidget(circuitInventory, 0, 7 + 18 * 4, 25 + 18 * 3) - .setBackgroundTexture(GuiTextures.SLOT, GuiTextures.INT_CIRCUIT_OVERLAY); - builder.widget(circuitSlot.setConsumer(w -> { - String configString; - if (circuitInventory == null || - circuitInventory.getCircuitValue() == GhostCircuitItemStackHandler.NO_CONFIG) { - configString = new TextComponentTranslation("gregtech.gui.configurator_slot.no_value") - .getFormattedText(); - } else { - configString = String.valueOf(circuitInventory.getCircuitValue()); - } - - w.setTooltipText("gregtech.gui.configurator_slot.tooltip", configString); - })); - - // Extra slot - builder.widget(new SlotWidget(extraSlotInventory, 0, 7 + 18 * 4, 25 + 18 * 2) - .setBackgroundTexture(GuiTextures.SLOT) - .setTooltipText("gregtech.gui.me_bus.extra_slot")); // Arrow image builder.image(7 + 18 * 4, 25 + 18, 18, 18, GuiTextures.ARROW_DOUBLE); From 4ea4d7a7db9a308f2aee4b63dc2e3af259d6f7ff Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Sun, 18 May 2025 22:46:52 -0400 Subject: [PATCH 003/136] Item Input: extra slot, circuit, arrow In progress --- .../MetaTileEntityAEHostableChannelPart.java | 154 +++++++++++++++++ .../appeng/MetaTileEntityAEHostablePart.java | 156 ++---------------- .../appeng/MetaTileEntityMEInputBus.java | 2 +- .../appeng/MetaTileEntityMEInputHatch.java | 28 +++- .../appeng/MetaTileEntityMEOutputBus.java | 2 +- .../appeng/MetaTileEntityMEOutputHatch.java | 2 +- .../provider/AEMultiblockHatchProvider.java | 4 +- .../provider/AEMultiblockHatchProvider.java | 4 +- 8 files changed, 204 insertions(+), 148 deletions(-) create mode 100644 src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostableChannelPart.java diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostableChannelPart.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostableChannelPart.java new file mode 100644 index 00000000000..7dde21b2c55 --- /dev/null +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostableChannelPart.java @@ -0,0 +1,154 @@ +package gregtech.common.metatileentities.multi.multiblockpart.appeng; + +import gregtech.api.capability.IControllable; +import gregtech.common.ConfigHolder; +import gregtech.common.metatileentities.multi.multiblockpart.MetaTileEntityMultiblockNotifiablePart; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.PacketBuffer; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.EnumHand; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.text.TextComponentTranslation; + +import appeng.api.AEApi; +import appeng.api.networking.GridFlags; +import appeng.api.networking.security.IActionHost; +import appeng.api.networking.security.IActionSource; +import appeng.api.storage.IMEMonitor; +import appeng.api.storage.IStorageChannel; +import appeng.api.storage.data.IAEStack; +import appeng.api.util.AECableType; +import appeng.api.util.AEPartLocation; +import appeng.me.GridAccessException; +import appeng.me.helpers.AENetworkProxy; +import appeng.me.helpers.BaseActionSource; +import appeng.me.helpers.IGridProxyable; +import appeng.me.helpers.MachineSource; +import codechicken.lib.raytracer.CuboidRayTraceResult; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.io.IOException; +import java.util.EnumSet; +import java.util.List; + +import static gregtech.api.capability.GregtechDataCodes.UPDATE_ONLINE_STATUS; + +public abstract class MetaTileEntityAEHostableChannelPart> extends MetaTileEntityAEHostablePart + implements IControllable { + + private final Class> storageChannel; + protected boolean meStatusChanged = false; + + public MetaTileEntityAEHostableChannelPart(ResourceLocation metaTileEntityId, int tier, boolean isExportHatch, + Class> storageChannel) { + super(metaTileEntityId, tier, isExportHatch); + this.storageChannel = storageChannel; + } + + /** + * ME hatch will try to put its buffer back to me system when removal. + * So there is no need to drop them. + */ + @Override + public void clearMachineInventory(@NotNull List<@NotNull ItemStack> itemBuffer) {} + + @Override + public void receiveCustomData(int dataId, PacketBuffer buf) { + super.receiveCustomData(dataId, buf); + if (dataId == UPDATE_ONLINE_STATUS) { + boolean isOnline = buf.readBoolean(); + if (this.isOnline != isOnline) { + this.isOnline = isOnline; + scheduleRenderUpdate(); + } + } + } + + protected boolean shouldSyncME() { + return this.meUpdateTick % ConfigHolder.compat.ae2.updateIntervals == 0; + } + + protected IActionSource getActionSource() { + if (this.getHolder() instanceof IActionHost holder) { + return new MachineSource(holder); + } + return new BaseActionSource(); + } + + @Nullable + private AENetworkProxy createProxy() { + if (this.getHolder() instanceof IGridProxyable holder) { + AENetworkProxy proxy = new AENetworkProxy(holder, "mte_proxy", this.getStackForm(), true); + proxy.setFlags(GridFlags.REQUIRE_CHANNEL); + proxy.setIdlePowerUsage(ConfigHolder.compat.ae2.meHatchEnergyUsage); + proxy.setValidSides(getConnectableSides()); + return proxy; + } + return null; + } + + @NotNull + protected IStorageChannel getStorageChannel() { + return AEApi.instance().storage().getStorageChannel(storageChannel); + } + + @Nullable + protected IMEMonitor getMonitor() { + AENetworkProxy proxy = getProxy(); + if (proxy == null) return null; + + IStorageChannel channel = getStorageChannel(); + + try { + return proxy.getStorage().getInventory(channel); + } catch (GridAccessException ignored) { + return null; + } + } + + public EnumSet getConnectableSides() { + return this.allowExtraConnections ? EnumSet.allOf(EnumFacing.class) : EnumSet.of(getFrontFacing()); + } + + public void updateConnectableSides() { + if (this.aeProxy != null) { + this.aeProxy.setValidSides(getConnectableSides()); + } + } + + @Override + public boolean onWireCutterClick(EntityPlayer playerIn, EnumHand hand, EnumFacing facing, + CuboidRayTraceResult hitResult) { + this.allowExtraConnections = !this.allowExtraConnections; + updateConnectableSides(); + + if (!getWorld().isRemote) { + playerIn.sendStatusMessage(new TextComponentTranslation(this.allowExtraConnections ? + "gregtech.machine.me.extra_connections.enabled" : "gregtech.machine.me.extra_connections.disabled"), + true); + } + + return true; + } + + public boolean isOnline() { + return isOnline; + } + + @Override + public NBTTagCompound writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + data.setBoolean("AllowExtraConnections", this.allowExtraConnections); + return data; + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + this.allowExtraConnections = data.getBoolean("AllowExtraConnections"); + } +} diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostablePart.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostablePart.java index 5fec49de898..89dd261adbd 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostablePart.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostablePart.java @@ -1,58 +1,32 @@ package gregtech.common.metatileentities.multi.multiblockpart.appeng; -import gregtech.api.capability.IControllable; -import gregtech.common.ConfigHolder; +import appeng.api.util.AECableType; +import appeng.api.util.AEPartLocation; +import appeng.me.helpers.AENetworkProxy; + import gregtech.common.metatileentities.multi.multiblockpart.MetaTileEntityMultiblockNotifiablePart; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.PacketBuffer; import net.minecraft.util.EnumFacing; -import net.minecraft.util.EnumHand; import net.minecraft.util.ResourceLocation; -import net.minecraft.util.text.TextComponentTranslation; - -import appeng.api.AEApi; -import appeng.api.networking.GridFlags; -import appeng.api.networking.security.IActionHost; -import appeng.api.networking.security.IActionSource; -import appeng.api.storage.IMEMonitor; -import appeng.api.storage.IStorageChannel; -import appeng.api.storage.data.IAEStack; -import appeng.api.util.AECableType; -import appeng.api.util.AEPartLocation; -import appeng.me.GridAccessException; -import appeng.me.helpers.AENetworkProxy; -import appeng.me.helpers.BaseActionSource; -import appeng.me.helpers.IGridProxyable; -import appeng.me.helpers.MachineSource; -import codechicken.lib.raytracer.CuboidRayTraceResult; + import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.IOException; -import java.util.EnumSet; -import java.util.List; import static gregtech.api.capability.GregtechDataCodes.UPDATE_ONLINE_STATUS; -public abstract class MetaTileEntityAEHostablePart> extends MetaTileEntityMultiblockNotifiablePart - implements IControllable { +public abstract class MetaTileEntityAEHostablePart extends MetaTileEntityMultiblockNotifiablePart { - private final Class> storageChannel; private AENetworkProxy aeProxy; - private int meUpdateTick; + private int meUpdateTick = 0; protected boolean isOnline; - private boolean allowExtraConnections; - protected boolean meStatusChanged = false; + private boolean allowExtraConnections = false; - public MetaTileEntityAEHostablePart(ResourceLocation metaTileEntityId, int tier, boolean isExportHatch, - Class> storageChannel) { + public MetaTileEntityAEHostablePart(ResourceLocation metaTileEntityId, int tier, boolean isExportHatch) { super(metaTileEntityId, tier, isExportHatch); - this.meUpdateTick = 0; - this.storageChannel = storageChannel; - this.allowExtraConnections = false; } @Override @@ -63,16 +37,10 @@ public void update() { } } - /** - * ME hatch will try to put its buffer back to me system when removal. - * So there is no need to drop them. - */ - @Override - public void clearMachineInventory(@NotNull List<@NotNull ItemStack> itemBuffer) {} - @Override public void writeInitialSyncData(PacketBuffer buf) { - super.writeInitialSyncData(buf); + super.receiveInitialSyncData(buf); + if (this.aeProxy != null) { buf.writeBoolean(true); NBTTagCompound proxy = new NBTTagCompound(); @@ -81,14 +49,17 @@ public void writeInitialSyncData(PacketBuffer buf) { } else { buf.writeBoolean(false); } + buf.writeInt(this.meUpdateTick); buf.writeBoolean(this.isOnline); buf.writeBoolean(this.allowExtraConnections); } + @Override public void receiveInitialSyncData(PacketBuffer buf) { super.receiveInitialSyncData(buf); + if (buf.readBoolean()) { NBTTagCompound nbtTagCompound; try { @@ -101,23 +72,12 @@ public void receiveInitialSyncData(PacketBuffer buf) { this.aeProxy.readFromNBT(nbtTagCompound); } } + this.meUpdateTick = buf.readInt(); this.isOnline = buf.readBoolean(); this.allowExtraConnections = buf.readBoolean(); } - @Override - public void receiveCustomData(int dataId, PacketBuffer buf) { - super.receiveCustomData(dataId, buf); - if (dataId == UPDATE_ONLINE_STATUS) { - boolean isOnline = buf.readBoolean(); - if (this.isOnline != isOnline) { - this.isOnline = isOnline; - scheduleRenderUpdate(); - } - } - } - @NotNull @Override public AECableType getCableConnectionType(@NotNull AEPartLocation part) { @@ -150,7 +110,7 @@ public void gridChanged() {} /** * Get the me network connection status, updating it if on serverside. - * + * * @return the updated status. */ public boolean updateMEStatus() { @@ -166,88 +126,4 @@ public boolean updateMEStatus() { } return this.isOnline; } - - protected boolean shouldSyncME() { - return this.meUpdateTick % ConfigHolder.compat.ae2.updateIntervals == 0; - } - - protected IActionSource getActionSource() { - if (this.getHolder() instanceof IActionHost holder) { - return new MachineSource(holder); - } - return new BaseActionSource(); - } - - @Nullable - private AENetworkProxy createProxy() { - if (this.getHolder() instanceof IGridProxyable holder) { - AENetworkProxy proxy = new AENetworkProxy(holder, "mte_proxy", this.getStackForm(), true); - proxy.setFlags(GridFlags.REQUIRE_CHANNEL); - proxy.setIdlePowerUsage(ConfigHolder.compat.ae2.meHatchEnergyUsage); - proxy.setValidSides(getConnectableSides()); - return proxy; - } - return null; - } - - @NotNull - protected IStorageChannel getStorageChannel() { - return AEApi.instance().storage().getStorageChannel(storageChannel); - } - - @Nullable - protected IMEMonitor getMonitor() { - AENetworkProxy proxy = getProxy(); - if (proxy == null) return null; - - IStorageChannel channel = getStorageChannel(); - - try { - return proxy.getStorage().getInventory(channel); - } catch (GridAccessException ignored) { - return null; - } - } - - public EnumSet getConnectableSides() { - return this.allowExtraConnections ? EnumSet.allOf(EnumFacing.class) : EnumSet.of(getFrontFacing()); - } - - public void updateConnectableSides() { - if (this.aeProxy != null) { - this.aeProxy.setValidSides(getConnectableSides()); - } - } - - @Override - public boolean onWireCutterClick(EntityPlayer playerIn, EnumHand hand, EnumFacing facing, - CuboidRayTraceResult hitResult) { - this.allowExtraConnections = !this.allowExtraConnections; - updateConnectableSides(); - - if (!getWorld().isRemote) { - playerIn.sendStatusMessage(new TextComponentTranslation(this.allowExtraConnections ? - "gregtech.machine.me.extra_connections.enabled" : "gregtech.machine.me.extra_connections.disabled"), - true); - } - - return true; - } - - public boolean isOnline() { - return isOnline; - } - - @Override - public NBTTagCompound writeToNBT(NBTTagCompound data) { - super.writeToNBT(data); - data.setBoolean("AllowExtraConnections", this.allowExtraConnections); - return data; - } - - @Override - public void readFromNBT(NBTTagCompound data) { - super.readFromNBT(data); - this.allowExtraConnections = data.getBoolean("AllowExtraConnections"); - } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java index 0a6b1d4699d..4bb9b373351 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java @@ -61,7 +61,7 @@ import java.util.Arrays; import java.util.List; -public class MetaTileEntityMEInputBus extends MetaTileEntityAEHostablePart +public class MetaTileEntityMEInputBus extends MetaTileEntityAEHostableChannelPart implements IMultiblockAbilityPart, IGhostSlotConfigurable, IDataStickIntractable { diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java index 120b25e8827..b47dcc64e1a 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java @@ -13,6 +13,8 @@ import gregtech.api.metatileentity.multiblock.AbilityInstances; import gregtech.api.metatileentity.multiblock.IMultiblockAbilityPart; import gregtech.api.metatileentity.multiblock.MultiblockAbility; +import gregtech.api.mui.GTGuiTextures; +import gregtech.api.mui.GTGuis; import gregtech.client.renderer.texture.Textures; import gregtech.common.gui.widget.appeng.AEFluidConfigWidget; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEFluidList; @@ -40,13 +42,19 @@ import codechicken.lib.render.CCRenderState; import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.factory.PosGuiData; +import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.widgets.SlotGroupWidget; +import com.cleanroommc.modularui.widgets.layout.Flow; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Arrays; import java.util.List; -public class MetaTileEntityMEInputHatch extends MetaTileEntityAEHostablePart +public class MetaTileEntityMEInputHatch extends MetaTileEntityAEHostableChannelPart implements IMultiblockAbilityPart, IDataStickIntractable { public final static String FLUID_BUFFER_TAG = "FluidTanks"; @@ -144,6 +152,24 @@ public MetaTileEntity createMetaTileEntity(IGregTechTileEntity iGregTechTileEnti return new MetaTileEntityMEInputHatch(this.metaTileEntityId); } + @Override + public boolean usesMui2() { + return true; + } + + @Override + public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) { + return GTGuis.createPanel(this, 176, 18 + 18 * 4 + 94) + .child(IKey.lang(getMetaFullName()).asWidget().pos(5, 5)) + .child(SlotGroupWidget.playerInventory().left(7).bottom(7)) + .child(IKey.dynamic(() -> isOnline ? I18n.format("gregtech.gui.me_network.online") : + I18n.format("gregtech.gui.me_network.offline")).asWidget().pos(5, 15)) + .child(Flow.column() + .pos(7 + 18 * 4, 25 + 18) + .size(18, 18 * 4) + .child(GTGuiTextures.ARROW_DOUBLE.asWidget())); + } + @Override protected final ModularUI createUI(EntityPlayer player) { ModularUI.Builder builder = createUITemplate(player); diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBus.java index de44e64b339..69734d9b79c 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBus.java @@ -40,7 +40,7 @@ import java.util.ArrayList; import java.util.List; -public class MetaTileEntityMEOutputBus extends MetaTileEntityAEHostablePart +public class MetaTileEntityMEOutputBus extends MetaTileEntityAEHostableChannelPart implements IMultiblockAbilityPart { public final static String ITEM_BUFFER_TAG = "ItemBuffer"; diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputHatch.java index 77ba57bf656..cefe011f695 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputHatch.java @@ -42,7 +42,7 @@ import java.util.ArrayList; import java.util.List; -public class MetaTileEntityMEOutputHatch extends MetaTileEntityAEHostablePart +public class MetaTileEntityMEOutputHatch extends MetaTileEntityAEHostableChannelPart implements IMultiblockAbilityPart { public final static String FLUID_BUFFER_TAG = "FluidBuffer"; diff --git a/src/main/java/gregtech/integration/hwyla/provider/AEMultiblockHatchProvider.java b/src/main/java/gregtech/integration/hwyla/provider/AEMultiblockHatchProvider.java index 1724980aff5..299aee19b7d 100644 --- a/src/main/java/gregtech/integration/hwyla/provider/AEMultiblockHatchProvider.java +++ b/src/main/java/gregtech/integration/hwyla/provider/AEMultiblockHatchProvider.java @@ -2,7 +2,7 @@ import gregtech.api.GTValues; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; -import gregtech.common.metatileentities.multi.multiblockpart.appeng.MetaTileEntityAEHostablePart; +import gregtech.common.metatileentities.multi.multiblockpart.appeng.MetaTileEntityAEHostableChannelPart; import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.EntityPlayerMP; @@ -36,7 +36,7 @@ public void register(@NotNull IWailaRegistrar registrar) { public @NotNull NBTTagCompound getNBTData(EntityPlayerMP player, TileEntity te, NBTTagCompound tag, World world, BlockPos pos) { if (te instanceof IGregTechTileEntity gtte && - gtte.getMetaTileEntity() instanceof MetaTileEntityAEHostablePartaeHostablePart) { + gtte.getMetaTileEntity() instanceof MetaTileEntityAEHostableChannelPart aeHostablePart) { tag.setBoolean(NBT_KEY, aeHostablePart.isOnline()); } diff --git a/src/main/java/gregtech/integration/theoneprobe/provider/AEMultiblockHatchProvider.java b/src/main/java/gregtech/integration/theoneprobe/provider/AEMultiblockHatchProvider.java index de734d109f2..3eb8e1f5586 100644 --- a/src/main/java/gregtech/integration/theoneprobe/provider/AEMultiblockHatchProvider.java +++ b/src/main/java/gregtech/integration/theoneprobe/provider/AEMultiblockHatchProvider.java @@ -1,7 +1,7 @@ package gregtech.integration.theoneprobe.provider; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; -import gregtech.common.metatileentities.multi.multiblockpart.appeng.MetaTileEntityAEHostablePart; +import gregtech.common.metatileentities.multi.multiblockpart.appeng.MetaTileEntityAEHostableChannelPart; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; @@ -24,7 +24,7 @@ public void addProbeInfo(ProbeMode probeMode, IProbeInfo probeInfo, EntityPlayer IBlockState blockState, IProbeHitData probeHitData) { if (blockState.getBlock().hasTileEntity(blockState) && world.getTileEntity(probeHitData.getPos()) instanceof IGregTechTileEntity gtte && - gtte.getMetaTileEntity() instanceof MetaTileEntityAEHostablePartaeHostablePart) { + gtte.getMetaTileEntity() instanceof MetaTileEntityAEHostableChannelPart aeHostablePart) { if (aeHostablePart.isOnline()) { probeInfo.text("{*gregtech.gui.me_network.online*}"); } else { From 035b97bdd4506b75b00fcdb5f976ea5d0176f0bd Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Sun, 18 May 2025 23:08:47 -0400 Subject: [PATCH 004/136] Finalize AEHostablePart split --- .../MetaTileEntityAEHostableChannelPart.java | 98 +--------------- .../appeng/MetaTileEntityAEHostablePart.java | 108 ++++++++++++++++-- .../appeng/MetaTileEntityMEInputBus.java | 4 +- .../appeng/MetaTileEntityMEInputHatch.java | 6 +- .../appeng/MetaTileEntityMEOutputBus.java | 4 +- .../appeng/MetaTileEntityMEOutputHatch.java | 4 +- .../appeng/MetaTileEntityMEStockingBus.java | 2 +- .../appeng/MetaTileEntityMEStockingHatch.java | 2 +- .../provider/AEMultiblockHatchProvider.java | 2 +- .../provider/AEMultiblockHatchProvider.java | 2 +- 10 files changed, 113 insertions(+), 119 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostableChannelPart.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostableChannelPart.java index 7dde21b2c55..a3042fa1ec4 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostableChannelPart.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostableChannelPart.java @@ -2,46 +2,25 @@ import gregtech.api.capability.IControllable; import gregtech.common.ConfigHolder; -import gregtech.common.metatileentities.multi.multiblockpart.MetaTileEntityMultiblockNotifiablePart; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.network.PacketBuffer; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.EnumHand; import net.minecraft.util.ResourceLocation; -import net.minecraft.util.text.TextComponentTranslation; import appeng.api.AEApi; -import appeng.api.networking.GridFlags; -import appeng.api.networking.security.IActionHost; -import appeng.api.networking.security.IActionSource; import appeng.api.storage.IMEMonitor; import appeng.api.storage.IStorageChannel; import appeng.api.storage.data.IAEStack; -import appeng.api.util.AECableType; -import appeng.api.util.AEPartLocation; import appeng.me.GridAccessException; import appeng.me.helpers.AENetworkProxy; -import appeng.me.helpers.BaseActionSource; -import appeng.me.helpers.IGridProxyable; -import appeng.me.helpers.MachineSource; -import codechicken.lib.raytracer.CuboidRayTraceResult; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.io.IOException; -import java.util.EnumSet; import java.util.List; -import static gregtech.api.capability.GregtechDataCodes.UPDATE_ONLINE_STATUS; - public abstract class MetaTileEntityAEHostableChannelPart> extends MetaTileEntityAEHostablePart - implements IControllable { + implements IControllable { private final Class> storageChannel; - protected boolean meStatusChanged = false; public MetaTileEntityAEHostableChannelPart(ResourceLocation metaTileEntityId, int tier, boolean isExportHatch, Class> storageChannel) { @@ -56,39 +35,8 @@ public MetaTileEntityAEHostableChannelPart(ResourceLocation metaTileEntityId, in @Override public void clearMachineInventory(@NotNull List<@NotNull ItemStack> itemBuffer) {} - @Override - public void receiveCustomData(int dataId, PacketBuffer buf) { - super.receiveCustomData(dataId, buf); - if (dataId == UPDATE_ONLINE_STATUS) { - boolean isOnline = buf.readBoolean(); - if (this.isOnline != isOnline) { - this.isOnline = isOnline; - scheduleRenderUpdate(); - } - } - } - protected boolean shouldSyncME() { - return this.meUpdateTick % ConfigHolder.compat.ae2.updateIntervals == 0; - } - - protected IActionSource getActionSource() { - if (this.getHolder() instanceof IActionHost holder) { - return new MachineSource(holder); - } - return new BaseActionSource(); - } - - @Nullable - private AENetworkProxy createProxy() { - if (this.getHolder() instanceof IGridProxyable holder) { - AENetworkProxy proxy = new AENetworkProxy(holder, "mte_proxy", this.getStackForm(), true); - proxy.setFlags(GridFlags.REQUIRE_CHANNEL); - proxy.setIdlePowerUsage(ConfigHolder.compat.ae2.meHatchEnergyUsage); - proxy.setValidSides(getConnectableSides()); - return proxy; - } - return null; + return getMeUpdateTick() % ConfigHolder.compat.ae2.updateIntervals == 0; } @NotNull @@ -109,46 +57,4 @@ protected IMEMonitor getMonitor() { return null; } } - - public EnumSet getConnectableSides() { - return this.allowExtraConnections ? EnumSet.allOf(EnumFacing.class) : EnumSet.of(getFrontFacing()); - } - - public void updateConnectableSides() { - if (this.aeProxy != null) { - this.aeProxy.setValidSides(getConnectableSides()); - } - } - - @Override - public boolean onWireCutterClick(EntityPlayer playerIn, EnumHand hand, EnumFacing facing, - CuboidRayTraceResult hitResult) { - this.allowExtraConnections = !this.allowExtraConnections; - updateConnectableSides(); - - if (!getWorld().isRemote) { - playerIn.sendStatusMessage(new TextComponentTranslation(this.allowExtraConnections ? - "gregtech.machine.me.extra_connections.enabled" : "gregtech.machine.me.extra_connections.disabled"), - true); - } - - return true; - } - - public boolean isOnline() { - return isOnline; - } - - @Override - public NBTTagCompound writeToNBT(NBTTagCompound data) { - super.writeToNBT(data); - data.setBoolean("AllowExtraConnections", this.allowExtraConnections); - return data; - } - - @Override - public void readFromNBT(NBTTagCompound data) { - super.readFromNBT(data); - this.allowExtraConnections = data.getBoolean("AllowExtraConnections"); - } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostablePart.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostablePart.java index 89dd261adbd..247141f9dd5 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostablePart.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostablePart.java @@ -1,20 +1,31 @@ package gregtech.common.metatileentities.multi.multiblockpart.appeng; -import appeng.api.util.AECableType; -import appeng.api.util.AEPartLocation; -import appeng.me.helpers.AENetworkProxy; - +import gregtech.common.ConfigHolder; import gregtech.common.metatileentities.multi.multiblockpart.MetaTileEntityMultiblockNotifiablePart; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.PacketBuffer; import net.minecraft.util.EnumFacing; +import net.minecraft.util.EnumHand; import net.minecraft.util.ResourceLocation; +import net.minecraft.util.text.TextComponentTranslation; +import appeng.api.networking.GridFlags; +import appeng.api.networking.security.IActionHost; +import appeng.api.networking.security.IActionSource; +import appeng.api.util.AECableType; +import appeng.api.util.AEPartLocation; +import appeng.me.helpers.AENetworkProxy; +import appeng.me.helpers.BaseActionSource; +import appeng.me.helpers.IGridProxyable; +import appeng.me.helpers.MachineSource; +import codechicken.lib.raytracer.CuboidRayTraceResult; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.IOException; +import java.util.EnumSet; import static gregtech.api.capability.GregtechDataCodes.UPDATE_ONLINE_STATUS; @@ -23,7 +34,8 @@ public abstract class MetaTileEntityAEHostablePart extends MetaTileEntityMultibl private AENetworkProxy aeProxy; private int meUpdateTick = 0; protected boolean isOnline; - private boolean allowExtraConnections = false; + protected boolean allowExtraConnections = false; + protected boolean meStatusChanged = false; public MetaTileEntityAEHostablePart(ResourceLocation metaTileEntityId, int tier, boolean isExportHatch) { super(metaTileEntityId, tier, isExportHatch); @@ -37,6 +49,14 @@ public void update() { } } + public boolean isOnline() { + return isOnline; + } + + public int getMeUpdateTick() { + return meUpdateTick; + } + @Override public void writeInitialSyncData(PacketBuffer buf) { super.receiveInitialSyncData(buf); @@ -55,7 +75,6 @@ public void writeInitialSyncData(PacketBuffer buf) { buf.writeBoolean(this.allowExtraConnections); } - @Override public void receiveInitialSyncData(PacketBuffer buf) { super.receiveInitialSyncData(buf); @@ -78,6 +97,18 @@ public void receiveInitialSyncData(PacketBuffer buf) { this.allowExtraConnections = buf.readBoolean(); } + @Override + public void receiveCustomData(int dataId, PacketBuffer buf) { + super.receiveCustomData(dataId, buf); + if (dataId == UPDATE_ONLINE_STATUS) { + boolean isOnline = buf.readBoolean(); + if (this.isOnline != isOnline) { + this.isOnline = isOnline; + scheduleRenderUpdate(); + } + } + } + @NotNull @Override public AECableType getCableConnectionType(@NotNull AEPartLocation part) { @@ -87,6 +118,49 @@ public AECableType getCableConnectionType(@NotNull AEPartLocation part) { return AECableType.SMART; } + public EnumSet getConnectableSides() { + return this.allowExtraConnections ? EnumSet.allOf(EnumFacing.class) : EnumSet.of(getFrontFacing()); + } + + public void updateConnectableSides() { + if (this.aeProxy != null) { + this.aeProxy.setValidSides(getConnectableSides()); + } + } + + @Override + public boolean onWireCutterClick(EntityPlayer playerIn, EnumHand hand, EnumFacing facing, + CuboidRayTraceResult hitResult) { + this.allowExtraConnections = !this.allowExtraConnections; + updateConnectableSides(); + + if (!getWorld().isRemote) { + playerIn.sendStatusMessage(new TextComponentTranslation(this.allowExtraConnections ? + "gregtech.machine.me.extra_connections.enabled" : "gregtech.machine.me.extra_connections.disabled"), + true); + } + + return true; + } + + @Override + public void setFrontFacing(EnumFacing frontFacing) { + super.setFrontFacing(frontFacing); + updateConnectableSides(); + } + + @Nullable + private AENetworkProxy createProxy() { + if (this.getHolder() instanceof IGridProxyable holder) { + AENetworkProxy proxy = new AENetworkProxy(holder, "mte_proxy", this.getStackForm(), true); + proxy.setFlags(GridFlags.REQUIRE_CHANNEL); + proxy.setIdlePowerUsage(ConfigHolder.compat.ae2.meHatchEnergyUsage); + proxy.setValidSides(getConnectableSides()); + return proxy; + } + return null; + } + @Nullable @Override public AENetworkProxy getProxy() { @@ -99,10 +173,11 @@ public AENetworkProxy getProxy() { return this.aeProxy; } - @Override - public void setFrontFacing(EnumFacing frontFacing) { - super.setFrontFacing(frontFacing); - updateConnectableSides(); + protected IActionSource getActionSource() { + if (this.getHolder() instanceof IActionHost holder) { + return new MachineSource(holder); + } + return new BaseActionSource(); } @Override @@ -126,4 +201,17 @@ public boolean updateMEStatus() { } return this.isOnline; } + + @Override + public NBTTagCompound writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + data.setBoolean("AllowExtraConnections", this.allowExtraConnections); + return data; + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + this.allowExtraConnections = data.getBoolean("AllowExtraConnections"); + } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java index 4bb9b373351..e40e22ccb7b 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java @@ -201,7 +201,7 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) return GTGuis.createPanel(this, 176, 18 + 18 * 4 + 94) .child(IKey.lang(getMetaFullName()).asWidget().pos(5, 5)) .child(SlotGroupWidget.playerInventory().left(7).bottom(7)) - .child(IKey.dynamic(() -> isOnline ? I18n.format("gregtech.gui.me_network.online") : + .child(IKey.dynamic(() -> isOnline() ? I18n.format("gregtech.gui.me_network.online") : I18n.format("gregtech.gui.me_network.offline")).asWidget().pos(5, 15)) .child(Flow.column() .pos(7 + 18 * 4, 25 + 18) @@ -310,7 +310,7 @@ public void readFromNBT(NBTTagCompound data) { public void renderMetaTileEntity(CCRenderState renderState, Matrix4 translation, IVertexOperation[] pipeline) { super.renderMetaTileEntity(renderState, translation, pipeline); if (this.shouldRenderOverlay()) { - if (isOnline) { + if (isOnline()) { Textures.ME_INPUT_BUS_ACTIVE.renderSided(getFrontFacing(), renderState, translation, pipeline); } else { Textures.ME_INPUT_BUS.renderSided(getFrontFacing(), renderState, translation, pipeline); diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java index b47dcc64e1a..87d19a6136e 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java @@ -162,7 +162,7 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) return GTGuis.createPanel(this, 176, 18 + 18 * 4 + 94) .child(IKey.lang(getMetaFullName()).asWidget().pos(5, 5)) .child(SlotGroupWidget.playerInventory().left(7).bottom(7)) - .child(IKey.dynamic(() -> isOnline ? I18n.format("gregtech.gui.me_network.online") : + .child(IKey.dynamic(() -> isOnline() ? I18n.format("gregtech.gui.me_network.online") : I18n.format("gregtech.gui.me_network.offline")).asWidget().pos(5, 15)) .child(Flow.column() .pos(7 + 18 * 4, 25 + 18) @@ -181,7 +181,7 @@ protected ModularUI.Builder createUITemplate(EntityPlayer player) { .builder(GuiTextures.BACKGROUND, 176, 18 + 18 * 4 + 94) .label(10, 5, getMetaFullName()); // ME Network status - builder.dynamicLabel(10, 15, () -> this.isOnline ? + builder.dynamicLabel(10, 15, () -> isOnline() ? I18n.format("gregtech.gui.me_network.online") : I18n.format("gregtech.gui.me_network.offline"), 0x404040); @@ -271,7 +271,7 @@ public void readFromNBT(NBTTagCompound data) { public void renderMetaTileEntity(CCRenderState renderState, Matrix4 translation, IVertexOperation[] pipeline) { super.renderMetaTileEntity(renderState, translation, pipeline); if (this.shouldRenderOverlay()) { - if (isOnline) { + if (isOnline()) { Textures.ME_INPUT_HATCH_ACTIVE.renderSided(getFrontFacing(), renderState, translation, pipeline); } else { Textures.ME_INPUT_HATCH.renderSided(getFrontFacing(), renderState, translation, pipeline); diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBus.java index 69734d9b79c..847bcfaf2a1 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBus.java @@ -100,7 +100,7 @@ protected ModularUI createUI(EntityPlayer entityPlayer) { .builder(GuiTextures.BACKGROUND, 176, 18 + 18 * 4 + 94) .label(10, 5, getMetaFullName()); // ME Network status - builder.dynamicLabel(10, 15, () -> this.isOnline ? + builder.dynamicLabel(10, 15, () -> isOnline() ? I18n.format("gregtech.gui.me_network.online") : I18n.format("gregtech.gui.me_network.offline"), 0x404040); @@ -168,7 +168,7 @@ public void readFromNBT(NBTTagCompound data) { public void renderMetaTileEntity(CCRenderState renderState, Matrix4 translation, IVertexOperation[] pipeline) { super.renderMetaTileEntity(renderState, translation, pipeline); if (this.shouldRenderOverlay()) { - if (isOnline) { + if (isOnline()) { Textures.ME_OUTPUT_BUS_ACTIVE.renderSided(getFrontFacing(), renderState, translation, pipeline); } else { Textures.ME_OUTPUT_BUS.renderSided(getFrontFacing(), renderState, translation, pipeline); diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputHatch.java index cefe011f695..ecbf4bcc989 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputHatch.java @@ -102,7 +102,7 @@ protected ModularUI createUI(EntityPlayer entityPlayer) { .builder(GuiTextures.BACKGROUND, 176, 18 + 18 * 4 + 94) .label(10, 5, getMetaFullName()); // ME Network status - builder.dynamicLabel(10, 15, () -> this.isOnline ? + builder.dynamicLabel(10, 15, () -> isOnline() ? I18n.format("gregtech.gui.me_network.online") : I18n.format("gregtech.gui.me_network.offline"), 0x404040); @@ -170,7 +170,7 @@ public void readFromNBT(NBTTagCompound data) { public void renderMetaTileEntity(CCRenderState renderState, Matrix4 translation, IVertexOperation[] pipeline) { super.renderMetaTileEntity(renderState, translation, pipeline); if (this.shouldRenderOverlay()) { - if (isOnline) { + if (isOnline()) { Textures.ME_OUTPUT_HATCH_ACTIVE.renderSided(getFrontFacing(), renderState, translation, pipeline); } else { Textures.ME_OUTPUT_HATCH.renderSided(getFrontFacing(), renderState, translation, pipeline); diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java index 5233602bdca..81ab630e271 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java @@ -71,7 +71,7 @@ public void update() { } // Immediately clear cached items if the status changed, to prevent running recipes while offline - if (this.meStatusChanged && !this.isOnline) { + if (this.meStatusChanged && !isOnline()) { if (autoPull) { clearInventory(0); } else { diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java index eb67268d326..e7eb81859e3 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java @@ -71,7 +71,7 @@ public void update() { } // Immediately clear cached fluids if the status changed, to prevent running recipes while offline - if (this.meStatusChanged && !this.isOnline) { + if (this.meStatusChanged && !isOnline()) { if (autoPull) { this.getAEFluidHandler().clearConfig(); } else { diff --git a/src/main/java/gregtech/integration/hwyla/provider/AEMultiblockHatchProvider.java b/src/main/java/gregtech/integration/hwyla/provider/AEMultiblockHatchProvider.java index 299aee19b7d..2973ec740dc 100644 --- a/src/main/java/gregtech/integration/hwyla/provider/AEMultiblockHatchProvider.java +++ b/src/main/java/gregtech/integration/hwyla/provider/AEMultiblockHatchProvider.java @@ -36,7 +36,7 @@ public void register(@NotNull IWailaRegistrar registrar) { public @NotNull NBTTagCompound getNBTData(EntityPlayerMP player, TileEntity te, NBTTagCompound tag, World world, BlockPos pos) { if (te instanceof IGregTechTileEntity gtte && - gtte.getMetaTileEntity() instanceof MetaTileEntityAEHostableChannelPart aeHostablePart) { + gtte.getMetaTileEntity() instanceof MetaTileEntityAEHostableChannelPartaeHostablePart) { tag.setBoolean(NBT_KEY, aeHostablePart.isOnline()); } diff --git a/src/main/java/gregtech/integration/theoneprobe/provider/AEMultiblockHatchProvider.java b/src/main/java/gregtech/integration/theoneprobe/provider/AEMultiblockHatchProvider.java index 3eb8e1f5586..366ce60b448 100644 --- a/src/main/java/gregtech/integration/theoneprobe/provider/AEMultiblockHatchProvider.java +++ b/src/main/java/gregtech/integration/theoneprobe/provider/AEMultiblockHatchProvider.java @@ -24,7 +24,7 @@ public void addProbeInfo(ProbeMode probeMode, IProbeInfo probeInfo, EntityPlayer IBlockState blockState, IProbeHitData probeHitData) { if (blockState.getBlock().hasTileEntity(blockState) && world.getTileEntity(probeHitData.getPos()) instanceof IGregTechTileEntity gtte && - gtte.getMetaTileEntity() instanceof MetaTileEntityAEHostableChannelPart aeHostablePart) { + gtte.getMetaTileEntity() instanceof MetaTileEntityAEHostableChannelPartaeHostablePart) { if (aeHostablePart.isOnline()) { probeInfo.text("{*gregtech.gui.me_network.online*}"); } else { From 86431e72d84f69c5bad28ac765d811a50fd1edd6 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Sun, 18 May 2025 23:15:30 -0400 Subject: [PATCH 005/136] Fix TOP/WAILA providers --- .../java/gregtech/api/metatileentity/IAEStatusProvider.java | 6 ++++++ .../multiblockpart/appeng/MetaTileEntityAEHostablePart.java | 4 +++- .../hwyla/provider/AEMultiblockHatchProvider.java | 4 ++-- .../theoneprobe/provider/AEMultiblockHatchProvider.java | 4 ++-- 4 files changed, 13 insertions(+), 5 deletions(-) create mode 100644 src/main/java/gregtech/api/metatileentity/IAEStatusProvider.java diff --git a/src/main/java/gregtech/api/metatileentity/IAEStatusProvider.java b/src/main/java/gregtech/api/metatileentity/IAEStatusProvider.java new file mode 100644 index 00000000000..53e74056847 --- /dev/null +++ b/src/main/java/gregtech/api/metatileentity/IAEStatusProvider.java @@ -0,0 +1,6 @@ +package gregtech.api.metatileentity; + +public interface IAEStatusProvider { + + boolean isOnline(); +} diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostablePart.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostablePart.java index 247141f9dd5..7823bfe05aa 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostablePart.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostablePart.java @@ -1,5 +1,6 @@ package gregtech.common.metatileentities.multi.multiblockpart.appeng; +import gregtech.api.metatileentity.IAEStatusProvider; import gregtech.common.ConfigHolder; import gregtech.common.metatileentities.multi.multiblockpart.MetaTileEntityMultiblockNotifiablePart; @@ -29,7 +30,8 @@ import static gregtech.api.capability.GregtechDataCodes.UPDATE_ONLINE_STATUS; -public abstract class MetaTileEntityAEHostablePart extends MetaTileEntityMultiblockNotifiablePart { +public abstract class MetaTileEntityAEHostablePart extends MetaTileEntityMultiblockNotifiablePart implements + IAEStatusProvider { private AENetworkProxy aeProxy; private int meUpdateTick = 0; diff --git a/src/main/java/gregtech/integration/hwyla/provider/AEMultiblockHatchProvider.java b/src/main/java/gregtech/integration/hwyla/provider/AEMultiblockHatchProvider.java index 2973ec740dc..ae641c553e3 100644 --- a/src/main/java/gregtech/integration/hwyla/provider/AEMultiblockHatchProvider.java +++ b/src/main/java/gregtech/integration/hwyla/provider/AEMultiblockHatchProvider.java @@ -1,8 +1,8 @@ package gregtech.integration.hwyla.provider; import gregtech.api.GTValues; +import gregtech.api.metatileentity.IAEStatusProvider; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; -import gregtech.common.metatileentities.multi.multiblockpart.appeng.MetaTileEntityAEHostableChannelPart; import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.EntityPlayerMP; @@ -36,7 +36,7 @@ public void register(@NotNull IWailaRegistrar registrar) { public @NotNull NBTTagCompound getNBTData(EntityPlayerMP player, TileEntity te, NBTTagCompound tag, World world, BlockPos pos) { if (te instanceof IGregTechTileEntity gtte && - gtte.getMetaTileEntity() instanceof MetaTileEntityAEHostableChannelPartaeHostablePart) { + gtte.getMetaTileEntity() instanceof IAEStatusProvider aeHostablePart) { tag.setBoolean(NBT_KEY, aeHostablePart.isOnline()); } diff --git a/src/main/java/gregtech/integration/theoneprobe/provider/AEMultiblockHatchProvider.java b/src/main/java/gregtech/integration/theoneprobe/provider/AEMultiblockHatchProvider.java index 366ce60b448..1d432416941 100644 --- a/src/main/java/gregtech/integration/theoneprobe/provider/AEMultiblockHatchProvider.java +++ b/src/main/java/gregtech/integration/theoneprobe/provider/AEMultiblockHatchProvider.java @@ -1,7 +1,7 @@ package gregtech.integration.theoneprobe.provider; +import gregtech.api.metatileentity.IAEStatusProvider; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; -import gregtech.common.metatileentities.multi.multiblockpart.appeng.MetaTileEntityAEHostableChannelPart; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; @@ -24,7 +24,7 @@ public void addProbeInfo(ProbeMode probeMode, IProbeInfo probeInfo, EntityPlayer IBlockState blockState, IProbeHitData probeHitData) { if (blockState.getBlock().hasTileEntity(blockState) && world.getTileEntity(probeHitData.getPos()) instanceof IGregTechTileEntity gtte && - gtte.getMetaTileEntity() instanceof MetaTileEntityAEHostableChannelPartaeHostablePart) { + gtte.getMetaTileEntity() instanceof IAEStatusProvider aeHostablePart) { if (aeHostablePart.isOnline()) { probeInfo.text("{*gregtech.gui.me_network.online*}"); } else { From 673a81801d3b290547b1a86a455516d4848ab6e0 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Sun, 18 May 2025 23:33:21 -0400 Subject: [PATCH 006/136] Wrong super call from ctrl c+v :icant: --- .../appeng/MetaTileEntityAEHostablePart.java | 65 ++++++++++--------- 1 file changed, 35 insertions(+), 30 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostablePart.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostablePart.java index 7823bfe05aa..a22671dc036 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostablePart.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostablePart.java @@ -36,7 +36,7 @@ public abstract class MetaTileEntityAEHostablePart extends MetaTileEntityMultibl private AENetworkProxy aeProxy; private int meUpdateTick = 0; protected boolean isOnline; - protected boolean allowExtraConnections = false; + protected boolean allowsExtraConnections = false; protected boolean meStatusChanged = false; public MetaTileEntityAEHostablePart(ResourceLocation metaTileEntityId, int tier, boolean isExportHatch) { @@ -59,22 +59,27 @@ public int getMeUpdateTick() { return meUpdateTick; } + @Override + public boolean allowsExtraConnections() { + return allowsExtraConnections; + } + @Override public void writeInitialSyncData(PacketBuffer buf) { - super.receiveInitialSyncData(buf); + super.writeInitialSyncData(buf); - if (this.aeProxy != null) { + if (aeProxy != null) { buf.writeBoolean(true); NBTTagCompound proxy = new NBTTagCompound(); - this.aeProxy.writeToNBT(proxy); + aeProxy.writeToNBT(proxy); buf.writeCompoundTag(proxy); } else { buf.writeBoolean(false); } - buf.writeInt(this.meUpdateTick); - buf.writeBoolean(this.isOnline); - buf.writeBoolean(this.allowExtraConnections); + buf.writeInt(meUpdateTick); + buf.writeBoolean(isOnline); + buf.writeBoolean(allowsExtraConnections); } @Override @@ -89,14 +94,14 @@ public void receiveInitialSyncData(PacketBuffer buf) { nbtTagCompound = null; } - if (this.aeProxy != null && nbtTagCompound != null) { - this.aeProxy.readFromNBT(nbtTagCompound); + if (aeProxy != null && nbtTagCompound != null) { + aeProxy.readFromNBT(nbtTagCompound); } } - this.meUpdateTick = buf.readInt(); - this.isOnline = buf.readBoolean(); - this.allowExtraConnections = buf.readBoolean(); + meUpdateTick = buf.readInt(); + isOnline = buf.readBoolean(); + allowsExtraConnections = buf.readBoolean(); } @Override @@ -114,30 +119,30 @@ public void receiveCustomData(int dataId, PacketBuffer buf) { @NotNull @Override public AECableType getCableConnectionType(@NotNull AEPartLocation part) { - if (part.getFacing() != this.frontFacing && !this.allowExtraConnections) { + if (part.getFacing() != frontFacing && !allowsExtraConnections) { return AECableType.NONE; } return AECableType.SMART; } public EnumSet getConnectableSides() { - return this.allowExtraConnections ? EnumSet.allOf(EnumFacing.class) : EnumSet.of(getFrontFacing()); + return allowsExtraConnections ? EnumSet.allOf(EnumFacing.class) : EnumSet.of(getFrontFacing()); } public void updateConnectableSides() { - if (this.aeProxy != null) { - this.aeProxy.setValidSides(getConnectableSides()); + if (aeProxy != null) { + aeProxy.setValidSides(getConnectableSides()); } } @Override public boolean onWireCutterClick(EntityPlayer playerIn, EnumHand hand, EnumFacing facing, CuboidRayTraceResult hitResult) { - this.allowExtraConnections = !this.allowExtraConnections; + allowsExtraConnections = !allowsExtraConnections; updateConnectableSides(); if (!getWorld().isRemote) { - playerIn.sendStatusMessage(new TextComponentTranslation(this.allowExtraConnections ? + playerIn.sendStatusMessage(new TextComponentTranslation(allowsExtraConnections ? "gregtech.machine.me.extra_connections.enabled" : "gregtech.machine.me.extra_connections.disabled"), true); } @@ -153,8 +158,8 @@ public void setFrontFacing(EnumFacing frontFacing) { @Nullable private AENetworkProxy createProxy() { - if (this.getHolder() instanceof IGridProxyable holder) { - AENetworkProxy proxy = new AENetworkProxy(holder, "mte_proxy", this.getStackForm(), true); + if (getHolder() instanceof IGridProxyable holder) { + AENetworkProxy proxy = new AENetworkProxy(holder, "mte_proxy", getStackForm(), true); proxy.setFlags(GridFlags.REQUIRE_CHANNEL); proxy.setIdlePowerUsage(ConfigHolder.compat.ae2.meHatchEnergyUsage); proxy.setValidSides(getConnectableSides()); @@ -166,13 +171,13 @@ private AENetworkProxy createProxy() { @Nullable @Override public AENetworkProxy getProxy() { - if (this.aeProxy == null) { - return this.aeProxy = this.createProxy(); + if (aeProxy == null) { + return aeProxy = createProxy(); } - if (!this.aeProxy.isReady() && this.getWorld() != null) { - this.aeProxy.onReady(); + if (!aeProxy.isReady() && getWorld() != null) { + aeProxy.onReady(); } - return this.aeProxy; + return aeProxy; } protected IActionSource getActionSource() { @@ -196,24 +201,24 @@ public boolean updateMEStatus() { if (this.isOnline != isOnline) { writeCustomData(UPDATE_ONLINE_STATUS, buf -> buf.writeBoolean(isOnline)); this.isOnline = isOnline; - this.meStatusChanged = true; + meStatusChanged = true; } else { - this.meStatusChanged = false; + meStatusChanged = false; } } - return this.isOnline; + return isOnline; } @Override public NBTTagCompound writeToNBT(NBTTagCompound data) { super.writeToNBT(data); - data.setBoolean("AllowExtraConnections", this.allowExtraConnections); + data.setBoolean("AllowExtraConnections", allowsExtraConnections); return data; } @Override public void readFromNBT(NBTTagCompound data) { super.readFromNBT(data); - this.allowExtraConnections = data.getBoolean("AllowExtraConnections"); + allowsExtraConnections = data.getBoolean("AllowExtraConnections"); } } From 292edfe3f9a6ff0469ce85dde1564315a01e2449 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Sun, 18 May 2025 23:33:52 -0400 Subject: [PATCH 007/136] Add if the part can connect from all sides to TOP/WAILA --- .../api/metatileentity/IAEStatusProvider.java | 2 ++ .../provider/AEMultiblockHatchProvider.java | 18 +++++++++++++----- .../provider/AEMultiblockHatchProvider.java | 8 ++++++-- 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/IAEStatusProvider.java b/src/main/java/gregtech/api/metatileentity/IAEStatusProvider.java index 53e74056847..82a725d27d5 100644 --- a/src/main/java/gregtech/api/metatileentity/IAEStatusProvider.java +++ b/src/main/java/gregtech/api/metatileentity/IAEStatusProvider.java @@ -3,4 +3,6 @@ public interface IAEStatusProvider { boolean isOnline(); + + boolean allowsExtraConnections(); } diff --git a/src/main/java/gregtech/integration/hwyla/provider/AEMultiblockHatchProvider.java b/src/main/java/gregtech/integration/hwyla/provider/AEMultiblockHatchProvider.java index ae641c553e3..cca2d8c8068 100644 --- a/src/main/java/gregtech/integration/hwyla/provider/AEMultiblockHatchProvider.java +++ b/src/main/java/gregtech/integration/hwyla/provider/AEMultiblockHatchProvider.java @@ -22,7 +22,8 @@ public class AEMultiblockHatchProvider implements IWailaDataProvider { - private static final String NBT_KEY = "ae_part_online"; + private static final String NBT_ONLINE = "ae_part_online"; + private static final String NBT_EXTRA_CONNECTIONS = "ae_extra_connections"; public static final AEMultiblockHatchProvider INSTANCE = new AEMultiblockHatchProvider(); @@ -36,8 +37,9 @@ public void register(@NotNull IWailaRegistrar registrar) { public @NotNull NBTTagCompound getNBTData(EntityPlayerMP player, TileEntity te, NBTTagCompound tag, World world, BlockPos pos) { if (te instanceof IGregTechTileEntity gtte && - gtte.getMetaTileEntity() instanceof IAEStatusProvider aeHostablePart) { - tag.setBoolean(NBT_KEY, aeHostablePart.isOnline()); + gtte.getMetaTileEntity() instanceof IAEStatusProvider aeStatusProvider) { + tag.setBoolean(NBT_ONLINE, aeStatusProvider.isOnline()); + tag.setBoolean(NBT_EXTRA_CONNECTIONS, aeStatusProvider.allowsExtraConnections()); } return tag; @@ -46,14 +48,20 @@ public void register(@NotNull IWailaRegistrar registrar) { @Override public @NotNull List getWailaBody(ItemStack itemStack, List tooltip, IWailaDataAccessor accessor, IWailaConfigHandler config) { - if (accessor.getNBTData().hasKey(NBT_KEY)) { - if (accessor.getNBTData().getBoolean(NBT_KEY)) { + if (accessor.getNBTData().hasKey(NBT_ONLINE)) { + if (accessor.getNBTData().getBoolean(NBT_ONLINE)) { tooltip.add(I18n.format("gregtech.gui.me_network.online")); } else { tooltip.add(I18n.format("gregtech.gui.me_network.offline")); } } + if (accessor.getNBTData().hasKey(NBT_EXTRA_CONNECTIONS)) { + if (accessor.getNBTData().getBoolean(NBT_EXTRA_CONNECTIONS)) { + tooltip.add(I18n.format("gregtech.machine.me.extra_connections.enabled")); + } + } + return tooltip; } } diff --git a/src/main/java/gregtech/integration/theoneprobe/provider/AEMultiblockHatchProvider.java b/src/main/java/gregtech/integration/theoneprobe/provider/AEMultiblockHatchProvider.java index 1d432416941..a48ae706595 100644 --- a/src/main/java/gregtech/integration/theoneprobe/provider/AEMultiblockHatchProvider.java +++ b/src/main/java/gregtech/integration/theoneprobe/provider/AEMultiblockHatchProvider.java @@ -24,12 +24,16 @@ public void addProbeInfo(ProbeMode probeMode, IProbeInfo probeInfo, EntityPlayer IBlockState blockState, IProbeHitData probeHitData) { if (blockState.getBlock().hasTileEntity(blockState) && world.getTileEntity(probeHitData.getPos()) instanceof IGregTechTileEntity gtte && - gtte.getMetaTileEntity() instanceof IAEStatusProvider aeHostablePart) { - if (aeHostablePart.isOnline()) { + gtte.getMetaTileEntity() instanceof IAEStatusProvider aeStatusProvider) { + if (aeStatusProvider.isOnline()) { probeInfo.text("{*gregtech.gui.me_network.online*}"); } else { probeInfo.text("{*gregtech.gui.me_network.offline*}"); } + + if (aeStatusProvider.allowsExtraConnections()) { + probeInfo.text("{*gregtech.machine.me.extra_connections.enabled*}"); + } } } } From 29b36618fafb67b0f819a186d879144846f0b037 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Mon, 19 May 2025 21:12:46 -0400 Subject: [PATCH 008/136] Start on config and display widget --- .../java/gregtech/api/mui/GTGuiTextures.java | 9 +++++ .../api/mui/widget/appeng/AEConfigSlot.java | 34 +++++++++++++++++++ .../api/mui/widget/appeng/AEDisplaySlot.java | 17 ++++++++++ .../mui/widget/appeng/AEItemConfigSlot.java | 12 +++++++ .../mui/widget/appeng/AEItemDisplaySlot.java | 12 +++++++ .../appeng/MetaTileEntityMEInputBus.java | 22 +++++++++++- 6 files changed, 105 insertions(+), 1 deletion(-) create mode 100644 src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java create mode 100644 src/main/java/gregtech/api/mui/widget/appeng/AEDisplaySlot.java create mode 100644 src/main/java/gregtech/api/mui/widget/appeng/AEItemConfigSlot.java create mode 100644 src/main/java/gregtech/api/mui/widget/appeng/AEItemDisplaySlot.java diff --git a/src/main/java/gregtech/api/mui/GTGuiTextures.java b/src/main/java/gregtech/api/mui/GTGuiTextures.java index 1fea174eb4c..e4227acf93b 100644 --- a/src/main/java/gregtech/api/mui/GTGuiTextures.java +++ b/src/main/java/gregtech/api/mui/GTGuiTextures.java @@ -28,6 +28,7 @@ public static class IDs { public static final String PRIMITIVE_BACKGROUND = "gregtech_primitive_bg"; public static final String STANDARD_SLOT = "gregtech_standard_slot"; + public static final String DARK_SLOT = "gregtech_dark_slot"; public static final String BRONZE_SLOT = "gregtech_bronze_slot"; public static final String STEEL_SLOT = "gregtech_steel_slot"; public static final String PRIMITIVE_SLOT = "gregtech_primitive_slot"; @@ -126,6 +127,14 @@ public static class IDs { .canApplyTheme() .build(); + public static final UITexture SLOT_DARK = new UITexture.Builder() + .location(GTValues.MODID, "textures/gui/base/slot_dark.png") + .imageSize(18, 18) + .adaptable(1) + .name(IDs.DARK_SLOT) + .canApplyTheme() + .build(); + public static final UITexture SLOT_BRONZE = new UITexture.Builder() .location(GTValues.MODID, "textures/gui/base/slot_bronze.png") .imageSize(18, 18) diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java new file mode 100644 index 00000000000..8221aa14270 --- /dev/null +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java @@ -0,0 +1,34 @@ +package gregtech.api.mui.widget.appeng; + +import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.IConfigurableSlot; + +import appeng.api.storage.data.IAEStack; +import com.cleanroommc.modularui.screen.RichTooltip; +import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; +import com.cleanroommc.modularui.widget.Widget; +import org.jetbrains.annotations.Nullable; + +public class AEConfigSlot> extends Widget> { + + private final IConfigurableSlot config; + private IConfigurableSlot cached; + private final boolean isStocking; + + public AEConfigSlot(IConfigurableSlot config, boolean isStocking) { + super(); + this.config = config; + this.isStocking = isStocking; + } + + @Override + public @Nullable RichTooltip getTooltip() { + if (config.getConfig() == null) { + + } + } + + @Override + public void drawForeground(ModularGuiContext context) { + super.drawForeground(context); + } +} diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEDisplaySlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEDisplaySlot.java new file mode 100644 index 00000000000..b20434cb9a0 --- /dev/null +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEDisplaySlot.java @@ -0,0 +1,17 @@ +package gregtech.api.mui.widget.appeng; + +import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.IConfigurableSlot; + +import appeng.api.storage.data.IAEStack; +import com.cleanroommc.modularui.widget.Widget; + +public class AEDisplaySlot> extends Widget> { + + private final IConfigurableSlot config; + private IConfigurableSlot cached; + + public AEDisplaySlot(IConfigurableSlot config) { + super(); + this.config = config; + } +} diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEItemConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEItemConfigSlot.java new file mode 100644 index 00000000000..0943e709cc2 --- /dev/null +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEItemConfigSlot.java @@ -0,0 +1,12 @@ +package gregtech.api.mui.widget.appeng; + +import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEItemList; + +import appeng.api.storage.data.IAEItemStack; + +public class AEItemConfigSlot extends AEConfigSlot { + + public AEItemConfigSlot(ExportOnlyAEItemList itemList, int index) { + super(itemList.getInventory()[index], itemList.isStocking()); + } +} diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEItemDisplaySlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEItemDisplaySlot.java new file mode 100644 index 00000000000..0fa71b85f21 --- /dev/null +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEItemDisplaySlot.java @@ -0,0 +1,12 @@ +package gregtech.api.mui.widget.appeng; + +import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEItemList; + +import appeng.api.storage.data.IAEItemStack; + +public class AEItemDisplaySlot extends AEDisplaySlot { + + public AEItemDisplaySlot(ExportOnlyAEItemList itemList, int index) { + super(itemList.getInventory()[index]); + } +} diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java index e40e22ccb7b..0c0c0fe5910 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java @@ -19,6 +19,9 @@ import gregtech.api.metatileentity.multiblock.MultiblockControllerBase; import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuis; +import gregtech.api.mui.widget.GhostCircuitSlotWidget; +import gregtech.api.mui.widget.appeng.AEItemConfigSlot; +import gregtech.api.mui.widget.appeng.AEItemDisplaySlot; import gregtech.api.util.GTUtility; import gregtech.client.renderer.texture.Textures; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEItemList; @@ -55,6 +58,7 @@ import com.cleanroommc.modularui.widgets.ItemSlot; import com.cleanroommc.modularui.widgets.SlotGroupWidget; import com.cleanroommc.modularui.widgets.layout.Flow; +import com.cleanroommc.modularui.widgets.layout.Grid; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -203,11 +207,27 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) .child(SlotGroupWidget.playerInventory().left(7).bottom(7)) .child(IKey.dynamic(() -> isOnline() ? I18n.format("gregtech.gui.me_network.online") : I18n.format("gregtech.gui.me_network.offline")).asWidget().pos(5, 15)) + .child(new Grid() + .pos(7, 25) + .size(18 * 4, 18 * 4) + .minElementMargin(0, 0) + .minColWidth(18) + .minRowHeight(18) + .matrix(Grid.mapToMatrix(4, 16, index -> new AEItemConfigSlot(getAEItemHandler(), index) + .background(GTGuiTextures.SLOT, GTGuiTextures.CONFIG_ARROW_DARK)))) + .child(new Grid() + .pos(7 + 18 * 5, 25) + .size(18 * 4, 18 * 4) + .minElementMargin(0, 0) + .minColWidth(18) + .minRowHeight(18) + .matrix(Grid.mapToMatrix(4, 16, index -> new AEItemDisplaySlot(getAEItemHandler(), index) + .background(GTGuiTextures.SLOT_DARK)))) .child(Flow.column() .pos(7 + 18 * 4, 25 + 18) .size(18, 18 * 4) .child(GTGuiTextures.ARROW_DOUBLE.asWidget()) - .child(new gregtech.api.mui.widget.GhostCircuitSlotWidget() + .child(new GhostCircuitSlotWidget() .slot(SyncHandlers.itemSlot(circuitInventory, 0)) .background(GTGuiTextures.SLOT, GTGuiTextures.INT_CIRCUIT_OVERLAY)) .child(new ItemSlot() From 89d276a25d48e6cb7cb0ae140801a7309801be8a Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Mon, 19 May 2025 21:15:38 -0400 Subject: [PATCH 009/136] Sprinkle in some nullables --- .../multiblockpart/appeng/MetaTileEntityMEStockingBus.java | 3 ++- .../appeng/MetaTileEntityMEStockingHatch.java | 3 ++- .../multiblockpart/appeng/slot/ExportOnlyAEFluidSlot.java | 3 ++- .../multiblockpart/appeng/slot/ExportOnlyAEItemSlot.java | 2 +- .../multi/multiblockpart/appeng/slot/ExportOnlyAESlot.java | 4 ++-- .../multi/multiblockpart/appeng/slot/IConfigurableSlot.java | 6 ++++++ 6 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java index 81ab630e271..70505b23699 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java @@ -11,6 +11,7 @@ import gregtech.api.metatileentity.multiblock.RecipeMapMultiblockController; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEItemList; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEItemSlot; +import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.IConfigurableSlot; import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedItemStack; import net.minecraft.client.resources.I18n; @@ -321,7 +322,7 @@ public ExportOnlyAEStockingItemSlot(MetaTileEntityMEStockingBus holder) { } @Override - public ExportOnlyAEStockingItemSlot copy() { + public @NotNull IConfigurableSlot copy() { return new ExportOnlyAEStockingItemSlot( this.config == null ? null : this.config.copy(), this.stock == null ? null : this.stock.copy(), diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java index e7eb81859e3..e2b00d6f5e4 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java @@ -10,6 +10,7 @@ import gregtech.api.metatileentity.multiblock.MultiblockControllerBase; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEFluidList; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEFluidSlot; +import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.IConfigurableSlot; import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedFluidStack; import net.minecraft.client.resources.I18n; @@ -324,7 +325,7 @@ protected MetaTileEntityMEStockingHatch getHolder() { } @Override - public ExportOnlyAEFluidSlot copy() { + public @NotNull IConfigurableSlot copy() { return new ExportOnlyAEStockingFluidSlot( this.getHolder(), this.config == null ? null : this.config.copy(), diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEFluidSlot.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEFluidSlot.java index 73ad45f9ac4..7bb9ed67057 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEFluidSlot.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEFluidSlot.java @@ -13,6 +13,7 @@ import net.minecraftforge.fluids.capability.IFluidTankProperties; import appeng.api.storage.data.IAEFluidStack; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; @@ -178,7 +179,7 @@ protected void trigger() { } @Override - public ExportOnlyAEFluidSlot copy() { + public @NotNull IConfigurableSlot copy() { return new ExportOnlyAEFluidSlot( this.holder, this.config == null ? null : this.config.copy(), diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEItemSlot.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEItemSlot.java index 1408d77ad49..61ac0dc42e0 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEItemSlot.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEItemSlot.java @@ -38,7 +38,7 @@ public void deserializeNBT(NBTTagCompound nbt) { } @Override - public ExportOnlyAEItemSlot copy() { + public @NotNull IConfigurableSlot copy() { return new ExportOnlyAEItemSlot( this.config == null ? null : this.config.copy(), this.stock == null ? null : this.stock.copy()); diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAESlot.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAESlot.java index 316a76e422b..114ae38fbb4 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAESlot.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAESlot.java @@ -80,12 +80,12 @@ public NBTTagCompound serializeNBT() { } @Override - public T getConfig() { + public @Nullable T getConfig() { return this.config; } @Override - public T getStock() { + public @Nullable T getStock() { return this.stock; } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/IConfigurableSlot.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/IConfigurableSlot.java index 9e4532c8f19..a58657dc914 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/IConfigurableSlot.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/IConfigurableSlot.java @@ -1,14 +1,20 @@ package gregtech.common.metatileentities.multi.multiblockpart.appeng.slot; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + public interface IConfigurableSlot { + @Nullable T getConfig(); + @Nullable T getStock(); void setConfig(T val); void setStock(T val); + @NotNull IConfigurableSlot copy(); } From 0d624229d31f64f92c3c974c495b37b562455aa9 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Mon, 19 May 2025 21:53:24 -0400 Subject: [PATCH 010/136] Item slot jei dragging (ish, just logging for now :troll:) --- .../api/mui/widget/appeng/AEConfigSlot.java | 29 +++++++++------- .../mui/widget/appeng/AEItemConfigSlot.java | 33 ++++++++++++++++++- 2 files changed, 50 insertions(+), 12 deletions(-) diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java index 8221aa14270..2b6aff09f63 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java @@ -3,32 +3,39 @@ import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.IConfigurableSlot; import appeng.api.storage.data.IAEStack; +import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.screen.RichTooltip; -import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; import com.cleanroommc.modularui.widget.Widget; import org.jetbrains.annotations.Nullable; public class AEConfigSlot> extends Widget> { - private final IConfigurableSlot config; + protected final IConfigurableSlot backingSlot; private IConfigurableSlot cached; - private final boolean isStocking; + protected final boolean isStocking; - public AEConfigSlot(IConfigurableSlot config, boolean isStocking) { - super(); - this.config = config; + public AEConfigSlot(IConfigurableSlot backingSlot, boolean isStocking) { + this.backingSlot = backingSlot; this.isStocking = isStocking; } @Override public @Nullable RichTooltip getTooltip() { - if (config.getConfig() == null) { + if (backingSlot.getConfig() != null) { + return null; + } + + RichTooltip tooltip = new RichTooltip(this); + tooltip.addLine(IKey.lang("gregtech.gui.config_slot")); + if (isStocking) { + tooltip.addLine(IKey.lang("gregtech.gui.config_slot.set_only")); + } else { + tooltip.addLine(IKey.lang("gregtech.gui.config_slot.set")); + tooltip.addLine(IKey.lang("gregtech.gui.config_slot.scroll")); } - } + tooltip.addLine(IKey.lang("gregtech.gui.config_slot.remove")); - @Override - public void drawForeground(ModularGuiContext context) { - super.drawForeground(context); + return tooltip; } } diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEItemConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEItemConfigSlot.java index 0943e709cc2..bd52f613a9a 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEItemConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEItemConfigSlot.java @@ -1,12 +1,43 @@ package gregtech.api.mui.widget.appeng; +import gregtech.api.util.GTLog; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEItemList; +import net.minecraft.item.ItemStack; + import appeng.api.storage.data.IAEItemStack; +import com.cleanroommc.modularui.api.widget.Interactable; +import com.cleanroommc.modularui.integration.jei.JeiGhostIngredientSlot; +import com.cleanroommc.modularui.integration.jei.JeiIngredientProvider; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; -public class AEItemConfigSlot extends AEConfigSlot { +public class AEItemConfigSlot extends AEConfigSlot implements Interactable, + JeiGhostIngredientSlot, + JeiIngredientProvider { public AEItemConfigSlot(ExportOnlyAEItemList itemList, int index) { super(itemList.getInventory()[index], itemList.isStocking()); } + + @Override + public void onInit() { + size(18, 18); + getContext().getJeiSettings().addJeiGhostIngredientSlot(this); + } + + @Override + public void setGhostIngredient(@NotNull ItemStack ingredient) { + GTLog.logger.info(ingredient); + } + + @Override + public @Nullable ItemStack castGhostIngredientIfValid(@NotNull Object ingredient) { + return ingredient instanceof ItemStack stack ? stack : null; + } + + @Override + public @Nullable Object getIngredient() { + return backingSlot.getConfig(); + } } From bc1ccf11168ec169f28095fb8d811f4d57277a70 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Mon, 19 May 2025 22:02:05 -0400 Subject: [PATCH 011/136] Use the probably more proper tooltip making method --- .../api/mui/widget/appeng/AEConfigSlot.java | 14 +++++--------- .../api/mui/widget/appeng/AEItemConfigSlot.java | 1 + 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java index 2b6aff09f63..550a16296b7 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java @@ -6,7 +6,7 @@ import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.screen.RichTooltip; import com.cleanroommc.modularui.widget.Widget; -import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.NotNull; public class AEConfigSlot> extends Widget> { @@ -20,13 +20,11 @@ public AEConfigSlot(IConfigurableSlot backingSlot, boolean isStocking) { } @Override - public @Nullable RichTooltip getTooltip() { - if (backingSlot.getConfig() != null) { - return null; - } - - RichTooltip tooltip = new RichTooltip(this); + public void onInit() { + tooltipBuilder(this::getSlotTooltip); + } + protected void getSlotTooltip(@NotNull RichTooltip tooltip) { tooltip.addLine(IKey.lang("gregtech.gui.config_slot")); if (isStocking) { tooltip.addLine(IKey.lang("gregtech.gui.config_slot.set_only")); @@ -35,7 +33,5 @@ public AEConfigSlot(IConfigurableSlot backingSlot, boolean isStocking) { tooltip.addLine(IKey.lang("gregtech.gui.config_slot.scroll")); } tooltip.addLine(IKey.lang("gregtech.gui.config_slot.remove")); - - return tooltip; } } diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEItemConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEItemConfigSlot.java index bd52f613a9a..ea8d3142312 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEItemConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEItemConfigSlot.java @@ -22,6 +22,7 @@ public AEItemConfigSlot(ExportOnlyAEItemList itemList, int index) { @Override public void onInit() { + super.onInit(); size(18, 18); getContext().getJeiSettings().addJeiGhostIngredientSlot(this); } From 2a9d4baa04a155f3404402786cec959a4b400daf Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Tue, 20 May 2025 00:18:04 -0400 Subject: [PATCH 012/136] This doesn't need to be dynamic --- src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java index 550a16296b7..f9f42492e3b 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java @@ -21,7 +21,7 @@ public AEConfigSlot(IConfigurableSlot backingSlot, boolean isStocking) { @Override public void onInit() { - tooltipBuilder(this::getSlotTooltip); + tooltip(this::getSlotTooltip); } protected void getSlotTooltip(@NotNull RichTooltip tooltip) { From 1027d09e8ece12c7edaa28a12f85431d6f323dea Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Tue, 20 May 2025 01:36:43 -0400 Subject: [PATCH 013/136] JEI dropping works (no item rendering yet) --- .../api/mui/widget/appeng/AEConfigSlot.java | 5 +- .../api/mui/widget/appeng/AEDisplaySlot.java | 2 +- .../mui/widget/appeng/AEItemConfigSlot.java | 61 ++++++++++++++++++- 3 files changed, 62 insertions(+), 6 deletions(-) diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java index f9f42492e3b..4857c8ce34e 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java @@ -8,12 +8,13 @@ import com.cleanroommc.modularui.widget.Widget; import org.jetbrains.annotations.NotNull; -public class AEConfigSlot> extends Widget> { +public abstract class AEConfigSlot> extends Widget> { protected final IConfigurableSlot backingSlot; - private IConfigurableSlot cached; protected final boolean isStocking; + protected static final int jeiDropSyncID = 1; + public AEConfigSlot(IConfigurableSlot backingSlot, boolean isStocking) { this.backingSlot = backingSlot; this.isStocking = isStocking; diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEDisplaySlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEDisplaySlot.java index b20434cb9a0..1963399b40f 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEDisplaySlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEDisplaySlot.java @@ -5,7 +5,7 @@ import appeng.api.storage.data.IAEStack; import com.cleanroommc.modularui.widget.Widget; -public class AEDisplaySlot> extends Widget> { +public abstract class AEDisplaySlot> extends Widget> { private final IConfigurableSlot config; private IConfigurableSlot cached; diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEItemConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEItemConfigSlot.java index ea8d3142312..8d2e529cfd2 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEItemConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEItemConfigSlot.java @@ -1,35 +1,67 @@ package gregtech.api.mui.widget.appeng; -import gregtech.api.util.GTLog; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEItemList; +import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.IConfigurableSlot; +import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedItemStack; +import net.minecraft.client.renderer.GlStateManager; import net.minecraft.item.ItemStack; +import net.minecraft.network.PacketBuffer; +import net.minecraftforge.fml.common.network.ByteBufUtils; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import appeng.api.storage.data.IAEItemStack; import com.cleanroommc.modularui.api.widget.Interactable; import com.cleanroommc.modularui.integration.jei.JeiGhostIngredientSlot; import com.cleanroommc.modularui.integration.jei.JeiIngredientProvider; +import com.cleanroommc.modularui.integration.jei.ModularUIJeiPlugin; +import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; +import com.cleanroommc.modularui.theme.WidgetTheme; +import com.cleanroommc.modularui.value.sync.SyncHandler; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.io.IOException; + public class AEItemConfigSlot extends AEConfigSlot implements Interactable, JeiGhostIngredientSlot, JeiIngredientProvider { public AEItemConfigSlot(ExportOnlyAEItemList itemList, int index) { super(itemList.getInventory()[index], itemList.isStocking()); + setSyncHandler(new AEItemConfigSyncHandler(backingSlot)); + size(18, 18); } @Override public void onInit() { super.onInit(); - size(18, 18); getContext().getJeiSettings().addJeiGhostIngredientSlot(this); } + @Override + public @NotNull AEItemConfigSyncHandler getSyncHandler() { + return (AEItemConfigSyncHandler) super.getSyncHandler(); + } + + @Override + public boolean isValidSyncHandler(SyncHandler syncHandler) { + return syncHandler instanceof AEItemConfigSyncHandler; + } + + @Override + public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { + if (ModularUIJeiPlugin.hasDraggingGhostIngredient() || ModularUIJeiPlugin.hoveringOverIngredient(this)) { + GlStateManager.colorMask(true, true, true, false); + drawHighlight(getArea(), isHovering()); + GlStateManager.colorMask(true, true, true, true); + } + } + @Override public void setGhostIngredient(@NotNull ItemStack ingredient) { - GTLog.logger.info(ingredient); + getSyncHandler().sendJEIDrop(ingredient); } @Override @@ -41,4 +73,27 @@ public void setGhostIngredient(@NotNull ItemStack ingredient) { public @Nullable Object getIngredient() { return backingSlot.getConfig(); } + + public static class AEItemConfigSyncHandler extends SyncHandler { + + private final IConfigurableSlot config; + + public AEItemConfigSyncHandler(IConfigurableSlot config) { + this.config = config; + } + + public void sendJEIDrop(ItemStack stack) { + syncToServer(jeiDropSyncID, buf -> ByteBufUtils.writeTag(buf, stack.serializeNBT())); + } + + @Override + public void readOnClient(int id, PacketBuffer buf) throws IOException {} + + @Override + public void readOnServer(int id, PacketBuffer buf) throws IOException { + if (id == jeiDropSyncID) { + config.setConfig(WrappedItemStack.fromPacket(buf)); + } + } + } } From 05e49ecdfd25f9cdfcc756049da42bada7f0e02d Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Tue, 20 May 2025 12:03:58 -0400 Subject: [PATCH 014/136] Chat we're rending items now :caught: --- .../api/mui/widget/appeng/AEConfigSlot.java | 46 +++++++++++++++++- .../mui/widget/appeng/AEItemConfigSlot.java | 48 ++++++++++++++----- .../gregtech/client/utils/RenderUtil.java | 19 ++++++++ .../appeng/slot/ExportOnlyAESlot.java | 4 +- 4 files changed, 103 insertions(+), 14 deletions(-) diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java index 4857c8ce34e..31c2ed43277 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java @@ -5,16 +5,16 @@ import appeng.api.storage.data.IAEStack; import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.screen.RichTooltip; +import com.cleanroommc.modularui.value.sync.SyncHandler; import com.cleanroommc.modularui.widget.Widget; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; public abstract class AEConfigSlot> extends Widget> { protected final IConfigurableSlot backingSlot; protected final boolean isStocking; - protected static final int jeiDropSyncID = 1; - public AEConfigSlot(IConfigurableSlot backingSlot, boolean isStocking) { this.backingSlot = backingSlot; this.isStocking = isStocking; @@ -35,4 +35,46 @@ protected void getSlotTooltip(@NotNull RichTooltip tooltip) { } tooltip.addLine(IKey.lang("gregtech.gui.config_slot.remove")); } + + protected abstract static class AEConfigSyncHandler> extends SyncHandler { + + public static final int jeiDropSyncID = 0; + public static final int configSyncID = 1; + + protected final IConfigurableSlot config; + @Nullable + protected T cache; + + public AEConfigSyncHandler(IConfigurableSlot config) { + this.config = config; + } + + @Override + public void detectAndSendChanges(boolean init) { + T newConfig = config.getConfig(); + if (!areAEStackCountEquals(newConfig, cache)) { + cache = newConfig == null ? null : newConfig.copy(); + syncToClient(configSyncID, buf -> { + if (newConfig == null) { + buf.writeBoolean(false); + } else { + buf.writeBoolean(true); + newConfig.writeToPacket(buf); + } + }); + } + } + + public final boolean areAEStackCountEquals(T stack1, T stack2) { + if (stack2 == stack1) { + return true; + } + + if (stack1 != null && stack2 != null) { + return stack1.getStackSize() == stack2.getStackSize() && stack1.equals(stack2); + } + + return false; + } + } } diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEItemConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEItemConfigSlot.java index 8d2e529cfd2..b2ae189943b 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEItemConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEItemConfigSlot.java @@ -1,5 +1,7 @@ package gregtech.api.mui.widget.appeng; +import gregtech.api.util.TextFormattingUtil; +import gregtech.client.utils.RenderUtil; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEItemList; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.IConfigurableSlot; import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedItemStack; @@ -8,8 +10,6 @@ import net.minecraft.item.ItemStack; import net.minecraft.network.PacketBuffer; import net.minecraftforge.fml.common.network.ByteBufUtils; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; import appeng.api.storage.data.IAEItemStack; import com.cleanroommc.modularui.api.widget.Interactable; @@ -52,6 +52,21 @@ public boolean isValidSyncHandler(SyncHandler syncHandler) { @Override public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { + IAEItemStack config = backingSlot.getConfig(); + if (config != null) { + ItemStack stack = config.createItemStack(); + if (!stack.isEmpty()) { + stack.setCount(1); + RenderUtil.renderItem(stack, 1, 1, 16f, 16f); + } + + if (!isStocking) { + String amount = TextFormattingUtil.formatLongToCompactString(config.getStackSize(), 4); + RenderUtil.renderTextFixedCorner(amount, 17d, 18d, 0xFFFFFF, true, 0.5f); + } + } + + // replace with RenderUtil.handleJeiGhostHighlight(this); when 2812 merges (thx ghz) if (ModularUIJeiPlugin.hasDraggingGhostIngredient() || ModularUIJeiPlugin.hoveringOverIngredient(this)) { GlStateManager.colorMask(true, true, true, false); drawHighlight(getArea(), isHovering()); @@ -59,6 +74,11 @@ public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { } } + @Override + public @NotNull Result onMousePressed(int mouseButton) { + return Result.ACCEPT; + } + @Override public void setGhostIngredient(@NotNull ItemStack ingredient) { getSyncHandler().sendJEIDrop(ingredient); @@ -74,20 +94,22 @@ public void setGhostIngredient(@NotNull ItemStack ingredient) { return backingSlot.getConfig(); } - public static class AEItemConfigSyncHandler extends SyncHandler { - - private final IConfigurableSlot config; + public static class AEItemConfigSyncHandler extends AEConfigSyncHandler { public AEItemConfigSyncHandler(IConfigurableSlot config) { - this.config = config; - } - - public void sendJEIDrop(ItemStack stack) { - syncToServer(jeiDropSyncID, buf -> ByteBufUtils.writeTag(buf, stack.serializeNBT())); + super(config); } @Override - public void readOnClient(int id, PacketBuffer buf) throws IOException {} + public void readOnClient(int id, PacketBuffer buf) throws IOException { + if (id == configSyncID) { + if (buf.readBoolean()) { + config.setConfig(WrappedItemStack.fromPacket(buf)); + } else { + config.setConfig(null); + } + } + } @Override public void readOnServer(int id, PacketBuffer buf) throws IOException { @@ -95,5 +117,9 @@ public void readOnServer(int id, PacketBuffer buf) throws IOException { config.setConfig(WrappedItemStack.fromPacket(buf)); } } + + public void sendJEIDrop(ItemStack stack) { + syncToServer(jeiDropSyncID, buf -> ByteBufUtils.writeTag(buf, stack.serializeNBT())); + } } } diff --git a/src/main/java/gregtech/client/utils/RenderUtil.java b/src/main/java/gregtech/client/utils/RenderUtil.java index 7228bd8212e..43cc6a58b34 100644 --- a/src/main/java/gregtech/client/utils/RenderUtil.java +++ b/src/main/java/gregtech/client/utils/RenderUtil.java @@ -374,6 +374,25 @@ public static void renderText(float x, float y, float z, float scale, int color, GlStateManager.popMatrix(); } + public static void renderTextSized(String text, double x, double y, int color, boolean dropShadow, float scale, + boolean center) { + GlStateManager.pushMatrix(); + FontRenderer fontRenderer = Minecraft.getMinecraft().fontRenderer; + double scaledTextWidth = center ? fontRenderer.getStringWidth(text) * scale : 0.0; + GlStateManager.translate(x - scaledTextWidth / 2.0, y, 0.0f); + GlStateManager.scale(scale, scale, scale); + fontRenderer.drawString(text, 0, 0, color, dropShadow); + GlStateManager.popMatrix(); + } + + public static void renderTextFixedCorner(String text, double x, double y, int color, boolean dropShadow, + float scale) { + FontRenderer fontRenderer = Minecraft.getMinecraft().fontRenderer; + double scaledWidth = fontRenderer.getStringWidth(text) * scale; + double scaledHeight = fontRenderer.FONT_HEIGHT * scale; + renderTextSized(text, x - scaledWidth, y - scaledHeight, color, dropShadow, scale, false); + } + public static void renderItemOverLay(float x, float y, float z, float scale, ItemStack itemStack) { net.minecraft.client.renderer.RenderHelper.enableStandardItemLighting(); GlStateManager.pushMatrix(); diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAESlot.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAESlot.java index 114ae38fbb4..63dae7d9db3 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAESlot.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAESlot.java @@ -11,10 +11,12 @@ public abstract class ExportOnlyAESlot> protected final static String CONFIG_TAG = "config"; protected final static String STOCK_TAG = "stock"; + @Nullable protected T config; + @Nullable protected T stock; - public ExportOnlyAESlot(T config, T stock) { + public ExportOnlyAESlot(@Nullable T config, @Nullable T stock) { this.config = config; this.stock = stock; } From b38b8a6068a98d523cdc11d5af02cf0b31ba0da1 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Tue, 20 May 2025 15:40:37 -0400 Subject: [PATCH 015/136] Item tooltips (not dynamic oops) --- .../api/mui/widget/appeng/AEConfigSlot.java | 10 +++++++--- .../api/mui/widget/appeng/AEItemConfigSlot.java | 14 +++++++++++++- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java index 31c2ed43277..7e0ad441519 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java @@ -22,10 +22,10 @@ public AEConfigSlot(IConfigurableSlot backingSlot, boolean isStocking) { @Override public void onInit() { - tooltip(this::getSlotTooltip); + tooltipBuilder(this::buildTooltip); } - protected void getSlotTooltip(@NotNull RichTooltip tooltip) { + protected void buildTooltip(@NotNull RichTooltip tooltip) { tooltip.addLine(IKey.lang("gregtech.gui.config_slot")); if (isStocking) { tooltip.addLine(IKey.lang("gregtech.gui.config_slot.set_only")); @@ -36,7 +36,7 @@ protected void getSlotTooltip(@NotNull RichTooltip tooltip) { tooltip.addLine(IKey.lang("gregtech.gui.config_slot.remove")); } - protected abstract static class AEConfigSyncHandler> extends SyncHandler { + protected abstract class AEConfigSyncHandler> extends SyncHandler { public static final int jeiDropSyncID = 0; public static final int configSyncID = 1; @@ -76,5 +76,9 @@ public final boolean areAEStackCountEquals(T stack1, T stack2) { return false; } + + protected void setConfig(T config) { + + } } } diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEItemConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEItemConfigSlot.java index b2ae189943b..0119d865ef9 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEItemConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEItemConfigSlot.java @@ -1,5 +1,7 @@ package gregtech.api.mui.widget.appeng; +import com.cleanroommc.modularui.screen.RichTooltip; + import gregtech.api.util.TextFormattingUtil; import gregtech.client.utils.RenderUtil; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEItemList; @@ -40,6 +42,16 @@ public void onInit() { getContext().getJeiSettings().addJeiGhostIngredientSlot(this); } + @Override + protected void buildTooltip(@NotNull RichTooltip tooltip) { + IAEItemStack stack = backingSlot.getConfig(); + if (stack == null) { + super.buildTooltip(tooltip); + } else { + tooltip.addFromItem(stack.createItemStack()); + } + } + @Override public @NotNull AEItemConfigSyncHandler getSyncHandler() { return (AEItemConfigSyncHandler) super.getSyncHandler(); @@ -94,7 +106,7 @@ public void setGhostIngredient(@NotNull ItemStack ingredient) { return backingSlot.getConfig(); } - public static class AEItemConfigSyncHandler extends AEConfigSyncHandler { + public class AEItemConfigSyncHandler extends AEConfigSyncHandler { public AEItemConfigSyncHandler(IConfigurableSlot config) { super(config); From 2c3b55fb2bb531275716ae070b4dcc56ef4488a1 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Tue, 20 May 2025 17:09:51 -0400 Subject: [PATCH 016/136] Extract the sync handler out pt1 --- .../api/mui/sync/AEItemSyncHandler.java | 41 +++++++++++++ .../gregtech/api/mui/sync/AESyncHandler.java | 58 +++++++++++++++++++ .../api/mui/widget/appeng/AEConfigSlot.java | 54 +---------------- .../api/mui/widget/appeng/AEDisplaySlot.java | 8 +-- .../mui/widget/appeng/AEItemConfigSlot.java | 58 ++++--------------- .../mui/widget/appeng/AEItemDisplaySlot.java | 6 +- .../appeng/MetaTileEntityMEInputBus.java | 17 ++++-- .../appeng/slot/IConfigurableSlot.java | 3 +- 8 files changed, 129 insertions(+), 116 deletions(-) create mode 100644 src/main/java/gregtech/api/mui/sync/AEItemSyncHandler.java create mode 100644 src/main/java/gregtech/api/mui/sync/AESyncHandler.java diff --git a/src/main/java/gregtech/api/mui/sync/AEItemSyncHandler.java b/src/main/java/gregtech/api/mui/sync/AEItemSyncHandler.java new file mode 100644 index 00000000000..a1bba03b491 --- /dev/null +++ b/src/main/java/gregtech/api/mui/sync/AEItemSyncHandler.java @@ -0,0 +1,41 @@ +package gregtech.api.mui.sync; + +import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.IConfigurableSlot; +import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedItemStack; + +import net.minecraft.item.ItemStack; +import net.minecraft.network.PacketBuffer; +import net.minecraftforge.fml.common.network.ByteBufUtils; + +import appeng.api.storage.data.IAEItemStack; + +import java.io.IOException; + +public class AEItemSyncHandler extends AESyncHandler { + + public AEItemSyncHandler(IConfigurableSlot config) { + super(config); + } + + @Override + public void readOnClient(int id, PacketBuffer buf) throws IOException { + if (id == configSyncID) { + if (buf.readBoolean()) { + config.setConfig(WrappedItemStack.fromPacket(buf)); + } else { + config.setConfig(null); + } + } + } + + @Override + public void readOnServer(int id, PacketBuffer buf) throws IOException { + if (id == jeiDropSyncID) { + config.setConfig(WrappedItemStack.fromPacket(buf)); + } + } + + public void sendJEIDrop(ItemStack stack) { + syncToServer(jeiDropSyncID, buf -> ByteBufUtils.writeTag(buf, stack.serializeNBT())); + } +} diff --git a/src/main/java/gregtech/api/mui/sync/AESyncHandler.java b/src/main/java/gregtech/api/mui/sync/AESyncHandler.java new file mode 100644 index 00000000000..65210294026 --- /dev/null +++ b/src/main/java/gregtech/api/mui/sync/AESyncHandler.java @@ -0,0 +1,58 @@ +package gregtech.api.mui.sync; + +import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.IConfigurableSlot; + +import appeng.api.storage.data.IAEStack; +import com.cleanroommc.modularui.value.sync.SyncHandler; +import org.jetbrains.annotations.Nullable; + +public abstract class AESyncHandler> extends SyncHandler { + + public static final int jeiDropSyncID = 0; + public static final int configSyncID = 1; + + protected final IConfigurableSlot config; + protected IConfigurableSlot cache; + + public AESyncHandler(IConfigurableSlot config) { + this.config = config; + } + + @Override + public void detectAndSendChanges(boolean init) { + T currentConfig = config.getConfig(); + T currentStock = config.getStock(); + T cachedConfig = cache.getConfig(); + T cachedStock = cache.getStock(); + + if (!areAEStackCountEquals(currentConfig, cachedConfig) || !areAEStackCountEquals(currentStock, cachedStock)) { + syncToClient(configSyncID, buf -> { + if (currentConfig == null) { + + } + }); + } + } + + @Nullable + public T getConfig() { + return config.getConfig(); + } + + @Nullable + public T getStock() { + return config.getStock(); + } + + public final boolean areAEStackCountEquals(T stack1, T stack2) { + if (stack2 == stack1) { + return true; + } + + if (stack1 != null && stack2 != null) { + return stack1.getStackSize() == stack2.getStackSize() && stack1.equals(stack2); + } + + return false; + } +} diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java index 7e0ad441519..b32bb2e9044 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java @@ -1,22 +1,16 @@ package gregtech.api.mui.widget.appeng; -import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.IConfigurableSlot; - import appeng.api.storage.data.IAEStack; import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.screen.RichTooltip; -import com.cleanroommc.modularui.value.sync.SyncHandler; import com.cleanroommc.modularui.widget.Widget; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; public abstract class AEConfigSlot> extends Widget> { - protected final IConfigurableSlot backingSlot; protected final boolean isStocking; - public AEConfigSlot(IConfigurableSlot backingSlot, boolean isStocking) { - this.backingSlot = backingSlot; + public AEConfigSlot(boolean isStocking) { this.isStocking = isStocking; } @@ -35,50 +29,4 @@ protected void buildTooltip(@NotNull RichTooltip tooltip) { } tooltip.addLine(IKey.lang("gregtech.gui.config_slot.remove")); } - - protected abstract class AEConfigSyncHandler> extends SyncHandler { - - public static final int jeiDropSyncID = 0; - public static final int configSyncID = 1; - - protected final IConfigurableSlot config; - @Nullable - protected T cache; - - public AEConfigSyncHandler(IConfigurableSlot config) { - this.config = config; - } - - @Override - public void detectAndSendChanges(boolean init) { - T newConfig = config.getConfig(); - if (!areAEStackCountEquals(newConfig, cache)) { - cache = newConfig == null ? null : newConfig.copy(); - syncToClient(configSyncID, buf -> { - if (newConfig == null) { - buf.writeBoolean(false); - } else { - buf.writeBoolean(true); - newConfig.writeToPacket(buf); - } - }); - } - } - - public final boolean areAEStackCountEquals(T stack1, T stack2) { - if (stack2 == stack1) { - return true; - } - - if (stack1 != null && stack2 != null) { - return stack1.getStackSize() == stack2.getStackSize() && stack1.equals(stack2); - } - - return false; - } - - protected void setConfig(T config) { - - } - } } diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEDisplaySlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEDisplaySlot.java index 1963399b40f..a409636b570 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEDisplaySlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEDisplaySlot.java @@ -1,17 +1,11 @@ package gregtech.api.mui.widget.appeng; -import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.IConfigurableSlot; - import appeng.api.storage.data.IAEStack; import com.cleanroommc.modularui.widget.Widget; public abstract class AEDisplaySlot> extends Widget> { - private final IConfigurableSlot config; - private IConfigurableSlot cached; - - public AEDisplaySlot(IConfigurableSlot config) { + public AEDisplaySlot() { super(); - this.config = config; } } diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEItemConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEItemConfigSlot.java index 0119d865ef9..9547921da3c 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEItemConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEItemConfigSlot.java @@ -1,38 +1,30 @@ package gregtech.api.mui.widget.appeng; -import com.cleanroommc.modularui.screen.RichTooltip; - +import gregtech.api.mui.sync.AEItemSyncHandler; import gregtech.api.util.TextFormattingUtil; import gregtech.client.utils.RenderUtil; -import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEItemList; -import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.IConfigurableSlot; -import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedItemStack; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.item.ItemStack; -import net.minecraft.network.PacketBuffer; -import net.minecraftforge.fml.common.network.ByteBufUtils; import appeng.api.storage.data.IAEItemStack; import com.cleanroommc.modularui.api.widget.Interactable; import com.cleanroommc.modularui.integration.jei.JeiGhostIngredientSlot; import com.cleanroommc.modularui.integration.jei.JeiIngredientProvider; import com.cleanroommc.modularui.integration.jei.ModularUIJeiPlugin; +import com.cleanroommc.modularui.screen.RichTooltip; import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; import com.cleanroommc.modularui.theme.WidgetTheme; import com.cleanroommc.modularui.value.sync.SyncHandler; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.io.IOException; - public class AEItemConfigSlot extends AEConfigSlot implements Interactable, JeiGhostIngredientSlot, JeiIngredientProvider { - public AEItemConfigSlot(ExportOnlyAEItemList itemList, int index) { - super(itemList.getInventory()[index], itemList.isStocking()); - setSyncHandler(new AEItemConfigSyncHandler(backingSlot)); + public AEItemConfigSlot(boolean isStocking) { + super(isStocking); size(18, 18); } @@ -44,7 +36,7 @@ public void onInit() { @Override protected void buildTooltip(@NotNull RichTooltip tooltip) { - IAEItemStack stack = backingSlot.getConfig(); + IAEItemStack stack = getSyncHandler().getConfig(); if (stack == null) { super.buildTooltip(tooltip); } else { @@ -53,18 +45,18 @@ protected void buildTooltip(@NotNull RichTooltip tooltip) { } @Override - public @NotNull AEItemConfigSyncHandler getSyncHandler() { - return (AEItemConfigSyncHandler) super.getSyncHandler(); + public @NotNull AEItemSyncHandler getSyncHandler() { + return (AEItemSyncHandler) super.getSyncHandler(); } @Override public boolean isValidSyncHandler(SyncHandler syncHandler) { - return syncHandler instanceof AEItemConfigSyncHandler; + return syncHandler instanceof AEItemSyncHandler; } @Override public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { - IAEItemStack config = backingSlot.getConfig(); + IAEItemStack config = getSyncHandler().getConfig(); if (config != null) { ItemStack stack = config.createItemStack(); if (!stack.isEmpty()) { @@ -103,35 +95,7 @@ public void setGhostIngredient(@NotNull ItemStack ingredient) { @Override public @Nullable Object getIngredient() { - return backingSlot.getConfig(); - } - - public class AEItemConfigSyncHandler extends AEConfigSyncHandler { - - public AEItemConfigSyncHandler(IConfigurableSlot config) { - super(config); - } - - @Override - public void readOnClient(int id, PacketBuffer buf) throws IOException { - if (id == configSyncID) { - if (buf.readBoolean()) { - config.setConfig(WrappedItemStack.fromPacket(buf)); - } else { - config.setConfig(null); - } - } - } - - @Override - public void readOnServer(int id, PacketBuffer buf) throws IOException { - if (id == jeiDropSyncID) { - config.setConfig(WrappedItemStack.fromPacket(buf)); - } - } - - public void sendJEIDrop(ItemStack stack) { - syncToServer(jeiDropSyncID, buf -> ByteBufUtils.writeTag(buf, stack.serializeNBT())); - } + IAEItemStack stack = getSyncHandler().getConfig(); + return stack == null ? null : stack.createItemStack(); } } diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEItemDisplaySlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEItemDisplaySlot.java index 0fa71b85f21..39e2162b6a9 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEItemDisplaySlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEItemDisplaySlot.java @@ -1,12 +1,10 @@ package gregtech.api.mui.widget.appeng; -import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEItemList; - import appeng.api.storage.data.IAEItemStack; public class AEItemDisplaySlot extends AEDisplaySlot { - public AEItemDisplaySlot(ExportOnlyAEItemList itemList, int index) { - super(itemList.getInventory()[index]); + public AEItemDisplaySlot() { + super(); } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java index 0c0c0fe5910..0351b141058 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java @@ -19,6 +19,7 @@ import gregtech.api.metatileentity.multiblock.MultiblockControllerBase; import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuis; +import gregtech.api.mui.sync.AEItemSyncHandler; import gregtech.api.mui.widget.GhostCircuitSlotWidget; import gregtech.api.mui.widget.appeng.AEItemConfigSlot; import gregtech.api.mui.widget.appeng.AEItemDisplaySlot; @@ -200,7 +201,13 @@ public boolean usesMui2() { @Override public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) { + final String syncHandlerName = "aeSlot"; + final boolean isStocking = getAEItemHandler().isStocking(); guiSyncManager.registerSlotGroup("extra_slot", 1); + for (int index = 0; index < CONFIG_SIZE; index++) { + guiSyncManager.syncValue(syncHandlerName, index, + new AEItemSyncHandler(getAEItemHandler().getInventory()[index])); + } return GTGuis.createPanel(this, 176, 18 + 18 * 4 + 94) .child(IKey.lang(getMetaFullName()).asWidget().pos(5, 5)) @@ -213,16 +220,18 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) .minElementMargin(0, 0) .minColWidth(18) .minRowHeight(18) - .matrix(Grid.mapToMatrix(4, 16, index -> new AEItemConfigSlot(getAEItemHandler(), index) - .background(GTGuiTextures.SLOT, GTGuiTextures.CONFIG_ARROW_DARK)))) + .matrix(Grid.mapToMatrix(4, 16, index -> new AEItemConfigSlot(isStocking) + .background(GTGuiTextures.SLOT, GTGuiTextures.CONFIG_ARROW_DARK) + .syncHandler(syncHandlerName, index)))) .child(new Grid() .pos(7 + 18 * 5, 25) .size(18 * 4, 18 * 4) .minElementMargin(0, 0) .minColWidth(18) .minRowHeight(18) - .matrix(Grid.mapToMatrix(4, 16, index -> new AEItemDisplaySlot(getAEItemHandler(), index) - .background(GTGuiTextures.SLOT_DARK)))) + .matrix(Grid.mapToMatrix(4, 16, index -> new AEItemDisplaySlot() + .background(GTGuiTextures.SLOT_DARK) + .syncHandler(syncHandlerName, index)))) .child(Flow.column() .pos(7 + 18 * 4, 25 + 18) .size(18, 18 * 4) diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/IConfigurableSlot.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/IConfigurableSlot.java index a58657dc914..114138c3cbd 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/IConfigurableSlot.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/IConfigurableSlot.java @@ -1,9 +1,10 @@ package gregtech.common.metatileentities.multi.multiblockpart.appeng.slot; +import appeng.api.storage.data.IAEStack; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -public interface IConfigurableSlot { +public interface IConfigurableSlot> { @Nullable T getConfig(); From 501314b8aa9d8eba5852203b3427980523fdce7c Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Tue, 20 May 2025 18:31:11 -0400 Subject: [PATCH 017/136] Sync work pt2 --- .../sync/{ => appeng}/AEItemSyncHandler.java | 10 +++- .../mui/sync/{ => appeng}/AESyncHandler.java | 26 +++++++++- .../api/mui/widget/appeng/AEConfigSlot.java | 19 ++++++- .../api/mui/widget/appeng/AEDisplaySlot.java | 22 +++++++- .../mui/widget/appeng/AEItemConfigSlot.java | 16 +++--- .../mui/widget/appeng/AEItemDisplaySlot.java | 52 +++++++++++++++++++ .../appeng/MetaTileEntityMEInputBus.java | 9 ++-- .../appeng/slot/ExportOnlyAESlot.java | 4 +- 8 files changed, 139 insertions(+), 19 deletions(-) rename src/main/java/gregtech/api/mui/sync/{ => appeng}/AEItemSyncHandler.java (77%) rename src/main/java/gregtech/api/mui/sync/{ => appeng}/AESyncHandler.java (65%) diff --git a/src/main/java/gregtech/api/mui/sync/AEItemSyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java similarity index 77% rename from src/main/java/gregtech/api/mui/sync/AEItemSyncHandler.java rename to src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java index a1bba03b491..3881059b426 100644 --- a/src/main/java/gregtech/api/mui/sync/AEItemSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java @@ -1,5 +1,6 @@ -package gregtech.api.mui.sync; +package gregtech.api.mui.sync.appeng; +import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEItemSlot; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.IConfigurableSlot; import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedItemStack; @@ -15,6 +16,7 @@ public class AEItemSyncHandler extends AESyncHandler { public AEItemSyncHandler(IConfigurableSlot config) { super(config); + cache = new ExportOnlyAEItemSlot(); } @Override @@ -25,6 +27,12 @@ public void readOnClient(int id, PacketBuffer buf) throws IOException { } else { config.setConfig(null); } + + if (buf.readBoolean()) { + config.setStock(WrappedItemStack.fromPacket(buf)); + } else { + config.setStock(null); + } } } diff --git a/src/main/java/gregtech/api/mui/sync/AESyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java similarity index 65% rename from src/main/java/gregtech/api/mui/sync/AESyncHandler.java rename to src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java index 65210294026..41c5cb37bce 100644 --- a/src/main/java/gregtech/api/mui/sync/AESyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java @@ -1,4 +1,4 @@ -package gregtech.api.mui.sync; +package gregtech.api.mui.sync.appeng; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.IConfigurableSlot; @@ -14,6 +14,11 @@ public abstract class AESyncHandler> extends SyncHandler { protected final IConfigurableSlot config; protected IConfigurableSlot cache; + @Nullable + private Runnable onConfigChanged; + @Nullable + private Runnable onStockChanged; + public AESyncHandler(IConfigurableSlot config) { this.config = config; } @@ -28,7 +33,17 @@ public void detectAndSendChanges(boolean init) { if (!areAEStackCountEquals(currentConfig, cachedConfig) || !areAEStackCountEquals(currentStock, cachedStock)) { syncToClient(configSyncID, buf -> { if (currentConfig == null) { + buf.writeBoolean(false); + } else { + buf.writeBoolean(true); + currentConfig.writeToPacket(buf); + } + if (currentStock == null) { + buf.writeBoolean(false); + } else { + buf.writeBoolean(true); + currentStock.writeToPacket(buf); } }); } @@ -44,6 +59,15 @@ public T getStock() { return config.getStock(); } + public void setOnConfigChanged(@Nullable Runnable onConfigChanged) { + this.onConfigChanged = onConfigChanged; + } + + public void setOnStockChanged(@Nullable Runnable onStockChanged) { + this.onStockChanged = onStockChanged; + } + + @SuppressWarnings("BooleanMethodIsAlwaysInverted") public final boolean areAEStackCountEquals(T stack1, T stack2) { if (stack2 == stack1) { return true; diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java index b32bb2e9044..1325e16a300 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java @@ -1,17 +1,26 @@ package gregtech.api.mui.widget.appeng; +import gregtech.api.mui.sync.appeng.AESyncHandler; + import appeng.api.storage.data.IAEStack; import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.integration.jei.JeiIngredientProvider; import com.cleanroommc.modularui.screen.RichTooltip; +import com.cleanroommc.modularui.value.sync.ModularSyncManager; import com.cleanroommc.modularui.widget.Widget; import org.jetbrains.annotations.NotNull; -public abstract class AEConfigSlot> extends Widget> { +import java.util.function.BooleanSupplier; + +public abstract class AEConfigSlot> extends Widget> + implements JeiIngredientProvider { protected final boolean isStocking; + protected final BooleanSupplier isAutoPull; - public AEConfigSlot(boolean isStocking) { + public AEConfigSlot(boolean isStocking, BooleanSupplier isAutoPull) { this.isStocking = isStocking; + this.isAutoPull = isAutoPull; } @Override @@ -19,6 +28,12 @@ public void onInit() { tooltipBuilder(this::buildTooltip); } + @Override + public void initialiseSyncHandler(ModularSyncManager syncManager) { + super.initialiseSyncHandler(syncManager); + ((AESyncHandler) getSyncHandler()).setOnConfigChanged(this::markTooltipDirty); + } + protected void buildTooltip(@NotNull RichTooltip tooltip) { tooltip.addLine(IKey.lang("gregtech.gui.config_slot")); if (isStocking) { diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEDisplaySlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEDisplaySlot.java index a409636b570..b4e1cde0e94 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEDisplaySlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEDisplaySlot.java @@ -1,11 +1,31 @@ package gregtech.api.mui.widget.appeng; +import gregtech.api.mui.sync.appeng.AESyncHandler; + import appeng.api.storage.data.IAEStack; +import com.cleanroommc.modularui.integration.jei.JeiIngredientProvider; +import com.cleanroommc.modularui.screen.RichTooltip; +import com.cleanroommc.modularui.value.sync.ModularSyncManager; import com.cleanroommc.modularui.widget.Widget; +import org.jetbrains.annotations.NotNull; -public abstract class AEDisplaySlot> extends Widget> { +public abstract class AEDisplaySlot> extends Widget> + implements JeiIngredientProvider { public AEDisplaySlot() { super(); } + + @Override + public void onInit() { + tooltipBuilder(this::buildTooltip); + } + + @Override + public void initialiseSyncHandler(ModularSyncManager syncManager) { + super.initialiseSyncHandler(syncManager); + ((AESyncHandler) getSyncHandler()).setOnConfigChanged(this::markTooltipDirty); + } + + protected void buildTooltip(@NotNull RichTooltip tooltip) {} } diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEItemConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEItemConfigSlot.java index 9547921da3c..b9777481d39 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEItemConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEItemConfigSlot.java @@ -1,6 +1,6 @@ package gregtech.api.mui.widget.appeng; -import gregtech.api.mui.sync.AEItemSyncHandler; +import gregtech.api.mui.sync.appeng.AEItemSyncHandler; import gregtech.api.util.TextFormattingUtil; import gregtech.client.utils.RenderUtil; @@ -10,7 +10,6 @@ import appeng.api.storage.data.IAEItemStack; import com.cleanroommc.modularui.api.widget.Interactable; import com.cleanroommc.modularui.integration.jei.JeiGhostIngredientSlot; -import com.cleanroommc.modularui.integration.jei.JeiIngredientProvider; import com.cleanroommc.modularui.integration.jei.ModularUIJeiPlugin; import com.cleanroommc.modularui.screen.RichTooltip; import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; @@ -19,12 +18,13 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.function.BooleanSupplier; + public class AEItemConfigSlot extends AEConfigSlot implements Interactable, - JeiGhostIngredientSlot, - JeiIngredientProvider { + JeiGhostIngredientSlot { - public AEItemConfigSlot(boolean isStocking) { - super(isStocking); + public AEItemConfigSlot(boolean isStocking, BooleanSupplier isAutoPull) { + super(isStocking, isAutoPull); size(18, 18); } @@ -95,7 +95,7 @@ public void setGhostIngredient(@NotNull ItemStack ingredient) { @Override public @Nullable Object getIngredient() { - IAEItemStack stack = getSyncHandler().getConfig(); - return stack == null ? null : stack.createItemStack(); + IAEItemStack config = getSyncHandler().getConfig(); + return config == null ? null : config.createItemStack(); } } diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEItemDisplaySlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEItemDisplaySlot.java index 39e2162b6a9..f543ecdead4 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEItemDisplaySlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEItemDisplaySlot.java @@ -1,10 +1,62 @@ package gregtech.api.mui.widget.appeng; +import gregtech.api.mui.sync.appeng.AEItemSyncHandler; +import gregtech.api.util.TextFormattingUtil; +import gregtech.client.utils.RenderUtil; + +import net.minecraft.item.ItemStack; + import appeng.api.storage.data.IAEItemStack; +import com.cleanroommc.modularui.screen.RichTooltip; +import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; +import com.cleanroommc.modularui.theme.WidgetTheme; +import com.cleanroommc.modularui.value.sync.SyncHandler; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; public class AEItemDisplaySlot extends AEDisplaySlot { public AEItemDisplaySlot() { super(); + size(18, 18); + } + + @Override + protected void buildTooltip(@NotNull RichTooltip tooltip) { + IAEItemStack stack = getSyncHandler().getStock(); + if (stack != null) { + tooltip.addFromItem(stack.createItemStack()); + } + } + + @Override + public @NotNull AEItemSyncHandler getSyncHandler() { + return (AEItemSyncHandler) super.getSyncHandler(); + } + + @Override + public boolean isValidSyncHandler(SyncHandler syncHandler) { + return syncHandler instanceof AEItemSyncHandler; + } + + @Override + public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { + IAEItemStack stock = getSyncHandler().getStock(); + if (stock != null) { + ItemStack stack = stock.createItemStack(); + if (!stack.isEmpty()) { + stack.setCount(1); + RenderUtil.renderItem(stack, 1, 1, 16f, 16f); + } + + String amount = TextFormattingUtil.formatLongToCompactString(stock.getStackSize(), 4); + RenderUtil.renderTextFixedCorner(amount, 17d, 18d, 0xFFFFFF, true, 0.5f); + } + } + + @Override + public @Nullable Object getIngredient() { + IAEItemStack stock = getSyncHandler().getStock(); + return stock == null ? null : stock.createItemStack(); } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java index 0351b141058..cdeeda7769c 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java @@ -19,7 +19,7 @@ import gregtech.api.metatileentity.multiblock.MultiblockControllerBase; import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuis; -import gregtech.api.mui.sync.AEItemSyncHandler; +import gregtech.api.mui.sync.appeng.AEItemSyncHandler; import gregtech.api.mui.widget.GhostCircuitSlotWidget; import gregtech.api.mui.widget.appeng.AEItemConfigSlot; import gregtech.api.mui.widget.appeng.AEItemDisplaySlot; @@ -220,9 +220,10 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) .minElementMargin(0, 0) .minColWidth(18) .minRowHeight(18) - .matrix(Grid.mapToMatrix(4, 16, index -> new AEItemConfigSlot(isStocking) - .background(GTGuiTextures.SLOT, GTGuiTextures.CONFIG_ARROW_DARK) - .syncHandler(syncHandlerName, index)))) + .matrix(Grid.mapToMatrix(4, 16, + index -> new AEItemConfigSlot(isStocking, () -> getAEItemHandler().isAutoPull()) + .background(GTGuiTextures.SLOT, GTGuiTextures.CONFIG_ARROW_DARK) + .syncHandler(syncHandlerName, index)))) .child(new Grid() .pos(7 + 18 * 5, 25) .size(18 * 4, 18 * 4) diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAESlot.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAESlot.java index 63dae7d9db3..236152a69bc 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAESlot.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAESlot.java @@ -92,12 +92,12 @@ public NBTTagCompound serializeNBT() { } @Override - public void setConfig(T val) { + public void setConfig(@Nullable T val) { this.config = val; } @Override - public void setStock(T val) { + public void setStock(@Nullable T val) { this.stock = val; } } From 009447e71535ab2d5476f7071492ce4086e631fb Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Tue, 20 May 2025 19:08:44 -0400 Subject: [PATCH 018/136] Sync work pt3 and tooltips that actually work --- .../mui/sync/appeng/AEItemSyncHandler.java | 8 +++++ .../api/mui/sync/appeng/AESyncHandler.java | 35 ++++++++++++++++--- .../api/mui/widget/appeng/AEConfigSlot.java | 6 +++- .../api/mui/widget/appeng/AEDisplaySlot.java | 6 +++- .../mui/widget/appeng/AEItemConfigSlot.java | 1 + .../mui/widget/appeng/AEItemDisplaySlot.java | 1 + 6 files changed, 50 insertions(+), 7 deletions(-) diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java index 3881059b426..14399556df2 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java @@ -22,11 +22,19 @@ public AEItemSyncHandler(IConfigurableSlot config) { @Override public void readOnClient(int id, PacketBuffer buf) throws IOException { if (id == configSyncID) { + if (onConfigChanged != null) { + onConfigChanged.run(); + } + if (buf.readBoolean()) { config.setConfig(WrappedItemStack.fromPacket(buf)); } else { config.setConfig(null); } + } else if (id == stockSyncID) { + if (onStockChanged != null) { + onStockChanged.run(); + } if (buf.readBoolean()) { config.setStock(WrappedItemStack.fromPacket(buf)); diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java index 41c5cb37bce..00782eec3f4 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java @@ -10,27 +10,32 @@ public abstract class AESyncHandler> extends SyncHandler { public static final int jeiDropSyncID = 0; public static final int configSyncID = 1; + public static final int stockSyncID = 2; protected final IConfigurableSlot config; protected IConfigurableSlot cache; @Nullable - private Runnable onConfigChanged; + protected Runnable onConfigChanged; @Nullable - private Runnable onStockChanged; + protected Runnable onStockChanged; public AESyncHandler(IConfigurableSlot config) { this.config = config; } + @SuppressWarnings("DuplicatedCode") @Override public void detectAndSendChanges(boolean init) { T currentConfig = config.getConfig(); - T currentStock = config.getStock(); T cachedConfig = cache.getConfig(); - T cachedStock = cache.getStock(); + if (!areAEStackCountEquals(currentConfig, cachedConfig)) { + cache.setConfig(currentConfig); + + if (onConfigChanged != null) { + onConfigChanged.run(); + } - if (!areAEStackCountEquals(currentConfig, cachedConfig) || !areAEStackCountEquals(currentStock, cachedStock)) { syncToClient(configSyncID, buf -> { if (currentConfig == null) { buf.writeBoolean(false); @@ -38,7 +43,19 @@ public void detectAndSendChanges(boolean init) { buf.writeBoolean(true); currentConfig.writeToPacket(buf); } + }); + } + T currentStock = config.getStock(); + T cachedStock = cache.getStock(); + if (!areAEStackCountEquals(currentStock, cachedStock)) { + cache.setStock(currentStock); + + if (onStockChanged != null) { + onStockChanged.run(); + } + + syncToClient(stockSyncID, buf -> { if (currentStock == null) { buf.writeBoolean(false); } else { @@ -67,6 +84,14 @@ public void setOnStockChanged(@Nullable Runnable onStockChanged) { this.onStockChanged = onStockChanged; } + public @Nullable Runnable getOnConfigChanged() { + return onConfigChanged; + } + + public @Nullable Runnable getOnStockChanged() { + return onStockChanged; + } + @SuppressWarnings("BooleanMethodIsAlwaysInverted") public final boolean areAEStackCountEquals(T stack1, T stack2) { if (stack2 == stack1) { diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java index 1325e16a300..ef7591d8f75 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java @@ -31,7 +31,11 @@ public void onInit() { @Override public void initialiseSyncHandler(ModularSyncManager syncManager) { super.initialiseSyncHandler(syncManager); - ((AESyncHandler) getSyncHandler()).setOnConfigChanged(this::markTooltipDirty); + if (getSyncHandler() instanceof AESyncHandleraeSyncHandler) { + aeSyncHandler.setOnConfigChanged(this::markTooltipDirty); + } else { + throw new IllegalStateException("Sync handler for AEConfigSlot is not a AESyncHandler!"); + } } protected void buildTooltip(@NotNull RichTooltip tooltip) { diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEDisplaySlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEDisplaySlot.java index b4e1cde0e94..e5aad3421b4 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEDisplaySlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEDisplaySlot.java @@ -24,7 +24,11 @@ public void onInit() { @Override public void initialiseSyncHandler(ModularSyncManager syncManager) { super.initialiseSyncHandler(syncManager); - ((AESyncHandler) getSyncHandler()).setOnConfigChanged(this::markTooltipDirty); + if (getSyncHandler() instanceof AESyncHandleraeSyncHandler) { + aeSyncHandler.setOnConfigChanged(this::markTooltipDirty); + } else { + throw new IllegalStateException("Sync handler for AEDisplaySlot is not a AESyncHandler!"); + } } protected void buildTooltip(@NotNull RichTooltip tooltip) {} diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEItemConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEItemConfigSlot.java index b9777481d39..58c50ef9568 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEItemConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEItemConfigSlot.java @@ -26,6 +26,7 @@ public class AEItemConfigSlot extends AEConfigSlot implements Inte public AEItemConfigSlot(boolean isStocking, BooleanSupplier isAutoPull) { super(isStocking, isAutoPull); size(18, 18); + tooltipAutoUpdate(true); } @Override diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEItemDisplaySlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEItemDisplaySlot.java index f543ecdead4..2d66bcff421 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEItemDisplaySlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEItemDisplaySlot.java @@ -19,6 +19,7 @@ public class AEItemDisplaySlot extends AEDisplaySlot { public AEItemDisplaySlot() { super(); size(18, 18); + tooltipAutoUpdate(true); } @Override From ba1c854d560585e881519e5b77d4ccc7b7575922 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Tue, 20 May 2025 20:54:27 -0400 Subject: [PATCH 019/136] Remove redundant code, remove MUI0 code from ME Input Buses, and implement actual item setting and clearing. --- .../mui/sync/appeng/AEItemSyncHandler.java | 7 +++-- .../api/mui/sync/appeng/AESyncHandler.java | 24 +++++++++++++-- .../api/mui/widget/appeng/AEConfigSlot.java | 13 --------- .../api/mui/widget/appeng/AEDisplaySlot.java | 13 --------- .../mui/widget/appeng/AEItemConfigSlot.java | 22 +++++++++++--- .../appeng/MetaTileEntityMEInputBus.java | 29 ++++--------------- .../appeng/MetaTileEntityMEStockingBus.java | 11 ------- 7 files changed, 48 insertions(+), 71 deletions(-) diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java index 14399556df2..afce40d5c8f 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java @@ -46,12 +46,13 @@ public void readOnClient(int id, PacketBuffer buf) throws IOException { @Override public void readOnServer(int id, PacketBuffer buf) throws IOException { - if (id == jeiDropSyncID) { + super.readOnServer(id, buf); + if (id == setConfigID) { config.setConfig(WrappedItemStack.fromPacket(buf)); } } - public void sendJEIDrop(ItemStack stack) { - syncToServer(jeiDropSyncID, buf -> ByteBufUtils.writeTag(buf, stack.serializeNBT())); + public void setConfig(ItemStack stack) { + syncToServer(setConfigID, buf -> ByteBufUtils.writeTag(buf, stack.serializeNBT())); } } diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java index 00782eec3f4..5e99ee3daf6 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java @@ -2,15 +2,22 @@ import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.IConfigurableSlot; +import net.minecraft.network.PacketBuffer; + import appeng.api.storage.data.IAEStack; import com.cleanroommc.modularui.value.sync.SyncHandler; import org.jetbrains.annotations.Nullable; +import java.io.IOException; + public abstract class AESyncHandler> extends SyncHandler { - public static final int jeiDropSyncID = 0; - public static final int configSyncID = 1; - public static final int stockSyncID = 2; + private static int rollingID = 0; + + public static final int configSyncID = rollingID++; + public static final int stockSyncID = rollingID++; + public static final int setConfigID = rollingID++; + public static final int clearConfigID = rollingID++; protected final IConfigurableSlot config; protected IConfigurableSlot cache; @@ -66,6 +73,17 @@ public void detectAndSendChanges(boolean init) { } } + @Override + public void readOnServer(int id, PacketBuffer buf) throws IOException { + if (id == clearConfigID) { + config.setConfig(null); + } + } + + public void clearConfig() { + syncToServer(clearConfigID); + } + @Nullable public T getConfig() { return config.getConfig(); diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java index ef7591d8f75..439e9e84b25 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java @@ -1,12 +1,9 @@ package gregtech.api.mui.widget.appeng; -import gregtech.api.mui.sync.appeng.AESyncHandler; - import appeng.api.storage.data.IAEStack; import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.integration.jei.JeiIngredientProvider; import com.cleanroommc.modularui.screen.RichTooltip; -import com.cleanroommc.modularui.value.sync.ModularSyncManager; import com.cleanroommc.modularui.widget.Widget; import org.jetbrains.annotations.NotNull; @@ -28,16 +25,6 @@ public void onInit() { tooltipBuilder(this::buildTooltip); } - @Override - public void initialiseSyncHandler(ModularSyncManager syncManager) { - super.initialiseSyncHandler(syncManager); - if (getSyncHandler() instanceof AESyncHandleraeSyncHandler) { - aeSyncHandler.setOnConfigChanged(this::markTooltipDirty); - } else { - throw new IllegalStateException("Sync handler for AEConfigSlot is not a AESyncHandler!"); - } - } - protected void buildTooltip(@NotNull RichTooltip tooltip) { tooltip.addLine(IKey.lang("gregtech.gui.config_slot")); if (isStocking) { diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEDisplaySlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEDisplaySlot.java index e5aad3421b4..7d89d1d3aaa 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEDisplaySlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEDisplaySlot.java @@ -1,11 +1,8 @@ package gregtech.api.mui.widget.appeng; -import gregtech.api.mui.sync.appeng.AESyncHandler; - import appeng.api.storage.data.IAEStack; import com.cleanroommc.modularui.integration.jei.JeiIngredientProvider; import com.cleanroommc.modularui.screen.RichTooltip; -import com.cleanroommc.modularui.value.sync.ModularSyncManager; import com.cleanroommc.modularui.widget.Widget; import org.jetbrains.annotations.NotNull; @@ -21,15 +18,5 @@ public void onInit() { tooltipBuilder(this::buildTooltip); } - @Override - public void initialiseSyncHandler(ModularSyncManager syncManager) { - super.initialiseSyncHandler(syncManager); - if (getSyncHandler() instanceof AESyncHandleraeSyncHandler) { - aeSyncHandler.setOnConfigChanged(this::markTooltipDirty); - } else { - throw new IllegalStateException("Sync handler for AEDisplaySlot is not a AESyncHandler!"); - } - } - protected void buildTooltip(@NotNull RichTooltip tooltip) {} } diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEItemConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEItemConfigSlot.java index 58c50ef9568..a99490fb376 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEItemConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEItemConfigSlot.java @@ -71,7 +71,7 @@ public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { } } - // replace with RenderUtil.handleJeiGhostHighlight(this); when 2812 merges (thx ghz) + // TODO: replace with RenderUtil.handleJeiGhostHighlight(this); when 2812 merges (thx ghz) if (ModularUIJeiPlugin.hasDraggingGhostIngredient() || ModularUIJeiPlugin.hoveringOverIngredient(this)) { GlStateManager.colorMask(true, true, true, false); drawHighlight(getArea(), isHovering()); @@ -81,17 +81,31 @@ public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { @Override public @NotNull Result onMousePressed(int mouseButton) { - return Result.ACCEPT; + if (isAutoPull.getAsBoolean()) return Result.IGNORE; + + if (mouseButton == 1) { + // Right click to clear + getSyncHandler().clearConfig(); + } else if (mouseButton == 0) { + // Left click to set item/change amount + ItemStack heldItem = getSyncHandler().getSyncManager().getCursorItem(); + + if (!heldItem.isEmpty()) { + getSyncHandler().setConfig(heldItem); + } + } + + return Result.SUCCESS; } @Override public void setGhostIngredient(@NotNull ItemStack ingredient) { - getSyncHandler().sendJEIDrop(ingredient); + getSyncHandler().setConfig(ingredient); } @Override public @Nullable ItemStack castGhostIngredientIfValid(@NotNull Object ingredient) { - return ingredient instanceof ItemStack stack ? stack : null; + return !isAutoPull.getAsBoolean() && ingredient instanceof ItemStack stack ? stack : null; } @Override diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java index cdeeda7769c..bc2c9e0a822 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java @@ -9,8 +9,6 @@ import gregtech.api.capability.impl.GhostCircuitItemStackHandler; import gregtech.api.capability.impl.ItemHandlerList; import gregtech.api.capability.impl.NotifiableItemStackHandler; -import gregtech.api.gui.GuiTextures; -import gregtech.api.gui.ModularUI; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.metatileentity.multiblock.AbilityInstances; @@ -220,7 +218,7 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) .minElementMargin(0, 0) .minColWidth(18) .minRowHeight(18) - .matrix(Grid.mapToMatrix(4, 16, + .matrix(Grid.mapToMatrix((int) Math.sqrt(CONFIG_SIZE), CONFIG_SIZE, index -> new AEItemConfigSlot(isStocking, () -> getAEItemHandler().isAutoPull()) .background(GTGuiTextures.SLOT, GTGuiTextures.CONFIG_ARROW_DARK) .syncHandler(syncHandlerName, index)))) @@ -230,9 +228,10 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) .minElementMargin(0, 0) .minColWidth(18) .minRowHeight(18) - .matrix(Grid.mapToMatrix(4, 16, index -> new AEItemDisplaySlot() - .background(GTGuiTextures.SLOT_DARK) - .syncHandler(syncHandlerName, index)))) + .matrix(Grid.mapToMatrix((int) Math.sqrt(CONFIG_SIZE), CONFIG_SIZE, + index -> new AEItemDisplaySlot() + .background(GTGuiTextures.SLOT_DARK) + .syncHandler(syncHandlerName, index)))) .child(Flow.column() .pos(7 + 18 * 4, 25 + 18) .size(18, 18 * 4) @@ -246,24 +245,6 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) .addTooltipLine(IKey.lang("gregtech.gui.me_bus.extra_slot")))); } - @Override - protected final ModularUI createUI(EntityPlayer player) { - ModularUI.Builder builder = createUITemplate(player); - return builder.build(this.getHolder(), player); - } - - protected ModularUI.Builder createUITemplate(EntityPlayer player) { - ModularUI.Builder builder = ModularUI - .builder(GuiTextures.BACKGROUND, 176, 18 + 18 * 4 + 94) - .label(10, 5, getMetaFullName()); - - // Arrow image - builder.image(7 + 18 * 4, 25 + 18, 18, 18, GuiTextures.ARROW_DOUBLE); - - builder.bindPlayerInventory(player.inventory, GuiTextures.SLOT, 7, 18 + 18 * 4 + 12); - return builder; - } - @Override public boolean isWorkingEnabled() { return this.workingEnabled; diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java index 70505b23699..f3b37b8eac3 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java @@ -1,9 +1,6 @@ package gregtech.common.metatileentities.multi.multiblockpart.appeng; import gregtech.api.GTValues; -import gregtech.api.gui.GuiTextures; -import gregtech.api.gui.ModularUI; -import gregtech.api.gui.widgets.ImageCycleButtonWidget; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.metatileentity.multiblock.MultiblockAbility; @@ -257,14 +254,6 @@ public void receiveCustomData(int dataId, PacketBuffer buf) { } } - @Override - protected ModularUI.Builder createUITemplate(EntityPlayer player) { - ModularUI.Builder builder = super.createUITemplate(player); - builder.widget(new ImageCycleButtonWidget(7 + 18 * 4 + 1, 26, 16, 16, GuiTextures.BUTTON_AUTO_PULL, - () -> autoPull, this::setAutoPull).setTooltipHoverString("gregtech.gui.me_bus.auto_pull_button")); - return builder; - } - @Override public boolean onScrewdriverClick(EntityPlayer playerIn, EnumHand hand, EnumFacing facing, CuboidRayTraceResult hitResult) { From 58b036259ca93169d6972e5410cf3e03b8a2dbd1 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Tue, 20 May 2025 21:35:12 -0400 Subject: [PATCH 020/136] Scrolling (almost why no sync ug) --- .../mui/sync/appeng/AEItemSyncHandler.java | 14 +----- .../api/mui/sync/appeng/AESyncHandler.java | 45 +++++++------------ .../mui/widget/appeng/AEItemConfigSlot.java | 28 ++++++++++++ 3 files changed, 46 insertions(+), 41 deletions(-) diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java index afce40d5c8f..1f5d706a46f 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java @@ -10,8 +10,6 @@ import appeng.api.storage.data.IAEItemStack; -import java.io.IOException; - public class AEItemSyncHandler extends AESyncHandler { public AEItemSyncHandler(IConfigurableSlot config) { @@ -20,22 +18,14 @@ public AEItemSyncHandler(IConfigurableSlot config) { } @Override - public void readOnClient(int id, PacketBuffer buf) throws IOException { + public void readOnClient(int id, PacketBuffer buf) { if (id == configSyncID) { - if (onConfigChanged != null) { - onConfigChanged.run(); - } - if (buf.readBoolean()) { config.setConfig(WrappedItemStack.fromPacket(buf)); } else { config.setConfig(null); } } else if (id == stockSyncID) { - if (onStockChanged != null) { - onStockChanged.run(); - } - if (buf.readBoolean()) { config.setStock(WrappedItemStack.fromPacket(buf)); } else { @@ -45,7 +35,7 @@ public void readOnClient(int id, PacketBuffer buf) throws IOException { } @Override - public void readOnServer(int id, PacketBuffer buf) throws IOException { + public void readOnServer(int id, PacketBuffer buf) { super.readOnServer(id, buf); if (id == setConfigID) { config.setConfig(WrappedItemStack.fromPacket(buf)); diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java index 5e99ee3daf6..d87fb5a10a7 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java @@ -8,8 +8,6 @@ import com.cleanroommc.modularui.value.sync.SyncHandler; import org.jetbrains.annotations.Nullable; -import java.io.IOException; - public abstract class AESyncHandler> extends SyncHandler { private static int rollingID = 0; @@ -18,15 +16,11 @@ public abstract class AESyncHandler> extends SyncHandler { public static final int stockSyncID = rollingID++; public static final int setConfigID = rollingID++; public static final int clearConfigID = rollingID++; + public static final int changeConfigID = rollingID++; protected final IConfigurableSlot config; protected IConfigurableSlot cache; - @Nullable - protected Runnable onConfigChanged; - @Nullable - protected Runnable onStockChanged; - public AESyncHandler(IConfigurableSlot config) { this.config = config; } @@ -39,10 +33,6 @@ public void detectAndSendChanges(boolean init) { if (!areAEStackCountEquals(currentConfig, cachedConfig)) { cache.setConfig(currentConfig); - if (onConfigChanged != null) { - onConfigChanged.run(); - } - syncToClient(configSyncID, buf -> { if (currentConfig == null) { buf.writeBoolean(false); @@ -58,10 +48,6 @@ public void detectAndSendChanges(boolean init) { if (!areAEStackCountEquals(currentStock, cachedStock)) { cache.setStock(currentStock); - if (onStockChanged != null) { - onStockChanged.run(); - } - syncToClient(stockSyncID, buf -> { if (currentStock == null) { buf.writeBoolean(false); @@ -74,9 +60,14 @@ public void detectAndSendChanges(boolean init) { } @Override - public void readOnServer(int id, PacketBuffer buf) throws IOException { + public void readOnServer(int id, PacketBuffer buf) { if (id == clearConfigID) { config.setConfig(null); + } else if (id == changeConfigID) { + if (hasConfig()) { + // noinspection DataFlowIssue + getConfig().setStackSize(buf.readInt()); + } } } @@ -89,25 +80,21 @@ public T getConfig() { return config.getConfig(); } - @Nullable - public T getStock() { - return config.getStock(); - } - - public void setOnConfigChanged(@Nullable Runnable onConfigChanged) { - this.onConfigChanged = onConfigChanged; + public long getConfigAmount() { + return getConfig() == null ? 0 : getConfig().getStackSize(); } - public void setOnStockChanged(@Nullable Runnable onStockChanged) { - this.onStockChanged = onStockChanged; + public void setConfigAmount(int newAmount) { + syncToServer(changeConfigID, buf -> buf.writeInt(newAmount)); } - public @Nullable Runnable getOnConfigChanged() { - return onConfigChanged; + public boolean hasConfig() { + return getConfig() != null; } - public @Nullable Runnable getOnStockChanged() { - return onStockChanged; + @Nullable + public T getStock() { + return config.getStock(); } @SuppressWarnings("BooleanMethodIsAlwaysInverted") diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEItemConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEItemConfigSlot.java index a99490fb376..ecf6f4030fb 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEItemConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEItemConfigSlot.java @@ -11,6 +11,7 @@ import com.cleanroommc.modularui.api.widget.Interactable; import com.cleanroommc.modularui.integration.jei.JeiGhostIngredientSlot; import com.cleanroommc.modularui.integration.jei.ModularUIJeiPlugin; +import com.cleanroommc.modularui.screen.ModularScreen; import com.cleanroommc.modularui.screen.RichTooltip; import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; import com.cleanroommc.modularui.theme.WidgetTheme; @@ -98,6 +99,33 @@ public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { return Result.SUCCESS; } + @Override + public boolean onMouseScroll(ModularScreen.UpOrDown scrollDirection, int scrollAmount) { + if (!getSyncHandler().hasConfig() || isStocking) return false; + + long newStackSize = getSyncHandler().getConfigAmount(); + + if (Interactable.hasControlDown()) { + switch (scrollDirection) { + case UP -> newStackSize *= 2; + case DOWN -> newStackSize /= 2; + } + } else { + switch (scrollDirection) { + case UP -> newStackSize += 1; + case DOWN -> newStackSize -= 1; + } + } + + if (newStackSize > 0 && newStackSize < Integer.MAX_VALUE + 1L) { + int scaledStackSize = (int) newStackSize; + getSyncHandler().setConfigAmount(scaledStackSize); + return true; + } + + return false; + } + @Override public void setGhostIngredient(@NotNull ItemStack ingredient) { getSyncHandler().setConfig(ingredient); From c2da63671a8a2c3e90bb7a500afc297a2744cfe3 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Tue, 20 May 2025 22:46:33 -0400 Subject: [PATCH 021/136] Fix the cache not being set to a copy which caused scrolling to get all wacked out. --- .../api/mui/sync/appeng/AESyncHandler.java | 14 +++++--------- .../api/mui/widget/appeng/AEItemConfigSlot.java | 2 +- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java index d87fb5a10a7..9e61a0d9e91 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java @@ -31,7 +31,7 @@ public void detectAndSendChanges(boolean init) { T currentConfig = config.getConfig(); T cachedConfig = cache.getConfig(); if (!areAEStackCountEquals(currentConfig, cachedConfig)) { - cache.setConfig(currentConfig); + cache.setConfig(currentConfig == null ? null : currentConfig.copy()); syncToClient(configSyncID, buf -> { if (currentConfig == null) { @@ -46,7 +46,7 @@ public void detectAndSendChanges(boolean init) { T currentStock = config.getStock(); T cachedStock = cache.getStock(); if (!areAEStackCountEquals(currentStock, cachedStock)) { - cache.setStock(currentStock); + cache.setStock(currentStock == null ? null : currentStock.copy()); syncToClient(stockSyncID, buf -> { if (currentStock == null) { @@ -64,9 +64,9 @@ public void readOnServer(int id, PacketBuffer buf) { if (id == clearConfigID) { config.setConfig(null); } else if (id == changeConfigID) { - if (hasConfig()) { - // noinspection DataFlowIssue - getConfig().setStackSize(buf.readInt()); + T config = getConfig(); + if (config != null) { + config.setStackSize(buf.readInt()); } } } @@ -88,10 +88,6 @@ public void setConfigAmount(int newAmount) { syncToServer(changeConfigID, buf -> buf.writeInt(newAmount)); } - public boolean hasConfig() { - return getConfig() != null; - } - @Nullable public T getStock() { return config.getStock(); diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEItemConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEItemConfigSlot.java index ecf6f4030fb..bdd736cc5c0 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEItemConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEItemConfigSlot.java @@ -101,7 +101,7 @@ public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { @Override public boolean onMouseScroll(ModularScreen.UpOrDown scrollDirection, int scrollAmount) { - if (!getSyncHandler().hasConfig() || isStocking) return false; + if (getSyncHandler().getConfig() == null || isStocking) return false; long newStackSize = getSyncHandler().getConfigAmount(); From 9e70ef5d750ad59ba27cd6c2ae8d89bac3c604e8 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Tue, 20 May 2025 22:59:06 -0400 Subject: [PATCH 022/136] Set MTE dirty when setting the config to prevent it from being lost if the world is exited too fast. --- .../appeng/slot/ExportOnlyAEItemList.java | 1 + .../multiblockpart/appeng/slot/ExportOnlyAESlot.java | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEItemList.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEItemList.java index 995670eff15..c9173615897 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEItemList.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEItemList.java @@ -27,6 +27,7 @@ protected void createInventory(MetaTileEntity holder) { } for (ExportOnlyAEItemSlot slot : this.inventory) { slot.setTrigger(this::onContentsChanged); + slot.setDirtyNotifier(holder::markDirty); } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAESlot.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAESlot.java index 236152a69bc..d4086cdc168 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAESlot.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAESlot.java @@ -16,6 +16,9 @@ public abstract class ExportOnlyAESlot> @Nullable protected T stock; + @Nullable + private Runnable dirtyNotifier; + public ExportOnlyAESlot(@Nullable T config, @Nullable T stock) { this.config = config; this.stock = stock; @@ -25,6 +28,10 @@ public ExportOnlyAESlot() { this(null, null); } + public void setDirtyNotifier(@Nullable Runnable dirtyNotifier) { + this.dirtyNotifier = dirtyNotifier; + } + @Nullable public T requestStack() { if (this.stock != null && !this.stock.isMeaningful()) { @@ -94,6 +101,10 @@ public NBTTagCompound serializeNBT() { @Override public void setConfig(@Nullable T val) { this.config = val; + + if (dirtyNotifier != null) { + dirtyNotifier.run(); + } } @Override From ff3e645e091b84ce9153a3e065ca3869e894cce3 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Wed, 21 May 2025 00:05:19 -0400 Subject: [PATCH 023/136] Stocking auto pull --- .../java/gregtech/api/mui/GTGuiTextures.java | 2 ++ .../gregtech/api/mui/widget/EmptyWidget.java | 12 +++++++++++ .../api/mui/widget/appeng/AEConfigSlot.java | 15 +++++++++++++ .../appeng/MetaTileEntityMEInputBus.java | 12 +++++++++-- .../appeng/MetaTileEntityMEStockingBus.java | 21 +++++++++++++++++++ 5 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 src/main/java/gregtech/api/mui/widget/EmptyWidget.java diff --git a/src/main/java/gregtech/api/mui/GTGuiTextures.java b/src/main/java/gregtech/api/mui/GTGuiTextures.java index e4227acf93b..b63f933228d 100644 --- a/src/main/java/gregtech/api/mui/GTGuiTextures.java +++ b/src/main/java/gregtech/api/mui/GTGuiTextures.java @@ -528,6 +528,8 @@ public static class IDs { public static final UITexture SELECT_BOX = fullImage("textures/gui/widget/select_box.png"); public static final UITexture BUTTON_AUTO_PULL = fullImage("textures/gui/widget/button_me_auto_pull.png"); public static final UITexture ARROW_DOUBLE = fullImage("textures/gui/widget/arrow_double.png"); + public static final UITexture[] AUTO_PULL = slice("textures/gui/widget/button_me_auto_pull.png", + 16, 32, 16, 16, true); public static void init() {/**/} diff --git a/src/main/java/gregtech/api/mui/widget/EmptyWidget.java b/src/main/java/gregtech/api/mui/widget/EmptyWidget.java new file mode 100644 index 00000000000..fe59063710a --- /dev/null +++ b/src/main/java/gregtech/api/mui/widget/EmptyWidget.java @@ -0,0 +1,12 @@ +package gregtech.api.mui.widget; + +import com.cleanroommc.modularui.widget.Widget; + +/** + * A widget that does absolutely nothing. Is currently used to take up space in a Flow in the non-stocking ME Input Bus + * to be replaced by the auto pull button in the stocking ME Input Bus. + * Hopefully Ghzdude or Brachy will show a better way to do this. + */ +public class EmptyWidget extends Widget { + +} diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java index 439e9e84b25..8d34db5bafc 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java @@ -1,11 +1,18 @@ package gregtech.api.mui.widget.appeng; import appeng.api.storage.data.IAEStack; +import com.cleanroommc.modularui.api.ITheme; +import com.cleanroommc.modularui.api.drawable.IDrawable; import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.integration.jei.JeiIngredientProvider; import com.cleanroommc.modularui.screen.RichTooltip; +import com.cleanroommc.modularui.theme.WidgetTheme; import com.cleanroommc.modularui.widget.Widget; + +import gregtech.api.mui.GTGuiTextures; + import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.function.BooleanSupplier; @@ -15,6 +22,9 @@ public abstract class AEConfigSlot> extends Widget new AEItemConfigSlot(isStocking, () -> getAEItemHandler().isAutoPull()) - .background(GTGuiTextures.SLOT, GTGuiTextures.CONFIG_ARROW_DARK) .syncHandler(syncHandlerName, index)))) .child(new Grid() .pos(7 + 18 * 5, 25) @@ -233,8 +235,9 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) .background(GTGuiTextures.SLOT_DARK) .syncHandler(syncHandlerName, index)))) .child(Flow.column() - .pos(7 + 18 * 4, 25 + 18) + .pos(7 + 18 * 4, 25) .size(18, 18 * 4) + .child(getExtraButton()) .child(GTGuiTextures.ARROW_DOUBLE.asWidget()) .child(new GhostCircuitSlotWidget() .slot(SyncHandlers.itemSlot(circuitInventory, 0)) @@ -245,6 +248,11 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) .addTooltipLine(IKey.lang("gregtech.gui.me_bus.extra_slot")))); } + protected IWidget getExtraButton() { + return new EmptyWidget() + .size(18); + } + @Override public boolean isWorkingEnabled() { return this.workingEnabled; diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java index f3b37b8eac3..b6658da2874 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java @@ -1,11 +1,18 @@ package gregtech.common.metatileentities.multi.multiblockpart.appeng; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.api.widget.IWidget; + +import com.cleanroommc.modularui.value.sync.BooleanSyncValue; +import com.cleanroommc.modularui.widgets.ToggleButton; + import gregtech.api.GTValues; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.metatileentity.multiblock.MultiblockAbility; import gregtech.api.metatileentity.multiblock.MultiblockControllerBase; import gregtech.api.metatileentity.multiblock.RecipeMapMultiblockController; +import gregtech.api.mui.GTGuiTextures; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEItemList; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEItemSlot; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.IConfigurableSlot; @@ -254,6 +261,20 @@ public void receiveCustomData(int dataId, PacketBuffer buf) { } } + @Override + protected IWidget getExtraButton() { + BooleanSyncValue autoPullSync = new BooleanSyncValue(() -> autoPull, this::setAutoPull); + + return new ToggleButton() + .size(18) + .value(autoPullSync) + .disableHoverBackground() + .overlay(false, GTGuiTextures.AUTO_PULL[0]) + .overlay(true, GTGuiTextures.AUTO_PULL[1]) + .addTooltip(false, IKey.lang("gregtech.machine.me.stocking_auto_pull_disabled")) + .addTooltip(true, IKey.lang("gregtech.machine.me.stocking_auto_pull_enabled")); + } + @Override public boolean onScrewdriverClick(EntityPlayer playerIn, EnumHand hand, EnumFacing facing, CuboidRayTraceResult hitResult) { From 727566de8eeb75ff007eeefe98f631d291b0279d Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Wed, 21 May 2025 00:50:34 -0400 Subject: [PATCH 024/136] Fluid display slot --- .../mui/sync/appeng/AEFluidSyncHandler.java | 53 ++++++++++++++++ .../api/mui/widget/appeng/AEConfigSlot.java | 1 + .../api/mui/widget/appeng/AEDisplaySlot.java | 1 + .../appeng/fluid/AEFluidDisplaySlot.java | 62 +++++++++++++++++++ .../appeng/{ => item}/AEItemConfigSlot.java | 4 +- .../appeng/{ => item}/AEItemDisplaySlot.java | 10 +-- .../java/gregtech/api/util/NetworkUtil.java | 59 ++++++++++++++++++ .../appeng/MetaTileEntityMEInputBus.java | 4 +- .../appeng/slot/IConfigurableSlot.java | 4 +- .../appeng/stack/WrappedFluidStack.java | 30 +++++---- .../appeng/stack/WrappedItemStack.java | 4 +- 11 files changed, 208 insertions(+), 24 deletions(-) create mode 100644 src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java create mode 100644 src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidDisplaySlot.java rename src/main/java/gregtech/api/mui/widget/appeng/{ => item}/AEItemConfigSlot.java (98%) rename src/main/java/gregtech/api/mui/widget/appeng/{ => item}/AEItemDisplaySlot.java (88%) create mode 100644 src/main/java/gregtech/api/util/NetworkUtil.java diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java new file mode 100644 index 00000000000..c603eac32d6 --- /dev/null +++ b/src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java @@ -0,0 +1,53 @@ +package gregtech.api.mui.sync.appeng; + +import appeng.api.storage.data.IAEFluidStack; + +import gregtech.api.util.NetworkUtil; +import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEFluidSlot; +import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.IConfigurableSlot; + +import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedFluidStack; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.PacketBuffer; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fml.common.network.ByteBufUtils; + +import java.io.IOException; + +public class AEFluidSyncHandler extends AESyncHandler { + + public AEFluidSyncHandler(IConfigurableSlot config) { + super(config); + cache = new ExportOnlyAEFluidSlot(); + } + + @Override + public void readOnClient(int id, PacketBuffer buf) throws IOException { + if (id == configSyncID) { + if (buf.readBoolean()) { + config.setConfig(WrappedFluidStack.fromPacket(buf)); + } else { + config.setConfig(null); + } + } else if (id == stockSyncID) { + if (buf.readBoolean()) { + config.setStock(WrappedFluidStack.fromPacket(buf)); + } else { + config.setConfig(null); + } + } + } + + @Override + public void readOnServer(int id, PacketBuffer buf) { + super.readOnServer(id, buf); + if (id == setConfigID) { + config.setConfig(WrappedFluidStack.fromPacket(buf)); + } + } + + public void setConfig(FluidStack stack) { + syncToServer(setConfigID, buf -> NetworkUtil.writeFluidStack(buf, stack)); + } +} diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java index 8d34db5bafc..d24745c48f7 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java @@ -28,6 +28,7 @@ public abstract class AEConfigSlot> extends Widget> extends Widget { + + public AEFluidDisplaySlot() { + super(); + tooltipAutoUpdate(true); + } + + @Override + protected void buildTooltip(@NotNull RichTooltip tooltip) { + IAEFluidStack stock = getSyncHandler().getStock(); + } + + @Override + public @NotNull AEFluidSyncHandler getSyncHandler() { + return (AEFluidSyncHandler) super.getSyncHandler(); + } + + @Override + public boolean isValidSyncHandler(SyncHandler syncHandler) { + return syncHandler instanceof AEFluidSyncHandler; + } + + @Override + public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { + IAEFluidStack stock = getSyncHandler().getStock(); + if (stock != null) { + FluidStack stack = stock.getFluidStack(); + RenderUtil.drawFluidForGui(stack, stack.amount, 1, 1, 17, 17); + + String amount = TextFormattingUtil.formatLongToCompactString(stock.getStackSize(), 4); + RenderUtil.renderTextFixedCorner(amount, 17d, 18d, 0xFFFFFF, true, 0.5f); + } + } + + @Override + public @Nullable Object getIngredient() { + IAEFluidStack stock = getSyncHandler().getStock(); + return stock == null ? null : stock.getFluidStack(); + } +} diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEItemConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java similarity index 98% rename from src/main/java/gregtech/api/mui/widget/appeng/AEItemConfigSlot.java rename to src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java index bdd736cc5c0..866e5540108 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEItemConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java @@ -1,6 +1,7 @@ -package gregtech.api.mui.widget.appeng; +package gregtech.api.mui.widget.appeng.item; import gregtech.api.mui.sync.appeng.AEItemSyncHandler; +import gregtech.api.mui.widget.appeng.AEConfigSlot; import gregtech.api.util.TextFormattingUtil; import gregtech.client.utils.RenderUtil; @@ -26,7 +27,6 @@ public class AEItemConfigSlot extends AEConfigSlot implements Inte public AEItemConfigSlot(boolean isStocking, BooleanSupplier isAutoPull) { super(isStocking, isAutoPull); - size(18, 18); tooltipAutoUpdate(true); } diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEItemDisplaySlot.java b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemDisplaySlot.java similarity index 88% rename from src/main/java/gregtech/api/mui/widget/appeng/AEItemDisplaySlot.java rename to src/main/java/gregtech/api/mui/widget/appeng/item/AEItemDisplaySlot.java index 2d66bcff421..d62bcf87926 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEItemDisplaySlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemDisplaySlot.java @@ -1,6 +1,7 @@ -package gregtech.api.mui.widget.appeng; +package gregtech.api.mui.widget.appeng.item; import gregtech.api.mui.sync.appeng.AEItemSyncHandler; +import gregtech.api.mui.widget.appeng.AEDisplaySlot; import gregtech.api.util.TextFormattingUtil; import gregtech.client.utils.RenderUtil; @@ -18,15 +19,14 @@ public class AEItemDisplaySlot extends AEDisplaySlot { public AEItemDisplaySlot() { super(); - size(18, 18); tooltipAutoUpdate(true); } @Override protected void buildTooltip(@NotNull RichTooltip tooltip) { - IAEItemStack stack = getSyncHandler().getStock(); - if (stack != null) { - tooltip.addFromItem(stack.createItemStack()); + IAEItemStack stock = getSyncHandler().getStock(); + if (stock != null) { + tooltip.addFromItem(stock.createItemStack()); } } diff --git a/src/main/java/gregtech/api/util/NetworkUtil.java b/src/main/java/gregtech/api/util/NetworkUtil.java new file mode 100644 index 00000000000..29316a2b69a --- /dev/null +++ b/src/main/java/gregtech/api/util/NetworkUtil.java @@ -0,0 +1,59 @@ +package gregtech.api.util; + +import io.netty.buffer.ByteBuf; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.PacketBuffer; +import net.minecraftforge.fluids.FluidStack; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.io.IOException; + +public class NetworkUtil { + + /** + * Write the NBT of a {@link FluidStack} to a {@link PacketBuffer}. + * @param to the buffer to write to + * @param stack the stack to write + */ + public static void writeFluidStack(@NotNull PacketBuffer to, @NotNull FluidStack stack) { + NBTTagCompound tag = new NBTTagCompound(); + stack.writeToNBT(tag); + to.writeCompoundTag(tag); + } + /** + * {@link #writeFluidStack(PacketBuffer, FluidStack)} but with a netty {@link ByteBuf} + * @param to the buffer to write to + * @param stack the stack to write + */ + public static void writeFluidStack(@NotNull ByteBuf to, @NotNull FluidStack stack) { + writeFluidStack(new PacketBuffer(to), stack); + } + + /** + * Read a {@link FluidStack} from a {@link PacketBuffer} + * @param from the packet buffer to read from + * @return the decoded fluid stack + */ + public static @Nullable FluidStack readFluidStack(@NotNull PacketBuffer from) { + NBTTagCompound tag; + try { + tag = from.readCompoundTag(); + } catch (IOException e) { + GTLog.logger.error("Exception reading the tag compound from the packet buffer!", e); + return null; + } + return FluidStack.loadFluidStackFromNBT(tag); + } + + /** + * {@link #readFluidStack(PacketBuffer)} but with a netty {@link ByteBuf} + * @param from the packet buffer to read from + * @return the decoded fluid stack + */ + public static @Nullable FluidStack readFluidStack(@NotNull ByteBuf from) { + return readFluidStack(new PacketBuffer(from)); + } +} diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java index c13fbd4eb4b..5d9a7ffc8b3 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java @@ -22,8 +22,8 @@ import gregtech.api.mui.sync.appeng.AEItemSyncHandler; import gregtech.api.mui.widget.EmptyWidget; import gregtech.api.mui.widget.GhostCircuitSlotWidget; -import gregtech.api.mui.widget.appeng.AEItemConfigSlot; -import gregtech.api.mui.widget.appeng.AEItemDisplaySlot; +import gregtech.api.mui.widget.appeng.item.AEItemConfigSlot; +import gregtech.api.mui.widget.appeng.item.AEItemDisplaySlot; import gregtech.api.util.GTUtility; import gregtech.client.renderer.texture.Textures; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEItemList; diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/IConfigurableSlot.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/IConfigurableSlot.java index 114138c3cbd..648ea0f0d34 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/IConfigurableSlot.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/IConfigurableSlot.java @@ -12,9 +12,9 @@ public interface IConfigurableSlot> { @Nullable T getStock(); - void setConfig(T val); + void setConfig(@Nullable T val); - void setStock(T val); + void setStock(@Nullable T val); @NotNull IConfigurableSlot copy(); diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedFluidStack.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedFluidStack.java index be685df3fd3..5b36435ea4c 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedFluidStack.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedFluidStack.java @@ -1,5 +1,7 @@ package gregtech.common.metatileentities.multi.multiblockpart.appeng.stack; +import gregtech.api.util.NetworkUtil; + import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.fluids.Fluid; @@ -13,7 +15,12 @@ import appeng.api.storage.data.IAEFluidStack; import appeng.fluids.util.AEFluidStack; import io.netty.buffer.ByteBuf; + +import net.minecraftforge.fml.common.network.ByteBufUtils; + +import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.nio.charset.StandardCharsets; @@ -30,24 +37,22 @@ private WrappedFluidStack(@NotNull FluidStack stack) { this.delegate = stack; } + @Contract("null -> null; !null -> !null") public static WrappedFluidStack fromFluidStack(FluidStack fluidStack) { return fluidStack == null ? null : new WrappedFluidStack(fluidStack); } + @Contract("null -> null") public static WrappedFluidStack fromNBT(NBTTagCompound data) { FluidStack fluidStack = FluidStack.loadFluidStackFromNBT(data); return fromFluidStack(fluidStack); } - public static WrappedFluidStack fromPacket(ByteBuf buffer) { - byte len = buffer.readByte(); - byte[] name = new byte[len]; - buffer.readBytes(name, 0, len); - int amt = buffer.readInt(); - FluidStack fluidStack = FluidRegistry.getFluidStack(new String(name, StandardCharsets.UTF_8), amt); - return fromFluidStack(fluidStack); + public static WrappedFluidStack fromPacket(@NotNull ByteBuf buffer) { + return fromFluidStack(NetworkUtil.readFluidStack(buffer)); } + @NotNull public AEFluidStack getAEStack() { return AEFluidStack.fromFluidStack(this.delegate); } @@ -134,6 +139,12 @@ public void writeToNBT(NBTTagCompound nbtTagCompound) { this.delegate.writeToNBT(nbtTagCompound); } + public NBTTagCompound serializeToNBT() { + NBTTagCompound tag = new NBTTagCompound(); + writeToNBT(tag); + return tag; + } + @Override public boolean fuzzyComparison(IAEFluidStack stack, FuzzyMode fuzzyMode) { return this.delegate.getFluid() == stack.getFluid(); @@ -141,10 +152,7 @@ public boolean fuzzyComparison(IAEFluidStack stack, FuzzyMode fuzzyMode) { @Override public void writeToPacket(ByteBuf buffer) { - byte[] name = this.delegate.getFluid().getName().getBytes(StandardCharsets.UTF_8); - buffer.writeByte((byte) name.length); - buffer.writeBytes(name); - buffer.writeInt(this.delegate.amount); + ByteBufUtils.writeTag(buffer, serializeToNBT()); } @Override diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedItemStack.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedItemStack.java index 274d4aac26c..2bef4cea9fe 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedItemStack.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedItemStack.java @@ -33,7 +33,7 @@ public static WrappedItemStack fromItemStack(@NotNull ItemStack stack) { return stack.isEmpty() ? null : new WrappedItemStack(stack); } - public static WrappedItemStack fromNBT(NBTTagCompound i) { + public static WrappedItemStack fromNBT(@Nullable NBTTagCompound i) { if (i == null) { return null; } else { @@ -42,7 +42,7 @@ public static WrappedItemStack fromNBT(NBTTagCompound i) { } } - public static WrappedItemStack fromPacket(ByteBuf data) { + public static WrappedItemStack fromPacket(@NotNull ByteBuf data) { return fromNBT(ByteBufUtils.readTag(data)); } From 30de112eabef8e12db72b9aa7afadbe46024fcb3 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Wed, 21 May 2025 01:11:59 -0400 Subject: [PATCH 025/136] Fluid config slot --- .../api/mui/widget/appeng/AEConfigSlot.java | 1 + .../appeng/fluid/AEFluidConfigSlot.java | 165 ++++++++++++++++++ .../appeng/fluid/AEFluidDisplaySlot.java | 19 +- .../widget/appeng/item/AEItemConfigSlot.java | 9 +- 4 files changed, 190 insertions(+), 4 deletions(-) create mode 100644 src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java index d24745c48f7..a9bba10a5e3 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java @@ -36,6 +36,7 @@ public void onInit() { tooltipBuilder(this::buildTooltip); } + //TODO: change tooltip when autopull is on protected void buildTooltip(@NotNull RichTooltip tooltip) { tooltip.addLine(IKey.lang("gregtech.gui.config_slot")); if (isStocking) { diff --git a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java new file mode 100644 index 00000000000..7a805acee14 --- /dev/null +++ b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java @@ -0,0 +1,165 @@ +package gregtech.api.mui.widget.appeng.fluid; + +import appeng.api.storage.data.IAEFluidStack; + +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.api.widget.Interactable; + +import com.cleanroommc.modularui.integration.jei.JeiGhostIngredientSlot; + +import com.cleanroommc.modularui.integration.jei.ModularUIJeiPlugin; +import com.cleanroommc.modularui.screen.ModularScreen; +import com.cleanroommc.modularui.screen.RichTooltip; + +import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; +import com.cleanroommc.modularui.theme.WidgetTheme; +import com.cleanroommc.modularui.value.sync.SyncHandler; + +import gregtech.api.mui.sync.appeng.AEFluidSyncHandler; +import gregtech.api.mui.widget.appeng.AEConfigSlot; + +import gregtech.api.util.FluidTooltipUtil; +import gregtech.api.util.TextFormattingUtil; +import gregtech.client.utils.RenderUtil; +import gregtech.common.mui.widget.GTFluidSlot; + +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.item.ItemStack; +import net.minecraftforge.fluids.FluidStack; + +import net.minecraftforge.fluids.FluidUtil; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.function.BooleanSupplier; + +public class AEFluidConfigSlot extends AEConfigSlot implements Interactable, JeiGhostIngredientSlot { + + public AEFluidConfigSlot(boolean isStocking, BooleanSupplier isAutoPull) { + super(isStocking, isAutoPull); + tooltipAutoUpdate(true); + } + + @Override + public void onInit() { + super.onInit(); + getContext().getJeiSettings().addJeiGhostIngredientSlot(this); + } + + @Override + protected void buildTooltip(@NotNull RichTooltip tooltip) { + IAEFluidStack config = getSyncHandler().getConfig(); + if (config == null) { + super.buildTooltip(tooltip); + } else { + FluidStack stack = config.getFluidStack(); + tooltip.addLine(IKey.str(stack.getLocalizedName())); + tooltip.addLine(IKey.str("%,d L", stack.amount)); + + for (String fluidTooltip : FluidTooltipUtil.getFluidTooltip(stack)) { + if (fluidTooltip.isEmpty()) continue; + tooltip.addLine(IKey.str(fluidTooltip)); + } + + GTFluidSlot.addIngotMolFluidTooltip(stack, tooltip); + } + } + + @Override + public @NotNull AEFluidSyncHandler getSyncHandler() { + return (AEFluidSyncHandler) super.getSyncHandler(); + } + + @Override + public boolean isValidSyncHandler(SyncHandler syncHandler) { + return syncHandler instanceof AEFluidSyncHandler; + } + + @Override + public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { + IAEFluidStack config = getSyncHandler().getConfig(); + if (config != null) { + FluidStack stack = config.getFluidStack(); + RenderUtil.drawFluidForGui(stack, stack.amount, 1, 1, 17, 17); + + if (!isStocking) { + String amount = TextFormattingUtil.formatLongToCompactString(stack.amount, 4); + RenderUtil.renderTextFixedCorner(amount, 17d, 18d, 0xFFFFFF, true, 0.5f); + } + } + + // TODO: replace with RenderUtil.handleJeiGhostHighlight(this); when 2812 merges (thx ghz) + if (ModularUIJeiPlugin.hasDraggingGhostIngredient() || ModularUIJeiPlugin.hoveringOverIngredient(this)) { + GlStateManager.colorMask(true, true, true, false); + drawHighlight(getArea(), isHovering()); + GlStateManager.colorMask(true, true, true, true); + } + } + + @Override + public @NotNull Result onMousePressed(int mouseButton) { + + if (isAutoPull.getAsBoolean()) return Result.IGNORE; + + if (mouseButton == 1) { + // Right click to clear + getSyncHandler().clearConfig(); + return Result.SUCCESS; + } else if (mouseButton == 0) { + ItemStack heldItem = getSyncHandler().getSyncManager().getCursorItem(); + FluidStack heldFluid = FluidUtil.getFluidContained(heldItem); + + if (heldFluid != null) { + getSyncHandler().setConfig(heldFluid); + } + + return Result.SUCCESS; + } + + return Result.IGNORE; + } + + @Override + public boolean onMouseScroll(ModularScreen.UpOrDown scrollDirection, int scrollAmount) { + if (getSyncHandler().getConfig() == null || isStocking) return false; + + long newStackSize = getSyncHandler().getConfigAmount(); + + if (Interactable.hasControlDown()) { + switch (scrollDirection) { + case UP -> newStackSize *= 2; + case DOWN -> newStackSize /= 2; + } + } else { + switch (scrollDirection) { + case UP -> newStackSize += 1; + case DOWN -> newStackSize -= 1; + } + } + + if (newStackSize > 0 && newStackSize < Integer.MAX_VALUE + 1L) { + int scaledStackSize = (int) newStackSize; + getSyncHandler().setConfigAmount(scaledStackSize); + return true; + } + + return false; + } + + @Override + public void setGhostIngredient(@NotNull FluidStack ingredient) { + getSyncHandler().setConfig(ingredient); + } + + @Override + public @Nullable FluidStack castGhostIngredientIfValid(@NotNull Object ingredient) { + return !isAutoPull.getAsBoolean() && ingredient instanceof FluidStack stack ? stack : null; + } + + @Override + public @Nullable Object getIngredient() { + IAEFluidStack config = getSyncHandler().getConfig(); + return config == null ? null : config.getFluidStack(); + } +} diff --git a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidDisplaySlot.java b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidDisplaySlot.java index fc855a39467..e5628ff5ec4 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidDisplaySlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidDisplaySlot.java @@ -3,6 +3,8 @@ import appeng.api.storage.data.IAEFluidStack; import appeng.api.storage.data.IAEItemStack; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.api.widget.Interactable; import com.cleanroommc.modularui.screen.RichTooltip; import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; @@ -12,9 +14,12 @@ import gregtech.api.mui.sync.appeng.AEFluidSyncHandler; import gregtech.api.mui.widget.appeng.AEDisplaySlot; +import gregtech.api.util.FluidTooltipUtil; import gregtech.api.util.TextFormattingUtil; import gregtech.client.utils.RenderUtil; +import gregtech.common.mui.widget.GTFluidSlot; + import net.minecraftforge.fluids.FluidStack; import org.jetbrains.annotations.NotNull; @@ -30,6 +35,18 @@ public AEFluidDisplaySlot() { @Override protected void buildTooltip(@NotNull RichTooltip tooltip) { IAEFluidStack stock = getSyncHandler().getStock(); + if (stock != null) { + FluidStack stack = stock.getFluidStack(); + tooltip.addLine(IKey.str(stack.getLocalizedName())); + tooltip.addLine(IKey.str("%,d L", stack.amount)); + + for (String fluidTooltip : FluidTooltipUtil.getFluidTooltip(stack)) { + if (fluidTooltip.isEmpty()) continue; + tooltip.addLine(IKey.str(fluidTooltip)); + } + + GTFluidSlot.addIngotMolFluidTooltip(stack, tooltip); + } } @Override @@ -49,7 +66,7 @@ public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { FluidStack stack = stock.getFluidStack(); RenderUtil.drawFluidForGui(stack, stack.amount, 1, 1, 17, 17); - String amount = TextFormattingUtil.formatLongToCompactString(stock.getStackSize(), 4); + String amount = TextFormattingUtil.formatLongToCompactString(stack.amount, 4); RenderUtil.renderTextFixedCorner(amount, 17d, 18d, 0xFFFFFF, true, 0.5f); } } diff --git a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java index 866e5540108..ff7904e37dc 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java @@ -38,11 +38,11 @@ public void onInit() { @Override protected void buildTooltip(@NotNull RichTooltip tooltip) { - IAEItemStack stack = getSyncHandler().getConfig(); - if (stack == null) { + IAEItemStack config = getSyncHandler().getConfig(); + if (config == null) { super.buildTooltip(tooltip); } else { - tooltip.addFromItem(stack.createItemStack()); + tooltip.addFromItem(config.createItemStack()); } } @@ -87,6 +87,7 @@ public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { if (mouseButton == 1) { // Right click to clear getSyncHandler().clearConfig(); + return Result.SUCCESS; } else if (mouseButton == 0) { // Left click to set item/change amount ItemStack heldItem = getSyncHandler().getSyncManager().getCursorItem(); @@ -94,6 +95,8 @@ public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { if (!heldItem.isEmpty()) { getSyncHandler().setConfig(heldItem); } + + return Result.SUCCESS; } return Result.SUCCESS; From 6cedd49e8ac83c8ab75b16e042ffda8c107ecfbd Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Wed, 21 May 2025 01:45:55 -0400 Subject: [PATCH 026/136] More fluid stuff, a couple fixes. Um it almost works but the rendering is wacked and the flow is missing from the main panel's children but this is a problem for tomorrow!! --- .../gregtech/api/mui/widget/EmptyWidget.java | 2 +- .../appeng/MetaTileEntityMEInputBus.java | 20 +++-- .../appeng/MetaTileEntityMEInputHatch.java | 83 +++++++++++-------- .../appeng/MetaTileEntityMEStockingBus.java | 1 + .../appeng/MetaTileEntityMEStockingHatch.java | 24 ++++-- .../appeng/slot/ExportOnlyAEFluidList.java | 1 + 6 files changed, 84 insertions(+), 47 deletions(-) diff --git a/src/main/java/gregtech/api/mui/widget/EmptyWidget.java b/src/main/java/gregtech/api/mui/widget/EmptyWidget.java index fe59063710a..80ccf58c4bc 100644 --- a/src/main/java/gregtech/api/mui/widget/EmptyWidget.java +++ b/src/main/java/gregtech/api/mui/widget/EmptyWidget.java @@ -5,7 +5,7 @@ /** * A widget that does absolutely nothing. Is currently used to take up space in a Flow in the non-stocking ME Input Bus * to be replaced by the auto pull button in the stocking ME Input Bus. - * Hopefully Ghzdude or Brachy will show a better way to do this. + * Hopefully Ghzdude or Brachy will show me a better way to do this. */ public class EmptyWidget extends Widget { diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java index 5d9a7ffc8b3..6a6c9927bfb 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java @@ -95,6 +95,10 @@ protected ExportOnlyAEItemList getAEItemHandler() { return aeItemHandler; } + public boolean isAutoPull() { + return getAEItemHandler().isAutoPull(); + } + @Override protected void initializeInventory() { super.initializeInventory(); @@ -160,8 +164,8 @@ protected void flushInventory() { for (ExportOnlyAEItemSlot aeSlot : this.getAEItemHandler().getInventory()) { IAEItemStack stock = aeSlot.getStock(); - if (stock instanceof WrappedItemStack) { - stock = ((WrappedItemStack) stock).getAEStack(); + if (stock instanceof WrappedItemStack wrappedItemStack) { + stock = wrappedItemStack.getAEStack(); } if (stock != null) { monitor.injectItems(stock, Actionable.MODULATE, this.getActionSource()); @@ -217,21 +221,21 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) I18n.format("gregtech.gui.me_network.offline")).asWidget().pos(5, 15)) .child(new Grid() .pos(7, 25) - .size(18 * 4, 18 * 4) + .size(18 * 4) .minElementMargin(0, 0) .minColWidth(18) .minRowHeight(18) - .matrix(Grid.mapToMatrix((int) Math.sqrt(CONFIG_SIZE), CONFIG_SIZE, - index -> new AEItemConfigSlot(isStocking, () -> getAEItemHandler().isAutoPull()) + .matrix(Grid.mapToMatrix((int) Math.sqrt(CONFIG_SIZE), CONFIG_SIZE, index -> + new AEItemConfigSlot(isStocking, this::isAutoPull) .syncHandler(syncHandlerName, index)))) .child(new Grid() .pos(7 + 18 * 5, 25) - .size(18 * 4, 18 * 4) + .size(18 * 4) .minElementMargin(0, 0) .minColWidth(18) .minRowHeight(18) - .matrix(Grid.mapToMatrix((int) Math.sqrt(CONFIG_SIZE), CONFIG_SIZE, - index -> new AEItemDisplaySlot() + .matrix(Grid.mapToMatrix((int) Math.sqrt(CONFIG_SIZE), CONFIG_SIZE, index -> + new AEItemDisplaySlot() .background(GTGuiTextures.SLOT_DARK) .syncHandler(syncHandlerName, index)))) .child(Flow.column() diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java index 87d19a6136e..c00ac319a72 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java @@ -1,5 +1,9 @@ package gregtech.common.metatileentities.multi.multiblockpart.appeng; +import com.cleanroommc.modularui.api.widget.IWidget; + +import com.cleanroommc.modularui.widgets.layout.Grid; + import gregtech.api.GTValues; import gregtech.api.capability.GregtechDataCodes; import gregtech.api.capability.GregtechTileCapabilities; @@ -15,6 +19,10 @@ import gregtech.api.metatileentity.multiblock.MultiblockAbility; import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuis; +import gregtech.api.mui.sync.appeng.AEFluidSyncHandler; +import gregtech.api.mui.widget.EmptyWidget; +import gregtech.api.mui.widget.appeng.fluid.AEFluidConfigSlot; +import gregtech.api.mui.widget.appeng.fluid.AEFluidDisplaySlot; import gregtech.client.renderer.texture.Textures; import gregtech.common.gui.widget.appeng.AEFluidConfigWidget; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEFluidList; @@ -78,6 +86,10 @@ protected ExportOnlyAEFluidList getAEFluidHandler() { return aeFluidHandler; } + public boolean isAutoPull() { + return getAEFluidHandler().isAutoPull(); + } + @Override protected void initializeInventory() { getAEFluidHandler(); // initialize it @@ -138,8 +150,8 @@ protected void flushInventory() { for (ExportOnlyAEFluidSlot aeTank : this.getAEFluidHandler().getInventory()) { IAEFluidStack stock = aeTank.getStock(); - if (stock instanceof WrappedFluidStack) { - stock = ((WrappedFluidStack) stock).getAEStack(); + if (stock instanceof WrappedFluidStack wrappedFluidStack) { + stock = wrappedFluidStack.getAEStack(); } if (stock != null) { monitor.injectItems(stock, Actionable.MODULATE, this.getActionSource()); @@ -159,46 +171,51 @@ public boolean usesMui2() { @Override public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) { + final String syncHandlerName = "aeSlot"; + final boolean isStocking = getAEFluidHandler().isStocking(); + for (int index = 0; index < CONFIG_SIZE; index++) { + guiSyncManager.syncValue(syncHandlerName, index, new AEFluidSyncHandler(getAEFluidHandler().getInventory()[index])); + } + return GTGuis.createPanel(this, 176, 18 + 18 * 4 + 94) .child(IKey.lang(getMetaFullName()).asWidget().pos(5, 5)) .child(SlotGroupWidget.playerInventory().left(7).bottom(7)) .child(IKey.dynamic(() -> isOnline() ? I18n.format("gregtech.gui.me_network.online") : I18n.format("gregtech.gui.me_network.offline")).asWidget().pos(5, 15)) + .child(new Grid() + .pos(7, 25) + .size(18 * 4) + .minElementMargin(0, 0) + .minColWidth(18) + .minRowHeight(18) + .matrix(Grid.mapToMatrix((int) Math.sqrt(CONFIG_SIZE), CONFIG_SIZE, index -> + new AEFluidConfigSlot(isStocking, this::isAutoPull) + .syncHandler(syncHandlerName, index) + ))) + .child(new Grid() + .pos(7 + 18 * 5, 25) + .size(18 * 4) + .minElementMargin(0, 0) + .minColWidth(18) + .minRowHeight(18) + .matrix(Grid.mapToMatrix((int) Math.sqrt(CONFIG_SIZE), CONFIG_SIZE, index -> + new AEFluidDisplaySlot() + .background(GTGuiTextures.SLOT_DARK) + .syncHandler(syncHandlerName, index) + )) .child(Flow.column() - .pos(7 + 18 * 4, 25 + 18) + .pos(7 + 18 * 4, 25) .size(18, 18 * 4) - .child(GTGuiTextures.ARROW_DOUBLE.asWidget())); - } - - @Override - protected final ModularUI createUI(EntityPlayer player) { - ModularUI.Builder builder = createUITemplate(player); - return builder.build(this.getHolder(), player); + .child(getExtraButton()) + .child(GTGuiTextures.ARROW_DOUBLE.asWidget()) + .child(new EmptyWidget() + .size(18)) + .child(GTGuiTextures.getLogo(getUITheme()).asWidget()))); } - protected ModularUI.Builder createUITemplate(EntityPlayer player) { - ModularUI.Builder builder = ModularUI - .builder(GuiTextures.BACKGROUND, 176, 18 + 18 * 4 + 94) - .label(10, 5, getMetaFullName()); - // ME Network status - builder.dynamicLabel(10, 15, () -> isOnline() ? - I18n.format("gregtech.gui.me_network.online") : - I18n.format("gregtech.gui.me_network.offline"), - 0x404040); - - // Config slots - builder.widget(new AEFluidConfigWidget(7, 25, this.getAEFluidHandler())); - - // Arrow image - builder.image(7 + 18 * 4, 25 + 18, 18, 18, GuiTextures.ARROW_DOUBLE); - - // GT Logo, cause there's some free real estate - builder.widget(new ImageWidget(7 + 18 * 4, 25 + 18 * 3, 17, 17, - GTValues.XMAS.get() ? GuiTextures.GREGTECH_LOGO_XMAS : GuiTextures.GREGTECH_LOGO) - .setIgnoreColor(true)); - - builder.bindPlayerInventory(player.inventory, GuiTextures.SLOT, 7, 18 + 18 * 4 + 12); - return builder; + protected IWidget getExtraButton() { + return new EmptyWidget() + .size(18); } @Override diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java index b6658da2874..386f5f55a2c 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java @@ -436,6 +436,7 @@ protected void createInventory(MetaTileEntity holder) { } for (ExportOnlyAEItemSlot slot : this.inventory) { slot.setTrigger(this::onContentsChanged); + slot.setDirtyNotifier(holder::markDirty); } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java index e2b00d6f5e4..b2ea814bcf3 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java @@ -1,5 +1,11 @@ package gregtech.common.metatileentities.multi.multiblockpart.appeng; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.api.widget.IWidget; + +import com.cleanroommc.modularui.value.sync.BooleanSyncValue; +import com.cleanroommc.modularui.widgets.ToggleButton; + import gregtech.api.GTValues; import gregtech.api.gui.GuiTextures; import gregtech.api.gui.ModularUI; @@ -8,6 +14,7 @@ import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.metatileentity.multiblock.MultiblockAbility; import gregtech.api.metatileentity.multiblock.MultiblockControllerBase; +import gregtech.api.mui.GTGuiTextures; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEFluidList; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEFluidSlot; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.IConfigurableSlot; @@ -223,11 +230,17 @@ public void receiveCustomData(int dataId, PacketBuffer buf) { } @Override - protected ModularUI.Builder createUITemplate(EntityPlayer player) { - ModularUI.Builder builder = super.createUITemplate(player); - builder.widget(new ImageCycleButtonWidget(7 + 18 * 4 + 1, 26, 16, 16, GuiTextures.BUTTON_AUTO_PULL, - () -> autoPull, this::setAutoPull).setTooltipHoverString("gregtech.gui.me_bus.auto_pull_button")); - return builder; + protected IWidget getExtraButton() { + BooleanSyncValue autoPullSync = new BooleanSyncValue(() -> autoPull, this::setAutoPull); + + return new ToggleButton() + .size(18) + .value(autoPullSync) + .disableHoverBackground() + .overlay(false, GTGuiTextures.AUTO_PULL[0]) + .overlay(true, GTGuiTextures.AUTO_PULL[1]) + .addTooltip(false, IKey.lang("gregtech.machine.me.stocking_auto_pull_disabled")) + .addTooltip(true, IKey.lang("gregtech.machine.me.stocking_auto_pull_enabled")); } @Override @@ -385,6 +398,7 @@ protected void createInventory(MetaTileEntity holder, MetaTileEntity entityToNot this.inventory = new ExportOnlyAEStockingFluidSlot[size]; for (int i = 0; i < size; i++) { this.inventory[i] = new ExportOnlyAEStockingFluidSlot(stocking, entityToNotify); + this.inventory[i].setDirtyNotifier(holder::markDirty); } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEFluidList.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEFluidList.java index fd4b40ea7e5..1c5af969d5b 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEFluidList.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEFluidList.java @@ -20,6 +20,7 @@ protected void createInventory(MetaTileEntity holder, MetaTileEntity entityToNot this.inventory = new ExportOnlyAEFluidSlot[size]; for (int i = 0; i < size; i++) { this.inventory[i] = new ExportOnlyAEFluidSlot(holder, entityToNotify); + this.inventory[i].setDirtyNotifier(holder::markDirty); } } From dae9d074872d70dc7ada74fe64f8a084d5fa9406 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Wed, 21 May 2025 11:26:10 -0400 Subject: [PATCH 027/136] wowie spotless --- .../mui/sync/appeng/AEFluidSyncHandler.java | 7 +-- .../api/mui/widget/appeng/AEConfigSlot.java | 12 +++--- .../appeng/fluid/AEFluidConfigSlot.java | 31 ++++++------- .../appeng/fluid/AEFluidDisplaySlot.java | 19 +++----- .../java/gregtech/api/util/NetworkUtil.java | 12 ++++-- .../appeng/MetaTileEntityMEInputBus.java | 11 +++-- .../appeng/MetaTileEntityMEInputHatch.java | 43 ++++++++----------- .../appeng/MetaTileEntityMEStockingBus.java | 10 ++--- .../appeng/MetaTileEntityMEStockingHatch.java | 13 ++---- .../appeng/stack/WrappedFluidStack.java | 8 +--- 10 files changed, 65 insertions(+), 101 deletions(-) diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java index c603eac32d6..791ab4809b8 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java @@ -1,17 +1,14 @@ package gregtech.api.mui.sync.appeng; -import appeng.api.storage.data.IAEFluidStack; - import gregtech.api.util.NetworkUtil; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEFluidSlot; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.IConfigurableSlot; - import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedFluidStack; -import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.PacketBuffer; import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fml.common.network.ByteBufUtils; + +import appeng.api.storage.data.IAEFluidStack; import java.io.IOException; diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java index a9bba10a5e3..717949d1220 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java @@ -1,16 +1,13 @@ package gregtech.api.mui.widget.appeng; +import gregtech.api.mui.GTGuiTextures; + import appeng.api.storage.data.IAEStack; -import com.cleanroommc.modularui.api.ITheme; import com.cleanroommc.modularui.api.drawable.IDrawable; import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.integration.jei.JeiIngredientProvider; import com.cleanroommc.modularui.screen.RichTooltip; -import com.cleanroommc.modularui.theme.WidgetTheme; import com.cleanroommc.modularui.widget.Widget; - -import gregtech.api.mui.GTGuiTextures; - import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -23,7 +20,8 @@ public abstract class AEConfigSlot> extends Widget implements Interactable, JeiGhostIngredientSlot { +public class AEFluidConfigSlot extends AEConfigSlot + implements Interactable, JeiGhostIngredientSlot { public AEFluidConfigSlot(boolean isStocking, BooleanSupplier isAutoPull) { super(isStocking, isAutoPull); @@ -99,7 +93,6 @@ public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { @Override public @NotNull Result onMousePressed(int mouseButton) { - if (isAutoPull.getAsBoolean()) return Result.IGNORE; if (mouseButton == 1) { diff --git a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidDisplaySlot.java b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidDisplaySlot.java index e5628ff5ec4..7b87c7e24a0 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidDisplaySlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidDisplaySlot.java @@ -1,27 +1,20 @@ package gregtech.api.mui.widget.appeng.fluid; -import appeng.api.storage.data.IAEFluidStack; - -import appeng.api.storage.data.IAEItemStack; -import com.cleanroommc.modularui.api.drawable.IKey; -import com.cleanroommc.modularui.api.widget.Interactable; -import com.cleanroommc.modularui.screen.RichTooltip; - -import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; -import com.cleanroommc.modularui.theme.WidgetTheme; -import com.cleanroommc.modularui.value.sync.SyncHandler; - import gregtech.api.mui.sync.appeng.AEFluidSyncHandler; import gregtech.api.mui.widget.appeng.AEDisplaySlot; - import gregtech.api.util.FluidTooltipUtil; import gregtech.api.util.TextFormattingUtil; import gregtech.client.utils.RenderUtil; - import gregtech.common.mui.widget.GTFluidSlot; import net.minecraftforge.fluids.FluidStack; +import appeng.api.storage.data.IAEFluidStack; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.screen.RichTooltip; +import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; +import com.cleanroommc.modularui.theme.WidgetTheme; +import com.cleanroommc.modularui.value.sync.SyncHandler; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/gregtech/api/util/NetworkUtil.java b/src/main/java/gregtech/api/util/NetworkUtil.java index 29316a2b69a..aee5904a890 100644 --- a/src/main/java/gregtech/api/util/NetworkUtil.java +++ b/src/main/java/gregtech/api/util/NetworkUtil.java @@ -1,11 +1,10 @@ package gregtech.api.util; -import io.netty.buffer.ByteBuf; - import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.PacketBuffer; import net.minecraftforge.fluids.FluidStack; +import io.netty.buffer.ByteBuf; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -15,7 +14,8 @@ public class NetworkUtil { /** * Write the NBT of a {@link FluidStack} to a {@link PacketBuffer}. - * @param to the buffer to write to + * + * @param to the buffer to write to * @param stack the stack to write */ public static void writeFluidStack(@NotNull PacketBuffer to, @NotNull FluidStack stack) { @@ -23,9 +23,11 @@ public static void writeFluidStack(@NotNull PacketBuffer to, @NotNull FluidStack stack.writeToNBT(tag); to.writeCompoundTag(tag); } + /** * {@link #writeFluidStack(PacketBuffer, FluidStack)} but with a netty {@link ByteBuf} - * @param to the buffer to write to + * + * @param to the buffer to write to * @param stack the stack to write */ public static void writeFluidStack(@NotNull ByteBuf to, @NotNull FluidStack stack) { @@ -34,6 +36,7 @@ public static void writeFluidStack(@NotNull ByteBuf to, @NotNull FluidStack stac /** * Read a {@link FluidStack} from a {@link PacketBuffer} + * * @param from the packet buffer to read from * @return the decoded fluid stack */ @@ -50,6 +53,7 @@ public static void writeFluidStack(@NotNull ByteBuf to, @NotNull FluidStack stac /** * {@link #readFluidStack(PacketBuffer)} but with a netty {@link ByteBuf} + * * @param from the packet buffer to read from * @return the decoded fluid stack */ diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java index 6a6c9927bfb..e575bc953d9 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java @@ -1,7 +1,5 @@ package gregtech.common.metatileentities.multi.multiblockpart.appeng; -import com.cleanroommc.modularui.api.widget.IWidget; - import gregtech.api.GTValues; import gregtech.api.capability.GregtechDataCodes; import gregtech.api.capability.GregtechTileCapabilities; @@ -53,6 +51,7 @@ import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.api.widget.IWidget; import com.cleanroommc.modularui.factory.PosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.value.sync.PanelSyncManager; @@ -225,8 +224,8 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) .minElementMargin(0, 0) .minColWidth(18) .minRowHeight(18) - .matrix(Grid.mapToMatrix((int) Math.sqrt(CONFIG_SIZE), CONFIG_SIZE, index -> - new AEItemConfigSlot(isStocking, this::isAutoPull) + .matrix(Grid.mapToMatrix((int) Math.sqrt(CONFIG_SIZE), CONFIG_SIZE, + index -> new AEItemConfigSlot(isStocking, this::isAutoPull) .syncHandler(syncHandlerName, index)))) .child(new Grid() .pos(7 + 18 * 5, 25) @@ -234,8 +233,8 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) .minElementMargin(0, 0) .minColWidth(18) .minRowHeight(18) - .matrix(Grid.mapToMatrix((int) Math.sqrt(CONFIG_SIZE), CONFIG_SIZE, index -> - new AEItemDisplaySlot() + .matrix(Grid.mapToMatrix((int) Math.sqrt(CONFIG_SIZE), CONFIG_SIZE, + index -> new AEItemDisplaySlot() .background(GTGuiTextures.SLOT_DARK) .syncHandler(syncHandlerName, index)))) .child(Flow.column() diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java index c00ac319a72..ac20119bdf0 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java @@ -1,17 +1,10 @@ package gregtech.common.metatileentities.multi.multiblockpart.appeng; -import com.cleanroommc.modularui.api.widget.IWidget; - -import com.cleanroommc.modularui.widgets.layout.Grid; - import gregtech.api.GTValues; import gregtech.api.capability.GregtechDataCodes; import gregtech.api.capability.GregtechTileCapabilities; import gregtech.api.capability.IDataStickIntractable; import gregtech.api.capability.impl.FluidTankList; -import gregtech.api.gui.GuiTextures; -import gregtech.api.gui.ModularUI; -import gregtech.api.gui.widgets.ImageWidget; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.metatileentity.multiblock.AbilityInstances; @@ -24,7 +17,6 @@ import gregtech.api.mui.widget.appeng.fluid.AEFluidConfigSlot; import gregtech.api.mui.widget.appeng.fluid.AEFluidDisplaySlot; import gregtech.client.renderer.texture.Textures; -import gregtech.common.gui.widget.appeng.AEFluidConfigWidget; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEFluidList; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEFluidSlot; import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedFluidStack; @@ -51,11 +43,13 @@ import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.api.widget.IWidget; import com.cleanroommc.modularui.factory.PosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.widgets.SlotGroupWidget; import com.cleanroommc.modularui.widgets.layout.Flow; +import com.cleanroommc.modularui.widgets.layout.Grid; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -174,7 +168,8 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) final String syncHandlerName = "aeSlot"; final boolean isStocking = getAEFluidHandler().isStocking(); for (int index = 0; index < CONFIG_SIZE; index++) { - guiSyncManager.syncValue(syncHandlerName, index, new AEFluidSyncHandler(getAEFluidHandler().getInventory()[index])); + guiSyncManager.syncValue(syncHandlerName, index, + new AEFluidSyncHandler(getAEFluidHandler().getInventory()[index])); } return GTGuis.createPanel(this, 176, 18 + 18 * 4 + 94) @@ -188,29 +183,27 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) .minElementMargin(0, 0) .minColWidth(18) .minRowHeight(18) - .matrix(Grid.mapToMatrix((int) Math.sqrt(CONFIG_SIZE), CONFIG_SIZE, index -> - new AEFluidConfigSlot(isStocking, this::isAutoPull) - .syncHandler(syncHandlerName, index) - ))) + .matrix(Grid.mapToMatrix((int) Math.sqrt(CONFIG_SIZE), CONFIG_SIZE, + index -> new AEFluidConfigSlot(isStocking, this::isAutoPull) + .syncHandler(syncHandlerName, index)))) .child(new Grid() .pos(7 + 18 * 5, 25) .size(18 * 4) .minElementMargin(0, 0) .minColWidth(18) .minRowHeight(18) - .matrix(Grid.mapToMatrix((int) Math.sqrt(CONFIG_SIZE), CONFIG_SIZE, index -> - new AEFluidDisplaySlot() + .matrix(Grid.mapToMatrix((int) Math.sqrt(CONFIG_SIZE), CONFIG_SIZE, + index -> new AEFluidDisplaySlot() .background(GTGuiTextures.SLOT_DARK) - .syncHandler(syncHandlerName, index) - )) - .child(Flow.column() - .pos(7 + 18 * 4, 25) - .size(18, 18 * 4) - .child(getExtraButton()) - .child(GTGuiTextures.ARROW_DOUBLE.asWidget()) - .child(new EmptyWidget() - .size(18)) - .child(GTGuiTextures.getLogo(getUITheme()).asWidget()))); + .syncHandler(syncHandlerName, index))) + .child(Flow.column() + .pos(7 + 18 * 4, 25) + .size(18, 18 * 4) + .child(getExtraButton()) + .child(GTGuiTextures.ARROW_DOUBLE.asWidget()) + .child(new EmptyWidget() + .size(18)) + .child(GTGuiTextures.getLogo(getUITheme()).asWidget()))); } protected IWidget getExtraButton() { diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java index 386f5f55a2c..deae9e4688f 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java @@ -1,11 +1,5 @@ package gregtech.common.metatileentities.multi.multiblockpart.appeng; -import com.cleanroommc.modularui.api.drawable.IKey; -import com.cleanroommc.modularui.api.widget.IWidget; - -import com.cleanroommc.modularui.value.sync.BooleanSyncValue; -import com.cleanroommc.modularui.widgets.ToggleButton; - import gregtech.api.GTValues; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; @@ -34,6 +28,10 @@ import appeng.api.storage.data.IAEItemStack; import appeng.api.storage.data.IItemList; import codechicken.lib.raytracer.CuboidRayTraceResult; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.api.widget.IWidget; +import com.cleanroommc.modularui.value.sync.BooleanSyncValue; +import com.cleanroommc.modularui.widgets.ToggleButton; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java index b2ea814bcf3..a05179bd1f2 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java @@ -1,15 +1,6 @@ package gregtech.common.metatileentities.multi.multiblockpart.appeng; -import com.cleanroommc.modularui.api.drawable.IKey; -import com.cleanroommc.modularui.api.widget.IWidget; - -import com.cleanroommc.modularui.value.sync.BooleanSyncValue; -import com.cleanroommc.modularui.widgets.ToggleButton; - import gregtech.api.GTValues; -import gregtech.api.gui.GuiTextures; -import gregtech.api.gui.ModularUI; -import gregtech.api.gui.widgets.ImageCycleButtonWidget; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.metatileentity.multiblock.MultiblockAbility; @@ -37,6 +28,10 @@ import appeng.api.storage.data.IAEFluidStack; import appeng.api.storage.data.IItemList; import codechicken.lib.raytracer.CuboidRayTraceResult; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.api.widget.IWidget; +import com.cleanroommc.modularui.value.sync.BooleanSyncValue; +import com.cleanroommc.modularui.widgets.ToggleButton; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedFluidStack.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedFluidStack.java index 5b36435ea4c..765c39bee6c 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedFluidStack.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedFluidStack.java @@ -5,8 +5,8 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.fluids.Fluid; -import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fml.common.network.ByteBufUtils; import appeng.api.AEApi; import appeng.api.config.FuzzyMode; @@ -15,14 +15,8 @@ import appeng.api.storage.data.IAEFluidStack; import appeng.fluids.util.AEFluidStack; import io.netty.buffer.ByteBuf; - -import net.minecraftforge.fml.common.network.ByteBufUtils; - import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.nio.charset.StandardCharsets; /** * @Author GlodBlock From 9814db3dbdd2d371f7d7fcc6acbe61bf3a91765d Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Wed, 21 May 2025 16:11:34 -0400 Subject: [PATCH 028/136] Fix wrong child ordering in fluid hatch --- .../appeng/MetaTileEntityMEInputHatch.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java index ac20119bdf0..91d9136c80a 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java @@ -195,15 +195,15 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) .matrix(Grid.mapToMatrix((int) Math.sqrt(CONFIG_SIZE), CONFIG_SIZE, index -> new AEFluidDisplaySlot() .background(GTGuiTextures.SLOT_DARK) - .syncHandler(syncHandlerName, index))) - .child(Flow.column() - .pos(7 + 18 * 4, 25) - .size(18, 18 * 4) - .child(getExtraButton()) - .child(GTGuiTextures.ARROW_DOUBLE.asWidget()) - .child(new EmptyWidget() - .size(18)) - .child(GTGuiTextures.getLogo(getUITheme()).asWidget()))); + .syncHandler(syncHandlerName, index)))) + .child(Flow.column() + .pos(7 + 18 * 4, 25) + .size(18, 18 * 4) + .child(getExtraButton()) + .child(GTGuiTextures.ARROW_DOUBLE.asWidget()) + .child(new EmptyWidget() + .size(18)) + .child(GTGuiTextures.getLogo(getUITheme()).asWidget())); } protected IWidget getExtraButton() { From 4b47b314f6caa97a3bdf2ffce9d132930948b731 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Wed, 21 May 2025 16:11:42 -0400 Subject: [PATCH 029/136] Slot hover overlay --- .../api/mui/widget/appeng/AEConfigSlot.java | 20 +++++++++++++++++++ .../api/mui/widget/appeng/AEDisplaySlot.java | 20 +++++++++++++++++++ .../appeng/fluid/AEFluidConfigSlot.java | 2 ++ .../appeng/fluid/AEFluidDisplaySlot.java | 4 ++++ .../widget/appeng/item/AEItemConfigSlot.java | 2 ++ .../widget/appeng/item/AEItemDisplaySlot.java | 4 ++++ 6 files changed, 52 insertions(+) diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java index 717949d1220..f3421bfe58e 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java @@ -2,11 +2,17 @@ import gregtech.api.mui.GTGuiTextures; +import net.minecraft.client.renderer.GlStateManager; + import appeng.api.storage.data.IAEStack; +import com.cleanroommc.modularui.api.ITheme; import com.cleanroommc.modularui.api.drawable.IDrawable; import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.drawable.GuiDraw; import com.cleanroommc.modularui.integration.jei.JeiIngredientProvider; import com.cleanroommc.modularui.screen.RichTooltip; +import com.cleanroommc.modularui.theme.WidgetSlotTheme; +import com.cleanroommc.modularui.theme.WidgetTheme; import com.cleanroommc.modularui.widget.Widget; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -46,6 +52,20 @@ protected void buildTooltip(@NotNull RichTooltip tooltip) { tooltip.addLine(IKey.lang("gregtech.gui.config_slot.remove")); } + protected void drawSlotOverlay() { + GlStateManager.colorMask(true, true, true, false); + GuiDraw.drawRect(1, 1, 16, 16, getSlotHoverColor()); + GlStateManager.colorMask(true, true, true, true); + } + + public int getSlotHoverColor() { + WidgetTheme theme = getWidgetTheme(getContext().getTheme()); + if (theme instanceof WidgetSlotTheme slotTheme) { + return slotTheme.getSlotHoverColor(); + } + return ITheme.getDefault().getItemSlotTheme().getSlotHoverColor(); + } + @Override public @Nullable IDrawable getBackground() { return isAutoPull.getAsBoolean() ? autoPullBackground : normalBackground; diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEDisplaySlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEDisplaySlot.java index 539d82d24f3..32d8d930d41 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEDisplaySlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEDisplaySlot.java @@ -1,8 +1,14 @@ package gregtech.api.mui.widget.appeng; +import net.minecraft.client.renderer.GlStateManager; + import appeng.api.storage.data.IAEStack; +import com.cleanroommc.modularui.api.ITheme; +import com.cleanroommc.modularui.drawable.GuiDraw; import com.cleanroommc.modularui.integration.jei.JeiIngredientProvider; import com.cleanroommc.modularui.screen.RichTooltip; +import com.cleanroommc.modularui.theme.WidgetSlotTheme; +import com.cleanroommc.modularui.theme.WidgetTheme; import com.cleanroommc.modularui.widget.Widget; import org.jetbrains.annotations.NotNull; @@ -20,4 +26,18 @@ public void onInit() { } protected void buildTooltip(@NotNull RichTooltip tooltip) {} + + protected void drawSlotOverlay() { + GlStateManager.colorMask(true, true, true, false); + GuiDraw.drawRect(1, 1, 16, 16, getSlotHoverColor()); + GlStateManager.colorMask(true, true, true, true); + } + + public int getSlotHoverColor() { + WidgetTheme theme = getWidgetTheme(getContext().getTheme()); + if (theme instanceof WidgetSlotTheme slotTheme) { + return slotTheme.getSlotHoverColor(); + } + return ITheme.getDefault().getItemSlotTheme().getSlotHoverColor(); + } } diff --git a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java index 390d1cf98c4..7c03158c303 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java @@ -88,6 +88,8 @@ public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { GlStateManager.colorMask(true, true, true, false); drawHighlight(getArea(), isHovering()); GlStateManager.colorMask(true, true, true, true); + } else if (isHovering()) { + drawSlotOverlay(); } } diff --git a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidDisplaySlot.java b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidDisplaySlot.java index 7b87c7e24a0..efe1d69575b 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidDisplaySlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidDisplaySlot.java @@ -62,6 +62,10 @@ public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { String amount = TextFormattingUtil.formatLongToCompactString(stack.amount, 4); RenderUtil.renderTextFixedCorner(amount, 17d, 18d, 0xFFFFFF, true, 0.5f); } + + if (isHovering()) { + drawSlotOverlay(); + } } @Override diff --git a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java index ff7904e37dc..79e86feb93a 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java @@ -77,6 +77,8 @@ public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { GlStateManager.colorMask(true, true, true, false); drawHighlight(getArea(), isHovering()); GlStateManager.colorMask(true, true, true, true); + } else if (isHovering()) { + drawSlotOverlay(); } } diff --git a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemDisplaySlot.java b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemDisplaySlot.java index d62bcf87926..0b39289a75d 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemDisplaySlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemDisplaySlot.java @@ -53,6 +53,10 @@ public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { String amount = TextFormattingUtil.formatLongToCompactString(stock.getStackSize(), 4); RenderUtil.renderTextFixedCorner(amount, 17d, 18d, 0xFFFFFF, true, 0.5f); } + + if (isHovering()) { + drawSlotOverlay(); + } } @Override From 07c000a2aacad6442896770c0ae142aa77495cab Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Wed, 21 May 2025 16:34:39 -0400 Subject: [PATCH 030/136] Fix stocking auto pull button size --- .../multiblockpart/appeng/MetaTileEntityMEStockingBus.java | 2 +- .../multiblockpart/appeng/MetaTileEntityMEStockingHatch.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java index deae9e4688f..6c3f90cc38c 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java @@ -264,7 +264,7 @@ protected IWidget getExtraButton() { BooleanSyncValue autoPullSync = new BooleanSyncValue(() -> autoPull, this::setAutoPull); return new ToggleButton() - .size(18) + .size(16) .value(autoPullSync) .disableHoverBackground() .overlay(false, GTGuiTextures.AUTO_PULL[0]) diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java index a05179bd1f2..808ebfe4bce 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java @@ -229,7 +229,7 @@ protected IWidget getExtraButton() { BooleanSyncValue autoPullSync = new BooleanSyncValue(() -> autoPull, this::setAutoPull); return new ToggleButton() - .size(18) + .size(16) .value(autoPullSync) .disableHoverBackground() .overlay(false, GTGuiTextures.AUTO_PULL[0]) From 00f65fe4ac13ba5d672e8b95884542320bc25724 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Wed, 21 May 2025 16:59:59 -0400 Subject: [PATCH 031/136] Proper spacing on the center widgets --- .../multiblockpart/appeng/MetaTileEntityMEInputBus.java | 4 ++-- .../multiblockpart/appeng/MetaTileEntityMEInputHatch.java | 4 ++-- .../multiblockpart/appeng/MetaTileEntityMEStockingBus.java | 5 +++-- .../multiblockpart/appeng/MetaTileEntityMEStockingHatch.java | 5 +++-- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java index e575bc953d9..6fe478051fd 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java @@ -51,11 +51,11 @@ import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; import com.cleanroommc.modularui.api.drawable.IKey; -import com.cleanroommc.modularui.api.widget.IWidget; import com.cleanroommc.modularui.factory.PosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.value.sync.SyncHandlers; +import com.cleanroommc.modularui.widget.Widget; import com.cleanroommc.modularui.widgets.ItemSlot; import com.cleanroommc.modularui.widgets.SlotGroupWidget; import com.cleanroommc.modularui.widgets.layout.Flow; @@ -251,7 +251,7 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) .addTooltipLine(IKey.lang("gregtech.gui.me_bus.extra_slot")))); } - protected IWidget getExtraButton() { + protected Widget getExtraButton() { return new EmptyWidget() .size(18); } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java index 91d9136c80a..df7514a0628 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java @@ -43,10 +43,10 @@ import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; import com.cleanroommc.modularui.api.drawable.IKey; -import com.cleanroommc.modularui.api.widget.IWidget; import com.cleanroommc.modularui.factory.PosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.widget.Widget; import com.cleanroommc.modularui.widgets.SlotGroupWidget; import com.cleanroommc.modularui.widgets.layout.Flow; import com.cleanroommc.modularui.widgets.layout.Grid; @@ -206,7 +206,7 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) .child(GTGuiTextures.getLogo(getUITheme()).asWidget())); } - protected IWidget getExtraButton() { + protected Widget getExtraButton() { return new EmptyWidget() .size(18); } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java index 6c3f90cc38c..6b1ad9597d0 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java @@ -29,8 +29,8 @@ import appeng.api.storage.data.IItemList; import codechicken.lib.raytracer.CuboidRayTraceResult; import com.cleanroommc.modularui.api.drawable.IKey; -import com.cleanroommc.modularui.api.widget.IWidget; import com.cleanroommc.modularui.value.sync.BooleanSyncValue; +import com.cleanroommc.modularui.widget.Widget; import com.cleanroommc.modularui.widgets.ToggleButton; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -260,11 +260,12 @@ public void receiveCustomData(int dataId, PacketBuffer buf) { } @Override - protected IWidget getExtraButton() { + protected Widget getExtraButton() { BooleanSyncValue autoPullSync = new BooleanSyncValue(() -> autoPull, this::setAutoPull); return new ToggleButton() .size(16) + .margin(1) .value(autoPullSync) .disableHoverBackground() .overlay(false, GTGuiTextures.AUTO_PULL[0]) diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java index 808ebfe4bce..068d2fd3a4f 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java @@ -29,8 +29,8 @@ import appeng.api.storage.data.IItemList; import codechicken.lib.raytracer.CuboidRayTraceResult; import com.cleanroommc.modularui.api.drawable.IKey; -import com.cleanroommc.modularui.api.widget.IWidget; import com.cleanroommc.modularui.value.sync.BooleanSyncValue; +import com.cleanroommc.modularui.widget.Widget; import com.cleanroommc.modularui.widgets.ToggleButton; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -225,11 +225,12 @@ public void receiveCustomData(int dataId, PacketBuffer buf) { } @Override - protected IWidget getExtraButton() { + protected Widget getExtraButton() { BooleanSyncValue autoPullSync = new BooleanSyncValue(() -> autoPull, this::setAutoPull); return new ToggleButton() .size(16) + .margin(1) .value(autoPullSync) .disableHoverBackground() .overlay(false, GTGuiTextures.AUTO_PULL[0]) From 1a19ecb2a24bc0ec492e758999f5ebf26ef8d8c1 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Thu, 22 May 2025 21:38:30 -0400 Subject: [PATCH 032/136] Erm tons of sync handler changes --- .../mui/sync/appeng/AEFluidSyncHandler.java | 54 +++++++------- .../mui/sync/appeng/AEItemSyncHandler.java | 49 +++++++------ .../api/mui/sync/appeng/AESyncHandler.java | 70 ++++++++++++++++--- .../api/mui/widget/appeng/AEConfigSlot.java | 45 +++++++++++- .../appeng/fluid/AEFluidConfigSlot.java | 31 +------- .../widget/appeng/item/AEItemConfigSlot.java | 35 +--------- .../appeng/MetaTileEntityMEInputBus.java | 13 +++- .../appeng/stack/WrappedItemStack.java | 6 +- 8 files changed, 180 insertions(+), 123 deletions(-) diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java index 791ab4809b8..f4305850f8a 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java @@ -1,50 +1,54 @@ package gregtech.api.mui.sync.appeng; -import gregtech.api.util.NetworkUtil; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEFluidSlot; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.IConfigurableSlot; import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedFluidStack; import net.minecraft.network.PacketBuffer; import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import appeng.api.storage.data.IAEFluidStack; - -import java.io.IOException; +import com.cleanroommc.modularui.utils.serialization.IByteBufAdapter; +import com.cleanroommc.modularui.utils.serialization.IEquals; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; public class AEFluidSyncHandler extends AESyncHandler { public AEFluidSyncHandler(IConfigurableSlot config) { super(config); cache = new ExportOnlyAEFluidSlot(); + // TODO: when 2672 is merged, use GTByteBufAdapters.makeAdapter + byteBufAdapter = new WrappedFluidStackByteBufAdapter(); } - @Override - public void readOnClient(int id, PacketBuffer buf) throws IOException { - if (id == configSyncID) { - if (buf.readBoolean()) { - config.setConfig(WrappedFluidStack.fromPacket(buf)); - } else { - config.setConfig(null); - } - } else if (id == stockSyncID) { - if (buf.readBoolean()) { - config.setStock(WrappedFluidStack.fromPacket(buf)); + @SideOnly(Side.CLIENT) + public void setConfig(@Nullable FluidStack stack) { + setConfig(WrappedFluidStack.fromFluidStack(stack)); + } + + private static class WrappedFluidStackByteBufAdapter implements IByteBufAdapter { + + @Override + public IAEFluidStack deserialize(PacketBuffer buffer) { + return WrappedFluidStack.fromPacket(buffer); + } + + @Override + public void serialize(PacketBuffer buffer, IAEFluidStack u) { + if (u instanceof WrappedFluidStack wrapped) { + wrapped.writeToPacket(buffer); } else { - config.setConfig(null); + throw new IllegalArgumentException( + "A non wrapped IAEFluidStack was passed to the AEFluidSyncHandler ByteBufAdapter!"); } } - } - @Override - public void readOnServer(int id, PacketBuffer buf) { - super.readOnServer(id, buf); - if (id == setConfigID) { - config.setConfig(WrappedFluidStack.fromPacket(buf)); + @Override + public boolean areEqual(@NotNull IAEFluidStack t1, @NotNull IAEFluidStack t2) { + return IEquals.defaultTester().areEqual(t1, t2); } } - - public void setConfig(FluidStack stack) { - syncToServer(setConfigID, buf -> NetworkUtil.writeFluidStack(buf, stack)); - } } diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java index 1f5d706a46f..c893c0ac848 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java @@ -6,43 +6,46 @@ import net.minecraft.item.ItemStack; import net.minecraft.network.PacketBuffer; -import net.minecraftforge.fml.common.network.ByteBufUtils; import appeng.api.storage.data.IAEItemStack; +import com.cleanroommc.modularui.utils.serialization.IByteBufAdapter; +import com.cleanroommc.modularui.utils.serialization.IEquals; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; public class AEItemSyncHandler extends AESyncHandler { public AEItemSyncHandler(IConfigurableSlot config) { super(config); cache = new ExportOnlyAEItemSlot(); + // TODO: when 2672 is merged, use GTByteBufAdapters.makeAdapter + byteBufAdapter = new WrappedItemStackByteBufAdapter(); } - @Override - public void readOnClient(int id, PacketBuffer buf) { - if (id == configSyncID) { - if (buf.readBoolean()) { - config.setConfig(WrappedItemStack.fromPacket(buf)); - } else { - config.setConfig(null); - } - } else if (id == stockSyncID) { - if (buf.readBoolean()) { - config.setStock(WrappedItemStack.fromPacket(buf)); + public void setConfig(@Nullable ItemStack stack) { + setConfig(WrappedItemStack.fromItemStack(stack)); + } + + private static class WrappedItemStackByteBufAdapter implements IByteBufAdapter { + + @Override + public WrappedItemStack deserialize(PacketBuffer buffer) { + return WrappedItemStack.fromPacket(buffer); + } + + @Override + public void serialize(PacketBuffer buffer, IAEItemStack u) { + if (u instanceof WrappedItemStack wrapped) { + wrapped.writeToPacket(buffer); } else { - config.setStock(null); + throw new IllegalArgumentException( + "A non wrapped IAEItemStack was passed to the AEItemSyncHandler ByteBufAdapter!"); } } - } - @Override - public void readOnServer(int id, PacketBuffer buf) { - super.readOnServer(id, buf); - if (id == setConfigID) { - config.setConfig(WrappedItemStack.fromPacket(buf)); + @Override + public boolean areEqual(@NotNull IAEItemStack t1, @NotNull IAEItemStack t2) { + return IEquals.defaultTester().areEqual(t1, t2); } } - - public void setConfig(ItemStack stack) { - syncToServer(setConfigID, buf -> ByteBufUtils.writeTag(buf, stack.serializeNBT())); - } } diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java index 9e61a0d9e91..01f8fce8bd9 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java @@ -3,13 +3,20 @@ import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.IConfigurableSlot; import net.minecraft.network.PacketBuffer; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import appeng.api.storage.data.IAEStack; +import com.cleanroommc.modularui.utils.serialization.IByteBufAdapter; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.value.sync.SyncHandler; import org.jetbrains.annotations.Nullable; +import java.io.IOException; + public abstract class AESyncHandler> extends SyncHandler { + protected boolean onClient; private static int rollingID = 0; public static final int configSyncID = rollingID++; @@ -18,17 +25,25 @@ public abstract class AESyncHandler> extends SyncHandler { public static final int clearConfigID = rollingID++; public static final int changeConfigID = rollingID++; - protected final IConfigurableSlot config; + protected final IConfigurableSlot slot; protected IConfigurableSlot cache; - public AESyncHandler(IConfigurableSlot config) { - this.config = config; + protected IByteBufAdapter byteBufAdapter; + + public AESyncHandler(IConfigurableSlot slot) { + this.slot = slot; + } + + @Override + public void init(String key, PanelSyncManager syncManager) { + super.init(key, syncManager); + onClient = syncManager.isClient(); } @SuppressWarnings("DuplicatedCode") @Override public void detectAndSendChanges(boolean init) { - T currentConfig = config.getConfig(); + T currentConfig = slot.getConfig(); T cachedConfig = cache.getConfig(); if (!areAEStackCountEquals(currentConfig, cachedConfig)) { cache.setConfig(currentConfig == null ? null : currentConfig.copy()); @@ -43,7 +58,7 @@ public void detectAndSendChanges(boolean init) { }); } - T currentStock = config.getStock(); + T currentStock = slot.getStock(); T cachedStock = cache.getStock(); if (!areAEStackCountEquals(currentStock, cachedStock)) { cache.setStock(currentStock == null ? null : currentStock.copy()); @@ -60,37 +75,74 @@ public void detectAndSendChanges(boolean init) { } @Override - public void readOnServer(int id, PacketBuffer buf) { + public void readOnServer(int id, PacketBuffer buf) throws IOException { if (id == clearConfigID) { - config.setConfig(null); + slot.setConfig(null); } else if (id == changeConfigID) { T config = getConfig(); if (config != null) { config.setStackSize(buf.readInt()); } + } else if (id == setConfigID) { + if (buf.readBoolean()) { + slot.setConfig(byteBufAdapter.deserialize(buf)); + } else { + slot.setConfig(null); + } + } + } + + @Override + public void readOnClient(int id, PacketBuffer buf) throws IOException { + if (id == configSyncID) { + if (buf.readBoolean()) { + slot.setConfig(byteBufAdapter.deserialize(buf)); + } else { + slot.setConfig(null); + } + } else if (id == stockSyncID) { + if (buf.readBoolean()) { + slot.setStock(byteBufAdapter.deserialize(buf)); + } else { + slot.setStock(null); + } } } + @SideOnly(Side.CLIENT) public void clearConfig() { syncToServer(clearConfigID); } + @SideOnly(Side.CLIENT) + public void setConfig(@Nullable T newConfig) { + if (newConfig == null) { + syncToServer(setConfigID, buf -> buf.writeBoolean(false)); + } else { + syncToServer(setConfigID, buf -> { + buf.writeBoolean(true); + newConfig.writeToPacket(buf); + }); + } + } + @Nullable public T getConfig() { - return config.getConfig(); + return slot.getConfig(); } public long getConfigAmount() { return getConfig() == null ? 0 : getConfig().getStackSize(); } + @SideOnly(Side.CLIENT) public void setConfigAmount(int newAmount) { syncToServer(changeConfigID, buf -> buf.writeInt(newAmount)); } @Nullable public T getStock() { - return config.getStock(); + return slot.getStock(); } @SuppressWarnings("BooleanMethodIsAlwaysInverted") diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java index f3421bfe58e..a4df04fef08 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java @@ -1,6 +1,7 @@ package gregtech.api.mui.widget.appeng; import gregtech.api.mui.GTGuiTextures; +import gregtech.api.mui.sync.appeng.AESyncHandler; import net.minecraft.client.renderer.GlStateManager; @@ -8,11 +9,14 @@ import com.cleanroommc.modularui.api.ITheme; import com.cleanroommc.modularui.api.drawable.IDrawable; import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.api.widget.Interactable; import com.cleanroommc.modularui.drawable.GuiDraw; import com.cleanroommc.modularui.integration.jei.JeiIngredientProvider; +import com.cleanroommc.modularui.screen.ModularScreen; import com.cleanroommc.modularui.screen.RichTooltip; import com.cleanroommc.modularui.theme.WidgetSlotTheme; import com.cleanroommc.modularui.theme.WidgetTheme; +import com.cleanroommc.modularui.value.sync.SyncHandler; import com.cleanroommc.modularui.widget.Widget; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -20,7 +24,7 @@ import java.util.function.BooleanSupplier; public abstract class AEConfigSlot> extends Widget> - implements JeiIngredientProvider { + implements JeiIngredientProvider, Interactable { protected final boolean isStocking; protected final BooleanSupplier isAutoPull; @@ -52,6 +56,18 @@ protected void buildTooltip(@NotNull RichTooltip tooltip) { tooltip.addLine(IKey.lang("gregtech.gui.config_slot.remove")); } + @SuppressWarnings("unchecked") + @Override + public @NotNull AESyncHandler getSyncHandler() { + return (AESyncHandler) super.getSyncHandler(); + } + + @Override + public boolean isValidSyncHandler(SyncHandler syncHandler) { + return syncHandler instanceof AESyncHandler; + } + + // TODO: get rid of these two methods when 2817 merges protected void drawSlotOverlay() { GlStateManager.colorMask(true, true, true, false); GuiDraw.drawRect(1, 1, 16, 16, getSlotHoverColor()); @@ -66,6 +82,33 @@ public int getSlotHoverColor() { return ITheme.getDefault().getItemSlotTheme().getSlotHoverColor(); } + @Override + public boolean onMouseScroll(ModularScreen.UpOrDown scrollDirection, int scrollAmount) { + if (getSyncHandler().getConfig() == null || isStocking) return false; + + long newStackSize = getSyncHandler().getConfigAmount(); + + if (Interactable.hasControlDown()) { + switch (scrollDirection) { + case UP -> newStackSize *= 2; + case DOWN -> newStackSize /= 2; + } + } else { + switch (scrollDirection) { + case UP -> newStackSize += 1; + case DOWN -> newStackSize -= 1; + } + } + + if (newStackSize > 0 && newStackSize < Integer.MAX_VALUE + 1L) { + int scaledStackSize = (int) newStackSize; + getSyncHandler().setConfigAmount(scaledStackSize); + return true; + } + + return false; + } + @Override public @Nullable IDrawable getBackground() { return isAutoPull.getAsBoolean() ? autoPullBackground : normalBackground; diff --git a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java index 7c03158c303..f95f673d958 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java @@ -5,6 +5,7 @@ import gregtech.api.util.FluidTooltipUtil; import gregtech.api.util.TextFormattingUtil; import gregtech.client.utils.RenderUtil; +import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedFluidStack; import gregtech.common.mui.widget.GTFluidSlot; import net.minecraft.client.renderer.GlStateManager; @@ -17,7 +18,6 @@ import com.cleanroommc.modularui.api.widget.Interactable; import com.cleanroommc.modularui.integration.jei.JeiGhostIngredientSlot; import com.cleanroommc.modularui.integration.jei.ModularUIJeiPlugin; -import com.cleanroommc.modularui.screen.ModularScreen; import com.cleanroommc.modularui.screen.RichTooltip; import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; import com.cleanroommc.modularui.theme.WidgetTheme; @@ -106,7 +106,7 @@ public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { FluidStack heldFluid = FluidUtil.getFluidContained(heldItem); if (heldFluid != null) { - getSyncHandler().setConfig(heldFluid); + getSyncHandler().setConfig(WrappedFluidStack.fromFluidStack(heldFluid)); } return Result.SUCCESS; @@ -115,33 +115,6 @@ public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { return Result.IGNORE; } - @Override - public boolean onMouseScroll(ModularScreen.UpOrDown scrollDirection, int scrollAmount) { - if (getSyncHandler().getConfig() == null || isStocking) return false; - - long newStackSize = getSyncHandler().getConfigAmount(); - - if (Interactable.hasControlDown()) { - switch (scrollDirection) { - case UP -> newStackSize *= 2; - case DOWN -> newStackSize /= 2; - } - } else { - switch (scrollDirection) { - case UP -> newStackSize += 1; - case DOWN -> newStackSize -= 1; - } - } - - if (newStackSize > 0 && newStackSize < Integer.MAX_VALUE + 1L) { - int scaledStackSize = (int) newStackSize; - getSyncHandler().setConfigAmount(scaledStackSize); - return true; - } - - return false; - } - @Override public void setGhostIngredient(@NotNull FluidStack ingredient) { getSyncHandler().setConfig(ingredient); diff --git a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java index 79e86feb93a..5ffc8b57e54 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java @@ -4,15 +4,14 @@ import gregtech.api.mui.widget.appeng.AEConfigSlot; import gregtech.api.util.TextFormattingUtil; import gregtech.client.utils.RenderUtil; +import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedItemStack; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.item.ItemStack; import appeng.api.storage.data.IAEItemStack; -import com.cleanroommc.modularui.api.widget.Interactable; import com.cleanroommc.modularui.integration.jei.JeiGhostIngredientSlot; import com.cleanroommc.modularui.integration.jei.ModularUIJeiPlugin; -import com.cleanroommc.modularui.screen.ModularScreen; import com.cleanroommc.modularui.screen.RichTooltip; import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; import com.cleanroommc.modularui.theme.WidgetTheme; @@ -22,8 +21,7 @@ import java.util.function.BooleanSupplier; -public class AEItemConfigSlot extends AEConfigSlot implements Interactable, - JeiGhostIngredientSlot { +public class AEItemConfigSlot extends AEConfigSlot implements JeiGhostIngredientSlot { public AEItemConfigSlot(boolean isStocking, BooleanSupplier isAutoPull) { super(isStocking, isAutoPull); @@ -95,7 +93,7 @@ public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { ItemStack heldItem = getSyncHandler().getSyncManager().getCursorItem(); if (!heldItem.isEmpty()) { - getSyncHandler().setConfig(heldItem); + getSyncHandler().setConfig(WrappedItemStack.fromItemStack(heldItem)); } return Result.SUCCESS; @@ -104,33 +102,6 @@ public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { return Result.SUCCESS; } - @Override - public boolean onMouseScroll(ModularScreen.UpOrDown scrollDirection, int scrollAmount) { - if (getSyncHandler().getConfig() == null || isStocking) return false; - - long newStackSize = getSyncHandler().getConfigAmount(); - - if (Interactable.hasControlDown()) { - switch (scrollDirection) { - case UP -> newStackSize *= 2; - case DOWN -> newStackSize /= 2; - } - } else { - switch (scrollDirection) { - case UP -> newStackSize += 1; - case DOWN -> newStackSize -= 1; - } - } - - if (newStackSize > 0 && newStackSize < Integer.MAX_VALUE + 1L) { - int scaledStackSize = (int) newStackSize; - getSyncHandler().setConfigAmount(scaledStackSize); - return true; - } - - return false; - } - @Override public void setGhostIngredient(@NotNull ItemStack ingredient) { getSyncHandler().setConfig(ingredient); diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java index 6fe478051fd..fba14703f49 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java @@ -50,6 +50,7 @@ import codechicken.lib.render.CCRenderState; import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; +import com.cleanroommc.modularui.api.IPanelHandler; import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.factory.PosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; @@ -205,16 +206,20 @@ public boolean usesMui2() { @Override public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) { + ModularPanel mainPanel = GTGuis.createPanel(this, 176, 18 + 18 * 4 + 94); + final String syncHandlerName = "aeSlot"; final boolean isStocking = getAEItemHandler().isStocking(); + guiSyncManager.registerSlotGroup("extra_slot", 1); for (int index = 0; index < CONFIG_SIZE; index++) { guiSyncManager.syncValue(syncHandlerName, index, new AEItemSyncHandler(getAEItemHandler().getInventory()[index])); } - return GTGuis.createPanel(this, 176, 18 + 18 * 4 + 94) - .child(IKey.lang(getMetaFullName()).asWidget().pos(5, 5)) + IPanelHandler amountPopup = IPanelHandler.simple(mainPanel, this::createAmountPopupPanel, true); + + return mainPanel.child(IKey.lang(getMetaFullName()).asWidget().pos(5, 5)) .child(SlotGroupWidget.playerInventory().left(7).bottom(7)) .child(IKey.dynamic(() -> isOnline() ? I18n.format("gregtech.gui.me_network.online") : I18n.format("gregtech.gui.me_network.offline")).asWidget().pos(5, 15)) @@ -256,6 +261,10 @@ protected Widget getExtraButton() { .size(18); } + protected ModularPanel createAmountPopupPanel(ModularPanel mainPanel, EntityPlayer player) { + return GTGuis.createPopupPanel("amountPanel", 150, 50); + } + @Override public boolean isWorkingEnabled() { return this.workingEnabled; diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedItemStack.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedItemStack.java index 2bef4cea9fe..a8b0f5ce4f7 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedItemStack.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedItemStack.java @@ -12,6 +12,7 @@ import appeng.core.Api; import appeng.util.item.AEItemStack; import io.netty.buffer.ByteBuf; +import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -28,8 +29,9 @@ private WrappedItemStack(@NotNull ItemStack itemStack) { this.delegate = itemStack; } - @Nullable - public static WrappedItemStack fromItemStack(@NotNull ItemStack stack) { + @Contract("null -> null") + public static WrappedItemStack fromItemStack(@Nullable ItemStack stack) { + if (stack == null) return null; return stack.isEmpty() ? null : new WrappedItemStack(stack); } From 4e621c66d7f03cca4b6ce393e53d89d5c0a3be34 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Fri, 23 May 2025 11:16:10 -0400 Subject: [PATCH 033/136] Code dedup pt2 --- .../mui/sync/appeng/AEFluidSyncHandler.java | 38 +++--------- .../mui/sync/appeng/AEItemSyncHandler.java | 38 +++--------- .../api/mui/sync/appeng/AESyncHandler.java | 7 +++ .../sync/appeng/IAEStackByteBufAdapter.java | 62 +++++++++++++++++++ .../api/mui/widget/appeng/AEConfigSlot.java | 22 +++++-- .../widget/appeng/item/AEItemConfigSlot.java | 5 +- 6 files changed, 107 insertions(+), 65 deletions(-) create mode 100644 src/main/java/gregtech/api/mui/sync/appeng/IAEStackByteBufAdapter.java diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java index f4305850f8a..ae236e9128c 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java @@ -4,14 +4,12 @@ import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.IConfigurableSlot; import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedFluidStack; -import net.minecraft.network.PacketBuffer; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import appeng.api.storage.data.IAEFluidStack; import com.cleanroommc.modularui.utils.serialization.IByteBufAdapter; -import com.cleanroommc.modularui.utils.serialization.IEquals; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -19,36 +17,20 @@ public class AEFluidSyncHandler extends AESyncHandler { public AEFluidSyncHandler(IConfigurableSlot config) { super(config); - cache = new ExportOnlyAEFluidSlot(); - // TODO: when 2672 is merged, use GTByteBufAdapters.makeAdapter - byteBufAdapter = new WrappedFluidStackByteBufAdapter(); + } + + @Override + protected @NotNull IConfigurableSlot initializeCache() { + return new ExportOnlyAEFluidSlot(); + } + + @Override + protected @NotNull IByteBufAdapter initializeByteBufAdapter() { + return IAEStackByteBufAdapter.wrappedFluidStackAdapter; } @SideOnly(Side.CLIENT) public void setConfig(@Nullable FluidStack stack) { setConfig(WrappedFluidStack.fromFluidStack(stack)); } - - private static class WrappedFluidStackByteBufAdapter implements IByteBufAdapter { - - @Override - public IAEFluidStack deserialize(PacketBuffer buffer) { - return WrappedFluidStack.fromPacket(buffer); - } - - @Override - public void serialize(PacketBuffer buffer, IAEFluidStack u) { - if (u instanceof WrappedFluidStack wrapped) { - wrapped.writeToPacket(buffer); - } else { - throw new IllegalArgumentException( - "A non wrapped IAEFluidStack was passed to the AEFluidSyncHandler ByteBufAdapter!"); - } - } - - @Override - public boolean areEqual(@NotNull IAEFluidStack t1, @NotNull IAEFluidStack t2) { - return IEquals.defaultTester().areEqual(t1, t2); - } - } } diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java index c893c0ac848..bfba4e75f0e 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java @@ -5,11 +5,9 @@ import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedItemStack; import net.minecraft.item.ItemStack; -import net.minecraft.network.PacketBuffer; import appeng.api.storage.data.IAEItemStack; import com.cleanroommc.modularui.utils.serialization.IByteBufAdapter; -import com.cleanroommc.modularui.utils.serialization.IEquals; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -17,35 +15,19 @@ public class AEItemSyncHandler extends AESyncHandler { public AEItemSyncHandler(IConfigurableSlot config) { super(config); - cache = new ExportOnlyAEItemSlot(); - // TODO: when 2672 is merged, use GTByteBufAdapters.makeAdapter - byteBufAdapter = new WrappedItemStackByteBufAdapter(); } - public void setConfig(@Nullable ItemStack stack) { - setConfig(WrappedItemStack.fromItemStack(stack)); + @Override + protected @NotNull IConfigurableSlot initializeCache() { + return new ExportOnlyAEItemSlot(); + } + + @Override + protected @NotNull IByteBufAdapter initializeByteBufAdapter() { + return IAEStackByteBufAdapter.wrappedItemStackAdapter; } - private static class WrappedItemStackByteBufAdapter implements IByteBufAdapter { - - @Override - public WrappedItemStack deserialize(PacketBuffer buffer) { - return WrappedItemStack.fromPacket(buffer); - } - - @Override - public void serialize(PacketBuffer buffer, IAEItemStack u) { - if (u instanceof WrappedItemStack wrapped) { - wrapped.writeToPacket(buffer); - } else { - throw new IllegalArgumentException( - "A non wrapped IAEItemStack was passed to the AEItemSyncHandler ByteBufAdapter!"); - } - } - - @Override - public boolean areEqual(@NotNull IAEItemStack t1, @NotNull IAEItemStack t2) { - return IEquals.defaultTester().areEqual(t1, t2); - } + public void setConfig(@Nullable ItemStack stack) { + setConfig(WrappedItemStack.fromItemStack(stack)); } } diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java index 01f8fce8bd9..6c4cc0c8e10 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java @@ -10,6 +10,7 @@ import com.cleanroommc.modularui.utils.serialization.IByteBufAdapter; import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.value.sync.SyncHandler; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.IOException; @@ -38,8 +39,14 @@ public AESyncHandler(IConfigurableSlot slot) { public void init(String key, PanelSyncManager syncManager) { super.init(key, syncManager); onClient = syncManager.isClient(); + cache = initializeCache(); + byteBufAdapter = initializeByteBufAdapter(); } + protected abstract @NotNull IConfigurableSlot initializeCache(); + + protected abstract @NotNull IByteBufAdapter initializeByteBufAdapter(); + @SuppressWarnings("DuplicatedCode") @Override public void detectAndSendChanges(boolean init) { diff --git a/src/main/java/gregtech/api/mui/sync/appeng/IAEStackByteBufAdapter.java b/src/main/java/gregtech/api/mui/sync/appeng/IAEStackByteBufAdapter.java new file mode 100644 index 00000000000..f57b1a725e3 --- /dev/null +++ b/src/main/java/gregtech/api/mui/sync/appeng/IAEStackByteBufAdapter.java @@ -0,0 +1,62 @@ +package gregtech.api.mui.sync.appeng; + +import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedFluidStack; +import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedItemStack; + +import net.minecraft.network.PacketBuffer; + +import appeng.api.storage.data.IAEFluidStack; +import appeng.api.storage.data.IAEItemStack; +import appeng.api.storage.data.IAEStack; +import com.cleanroommc.modularui.utils.serialization.IByteBufAdapter; +import com.cleanroommc.modularui.utils.serialization.IByteBufDeserializer; +import com.cleanroommc.modularui.utils.serialization.IByteBufSerializer; +import org.jetbrains.annotations.NotNull; + +import java.io.IOException; +import java.util.Objects; + +class IAEStackByteBufAdapter> implements IByteBufAdapter { + + public static final IAEStackByteBufAdapter wrappedItemStackAdapter = specificDeserializer( + WrappedItemStack::fromPacket); + public static final IAEStackByteBufAdapter wrappedFluidStackAdapter = specificDeserializer( + WrappedFluidStack::fromPacket); + + @NotNull + private final IByteBufSerializer serializer; + @NotNull + private final IByteBufDeserializer deserializer; + + private IAEStackByteBufAdapter(@NotNull IByteBufSerializer serializer, + @NotNull IByteBufDeserializer deserializer) { + this.serializer = serializer; + this.deserializer = deserializer; + } + + public static < + T extends IAEStack> IAEStackByteBufAdapter createAdapter(@NotNull IByteBufSerializer serializer, + @NotNull IByteBufDeserializer deserializer) { + return new IAEStackByteBufAdapter<>(serializer, deserializer); + } + + public static < + T extends IAEStack> IAEStackByteBufAdapter specificDeserializer(@NotNull IByteBufDeserializer deserializer) { + return createAdapter((buf, stack) -> stack.writeToPacket(buf), deserializer); + } + + @Override + public T deserialize(PacketBuffer buffer) throws IOException { + return deserializer.deserialize(buffer); + } + + @Override + public void serialize(PacketBuffer buffer, T stackToSerialize) throws IOException { + serializer.serialize(buffer, stackToSerialize); + } + + @Override + public boolean areEqual(@NotNull T t1, @NotNull T t2) { + return Objects.equals(t1, t2); + } +} diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java index a4df04fef08..f7ef3b63112 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java @@ -4,6 +4,7 @@ import gregtech.api.mui.sync.appeng.AESyncHandler; import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.resources.I18n; import appeng.api.storage.data.IAEStack; import com.cleanroommc.modularui.api.ITheme; @@ -44,16 +45,20 @@ public void onInit() { tooltipBuilder(this::buildTooltip); } - // TODO: change tooltip when autopull is on protected void buildTooltip(@NotNull RichTooltip tooltip) { tooltip.addLine(IKey.lang("gregtech.gui.config_slot")); - if (isStocking) { - tooltip.addLine(IKey.lang("gregtech.gui.config_slot.set_only")); + + if (isAutoPull.getAsBoolean()) { + tooltip.add(I18n.format("gregtech.gui.config_slot.auto_pull_managed")); } else { - tooltip.addLine(IKey.lang("gregtech.gui.config_slot.set")); - tooltip.addLine(IKey.lang("gregtech.gui.config_slot.scroll")); + if (isStocking) { + tooltip.addLine(IKey.lang("gregtech.gui.config_slot.set_only")); + } else { + tooltip.addLine(IKey.lang("gregtech.gui.config_slot.set")); + tooltip.addLine(IKey.lang("gregtech.gui.config_slot.scroll")); + } + tooltip.addLine(IKey.lang("gregtech.gui.config_slot.remove")); } - tooltip.addLine(IKey.lang("gregtech.gui.config_slot.remove")); } @SuppressWarnings("unchecked") @@ -82,6 +87,11 @@ public int getSlotHoverColor() { return ITheme.getDefault().getItemSlotTheme().getSlotHoverColor(); } + @Override + public @NotNull Result onMousePressed(int mouseButton) { + return Interactable.super.onMousePressed(mouseButton); + } + @Override public boolean onMouseScroll(ModularScreen.UpOrDown scrollDirection, int scrollAmount) { if (getSyncHandler().getConfig() == null || isStocking) return false; diff --git a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java index 5ffc8b57e54..09531fe7fb6 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java @@ -94,12 +94,11 @@ public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { if (!heldItem.isEmpty()) { getSyncHandler().setConfig(WrappedItemStack.fromItemStack(heldItem)); + return Result.SUCCESS; } - - return Result.SUCCESS; } - return Result.SUCCESS; + return super.onMousePressed(mouseButton); } @Override From 4a02368455ce9db626965642f09e4699ccb036bb Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Fri, 23 May 2025 20:46:25 -0400 Subject: [PATCH 034/136] Sync work pt4 (use one sync handler for all 16 config slots instead of 1 per) --- .../mui/sync/appeng/AEFluidSyncHandler.java | 17 +- .../mui/sync/appeng/AEItemSyncHandler.java | 17 +- .../api/mui/sync/appeng/AESyncHandler.java | 160 +++++++++++------- .../api/mui/widget/appeng/AEConfigSlot.java | 10 +- .../api/mui/widget/appeng/AEDisplaySlot.java | 6 +- .../appeng/fluid/AEFluidConfigSlot.java | 16 +- .../appeng/fluid/AEFluidDisplaySlot.java | 10 +- .../widget/appeng/item/AEItemConfigSlot.java | 16 +- .../widget/appeng/item/AEItemDisplaySlot.java | 10 +- .../appeng/MetaTileEntityMEInputBus.java | 20 +-- .../appeng/MetaTileEntityMEInputHatch.java | 31 ++-- .../appeng/MetaTileEntityMEStockingBus.java | 1 - .../appeng/MetaTileEntityMEStockingHatch.java | 1 - .../appeng/slot/ExportOnlyAEFluidList.java | 1 - .../appeng/slot/ExportOnlyAEItemList.java | 1 - .../appeng/slot/ExportOnlyAESlot.java | 11 -- 16 files changed, 190 insertions(+), 138 deletions(-) diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java index ae236e9128c..86ee3532d23 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java @@ -15,13 +15,18 @@ public class AEFluidSyncHandler extends AESyncHandler { - public AEFluidSyncHandler(IConfigurableSlot config) { - super(config); + public AEFluidSyncHandler(IConfigurableSlot[] config, @Nullable Runnable dirtyNotifier) { + super(config, dirtyNotifier); } @Override - protected @NotNull IConfigurableSlot initializeCache() { - return new ExportOnlyAEFluidSlot(); + protected @NotNull IConfigurableSlot @NotNull [] initializeCache() { + // noinspection unchecked + IConfigurableSlot[] cache = new IConfigurableSlot[slots.length]; + for (int index = 0; index < slots.length; index++) { + cache[index] = new ExportOnlyAEFluidSlot(); + } + return cache; } @Override @@ -30,7 +35,7 @@ public AEFluidSyncHandler(IConfigurableSlot config) { } @SideOnly(Side.CLIENT) - public void setConfig(@Nullable FluidStack stack) { - setConfig(WrappedFluidStack.fromFluidStack(stack)); + public void setConfig(int index, @Nullable FluidStack stack) { + setConfig(index, WrappedFluidStack.fromFluidStack(stack)); } } diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java index bfba4e75f0e..a719f34d3c9 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java @@ -13,13 +13,18 @@ public class AEItemSyncHandler extends AESyncHandler { - public AEItemSyncHandler(IConfigurableSlot config) { - super(config); + public AEItemSyncHandler(IConfigurableSlot[] config, @Nullable Runnable dirtyNotifier) { + super(config, dirtyNotifier); } @Override - protected @NotNull IConfigurableSlot initializeCache() { - return new ExportOnlyAEItemSlot(); + protected @NotNull IConfigurableSlot @NotNull [] initializeCache() { + // noinspection unchecked + IConfigurableSlot[] cache = new IConfigurableSlot[slots.length]; + for (int index = 0; index < slots.length; index++) { + cache[index] = new ExportOnlyAEItemSlot(); + } + return cache; } @Override @@ -27,7 +32,7 @@ public AEItemSyncHandler(IConfigurableSlot config) { return IAEStackByteBufAdapter.wrappedItemStackAdapter; } - public void setConfig(@Nullable ItemStack stack) { - setConfig(WrappedItemStack.fromItemStack(stack)); + public void setConfig(int index, @Nullable ItemStack stack) { + setConfig(index, WrappedItemStack.fromItemStack(stack)); } } diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java index 6c4cc0c8e10..e4308087e9b 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java @@ -10,6 +10,8 @@ import com.cleanroommc.modularui.utils.serialization.IByteBufAdapter; import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.value.sync.SyncHandler; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -20,77 +22,99 @@ public abstract class AESyncHandler> extends SyncHandler { protected boolean onClient; private static int rollingID = 0; - public static final int configSyncID = rollingID++; - public static final int stockSyncID = rollingID++; + public static final int slotSyncID = rollingID++; public static final int setConfigID = rollingID++; public static final int clearConfigID = rollingID++; public static final int changeConfigID = rollingID++; - protected final IConfigurableSlot slot; - protected IConfigurableSlot cache; + protected final IConfigurableSlot[] slots; - protected IByteBufAdapter byteBufAdapter; + private IConfigurableSlot[] cached; + private final Int2ObjectMap> changeMap = new Int2ObjectOpenHashMap<>(); - public AESyncHandler(IConfigurableSlot slot) { - this.slot = slot; + private IByteBufAdapter byteBufAdapter; + + @Nullable + private final Runnable dirtyNotifier; + + public AESyncHandler(IConfigurableSlot[] slots, @Nullable Runnable dirtyNotifier) { + this.slots = slots; + this.dirtyNotifier = dirtyNotifier; } @Override public void init(String key, PanelSyncManager syncManager) { super.init(key, syncManager); onClient = syncManager.isClient(); - cache = initializeCache(); + cached = initializeCache(); byteBufAdapter = initializeByteBufAdapter(); } - protected abstract @NotNull IConfigurableSlot initializeCache(); + protected abstract @NotNull IConfigurableSlot @NotNull [] initializeCache(); protected abstract @NotNull IByteBufAdapter initializeByteBufAdapter(); @SuppressWarnings("DuplicatedCode") @Override public void detectAndSendChanges(boolean init) { - T currentConfig = slot.getConfig(); - T cachedConfig = cache.getConfig(); - if (!areAEStackCountEquals(currentConfig, cachedConfig)) { - cache.setConfig(currentConfig == null ? null : currentConfig.copy()); - - syncToClient(configSyncID, buf -> { - if (currentConfig == null) { - buf.writeBoolean(false); - } else { - buf.writeBoolean(true); - currentConfig.writeToPacket(buf); - } - }); + for (int index = 0; index < slots.length; index++) { + IConfigurableSlot slot = slots[index]; + IConfigurableSlot cache = cached[index]; + + T newConfig = slot.getConfig(); + T cachedConfig = cache.getConfig(); + T newStock = slot.getStock(); + T cachedStock = cache.getStock(); + + if (!areAEStackCountEquals(newConfig, cachedConfig) || !areAEStackCountEquals(newStock, cachedStock)) { + cached[index] = slot.copy(); + changeMap.put(index, slot.copy()); + notifyChange(); + } } - T currentStock = slot.getStock(); - T cachedStock = cache.getStock(); - if (!areAEStackCountEquals(currentStock, cachedStock)) { - cache.setStock(currentStock == null ? null : currentStock.copy()); - - syncToClient(stockSyncID, buf -> { - if (currentStock == null) { - buf.writeBoolean(false); - } else { - buf.writeBoolean(true); - currentStock.writeToPacket(buf); + if (!changeMap.isEmpty()) { + syncToClient(slotSyncID, buf -> { + buf.writeVarInt(changeMap.size()); + for (int index : changeMap.keySet()) { + buf.writeVarInt(index); + + T syncConfig = changeMap.get(index).getConfig(); + if (syncConfig == null) { + buf.writeBoolean(false); + } else { + buf.writeBoolean(true); + syncConfig.writeToPacket(buf); + } + + T syncStock = changeMap.get(index).getStock(); + if (syncStock == null) { + buf.writeBoolean(false); + } else { + buf.writeBoolean(true); + syncStock.writeToPacket(buf); + } } }); + + if (dirtyNotifier != null) { + dirtyNotifier.run(); + } + changeMap.clear(); } } @Override public void readOnServer(int id, PacketBuffer buf) throws IOException { if (id == clearConfigID) { - slot.setConfig(null); + slots[buf.readVarInt()].setConfig(null); } else if (id == changeConfigID) { - T config = getConfig(); + T config = getConfig(buf.readVarInt()); if (config != null) { config.setStackSize(buf.readInt()); } } else if (id == setConfigID) { + IConfigurableSlot slot = slots[buf.readVarInt()]; if (buf.readBoolean()) { slot.setConfig(byteBufAdapter.deserialize(buf)); } else { @@ -101,32 +125,42 @@ public void readOnServer(int id, PacketBuffer buf) throws IOException { @Override public void readOnClient(int id, PacketBuffer buf) throws IOException { - if (id == configSyncID) { - if (buf.readBoolean()) { - slot.setConfig(byteBufAdapter.deserialize(buf)); - } else { - slot.setConfig(null); - } - } else if (id == stockSyncID) { - if (buf.readBoolean()) { - slot.setStock(byteBufAdapter.deserialize(buf)); - } else { - slot.setStock(null); + if (id == slotSyncID) { + int size = buf.readVarInt(); + for (int i = 0; i < size; i++) { + int index = buf.readVarInt(); + IConfigurableSlot slot = slots[index]; + + if (buf.readBoolean()) { + slot.setConfig(byteBufAdapter.deserialize(buf)); + } else { + slot.setConfig(null); + } + + if (buf.readBoolean()) { + slot.setStock(byteBufAdapter.deserialize(buf)); + } else { + slot.setStock(null); + } } } } @SideOnly(Side.CLIENT) - public void clearConfig() { - syncToServer(clearConfigID); + public void clearConfig(int index) { + syncToServer(clearConfigID, buf -> buf.writeVarInt(index)); } @SideOnly(Side.CLIENT) - public void setConfig(@Nullable T newConfig) { + public void setConfig(int index, @Nullable T newConfig) { if (newConfig == null) { - syncToServer(setConfigID, buf -> buf.writeBoolean(false)); + syncToServer(setConfigID, buf -> { + buf.writeVarInt(index); + buf.writeBoolean(false); + }); } else { syncToServer(setConfigID, buf -> { + buf.writeVarInt(index); buf.writeBoolean(true); newConfig.writeToPacket(buf); }); @@ -134,22 +168,32 @@ public void setConfig(@Nullable T newConfig) { } @Nullable - public T getConfig() { - return slot.getConfig(); + public T getConfig(int index) { + return slots[index].getConfig(); } - public long getConfigAmount() { - return getConfig() == null ? 0 : getConfig().getStackSize(); + public long getConfigAmount(int index) { + T config = getConfig(index); + return config == null ? 0 : config.getStackSize(); } @SideOnly(Side.CLIENT) - public void setConfigAmount(int newAmount) { - syncToServer(changeConfigID, buf -> buf.writeInt(newAmount)); + public void setConfigAmount(int index, int newAmount) { + syncToServer(changeConfigID, buf -> { + buf.writeVarInt(index); + buf.writeInt(newAmount); + }); } @Nullable - public T getStock() { - return slot.getStock(); + public T getStock(int index) { + return slots[index].getStock(); + } + + protected void notifyChange() { + if (dirtyNotifier != null) { + dirtyNotifier.run(); + } } @SuppressWarnings("BooleanMethodIsAlwaysInverted") diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java index f7ef3b63112..676171a930c 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java @@ -28,14 +28,16 @@ public abstract class AEConfigSlot> extends Widget 0 && newStackSize < Integer.MAX_VALUE + 1L) { int scaledStackSize = (int) newStackSize; - getSyncHandler().setConfigAmount(scaledStackSize); + getSyncHandler().setConfigAmount(index, scaledStackSize); return true; } diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEDisplaySlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEDisplaySlot.java index 32d8d930d41..5f02de584a0 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEDisplaySlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEDisplaySlot.java @@ -15,8 +15,10 @@ public abstract class AEDisplaySlot> extends Widget> implements JeiIngredientProvider { - public AEDisplaySlot() { - super(); + protected final int index; + + public AEDisplaySlot(int index) { + this.index = index; size(18); } diff --git a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java index f95f673d958..f0550012d2b 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java @@ -30,8 +30,8 @@ public class AEFluidConfigSlot extends AEConfigSlot implements Interactable, JeiGhostIngredientSlot { - public AEFluidConfigSlot(boolean isStocking, BooleanSupplier isAutoPull) { - super(isStocking, isAutoPull); + public AEFluidConfigSlot(boolean isStocking, int index, BooleanSupplier isAutoPull) { + super(isStocking, index, isAutoPull); tooltipAutoUpdate(true); } @@ -43,7 +43,7 @@ public void onInit() { @Override protected void buildTooltip(@NotNull RichTooltip tooltip) { - IAEFluidStack config = getSyncHandler().getConfig(); + IAEFluidStack config = getSyncHandler().getConfig(index); if (config == null) { super.buildTooltip(tooltip); } else { @@ -72,7 +72,7 @@ public boolean isValidSyncHandler(SyncHandler syncHandler) { @Override public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { - IAEFluidStack config = getSyncHandler().getConfig(); + IAEFluidStack config = getSyncHandler().getConfig(index); if (config != null) { FluidStack stack = config.getFluidStack(); RenderUtil.drawFluidForGui(stack, stack.amount, 1, 1, 17, 17); @@ -99,14 +99,14 @@ public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { if (mouseButton == 1) { // Right click to clear - getSyncHandler().clearConfig(); + getSyncHandler().clearConfig(index); return Result.SUCCESS; } else if (mouseButton == 0) { ItemStack heldItem = getSyncHandler().getSyncManager().getCursorItem(); FluidStack heldFluid = FluidUtil.getFluidContained(heldItem); if (heldFluid != null) { - getSyncHandler().setConfig(WrappedFluidStack.fromFluidStack(heldFluid)); + getSyncHandler().setConfig(index, WrappedFluidStack.fromFluidStack(heldFluid)); } return Result.SUCCESS; @@ -117,7 +117,7 @@ public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { @Override public void setGhostIngredient(@NotNull FluidStack ingredient) { - getSyncHandler().setConfig(ingredient); + getSyncHandler().setConfig(index, ingredient); } @Override @@ -127,7 +127,7 @@ public void setGhostIngredient(@NotNull FluidStack ingredient) { @Override public @Nullable Object getIngredient() { - IAEFluidStack config = getSyncHandler().getConfig(); + IAEFluidStack config = getSyncHandler().getConfig(index); return config == null ? null : config.getFluidStack(); } } diff --git a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidDisplaySlot.java b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidDisplaySlot.java index efe1d69575b..339e86b9056 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidDisplaySlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidDisplaySlot.java @@ -20,14 +20,14 @@ public class AEFluidDisplaySlot extends AEDisplaySlot { - public AEFluidDisplaySlot() { - super(); + public AEFluidDisplaySlot(int index) { + super(index); tooltipAutoUpdate(true); } @Override protected void buildTooltip(@NotNull RichTooltip tooltip) { - IAEFluidStack stock = getSyncHandler().getStock(); + IAEFluidStack stock = getSyncHandler().getStock(index); if (stock != null) { FluidStack stack = stock.getFluidStack(); tooltip.addLine(IKey.str(stack.getLocalizedName())); @@ -54,7 +54,7 @@ public boolean isValidSyncHandler(SyncHandler syncHandler) { @Override public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { - IAEFluidStack stock = getSyncHandler().getStock(); + IAEFluidStack stock = getSyncHandler().getStock(index); if (stock != null) { FluidStack stack = stock.getFluidStack(); RenderUtil.drawFluidForGui(stack, stack.amount, 1, 1, 17, 17); @@ -70,7 +70,7 @@ public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { @Override public @Nullable Object getIngredient() { - IAEFluidStack stock = getSyncHandler().getStock(); + IAEFluidStack stock = getSyncHandler().getStock(index); return stock == null ? null : stock.getFluidStack(); } } diff --git a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java index 09531fe7fb6..74a97267b16 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java @@ -23,8 +23,8 @@ public class AEItemConfigSlot extends AEConfigSlot implements JeiGhostIngredientSlot { - public AEItemConfigSlot(boolean isStocking, BooleanSupplier isAutoPull) { - super(isStocking, isAutoPull); + public AEItemConfigSlot(boolean isStocking, int index, BooleanSupplier isAutoPull) { + super(isStocking, index, isAutoPull); tooltipAutoUpdate(true); } @@ -36,7 +36,7 @@ public void onInit() { @Override protected void buildTooltip(@NotNull RichTooltip tooltip) { - IAEItemStack config = getSyncHandler().getConfig(); + IAEItemStack config = getSyncHandler().getConfig(index); if (config == null) { super.buildTooltip(tooltip); } else { @@ -56,7 +56,7 @@ public boolean isValidSyncHandler(SyncHandler syncHandler) { @Override public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { - IAEItemStack config = getSyncHandler().getConfig(); + IAEItemStack config = getSyncHandler().getConfig(index); if (config != null) { ItemStack stack = config.createItemStack(); if (!stack.isEmpty()) { @@ -86,14 +86,14 @@ public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { if (mouseButton == 1) { // Right click to clear - getSyncHandler().clearConfig(); + getSyncHandler().clearConfig(index); return Result.SUCCESS; } else if (mouseButton == 0) { // Left click to set item/change amount ItemStack heldItem = getSyncHandler().getSyncManager().getCursorItem(); if (!heldItem.isEmpty()) { - getSyncHandler().setConfig(WrappedItemStack.fromItemStack(heldItem)); + getSyncHandler().setConfig(index, WrappedItemStack.fromItemStack(heldItem)); return Result.SUCCESS; } } @@ -103,7 +103,7 @@ public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { @Override public void setGhostIngredient(@NotNull ItemStack ingredient) { - getSyncHandler().setConfig(ingredient); + getSyncHandler().setConfig(index, ingredient); } @Override @@ -113,7 +113,7 @@ public void setGhostIngredient(@NotNull ItemStack ingredient) { @Override public @Nullable Object getIngredient() { - IAEItemStack config = getSyncHandler().getConfig(); + IAEItemStack config = getSyncHandler().getConfig(index); return config == null ? null : config.createItemStack(); } } diff --git a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemDisplaySlot.java b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemDisplaySlot.java index 0b39289a75d..7c4890471a9 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemDisplaySlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemDisplaySlot.java @@ -17,14 +17,14 @@ public class AEItemDisplaySlot extends AEDisplaySlot { - public AEItemDisplaySlot() { - super(); + public AEItemDisplaySlot(int index) { + super(index); tooltipAutoUpdate(true); } @Override protected void buildTooltip(@NotNull RichTooltip tooltip) { - IAEItemStack stock = getSyncHandler().getStock(); + IAEItemStack stock = getSyncHandler().getStock(index); if (stock != null) { tooltip.addFromItem(stock.createItemStack()); } @@ -42,7 +42,7 @@ public boolean isValidSyncHandler(SyncHandler syncHandler) { @Override public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { - IAEItemStack stock = getSyncHandler().getStock(); + IAEItemStack stock = getSyncHandler().getStock(index); if (stock != null) { ItemStack stack = stock.createItemStack(); if (!stack.isEmpty()) { @@ -61,7 +61,7 @@ public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { @Override public @Nullable Object getIngredient() { - IAEItemStack stock = getSyncHandler().getStock(); + IAEItemStack stock = getSyncHandler().getStock(index); return stock == null ? null : stock.createItemStack(); } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java index fba14703f49..47281b93498 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java @@ -208,14 +208,12 @@ public boolean usesMui2() { public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) { ModularPanel mainPanel = GTGuis.createPanel(this, 176, 18 + 18 * 4 + 94); - final String syncHandlerName = "aeSlot"; final boolean isStocking = getAEItemHandler().isStocking(); - guiSyncManager.registerSlotGroup("extra_slot", 1); - for (int index = 0; index < CONFIG_SIZE; index++) { - guiSyncManager.syncValue(syncHandlerName, index, - new AEItemSyncHandler(getAEItemHandler().getInventory()[index])); - } + + final String syncHandlerName = "aeSync"; + guiSyncManager.syncValue(syncHandlerName, + new AEItemSyncHandler(getAEItemHandler().getInventory(), this::markDirty)); IPanelHandler amountPopup = IPanelHandler.simple(mainPanel, this::createAmountPopupPanel, true); @@ -230,8 +228,9 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) .minColWidth(18) .minRowHeight(18) .matrix(Grid.mapToMatrix((int) Math.sqrt(CONFIG_SIZE), CONFIG_SIZE, - index -> new AEItemConfigSlot(isStocking, this::isAutoPull) - .syncHandler(syncHandlerName, index)))) + index -> new AEItemConfigSlot(isStocking, index, this::isAutoPull) + .syncHandler(syncHandlerName) + .debugName("Index " + index)))) .child(new Grid() .pos(7 + 18 * 5, 25) .size(18 * 4) @@ -239,9 +238,10 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) .minColWidth(18) .minRowHeight(18) .matrix(Grid.mapToMatrix((int) Math.sqrt(CONFIG_SIZE), CONFIG_SIZE, - index -> new AEItemDisplaySlot() + index -> new AEItemDisplaySlot(index) .background(GTGuiTextures.SLOT_DARK) - .syncHandler(syncHandlerName, index)))) + .syncHandler(syncHandlerName) + .debugName("Index " + index)))) .child(Flow.column() .pos(7 + 18 * 4, 25) .size(18, 18 * 4) diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java index df7514a0628..023d40a66ef 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java @@ -42,6 +42,7 @@ import codechicken.lib.render.CCRenderState; import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; +import com.cleanroommc.modularui.api.IPanelHandler; import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.factory.PosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; @@ -165,15 +166,17 @@ public boolean usesMui2() { @Override public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) { - final String syncHandlerName = "aeSlot"; + ModularPanel mainPanel = GTGuis.createPanel(this, 176, 18 + 18 * 4 + 94); + final boolean isStocking = getAEFluidHandler().isStocking(); - for (int index = 0; index < CONFIG_SIZE; index++) { - guiSyncManager.syncValue(syncHandlerName, index, - new AEFluidSyncHandler(getAEFluidHandler().getInventory()[index])); - } - return GTGuis.createPanel(this, 176, 18 + 18 * 4 + 94) - .child(IKey.lang(getMetaFullName()).asWidget().pos(5, 5)) + final String syncHandlerName = "aeSync"; + guiSyncManager.syncValue(syncHandlerName, + new AEFluidSyncHandler(getAEFluidHandler().getInventory(), this::markDirty)); + + IPanelHandler amountPopup = IPanelHandler.simple(mainPanel, this::createAmountPopupPanel, true); + + return mainPanel.child(IKey.lang(getMetaFullName()).asWidget().pos(5, 5)) .child(SlotGroupWidget.playerInventory().left(7).bottom(7)) .child(IKey.dynamic(() -> isOnline() ? I18n.format("gregtech.gui.me_network.online") : I18n.format("gregtech.gui.me_network.offline")).asWidget().pos(5, 15)) @@ -184,8 +187,9 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) .minColWidth(18) .minRowHeight(18) .matrix(Grid.mapToMatrix((int) Math.sqrt(CONFIG_SIZE), CONFIG_SIZE, - index -> new AEFluidConfigSlot(isStocking, this::isAutoPull) - .syncHandler(syncHandlerName, index)))) + index -> new AEFluidConfigSlot(isStocking, index, this::isAutoPull) + .syncHandler(syncHandlerName) + .debugName("Index " + index)))) .child(new Grid() .pos(7 + 18 * 5, 25) .size(18 * 4) @@ -193,9 +197,10 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) .minColWidth(18) .minRowHeight(18) .matrix(Grid.mapToMatrix((int) Math.sqrt(CONFIG_SIZE), CONFIG_SIZE, - index -> new AEFluidDisplaySlot() + index -> new AEFluidDisplaySlot(index) .background(GTGuiTextures.SLOT_DARK) - .syncHandler(syncHandlerName, index)))) + .syncHandler(syncHandlerName) + .debugName("Index " + index)))) .child(Flow.column() .pos(7 + 18 * 4, 25) .size(18, 18 * 4) @@ -211,6 +216,10 @@ protected Widget getExtraButton() { .size(18); } + protected ModularPanel createAmountPopupPanel(ModularPanel mainPanel, EntityPlayer player) { + return GTGuis.createPopupPanel("amountPanel", 150, 50); + } + @Override public boolean isWorkingEnabled() { return this.workingEnabled; diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java index 6b1ad9597d0..1195d8c1307 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java @@ -435,7 +435,6 @@ protected void createInventory(MetaTileEntity holder) { } for (ExportOnlyAEItemSlot slot : this.inventory) { slot.setTrigger(this::onContentsChanged); - slot.setDirtyNotifier(holder::markDirty); } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java index 068d2fd3a4f..96ce95ae5b9 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java @@ -394,7 +394,6 @@ protected void createInventory(MetaTileEntity holder, MetaTileEntity entityToNot this.inventory = new ExportOnlyAEStockingFluidSlot[size]; for (int i = 0; i < size; i++) { this.inventory[i] = new ExportOnlyAEStockingFluidSlot(stocking, entityToNotify); - this.inventory[i].setDirtyNotifier(holder::markDirty); } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEFluidList.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEFluidList.java index 1c5af969d5b..fd4b40ea7e5 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEFluidList.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEFluidList.java @@ -20,7 +20,6 @@ protected void createInventory(MetaTileEntity holder, MetaTileEntity entityToNot this.inventory = new ExportOnlyAEFluidSlot[size]; for (int i = 0; i < size; i++) { this.inventory[i] = new ExportOnlyAEFluidSlot(holder, entityToNotify); - this.inventory[i].setDirtyNotifier(holder::markDirty); } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEItemList.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEItemList.java index c9173615897..995670eff15 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEItemList.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEItemList.java @@ -27,7 +27,6 @@ protected void createInventory(MetaTileEntity holder) { } for (ExportOnlyAEItemSlot slot : this.inventory) { slot.setTrigger(this::onContentsChanged); - slot.setDirtyNotifier(holder::markDirty); } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAESlot.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAESlot.java index d4086cdc168..236152a69bc 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAESlot.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAESlot.java @@ -16,9 +16,6 @@ public abstract class ExportOnlyAESlot> @Nullable protected T stock; - @Nullable - private Runnable dirtyNotifier; - public ExportOnlyAESlot(@Nullable T config, @Nullable T stock) { this.config = config; this.stock = stock; @@ -28,10 +25,6 @@ public ExportOnlyAESlot() { this(null, null); } - public void setDirtyNotifier(@Nullable Runnable dirtyNotifier) { - this.dirtyNotifier = dirtyNotifier; - } - @Nullable public T requestStack() { if (this.stock != null && !this.stock.isMeaningful()) { @@ -101,10 +94,6 @@ public NBTTagCompound serializeNBT() { @Override public void setConfig(@Nullable T val) { this.config = val; - - if (dirtyNotifier != null) { - dirtyNotifier.run(); - } } @Override From d5f2839ace25df2d9d284d2f130df7abbf3e137e Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Fri, 23 May 2025 20:57:59 -0400 Subject: [PATCH 035/136] Move overlay stuff into drawOverlay --- .../gregtech/api/mui/sync/appeng/AESyncHandler.java | 1 - .../gregtech/api/mui/widget/appeng/AEDisplaySlot.java | 10 ++++++++++ .../api/mui/widget/appeng/fluid/AEFluidConfigSlot.java | 7 ++++++- .../mui/widget/appeng/fluid/AEFluidDisplaySlot.java | 4 ---- .../api/mui/widget/appeng/item/AEItemConfigSlot.java | 5 ++++- .../api/mui/widget/appeng/item/AEItemDisplaySlot.java | 4 ---- 6 files changed, 20 insertions(+), 11 deletions(-) diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java index e4308087e9b..d3c60da2417 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java @@ -28,7 +28,6 @@ public abstract class AESyncHandler> extends SyncHandler { public static final int changeConfigID = rollingID++; protected final IConfigurableSlot[] slots; - private IConfigurableSlot[] cached; private final Int2ObjectMap> changeMap = new Int2ObjectOpenHashMap<>(); diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEDisplaySlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEDisplaySlot.java index 5f02de584a0..cd9d4e802a1 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEDisplaySlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEDisplaySlot.java @@ -7,6 +7,7 @@ import com.cleanroommc.modularui.drawable.GuiDraw; import com.cleanroommc.modularui.integration.jei.JeiIngredientProvider; import com.cleanroommc.modularui.screen.RichTooltip; +import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; import com.cleanroommc.modularui.theme.WidgetSlotTheme; import com.cleanroommc.modularui.theme.WidgetTheme; import com.cleanroommc.modularui.widget.Widget; @@ -29,6 +30,15 @@ public void onInit() { protected void buildTooltip(@NotNull RichTooltip tooltip) {} + @Override + public void drawOverlay(ModularGuiContext context, WidgetTheme widgetTheme) { + super.drawOverlay(context, widgetTheme); + + if (isHovering()) { + drawSlotOverlay(); + } + } + protected void drawSlotOverlay() { GlStateManager.colorMask(true, true, true, false); GuiDraw.drawRect(1, 1, 16, 16, getSlotHoverColor()); diff --git a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java index f0550012d2b..4b9d4157b22 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java @@ -82,9 +82,14 @@ public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { RenderUtil.renderTextFixedCorner(amount, 17d, 18d, 0xFFFFFF, true, 0.5f); } } + } + + @Override + public void drawOverlay(ModularGuiContext context, WidgetTheme widgetTheme) { + super.drawOverlay(context, widgetTheme); // TODO: replace with RenderUtil.handleJeiGhostHighlight(this); when 2812 merges (thx ghz) - if (ModularUIJeiPlugin.hasDraggingGhostIngredient() || ModularUIJeiPlugin.hoveringOverIngredient(this)) { + if (ModularUIJeiPlugin.hoveringOverIngredient(this)) { GlStateManager.colorMask(true, true, true, false); drawHighlight(getArea(), isHovering()); GlStateManager.colorMask(true, true, true, true); diff --git a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidDisplaySlot.java b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidDisplaySlot.java index 339e86b9056..ff6cc2a54da 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidDisplaySlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidDisplaySlot.java @@ -62,10 +62,6 @@ public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { String amount = TextFormattingUtil.formatLongToCompactString(stack.amount, 4); RenderUtil.renderTextFixedCorner(amount, 17d, 18d, 0xFFFFFF, true, 0.5f); } - - if (isHovering()) { - drawSlotOverlay(); - } } @Override diff --git a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java index 74a97267b16..93cc64a43ae 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java @@ -69,9 +69,12 @@ public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { RenderUtil.renderTextFixedCorner(amount, 17d, 18d, 0xFFFFFF, true, 0.5f); } } + } + @Override + public void drawOverlay(ModularGuiContext context, WidgetTheme widgetTheme) { // TODO: replace with RenderUtil.handleJeiGhostHighlight(this); when 2812 merges (thx ghz) - if (ModularUIJeiPlugin.hasDraggingGhostIngredient() || ModularUIJeiPlugin.hoveringOverIngredient(this)) { + if (ModularUIJeiPlugin.hoveringOverIngredient(this)) { GlStateManager.colorMask(true, true, true, false); drawHighlight(getArea(), isHovering()); GlStateManager.colorMask(true, true, true, true); diff --git a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemDisplaySlot.java b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemDisplaySlot.java index 7c4890471a9..4a39412861c 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemDisplaySlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemDisplaySlot.java @@ -53,10 +53,6 @@ public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { String amount = TextFormattingUtil.formatLongToCompactString(stock.getStackSize(), 4); RenderUtil.renderTextFixedCorner(amount, 17d, 18d, 0xFFFFFF, true, 0.5f); } - - if (isHovering()) { - drawSlotOverlay(); - } } @Override From b1e6851400ee6eb17f07add1f0c68adb4859baeb Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Sun, 25 May 2025 21:44:42 -0400 Subject: [PATCH 036/136] Amount select popup --- src/main/java/gregtech/api/mui/GTGuis.java | 12 ++ .../api/mui/sync/appeng/AESyncHandler.java | 19 +++ .../api/mui/widget/appeng/AEConfigSlot.java | 120 +++++++++++++++++- .../appeng/fluid/AEFluidConfigSlot.java | 9 +- .../widget/appeng/item/AEItemConfigSlot.java | 2 + .../appeng/MetaTileEntityMEInputBus.java | 39 +++--- .../appeng/MetaTileEntityMEInputHatch.java | 40 +++--- 7 files changed, 203 insertions(+), 38 deletions(-) diff --git a/src/main/java/gregtech/api/mui/GTGuis.java b/src/main/java/gregtech/api/mui/GTGuis.java index f955cd922f8..17d308686f7 100644 --- a/src/main/java/gregtech/api/mui/GTGuis.java +++ b/src/main/java/gregtech/api/mui/GTGuis.java @@ -16,6 +16,7 @@ import com.cleanroommc.modularui.widgets.ButtonWidget; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; public class GTGuis { @@ -100,6 +101,8 @@ public static class PopupPanel extends ModularPanel { private boolean disableBelow; private boolean closeOnOutsideClick; private boolean deleteCachedPanel; + @Nullable + private Runnable closeListener; private PopupPanel(@NotNull String name) { super(name); @@ -121,6 +124,10 @@ public void onClose() { if (deleteCachedPanel && isSynced() && getSyncHandler() instanceof IPanelHandler handler) { handler.deleteCachedPanel(); } + + if (closeListener != null) { + closeListener.run(); + } } public PopupPanel disablePanelsBelow(boolean disableBelow) { @@ -159,5 +166,10 @@ public boolean disablePanelsBelow() { public boolean closeOnOutOfBoundsClick() { return closeOnOutsideClick; } + + public PopupPanel closeListener(@Nullable Runnable closeListener) { + this.closeListener = closeListener; + return this; + } } } diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java index d3c60da2417..97754c92736 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java @@ -35,6 +35,7 @@ public abstract class AESyncHandler> extends SyncHandler { @Nullable private final Runnable dirtyNotifier; + private final Int2ObjectMap onConfigSetListener = new Int2ObjectOpenHashMap<>(); public AESyncHandler(IConfigurableSlot[] slots, @Nullable Runnable dirtyNotifier) { this.slots = slots; @@ -141,6 +142,8 @@ public void readOnClient(int id, PacketBuffer buf) throws IOException { } else { slot.setStock(null); } + + notifySetConfig(index); } } } @@ -171,6 +174,10 @@ public T getConfig(int index) { return slots[index].getConfig(); } + public boolean hasConfig(int index) { + return getConfig(index) != null; + } + public long getConfigAmount(int index) { T config = getConfig(index); return config == null ? 0 : config.getStackSize(); @@ -195,6 +202,18 @@ protected void notifyChange() { } } + public void addSetConfigListener(int id, @NotNull Runnable runnable) { + onConfigSetListener.put(id, runnable); + } + + public void removeSetConfigListener(int id) { + onConfigSetListener.remove(id); + } + + protected void notifySetConfig(int index) { + onConfigSetListener.get(index).run(); + } + @SuppressWarnings("BooleanMethodIsAlwaysInverted") public final boolean areAEStackCountEquals(T stack1, T stack2) { if (stack2 == stack1) { diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java index 676171a930c..b83e65f49ba 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java @@ -1,12 +1,18 @@ package gregtech.api.mui.widget.appeng; import gregtech.api.mui.GTGuiTextures; +import gregtech.api.mui.GTGuis; import gregtech.api.mui.sync.appeng.AESyncHandler; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.resources.I18n; +import net.minecraft.item.ItemStack; +import net.minecraftforge.fluids.FluidStack; +import appeng.api.storage.data.IAEFluidStack; +import appeng.api.storage.data.IAEItemStack; import appeng.api.storage.data.IAEStack; +import com.cleanroommc.modularui.api.IPanelHandler; import com.cleanroommc.modularui.api.ITheme; import com.cleanroommc.modularui.api.drawable.IDrawable; import com.cleanroommc.modularui.api.drawable.IKey; @@ -15,10 +21,14 @@ import com.cleanroommc.modularui.integration.jei.JeiIngredientProvider; import com.cleanroommc.modularui.screen.ModularScreen; import com.cleanroommc.modularui.screen.RichTooltip; +import com.cleanroommc.modularui.screen.viewport.GuiContext; +import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; import com.cleanroommc.modularui.theme.WidgetSlotTheme; import com.cleanroommc.modularui.theme.WidgetTheme; +import com.cleanroommc.modularui.value.StringValue; import com.cleanroommc.modularui.value.sync.SyncHandler; import com.cleanroommc.modularui.widget.Widget; +import com.cleanroommc.modularui.widgets.textfield.TextFieldWidget; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -35,6 +45,13 @@ public abstract class AEConfigSlot> extends Widget; } + @Override + public void drawOverlay(ModularGuiContext context, WidgetTheme widgetTheme) { + super.drawOverlay(context, widgetTheme); + + if (selected) { + GTGuiTextures.SELECT_BOX.draw(0, 0, 18, 18); + } + } + // TODO: get rid of these two methods when 2817 merges protected void drawSlotOverlay() { GlStateManager.colorMask(true, true, true, false); @@ -91,7 +117,19 @@ public int getSlotHoverColor() { @Override public @NotNull Result onMousePressed(int mouseButton) { - return Interactable.super.onMousePressed(mouseButton); + // If no stack was clicked in, open amount selector + if (mouseButton == 0 && !isAmountPanelOpen() && getSyncHandler().hasConfig(index)) { + if (onSelect != null) { + onSelect.run(); + } + + selected = true; + getAmountPanel().openPanel(); + + return Result.SUCCESS; + } + + return Result.IGNORE; } @Override @@ -125,4 +163,84 @@ public boolean onMouseScroll(ModularScreen.UpOrDown scrollDirection, int scrollA public @Nullable IDrawable getBackground() { return isAutoPull.getAsBoolean() ? autoPullBackground : normalBackground; } + + protected IPanelHandler getAmountPanel() { + if (amountPanel == null) { + amountPanel = IPanelHandler.simple(getPanel(), (parentPanel, player) -> { + AESyncHandler syncHandler = getSyncHandler(); + AEDynamicDrawable drawable = new AEDynamicDrawable(syncHandler.getConfig(index)); + syncHandler.addSetConfigListener(index, () -> drawable.setToDraw(syncHandler.getConfig(index))); + + return GTGuis.createPopupPanel("ae_slot_amount." + index, 100, 18 + 5 * 2) + .closeListener(() -> { + if (onSelect != null) { + onSelect.run(); + } + + syncHandler.removeSetConfigListener(index); + }) + .child(drawable.asWidget() + .alignY(0.5f) + .left(5)) + .child(new TextFieldWidget() + .value(new StringValue.Dynamic(() -> String.valueOf(syncHandler.getConfigAmount(index)), + str -> { + try { + int newAmount = Integer.parseInt(str); + syncHandler.setConfigAmount(index, newAmount); + } catch (NumberFormatException ignored) { + // nuh uh + } + })) + .size(50, 10) + .alignY(0.5f) + .left(18 + 5 * 2)); + }, true); + } + + return amountPanel; + } + + public boolean isAmountPanelOpen() { + return getAmountPanel().isPanelOpen(); + } + + public void deselect() { + selected = false; + if (isAmountPanelOpen()) { + getAmountPanel().closePanel(); + } + } + + public void onSelect(@Nullable Runnable onSelect) { + this.onSelect = onSelect; + } + + protected static class AEDynamicDrawable implements IDrawable { + + Object toDraw; + + public AEDynamicDrawable(Object toDraw) { + setToDraw(toDraw); + } + + public void setToDraw(Object toDraw) { + if (toDraw instanceof IAEItemStack iaeItemStack) { + this.toDraw = iaeItemStack.createItemStack(); + } else if (toDraw instanceof IAEFluidStack iaeFluidStack) { + this.toDraw = iaeFluidStack.getFluidStack(); + } else { + this.toDraw = toDraw; + } + } + + @Override + public void draw(GuiContext context, int x, int y, int width, int height, WidgetTheme widgetTheme) { + if (toDraw instanceof ItemStack item) { + GuiDraw.drawItem(item, x, y, width, height); + } else if (toDraw instanceof FluidStack fluid) { + GuiDraw.drawFluidTexture(fluid, x, y, width, height, 0.0f); + } + } + } } diff --git a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java index 4b9d4157b22..ccff92b130e 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java @@ -86,8 +86,6 @@ public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { @Override public void drawOverlay(ModularGuiContext context, WidgetTheme widgetTheme) { - super.drawOverlay(context, widgetTheme); - // TODO: replace with RenderUtil.handleJeiGhostHighlight(this); when 2812 merges (thx ghz) if (ModularUIJeiPlugin.hoveringOverIngredient(this)) { GlStateManager.colorMask(true, true, true, false); @@ -96,6 +94,8 @@ public void drawOverlay(ModularGuiContext context, WidgetTheme widgetTheme) { } else if (isHovering()) { drawSlotOverlay(); } + + super.drawOverlay(context, widgetTheme); } @Override @@ -112,12 +112,11 @@ public void drawOverlay(ModularGuiContext context, WidgetTheme widgetTheme) { if (heldFluid != null) { getSyncHandler().setConfig(index, WrappedFluidStack.fromFluidStack(heldFluid)); + return Result.SUCCESS; } - - return Result.SUCCESS; } - return Result.IGNORE; + return super.onMousePressed(mouseButton); } @Override diff --git a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java index 93cc64a43ae..185b7d9b3e5 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java @@ -81,6 +81,8 @@ public void drawOverlay(ModularGuiContext context, WidgetTheme widgetTheme) { } else if (isHovering()) { drawSlotOverlay(); } + + super.drawOverlay(context, widgetTheme); } @Override diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java index 47281b93498..895333a06d4 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java @@ -20,6 +20,7 @@ import gregtech.api.mui.sync.appeng.AEItemSyncHandler; import gregtech.api.mui.widget.EmptyWidget; import gregtech.api.mui.widget.GhostCircuitSlotWidget; +import gregtech.api.mui.widget.appeng.AEConfigSlot; import gregtech.api.mui.widget.appeng.item.AEItemConfigSlot; import gregtech.api.mui.widget.appeng.item.AEItemDisplaySlot; import gregtech.api.util.GTUtility; @@ -50,8 +51,8 @@ import codechicken.lib.render.CCRenderState; import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; -import com.cleanroommc.modularui.api.IPanelHandler; import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.api.widget.IWidget; import com.cleanroommc.modularui.factory.PosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.value.sync.PanelSyncManager; @@ -215,22 +216,32 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) guiSyncManager.syncValue(syncHandlerName, new AEItemSyncHandler(getAEItemHandler().getInventory(), this::markDirty)); - IPanelHandler amountPopup = IPanelHandler.simple(mainPanel, this::createAmountPopupPanel, true); + Grid configGrid = new Grid() + .pos(7, 25) + .size(18 * 4) + .minElementMargin(0, 0) + .minColWidth(18) + .minRowHeight(18) + .matrix(Grid.mapToMatrix((int) Math.sqrt(CONFIG_SIZE), CONFIG_SIZE, + index -> new AEItemConfigSlot(isStocking, index, this::isAutoPull) + .syncHandler(syncHandlerName) + .debugName("Index " + index))); + + for (IWidget aeWidget : configGrid.getChildren()) { + // noinspection unchecked + ((AEConfigSlot) aeWidget).onSelect(() -> { + for (IWidget widget : configGrid.getChildren()) { + // noinspection unchecked + ((AEConfigSlot) widget).deselect(); + } + }); + } return mainPanel.child(IKey.lang(getMetaFullName()).asWidget().pos(5, 5)) .child(SlotGroupWidget.playerInventory().left(7).bottom(7)) .child(IKey.dynamic(() -> isOnline() ? I18n.format("gregtech.gui.me_network.online") : I18n.format("gregtech.gui.me_network.offline")).asWidget().pos(5, 15)) - .child(new Grid() - .pos(7, 25) - .size(18 * 4) - .minElementMargin(0, 0) - .minColWidth(18) - .minRowHeight(18) - .matrix(Grid.mapToMatrix((int) Math.sqrt(CONFIG_SIZE), CONFIG_SIZE, - index -> new AEItemConfigSlot(isStocking, index, this::isAutoPull) - .syncHandler(syncHandlerName) - .debugName("Index " + index)))) + .child(configGrid) .child(new Grid() .pos(7 + 18 * 5, 25) .size(18 * 4) @@ -261,10 +272,6 @@ protected Widget getExtraButton() { .size(18); } - protected ModularPanel createAmountPopupPanel(ModularPanel mainPanel, EntityPlayer player) { - return GTGuis.createPopupPanel("amountPanel", 150, 50); - } - @Override public boolean isWorkingEnabled() { return this.workingEnabled; diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java index 023d40a66ef..edf2b7ece37 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java @@ -14,6 +14,7 @@ import gregtech.api.mui.GTGuis; import gregtech.api.mui.sync.appeng.AEFluidSyncHandler; import gregtech.api.mui.widget.EmptyWidget; +import gregtech.api.mui.widget.appeng.AEConfigSlot; import gregtech.api.mui.widget.appeng.fluid.AEFluidConfigSlot; import gregtech.api.mui.widget.appeng.fluid.AEFluidDisplaySlot; import gregtech.client.renderer.texture.Textures; @@ -39,11 +40,12 @@ import appeng.api.storage.IMEMonitor; import appeng.api.storage.channels.IFluidStorageChannel; import appeng.api.storage.data.IAEFluidStack; +import appeng.api.storage.data.IAEItemStack; import codechicken.lib.render.CCRenderState; import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; -import com.cleanroommc.modularui.api.IPanelHandler; import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.api.widget.IWidget; import com.cleanroommc.modularui.factory.PosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.value.sync.PanelSyncManager; @@ -174,22 +176,32 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) guiSyncManager.syncValue(syncHandlerName, new AEFluidSyncHandler(getAEFluidHandler().getInventory(), this::markDirty)); - IPanelHandler amountPopup = IPanelHandler.simple(mainPanel, this::createAmountPopupPanel, true); + Grid configGrid = new Grid() + .pos(7, 25) + .size(18 * 4) + .minElementMargin(0, 0) + .minColWidth(18) + .minRowHeight(18) + .matrix(Grid.mapToMatrix((int) Math.sqrt(CONFIG_SIZE), CONFIG_SIZE, + index -> new AEFluidConfigSlot(isStocking, index, this::isAutoPull) + .syncHandler(syncHandlerName) + .debugName("Index " + index))); + + for (IWidget aeWidget : configGrid.getChildren()) { + // noinspection unchecked + ((AEConfigSlot) aeWidget).onSelect(() -> { + for (IWidget widget : configGrid.getChildren()) { + // noinspection unchecked + ((AEConfigSlot) widget).deselect(); + } + }); + } return mainPanel.child(IKey.lang(getMetaFullName()).asWidget().pos(5, 5)) .child(SlotGroupWidget.playerInventory().left(7).bottom(7)) .child(IKey.dynamic(() -> isOnline() ? I18n.format("gregtech.gui.me_network.online") : I18n.format("gregtech.gui.me_network.offline")).asWidget().pos(5, 15)) - .child(new Grid() - .pos(7, 25) - .size(18 * 4) - .minElementMargin(0, 0) - .minColWidth(18) - .minRowHeight(18) - .matrix(Grid.mapToMatrix((int) Math.sqrt(CONFIG_SIZE), CONFIG_SIZE, - index -> new AEFluidConfigSlot(isStocking, index, this::isAutoPull) - .syncHandler(syncHandlerName) - .debugName("Index " + index)))) + .child(configGrid) .child(new Grid() .pos(7 + 18 * 5, 25) .size(18 * 4) @@ -216,10 +228,6 @@ protected Widget getExtraButton() { .size(18); } - protected ModularPanel createAmountPopupPanel(ModularPanel mainPanel, EntityPlayer player) { - return GTGuis.createPopupPanel("amountPanel", 150, 50); - } - @Override public boolean isWorkingEnabled() { return this.workingEnabled; From dc84c37eb4ecbab0044c67dabe2f4466a83d1a77 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Mon, 26 May 2025 11:44:35 -0400 Subject: [PATCH 037/136] better drawing widget --- .../api/mui/sync/appeng/AESyncHandler.java | 15 ------- .../api/mui/widget/appeng/AEConfigSlot.java | 40 +++++++------------ .../appeng/MetaTileEntityMEInputBus.java | 7 +--- .../appeng/MetaTileEntityMEInputHatch.java | 8 +--- 4 files changed, 18 insertions(+), 52 deletions(-) diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java index 97754c92736..73b1f5ee5c8 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java @@ -35,7 +35,6 @@ public abstract class AESyncHandler> extends SyncHandler { @Nullable private final Runnable dirtyNotifier; - private final Int2ObjectMap onConfigSetListener = new Int2ObjectOpenHashMap<>(); public AESyncHandler(IConfigurableSlot[] slots, @Nullable Runnable dirtyNotifier) { this.slots = slots; @@ -142,8 +141,6 @@ public void readOnClient(int id, PacketBuffer buf) throws IOException { } else { slot.setStock(null); } - - notifySetConfig(index); } } } @@ -202,18 +199,6 @@ protected void notifyChange() { } } - public void addSetConfigListener(int id, @NotNull Runnable runnable) { - onConfigSetListener.put(id, runnable); - } - - public void removeSetConfigListener(int id) { - onConfigSetListener.remove(id); - } - - protected void notifySetConfig(int index) { - onConfigSetListener.get(index).run(); - } - @SuppressWarnings("BooleanMethodIsAlwaysInverted") public final boolean areAEStackCountEquals(T stack1, T stack2) { if (stack2 == stack1) { diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java index b83e65f49ba..a082d177c3d 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java @@ -6,8 +6,6 @@ import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.resources.I18n; -import net.minecraft.item.ItemStack; -import net.minecraftforge.fluids.FluidStack; import appeng.api.storage.data.IAEFluidStack; import appeng.api.storage.data.IAEItemStack; @@ -33,6 +31,7 @@ import org.jetbrains.annotations.Nullable; import java.util.function.BooleanSupplier; +import java.util.function.Supplier; public abstract class AEConfigSlot> extends Widget> implements JeiIngredientProvider, Interactable { @@ -168,17 +167,10 @@ protected IPanelHandler getAmountPanel() { if (amountPanel == null) { amountPanel = IPanelHandler.simple(getPanel(), (parentPanel, player) -> { AESyncHandler syncHandler = getSyncHandler(); - AEDynamicDrawable drawable = new AEDynamicDrawable(syncHandler.getConfig(index)); - syncHandler.addSetConfigListener(index, () -> drawable.setToDraw(syncHandler.getConfig(index))); + AEDynamicDrawable drawable = new AEDynamicDrawable(() -> syncHandler.getConfig(index)); return GTGuis.createPopupPanel("ae_slot_amount." + index, 100, 18 + 5 * 2) - .closeListener(() -> { - if (onSelect != null) { - onSelect.run(); - } - - syncHandler.removeSetConfigListener(index); - }) + .closeListener(onSelect) .child(drawable.asWidget() .alignY(0.5f) .left(5)) @@ -218,28 +210,24 @@ public void onSelect(@Nullable Runnable onSelect) { protected static class AEDynamicDrawable implements IDrawable { - Object toDraw; + Supplier> toDraw; - public AEDynamicDrawable(Object toDraw) { - setToDraw(toDraw); + public AEDynamicDrawable(Supplier> toDraw) { + this.toDraw = toDraw; } - public void setToDraw(Object toDraw) { - if (toDraw instanceof IAEItemStack iaeItemStack) { - this.toDraw = iaeItemStack.createItemStack(); - } else if (toDraw instanceof IAEFluidStack iaeFluidStack) { - this.toDraw = iaeFluidStack.getFluidStack(); - } else { - this.toDraw = toDraw; - } + public void setToDraw(Supplier> toDraw) { + this.toDraw = toDraw; } @Override public void draw(GuiContext context, int x, int y, int width, int height, WidgetTheme widgetTheme) { - if (toDraw instanceof ItemStack item) { - GuiDraw.drawItem(item, x, y, width, height); - } else if (toDraw instanceof FluidStack fluid) { - GuiDraw.drawFluidTexture(fluid, x, y, width, height, 0.0f); + IAEStack toDraw = this.toDraw.get(); + + if (toDraw instanceof IAEItemStack item) { + GuiDraw.drawItem(item.createItemStack(), x, y, width, height); + } else if (toDraw instanceof IAEFluidStack fluid) { + GuiDraw.drawFluidTexture(fluid.getFluidStack(), x, y, width, height, 0.0f); } } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java index 895333a06d4..59cf3c3ab80 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java @@ -20,7 +20,6 @@ import gregtech.api.mui.sync.appeng.AEItemSyncHandler; import gregtech.api.mui.widget.EmptyWidget; import gregtech.api.mui.widget.GhostCircuitSlotWidget; -import gregtech.api.mui.widget.appeng.AEConfigSlot; import gregtech.api.mui.widget.appeng.item.AEItemConfigSlot; import gregtech.api.mui.widget.appeng.item.AEItemDisplaySlot; import gregtech.api.util.GTUtility; @@ -228,11 +227,9 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) .debugName("Index " + index))); for (IWidget aeWidget : configGrid.getChildren()) { - // noinspection unchecked - ((AEConfigSlot) aeWidget).onSelect(() -> { + ((AEItemConfigSlot) aeWidget).onSelect(() -> { for (IWidget widget : configGrid.getChildren()) { - // noinspection unchecked - ((AEConfigSlot) widget).deselect(); + ((AEItemConfigSlot) widget).deselect(); } }); } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java index edf2b7ece37..f0f4210d803 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java @@ -14,7 +14,6 @@ import gregtech.api.mui.GTGuis; import gregtech.api.mui.sync.appeng.AEFluidSyncHandler; import gregtech.api.mui.widget.EmptyWidget; -import gregtech.api.mui.widget.appeng.AEConfigSlot; import gregtech.api.mui.widget.appeng.fluid.AEFluidConfigSlot; import gregtech.api.mui.widget.appeng.fluid.AEFluidDisplaySlot; import gregtech.client.renderer.texture.Textures; @@ -40,7 +39,6 @@ import appeng.api.storage.IMEMonitor; import appeng.api.storage.channels.IFluidStorageChannel; import appeng.api.storage.data.IAEFluidStack; -import appeng.api.storage.data.IAEItemStack; import codechicken.lib.render.CCRenderState; import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; @@ -188,11 +186,9 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) .debugName("Index " + index))); for (IWidget aeWidget : configGrid.getChildren()) { - // noinspection unchecked - ((AEConfigSlot) aeWidget).onSelect(() -> { + ((AEFluidConfigSlot) aeWidget).onSelect(() -> { for (IWidget widget : configGrid.getChildren()) { - // noinspection unchecked - ((AEConfigSlot) widget).deselect(); + ((AEFluidConfigSlot) widget).deselect(); } }); } From 0aef783d60717269ec8ea2262d538547dd75f21a Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Mon, 26 May 2025 21:29:49 -0400 Subject: [PATCH 038/136] Better amount entering --- .../api/mui/widget/appeng/AEConfigSlot.java | 21 +++++++++---------- .../appeng/slot/ExportOnlyAEFluidSlot.java | 4 ++-- .../appeng/slot/ExportOnlyAEItemSlot.java | 8 +++---- .../appeng/stack/WrappedFluidStack.java | 9 +++----- .../appeng/stack/WrappedItemStack.java | 7 ++----- 5 files changed, 21 insertions(+), 28 deletions(-) diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java index a082d177c3d..e1762a86983 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java @@ -3,12 +3,12 @@ import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuis; import gregtech.api.mui.sync.appeng.AESyncHandler; +import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedFluidStack; +import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedItemStack; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.resources.I18n; -import appeng.api.storage.data.IAEFluidStack; -import appeng.api.storage.data.IAEItemStack; import appeng.api.storage.data.IAEStack; import com.cleanroommc.modularui.api.IPanelHandler; import com.cleanroommc.modularui.api.ITheme; @@ -175,6 +175,8 @@ protected IPanelHandler getAmountPanel() { .alignY(0.5f) .left(5)) .child(new TextFieldWidget() + .setNumbers(1, Integer.MAX_VALUE) + .setDefaultNumber(1) .value(new StringValue.Dynamic(() -> String.valueOf(syncHandler.getConfigAmount(index)), str -> { try { @@ -210,13 +212,10 @@ public void onSelect(@Nullable Runnable onSelect) { protected static class AEDynamicDrawable implements IDrawable { + @NotNull Supplier> toDraw; - public AEDynamicDrawable(Supplier> toDraw) { - this.toDraw = toDraw; - } - - public void setToDraw(Supplier> toDraw) { + public AEDynamicDrawable(@NotNull Supplier> toDraw) { this.toDraw = toDraw; } @@ -224,10 +223,10 @@ public void setToDraw(Supplier> toDraw) { public void draw(GuiContext context, int x, int y, int width, int height, WidgetTheme widgetTheme) { IAEStack toDraw = this.toDraw.get(); - if (toDraw instanceof IAEItemStack item) { - GuiDraw.drawItem(item.createItemStack(), x, y, width, height); - } else if (toDraw instanceof IAEFluidStack fluid) { - GuiDraw.drawFluidTexture(fluid.getFluidStack(), x, y, width, height, 0.0f); + if (toDraw instanceof WrappedItemStack item) { + GuiDraw.drawItem(item.getDefinition(), x, y, width, height); + } else if (toDraw instanceof WrappedFluidStack fluid) { + GuiDraw.drawFluidTexture(fluid.getDelegate(), x, y, width, height, 0.0f); } } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEFluidSlot.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEFluidSlot.java index 7bb9ed67057..464c77b1659 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEFluidSlot.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEFluidSlot.java @@ -96,8 +96,8 @@ public void deserializeNBT(NBTTagCompound nbt) { @Nullable @Override public FluidStack getFluid() { - if (this.stock != null && this.stock instanceof WrappedFluidStack) { - return ((WrappedFluidStack) this.stock).getDelegate(); + if (this.stock instanceof WrappedFluidStack wrappedFluidStack) { + return wrappedFluidStack.getDelegate(); } return null; } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEItemSlot.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEItemSlot.java index 61ac0dc42e0..72b6b7d94ed 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEItemSlot.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEItemSlot.java @@ -91,8 +91,8 @@ public ItemStack extractItem(int slot, int amount, boolean simulate) { @Override public IAEItemStack requestStack() { IAEItemStack result = super.requestStack(); - if (result instanceof WrappedItemStack) { - return ((WrappedItemStack) result).getAEStack(); + if (result instanceof WrappedItemStack wrappedItemStack) { + return wrappedItemStack.getAEStack(); } else { return result; } @@ -101,8 +101,8 @@ public IAEItemStack requestStack() { @Override public IAEItemStack exceedStack() { IAEItemStack result = super.exceedStack(); - if (result instanceof WrappedItemStack) { - return ((WrappedItemStack) result).getAEStack(); + if (result instanceof WrappedItemStack wrappedItemStack) { + return wrappedItemStack.getAEStack(); } else { return result; } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedFluidStack.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedFluidStack.java index 765c39bee6c..ab8286ebe85 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedFluidStack.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedFluidStack.java @@ -17,22 +17,19 @@ import io.netty.buffer.ByteBuf; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; -/** - * @Author GlodBlock - * @Date 2023/4/22-19:25 - */ public class WrappedFluidStack implements IAEFluidStack { @NotNull - FluidStack delegate; + private FluidStack delegate; private WrappedFluidStack(@NotNull FluidStack stack) { this.delegate = stack; } @Contract("null -> null; !null -> !null") - public static WrappedFluidStack fromFluidStack(FluidStack fluidStack) { + public static WrappedFluidStack fromFluidStack(@Nullable FluidStack fluidStack) { return fluidStack == null ? null : new WrappedFluidStack(fluidStack); } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedItemStack.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedItemStack.java index a8b0f5ce4f7..c3345ba4fa2 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedItemStack.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedItemStack.java @@ -16,14 +16,10 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -/** - * @Author GlodBlock - * @Date 2023/4/22-21:02 - */ public class WrappedItemStack implements IAEItemStack { @NotNull - ItemStack delegate; + private ItemStack delegate; private WrappedItemStack(@NotNull ItemStack itemStack) { this.delegate = itemStack; @@ -35,6 +31,7 @@ public static WrappedItemStack fromItemStack(@Nullable ItemStack stack) { return stack.isEmpty() ? null : new WrappedItemStack(stack); } + @Contract("null -> null") public static WrappedItemStack fromNBT(@Nullable NBTTagCompound i) { if (i == null) { return null; From 301f9e0120d74576e3e4a584538d1ed47fbaeca2 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Mon, 26 May 2025 22:03:41 -0400 Subject: [PATCH 039/136] more popup changes --- src/main/java/gregtech/api/mui/GTGuis.java | 39 ++++++++++++------- .../api/mui/widget/appeng/AEConfigSlot.java | 27 +++++++++++-- .../appeng/fluid/AEFluidConfigSlot.java | 6 +-- .../widget/appeng/item/AEItemConfigSlot.java | 6 +-- 4 files changed, 50 insertions(+), 28 deletions(-) diff --git a/src/main/java/gregtech/api/mui/GTGuis.java b/src/main/java/gregtech/api/mui/GTGuis.java index 17d308686f7..55ef0d32ff7 100644 --- a/src/main/java/gregtech/api/mui/GTGuis.java +++ b/src/main/java/gregtech/api/mui/GTGuis.java @@ -20,7 +20,7 @@ public class GTGuis { - public static final int DEFAULT_WIDTH = 176, DEFAULT_HIEGHT = 166; + public static final int DEFAULT_WIDTH = 176, DEFAULT_HEIGHT = 166; @ApiStatus.Internal public static void registerFactories() { @@ -54,7 +54,7 @@ public static ModularPanel createPanel(ItemStack stack, int width, int height) { } public static ModularPanel createPanel(String name) { - return ModularPanel.defaultPanel(name, DEFAULT_WIDTH, DEFAULT_HIEGHT); + return ModularPanel.defaultPanel(name, DEFAULT_WIDTH, DEFAULT_HEIGHT); } public static ModularPanel defaultPanel(MetaTileEntity mte) { @@ -66,7 +66,7 @@ public static ModularPanel defaultPanel(Cover cover) { } public static ModularPanel defaultPanel(ItemStack stack) { - return createPanel(stack, DEFAULT_WIDTH, DEFAULT_HIEGHT); + return createPanel(stack, DEFAULT_WIDTH, DEFAULT_HEIGHT); } public static ModularPanel defaultPanel(MetaItem.MetaValueItem valueItem) { @@ -84,8 +84,17 @@ public static PopupPanel createPopupPanel(String name, int width, int height, bo } public static PopupPanel defaultPopupPanel(String name) { - return new PopupPanel(name) - .size(DEFAULT_WIDTH, DEFAULT_HIEGHT); + return new PopupPanel(name, true) + .size(DEFAULT_WIDTH, DEFAULT_HEIGHT); + } + + public static PopupPanel blankPopupPanel(String name, int width, int height) { + return new PopupPanel(name, false) + .size(width, height); + } + + public static PopupPanel blankPopupPanel(String name) { + return blankPopupPanel(name, DEFAULT_WIDTH, DEFAULT_HEIGHT); } public static PopupPanel defaultPopupPanel(String name, boolean disableBelow, @@ -104,18 +113,20 @@ public static class PopupPanel extends ModularPanel { @Nullable private Runnable closeListener; - private PopupPanel(@NotNull String name) { + private PopupPanel(@NotNull String name, boolean addCloseButton) { super(name); align(Alignment.Center); background(GTGuiTextures.BACKGROUND_POPUP); - child(ButtonWidget.panelCloseButton().top(5).right(5) - .onMousePressed(mouseButton -> { - if (mouseButton == 0 || mouseButton == 1) { - this.closeIfOpen(true); - return true; - } - return false; - })); + if (addCloseButton) { + child(ButtonWidget.panelCloseButton().top(5).right(5) + .onMousePressed(mouseButton -> { + if (mouseButton == 0 || mouseButton == 1) { + this.closeIfOpen(true); + return true; + } + return false; + })); + } } @Override diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java index e1762a86983..ca2b86f642b 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java @@ -17,6 +17,7 @@ import com.cleanroommc.modularui.api.widget.Interactable; import com.cleanroommc.modularui.drawable.GuiDraw; import com.cleanroommc.modularui.integration.jei.JeiIngredientProvider; +import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.screen.ModularScreen; import com.cleanroommc.modularui.screen.RichTooltip; import com.cleanroommc.modularui.screen.viewport.GuiContext; @@ -26,6 +27,7 @@ import com.cleanroommc.modularui.value.StringValue; import com.cleanroommc.modularui.value.sync.SyncHandler; import com.cleanroommc.modularui.widget.Widget; +import com.cleanroommc.modularui.widgets.ButtonWidget; import com.cleanroommc.modularui.widgets.textfield.TextFieldWidget; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -116,8 +118,11 @@ public int getSlotHoverColor() { @Override public @NotNull Result onMousePressed(int mouseButton) { - // If no stack was clicked in, open amount selector - if (mouseButton == 0 && !isAmountPanelOpen() && getSyncHandler().hasConfig(index)) { + if (mouseButton == 1) { + getSyncHandler().clearConfig(index); + deselect(); + return Result.SUCCESS; + } else if (mouseButton == 0 && !isAmountPanelOpen() && getSyncHandler().hasConfig(index)) { if (onSelect != null) { onSelect.run(); } @@ -169,7 +174,7 @@ protected IPanelHandler getAmountPanel() { AESyncHandler syncHandler = getSyncHandler(); AEDynamicDrawable drawable = new AEDynamicDrawable(() -> syncHandler.getConfig(index)); - return GTGuis.createPopupPanel("ae_slot_amount." + index, 100, 18 + 5 * 2) + ModularPanel popupPanel = GTGuis.blankPopupPanel("ae_slot_amount." + index, 100, 18 + 5 * 2) .closeListener(onSelect) .child(drawable.asWidget() .alignY(0.5f) @@ -187,8 +192,22 @@ protected IPanelHandler getAmountPanel() { } })) .size(50, 10) - .alignY(0.5f) + .top(7) // alignY didn't work :whar: .left(18 + 5 * 2)); + + popupPanel.child(ButtonWidget.panelCloseButton() + .onMousePressed(button -> { + if (button == 0 || button == 1) { + popupPanel.closeIfOpen(true); + return true; + } + + return false; + }) + .alignY(0.5f) + .right(5)); + + return popupPanel; }, true); } diff --git a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java index ccff92b130e..799e21d7628 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java @@ -102,11 +102,7 @@ public void drawOverlay(ModularGuiContext context, WidgetTheme widgetTheme) { public @NotNull Result onMousePressed(int mouseButton) { if (isAutoPull.getAsBoolean()) return Result.IGNORE; - if (mouseButton == 1) { - // Right click to clear - getSyncHandler().clearConfig(index); - return Result.SUCCESS; - } else if (mouseButton == 0) { + if (mouseButton == 0) { ItemStack heldItem = getSyncHandler().getSyncManager().getCursorItem(); FluidStack heldFluid = FluidUtil.getFluidContained(heldItem); diff --git a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java index 185b7d9b3e5..f5f87302b47 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java @@ -89,11 +89,7 @@ public void drawOverlay(ModularGuiContext context, WidgetTheme widgetTheme) { public @NotNull Result onMousePressed(int mouseButton) { if (isAutoPull.getAsBoolean()) return Result.IGNORE; - if (mouseButton == 1) { - // Right click to clear - getSyncHandler().clearConfig(index); - return Result.SUCCESS; - } else if (mouseButton == 0) { + if (mouseButton == 0) { // Left click to set item/change amount ItemStack heldItem = getSyncHandler().getSyncManager().getCursorItem(); From 87ce22659bafb40b65f5c467da8fc9773310fe68 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Mon, 26 May 2025 22:25:20 -0400 Subject: [PATCH 040/136] popup changes pt2 - better drawer again --- .../api/mui/widget/appeng/AEConfigSlot.java | 41 ++++--------------- .../widget/appeng/AEStackPreviewWidget.java | 27 ++++++++++++ .../appeng/fluid/AEFluidConfigSlot.java | 14 +++++++ .../widget/appeng/item/AEItemConfigSlot.java | 14 +++++++ 4 files changed, 64 insertions(+), 32 deletions(-) create mode 100644 src/main/java/gregtech/api/mui/widget/appeng/AEStackPreviewWidget.java diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java index ca2b86f642b..8ef74d87545 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java @@ -3,8 +3,6 @@ import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuis; import gregtech.api.mui.sync.appeng.AESyncHandler; -import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedFluidStack; -import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedItemStack; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.resources.I18n; @@ -20,7 +18,6 @@ import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.screen.ModularScreen; import com.cleanroommc.modularui.screen.RichTooltip; -import com.cleanroommc.modularui.screen.viewport.GuiContext; import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; import com.cleanroommc.modularui.theme.WidgetSlotTheme; import com.cleanroommc.modularui.theme.WidgetTheme; @@ -33,7 +30,6 @@ import org.jetbrains.annotations.Nullable; import java.util.function.BooleanSupplier; -import java.util.function.Supplier; public abstract class AEConfigSlot> extends Widget> implements JeiIngredientProvider, Interactable { @@ -172,13 +168,13 @@ protected IPanelHandler getAmountPanel() { if (amountPanel == null) { amountPanel = IPanelHandler.simple(getPanel(), (parentPanel, player) -> { AESyncHandler syncHandler = getSyncHandler(); - AEDynamicDrawable drawable = new AEDynamicDrawable(() -> syncHandler.getConfig(index)); ModularPanel popupPanel = GTGuis.blankPopupPanel("ae_slot_amount." + index, 100, 18 + 5 * 2) .closeListener(onSelect) - .child(drawable.asWidget() - .alignY(0.5f) - .left(5)) + .child(createPopupDrawable() + .size(18) + .left(5) + .top(5)) .child(new TextFieldWidget() .setNumbers(1, Integer.MAX_VALUE) .setDefaultNumber(1) @@ -192,8 +188,8 @@ protected IPanelHandler getAmountPanel() { } })) .size(50, 10) - .top(7) // alignY didn't work :whar: - .left(18 + 5 * 2)); + .left(18 + 5 * 2) + .top(7)); // alignY didn't work :whar: popupPanel.child(ButtonWidget.panelCloseButton() .onMousePressed(button -> { @@ -204,8 +200,8 @@ protected IPanelHandler getAmountPanel() { return false; }) - .alignY(0.5f) - .right(5)); + .right(5) + .alignY(0.5f)); return popupPanel; }, true); @@ -229,24 +225,5 @@ public void onSelect(@Nullable Runnable onSelect) { this.onSelect = onSelect; } - protected static class AEDynamicDrawable implements IDrawable { - - @NotNull - Supplier> toDraw; - - public AEDynamicDrawable(@NotNull Supplier> toDraw) { - this.toDraw = toDraw; - } - - @Override - public void draw(GuiContext context, int x, int y, int width, int height, WidgetTheme widgetTheme) { - IAEStack toDraw = this.toDraw.get(); - - if (toDraw instanceof WrappedItemStack item) { - GuiDraw.drawItem(item.getDefinition(), x, y, width, height); - } else if (toDraw instanceof WrappedFluidStack fluid) { - GuiDraw.drawFluidTexture(fluid.getDelegate(), x, y, width, height, 0.0f); - } - } - } + protected abstract @NotNull AEStackPreviewWidget createPopupDrawable(); } diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEStackPreviewWidget.java b/src/main/java/gregtech/api/mui/widget/appeng/AEStackPreviewWidget.java new file mode 100644 index 00000000000..76cf0f7d53e --- /dev/null +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEStackPreviewWidget.java @@ -0,0 +1,27 @@ +package gregtech.api.mui.widget.appeng; + +import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; +import com.cleanroommc.modularui.theme.WidgetTheme; +import com.cleanroommc.modularui.widget.Widget; +import org.jetbrains.annotations.NotNull; + +public class AEStackPreviewWidget extends Widget { + + @NotNull + AEDrawFunction drawFunction; + + public AEStackPreviewWidget(@NotNull AEDrawFunction drawFunction) { + this.drawFunction = drawFunction; + } + + @Override + public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { + drawFunction.draw(1, 1, getArea().w() - 1, getArea().h() - 1); + } + + @FunctionalInterface + public interface AEDrawFunction { + + void draw(int x, int y, int width, int height); + } +} diff --git a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java index 799e21d7628..27aa5302b3f 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java @@ -1,7 +1,9 @@ package gregtech.api.mui.widget.appeng.fluid; +import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.sync.appeng.AEFluidSyncHandler; import gregtech.api.mui.widget.appeng.AEConfigSlot; +import gregtech.api.mui.widget.appeng.AEStackPreviewWidget; import gregtech.api.util.FluidTooltipUtil; import gregtech.api.util.TextFormattingUtil; import gregtech.client.utils.RenderUtil; @@ -16,6 +18,7 @@ import appeng.api.storage.data.IAEFluidStack; import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.api.widget.Interactable; +import com.cleanroommc.modularui.drawable.GuiDraw; import com.cleanroommc.modularui.integration.jei.JeiGhostIngredientSlot; import com.cleanroommc.modularui.integration.jei.ModularUIJeiPlugin; import com.cleanroommc.modularui.screen.RichTooltip; @@ -130,4 +133,15 @@ public void setGhostIngredient(@NotNull FluidStack ingredient) { IAEFluidStack config = getSyncHandler().getConfig(index); return config == null ? null : config.getFluidStack(); } + + @Override + protected @NotNull AEStackPreviewWidget createPopupDrawable() { + return new AEStackPreviewWidget((x, y, width, height) -> { + WrappedFluidStack stack = (WrappedFluidStack) getSyncHandler().getConfig(index); + if (stack != null) { + GuiDraw.drawFluidTexture(stack.getDelegate(), x, y, width, height, 0.0f); + } + }) + .background(GTGuiTextures.FLUID_SLOT); + } } diff --git a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java index f5f87302b47..8d181b95a17 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java @@ -1,7 +1,9 @@ package gregtech.api.mui.widget.appeng.item; +import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.sync.appeng.AEItemSyncHandler; import gregtech.api.mui.widget.appeng.AEConfigSlot; +import gregtech.api.mui.widget.appeng.AEStackPreviewWidget; import gregtech.api.util.TextFormattingUtil; import gregtech.client.utils.RenderUtil; import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedItemStack; @@ -10,6 +12,7 @@ import net.minecraft.item.ItemStack; import appeng.api.storage.data.IAEItemStack; +import com.cleanroommc.modularui.drawable.GuiDraw; import com.cleanroommc.modularui.integration.jei.JeiGhostIngredientSlot; import com.cleanroommc.modularui.integration.jei.ModularUIJeiPlugin; import com.cleanroommc.modularui.screen.RichTooltip; @@ -117,4 +120,15 @@ public void setGhostIngredient(@NotNull ItemStack ingredient) { IAEItemStack config = getSyncHandler().getConfig(index); return config == null ? null : config.createItemStack(); } + + @Override + protected @NotNull AEStackPreviewWidget createPopupDrawable() { + return new AEStackPreviewWidget((x, y, width, height) -> { + IAEItemStack stack = getSyncHandler().getConfig(index); + if (stack != null) { + GuiDraw.drawItem(stack.getDefinition(), x, y, width, height); + } + }) + .background(GTGuiTextures.SLOT); + } } From d6462c9516fccf1724f2b9adab84b59c6cb826b9 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Mon, 26 May 2025 22:41:08 -0400 Subject: [PATCH 041/136] popup changes pt3 - proper draw-er --- .../api/mui/widget/appeng/AEConfigSlot.java | 2 +- .../widget/appeng/AEStackPreviewWidget.java | 22 +++++++------- .../appeng/fluid/AEFluidConfigSlot.java | 30 ++++++++++++++----- .../widget/appeng/item/AEItemConfigSlot.java | 30 ++++++++++++++----- 4 files changed, 59 insertions(+), 25 deletions(-) diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java index 8ef74d87545..8c3d11f0792 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java @@ -225,5 +225,5 @@ public void onSelect(@Nullable Runnable onSelect) { this.onSelect = onSelect; } - protected abstract @NotNull AEStackPreviewWidget createPopupDrawable(); + protected abstract @NotNull AEStackPreviewWidget createPopupDrawable(); } diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEStackPreviewWidget.java b/src/main/java/gregtech/api/mui/widget/appeng/AEStackPreviewWidget.java index 76cf0f7d53e..c288efddd96 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEStackPreviewWidget.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEStackPreviewWidget.java @@ -1,27 +1,29 @@ package gregtech.api.mui.widget.appeng; +import appeng.api.storage.data.IAEStack; +import com.cleanroommc.modularui.integration.jei.JeiIngredientProvider; import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; import com.cleanroommc.modularui.theme.WidgetTheme; import com.cleanroommc.modularui.widget.Widget; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; -public class AEStackPreviewWidget extends Widget { +import java.util.function.Supplier; + +public abstract class AEStackPreviewWidget> extends Widget> + implements JeiIngredientProvider { @NotNull - AEDrawFunction drawFunction; + protected final Supplier stackToDraw; - public AEStackPreviewWidget(@NotNull AEDrawFunction drawFunction) { - this.drawFunction = drawFunction; + public AEStackPreviewWidget(@NotNull Supplier stackToDraw) { + this.stackToDraw = stackToDraw; } @Override public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { - drawFunction.draw(1, 1, getArea().w() - 1, getArea().h() - 1); + draw(stackToDraw.get(), 1, 1, getArea().w() - 2, getArea().h() - 2); } - @FunctionalInterface - public interface AEDrawFunction { - - void draw(int x, int y, int width, int height); - } + public abstract void draw(@Nullable T stackToDraw, int x, int y, int width, int height); } diff --git a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java index 27aa5302b3f..eabf5d19cbd 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java @@ -29,6 +29,7 @@ import org.jetbrains.annotations.Nullable; import java.util.function.BooleanSupplier; +import java.util.function.Supplier; public class AEFluidConfigSlot extends AEConfigSlot implements Interactable, JeiGhostIngredientSlot { @@ -135,13 +136,28 @@ public void setGhostIngredient(@NotNull FluidStack ingredient) { } @Override - protected @NotNull AEStackPreviewWidget createPopupDrawable() { - return new AEStackPreviewWidget((x, y, width, height) -> { - WrappedFluidStack stack = (WrappedFluidStack) getSyncHandler().getConfig(index); - if (stack != null) { - GuiDraw.drawFluidTexture(stack.getDelegate(), x, y, width, height, 0.0f); - } - }) + protected @NotNull AEStackPreviewWidget createPopupDrawable() { + return new AEFluidStackPreviewWidget(() -> getSyncHandler().getConfig(index)) .background(GTGuiTextures.FLUID_SLOT); } + + private static class AEFluidStackPreviewWidget extends AEStackPreviewWidget { + + public AEFluidStackPreviewWidget(@NotNull Supplier stackToDraw) { + super(stackToDraw); + } + + @Override + public void draw(@Nullable IAEFluidStack stackToDraw, int x, int y, int width, int height) { + if (stackToDraw instanceof WrappedFluidStack wrappedFluidStack) { + GuiDraw.drawFluidTexture(wrappedFluidStack.getDelegate(), x, y, width, height, 0.0f); + } + } + + @Override + public @Nullable Object getIngredient() { + IAEFluidStack stack = stackToDraw.get(); + return stack == null ? null : stack.getFluidStack(); + } + } } diff --git a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java index 8d181b95a17..262b3eda6e2 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java @@ -23,6 +23,7 @@ import org.jetbrains.annotations.Nullable; import java.util.function.BooleanSupplier; +import java.util.function.Supplier; public class AEItemConfigSlot extends AEConfigSlot implements JeiGhostIngredientSlot { @@ -122,13 +123,28 @@ public void setGhostIngredient(@NotNull ItemStack ingredient) { } @Override - protected @NotNull AEStackPreviewWidget createPopupDrawable() { - return new AEStackPreviewWidget((x, y, width, height) -> { - IAEItemStack stack = getSyncHandler().getConfig(index); - if (stack != null) { - GuiDraw.drawItem(stack.getDefinition(), x, y, width, height); - } - }) + protected @NotNull AEStackPreviewWidget createPopupDrawable() { + return new AEFluidStackPreviewWidget(() -> getSyncHandler().getConfig(index)) .background(GTGuiTextures.SLOT); } + + private static class AEFluidStackPreviewWidget extends AEStackPreviewWidget { + + public AEFluidStackPreviewWidget(@NotNull Supplier stackToDraw) { + super(stackToDraw); + } + + @Override + public void draw(@Nullable IAEItemStack stackToDraw, int x, int y, int width, int height) { + if (stackToDraw instanceof WrappedItemStack wrappedItemStack) { + GuiDraw.drawItem(wrappedItemStack.getDefinition(), x, y, width, height); + } + } + + @Override + public @Nullable Object getIngredient() { + IAEItemStack stack = stackToDraw.get(); + return stack == null ? null : stack.createItemStack(); + } + } } From eb83040ae946d3bf1d7f4cb1e1ee6a566cc2897b Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Tue, 27 May 2025 22:06:48 -0400 Subject: [PATCH 042/136] Various tooltip changes, and give the popup slot tooltips --- .../api/mui/widget/appeng/AEConfigSlot.java | 4 -- .../api/mui/widget/appeng/AEDisplaySlot.java | 6 +-- .../widget/appeng/AEStackPreviewWidget.java | 5 +++ .../appeng/fluid/AEFluidConfigSlot.java | 22 ++++------ .../appeng/fluid/AEFluidDisplaySlot.java | 16 ++------ .../widget/appeng/item/AEItemConfigSlot.java | 13 ++++-- src/main/java/gregtech/api/util/KeyUtil.java | 41 +++++++++++++++++++ 7 files changed, 69 insertions(+), 38 deletions(-) create mode 100644 src/main/java/gregtech/api/util/KeyUtil.java diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java index 8c3d11f0792..391f7ac61f6 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java @@ -54,10 +54,6 @@ public AEConfigSlot(boolean isStocking, int index, BooleanSupplier isAutoPull) { this.index = index; this.isAutoPull = isAutoPull; size(18); - } - - @Override - public void onInit() { tooltipBuilder(this::buildTooltip); } diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEDisplaySlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEDisplaySlot.java index cd9d4e802a1..b8986ff5c8f 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEDisplaySlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEDisplaySlot.java @@ -21,14 +21,10 @@ public abstract class AEDisplaySlot> extends Widget> extends Widget public AEStackPreviewWidget(@NotNull Supplier stackToDraw) { this.stackToDraw = stackToDraw; + tooltipAutoUpdate(true); + tooltipBuilder(this::buildTooltip); } + protected abstract void buildTooltip(@NotNull RichTooltip tooltip); + @Override public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { draw(stackToDraw.get(), 1, 1, getArea().w() - 2, getArea().h() - 2); diff --git a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java index eabf5d19cbd..c571cc4682d 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java @@ -4,11 +4,10 @@ import gregtech.api.mui.sync.appeng.AEFluidSyncHandler; import gregtech.api.mui.widget.appeng.AEConfigSlot; import gregtech.api.mui.widget.appeng.AEStackPreviewWidget; -import gregtech.api.util.FluidTooltipUtil; +import gregtech.api.util.KeyUtil; import gregtech.api.util.TextFormattingUtil; import gregtech.client.utils.RenderUtil; import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedFluidStack; -import gregtech.common.mui.widget.GTFluidSlot; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.item.ItemStack; @@ -16,7 +15,6 @@ import net.minecraftforge.fluids.FluidUtil; import appeng.api.storage.data.IAEFluidStack; -import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.api.widget.Interactable; import com.cleanroommc.modularui.drawable.GuiDraw; import com.cleanroommc.modularui.integration.jei.JeiGhostIngredientSlot; @@ -51,16 +49,7 @@ protected void buildTooltip(@NotNull RichTooltip tooltip) { if (config == null) { super.buildTooltip(tooltip); } else { - FluidStack stack = config.getFluidStack(); - tooltip.addLine(IKey.str(stack.getLocalizedName())); - tooltip.addLine(IKey.str("%,d L", stack.amount)); - - for (String fluidTooltip : FluidTooltipUtil.getFluidTooltip(stack)) { - if (fluidTooltip.isEmpty()) continue; - tooltip.addLine(IKey.str(fluidTooltip)); - } - - GTFluidSlot.addIngotMolFluidTooltip(stack, tooltip); + KeyUtil.fluidInfo(((WrappedFluidStack) config).getDelegate(), tooltip, false, true, true); } } @@ -147,6 +136,13 @@ public AEFluidStackPreviewWidget(@NotNull Supplier stackToDraw) { super(stackToDraw); } + @Override + protected void buildTooltip(@NotNull RichTooltip tooltip) { + if (stackToDraw.get() instanceof WrappedFluidStack wrappedFluidStack) { + KeyUtil.fluidInfo(wrappedFluidStack.getDelegate(), tooltip, false, true, false); + } + } + @Override public void draw(@Nullable IAEFluidStack stackToDraw, int x, int y, int width, int height) { if (stackToDraw instanceof WrappedFluidStack wrappedFluidStack) { diff --git a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidDisplaySlot.java b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidDisplaySlot.java index ff6cc2a54da..a17edc1ceba 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidDisplaySlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidDisplaySlot.java @@ -2,15 +2,14 @@ import gregtech.api.mui.sync.appeng.AEFluidSyncHandler; import gregtech.api.mui.widget.appeng.AEDisplaySlot; -import gregtech.api.util.FluidTooltipUtil; +import gregtech.api.util.KeyUtil; import gregtech.api.util.TextFormattingUtil; import gregtech.client.utils.RenderUtil; -import gregtech.common.mui.widget.GTFluidSlot; +import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedFluidStack; import net.minecraftforge.fluids.FluidStack; import appeng.api.storage.data.IAEFluidStack; -import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.screen.RichTooltip; import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; import com.cleanroommc.modularui.theme.WidgetTheme; @@ -29,16 +28,7 @@ public AEFluidDisplaySlot(int index) { protected void buildTooltip(@NotNull RichTooltip tooltip) { IAEFluidStack stock = getSyncHandler().getStock(index); if (stock != null) { - FluidStack stack = stock.getFluidStack(); - tooltip.addLine(IKey.str(stack.getLocalizedName())); - tooltip.addLine(IKey.str("%,d L", stack.amount)); - - for (String fluidTooltip : FluidTooltipUtil.getFluidTooltip(stack)) { - if (fluidTooltip.isEmpty()) continue; - tooltip.addLine(IKey.str(fluidTooltip)); - } - - GTFluidSlot.addIngotMolFluidTooltip(stack, tooltip); + KeyUtil.fluidInfo(((WrappedFluidStack) stock).getDelegate(), tooltip); } } diff --git a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java index 262b3eda6e2..b32984b2d66 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java @@ -124,16 +124,23 @@ public void setGhostIngredient(@NotNull ItemStack ingredient) { @Override protected @NotNull AEStackPreviewWidget createPopupDrawable() { - return new AEFluidStackPreviewWidget(() -> getSyncHandler().getConfig(index)) + return new AEItemStackPreviewWidget(() -> getSyncHandler().getConfig(index)) .background(GTGuiTextures.SLOT); } - private static class AEFluidStackPreviewWidget extends AEStackPreviewWidget { + private static class AEItemStackPreviewWidget extends AEStackPreviewWidget { - public AEFluidStackPreviewWidget(@NotNull Supplier stackToDraw) { + public AEItemStackPreviewWidget(@NotNull Supplier stackToDraw) { super(stackToDraw); } + @Override + protected void buildTooltip(@NotNull RichTooltip tooltip) { + if (stackToDraw.get() instanceof WrappedItemStack wrappedItemStack) { + tooltip.addFromItem(wrappedItemStack.getDefinition()); + } + } + @Override public void draw(@Nullable IAEItemStack stackToDraw, int x, int y, int width, int height) { if (stackToDraw instanceof WrappedItemStack wrappedItemStack) { diff --git a/src/main/java/gregtech/api/util/KeyUtil.java b/src/main/java/gregtech/api/util/KeyUtil.java new file mode 100644 index 00000000000..39d79b713b4 --- /dev/null +++ b/src/main/java/gregtech/api/util/KeyUtil.java @@ -0,0 +1,41 @@ +package gregtech.api.util; + +import gregtech.common.mui.widget.GTFluidSlot; + +import net.minecraftforge.fluids.FluidStack; + +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.screen.RichTooltip; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class KeyUtil { + + public static void fluidInfo(@Nullable FluidStack stack, @NotNull RichTooltip tooltip, boolean showAmount, + boolean showTooltip, boolean showMolAmount) { + if (stack == null) return; + + // TODO: use GTFluid.GTMaterialFluid#getLocalizedKey when 2672 merges for more accurate names + tooltip.addLine(IKey.str(stack.getLocalizedName())); + + if (showAmount) { + tooltip.addLine(IKey.str("%,d L", stack.amount)); + } + + if (showTooltip) { + for (String fluidToolTip : FluidTooltipUtil.getFluidTooltip(stack)) { + if (!tooltip.isEmpty()) { + tooltip.addLine(IKey.str(fluidToolTip)); + } + } + } + + if (showMolAmount) { + GTFluidSlot.addIngotMolFluidTooltip(stack, tooltip); + } + } + + public static void fluidInfo(@Nullable FluidStack stack, @NotNull RichTooltip tooltip) { + fluidInfo(stack, tooltip, true, true, true); + } +} From 2b39f26f48e5e14872d31096993aca4ad48ee266 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Tue, 27 May 2025 22:16:32 -0400 Subject: [PATCH 043/136] Logo was the wrong size in the hatches --- .../multiblockpart/appeng/MetaTileEntityMEInputHatch.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java index f0f4210d803..9b81708a20f 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java @@ -216,7 +216,8 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) .child(GTGuiTextures.ARROW_DOUBLE.asWidget()) .child(new EmptyWidget() .size(18)) - .child(GTGuiTextures.getLogo(getUITheme()).asWidget())); + .child(GTGuiTextures.getLogo(getUITheme()).asWidget() + .size(17))); } protected Widget getExtraButton() { From b0938a9b71ec292f94c4467304528e339560ee52 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Wed, 28 May 2025 19:22:05 -0400 Subject: [PATCH 044/136] Don't allot amount popup to be opened if stocking --- src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java index 391f7ac61f6..cf7573947fd 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java @@ -114,7 +114,7 @@ public int getSlotHoverColor() { getSyncHandler().clearConfig(index); deselect(); return Result.SUCCESS; - } else if (mouseButton == 0 && !isAmountPanelOpen() && getSyncHandler().hasConfig(index)) { + } else if (!isStocking && mouseButton == 0 && !isAmountPanelOpen() && getSyncHandler().hasConfig(index)) { if (onSelect != null) { onSelect.run(); } From 6583559258036901d479ee0b1f7a6c57fa766184 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Wed, 28 May 2025 19:24:38 -0400 Subject: [PATCH 045/136] Use better ID name --- .../java/gregtech/api/mui/sync/appeng/AESyncHandler.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java index 73b1f5ee5c8..3d0d4526627 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java @@ -25,7 +25,7 @@ public abstract class AESyncHandler> extends SyncHandler { public static final int slotSyncID = rollingID++; public static final int setConfigID = rollingID++; public static final int clearConfigID = rollingID++; - public static final int changeConfigID = rollingID++; + public static final int changeConfigAmountID = rollingID++; protected final IConfigurableSlot[] slots; private IConfigurableSlot[] cached; @@ -107,7 +107,7 @@ public void detectAndSendChanges(boolean init) { public void readOnServer(int id, PacketBuffer buf) throws IOException { if (id == clearConfigID) { slots[buf.readVarInt()].setConfig(null); - } else if (id == changeConfigID) { + } else if (id == changeConfigAmountID) { T config = getConfig(buf.readVarInt()); if (config != null) { config.setStackSize(buf.readInt()); @@ -182,7 +182,7 @@ public long getConfigAmount(int index) { @SideOnly(Side.CLIENT) public void setConfigAmount(int index, int newAmount) { - syncToServer(changeConfigID, buf -> { + syncToServer(changeConfigAmountID, buf -> { buf.writeVarInt(index); buf.writeInt(newAmount); }); From ec253b76874fac79ef5cb74351ff38d95ff85592 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Wed, 28 May 2025 19:25:47 -0400 Subject: [PATCH 046/136] Move cache and byte buf adapter initialization into AESyncHandler clinit so they can be final --- .../java/gregtech/api/mui/sync/appeng/AESyncHandler.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java index 3d0d4526627..c48483d257d 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java @@ -28,10 +28,10 @@ public abstract class AESyncHandler> extends SyncHandler { public static final int changeConfigAmountID = rollingID++; protected final IConfigurableSlot[] slots; - private IConfigurableSlot[] cached; + private final IConfigurableSlot[] cached; private final Int2ObjectMap> changeMap = new Int2ObjectOpenHashMap<>(); - private IByteBufAdapter byteBufAdapter; + private final IByteBufAdapter byteBufAdapter; @Nullable private final Runnable dirtyNotifier; @@ -39,14 +39,14 @@ public abstract class AESyncHandler> extends SyncHandler { public AESyncHandler(IConfigurableSlot[] slots, @Nullable Runnable dirtyNotifier) { this.slots = slots; this.dirtyNotifier = dirtyNotifier; + this.cached = initializeCache(); + this.byteBufAdapter = initializeByteBufAdapter(); } @Override public void init(String key, PanelSyncManager syncManager) { super.init(key, syncManager); onClient = syncManager.isClient(); - cached = initializeCache(); - byteBufAdapter = initializeByteBufAdapter(); } protected abstract @NotNull IConfigurableSlot @NotNull [] initializeCache(); From 0a237f017217a312cc4246fa28ff60e8d6336e70 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Wed, 28 May 2025 19:29:21 -0400 Subject: [PATCH 047/136] Remove unused onClient field --- src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java index c48483d257d..5c78a7f6496 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java @@ -19,7 +19,6 @@ public abstract class AESyncHandler> extends SyncHandler { - protected boolean onClient; private static int rollingID = 0; public static final int slotSyncID = rollingID++; @@ -46,7 +45,6 @@ public AESyncHandler(IConfigurableSlot[] slots, @Nullable Runnable dirtyNotif @Override public void init(String key, PanelSyncManager syncManager) { super.init(key, syncManager); - onClient = syncManager.isClient(); } protected abstract @NotNull IConfigurableSlot @NotNull [] initializeCache(); From 04a00bf0a6e8c09598156549cca1672e5474463c Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Wed, 28 May 2025 19:30:17 -0400 Subject: [PATCH 048/136] Set IDs manually --- .../gregtech/api/mui/sync/appeng/AESyncHandler.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java index 5c78a7f6496..ab134a2ed90 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java @@ -19,12 +19,10 @@ public abstract class AESyncHandler> extends SyncHandler { - private static int rollingID = 0; - - public static final int slotSyncID = rollingID++; - public static final int setConfigID = rollingID++; - public static final int clearConfigID = rollingID++; - public static final int changeConfigAmountID = rollingID++; + public static final int slotSyncID = 0; + public static final int setConfigID = 1; + public static final int clearConfigID = 2; + public static final int changeConfigAmountID = 3; protected final IConfigurableSlot[] slots; private final IConfigurableSlot[] cached; From 75e107e295677f21b222211ca96d0b51003022f3 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Wed, 28 May 2025 21:17:52 -0400 Subject: [PATCH 049/136] Port only allowing a stack if no other slot in the bus/hatch if no other slots already have it. --- .../mui/sync/appeng/AEFluidSyncHandler.java | 15 +++++++++-- .../mui/sync/appeng/AEItemSyncHandler.java | 18 +++++++++++-- .../api/mui/sync/appeng/AESyncHandler.java | 16 +++++++----- .../appeng/MetaTileEntityMEInputBus.java | 3 +-- .../appeng/MetaTileEntityMEInputHatch.java | 3 +-- .../appeng/MetaTileEntityMEStockingBus.java | 26 ++++++++++++++----- .../appeng/MetaTileEntityMEStockingHatch.java | 1 + 7 files changed, 62 insertions(+), 20 deletions(-) diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java index 86ee3532d23..c859a8f878d 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java @@ -1,5 +1,6 @@ package gregtech.api.mui.sync.appeng; +import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEFluidList; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEFluidSlot; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.IConfigurableSlot; import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedFluidStack; @@ -15,8 +16,11 @@ public class AEFluidSyncHandler extends AESyncHandler { - public AEFluidSyncHandler(IConfigurableSlot[] config, @Nullable Runnable dirtyNotifier) { - super(config, dirtyNotifier); + private final ExportOnlyAEFluidList fluidList; + + public AEFluidSyncHandler(ExportOnlyAEFluidList fluidList, @Nullable Runnable dirtyNotifier) { + super(fluidList.getInventory(), fluidList.isStocking(), dirtyNotifier); + this.fluidList = fluidList; } @Override @@ -34,6 +38,13 @@ public AEFluidSyncHandler(IConfigurableSlot[] config, @Nullable R return IAEStackByteBufAdapter.wrappedFluidStackAdapter; } + @Override + public boolean isStackValidForSlot(int index, @Nullable IAEFluidStack stack) { + if (stack == null) return true; + if (!isStocking) return true; + return !fluidList.hasStackInConfig(((WrappedFluidStack) stack).getDelegate(), true); + } + @SideOnly(Side.CLIENT) public void setConfig(int index, @Nullable FluidStack stack) { setConfig(index, WrappedFluidStack.fromFluidStack(stack)); diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java index a719f34d3c9..b179c0bfc7d 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java @@ -1,10 +1,13 @@ package gregtech.api.mui.sync.appeng; +import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEItemList; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEItemSlot; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.IConfigurableSlot; import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedItemStack; import net.minecraft.item.ItemStack; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import appeng.api.storage.data.IAEItemStack; import com.cleanroommc.modularui.utils.serialization.IByteBufAdapter; @@ -13,8 +16,11 @@ public class AEItemSyncHandler extends AESyncHandler { - public AEItemSyncHandler(IConfigurableSlot[] config, @Nullable Runnable dirtyNotifier) { - super(config, dirtyNotifier); + private final ExportOnlyAEItemList itemList; + + public AEItemSyncHandler(ExportOnlyAEItemList itemList, @Nullable Runnable dirtyNotifier) { + super(itemList.getInventory(), itemList.isStocking(), dirtyNotifier); + this.itemList = itemList; } @Override @@ -32,6 +38,14 @@ public AEItemSyncHandler(IConfigurableSlot[] config, @Nullable Run return IAEStackByteBufAdapter.wrappedItemStackAdapter; } + @Override + public boolean isStackValidForSlot(int index, @Nullable IAEItemStack stack) { + if (stack == null || stack.getDefinition().isEmpty()) return true; + if (!isStocking) return true; + return !itemList.hasStackInConfig(stack.getDefinition(), true); + } + + @SideOnly(Side.CLIENT) public void setConfig(int index, @Nullable ItemStack stack) { setConfig(index, WrappedItemStack.fromItemStack(stack)); } diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java index ab134a2ed90..20e54dbd922 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java @@ -24,6 +24,7 @@ public abstract class AESyncHandler> extends SyncHandler { public static final int clearConfigID = 2; public static final int changeConfigAmountID = 3; + protected final boolean isStocking; protected final IConfigurableSlot[] slots; private final IConfigurableSlot[] cached; private final Int2ObjectMap> changeMap = new Int2ObjectOpenHashMap<>(); @@ -33,8 +34,9 @@ public abstract class AESyncHandler> extends SyncHandler { @Nullable private final Runnable dirtyNotifier; - public AESyncHandler(IConfigurableSlot[] slots, @Nullable Runnable dirtyNotifier) { + public AESyncHandler(IConfigurableSlot[] slots, boolean isStocking, @Nullable Runnable dirtyNotifier) { this.slots = slots; + this.isStocking = isStocking; this.dirtyNotifier = dirtyNotifier; this.cached = initializeCache(); this.byteBufAdapter = initializeByteBufAdapter(); @@ -49,6 +51,8 @@ public void init(String key, PanelSyncManager syncManager) { protected abstract @NotNull IByteBufAdapter initializeByteBufAdapter(); + public abstract boolean isStackValidForSlot(int index, @Nullable T stack); + @SuppressWarnings("DuplicatedCode") @Override public void detectAndSendChanges(boolean init) { @@ -109,11 +113,11 @@ public void readOnServer(int id, PacketBuffer buf) throws IOException { config.setStackSize(buf.readInt()); } } else if (id == setConfigID) { - IConfigurableSlot slot = slots[buf.readVarInt()]; - if (buf.readBoolean()) { - slot.setConfig(byteBufAdapter.deserialize(buf)); - } else { - slot.setConfig(null); + int index = buf.readVarInt(); + T newConfig = buf.readBoolean() ? byteBufAdapter.deserialize(buf) : null; + if (isStackValidForSlot(index, newConfig)) { + IConfigurableSlot slot = slots[index]; + slot.setConfig(newConfig); } } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java index 59cf3c3ab80..3e6e7398c29 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java @@ -212,8 +212,7 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) guiSyncManager.registerSlotGroup("extra_slot", 1); final String syncHandlerName = "aeSync"; - guiSyncManager.syncValue(syncHandlerName, - new AEItemSyncHandler(getAEItemHandler().getInventory(), this::markDirty)); + guiSyncManager.syncValue(syncHandlerName, new AEItemSyncHandler(getAEItemHandler(), this::markDirty)); Grid configGrid = new Grid() .pos(7, 25) diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java index 9b81708a20f..d1a9c852f73 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java @@ -171,8 +171,7 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) final boolean isStocking = getAEFluidHandler().isStocking(); final String syncHandlerName = "aeSync"; - guiSyncManager.syncValue(syncHandlerName, - new AEFluidSyncHandler(getAEFluidHandler().getInventory(), this::markDirty)); + guiSyncManager.syncValue(syncHandlerName, new AEFluidSyncHandler(getAEFluidHandler(), this::markDirty)); Grid configGrid = new Grid() .pos(7, 25) diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java index 1195d8c1307..c939788f580 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java @@ -1,6 +1,7 @@ package gregtech.common.metatileentities.multi.multiblockpart.appeng; import gregtech.api.GTValues; +import gregtech.api.capability.impl.ItemHandlerList; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.metatileentity.multiblock.MultiblockAbility; @@ -22,6 +23,7 @@ import net.minecraft.util.ResourceLocation; import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; +import net.minecraftforge.items.IItemHandler; import appeng.api.config.Actionable; import appeng.api.storage.IMEMonitor; @@ -166,7 +168,7 @@ private void validateConfig() { /** * @return True if the passed stack is found as a configuration in any other stocking buses on the multiblock. */ - private boolean testConfiguredInOtherBus(ItemStack stack) { + private boolean testConfiguredInOtherBus(@Nullable ItemStack stack) { if (stack == null || stack.isEmpty()) return false; MultiblockControllerBase controller = getController(); if (controller == null) return false; @@ -177,15 +179,27 @@ private boolean testConfiguredInOtherBus(ItemStack stack) { // in any stocking bus in the multi (besides ourselves). var abilityList = controller.getAbilities(MultiblockAbility.IMPORT_ITEMS); for (var ability : abilityList) { - if (ability instanceof ExportOnlyAEStockingItemList aeList) { - // We don't need to check for ourselves, as this case is handled elsewhere. - if (aeList == this.aeItemHandler) continue; - if (aeList.hasStackInConfig(stack, false)) { - return true; + if (ability instanceof ItemHandlerList itemHandlerList) { + for (var handler : itemHandlerList.getBackingHandlers()) { + if (checkHandler(handler, stack)) { + return true; + } } + } else if (checkHandler(ability, stack)) { + return true; } } } + + return false; + } + + private boolean checkHandler(@NotNull IItemHandler itemHandler, @NotNull ItemStack stack) { + if (itemHandler instanceof ExportOnlyAEStockingItemList itemList) { + if (itemList == this.aeItemHandler) return false; + return itemList.hasStackInConfig(stack, false); + } + return false; } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java index 96ce95ae5b9..4fee231f31b 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java @@ -157,6 +157,7 @@ private boolean testConfiguredInOtherHatch(FluidStack stack) { } } } + return false; } From a911fab183a532345841f992a15943271d0a3c2e Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Sat, 31 May 2025 16:50:58 -0400 Subject: [PATCH 050/136] Remove redundant constructor for me input bus and hatch --- src/main/java/gregtech/common/ConfigHolder.java | 8 ++++---- .../MetaTileEntityRegistration.java | 4 ++-- .../appeng/MetaTileEntityMEInputBus.java | 13 ++++++------- .../appeng/MetaTileEntityMEInputHatch.java | 13 ++++++------- 4 files changed, 18 insertions(+), 20 deletions(-) diff --git a/src/main/java/gregtech/common/ConfigHolder.java b/src/main/java/gregtech/common/ConfigHolder.java index 93cbb1dbdcf..618d967a531 100644 --- a/src/main/java/gregtech/common/ConfigHolder.java +++ b/src/main/java/gregtech/common/ConfigHolder.java @@ -335,13 +335,13 @@ public static class EnergyCompatOptions { public static class AE2CompatOptions { - @Config.Comment({ "The interval between ME Hatch/Bus interact ME network.", - "It may cause lag if the interval is too small.", "Default: 2 sec" }) - @Config.RangeInt(min = 1, max = 80) + @Config.Comment({ "The default refresh rate of ME I/O hatches", + "Setting this low may cause lag.", "Default: 40 ticks" }) + @Config.RangeInt(min = 1) public int updateIntervals = 40; @Config.Comment({ "The energy consumption of ME Hatch/Bus.", "Default: 1.0AE/t" }) - @Config.RangeDouble(min = 0.0, max = 10.0) + @Config.RangeDouble(min = 0) public double meHatchEnergyUsage = 1.0; } } diff --git a/src/main/java/gregtech/common/metatileentities/MetaTileEntityRegistration.java b/src/main/java/gregtech/common/metatileentities/MetaTileEntityRegistration.java index 55cd52e5cd4..e3c78360163 100644 --- a/src/main/java/gregtech/common/metatileentities/MetaTileEntityRegistration.java +++ b/src/main/java/gregtech/common/metatileentities/MetaTileEntityRegistration.java @@ -1056,9 +1056,9 @@ private static void multiblockParts() { // ME Hatches, IDs 11525-11539 if (Mods.AppliedEnergistics2.isModLoaded()) { MetaTileEntities.ITEM_IMPORT_BUS_ME = MetaTileEntities.registerMetaTileEntity(11525, - new MetaTileEntityMEInputBus(gregtechId("me_import_item_bus"))); + new MetaTileEntityMEInputBus(gregtechId("me_import_item_bus"), GTValues.EV)); MetaTileEntities.FLUID_IMPORT_HATCH_ME = MetaTileEntities.registerMetaTileEntity(11526, - new MetaTileEntityMEInputHatch(gregtechId("me_import_fluid_hatch"))); + new MetaTileEntityMEInputHatch(gregtechId("me_import_fluid_hatch"), GTValues.EV)); MetaTileEntities.STOCKING_BUS_ME = MetaTileEntities.registerMetaTileEntity(11527, new MetaTileEntityMEStockingBus(gregtechId("me_stocking_item_bus"))); MetaTileEntities.STOCKING_HATCH_ME = MetaTileEntities.registerMetaTileEntity(11528, diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java index 3e6e7398c29..dadc10a1461 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java @@ -1,6 +1,5 @@ package gregtech.common.metatileentities.multi.multiblockpart.appeng; -import gregtech.api.GTValues; import gregtech.api.capability.GregtechDataCodes; import gregtech.api.capability.GregtechTileCapabilities; import gregtech.api.capability.IDataStickIntractable; @@ -24,6 +23,7 @@ import gregtech.api.mui.widget.appeng.item.AEItemDisplaySlot; import gregtech.api.util.GTUtility; import gregtech.client.renderer.texture.Textures; +import gregtech.common.ConfigHolder; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEItemList; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEItemSlot; import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedItemStack; @@ -74,18 +74,17 @@ public class MetaTileEntityMEInputBus extends MetaTileEntityAEHostableChannelPar public final static String ITEM_BUFFER_TAG = "ItemSlots"; public final static String WORKING_TAG = "WorkingEnabled"; private final static int CONFIG_SIZE = 16; - private boolean workingEnabled = true; protected ExportOnlyAEItemList aeItemHandler; protected GhostCircuitItemStackHandler circuitInventory; protected NotifiableItemStackHandler extraSlotInventory; private ItemHandlerList actualImportItems; - public MetaTileEntityMEInputBus(ResourceLocation metaTileEntityId) { - this(metaTileEntityId, GTValues.EV); - } + private boolean workingEnabled = true; + protected int refreshRate; - protected MetaTileEntityMEInputBus(ResourceLocation metaTileEntityId, int tier) { + public MetaTileEntityMEInputBus(ResourceLocation metaTileEntityId, int tier) { super(metaTileEntityId, tier, false, IItemStorageChannel.class); + this.refreshRate = ConfigHolder.compat.ae2.updateIntervals; } protected ExportOnlyAEItemList getAEItemHandler() { @@ -175,7 +174,7 @@ protected void flushInventory() { @Override public MetaTileEntity createMetaTileEntity(IGregTechTileEntity iGregTechTileEntity) { - return new MetaTileEntityMEInputBus(metaTileEntityId); + return new MetaTileEntityMEInputBus(metaTileEntityId, getTier()); } @Override diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java index d1a9c852f73..f88ebe75d43 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java @@ -1,6 +1,5 @@ package gregtech.common.metatileentities.multi.multiblockpart.appeng; -import gregtech.api.GTValues; import gregtech.api.capability.GregtechDataCodes; import gregtech.api.capability.GregtechTileCapabilities; import gregtech.api.capability.IDataStickIntractable; @@ -17,6 +16,7 @@ import gregtech.api.mui.widget.appeng.fluid.AEFluidConfigSlot; import gregtech.api.mui.widget.appeng.fluid.AEFluidDisplaySlot; import gregtech.client.renderer.texture.Textures; +import gregtech.common.ConfigHolder; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEFluidList; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEFluidSlot; import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedFluidStack; @@ -63,15 +63,14 @@ public class MetaTileEntityMEInputHatch extends MetaTileEntityAEHostableChannelP public final static String FLUID_BUFFER_TAG = "FluidTanks"; public final static String WORKING_TAG = "WorkingEnabled"; private final static int CONFIG_SIZE = 16; - private boolean workingEnabled = true; protected ExportOnlyAEFluidList aeFluidHandler; - public MetaTileEntityMEInputHatch(ResourceLocation metaTileEntityId) { - this(metaTileEntityId, GTValues.EV); - } + private boolean workingEnabled = true; + protected int refreshRate; - protected MetaTileEntityMEInputHatch(ResourceLocation metaTileEntityId, int tier) { + public MetaTileEntityMEInputHatch(ResourceLocation metaTileEntityId, int tier) { super(metaTileEntityId, tier, false, IFluidStorageChannel.class); + this.refreshRate = ConfigHolder.compat.ae2.updateIntervals; } protected ExportOnlyAEFluidList getAEFluidHandler() { @@ -156,7 +155,7 @@ protected void flushInventory() { @Override public MetaTileEntity createMetaTileEntity(IGregTechTileEntity iGregTechTileEntity) { - return new MetaTileEntityMEInputHatch(this.metaTileEntityId); + return new MetaTileEntityMEInputHatch(this.metaTileEntityId, getTier()); } @Override From 1872e45691d0d464178b95304b9d39230dd578f3 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Sat, 31 May 2025 19:17:48 -0400 Subject: [PATCH 051/136] Setting popup start --- .../MetaTileEntityAEHostableChannelPart.java | 33 +++++++++- .../appeng/MetaTileEntityAEHostablePart.java | 2 +- .../appeng/MetaTileEntityMEInputBus.java | 66 +++++++++++++++++-- .../appeng/MetaTileEntityMEInputHatch.java | 61 +++++++++++++++-- .../resources/assets/gregtech/lang/en_us.lang | 1 + 5 files changed, 150 insertions(+), 13 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostableChannelPart.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostableChannelPart.java index a3042fa1ec4..7942ad17566 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostableChannelPart.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostableChannelPart.java @@ -4,6 +4,7 @@ import gregtech.common.ConfigHolder; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.ResourceLocation; import appeng.api.AEApi; @@ -20,12 +21,16 @@ public abstract class MetaTileEntityAEHostableChannelPart> extends MetaTileEntityAEHostablePart implements IControllable { + public static final String REFRESH_RATE_TAG = "RefreshRate"; + private final Class> storageChannel; + protected int refreshRate; public MetaTileEntityAEHostableChannelPart(ResourceLocation metaTileEntityId, int tier, boolean isExportHatch, Class> storageChannel) { super(metaTileEntityId, tier, isExportHatch); this.storageChannel = storageChannel; + this.refreshRate = ConfigHolder.compat.ae2.updateIntervals; } /** @@ -36,7 +41,7 @@ public MetaTileEntityAEHostableChannelPart(ResourceLocation metaTileEntityId, in public void clearMachineInventory(@NotNull List<@NotNull ItemStack> itemBuffer) {} protected boolean shouldSyncME() { - return getMeUpdateTick() % ConfigHolder.compat.ae2.updateIntervals == 0; + return getMEUpdateTick() % refreshRate == 0; } @NotNull @@ -57,4 +62,30 @@ protected IMEMonitor getMonitor() { return null; } } + + public int getRefreshRate() { + return this.refreshRate; + } + + protected void setRefreshRate(int newRefreshRate) { + this.refreshRate = newRefreshRate; + } + + @Override + public NBTTagCompound writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + + data.setInteger(REFRESH_RATE_TAG, this.refreshRate); + + return data; + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + + if (data.hasKey(REFRESH_RATE_TAG)) { + this.refreshRate = data.getInteger(REFRESH_RATE_TAG); + } + } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostablePart.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostablePart.java index a22671dc036..d67e90ac4e9 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostablePart.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostablePart.java @@ -55,7 +55,7 @@ public boolean isOnline() { return isOnline; } - public int getMeUpdateTick() { + public int getMEUpdateTick() { return meUpdateTick; } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java index dadc10a1461..323defc3e12 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java @@ -50,17 +50,22 @@ import codechicken.lib.render.CCRenderState; import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; +import com.cleanroommc.modularui.api.IPanelHandler; import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.api.widget.IWidget; import com.cleanroommc.modularui.factory.PosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.value.IntValue; +import com.cleanroommc.modularui.value.sync.IntSyncValue; import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.value.sync.SyncHandlers; import com.cleanroommc.modularui.widget.Widget; +import com.cleanroommc.modularui.widgets.ButtonWidget; import com.cleanroommc.modularui.widgets.ItemSlot; import com.cleanroommc.modularui.widgets.SlotGroupWidget; import com.cleanroommc.modularui.widgets.layout.Flow; import com.cleanroommc.modularui.widgets.layout.Grid; +import com.cleanroommc.modularui.widgets.textfield.TextFieldWidget; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -71,8 +76,9 @@ public class MetaTileEntityMEInputBus extends MetaTileEntityAEHostableChannelPar implements IMultiblockAbilityPart, IGhostSlotConfigurable, IDataStickIntractable { - public final static String ITEM_BUFFER_TAG = "ItemSlots"; - public final static String WORKING_TAG = "WorkingEnabled"; + public static final String ITEM_BUFFER_TAG = "ItemSlots"; + public static final String WORKING_TAG = "WorkingEnabled"; + private final static int CONFIG_SIZE = 16; protected ExportOnlyAEItemList aeItemHandler; protected GhostCircuitItemStackHandler circuitInventory; @@ -80,11 +86,9 @@ public class MetaTileEntityMEInputBus extends MetaTileEntityAEHostableChannelPar private ItemHandlerList actualImportItems; private boolean workingEnabled = true; - protected int refreshRate; public MetaTileEntityMEInputBus(ResourceLocation metaTileEntityId, int tier) { super(metaTileEntityId, tier, false, IItemStorageChannel.class); - this.refreshRate = ConfigHolder.compat.ae2.updateIntervals; } protected ExportOnlyAEItemList getAEItemHandler() { @@ -259,7 +263,42 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) .child(new ItemSlot() .slot(SyncHandlers.itemSlot(extraSlotInventory, 0) .slotGroup("extra_slot")) - .addTooltipLine(IKey.lang("gregtech.gui.me_bus.extra_slot")))); + .addTooltipLine(IKey.lang("gregtech.gui.me_bus.extra_slot")))) + .child(getSettingWidget(mainPanel, guiSyncManager) + .right(7) + .top(5)); + } + + protected Widget getSettingWidget(ModularPanel mainPanel, PanelSyncManager syncManager) { + IPanelHandler settingPopup = IPanelHandler.simple(mainPanel, + (parentPanel, player) -> buildSettingsPopup(syncManager), true); + + return new ButtonWidget<>() + .onMousePressed(mouse -> { + if (settingPopup.isPanelOpen()) { + settingPopup.closePanel(); + } else { + settingPopup.openPanel(); + } + + return true; + }) + .addTooltipLine(I18n.format("gregtech.machine.me.settings_button")) + .overlay(GTGuiTextures.FILTER_SETTINGS_OVERLAY); + } + + protected ModularPanel buildSettingsPopup(PanelSyncManager syncManager) { + IntSyncValue refreshRateSync = new IntSyncValue(this::getRefreshRate, this::setRefreshRate); + syncManager.syncValue("refresh_rate", refreshRateSync); + + return GTGuis.defaultPopupPanel("settings") + .child(new TextFieldWidget() + .left(5) + .top(10) + .size(50, 10) + .setNumbers(1, Integer.MAX_VALUE) + .setDefaultNumber(ConfigHolder.compat.ae2.updateIntervals) + .value(new IntValue.Dynamic(refreshRateSync::getIntValue, refreshRateSync::setIntValue))); } protected Widget getExtraButton() { @@ -304,7 +343,9 @@ public void receiveInitialSyncData(PacketBuffer buf) { @Override public NBTTagCompound writeToNBT(NBTTagCompound data) { super.writeToNBT(data); + data.setBoolean(WORKING_TAG, this.workingEnabled); + NBTTagList slots = new NBTTagList(); for (int i = 0; i < CONFIG_SIZE; i++) { ExportOnlyAEItemSlot slot = this.getAEItemHandler().getInventory()[i]; @@ -314,18 +355,21 @@ public NBTTagCompound writeToNBT(NBTTagCompound data) { slots.appendTag(slotTag); } data.setTag(ITEM_BUFFER_TAG, slots); + this.circuitInventory.write(data); - // Extra slot inventory GTUtility.writeItems(this.extraSlotInventory, "ExtraInventory", data); + return data; } @Override public void readFromNBT(NBTTagCompound data) { super.readFromNBT(data); + if (data.hasKey(WORKING_TAG)) { this.workingEnabled = data.getBoolean(WORKING_TAG); } + if (data.hasKey(ITEM_BUFFER_TAG, 9)) { NBTTagList slots = (NBTTagList) data.getTag(ITEM_BUFFER_TAG); for (NBTBase nbtBase : slots) { @@ -334,6 +378,7 @@ public void readFromNBT(NBTTagCompound data) { slot.deserializeNBT(slotTag.getCompoundTag("stack")); } } + this.circuitInventory.read(data); GTUtility.readItems(this.extraSlotInventory, "ExtraInventory", data); this.importItems = createImportItemHandler(); @@ -412,7 +457,11 @@ protected NBTTagCompound writeConfigToTag() { config.getDefinition().writeToNBT(stackNbt); configStacks.setTag(Integer.toString(i), stackNbt); } + tag.setByte("GhostCircuit", (byte) this.circuitInventory.getCircuitValue()); + + tag.setInteger(REFRESH_RATE_TAG, this.refreshRate); + return tag; } @@ -441,8 +490,13 @@ protected void readConfigFromTag(NBTTagCompound tag) { } } } + if (tag.hasKey("GhostCircuit")) { this.setGhostCircuitConfig(tag.getByte("GhostCircuit")); } + + if (tag.hasKey(REFRESH_RATE_TAG)) { + this.refreshRate = tag.getInteger(REFRESH_RATE_TAG); + } } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java index f88ebe75d43..7a68dd47f13 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java @@ -42,15 +42,20 @@ import codechicken.lib.render.CCRenderState; import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; +import com.cleanroommc.modularui.api.IPanelHandler; import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.api.widget.IWidget; import com.cleanroommc.modularui.factory.PosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.value.IntValue; +import com.cleanroommc.modularui.value.sync.IntSyncValue; import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.widget.Widget; +import com.cleanroommc.modularui.widgets.ButtonWidget; import com.cleanroommc.modularui.widgets.SlotGroupWidget; import com.cleanroommc.modularui.widgets.layout.Flow; import com.cleanroommc.modularui.widgets.layout.Grid; +import com.cleanroommc.modularui.widgets.textfield.TextFieldWidget; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -60,17 +65,16 @@ public class MetaTileEntityMEInputHatch extends MetaTileEntityAEHostableChannelPart implements IMultiblockAbilityPart, IDataStickIntractable { - public final static String FLUID_BUFFER_TAG = "FluidTanks"; - public final static String WORKING_TAG = "WorkingEnabled"; + public static final String FLUID_BUFFER_TAG = "FluidTanks"; + public static final String WORKING_TAG = "WorkingEnabled"; + private final static int CONFIG_SIZE = 16; protected ExportOnlyAEFluidList aeFluidHandler; private boolean workingEnabled = true; - protected int refreshRate; public MetaTileEntityMEInputHatch(ResourceLocation metaTileEntityId, int tier) { super(metaTileEntityId, tier, false, IFluidStorageChannel.class); - this.refreshRate = ConfigHolder.compat.ae2.updateIntervals; } protected ExportOnlyAEFluidList getAEFluidHandler() { @@ -215,7 +219,42 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) .child(new EmptyWidget() .size(18)) .child(GTGuiTextures.getLogo(getUITheme()).asWidget() - .size(17))); + .size(17))) + .child(getSettingWidget(mainPanel, guiSyncManager) + .right(7) + .top(5)); + } + + protected Widget getSettingWidget(ModularPanel mainPanel, PanelSyncManager syncManager) { + IPanelHandler settingPopup = IPanelHandler.simple(mainPanel, + (parentPanel, player) -> buildSettingsPopup(syncManager), true); + + return new ButtonWidget<>() + .onMousePressed(mouse -> { + if (settingPopup.isPanelOpen()) { + settingPopup.closePanel(); + } else { + settingPopup.openPanel(); + } + + return true; + }) + .addTooltipLine(I18n.format("gregtech.machine.me.settings_button")) + .overlay(GTGuiTextures.FILTER_SETTINGS_OVERLAY); + } + + protected ModularPanel buildSettingsPopup(PanelSyncManager syncManager) { + IntSyncValue refreshRateSync = new IntSyncValue(this::getRefreshRate, this::setRefreshRate); + syncManager.syncValue("refresh_rate", refreshRateSync); + + return GTGuis.defaultPopupPanel("settings") + .child(new TextFieldWidget() + .left(5) + .top(10) + .size(50, 10) + .setNumbers(1, Integer.MAX_VALUE) + .setDefaultNumber(ConfigHolder.compat.ae2.updateIntervals) + .value(new IntValue.Dynamic(refreshRateSync::getIntValue, refreshRateSync::setIntValue))); } protected Widget getExtraButton() { @@ -260,7 +299,9 @@ public void receiveInitialSyncData(PacketBuffer buf) { @Override public NBTTagCompound writeToNBT(NBTTagCompound data) { super.writeToNBT(data); + data.setBoolean(WORKING_TAG, this.workingEnabled); + NBTTagList tanks = new NBTTagList(); for (int i = 0; i < CONFIG_SIZE; i++) { ExportOnlyAEFluidSlot tank = this.getAEFluidHandler().getInventory()[i]; @@ -270,15 +311,18 @@ public NBTTagCompound writeToNBT(NBTTagCompound data) { tanks.appendTag(tankTag); } data.setTag(FLUID_BUFFER_TAG, tanks); + return data; } @Override public void readFromNBT(NBTTagCompound data) { super.readFromNBT(data); + if (data.hasKey(WORKING_TAG)) { this.workingEnabled = data.getBoolean(WORKING_TAG); } + if (data.hasKey(FLUID_BUFFER_TAG, 9)) { NBTTagList tanks = (NBTTagList) data.getTag(FLUID_BUFFER_TAG); for (NBTBase nbtBase : tanks) { @@ -346,6 +390,9 @@ protected NBTTagCompound writeConfigToTag() { config.writeToNBT(stackNbt); configStacks.setTag(Integer.toString(i), stackNbt); } + + tag.setInteger(REFRESH_RATE_TAG, this.refreshRate); + return tag; } @@ -374,5 +421,9 @@ protected void readConfigFromTag(NBTTagCompound tag) { } } } + + if (tag.hasKey(REFRESH_RATE_TAG)) { + this.refreshRate = tag.getInteger(REFRESH_RATE_TAG); + } } } diff --git a/src/main/resources/assets/gregtech/lang/en_us.lang b/src/main/resources/assets/gregtech/lang/en_us.lang index 3f0ed24b9d8..dac39d12331 100644 --- a/src/main/resources/assets/gregtech/lang/en_us.lang +++ b/src/main/resources/assets/gregtech/lang/en_us.lang @@ -5526,6 +5526,7 @@ gregtech.machine.me.fluid_import.data_stick.name=§oME Input Hatch Configuration gregtech.machine.me.extra_connections.enabled=Allow connections from all sides gregtech.machine.me.extra_connections.disabled=Allow connection only on front face gregtech.machine.me.extra_connections.tooltip=Right-click with wire cutters to allow connecting to AE2 on all sides +gregtech.machine.me.settings_button=ME Settings # Universal tooltips gregtech.universal.tooltip.voltage_in=§aVoltage IN: §f%,d EU/t (%s§f) From d02ae2a39d190ee1f2a606c8ef76656f78c4b91f Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Sat, 31 May 2025 19:23:09 -0400 Subject: [PATCH 052/136] Simpler amount panel syncing --- .../api/mui/sync/appeng/AESyncHandler.java | 4 ++-- .../api/mui/widget/appeng/AEConfigSlot.java | 15 +++------------ 2 files changed, 5 insertions(+), 14 deletions(-) diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java index 20e54dbd922..899bee142b2 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java @@ -175,9 +175,9 @@ public boolean hasConfig(int index) { return getConfig(index) != null; } - public long getConfigAmount(int index) { + public int getConfigAmount(int index) { T config = getConfig(index); - return config == null ? 0 : config.getStackSize(); + return config == null ? 0 : (int) config.getStackSize(); } @SideOnly(Side.CLIENT) diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java index cf7573947fd..176b92fc0a2 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java @@ -21,7 +21,7 @@ import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; import com.cleanroommc.modularui.theme.WidgetSlotTheme; import com.cleanroommc.modularui.theme.WidgetTheme; -import com.cleanroommc.modularui.value.StringValue; +import com.cleanroommc.modularui.value.IntValue; import com.cleanroommc.modularui.value.sync.SyncHandler; import com.cleanroommc.modularui.widget.Widget; import com.cleanroommc.modularui.widgets.ButtonWidget; @@ -163,8 +163,6 @@ public boolean onMouseScroll(ModularScreen.UpOrDown scrollDirection, int scrollA protected IPanelHandler getAmountPanel() { if (amountPanel == null) { amountPanel = IPanelHandler.simple(getPanel(), (parentPanel, player) -> { - AESyncHandler syncHandler = getSyncHandler(); - ModularPanel popupPanel = GTGuis.blankPopupPanel("ae_slot_amount." + index, 100, 18 + 5 * 2) .closeListener(onSelect) .child(createPopupDrawable() @@ -174,15 +172,8 @@ protected IPanelHandler getAmountPanel() { .child(new TextFieldWidget() .setNumbers(1, Integer.MAX_VALUE) .setDefaultNumber(1) - .value(new StringValue.Dynamic(() -> String.valueOf(syncHandler.getConfigAmount(index)), - str -> { - try { - int newAmount = Integer.parseInt(str); - syncHandler.setConfigAmount(index, newAmount); - } catch (NumberFormatException ignored) { - // nuh uh - } - })) + .value(new IntValue.Dynamic(() -> getSyncHandler().getConfigAmount(index), + newAmount -> getSyncHandler().setConfigAmount(index, newAmount))) .size(50, 10) .left(18 + 5 * 2) .top(7)); // alignY didn't work :whar: From 091a3b872303e2749cd92a23a0ef21155d1c3b62 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Sat, 31 May 2025 20:32:04 -0400 Subject: [PATCH 053/136] Actually good settings popup --- .../MetaTileEntityAEHostableChannelPart.java | 1 + .../appeng/MetaTileEntityMEInputBus.java | 42 +++++++++++++++---- .../appeng/MetaTileEntityMEInputHatch.java | 42 +++++++++++++++---- .../resources/assets/gregtech/lang/en_us.lang | 4 +- 4 files changed, 70 insertions(+), 19 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostableChannelPart.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostableChannelPart.java index 7942ad17566..3e2fdd7db5f 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostableChannelPart.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostableChannelPart.java @@ -69,6 +69,7 @@ public int getRefreshRate() { protected void setRefreshRate(int newRefreshRate) { this.refreshRate = newRefreshRate; + markDirty(); } @Override diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java index 323defc3e12..b8d5ba65047 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java @@ -43,6 +43,7 @@ import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandlerModifiable; +import appeng.api.AEApi; import appeng.api.config.Actionable; import appeng.api.storage.IMEMonitor; import appeng.api.storage.channels.IItemStorageChannel; @@ -53,6 +54,7 @@ import com.cleanroommc.modularui.api.IPanelHandler; import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.api.widget.IWidget; +import com.cleanroommc.modularui.drawable.ItemDrawable; import com.cleanroommc.modularui.factory.PosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.value.IntValue; @@ -71,6 +73,7 @@ import java.util.Arrays; import java.util.List; +import java.util.Optional; public class MetaTileEntityMEInputBus extends MetaTileEntityAEHostableChannelPart implements IMultiblockAbilityPart, @@ -270,8 +273,11 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) } protected Widget getSettingWidget(ModularPanel mainPanel, PanelSyncManager syncManager) { + IntSyncValue refreshRateSync = new IntSyncValue(this::getRefreshRate, this::setRefreshRate); + syncManager.syncValue("refresh_rate", refreshRateSync); + IPanelHandler settingPopup = IPanelHandler.simple(mainPanel, - (parentPanel, player) -> buildSettingsPopup(syncManager), true); + (parentPanel, player) -> buildSettingsPopup(refreshRateSync), true); return new ButtonWidget<>() .onMousePressed(mouse -> { @@ -283,24 +289,42 @@ protected Widget getSettingWidget(ModularPanel mainPanel, PanelSyncManager sy return true; }) - .addTooltipLine(I18n.format("gregtech.machine.me.settings_button")) + .addTooltipLine(I18n.format("gregtech.machine.me.settings.button")) .overlay(GTGuiTextures.FILTER_SETTINGS_OVERLAY); } - protected ModularPanel buildSettingsPopup(PanelSyncManager syncManager) { - IntSyncValue refreshRateSync = new IntSyncValue(this::getRefreshRate, this::setRefreshRate); - syncManager.syncValue("refresh_rate", refreshRateSync); - - return GTGuis.defaultPopupPanel("settings") + protected ModularPanel buildSettingsPopup(IntSyncValue refreshRateSync) { + Optional meControllerItem = AEApi.instance().definitions().blocks().controller().maybeStack(1); + ItemDrawable meControllerDrawable = new ItemDrawable(meControllerItem.orElse(ItemStack.EMPTY)); + + final int width = 110; + return GTGuis.createPopupPanel("settings", width, getSettingsPopupHeight()) + .child(Flow.row() + .pos(4, 4) + .height(16) + .child(meControllerDrawable.asWidget() + .size(16) + .marginRight(4)) + .child(IKey.lang("gregtech.machine.me.settings.button") + .asWidget() + .heightRel(1.0f))) + .child(IKey.lang("gregtech.machine.me.settings.refresh_rate") + .asWidget() + .left(5) + .top(5 + 18)) .child(new TextFieldWidget() .left(5) - .top(10) - .size(50, 10) + .top(15 + 18) + .size(width - 10, 10) .setNumbers(1, Integer.MAX_VALUE) .setDefaultNumber(ConfigHolder.compat.ae2.updateIntervals) .value(new IntValue.Dynamic(refreshRateSync::getIntValue, refreshRateSync::setIntValue))); } + protected int getSettingsPopupHeight() { + return 33 + 10 + 5 + 4; + } + protected Widget getExtraButton() { return new EmptyWidget() .size(18); diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java index 7a68dd47f13..9c48dac328f 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java @@ -35,6 +35,7 @@ import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.fluids.IFluidTank; +import appeng.api.AEApi; import appeng.api.config.Actionable; import appeng.api.storage.IMEMonitor; import appeng.api.storage.channels.IFluidStorageChannel; @@ -45,6 +46,7 @@ import com.cleanroommc.modularui.api.IPanelHandler; import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.api.widget.IWidget; +import com.cleanroommc.modularui.drawable.ItemDrawable; import com.cleanroommc.modularui.factory.PosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.value.IntValue; @@ -61,6 +63,7 @@ import java.util.Arrays; import java.util.List; +import java.util.Optional; public class MetaTileEntityMEInputHatch extends MetaTileEntityAEHostableChannelPart implements IMultiblockAbilityPart, IDataStickIntractable { @@ -226,8 +229,11 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) } protected Widget getSettingWidget(ModularPanel mainPanel, PanelSyncManager syncManager) { + IntSyncValue refreshRateSync = new IntSyncValue(this::getRefreshRate, this::setRefreshRate); + syncManager.syncValue("refresh_rate", refreshRateSync); + IPanelHandler settingPopup = IPanelHandler.simple(mainPanel, - (parentPanel, player) -> buildSettingsPopup(syncManager), true); + (parentPanel, player) -> buildSettingsPopup(refreshRateSync), true); return new ButtonWidget<>() .onMousePressed(mouse -> { @@ -239,24 +245,42 @@ protected Widget getSettingWidget(ModularPanel mainPanel, PanelSyncManager sy return true; }) - .addTooltipLine(I18n.format("gregtech.machine.me.settings_button")) + .addTooltipLine(I18n.format("gregtech.machine.me.settings.button")) .overlay(GTGuiTextures.FILTER_SETTINGS_OVERLAY); } - protected ModularPanel buildSettingsPopup(PanelSyncManager syncManager) { - IntSyncValue refreshRateSync = new IntSyncValue(this::getRefreshRate, this::setRefreshRate); - syncManager.syncValue("refresh_rate", refreshRateSync); - - return GTGuis.defaultPopupPanel("settings") + protected ModularPanel buildSettingsPopup(IntSyncValue refreshRateSync) { + Optional meControllerItem = AEApi.instance().definitions().blocks().controller().maybeStack(1); + ItemDrawable meControllerDrawable = new ItemDrawable(meControllerItem.orElse(ItemStack.EMPTY)); + + final int width = 110; + return GTGuis.createPopupPanel("settings", width, getSettingsPopupHeight()) + .child(Flow.row() + .pos(4, 4) + .height(16) + .child(meControllerDrawable.asWidget() + .size(16) + .marginRight(4)) + .child(IKey.lang("gregtech.machine.me.settings.button") + .asWidget() + .heightRel(1.0f))) + .child(IKey.lang("gregtech.machine.me.settings.refresh_rate") + .asWidget() + .left(5) + .top(5 + 18)) .child(new TextFieldWidget() .left(5) - .top(10) - .size(50, 10) + .top(15 + 18) + .size(width - 10, 10) .setNumbers(1, Integer.MAX_VALUE) .setDefaultNumber(ConfigHolder.compat.ae2.updateIntervals) .value(new IntValue.Dynamic(refreshRateSync::getIntValue, refreshRateSync::setIntValue))); } + protected int getSettingsPopupHeight() { + return 52; + } + protected Widget getExtraButton() { return new EmptyWidget() .size(18); diff --git a/src/main/resources/assets/gregtech/lang/en_us.lang b/src/main/resources/assets/gregtech/lang/en_us.lang index dac39d12331..e086d026b7e 100644 --- a/src/main/resources/assets/gregtech/lang/en_us.lang +++ b/src/main/resources/assets/gregtech/lang/en_us.lang @@ -5526,7 +5526,9 @@ gregtech.machine.me.fluid_import.data_stick.name=§oME Input Hatch Configuration gregtech.machine.me.extra_connections.enabled=Allow connections from all sides gregtech.machine.me.extra_connections.disabled=Allow connection only on front face gregtech.machine.me.extra_connections.tooltip=Right-click with wire cutters to allow connecting to AE2 on all sides -gregtech.machine.me.settings_button=ME Settings +gregtech.machine.me.settings.button=ME Settings +gregtech.machine.me.settings.refresh_rate=Refresh rate: +gregtech.machine.me.settings.minimum=Minimum stack size: # Universal tooltips gregtech.universal.tooltip.voltage_in=§aVoltage IN: §f%,d EU/t (%s§f) From fcf4218e1e58257f5ec29fc8ce6ef6bbe4d1e034 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Sat, 31 May 2025 22:15:20 -0400 Subject: [PATCH 054/136] Use the proper method for creating popup panels (that share the sync manger of the main panel!!!!! wowie!!!!!) and implement a minimum stack size stock filter for stocking hatches. AHHH IT'S DESYNCING NOW --- .../api/capability/GregtechDataCodes.java | 2 + .../MetaTileEntityAEHostableChannelPart.java | 4 +- .../appeng/MetaTileEntityMEInputBus.java | 34 ++++---- .../appeng/MetaTileEntityMEInputHatch.java | 31 +++---- .../appeng/MetaTileEntityMEStockingBus.java | 80 ++++++++++++++++-- .../appeng/MetaTileEntityMEStockingHatch.java | 84 ++++++++++++++++--- .../resources/assets/gregtech/lang/en_us.lang | 1 + 7 files changed, 184 insertions(+), 52 deletions(-) diff --git a/src/main/java/gregtech/api/capability/GregtechDataCodes.java b/src/main/java/gregtech/api/capability/GregtechDataCodes.java index b2e7077cc59..2aa14cb465e 100644 --- a/src/main/java/gregtech/api/capability/GregtechDataCodes.java +++ b/src/main/java/gregtech/api/capability/GregtechDataCodes.java @@ -194,6 +194,8 @@ public static int assignId() { // ME Parts public static final int UPDATE_AUTO_PULL = assignId(); public static final int UPDATE_ONLINE_STATUS = assignId(); + public static final int UPDATE_REFRESH_RATE = assignId(); + public static final int UPDATE_MINIMUM_STOCK = assignId(); // Everything below MUST be last in the class! public static final Int2ObjectMap NAMES = new Int2ObjectArrayMap<>(); diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostableChannelPart.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostableChannelPart.java index 3e2fdd7db5f..62fd65c566a 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostableChannelPart.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostableChannelPart.java @@ -69,7 +69,9 @@ public int getRefreshRate() { protected void setRefreshRate(int newRefreshRate) { this.refreshRate = newRefreshRate; - markDirty(); + if (!getWorld().isRemote) { + markDirty(); + } } @Override diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java index b8d5ba65047..d6d1c475cb3 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java @@ -57,7 +57,6 @@ import com.cleanroommc.modularui.drawable.ItemDrawable; import com.cleanroommc.modularui.factory.PosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; -import com.cleanroommc.modularui.value.IntValue; import com.cleanroommc.modularui.value.sync.IntSyncValue; import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.value.sync.SyncHandlers; @@ -126,10 +125,14 @@ public IItemHandlerModifiable getImportItems() { public void update() { super.update(); if (!getWorld().isRemote && this.workingEnabled && updateMEStatus() && shouldSyncME()) { - syncME(); + operateOnME(); } } + protected void operateOnME() { + syncME(); + } + protected void syncME() { IMEMonitor monitor = getMonitor(); if (monitor == null) return; @@ -267,17 +270,13 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) .slot(SyncHandlers.itemSlot(extraSlotInventory, 0) .slotGroup("extra_slot")) .addTooltipLine(IKey.lang("gregtech.gui.me_bus.extra_slot")))) - .child(getSettingWidget(mainPanel, guiSyncManager) + .child(getSettingWidget(guiSyncManager) .right(7) .top(5)); } - protected Widget getSettingWidget(ModularPanel mainPanel, PanelSyncManager syncManager) { - IntSyncValue refreshRateSync = new IntSyncValue(this::getRefreshRate, this::setRefreshRate); - syncManager.syncValue("refresh_rate", refreshRateSync); - - IPanelHandler settingPopup = IPanelHandler.simple(mainPanel, - (parentPanel, player) -> buildSettingsPopup(refreshRateSync), true); + protected Widget getSettingWidget(PanelSyncManager guiSyncManager) { + IPanelHandler settingPopup = guiSyncManager.panel("settings_panel", this::buildSettingsPopup, true); return new ButtonWidget<>() .onMousePressed(mouse -> { @@ -289,16 +288,17 @@ protected Widget getSettingWidget(ModularPanel mainPanel, PanelSyncManager sy return true; }) - .addTooltipLine(I18n.format("gregtech.machine.me.settings.button")) + .addTooltipLine(IKey.lang("gregtech.machine.me.settings.button")) .overlay(GTGuiTextures.FILTER_SETTINGS_OVERLAY); } - protected ModularPanel buildSettingsPopup(IntSyncValue refreshRateSync) { + protected ModularPanel buildSettingsPopup(PanelSyncManager syncManager, IPanelHandler syncHandler) { + IntSyncValue refreshRateSync = new IntSyncValue(this::getRefreshRate, this::setRefreshRate); + Optional meControllerItem = AEApi.instance().definitions().blocks().controller().maybeStack(1); ItemDrawable meControllerDrawable = new ItemDrawable(meControllerItem.orElse(ItemStack.EMPTY)); - final int width = 110; - return GTGuis.createPopupPanel("settings", width, getSettingsPopupHeight()) + return GTGuis.createPopupPanel("settings", 110, getSettingsPopupHeight()) .child(Flow.row() .pos(4, 4) .height(16) @@ -315,14 +315,14 @@ protected ModularPanel buildSettingsPopup(IntSyncValue refreshRateSync) { .child(new TextFieldWidget() .left(5) .top(15 + 18) - .size(width - 10, 10) + .size(100, 10) .setNumbers(1, Integer.MAX_VALUE) .setDefaultNumber(ConfigHolder.compat.ae2.updateIntervals) - .value(new IntValue.Dynamic(refreshRateSync::getIntValue, refreshRateSync::setIntValue))); + .value(refreshRateSync)); } protected int getSettingsPopupHeight() { - return 33 + 10 + 5 + 4; + return 33 + 14 + 5; } protected Widget getExtraButton() { @@ -355,7 +355,7 @@ public T getCapability(Capability capability, EnumFacing side) { @Override public void writeInitialSyncData(PacketBuffer buf) { super.writeInitialSyncData(buf); - buf.writeBoolean(workingEnabled); + buf.writeBoolean(this.workingEnabled); } @Override diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java index 9c48dac328f..42a821b924f 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java @@ -49,7 +49,6 @@ import com.cleanroommc.modularui.drawable.ItemDrawable; import com.cleanroommc.modularui.factory.PosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; -import com.cleanroommc.modularui.value.IntValue; import com.cleanroommc.modularui.value.sync.IntSyncValue; import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.widget.Widget; @@ -105,11 +104,15 @@ protected FluidTankList createImportFluidHandler() { @Override public void update() { super.update(); - if (!getWorld().isRemote && this.workingEnabled && this.shouldSyncME() && updateMEStatus()) { - syncME(); + if (!getWorld().isRemote && this.workingEnabled && updateMEStatus() && shouldSyncME()) { + operateOnME(); } } + protected void operateOnME() { + syncME(); + } + protected void syncME() { IMEMonitor monitor = getMonitor(); if (monitor == null) return; @@ -223,17 +226,13 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) .size(18)) .child(GTGuiTextures.getLogo(getUITheme()).asWidget() .size(17))) - .child(getSettingWidget(mainPanel, guiSyncManager) + .child(getSettingWidget(guiSyncManager) .right(7) .top(5)); } - protected Widget getSettingWidget(ModularPanel mainPanel, PanelSyncManager syncManager) { - IntSyncValue refreshRateSync = new IntSyncValue(this::getRefreshRate, this::setRefreshRate); - syncManager.syncValue("refresh_rate", refreshRateSync); - - IPanelHandler settingPopup = IPanelHandler.simple(mainPanel, - (parentPanel, player) -> buildSettingsPopup(refreshRateSync), true); + protected Widget getSettingWidget(PanelSyncManager guiSyncManager) { + IPanelHandler settingPopup = guiSyncManager.panel("settings_panel", this::buildSettingsPopup, true); return new ButtonWidget<>() .onMousePressed(mouse -> { @@ -245,11 +244,13 @@ protected Widget getSettingWidget(ModularPanel mainPanel, PanelSyncManager sy return true; }) - .addTooltipLine(I18n.format("gregtech.machine.me.settings.button")) + .addTooltipLine(IKey.lang("gregtech.machine.me.settings.button")) .overlay(GTGuiTextures.FILTER_SETTINGS_OVERLAY); } - protected ModularPanel buildSettingsPopup(IntSyncValue refreshRateSync) { + protected ModularPanel buildSettingsPopup(PanelSyncManager syncManager, IPanelHandler syncHandler) { + IntSyncValue refreshRateSync = new IntSyncValue(this::getRefreshRate, this::setRefreshRate); + Optional meControllerItem = AEApi.instance().definitions().blocks().controller().maybeStack(1); ItemDrawable meControllerDrawable = new ItemDrawable(meControllerItem.orElse(ItemStack.EMPTY)); @@ -274,11 +275,11 @@ protected ModularPanel buildSettingsPopup(IntSyncValue refreshRateSync) { .size(width - 10, 10) .setNumbers(1, Integer.MAX_VALUE) .setDefaultNumber(ConfigHolder.compat.ae2.updateIntervals) - .value(new IntValue.Dynamic(refreshRateSync::getIntValue, refreshRateSync::setIntValue))); + .value(refreshRateSync)); } protected int getSettingsPopupHeight() { - return 52; + return 33 + 14 + 5; } protected Widget getExtraButton() { @@ -311,7 +312,7 @@ public T getCapability(Capability capability, EnumFacing side) { @Override public void writeInitialSyncData(PacketBuffer buf) { super.writeInitialSyncData(buf); - buf.writeBoolean(workingEnabled); + buf.writeBoolean(this.workingEnabled); } @Override diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java index c939788f580..11f9075028a 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java @@ -30,10 +30,15 @@ import appeng.api.storage.data.IAEItemStack; import appeng.api.storage.data.IItemList; import codechicken.lib.raytracer.CuboidRayTraceResult; +import com.cleanroommc.modularui.api.IPanelHandler; import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.value.sync.BooleanSyncValue; +import com.cleanroommc.modularui.value.sync.IntSyncValue; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.widget.Widget; import com.cleanroommc.modularui.widgets.ToggleButton; +import com.cleanroommc.modularui.widgets.textfield.TextFieldWidget; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -44,9 +49,12 @@ public class MetaTileEntityMEStockingBus extends MetaTileEntityMEInputBus { + private static final String MINIMUM_STOCK_TAG = "MinimumStackSize"; + private static final int CONFIG_SIZE = 16; private boolean autoPull; private Predicate autoPullTest; + private int minimumStackSize = 0; public MetaTileEntityMEStockingBus(ResourceLocation metaTileEntityId) { super(metaTileEntityId, GTValues.IV); @@ -70,11 +78,6 @@ protected ExportOnlyAEStockingItemList getAEItemHandler() { public void update() { super.update(); if (!getWorld().isRemote) { - if (isWorkingEnabled() && autoPull && getOffsetTimer() % 100 == 0) { - refreshList(); - syncME(); - } - // Immediately clear cached items if the status changed, to prevent running recipes while offline if (this.meStatusChanged && !isOnline()) { if (autoPull) { @@ -88,6 +91,15 @@ public void update() { } } + @Override + protected void operateOnME() { + if (autoPull) { + refreshList(); + } + + syncME(); + } + // Update the visual display for the fake items. This also is important for the item handler's // getStackInSlot() method, as it uses the cached items set here. @Override @@ -210,7 +222,7 @@ private void setAutoPull(boolean autoPull) { if (!this.autoPull) { this.getAEItemHandler().clearConfig(); } else if (updateMEStatus()) { - this.refreshList(); + refreshList(); syncME(); } writeCustomData(UPDATE_AUTO_PULL, buf -> buf.writeBoolean(this.autoPull)); @@ -237,7 +249,7 @@ private void refreshList() { int index = 0; for (IAEItemStack stack : storageList) { if (index >= CONFIG_SIZE) break; - if (stack.getStackSize() == 0) continue; + if (stack.getStackSize() == 0 || stack.getStackSize() < minimumStackSize) continue; stack = monitor.extractItems(stack, Actionable.SIMULATE, getActionSource()); if (stack == null || stack.getStackSize() == 0) continue; @@ -273,6 +285,30 @@ public void receiveCustomData(int dataId, PacketBuffer buf) { } } + @Override + protected ModularPanel buildSettingsPopup(PanelSyncManager syncManager, IPanelHandler syncHandler) { + IntSyncValue minimumStockSync = new IntSyncValue(this::getMinimumStackSize, this::setMinimumStackSize); + + return super.buildSettingsPopup(syncManager, syncHandler) + .child(IKey.lang("gregtech.machine.me.settings.minimum") + .asWidget() + .left(5) + .top(5 + 18 + 18 + 8)) + .child(new TextFieldWidget() + .left(5) + .top(15 + 18 + 18 + 8) + .size(100, 10) + .setNumbers(0, Integer.MAX_VALUE) + .setDefaultNumber(0) + .value(minimumStockSync) + .addTooltipLine(IKey.lang("gregtech.machine.me.settings.minimum.tooltip"))); + } + + @Override + protected int getSettingsPopupHeight() { + return super.getSettingsPopupHeight() + 20 + 8; + } + @Override protected Widget getExtraButton() { BooleanSyncValue autoPullSync = new BooleanSyncValue(() -> autoPull, this::setAutoPull); @@ -288,6 +324,19 @@ protected Widget getExtraButton() { .addTooltip(true, IKey.lang("gregtech.machine.me.stocking_auto_pull_enabled")); } + public void setMinimumStackSize(int minimumStackSize) { + this.minimumStackSize = minimumStackSize; + if (!getWorld().isRemote) { + markDirty(); + refreshList(); + syncME(); + } + } + + public int getMinimumStackSize() { + return minimumStackSize; + } + @Override public boolean onScrewdriverClick(EntityPlayer playerIn, EnumHand hand, EnumFacing facing, CuboidRayTraceResult hitResult) { @@ -307,7 +356,8 @@ public boolean onScrewdriverClick(EntityPlayer playerIn, EnumHand hand, EnumFaci @Override public NBTTagCompound writeToNBT(NBTTagCompound data) { super.writeToNBT(data); - data.setBoolean("AutoPull", autoPull); + data.setBoolean("AutoPull", this.autoPull); + data.setInteger(MINIMUM_STOCK_TAG, this.minimumStackSize); return data; } @@ -315,12 +365,16 @@ public NBTTagCompound writeToNBT(NBTTagCompound data) { public void readFromNBT(NBTTagCompound data) { super.readFromNBT(data); this.autoPull = data.getBoolean("AutoPull"); + + if (data.hasKey(MINIMUM_STOCK_TAG)) { + this.minimumStackSize = data.getInteger(MINIMUM_STOCK_TAG); + } } @Override public void writeInitialSyncData(PacketBuffer buf) { super.writeInitialSyncData(buf); - buf.writeBoolean(autoPull); + buf.writeBoolean(this.autoPull); } @Override @@ -412,6 +466,9 @@ protected NBTTagCompound writeConfigToTag() { NBTTagCompound tag = new NBTTagCompound(); tag.setBoolean("AutoPull", true); tag.setByte("GhostCircuit", (byte) this.circuitInventory.getCircuitValue()); + + tag.setInteger(MINIMUM_STOCK_TAG, this.minimumStackSize); + return tag; } @@ -425,6 +482,11 @@ protected void readConfigFromTag(NBTTagCompound tag) { } // set auto pull first to avoid issues with clearing the config after reading from the data stick this.setAutoPull(false); + + if (tag.hasKey(MINIMUM_STOCK_TAG)) { + this.minimumStackSize = tag.getInteger(MINIMUM_STOCK_TAG); + } + super.readConfigFromTag(tag); } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java index 4fee231f31b..88f3da9e8e4 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java @@ -28,10 +28,15 @@ import appeng.api.storage.data.IAEFluidStack; import appeng.api.storage.data.IItemList; import codechicken.lib.raytracer.CuboidRayTraceResult; +import com.cleanroommc.modularui.api.IPanelHandler; import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.value.sync.BooleanSyncValue; +import com.cleanroommc.modularui.value.sync.IntSyncValue; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.widget.Widget; import com.cleanroommc.modularui.widgets.ToggleButton; +import com.cleanroommc.modularui.widgets.textfield.TextFieldWidget; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -42,9 +47,12 @@ public class MetaTileEntityMEStockingHatch extends MetaTileEntityMEInputHatch { + private static final String MINIMUM_STOCK_TAG = "MinimumStackSize"; + private static final int CONFIG_SIZE = 16; private boolean autoPull; private Predicate autoPullTest; + private int minimumStackSize = 0; public MetaTileEntityMEStockingHatch(ResourceLocation metaTileEntityId) { super(metaTileEntityId, GTValues.IV); @@ -68,11 +76,6 @@ protected ExportOnlyAEStockingFluidList getAEFluidHandler() { public void update() { super.update(); if (!getWorld().isRemote) { - if (isWorkingEnabled() && autoPull && getOffsetTimer() % 100 == 0) { - refreshList(); - syncME(); - } - // Immediately clear cached fluids if the status changed, to prevent running recipes while offline if (this.meStatusChanged && !isOnline()) { if (autoPull) { @@ -86,6 +89,15 @@ public void update() { } } + @Override + protected void operateOnME() { + if (autoPull) { + refreshList(); + } + + syncME(); + } + @Override protected void syncME() { IMEMonitor monitor = super.getMonitor(); @@ -168,7 +180,7 @@ private void setAutoPull(boolean autoPull) { if (!this.autoPull) { this.getAEFluidHandler().clearConfig(); } else if (updateMEStatus()) { - this.refreshList(); + refreshList(); syncME(); } writeCustomData(UPDATE_AUTO_PULL, buf -> buf.writeBoolean(this.autoPull)); @@ -191,7 +203,7 @@ private void refreshList() { int index = 0; for (IAEFluidStack stack : storageList) { if (index >= CONFIG_SIZE) break; - if (stack.getStackSize() == 0) continue; + if (stack.getStackSize() == 0 || stack.getStackSize() < minimumStackSize) continue; stack = monitor.extractItems(stack, Actionable.SIMULATE, getActionSource()); if (stack == null || stack.getStackSize() == 0) continue; @@ -225,6 +237,30 @@ public void receiveCustomData(int dataId, PacketBuffer buf) { } } + @Override + protected ModularPanel buildSettingsPopup(PanelSyncManager syncManager, IPanelHandler syncHandler) { + IntSyncValue minimumStockSync = new IntSyncValue(this::getMinimumStackSize, this::setMinimumStackSize); + + return super.buildSettingsPopup(syncManager, syncHandler) + .child(IKey.lang("gregtech.machine.me.settings.minimum") + .asWidget() + .left(5) + .top(5 + 18 + 18 + 8)) + .child(new TextFieldWidget() + .left(5) + .top(15 + 18 + 18 + 8) + .size(100, 10) + .setNumbers(0, Integer.MAX_VALUE) + .setDefaultNumber(0) + .value(minimumStockSync) + .addTooltipLine(IKey.lang("gregtech.machine.me.settings.minimum.tooltip"))); + } + + @Override + protected int getSettingsPopupHeight() { + return super.getSettingsPopupHeight() + 20 + 8; + } + @Override protected Widget getExtraButton() { BooleanSyncValue autoPullSync = new BooleanSyncValue(() -> autoPull, this::setAutoPull); @@ -240,6 +276,19 @@ protected Widget getExtraButton() { .addTooltip(true, IKey.lang("gregtech.machine.me.stocking_auto_pull_enabled")); } + public void setMinimumStackSize(int minimumStackSize) { + this.minimumStackSize = minimumStackSize; + if (!getWorld().isRemote) { + markDirty(); + refreshList(); + syncME(); + } + } + + public int getMinimumStackSize() { + return minimumStackSize; + } + @Override public boolean onScrewdriverClick(EntityPlayer playerIn, EnumHand hand, EnumFacing facing, CuboidRayTraceResult hitResult) { @@ -259,7 +308,8 @@ public boolean onScrewdriverClick(EntityPlayer playerIn, EnumHand hand, EnumFaci @Override public NBTTagCompound writeToNBT(NBTTagCompound data) { super.writeToNBT(data); - data.setBoolean("AutoPull", autoPull); + data.setBoolean("AutoPull", this.autoPull); + data.setInteger(MINIMUM_STOCK_TAG, this.minimumStackSize); return data; } @@ -267,18 +317,24 @@ public NBTTagCompound writeToNBT(NBTTagCompound data) { public void readFromNBT(NBTTagCompound data) { super.readFromNBT(data); this.autoPull = data.getBoolean("AutoPull"); + + if (data.hasKey(MINIMUM_STOCK_TAG)) { + this.minimumStackSize = data.getInteger(MINIMUM_STOCK_TAG); + } } @Override public void writeInitialSyncData(PacketBuffer buf) { super.writeInitialSyncData(buf); - buf.writeBoolean(autoPull); + buf.writeBoolean(this.autoPull); + buf.writeVarInt(this.minimumStackSize); } @Override public void receiveInitialSyncData(PacketBuffer buf) { super.receiveInitialSyncData(buf); this.autoPull = buf.readBoolean(); + this.minimumStackSize = buf.readVarInt(); } @Override @@ -300,9 +356,12 @@ protected NBTTagCompound writeConfigToTag() { tag.setBoolean("AutoPull", false); return tag; } - // if in auto-pull, no need to write actual configured slots, but still need to write the ghost circuit + // if in auto-pull, no need to write actual configured slots NBTTagCompound tag = new NBTTagCompound(); tag.setBoolean("AutoPull", true); + + tag.setInteger(MINIMUM_STOCK_TAG, this.minimumStackSize); + return tag; } @@ -315,6 +374,11 @@ protected void readConfigFromTag(NBTTagCompound tag) { } // set auto pull first to avoid issues with clearing the config after reading from the data stick this.setAutoPull(false); + + if (tag.hasKey(MINIMUM_STOCK_TAG)) { + this.minimumStackSize = tag.getInteger(MINIMUM_STOCK_TAG); + } + super.readConfigFromTag(tag); } diff --git a/src/main/resources/assets/gregtech/lang/en_us.lang b/src/main/resources/assets/gregtech/lang/en_us.lang index e086d026b7e..5a496126c1f 100644 --- a/src/main/resources/assets/gregtech/lang/en_us.lang +++ b/src/main/resources/assets/gregtech/lang/en_us.lang @@ -5529,6 +5529,7 @@ gregtech.machine.me.extra_connections.tooltip=Right-click with wire cutters to a gregtech.machine.me.settings.button=ME Settings gregtech.machine.me.settings.refresh_rate=Refresh rate: gregtech.machine.me.settings.minimum=Minimum stack size: +gregtech.machine.me.settings.minimum.tooltip=Set to 0 to disable the minimum stack size filtering # Universal tooltips gregtech.universal.tooltip.voltage_in=§aVoltage IN: §f%,d EU/t (%s§f) From 071b3fa8146a142ccc012b6465631d00ac4bee2c Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Sat, 31 May 2025 23:13:13 -0400 Subject: [PATCH 055/136] YAY NO MORE DESYNCING!! WOOHOO HEEHEEHAA!!! --- .../java/gregtech/api/mui/sync/appeng/AESyncHandler.java | 3 ++- .../multi/multiblockpart/appeng/stack/WrappedFluidStack.java | 5 +++++ .../multi/multiblockpart/appeng/stack/WrappedItemStack.java | 5 +++++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java index 899bee142b2..f2871f2e1de 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java @@ -65,7 +65,8 @@ public void detectAndSendChanges(boolean init) { T newStock = slot.getStock(); T cachedStock = cache.getStock(); - if (!areAEStackCountEquals(newConfig, cachedConfig) || !areAEStackCountEquals(newStock, cachedStock)) { + if (init || !areAEStackCountEquals(newConfig, cachedConfig) || + !areAEStackCountEquals(newStock, cachedStock)) { cached[index] = slot.copy(); changeMap.put(index, slot.copy()); notifyChange(); diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedFluidStack.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedFluidStack.java index ab8286ebe85..8d3223081fa 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedFluidStack.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedFluidStack.java @@ -200,4 +200,9 @@ public int hashCode() { result = 31 * result + (this.delegate.tag == null ? 0 : this.delegate.tag.hashCode()); return result; } + + @Override + public String toString() { + return String.format("Wrapped: %s", delegate); + } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedItemStack.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedItemStack.java index c3345ba4fa2..e6bf9e41710 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedItemStack.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedItemStack.java @@ -245,4 +245,9 @@ public ItemStack getCachedItemStack(long l) { public void setCachedItemStack(ItemStack itemStack) { this.delegate = itemStack; } + + @Override + public String toString() { + return String.format("Wrapped: %s", delegate); + } } From d82042144fd569c31b004445934562085e668479 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Sun, 1 Jun 2025 20:35:01 -0400 Subject: [PATCH 056/136] Remove useless override --- .../java/gregtech/api/mui/sync/appeng/AESyncHandler.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java index 899bee142b2..10aea22017a 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java @@ -42,11 +42,6 @@ public AESyncHandler(IConfigurableSlot[] slots, boolean isStocking, @Nullable this.byteBufAdapter = initializeByteBufAdapter(); } - @Override - public void init(String key, PanelSyncManager syncManager) { - super.init(key, syncManager); - } - protected abstract @NotNull IConfigurableSlot @NotNull [] initializeCache(); protected abstract @NotNull IByteBufAdapter initializeByteBufAdapter(); From 90d78651e269a54e5f94cf5ec2d1a072b1b46697 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Sun, 1 Jun 2025 20:48:09 -0400 Subject: [PATCH 057/136] Remove tooltip since it didn't even work somehow --- .../multiblockpart/appeng/MetaTileEntityMEStockingBus.java | 3 +-- .../multiblockpart/appeng/MetaTileEntityMEStockingHatch.java | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java index 11f9075028a..123e70b6727 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java @@ -300,8 +300,7 @@ protected ModularPanel buildSettingsPopup(PanelSyncManager syncManager, IPanelHa .size(100, 10) .setNumbers(0, Integer.MAX_VALUE) .setDefaultNumber(0) - .value(minimumStockSync) - .addTooltipLine(IKey.lang("gregtech.machine.me.settings.minimum.tooltip"))); + .value(minimumStockSync)); } @Override diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java index 88f3da9e8e4..0900a851bcb 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java @@ -252,8 +252,7 @@ protected ModularPanel buildSettingsPopup(PanelSyncManager syncManager, IPanelHa .size(100, 10) .setNumbers(0, Integer.MAX_VALUE) .setDefaultNumber(0) - .value(minimumStockSync) - .addTooltipLine(IKey.lang("gregtech.machine.me.settings.minimum.tooltip"))); + .value(minimumStockSync)); } @Override From 7e73d0f3e33fde7dc0c46ea595f7e14ef0130886 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Sun, 1 Jun 2025 20:50:40 -0400 Subject: [PATCH 058/136] spotbees --- src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java index 3ff347d0511..f4cca5e47b5 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java @@ -8,7 +8,6 @@ import appeng.api.storage.data.IAEStack; import com.cleanroommc.modularui.utils.serialization.IByteBufAdapter; -import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.value.sync.SyncHandler; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; From 173134ec69a21448f4bf2189fe5c8745c878ef48 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Sun, 1 Jun 2025 21:41:09 -0400 Subject: [PATCH 059/136] Fix margin being off by 1px --- .../multiblockpart/appeng/MetaTileEntityMEStockingBus.java | 2 +- .../multiblockpart/appeng/MetaTileEntityMEStockingHatch.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java index 123e70b6727..7c78eb2674a 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java @@ -305,7 +305,7 @@ protected ModularPanel buildSettingsPopup(PanelSyncManager syncManager, IPanelHa @Override protected int getSettingsPopupHeight() { - return super.getSettingsPopupHeight() + 20 + 8; + return super.getSettingsPopupHeight() + 20 + 7; } @Override diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java index 0900a851bcb..b8653921408 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java @@ -257,7 +257,7 @@ protected ModularPanel buildSettingsPopup(PanelSyncManager syncManager, IPanelHa @Override protected int getSettingsPopupHeight() { - return super.getSettingsPopupHeight() + 20 + 8; + return super.getSettingsPopupHeight() + 20 + 7; } @Override From 4060f82ea152533a6ffe72ea63668472bada99e4 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Mon, 2 Jun 2025 11:56:14 -0400 Subject: [PATCH 060/136] Start on JEI recipe transfer refactor --- .../gregtech/api/mui/GregTechGuiScreen.java | 29 ++++++++++++++++++- .../api/mui/GregTechGuiTransferHandler.java | 2 +- .../metatileentities/MetaTileEntities.java | 2 +- .../MetaTileEntityRegistration.java | 2 +- .../CachedRecipeData.java | 2 +- .../CraftingRecipeLogic.java | 2 +- .../CraftingRecipeMemory.java | 2 +- .../MetaTileEntityWorkbench.java | 2 +- .../widget/workbench/CraftingInputSlot.java | 2 +- .../widget/workbench/CraftingOutputSlot.java | 6 ++-- .../widget/workbench/RecipeMemorySlot.java | 2 +- .../jei/JustEnoughItemsModule.java | 5 ---- 12 files changed, 40 insertions(+), 18 deletions(-) rename src/main/java/gregtech/common/metatileentities/{storage => workbench}/CachedRecipeData.java (97%) rename src/main/java/gregtech/common/metatileentities/{storage => workbench}/CraftingRecipeLogic.java (99%) rename src/main/java/gregtech/common/metatileentities/{storage => workbench}/CraftingRecipeMemory.java (99%) rename src/main/java/gregtech/common/metatileentities/{storage => workbench}/MetaTileEntityWorkbench.java (99%) diff --git a/src/main/java/gregtech/api/mui/GregTechGuiScreen.java b/src/main/java/gregtech/api/mui/GregTechGuiScreen.java index ad5c48449c5..a97011defe5 100644 --- a/src/main/java/gregtech/api/mui/GregTechGuiScreen.java +++ b/src/main/java/gregtech/api/mui/GregTechGuiScreen.java @@ -1,15 +1,34 @@ package gregtech.api.mui; +import com.cleanroommc.modularui.value.sync.SyncHandler; import gregtech.api.GTValues; +import net.minecraft.client.Minecraft; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; +import com.cleanroommc.modularui.integration.jei.JeiRecipeTransferHandler; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.screen.ModularScreen; +import mezz.jei.api.gui.IRecipeLayout; +import mezz.jei.api.recipe.transfer.IRecipeTransferError; +import org.jetbrains.annotations.NotNull; +@SuppressWarnings("UnstableApiUsage") @SideOnly(Side.CLIENT) -public class GregTechGuiScreen extends ModularScreen { +public class GregTechGuiScreen extends ModularScreen implements JeiRecipeTransferHandler { + + public static final IRecipeTransferError DEFAULT_ERROR = new IRecipeTransferError() { + + @Override + public @NotNull Type getType() { + return Type.INTERNAL; + } + + @Override + public void showError(@NotNull Minecraft minecraft, int mouseX, int mouseY, + @NotNull IRecipeLayout recipeLayout, int recipeX, int recipeY) {} + }; public GregTechGuiScreen(ModularPanel mainPanel) { this(mainPanel, GTGuiTheme.STANDARD); @@ -27,4 +46,12 @@ public GregTechGuiScreen(String owner, ModularPanel mainPanel, String themeId) { super(owner, mainPanel); useTheme(themeId); } + + @Override + public IRecipeTransferError transferRecipe(IRecipeLayout recipeLayout, boolean maxTransfer, boolean simulate) { + // SyncHandler jeiTransferHandler = getSyncManager().getSyncHandler() + + // Hide the + button by default if this recipe isn't valid for insertion + return DEFAULT_ERROR; + } } diff --git a/src/main/java/gregtech/api/mui/GregTechGuiTransferHandler.java b/src/main/java/gregtech/api/mui/GregTechGuiTransferHandler.java index 9332b8a9a70..eddab9c9d88 100644 --- a/src/main/java/gregtech/api/mui/GregTechGuiTransferHandler.java +++ b/src/main/java/gregtech/api/mui/GregTechGuiTransferHandler.java @@ -1,7 +1,7 @@ package gregtech.api.mui; import gregtech.api.mui.sync.PagedWidgetSyncHandler; -import gregtech.common.metatileentities.storage.CraftingRecipeLogic; +import gregtech.common.metatileentities.workbench.CraftingRecipeLogic; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; diff --git a/src/main/java/gregtech/common/metatileentities/MetaTileEntities.java b/src/main/java/gregtech/common/metatileentities/MetaTileEntities.java index 2da6fd0d304..4e5d7e330e2 100644 --- a/src/main/java/gregtech/common/metatileentities/MetaTileEntities.java +++ b/src/main/java/gregtech/common/metatileentities/MetaTileEntities.java @@ -111,7 +111,7 @@ import gregtech.common.metatileentities.storage.MetaTileEntityQuantumProxy; import gregtech.common.metatileentities.storage.MetaTileEntityQuantumStorageController; import gregtech.common.metatileentities.storage.MetaTileEntityQuantumTank; -import gregtech.common.metatileentities.storage.MetaTileEntityWorkbench; +import gregtech.common.metatileentities.workbench.MetaTileEntityWorkbench; import gregtech.common.pipelike.fluidpipe.longdistance.MetaTileEntityLDFluidEndpoint; import gregtech.common.pipelike.itempipe.longdistance.MetaTileEntityLDItemEndpoint; import gregtech.integration.jei.multiblock.MultiblockInfoCategory; diff --git a/src/main/java/gregtech/common/metatileentities/MetaTileEntityRegistration.java b/src/main/java/gregtech/common/metatileentities/MetaTileEntityRegistration.java index e3c78360163..a6ed0530ca5 100644 --- a/src/main/java/gregtech/common/metatileentities/MetaTileEntityRegistration.java +++ b/src/main/java/gregtech/common/metatileentities/MetaTileEntityRegistration.java @@ -120,7 +120,7 @@ import gregtech.common.metatileentities.storage.MetaTileEntityQuantumProxy; import gregtech.common.metatileentities.storage.MetaTileEntityQuantumStorageController; import gregtech.common.metatileentities.storage.MetaTileEntityQuantumTank; -import gregtech.common.metatileentities.storage.MetaTileEntityWorkbench; +import gregtech.common.metatileentities.workbench.MetaTileEntityWorkbench; import gregtech.common.pipelike.fluidpipe.longdistance.MetaTileEntityLDFluidEndpoint; import gregtech.common.pipelike.itempipe.longdistance.MetaTileEntityLDItemEndpoint; diff --git a/src/main/java/gregtech/common/metatileentities/storage/CachedRecipeData.java b/src/main/java/gregtech/common/metatileentities/workbench/CachedRecipeData.java similarity index 97% rename from src/main/java/gregtech/common/metatileentities/storage/CachedRecipeData.java rename to src/main/java/gregtech/common/metatileentities/workbench/CachedRecipeData.java index be5716f65fb..9e16e20fdf0 100755 --- a/src/main/java/gregtech/common/metatileentities/storage/CachedRecipeData.java +++ b/src/main/java/gregtech/common/metatileentities/workbench/CachedRecipeData.java @@ -1,4 +1,4 @@ -package gregtech.common.metatileentities.storage; +package gregtech.common.metatileentities.workbench; import gregtech.api.util.GTLog; diff --git a/src/main/java/gregtech/common/metatileentities/storage/CraftingRecipeLogic.java b/src/main/java/gregtech/common/metatileentities/workbench/CraftingRecipeLogic.java similarity index 99% rename from src/main/java/gregtech/common/metatileentities/storage/CraftingRecipeLogic.java rename to src/main/java/gregtech/common/metatileentities/workbench/CraftingRecipeLogic.java index 073d662369b..c60faeb0549 100644 --- a/src/main/java/gregtech/common/metatileentities/storage/CraftingRecipeLogic.java +++ b/src/main/java/gregtech/common/metatileentities/workbench/CraftingRecipeLogic.java @@ -1,4 +1,4 @@ -package gregtech.common.metatileentities.storage; +package gregtech.common.metatileentities.workbench; import gregtech.api.items.toolitem.ItemGTToolbelt; import gregtech.api.util.DummyContainer; diff --git a/src/main/java/gregtech/common/metatileentities/storage/CraftingRecipeMemory.java b/src/main/java/gregtech/common/metatileentities/workbench/CraftingRecipeMemory.java similarity index 99% rename from src/main/java/gregtech/common/metatileentities/storage/CraftingRecipeMemory.java rename to src/main/java/gregtech/common/metatileentities/workbench/CraftingRecipeMemory.java index af7f20b0b0b..c29ebfe5e3b 100644 --- a/src/main/java/gregtech/common/metatileentities/storage/CraftingRecipeMemory.java +++ b/src/main/java/gregtech/common/metatileentities/workbench/CraftingRecipeMemory.java @@ -1,4 +1,4 @@ -package gregtech.common.metatileentities.storage; +package gregtech.common.metatileentities.workbench; import gregtech.api.util.ItemStackHashStrategy; diff --git a/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityWorkbench.java b/src/main/java/gregtech/common/metatileentities/workbench/MetaTileEntityWorkbench.java similarity index 99% rename from src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityWorkbench.java rename to src/main/java/gregtech/common/metatileentities/workbench/MetaTileEntityWorkbench.java index 45dcae211fe..9d707372797 100644 --- a/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityWorkbench.java +++ b/src/main/java/gregtech/common/metatileentities/workbench/MetaTileEntityWorkbench.java @@ -1,4 +1,4 @@ -package gregtech.common.metatileentities.storage; +package gregtech.common.metatileentities.workbench; import gregtech.api.capability.GregtechDataCodes; import gregtech.api.capability.impl.ItemHandlerList; diff --git a/src/main/java/gregtech/common/mui/widget/workbench/CraftingInputSlot.java b/src/main/java/gregtech/common/mui/widget/workbench/CraftingInputSlot.java index 0e883aa9bd6..1b4b56d110f 100644 --- a/src/main/java/gregtech/common/mui/widget/workbench/CraftingInputSlot.java +++ b/src/main/java/gregtech/common/mui/widget/workbench/CraftingInputSlot.java @@ -2,7 +2,7 @@ import gregtech.api.util.GTUtility; import gregtech.client.utils.RenderUtil; -import gregtech.common.metatileentities.storage.CraftingRecipeLogic; +import gregtech.common.metatileentities.workbench.CraftingRecipeLogic; import net.minecraft.item.ItemStack; import net.minecraft.network.PacketBuffer; diff --git a/src/main/java/gregtech/common/mui/widget/workbench/CraftingOutputSlot.java b/src/main/java/gregtech/common/mui/widget/workbench/CraftingOutputSlot.java index db766fe50bf..f2040b5ee75 100644 --- a/src/main/java/gregtech/common/mui/widget/workbench/CraftingOutputSlot.java +++ b/src/main/java/gregtech/common/mui/widget/workbench/CraftingOutputSlot.java @@ -1,9 +1,9 @@ package gregtech.common.mui.widget.workbench; import gregtech.client.utils.RenderUtil; -import gregtech.common.metatileentities.storage.CraftingRecipeLogic; -import gregtech.common.metatileentities.storage.CraftingRecipeMemory; -import gregtech.common.metatileentities.storage.MetaTileEntityWorkbench; +import gregtech.common.metatileentities.workbench.CraftingRecipeLogic; +import gregtech.common.metatileentities.workbench.CraftingRecipeMemory; +import gregtech.common.metatileentities.workbench.MetaTileEntityWorkbench; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; diff --git a/src/main/java/gregtech/common/mui/widget/workbench/RecipeMemorySlot.java b/src/main/java/gregtech/common/mui/widget/workbench/RecipeMemorySlot.java index 2d24eea1d83..848219e2211 100644 --- a/src/main/java/gregtech/common/mui/widget/workbench/RecipeMemorySlot.java +++ b/src/main/java/gregtech/common/mui/widget/workbench/RecipeMemorySlot.java @@ -2,7 +2,7 @@ import gregtech.api.mui.GTGuiTextures; import gregtech.client.utils.RenderUtil; -import gregtech.common.metatileentities.storage.CraftingRecipeMemory; +import gregtech.common.metatileentities.workbench.CraftingRecipeMemory; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.item.ItemStack; diff --git a/src/main/java/gregtech/integration/jei/JustEnoughItemsModule.java b/src/main/java/gregtech/integration/jei/JustEnoughItemsModule.java index c0a70ea2be6..29d497e4205 100644 --- a/src/main/java/gregtech/integration/jei/JustEnoughItemsModule.java +++ b/src/main/java/gregtech/integration/jei/JustEnoughItemsModule.java @@ -12,7 +12,6 @@ import gregtech.api.metatileentity.SteamMetaTileEntity; import gregtech.api.metatileentity.registry.MTERegistry; import gregtech.api.modules.GregTechModule; -import gregtech.api.mui.GregTechGuiTransferHandler; import gregtech.api.recipes.Recipe; import gregtech.api.recipes.RecipeMap; import gregtech.api.recipes.category.GTRecipeCategory; @@ -167,10 +166,6 @@ public void register(IModRegistry registry) { registry.getRecipeTransferRegistry().addRecipeTransferHandler(modularUIGuiHandler, Constants.UNIVERSAL_RECIPE_TRANSFER_UID); - // register transfer handler for crafting recipes - registry.getRecipeTransferRegistry().addRecipeTransferHandler(new GregTechGuiTransferHandler( - jeiHelpers.recipeTransferHandlerHelper()), VanillaRecipeCategoryUid.CRAFTING); - registry.addAdvancedGuiHandlers(modularUIGuiHandler); registry.addGhostIngredientHandler(modularUIGuiHandler.getGuiContainerClass(), modularUIGuiHandler); From 94f8edc43e01b824f36654ba8f86b2abcb2cfa47 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Mon, 2 Jun 2025 17:07:28 -0400 Subject: [PATCH 061/136] mixin stuff --- .../gregtech/api/mui/GregTechGuiScreen.java | 7 +++---- .../mui2/ModularSyncManagerAccessor.java | 14 ++++++++++++++ .../mixins/mui2/PanelSyncManagerAccessor.java | 18 ++++++++++++++++++ src/main/resources/mixins.gregtech.mui2.json | 3 ++- 4 files changed, 37 insertions(+), 5 deletions(-) create mode 100644 src/main/java/gregtech/mixins/mui2/ModularSyncManagerAccessor.java create mode 100644 src/main/java/gregtech/mixins/mui2/PanelSyncManagerAccessor.java diff --git a/src/main/java/gregtech/api/mui/GregTechGuiScreen.java b/src/main/java/gregtech/api/mui/GregTechGuiScreen.java index a97011defe5..35884af0a11 100644 --- a/src/main/java/gregtech/api/mui/GregTechGuiScreen.java +++ b/src/main/java/gregtech/api/mui/GregTechGuiScreen.java @@ -1,6 +1,5 @@ package gregtech.api.mui; -import com.cleanroommc.modularui.value.sync.SyncHandler; import gregtech.api.GTValues; import net.minecraft.client.Minecraft; @@ -27,7 +26,9 @@ public class GregTechGuiScreen extends ModularScreen implements JeiRecipeTransfe @Override public void showError(@NotNull Minecraft minecraft, int mouseX, int mouseY, - @NotNull IRecipeLayout recipeLayout, int recipeX, int recipeY) {} + @NotNull IRecipeLayout recipeLayout, int recipeX, int recipeY) { + // no error, just hide the + button + } }; public GregTechGuiScreen(ModularPanel mainPanel) { @@ -49,8 +50,6 @@ public GregTechGuiScreen(String owner, ModularPanel mainPanel, String themeId) { @Override public IRecipeTransferError transferRecipe(IRecipeLayout recipeLayout, boolean maxTransfer, boolean simulate) { - // SyncHandler jeiTransferHandler = getSyncManager().getSyncHandler() - // Hide the + button by default if this recipe isn't valid for insertion return DEFAULT_ERROR; } diff --git a/src/main/java/gregtech/mixins/mui2/ModularSyncManagerAccessor.java b/src/main/java/gregtech/mixins/mui2/ModularSyncManagerAccessor.java new file mode 100644 index 00000000000..4aa774e67db --- /dev/null +++ b/src/main/java/gregtech/mixins/mui2/ModularSyncManagerAccessor.java @@ -0,0 +1,14 @@ +package gregtech.mixins.mui2; + +import com.cleanroommc.modularui.value.sync.ModularSyncManager; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +// TODO: MUI2 2.5 RC5 changes getMainPSM() to public +@Mixin(value = ModularSyncManager.class, remap = false) +public interface ModularSyncManagerAccessor { + + @Accessor(value = "mainPSM") + PanelSyncManager getMainPanelSyncManager(); +} diff --git a/src/main/java/gregtech/mixins/mui2/PanelSyncManagerAccessor.java b/src/main/java/gregtech/mixins/mui2/PanelSyncManagerAccessor.java new file mode 100644 index 00000000000..87ee6a490bf --- /dev/null +++ b/src/main/java/gregtech/mixins/mui2/PanelSyncManagerAccessor.java @@ -0,0 +1,18 @@ +package gregtech.mixins.mui2; + +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.value.sync.SyncHandler; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.util.Map; + +@Mixin(value = PanelSyncManager.class) +public interface PanelSyncManagerAccessor { + + @Accessor() + Map getSyncHandlers(); + + @Accessor() + Map getSubPanels(); +} diff --git a/src/main/resources/mixins.gregtech.mui2.json b/src/main/resources/mixins.gregtech.mui2.json index f313fa2b32d..d661ccb80bf 100644 --- a/src/main/resources/mixins.gregtech.mui2.json +++ b/src/main/resources/mixins.gregtech.mui2.json @@ -8,7 +8,8 @@ "maxShiftBy": 10 }, "mixins": [ - "ModularPanelMixin" + "ModularPanelMixin", + "ModularSyncManagerAccessor" ], "client": [ "LangKeyMixin" From 79b9ae38572304fa8fca6f55022db88b26bd04e4 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Mon, 2 Jun 2025 22:46:12 -0400 Subject: [PATCH 062/136] Progress I think --- .../gregtech/api/mui/GregTechGuiScreen.java | 15 ++++ .../api/mui/GregTechGuiTransferHandler.java | 69 ------------------- .../gregtech/api/mui/IJEIRecipeReceiver.java | 16 +++++ .../appeng/MetaTileEntityMEInputBus.java | 15 ++++ .../workbench/CraftingRecipeLogic.java | 35 +++++++++- .../mui2/ModularSyncManagerAccessor.java | 6 +- .../mixins/mui2/PanelSyncManagerAccessor.java | 2 +- src/main/resources/mixins.gregtech.mui2.json | 3 +- 8 files changed, 87 insertions(+), 74 deletions(-) delete mode 100644 src/main/java/gregtech/api/mui/GregTechGuiTransferHandler.java create mode 100644 src/main/java/gregtech/api/mui/IJEIRecipeReceiver.java diff --git a/src/main/java/gregtech/api/mui/GregTechGuiScreen.java b/src/main/java/gregtech/api/mui/GregTechGuiScreen.java index 35884af0a11..55273d2181e 100644 --- a/src/main/java/gregtech/api/mui/GregTechGuiScreen.java +++ b/src/main/java/gregtech/api/mui/GregTechGuiScreen.java @@ -1,7 +1,13 @@ package gregtech.api.mui; +import com.cleanroommc.modularui.value.sync.ModularSyncManager; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.value.sync.SyncHandler; + import gregtech.api.GTValues; +import gregtech.mixins.mui2.ModularSyncManagerAccessor; + import net.minecraft.client.Minecraft; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -13,6 +19,8 @@ import mezz.jei.api.recipe.transfer.IRecipeTransferError; import org.jetbrains.annotations.NotNull; +import java.util.List; + @SuppressWarnings("UnstableApiUsage") @SideOnly(Side.CLIENT) public class GregTechGuiScreen extends ModularScreen implements JeiRecipeTransferHandler { @@ -50,7 +58,14 @@ public GregTechGuiScreen(String owner, ModularPanel mainPanel, String themeId) { @Override public IRecipeTransferError transferRecipe(IRecipeLayout recipeLayout, boolean maxTransfer, boolean simulate) { + List panelSyncManagers = collectPanelSyncManagers(getSyncManager()); + // Hide the + button by default if this recipe isn't valid for insertion return DEFAULT_ERROR; } + + private static List collectPanelSyncManagers(ModularSyncManager modularSyncManager) { + ((ModularSyncManagerAccessor) modularSyncManager).getPanelSyncManagers(); + return null; + } } diff --git a/src/main/java/gregtech/api/mui/GregTechGuiTransferHandler.java b/src/main/java/gregtech/api/mui/GregTechGuiTransferHandler.java deleted file mode 100644 index eddab9c9d88..00000000000 --- a/src/main/java/gregtech/api/mui/GregTechGuiTransferHandler.java +++ /dev/null @@ -1,69 +0,0 @@ -package gregtech.api.mui; - -import gregtech.api.mui.sync.PagedWidgetSyncHandler; -import gregtech.common.metatileentities.workbench.CraftingRecipeLogic; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; - -import com.cleanroommc.modularui.screen.ModularContainer; -import com.cleanroommc.modularui.value.sync.PanelSyncManager; -import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import mezz.jei.api.gui.IGuiItemStackGroup; -import mezz.jei.api.gui.IRecipeLayout; -import mezz.jei.api.recipe.transfer.IRecipeTransferError; -import mezz.jei.api.recipe.transfer.IRecipeTransferHandler; -import mezz.jei.api.recipe.transfer.IRecipeTransferHandlerHelper; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -public class GregTechGuiTransferHandler implements IRecipeTransferHandler { - - private final IRecipeTransferHandlerHelper handlerHelper; - - public GregTechGuiTransferHandler(IRecipeTransferHandlerHelper handlerHelper) { - this.handlerHelper = handlerHelper; - } - - @Override - public @NotNull Class getContainerClass() { - return ModularContainer.class; - } - - @Override - public @Nullable IRecipeTransferError transferRecipe(ModularContainer container, - @NotNull IRecipeLayout recipeLayout, - @NotNull EntityPlayer player, boolean maxTransfer, - boolean doTransfer) { - if (!container.getSyncManager().isOpen("workbench")) { - return null; - } - PanelSyncManager syncManager = container.getSyncManager().getPanelSyncManager("workbench"); - var recipeLogic = (CraftingRecipeLogic) syncManager.getSyncHandler("recipe_logic:0"); - var pageController = (PagedWidgetSyncHandler) syncManager.getSyncHandler("page_controller:0"); - - if (!doTransfer) { - // todo highlighting in JEI? - return null; - } - - var matrix = extractMatrix(recipeLayout.getItemStacks()); - recipeLogic.fillCraftingGrid(matrix); - pageController.setPage(0); - return null; - } - - private Int2ObjectMap extractMatrix(IGuiItemStackGroup stackGroup) { - var ingredients = stackGroup.getGuiIngredients(); - Int2ObjectMap matrix = new Int2ObjectArrayMap<>(9); - for (var slot : ingredients.keySet()) { - if (slot != 0) { - var ing = ingredients.get(slot).getDisplayedIngredient(); - if (ing == null) continue; - matrix.put(slot - 1, ingredients.get(slot).getDisplayedIngredient()); - } - } - return matrix; - } -} diff --git a/src/main/java/gregtech/api/mui/IJEIRecipeReceiver.java b/src/main/java/gregtech/api/mui/IJEIRecipeReceiver.java new file mode 100644 index 00000000000..d3b7c611d89 --- /dev/null +++ b/src/main/java/gregtech/api/mui/IJEIRecipeReceiver.java @@ -0,0 +1,16 @@ +package gregtech.api.mui; + +import mezz.jei.api.gui.IRecipeLayout; +import mezz.jei.api.recipe.transfer.IRecipeTransferError; +import org.jetbrains.annotations.NotNull; + +/** + * For receiving a JEI recipe transfer (the + button in a recipe) in a + * {@link com.cleanroommc.modularui.value.sync.SyncHandler}
+ * If there are multiple sync handlers implementing this, the handler that will be used to receive the recipe is + * indeterminate. + */ +public interface IJEIRecipeReceiver { + + IRecipeTransferError receiveRecipe(@NotNull IRecipeLayout recipeLayout, boolean maxTransfer, boolean simulate); +} diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java index d6d1c475cb3..5be692171d4 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java @@ -293,12 +293,27 @@ protected Widget getSettingWidget(PanelSyncManager guiSyncManager) { } protected ModularPanel buildSettingsPopup(PanelSyncManager syncManager, IPanelHandler syncHandler) { + IPanelHandler secondPopup = syncManager.panel("secondPopup", (syncManager1, syncHandler1) -> + GTGuis.createPopupPanel("secondPopupPanel", 100, 50) + .child(IKey.str("Hello, World!") + .asWidget()),true); + IntSyncValue refreshRateSync = new IntSyncValue(this::getRefreshRate, this::setRefreshRate); Optional meControllerItem = AEApi.instance().definitions().blocks().controller().maybeStack(1); ItemDrawable meControllerDrawable = new ItemDrawable(meControllerItem.orElse(ItemStack.EMPTY)); return GTGuis.createPopupPanel("settings", 110, getSettingsPopupHeight()) + .child(new ButtonWidget<>() + .onMousePressed(mouse -> { + if (secondPopup.isPanelOpen()) { + secondPopup.closePanel(); + } else { + secondPopup.openPanel(); + } + + return true; + })) .child(Flow.row() .pos(4, 4) .height(16) diff --git a/src/main/java/gregtech/common/metatileentities/workbench/CraftingRecipeLogic.java b/src/main/java/gregtech/common/metatileentities/workbench/CraftingRecipeLogic.java index c60faeb0549..2d8adf1149e 100644 --- a/src/main/java/gregtech/common/metatileentities/workbench/CraftingRecipeLogic.java +++ b/src/main/java/gregtech/common/metatileentities/workbench/CraftingRecipeLogic.java @@ -1,6 +1,8 @@ package gregtech.common.metatileentities.workbench; import gregtech.api.items.toolitem.ItemGTToolbelt; +import gregtech.api.mui.IJEIRecipeReceiver; +import gregtech.api.mui.sync.PagedWidgetSyncHandler; import gregtech.api.util.DummyContainer; import gregtech.api.util.GTTransferUtils; import gregtech.api.util.GTUtility; @@ -36,10 +38,14 @@ import it.unimi.dsi.fastutil.objects.Object2BooleanOpenCustomHashMap; import it.unimi.dsi.fastutil.objects.Object2IntOpenCustomHashMap; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenCustomHashMap; +import mezz.jei.api.gui.IGuiItemStackGroup; +import mezz.jei.api.gui.IRecipeLayout; +import mezz.jei.api.recipe.transfer.IRecipeTransferError; +import org.jetbrains.annotations.NotNull; import java.util.*; -public class CraftingRecipeLogic extends SyncHandler { +public class CraftingRecipeLogic extends SyncHandler implements IJEIRecipeReceiver { // client only public static final int UPDATE_INGREDIENTS = 1; @@ -441,6 +447,33 @@ public void syncMatrix() { syncToServer(UPDATE_MATRIX, this::writeMatrix); } + @Override + public IRecipeTransferError receiveRecipe(@NotNull IRecipeLayout recipeLayout, boolean maxTransfer, + boolean simulate) { + if (!simulate) { + // todo highlighting in JEI? + return null; + } + + var matrix = extractMatrix(recipeLayout.getItemStacks()); + fillCraftingGrid(matrix); + ((PagedWidgetSyncHandler) getSyncManager().getSyncHandler("page_controller:0")).setPage(0); + return null; + } + + private Int2ObjectMap extractMatrix(IGuiItemStackGroup stackGroup) { + var ingredients = stackGroup.getGuiIngredients(); + Int2ObjectMap matrix = new Int2ObjectArrayMap<>(9); + for (var slot : ingredients.keySet()) { + if (slot != 0) { + var ing = ingredients.get(slot).getDisplayedIngredient(); + if (ing == null) continue; + matrix.put(slot - 1, ingredients.get(slot).getDisplayedIngredient()); + } + } + return matrix; + } + public static InventoryCrafting wrapHandler(IItemHandlerModifiable handler) { return new InventoryCrafting(new DummyContainer(), 3, 3) { diff --git a/src/main/java/gregtech/mixins/mui2/ModularSyncManagerAccessor.java b/src/main/java/gregtech/mixins/mui2/ModularSyncManagerAccessor.java index 4aa774e67db..f842ea99a28 100644 --- a/src/main/java/gregtech/mixins/mui2/ModularSyncManagerAccessor.java +++ b/src/main/java/gregtech/mixins/mui2/ModularSyncManagerAccessor.java @@ -5,10 +5,12 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; +import java.util.Map; + // TODO: MUI2 2.5 RC5 changes getMainPSM() to public @Mixin(value = ModularSyncManager.class, remap = false) public interface ModularSyncManagerAccessor { - @Accessor(value = "mainPSM") - PanelSyncManager getMainPanelSyncManager(); + @Accessor(value = "panelSyncManagerMap") + Map getPanelSyncManagers(); } diff --git a/src/main/java/gregtech/mixins/mui2/PanelSyncManagerAccessor.java b/src/main/java/gregtech/mixins/mui2/PanelSyncManagerAccessor.java index 87ee6a490bf..d91aead6136 100644 --- a/src/main/java/gregtech/mixins/mui2/PanelSyncManagerAccessor.java +++ b/src/main/java/gregtech/mixins/mui2/PanelSyncManagerAccessor.java @@ -7,7 +7,7 @@ import java.util.Map; -@Mixin(value = PanelSyncManager.class) +@Mixin(value = PanelSyncManager.class, remap = false) public interface PanelSyncManagerAccessor { @Accessor() diff --git a/src/main/resources/mixins.gregtech.mui2.json b/src/main/resources/mixins.gregtech.mui2.json index d661ccb80bf..9e6879c55fc 100644 --- a/src/main/resources/mixins.gregtech.mui2.json +++ b/src/main/resources/mixins.gregtech.mui2.json @@ -9,7 +9,8 @@ }, "mixins": [ "ModularPanelMixin", - "ModularSyncManagerAccessor" + "ModularSyncManagerAccessor", + "PrintWidgetTreeMixin" ], "client": [ "LangKeyMixin" From c82070ce49abe4c2934801a1895b17009e5a0519 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Tue, 3 Jun 2025 15:15:17 -0400 Subject: [PATCH 063/136] more mixin stuff --- .../gregtech/api/mui/GregTechGuiScreen.java | 72 ++++++++++++++++--- .../appeng/MetaTileEntityMEInputBus.java | 7 +- .../mui2/ModularSyncManagerAccessor.java | 3 + .../mixins/mui2/PanelSyncHandlerAccessor.java | 13 ++++ src/main/resources/mixins.gregtech.mui2.json | 3 +- 5 files changed, 85 insertions(+), 13 deletions(-) create mode 100644 src/main/java/gregtech/mixins/mui2/PanelSyncHandlerAccessor.java diff --git a/src/main/java/gregtech/api/mui/GregTechGuiScreen.java b/src/main/java/gregtech/api/mui/GregTechGuiScreen.java index 55273d2181e..5cecac745c6 100644 --- a/src/main/java/gregtech/api/mui/GregTechGuiScreen.java +++ b/src/main/java/gregtech/api/mui/GregTechGuiScreen.java @@ -1,12 +1,9 @@ package gregtech.api.mui; -import com.cleanroommc.modularui.value.sync.ModularSyncManager; -import com.cleanroommc.modularui.value.sync.PanelSyncManager; -import com.cleanroommc.modularui.value.sync.SyncHandler; - import gregtech.api.GTValues; - import gregtech.mixins.mui2.ModularSyncManagerAccessor; +import gregtech.mixins.mui2.PanelSyncHandlerAccessor; +import gregtech.mixins.mui2.PanelSyncManagerAccessor; import net.minecraft.client.Minecraft; import net.minecraftforge.fml.relauncher.Side; @@ -15,11 +12,20 @@ import com.cleanroommc.modularui.integration.jei.JeiRecipeTransferHandler; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.screen.ModularScreen; +import com.cleanroommc.modularui.utils.ObjectList; +import com.cleanroommc.modularui.value.sync.PanelSyncHandler; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.value.sync.SyncHandler; import mezz.jei.api.gui.IRecipeLayout; import mezz.jei.api.recipe.transfer.IRecipeTransferError; import org.jetbrains.annotations.NotNull; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; import java.util.List; +import java.util.Map; @SuppressWarnings("UnstableApiUsage") @SideOnly(Side.CLIENT) @@ -58,14 +64,62 @@ public GregTechGuiScreen(String owner, ModularPanel mainPanel, String themeId) { @Override public IRecipeTransferError transferRecipe(IRecipeLayout recipeLayout, boolean maxTransfer, boolean simulate) { - List panelSyncManagers = collectPanelSyncManagers(getSyncManager()); + Map> panelToSyncMap = new HashMap<>(); + ObjectList panels = ObjectList.create(); + panels.add(((ModularSyncManagerAccessor) getSyncManager()).getMainPanelSyncManager()); + while (!panels.isEmpty()) { + PanelSyncManager psm = panels.removeFirst(); + panelToSyncMap.put(psm.getPanelName(), new ArrayList<>(getSyncHandlers(psm))); + + if (hasSubPanels(psm)) { + for (PanelSyncHandler psh : getSubPanels(psm)) { + if (hasSyncManager(psh)) { + panels.add(getPanelSyncManager(psh)); + } + } + } + } + + for (SyncHandler syncHandler : panelToSyncMap.get(getPanelManager().getTopMostPanel().getName())) { + if (syncHandler instanceof IJEIRecipeReceiver recipeReceiver) { + recipeReceiver.receiveRecipe(recipeLayout, maxTransfer, simulate); + } + } // Hide the + button by default if this recipe isn't valid for insertion return DEFAULT_ERROR; } - private static List collectPanelSyncManagers(ModularSyncManager modularSyncManager) { - ((ModularSyncManagerAccessor) modularSyncManager).getPanelSyncManagers(); - return null; + private static boolean hasSubPanels(PanelSyncManager panelSyncManager) { + return !((PanelSyncManagerAccessor) panelSyncManager).getSubPanels().isEmpty(); + } + + private static List getSubPanels(PanelSyncManager panelSyncManager) { + if (!hasSubPanels(panelSyncManager)) { + return Collections.emptyList(); + } + + List subPanels = new ArrayList<>(); + Collection syncHandlers = ((PanelSyncManagerAccessor) panelSyncManager).getSubPanels().values(); + + for (SyncHandler syncHandler : syncHandlers) { + if (syncHandler instanceof PanelSyncHandler panelSyncHandler) { + subPanels.add(panelSyncHandler); + } + } + + return subPanels; + } + + private static Collection getSyncHandlers(PanelSyncManager panelSyncManager) { + return ((PanelSyncManagerAccessor) panelSyncManager).getSyncHandlers().values(); + } + + private static boolean hasSyncManager(PanelSyncHandler panelSyncHandler) { + return ((PanelSyncHandlerAccessor) panelSyncHandler).getPanelSyncManager() != null; + } + + private static PanelSyncManager getPanelSyncManager(PanelSyncHandler panelSyncHandler) { + return ((PanelSyncHandlerAccessor) panelSyncHandler).getPanelSyncManager(); } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java index 5be692171d4..5abe9a97c7b 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java @@ -293,10 +293,11 @@ protected Widget getSettingWidget(PanelSyncManager guiSyncManager) { } protected ModularPanel buildSettingsPopup(PanelSyncManager syncManager, IPanelHandler syncHandler) { - IPanelHandler secondPopup = syncManager.panel("secondPopup", (syncManager1, syncHandler1) -> - GTGuis.createPopupPanel("secondPopupPanel", 100, 50) + IPanelHandler secondPopup = syncManager.panel("secondPopup", + (syncManager1, syncHandler1) -> GTGuis.createPopupPanel("secondPopupPanel", 100, 50) .child(IKey.str("Hello, World!") - .asWidget()),true); + .asWidget()), + true); IntSyncValue refreshRateSync = new IntSyncValue(this::getRefreshRate, this::setRefreshRate); diff --git a/src/main/java/gregtech/mixins/mui2/ModularSyncManagerAccessor.java b/src/main/java/gregtech/mixins/mui2/ModularSyncManagerAccessor.java index f842ea99a28..91a50004bf4 100644 --- a/src/main/java/gregtech/mixins/mui2/ModularSyncManagerAccessor.java +++ b/src/main/java/gregtech/mixins/mui2/ModularSyncManagerAccessor.java @@ -13,4 +13,7 @@ public interface ModularSyncManagerAccessor { @Accessor(value = "panelSyncManagerMap") Map getPanelSyncManagers(); + + @Accessor(value = "mainPSM") + PanelSyncManager getMainPanelSyncManager(); } diff --git a/src/main/java/gregtech/mixins/mui2/PanelSyncHandlerAccessor.java b/src/main/java/gregtech/mixins/mui2/PanelSyncHandlerAccessor.java new file mode 100644 index 00000000000..ee2f4e60633 --- /dev/null +++ b/src/main/java/gregtech/mixins/mui2/PanelSyncHandlerAccessor.java @@ -0,0 +1,13 @@ +package gregtech.mixins.mui2; + +import com.cleanroommc.modularui.value.sync.PanelSyncHandler; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(value = PanelSyncHandler.class, remap = false) +public interface PanelSyncHandlerAccessor { + + @Accessor(value = "syncManager") + PanelSyncManager getPanelSyncManager(); +} diff --git a/src/main/resources/mixins.gregtech.mui2.json b/src/main/resources/mixins.gregtech.mui2.json index 9e6879c55fc..d8ad3dec6d1 100644 --- a/src/main/resources/mixins.gregtech.mui2.json +++ b/src/main/resources/mixins.gregtech.mui2.json @@ -10,7 +10,8 @@ "mixins": [ "ModularPanelMixin", "ModularSyncManagerAccessor", - "PrintWidgetTreeMixin" + "PanelSyncHandlerAccessor", + "PanelSyncManagerAccessor" ], "client": [ "LangKeyMixin" From bf840f05a013230b2f66c5365cc249980ca466d5 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Tue, 3 Jun 2025 15:34:56 -0400 Subject: [PATCH 064/136] Hoo-rah it works --- src/main/java/gregtech/api/mui/GregTechGuiScreen.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/gregtech/api/mui/GregTechGuiScreen.java b/src/main/java/gregtech/api/mui/GregTechGuiScreen.java index 5cecac745c6..e83c1a8d830 100644 --- a/src/main/java/gregtech/api/mui/GregTechGuiScreen.java +++ b/src/main/java/gregtech/api/mui/GregTechGuiScreen.java @@ -82,11 +82,11 @@ public IRecipeTransferError transferRecipe(IRecipeLayout recipeLayout, boolean m for (SyncHandler syncHandler : panelToSyncMap.get(getPanelManager().getTopMostPanel().getName())) { if (syncHandler instanceof IJEIRecipeReceiver recipeReceiver) { - recipeReceiver.receiveRecipe(recipeLayout, maxTransfer, simulate); + return recipeReceiver.receiveRecipe(recipeLayout, maxTransfer, simulate); } } - // Hide the + button by default if this recipe isn't valid for insertion + // Hide the + button by default if no recipe receiver was found. return DEFAULT_ERROR; } @@ -116,10 +116,10 @@ private static Collection getSyncHandlers(PanelSyncManager panelSyn } private static boolean hasSyncManager(PanelSyncHandler panelSyncHandler) { - return ((PanelSyncHandlerAccessor) panelSyncHandler).getPanelSyncManager() != null; + return ((PanelSyncHandlerAccessor) (Object) panelSyncHandler).getPanelSyncManager() != null; } private static PanelSyncManager getPanelSyncManager(PanelSyncHandler panelSyncHandler) { - return ((PanelSyncHandlerAccessor) panelSyncHandler).getPanelSyncManager(); + return ((PanelSyncHandlerAccessor) (Object) panelSyncHandler).getPanelSyncManager(); } } From 181d91602f235f13a38b5268bb3f69b3db05e6c3 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Tue, 3 Jun 2025 15:44:15 -0400 Subject: [PATCH 065/136] Make only crafting recipes have the + button in the crafting station --- src/main/java/gregtech/api/mui/GregTechGuiScreen.java | 4 ++-- .../metatileentities/workbench/CraftingRecipeLogic.java | 5 +++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/gregtech/api/mui/GregTechGuiScreen.java b/src/main/java/gregtech/api/mui/GregTechGuiScreen.java index e83c1a8d830..27ad155ee86 100644 --- a/src/main/java/gregtech/api/mui/GregTechGuiScreen.java +++ b/src/main/java/gregtech/api/mui/GregTechGuiScreen.java @@ -31,7 +31,7 @@ @SideOnly(Side.CLIENT) public class GregTechGuiScreen extends ModularScreen implements JeiRecipeTransferHandler { - public static final IRecipeTransferError DEFAULT_ERROR = new IRecipeTransferError() { + public static final IRecipeTransferError DEFAULT_JEI_ERROR = new IRecipeTransferError() { @Override public @NotNull Type getType() { @@ -87,7 +87,7 @@ public IRecipeTransferError transferRecipe(IRecipeLayout recipeLayout, boolean m } // Hide the + button by default if no recipe receiver was found. - return DEFAULT_ERROR; + return DEFAULT_JEI_ERROR; } private static boolean hasSubPanels(PanelSyncManager panelSyncManager) { diff --git a/src/main/java/gregtech/common/metatileentities/workbench/CraftingRecipeLogic.java b/src/main/java/gregtech/common/metatileentities/workbench/CraftingRecipeLogic.java index 2d8adf1149e..0512f05587c 100644 --- a/src/main/java/gregtech/common/metatileentities/workbench/CraftingRecipeLogic.java +++ b/src/main/java/gregtech/common/metatileentities/workbench/CraftingRecipeLogic.java @@ -1,6 +1,7 @@ package gregtech.common.metatileentities.workbench; import gregtech.api.items.toolitem.ItemGTToolbelt; +import gregtech.api.mui.GregTechGuiScreen; import gregtech.api.mui.IJEIRecipeReceiver; import gregtech.api.mui.sync.PagedWidgetSyncHandler; import gregtech.api.util.DummyContainer; @@ -450,6 +451,10 @@ public void syncMatrix() { @Override public IRecipeTransferError receiveRecipe(@NotNull IRecipeLayout recipeLayout, boolean maxTransfer, boolean simulate) { + if (!recipeLayout.getRecipeCategory().getUid().equals("minecraft.crafting")) { + return GregTechGuiScreen.DEFAULT_JEI_ERROR; + } + if (!simulate) { // todo highlighting in JEI? return null; From b37ee24d166b9a2f00894f62560703ce5d0e2f57 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Tue, 3 Jun 2025 21:39:28 -0400 Subject: [PATCH 066/136] Probably works --- .../gregtech/api/mui/GregTechGuiScreen.java | 18 +-- .../gregtech/api/mui/IJEIRecipeReceiver.java | 34 +++++- .../mui/sync/appeng/AEFluidSyncHandler.java | 8 ++ .../mui/sync/appeng/AEItemSyncHandler.java | 24 ++++ .../api/mui/sync/appeng/AESyncHandler.java | 3 +- .../java/gregtech/api/util/GTUtility.java | 39 +++++++ src/main/java/gregtech/api/util/JEIUtil.java | 109 ++++++++++++++++++ .../appeng/MetaTileEntityMEInputBus.java | 18 +-- .../appeng/MetaTileEntityMEInputHatch.java | 2 +- .../workbench/CraftingRecipeLogic.java | 5 +- .../jei/GuiIngredientGroupAccessor.java | 14 +++ src/main/resources/mixins.gregtech.jei.json | 1 + 12 files changed, 235 insertions(+), 40 deletions(-) create mode 100644 src/main/java/gregtech/api/util/JEIUtil.java create mode 100644 src/main/java/gregtech/mixins/jei/GuiIngredientGroupAccessor.java diff --git a/src/main/java/gregtech/api/mui/GregTechGuiScreen.java b/src/main/java/gregtech/api/mui/GregTechGuiScreen.java index 27ad155ee86..f13d4d1f3bc 100644 --- a/src/main/java/gregtech/api/mui/GregTechGuiScreen.java +++ b/src/main/java/gregtech/api/mui/GregTechGuiScreen.java @@ -5,7 +5,6 @@ import gregtech.mixins.mui2.PanelSyncHandlerAccessor; import gregtech.mixins.mui2.PanelSyncManagerAccessor; -import net.minecraft.client.Minecraft; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -18,7 +17,6 @@ import com.cleanroommc.modularui.value.sync.SyncHandler; import mezz.jei.api.gui.IRecipeLayout; import mezz.jei.api.recipe.transfer.IRecipeTransferError; -import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.Collection; @@ -27,24 +25,12 @@ import java.util.List; import java.util.Map; +import static gregtech.api.mui.IJEIRecipeReceiver.DEFAULT_JEI_ERROR; + @SuppressWarnings("UnstableApiUsage") @SideOnly(Side.CLIENT) public class GregTechGuiScreen extends ModularScreen implements JeiRecipeTransferHandler { - public static final IRecipeTransferError DEFAULT_JEI_ERROR = new IRecipeTransferError() { - - @Override - public @NotNull Type getType() { - return Type.INTERNAL; - } - - @Override - public void showError(@NotNull Minecraft minecraft, int mouseX, int mouseY, - @NotNull IRecipeLayout recipeLayout, int recipeX, int recipeY) { - // no error, just hide the + button - } - }; - public GregTechGuiScreen(ModularPanel mainPanel) { this(mainPanel, GTGuiTheme.STANDARD); } diff --git a/src/main/java/gregtech/api/mui/IJEIRecipeReceiver.java b/src/main/java/gregtech/api/mui/IJEIRecipeReceiver.java index d3b7c611d89..ac00989037a 100644 --- a/src/main/java/gregtech/api/mui/IJEIRecipeReceiver.java +++ b/src/main/java/gregtech/api/mui/IJEIRecipeReceiver.java @@ -1,16 +1,46 @@ package gregtech.api.mui; +import net.minecraft.client.Minecraft; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + import mezz.jei.api.gui.IRecipeLayout; import mezz.jei.api.recipe.transfer.IRecipeTransferError; import org.jetbrains.annotations.NotNull; /** - * For receiving a JEI recipe transfer (the + button in a recipe) in a - * {@link com.cleanroommc.modularui.value.sync.SyncHandler}
+ * For receiving a JEI recipe transfer (the + button in a recipe).
+ * Implement this on a {@link com.cleanroommc.modularui.value.sync.SyncHandler} and ensure it's registered to the + * {@link com.cleanroommc.modularui.value.sync.PanelSyncManager}.
* If there are multiple sync handlers implementing this, the handler that will be used to receive the recipe is * indeterminate. */ public interface IJEIRecipeReceiver { + /** + * Return this the recipe is invalid for the receiver to hide the + button. + */ + IRecipeTransferError DEFAULT_JEI_ERROR = new IRecipeTransferError() { + + @Override + public @NotNull Type getType() { + return Type.INTERNAL; + } + + @Override + public void showError(@NotNull Minecraft minecraft, int mouseX, int mouseY, + @NotNull IRecipeLayout recipeLayout, int recipeX, int recipeY) { + // nothing to show, just hide the + button + } + }; + + /** + * @param recipeLayout the recipe layout that contains the recipe category, and the item and fluid stacks + * @param maxTransfer if the receiver should try to move as many ingredients as possible to the crafting slots, ie + * a crafting table + * @param simulate if this recipe should only be simulated being transferred + * @return a {@link IRecipeTransferError} if something isn't right, or null if it's okay to transfer this recipe + */ + @SideOnly(Side.CLIENT) IRecipeTransferError receiveRecipe(@NotNull IRecipeLayout recipeLayout, boolean maxTransfer, boolean simulate); } diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java index c859a8f878d..3fbd5fa1256 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java @@ -11,6 +11,8 @@ import appeng.api.storage.data.IAEFluidStack; import com.cleanroommc.modularui.utils.serialization.IByteBufAdapter; +import mezz.jei.api.gui.IRecipeLayout; +import mezz.jei.api.recipe.transfer.IRecipeTransferError; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -45,6 +47,12 @@ public boolean isStackValidForSlot(int index, @Nullable IAEFluidStack stack) { return !fluidList.hasStackInConfig(((WrappedFluidStack) stack).getDelegate(), true); } + @Override + public IRecipeTransferError receiveRecipe(@NotNull IRecipeLayout recipeLayout, boolean maxTransfer, + boolean simulate) { + return DEFAULT_JEI_ERROR; + } + @SideOnly(Side.CLIENT) public void setConfig(int index, @Nullable FluidStack stack) { setConfig(index, WrappedFluidStack.fromFluidStack(stack)); diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java index b179c0bfc7d..190bf4538a5 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java @@ -1,5 +1,7 @@ package gregtech.api.mui.sync.appeng; +import gregtech.api.util.GTUtility; +import gregtech.api.util.JEIUtil; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEItemList; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEItemSlot; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.IConfigurableSlot; @@ -11,9 +13,14 @@ import appeng.api.storage.data.IAEItemStack; import com.cleanroommc.modularui.utils.serialization.IByteBufAdapter; +import mezz.jei.api.gui.IRecipeLayout; +import mezz.jei.api.recipe.transfer.IRecipeTransferError; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.ArrayList; +import java.util.List; + public class AEItemSyncHandler extends AESyncHandler { private final ExportOnlyAEItemList itemList; @@ -45,6 +52,23 @@ public boolean isStackValidForSlot(int index, @Nullable IAEItemStack stack) { return !itemList.hasStackInConfig(stack.getDefinition(), true); } + @Override + public IRecipeTransferError receiveRecipe(@NotNull IRecipeLayout recipeLayout, boolean maxTransfer, + boolean simulate) { + if (simulate) return null; + + List originalItemInputs = JEIUtil.getDisplayedInputItemStacks(recipeLayout.getItemStacks()); + List itemInputs = new ArrayList<>(originalItemInputs.size()); + originalItemInputs.forEach(stack -> itemInputs.add(stack.copy())); + GTUtility.collapseItemList(itemInputs); + + for (int index = 0; index < itemInputs.size(); index++) { + setConfig(index, itemInputs.get(index)); + } + + return null; + } + @SideOnly(Side.CLIENT) public void setConfig(int index, @Nullable ItemStack stack) { setConfig(index, WrappedItemStack.fromItemStack(stack)); diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java index f4cca5e47b5..495ddbc20ee 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java @@ -1,5 +1,6 @@ package gregtech.api.mui.sync.appeng; +import gregtech.api.mui.IJEIRecipeReceiver; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.IConfigurableSlot; import net.minecraft.network.PacketBuffer; @@ -16,7 +17,7 @@ import java.io.IOException; -public abstract class AESyncHandler> extends SyncHandler { +public abstract class AESyncHandler> extends SyncHandler implements IJEIRecipeReceiver { public static final int slotSyncID = 0; public static final int setConfigID = 1; diff --git a/src/main/java/gregtech/api/util/GTUtility.java b/src/main/java/gregtech/api/util/GTUtility.java index 287c1a76c5a..03428262e25 100644 --- a/src/main/java/gregtech/api/util/GTUtility.java +++ b/src/main/java/gregtech/api/util/GTUtility.java @@ -56,6 +56,7 @@ import net.minecraftforge.items.IItemHandlerModifiable; import com.google.common.util.concurrent.AtomicDouble; +import it.unimi.dsi.fastutil.Hash; import it.unimi.dsi.fastutil.objects.ObjectOpenCustomHashSet; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.tuple.Pair; @@ -983,4 +984,42 @@ public static int combineRGB(@Range(from = 0, to = 255) int r, @Range(from = 0, } return map.get(key.toWildcard()); } + + /** + * Attempts to collapse a {@link List} of {@link ItemStack}s by combining similar stacks downwards (towards index + * 0).
+ * WARNING: Mutates original item stacks, you might want to make a new list with copies! + * + * @param stacks the list to collapse + * @param maxStackSize the max stack size the to-be combined stack sizes can be + */ + public static void collapseItemList(@NotNull List stacks, + @Range(from = 1, to = Integer.MAX_VALUE) int maxStackSize) { + Hash.Strategy stackStrategy = ItemStackHashStrategy.comparingAllButCount(); + + for (int index = 1; index < stacks.size(); index++) { + ItemStack collapsingStack = stacks.get(index); + if (collapsingStack.isEmpty() || collapsingStack.getCount() >= maxStackSize) continue; + + for (int checkingSlot = 0; checkingSlot < index; checkingSlot++) { + ItemStack stackToCheck = stacks.get(checkingSlot); + if (stackStrategy.equals(stackToCheck, collapsingStack)) { + int collapsingStackSize = collapsingStack.getCount(); + int finalSize = Math.min(stackToCheck.getCount() + collapsingStackSize, maxStackSize); + int toTransfer = finalSize - collapsingStackSize; + + stackToCheck.grow(toTransfer); + collapsingStack.grow(-toTransfer); + } + } + } + } + + /** + * The same as {@link #collapseItemList(List, int)} but has a stack size limit of {@link Integer#MAX_VALUE}
+ * WARNING: Mutates original item stacks, you might want to make a new list with copies! + */ + public static void collapseItemList(List stacks) { + collapseItemList(stacks, Integer.MAX_VALUE); + } } diff --git a/src/main/java/gregtech/api/util/JEIUtil.java b/src/main/java/gregtech/api/util/JEIUtil.java new file mode 100644 index 00000000000..7141cfa66d8 --- /dev/null +++ b/src/main/java/gregtech/api/util/JEIUtil.java @@ -0,0 +1,109 @@ +package gregtech.api.util; + +import gregtech.mixins.jei.GuiIngredientGroupAccessor; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.fluids.FluidStack; + +import mezz.jei.api.gui.IGuiFluidStackGroup; +import mezz.jei.api.gui.IGuiItemStackGroup; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Set; + +public class JEIUtil { + + /** + * Collects all the item stacks from the input slots of a {@link IGuiItemStackGroup}. Empty slots will be set as + * {@link ItemStack#EMPTY}. + * + * @param stackGroup the group to collect {@link ItemStack}s from + * @return the list of collected item stacks + */ + public static @NotNull List getDisplayedInputItemStacks(@NotNull IGuiItemStackGroup stackGroup) { + var stackMap = stackGroup.getGuiIngredients(); + Set inputIndexes = ((GuiIngredientGroupAccessor) stackGroup).getInputSlotIndexes(); + if (inputIndexes.isEmpty()) return Collections.emptyList(); + + List itemStacks = new ArrayList<>(inputIndexes.size()); + for (var index : stackMap.keySet()) { + if (inputIndexes.contains(index)) { + ItemStack displayStack = stackMap.get(index).getDisplayedIngredient(); + itemStacks.add(displayStack == null ? ItemStack.EMPTY : displayStack); + } + } + + return itemStacks; + } + + /** + * Collects all the item stacks from the output slots of a {@link IGuiItemStackGroup}. Empty slots will be set as + * {@link ItemStack#EMPTY}. + * + * @param stackGroup the group to collect {@link ItemStack}s from + * @return the list of collected item stacks + */ + public static @NotNull List getDisplayedOutputItemStacks(@NotNull IGuiItemStackGroup stackGroup) { + var stackMap = stackGroup.getGuiIngredients(); + Set inputIndexes = ((GuiIngredientGroupAccessor) stackGroup).getInputSlotIndexes(); + int outputCount = stackMap.size() - inputIndexes.size(); + if (outputCount < 1) return Collections.emptyList(); + + List itemStacks = new ArrayList<>(outputCount); + for (var index : stackMap.keySet()) { + if (!inputIndexes.contains(index)) { + itemStacks.add(stackMap.get(index).getDisplayedIngredient()); + } + } + + return itemStacks; + } + + /** + * Collects all the fluid stacks from the input slots of a {@link IGuiFluidStackGroup}. Empty slots will be set as + * null. + * + * @param stackGroup the group to collect {@link FluidStack}s from + * @return the list of collected fluid stacks + */ + public static @NotNull List getDisplayedInputFluidStacks(@NotNull IGuiFluidStackGroup stackGroup) { + var stackMap = stackGroup.getGuiIngredients(); + Set inputIndexes = ((GuiIngredientGroupAccessor) stackGroup).getInputSlotIndexes(); + if (inputIndexes.isEmpty()) return Collections.emptyList(); + + List fluidStacks = new ArrayList<>(inputIndexes.size()); + for (var index : stackMap.keySet()) { + if (inputIndexes.contains(index)) { + fluidStacks.add(stackMap.get(index).getDisplayedIngredient()); + } + } + + return fluidStacks; + } + + /** + * Collects all the fluid stacks from the output slots of a {@link IGuiFluidStackGroup}. Empty slots will be set as + * null. + * + * @param stackGroup the group to collect {@link FluidStack}s from + * @return the list of collected fluid stacks + */ + public static @NotNull List getDisplayedOutputFluidStacks(@NotNull IGuiFluidStackGroup stackGroup) { + var stackMap = stackGroup.getGuiIngredients(); + Set inputIndexes = ((GuiIngredientGroupAccessor) stackGroup).getInputSlotIndexes(); + int outputCount = stackMap.size() - inputIndexes.size(); + if (outputCount < 1) return Collections.emptyList(); + + List fluidStacks = new ArrayList<>(outputCount); + for (var index : stackMap.keySet()) { + if (!inputIndexes.contains(index)) { + fluidStacks.add(stackMap.get(index).getDisplayedIngredient()); + } + } + + return fluidStacks; + } +} diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java index 5abe9a97c7b..b0b51dfd10a 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java @@ -81,7 +81,7 @@ public class MetaTileEntityMEInputBus extends MetaTileEntityAEHostableChannelPar public static final String ITEM_BUFFER_TAG = "ItemSlots"; public static final String WORKING_TAG = "WorkingEnabled"; - private final static int CONFIG_SIZE = 16; + public final static int CONFIG_SIZE = 16; protected ExportOnlyAEItemList aeItemHandler; protected GhostCircuitItemStackHandler circuitInventory; protected NotifiableItemStackHandler extraSlotInventory; @@ -293,28 +293,12 @@ protected Widget getSettingWidget(PanelSyncManager guiSyncManager) { } protected ModularPanel buildSettingsPopup(PanelSyncManager syncManager, IPanelHandler syncHandler) { - IPanelHandler secondPopup = syncManager.panel("secondPopup", - (syncManager1, syncHandler1) -> GTGuis.createPopupPanel("secondPopupPanel", 100, 50) - .child(IKey.str("Hello, World!") - .asWidget()), - true); - IntSyncValue refreshRateSync = new IntSyncValue(this::getRefreshRate, this::setRefreshRate); Optional meControllerItem = AEApi.instance().definitions().blocks().controller().maybeStack(1); ItemDrawable meControllerDrawable = new ItemDrawable(meControllerItem.orElse(ItemStack.EMPTY)); return GTGuis.createPopupPanel("settings", 110, getSettingsPopupHeight()) - .child(new ButtonWidget<>() - .onMousePressed(mouse -> { - if (secondPopup.isPanelOpen()) { - secondPopup.closePanel(); - } else { - secondPopup.openPanel(); - } - - return true; - })) .child(Flow.row() .pos(4, 4) .height(16) diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java index 42a821b924f..3f337fc0735 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java @@ -70,7 +70,7 @@ public class MetaTileEntityMEInputHatch extends MetaTileEntityAEHostableChannelP public static final String FLUID_BUFFER_TAG = "FluidTanks"; public static final String WORKING_TAG = "WorkingEnabled"; - private final static int CONFIG_SIZE = 16; + public final static int CONFIG_SIZE = 16; protected ExportOnlyAEFluidList aeFluidHandler; private boolean workingEnabled = true; diff --git a/src/main/java/gregtech/common/metatileentities/workbench/CraftingRecipeLogic.java b/src/main/java/gregtech/common/metatileentities/workbench/CraftingRecipeLogic.java index 0512f05587c..30ebc07451b 100644 --- a/src/main/java/gregtech/common/metatileentities/workbench/CraftingRecipeLogic.java +++ b/src/main/java/gregtech/common/metatileentities/workbench/CraftingRecipeLogic.java @@ -1,7 +1,6 @@ package gregtech.common.metatileentities.workbench; import gregtech.api.items.toolitem.ItemGTToolbelt; -import gregtech.api.mui.GregTechGuiScreen; import gregtech.api.mui.IJEIRecipeReceiver; import gregtech.api.mui.sync.PagedWidgetSyncHandler; import gregtech.api.util.DummyContainer; @@ -452,10 +451,10 @@ public void syncMatrix() { public IRecipeTransferError receiveRecipe(@NotNull IRecipeLayout recipeLayout, boolean maxTransfer, boolean simulate) { if (!recipeLayout.getRecipeCategory().getUid().equals("minecraft.crafting")) { - return GregTechGuiScreen.DEFAULT_JEI_ERROR; + return DEFAULT_JEI_ERROR; } - if (!simulate) { + if (simulate) { // todo highlighting in JEI? return null; } diff --git a/src/main/java/gregtech/mixins/jei/GuiIngredientGroupAccessor.java b/src/main/java/gregtech/mixins/jei/GuiIngredientGroupAccessor.java new file mode 100644 index 00000000000..503c9a5564b --- /dev/null +++ b/src/main/java/gregtech/mixins/jei/GuiIngredientGroupAccessor.java @@ -0,0 +1,14 @@ +package gregtech.mixins.jei; + +import mezz.jei.gui.ingredients.GuiIngredientGroup; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.util.Set; + +@Mixin(value = GuiIngredientGroup.class, remap = false) +public interface GuiIngredientGroupAccessor { + + @Accessor(value = "inputSlots") + Set getInputSlotIndexes(); +} diff --git a/src/main/resources/mixins.gregtech.jei.json b/src/main/resources/mixins.gregtech.jei.json index 75728d0aeb9..3a536b98e55 100644 --- a/src/main/resources/mixins.gregtech.jei.json +++ b/src/main/resources/mixins.gregtech.jei.json @@ -8,6 +8,7 @@ "BasicRecipeTransferHandlerServerMixin", "DragManagerAccessor", "GhostDragAccessor", + "GuiIngredientGroupAccessor", "IngredientGridMixin", "JEITooltipMixin", "ModRegistryMixin", From c4c55a35646818767655282ceef9bfa69fdd556a Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Tue, 3 Jun 2025 21:56:34 -0400 Subject: [PATCH 067/136] Separate the MUI2 accessor methods out into a utility class --- .../gregtech/api/mui/GregTechGuiScreen.java | 44 ++--------- src/main/java/gregtech/api/util/MUIUtil.java | 74 +++++++++++++++++++ 2 files changed, 80 insertions(+), 38 deletions(-) create mode 100644 src/main/java/gregtech/api/util/MUIUtil.java diff --git a/src/main/java/gregtech/api/mui/GregTechGuiScreen.java b/src/main/java/gregtech/api/mui/GregTechGuiScreen.java index f13d4d1f3bc..b2d7618cabd 100644 --- a/src/main/java/gregtech/api/mui/GregTechGuiScreen.java +++ b/src/main/java/gregtech/api/mui/GregTechGuiScreen.java @@ -1,6 +1,7 @@ package gregtech.api.mui; import gregtech.api.GTValues; +import gregtech.api.util.MUIUtil; import gregtech.mixins.mui2.ModularSyncManagerAccessor; import gregtech.mixins.mui2.PanelSyncHandlerAccessor; import gregtech.mixins.mui2.PanelSyncManagerAccessor; @@ -55,12 +56,12 @@ public IRecipeTransferError transferRecipe(IRecipeLayout recipeLayout, boolean m panels.add(((ModularSyncManagerAccessor) getSyncManager()).getMainPanelSyncManager()); while (!panels.isEmpty()) { PanelSyncManager psm = panels.removeFirst(); - panelToSyncMap.put(psm.getPanelName(), new ArrayList<>(getSyncHandlers(psm))); + panelToSyncMap.put(psm.getPanelName(), new ArrayList<>(MUIUtil.getSyncHandlers(psm))); - if (hasSubPanels(psm)) { - for (PanelSyncHandler psh : getSubPanels(psm)) { - if (hasSyncManager(psh)) { - panels.add(getPanelSyncManager(psh)); + if (MUIUtil.hasSubPanels(psm)) { + for (PanelSyncHandler psh : MUIUtil.getSubPanels(psm)) { + if (MUIUtil.hasSyncManager(psh)) { + panels.add(MUIUtil.getPanelSyncManager(psh)); } } } @@ -75,37 +76,4 @@ public IRecipeTransferError transferRecipe(IRecipeLayout recipeLayout, boolean m // Hide the + button by default if no recipe receiver was found. return DEFAULT_JEI_ERROR; } - - private static boolean hasSubPanels(PanelSyncManager panelSyncManager) { - return !((PanelSyncManagerAccessor) panelSyncManager).getSubPanels().isEmpty(); - } - - private static List getSubPanels(PanelSyncManager panelSyncManager) { - if (!hasSubPanels(panelSyncManager)) { - return Collections.emptyList(); - } - - List subPanels = new ArrayList<>(); - Collection syncHandlers = ((PanelSyncManagerAccessor) panelSyncManager).getSubPanels().values(); - - for (SyncHandler syncHandler : syncHandlers) { - if (syncHandler instanceof PanelSyncHandler panelSyncHandler) { - subPanels.add(panelSyncHandler); - } - } - - return subPanels; - } - - private static Collection getSyncHandlers(PanelSyncManager panelSyncManager) { - return ((PanelSyncManagerAccessor) panelSyncManager).getSyncHandlers().values(); - } - - private static boolean hasSyncManager(PanelSyncHandler panelSyncHandler) { - return ((PanelSyncHandlerAccessor) (Object) panelSyncHandler).getPanelSyncManager() != null; - } - - private static PanelSyncManager getPanelSyncManager(PanelSyncHandler panelSyncHandler) { - return ((PanelSyncHandlerAccessor) (Object) panelSyncHandler).getPanelSyncManager(); - } } diff --git a/src/main/java/gregtech/api/util/MUIUtil.java b/src/main/java/gregtech/api/util/MUIUtil.java new file mode 100644 index 00000000000..b1f8549ad34 --- /dev/null +++ b/src/main/java/gregtech/api/util/MUIUtil.java @@ -0,0 +1,74 @@ +package gregtech.api.util; + +import com.cleanroommc.modularui.value.sync.PanelSyncHandler; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.value.sync.SyncHandler; + +import gregtech.mixins.mui2.PanelSyncHandlerAccessor; +import gregtech.mixins.mui2.PanelSyncManagerAccessor; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +public class MUIUtil { + + /** + * Checks if the {@link PanelSyncManager} has any sub panels. + * @param panelSyncManager the panel sync manager to check + * @return if it has sub panels + */ + public static boolean hasSubPanels(PanelSyncManager panelSyncManager) { + return !((PanelSyncManagerAccessor) panelSyncManager).getSubPanels().isEmpty(); + } + + /** + * Retrieves all sub panel {@link PanelSyncHandler}s from a {@link PanelSyncManager}. + * @param panelSyncManager the panel sync manager to gather the sub panel handlers from + * @return a list of all sub panel handlers + */ + public static List getSubPanels(PanelSyncManager panelSyncManager) { + if (!hasSubPanels(panelSyncManager)) { + return Collections.emptyList(); + } + + List subPanels = new ArrayList<>(); + Collection syncHandlers = ((PanelSyncManagerAccessor) panelSyncManager).getSubPanels().values(); + + for (SyncHandler syncHandler : syncHandlers) { + if (syncHandler instanceof PanelSyncHandler panelSyncHandler) { + subPanels.add(panelSyncHandler); + } + } + + return subPanels; + } + + /** + * Gets all of the {@link SyncHandler}s from a {@link PanelSyncManager}. + * @param panelSyncManager the panel sync manager to gather the sync handlers from + * @return a list of all the sync handlers + */ + public static Collection getSyncHandlers(PanelSyncManager panelSyncManager) { + return ((PanelSyncManagerAccessor) panelSyncManager).getSyncHandlers().values(); + } + + /** + * Checks if a {@link PanelSyncHandler} has a {@link PanelSyncManager}. + * @param panelSyncHandler the panel sync handler to check + * @return if the panel sync handler has a panel sync manager + */ + public static boolean hasSyncManager(PanelSyncHandler panelSyncHandler) { + return ((PanelSyncHandlerAccessor) (Object) panelSyncHandler).getPanelSyncManager() != null; + } + + /** + * Gets the {@link PanelSyncManager} from a {@link PanelSyncHandler}. + * @param panelSyncHandler the panel sync handler to get the panel sync manager from + * @return the panel sync manager of the panel sync handler + */ + public static PanelSyncManager getPanelSyncManager(PanelSyncHandler panelSyncHandler) { + return ((PanelSyncHandlerAccessor) (Object) panelSyncHandler).getPanelSyncManager(); + } +} From ecedea21dbb9e31195be6a0e09e6e67cdac06375 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Tue, 3 Jun 2025 22:23:25 -0400 Subject: [PATCH 068/136] Spotless --- src/main/java/gregtech/api/mui/GregTechGuiScreen.java | 4 ---- src/main/java/gregtech/api/util/MUIUtil.java | 11 ++++++++--- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/main/java/gregtech/api/mui/GregTechGuiScreen.java b/src/main/java/gregtech/api/mui/GregTechGuiScreen.java index b2d7618cabd..e951ad6e529 100644 --- a/src/main/java/gregtech/api/mui/GregTechGuiScreen.java +++ b/src/main/java/gregtech/api/mui/GregTechGuiScreen.java @@ -3,8 +3,6 @@ import gregtech.api.GTValues; import gregtech.api.util.MUIUtil; import gregtech.mixins.mui2.ModularSyncManagerAccessor; -import gregtech.mixins.mui2.PanelSyncHandlerAccessor; -import gregtech.mixins.mui2.PanelSyncManagerAccessor; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -20,8 +18,6 @@ import mezz.jei.api.recipe.transfer.IRecipeTransferError; import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; diff --git a/src/main/java/gregtech/api/util/MUIUtil.java b/src/main/java/gregtech/api/util/MUIUtil.java index b1f8549ad34..8558aa1467c 100644 --- a/src/main/java/gregtech/api/util/MUIUtil.java +++ b/src/main/java/gregtech/api/util/MUIUtil.java @@ -1,12 +1,12 @@ package gregtech.api.util; +import gregtech.mixins.mui2.PanelSyncHandlerAccessor; +import gregtech.mixins.mui2.PanelSyncManagerAccessor; + import com.cleanroommc.modularui.value.sync.PanelSyncHandler; import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.value.sync.SyncHandler; -import gregtech.mixins.mui2.PanelSyncHandlerAccessor; -import gregtech.mixins.mui2.PanelSyncManagerAccessor; - import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -16,6 +16,7 @@ public class MUIUtil { /** * Checks if the {@link PanelSyncManager} has any sub panels. + * * @param panelSyncManager the panel sync manager to check * @return if it has sub panels */ @@ -25,6 +26,7 @@ public static boolean hasSubPanels(PanelSyncManager panelSyncManager) { /** * Retrieves all sub panel {@link PanelSyncHandler}s from a {@link PanelSyncManager}. + * * @param panelSyncManager the panel sync manager to gather the sub panel handlers from * @return a list of all sub panel handlers */ @@ -47,6 +49,7 @@ public static List getSubPanels(PanelSyncManager panelSyncMana /** * Gets all of the {@link SyncHandler}s from a {@link PanelSyncManager}. + * * @param panelSyncManager the panel sync manager to gather the sync handlers from * @return a list of all the sync handlers */ @@ -56,6 +59,7 @@ public static Collection getSyncHandlers(PanelSyncManager panelSync /** * Checks if a {@link PanelSyncHandler} has a {@link PanelSyncManager}. + * * @param panelSyncHandler the panel sync handler to check * @return if the panel sync handler has a panel sync manager */ @@ -65,6 +69,7 @@ public static boolean hasSyncManager(PanelSyncHandler panelSyncHandler) { /** * Gets the {@link PanelSyncManager} from a {@link PanelSyncHandler}. + * * @param panelSyncHandler the panel sync handler to get the panel sync manager from * @return the panel sync manager of the panel sync handler */ From e376f17c04dec583fd248c6855346c3b21a305bf Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Tue, 3 Jun 2025 23:06:25 -0400 Subject: [PATCH 069/136] Fix critical math error in collapseItemList --- .../java/gregtech/api/util/GTUtility.java | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/main/java/gregtech/api/util/GTUtility.java b/src/main/java/gregtech/api/util/GTUtility.java index 03428262e25..d9d5acf2741 100644 --- a/src/main/java/gregtech/api/util/GTUtility.java +++ b/src/main/java/gregtech/api/util/GTUtility.java @@ -997,19 +997,23 @@ public static void collapseItemList(@NotNull List stacks, @Range(from = 1, to = Integer.MAX_VALUE) int maxStackSize) { Hash.Strategy stackStrategy = ItemStackHashStrategy.comparingAllButCount(); - for (int index = 1; index < stacks.size(); index++) { - ItemStack collapsingStack = stacks.get(index); - if (collapsingStack.isEmpty() || collapsingStack.getCount() >= maxStackSize) continue; + for (int checkingSlot = 0; checkingSlot < stacks.size(); checkingSlot++) { + ItemStack stackToCheck = stacks.get(checkingSlot); + if (stackToCheck.getCount() >= maxStackSize) continue; + + for (int collapsingSlot = stacks.size() - 1; collapsingSlot > checkingSlot; collapsingSlot--) { + ItemStack collapsingStack = stacks.get(collapsingSlot); + if (collapsingStack.isEmpty()) continue; - for (int checkingSlot = 0; checkingSlot < index; checkingSlot++) { - ItemStack stackToCheck = stacks.get(checkingSlot); if (stackStrategy.equals(stackToCheck, collapsingStack)) { - int collapsingStackSize = collapsingStack.getCount(); - int finalSize = Math.min(stackToCheck.getCount() + collapsingStackSize, maxStackSize); - int toTransfer = finalSize - collapsingStackSize; + final int checkingSize = stackToCheck.getCount(); + final int collapsingSize = collapsingStack.getCount(); + + final int maxFinalSize = Math.min(maxStackSize, checkingSize + collapsingSize); + final int toTransfer = maxFinalSize - checkingSize; stackToCheck.grow(toTransfer); - collapsingStack.grow(-toTransfer); + collapsingStack.shrink(toTransfer); } } } From b36f6315163e1d4a22798c8940ffdd4528a5f58e Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Tue, 3 Jun 2025 23:11:43 -0400 Subject: [PATCH 070/136] Clear unused slots --- .../java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java index 190bf4538a5..3a3bd8c7a7c 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java @@ -62,8 +62,9 @@ public IRecipeTransferError receiveRecipe(@NotNull IRecipeLayout recipeLayout, b originalItemInputs.forEach(stack -> itemInputs.add(stack.copy())); GTUtility.collapseItemList(itemInputs); - for (int index = 0; index < itemInputs.size(); index++) { - setConfig(index, itemInputs.get(index)); + for (int index = 0; index < slots.length; index++) { + ItemStack stackToSet = index >= itemInputs.size() ? null : itemInputs.get(index); + setConfig(index, stackToSet); } return null; From a490d6215452c738fc6d551d8a39adcaa0b23f9a Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Tue, 3 Jun 2025 23:29:06 -0400 Subject: [PATCH 071/136] Do recipe transfer stuff for fluids --- .../mui/sync/appeng/AEFluidSyncHandler.java | 23 +++++++- .../java/gregtech/api/util/GTUtility.java | 58 +++++++++++++++++++ 2 files changed, 80 insertions(+), 1 deletion(-) diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java index 3fbd5fa1256..aebc6308744 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java @@ -1,5 +1,7 @@ package gregtech.api.mui.sync.appeng; +import gregtech.api.util.GTUtility; +import gregtech.api.util.JEIUtil; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEFluidList; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEFluidSlot; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.IConfigurableSlot; @@ -16,6 +18,9 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.ArrayList; +import java.util.List; + public class AEFluidSyncHandler extends AESyncHandler { private final ExportOnlyAEFluidList fluidList; @@ -50,7 +55,23 @@ public boolean isStackValidForSlot(int index, @Nullable IAEFluidStack stack) { @Override public IRecipeTransferError receiveRecipe(@NotNull IRecipeLayout recipeLayout, boolean maxTransfer, boolean simulate) { - return DEFAULT_JEI_ERROR; + if (simulate) return null; + + List originalFluidStacks = JEIUtil.getDisplayedInputFluidStacks(recipeLayout.getFluidStacks()); + List fluidInputs = new ArrayList<>(originalFluidStacks.size()); + originalFluidStacks.forEach(stack -> { + if (stack != null) { + fluidInputs.add(stack.copy()); + } + }); + GTUtility.collapseFluidList(fluidInputs); + + for (int index = 0; index < slots.length; index++) { + FluidStack stackToSet = index >= fluidInputs.size() ? null : fluidInputs.get(index); + setConfig(index, stackToSet); + } + + return null; } @SideOnly(Side.CLIENT) diff --git a/src/main/java/gregtech/api/util/GTUtility.java b/src/main/java/gregtech/api/util/GTUtility.java index d9d5acf2741..0593eddd39d 100644 --- a/src/main/java/gregtech/api/util/GTUtility.java +++ b/src/main/java/gregtech/api/util/GTUtility.java @@ -1026,4 +1026,62 @@ public static void collapseItemList(@NotNull List stacks, public static void collapseItemList(List stacks) { collapseItemList(stacks, Integer.MAX_VALUE); } + + /** + * Attempts to collapse a {@link List} of {@link FluidStack}s by combining similar stacks downwards (towards index + * 0).
+ * WARNING: Mutates original fluid stacks, you might want to make a new list with copies! + * + * @param stacks the list to collapse + * @param maxStackSize the max stack size the to-be combined stack sizes can be + */ + public static void collapseFluidList(@NotNull List stacks, + @Range(from = 1, to = Integer.MAX_VALUE) int maxStackSize) { + // TODO: replace with FluidStackHashStrategy once the MUI2 Multi PR merges + Hash.Strategy stackStrategy = new Hash.Strategy<>() { + + @Override + public int hashCode(FluidStack o) { + // don't need to do this since I'll only call equals + return 0; + } + + @Override + public boolean equals(FluidStack a, FluidStack b) { + if (a == null) return b == null; + if (b == null) return false; + + return a.getFluid() == b.getFluid() && a.tag.equals(b.tag); + } + }; + + for (int checkingSlot = 0; checkingSlot < stacks.size(); checkingSlot++) { + FluidStack stackToCheck = stacks.get(checkingSlot); + if (stackToCheck.amount >= maxStackSize) continue; + + for (int collapsingSlot = stacks.size() - 1; collapsingSlot > checkingSlot; collapsingSlot--) { + FluidStack collapsingStack = stacks.get(collapsingSlot); + if (collapsingStack.amount < 1) continue; + + if (stackStrategy.equals(stackToCheck, collapsingStack)) { + final int checkingSize = stackToCheck.amount; + final int collapsingSize = collapsingStack.amount; + + final int maxFinalSize = Math.min(maxStackSize, checkingSize + collapsingSize); + final int toTransfer = maxFinalSize - checkingSize; + + stackToCheck.amount += toTransfer; + collapsingStack.amount -= toTransfer; + } + } + } + } + + /** + * The same as {@link #collapseFluidList(List, int)} but has a stack size limit of {@link Integer#MAX_VALUE}
+ * WARNING: Mutates original fluid stacks, you might want to make a new list with copies! + */ + public static void collapseFluidList(List stacks) { + collapseFluidList(stacks, Integer.MAX_VALUE); + } } From 5862646d9ad881ee589f6fcccf377bb6f9a7b007 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Tue, 3 Jun 2025 23:29:57 -0400 Subject: [PATCH 072/136] Check that the stack isn't empty before adding it to the inputs list --- .../gregtech/api/mui/sync/appeng/AEItemSyncHandler.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java index 3a3bd8c7a7c..ddaf8d353e8 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java @@ -59,7 +59,11 @@ public IRecipeTransferError receiveRecipe(@NotNull IRecipeLayout recipeLayout, b List originalItemInputs = JEIUtil.getDisplayedInputItemStacks(recipeLayout.getItemStacks()); List itemInputs = new ArrayList<>(originalItemInputs.size()); - originalItemInputs.forEach(stack -> itemInputs.add(stack.copy())); + originalItemInputs.forEach(stack -> { + if (!stack.isEmpty()) { + itemInputs.add(stack.copy()); + } + }); GTUtility.collapseItemList(itemInputs); for (int index = 0; index < slots.length; index++) { From 6c9534e2c657f92af265dce34961cc0cfb62ff25 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Tue, 3 Jun 2025 23:37:03 -0400 Subject: [PATCH 073/136] Fix grammatical error in javadoc --- src/main/java/gregtech/api/util/GTUtility.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/gregtech/api/util/GTUtility.java b/src/main/java/gregtech/api/util/GTUtility.java index 0593eddd39d..c4cbdce70b5 100644 --- a/src/main/java/gregtech/api/util/GTUtility.java +++ b/src/main/java/gregtech/api/util/GTUtility.java @@ -991,7 +991,7 @@ public static int combineRGB(@Range(from = 0, to = 255) int r, @Range(from = 0, * WARNING: Mutates original item stacks, you might want to make a new list with copies! * * @param stacks the list to collapse - * @param maxStackSize the max stack size the to-be combined stack sizes can be + * @param maxStackSize the max stack size of the to-be combined stack */ public static void collapseItemList(@NotNull List stacks, @Range(from = 1, to = Integer.MAX_VALUE) int maxStackSize) { @@ -1033,7 +1033,7 @@ public static void collapseItemList(List stacks) { * WARNING: Mutates original fluid stacks, you might want to make a new list with copies! * * @param stacks the list to collapse - * @param maxStackSize the max stack size the to-be combined stack sizes can be + * @param maxStackSize the max stack size of the to-be combined stack */ public static void collapseFluidList(@NotNull List stacks, @Range(from = 1, to = Integer.MAX_VALUE) int maxStackSize) { From a7242a00fee630ede028da611bb4b9542b8520f6 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Tue, 3 Jun 2025 23:41:22 -0400 Subject: [PATCH 074/136] Remove unused data codes since I used MUI2 SyncHandlers for them instead --- src/main/java/gregtech/api/capability/GregtechDataCodes.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/gregtech/api/capability/GregtechDataCodes.java b/src/main/java/gregtech/api/capability/GregtechDataCodes.java index 2aa14cb465e..b2e7077cc59 100644 --- a/src/main/java/gregtech/api/capability/GregtechDataCodes.java +++ b/src/main/java/gregtech/api/capability/GregtechDataCodes.java @@ -194,8 +194,6 @@ public static int assignId() { // ME Parts public static final int UPDATE_AUTO_PULL = assignId(); public static final int UPDATE_ONLINE_STATUS = assignId(); - public static final int UPDATE_REFRESH_RATE = assignId(); - public static final int UPDATE_MINIMUM_STOCK = assignId(); // Everything below MUST be last in the class! public static final Int2ObjectMap NAMES = new Int2ObjectArrayMap<>(); From 08787b700ded1dba4d63505eab9c3431b102958a Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Wed, 4 Jun 2025 00:27:04 -0400 Subject: [PATCH 075/136] Rename IAEStackByteBufAdapter to AEStackByteBufAdapter since it's a class and make it public --- .../mui/sync/appeng/AEFluidSyncHandler.java | 2 +- .../api/mui/sync/appeng/AEItemSyncHandler.java | 2 +- ...Adapter.java => AEStackByteBufAdapter.java} | 18 +++++++++--------- 3 files changed, 11 insertions(+), 11 deletions(-) rename src/main/java/gregtech/api/mui/sync/appeng/{IAEStackByteBufAdapter.java => AEStackByteBufAdapter.java} (66%) diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java index aebc6308744..a0bec7a99d7 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java @@ -42,7 +42,7 @@ public AEFluidSyncHandler(ExportOnlyAEFluidList fluidList, @Nullable Runnable di @Override protected @NotNull IByteBufAdapter initializeByteBufAdapter() { - return IAEStackByteBufAdapter.wrappedFluidStackAdapter; + return AEStackByteBufAdapter.wrappedFluidStackAdapter; } @Override diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java index ddaf8d353e8..e337819a6d0 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java @@ -42,7 +42,7 @@ public AEItemSyncHandler(ExportOnlyAEItemList itemList, @Nullable Runnable dirty @Override protected @NotNull IByteBufAdapter initializeByteBufAdapter() { - return IAEStackByteBufAdapter.wrappedItemStackAdapter; + return AEStackByteBufAdapter.wrappedItemStackAdapter; } @Override diff --git a/src/main/java/gregtech/api/mui/sync/appeng/IAEStackByteBufAdapter.java b/src/main/java/gregtech/api/mui/sync/appeng/AEStackByteBufAdapter.java similarity index 66% rename from src/main/java/gregtech/api/mui/sync/appeng/IAEStackByteBufAdapter.java rename to src/main/java/gregtech/api/mui/sync/appeng/AEStackByteBufAdapter.java index f57b1a725e3..1099a9eee41 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/IAEStackByteBufAdapter.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AEStackByteBufAdapter.java @@ -16,11 +16,11 @@ import java.io.IOException; import java.util.Objects; -class IAEStackByteBufAdapter> implements IByteBufAdapter { +public class AEStackByteBufAdapter> implements IByteBufAdapter { - public static final IAEStackByteBufAdapter wrappedItemStackAdapter = specificDeserializer( + public static final AEStackByteBufAdapter wrappedItemStackAdapter = specificDeserializer( WrappedItemStack::fromPacket); - public static final IAEStackByteBufAdapter wrappedFluidStackAdapter = specificDeserializer( + public static final AEStackByteBufAdapter wrappedFluidStackAdapter = specificDeserializer( WrappedFluidStack::fromPacket); @NotNull @@ -28,20 +28,20 @@ class IAEStackByteBufAdapter> implements IByteBufAdapter deserializer; - private IAEStackByteBufAdapter(@NotNull IByteBufSerializer serializer, - @NotNull IByteBufDeserializer deserializer) { + private AEStackByteBufAdapter(@NotNull IByteBufSerializer serializer, + @NotNull IByteBufDeserializer deserializer) { this.serializer = serializer; this.deserializer = deserializer; } public static < - T extends IAEStack> IAEStackByteBufAdapter createAdapter(@NotNull IByteBufSerializer serializer, - @NotNull IByteBufDeserializer deserializer) { - return new IAEStackByteBufAdapter<>(serializer, deserializer); + T extends IAEStack> AEStackByteBufAdapter createAdapter(@NotNull IByteBufSerializer serializer, + @NotNull IByteBufDeserializer deserializer) { + return new AEStackByteBufAdapter<>(serializer, deserializer); } public static < - T extends IAEStack> IAEStackByteBufAdapter specificDeserializer(@NotNull IByteBufDeserializer deserializer) { + T extends IAEStack> AEStackByteBufAdapter specificDeserializer(@NotNull IByteBufDeserializer deserializer) { return createAdapter((buf, stack) -> stack.writeToPacket(buf), deserializer); } From 2978b243fd3572c963efc72db31db348958d11cc Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Wed, 4 Jun 2025 00:28:30 -0400 Subject: [PATCH 076/136] Use `GTUtility.safeCastLongToInt` in `AESyncHandler#getConfigAmount(int)` --- src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java index 495ddbc20ee..23a3d2b635a 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java @@ -1,6 +1,7 @@ package gregtech.api.mui.sync.appeng; import gregtech.api.mui.IJEIRecipeReceiver; +import gregtech.api.util.GTUtility; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.IConfigurableSlot; import net.minecraft.network.PacketBuffer; @@ -173,7 +174,7 @@ public boolean hasConfig(int index) { public int getConfigAmount(int index) { T config = getConfig(index); - return config == null ? 0 : (int) config.getStackSize(); + return config == null ? 0 : GTUtility.safeCastLongToInt(config.getStackSize()); } @SideOnly(Side.CLIENT) From 8707fa54cd113cc2f28c89b0f74dd654962f0592 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Wed, 4 Jun 2025 00:36:59 -0400 Subject: [PATCH 077/136] Use the bus/hatch item as the settings popup icon --- .../multiblockpart/appeng/MetaTileEntityMEInputBus.java | 6 +----- .../multiblockpart/appeng/MetaTileEntityMEInputHatch.java | 6 +----- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java index b0b51dfd10a..8cae10e7d4b 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java @@ -43,7 +43,6 @@ import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandlerModifiable; -import appeng.api.AEApi; import appeng.api.config.Actionable; import appeng.api.storage.IMEMonitor; import appeng.api.storage.channels.IItemStorageChannel; @@ -72,7 +71,6 @@ import java.util.Arrays; import java.util.List; -import java.util.Optional; public class MetaTileEntityMEInputBus extends MetaTileEntityAEHostableChannelPart implements IMultiblockAbilityPart, @@ -294,9 +292,7 @@ protected Widget getSettingWidget(PanelSyncManager guiSyncManager) { protected ModularPanel buildSettingsPopup(PanelSyncManager syncManager, IPanelHandler syncHandler) { IntSyncValue refreshRateSync = new IntSyncValue(this::getRefreshRate, this::setRefreshRate); - - Optional meControllerItem = AEApi.instance().definitions().blocks().controller().maybeStack(1); - ItemDrawable meControllerDrawable = new ItemDrawable(meControllerItem.orElse(ItemStack.EMPTY)); + ItemDrawable meControllerDrawable = new ItemDrawable(getStackForm()); return GTGuis.createPopupPanel("settings", 110, getSettingsPopupHeight()) .child(Flow.row() diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java index 3f337fc0735..e5201e7355e 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java @@ -35,7 +35,6 @@ import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.fluids.IFluidTank; -import appeng.api.AEApi; import appeng.api.config.Actionable; import appeng.api.storage.IMEMonitor; import appeng.api.storage.channels.IFluidStorageChannel; @@ -62,7 +61,6 @@ import java.util.Arrays; import java.util.List; -import java.util.Optional; public class MetaTileEntityMEInputHatch extends MetaTileEntityAEHostableChannelPart implements IMultiblockAbilityPart, IDataStickIntractable { @@ -250,9 +248,7 @@ protected Widget getSettingWidget(PanelSyncManager guiSyncManager) { protected ModularPanel buildSettingsPopup(PanelSyncManager syncManager, IPanelHandler syncHandler) { IntSyncValue refreshRateSync = new IntSyncValue(this::getRefreshRate, this::setRefreshRate); - - Optional meControllerItem = AEApi.instance().definitions().blocks().controller().maybeStack(1); - ItemDrawable meControllerDrawable = new ItemDrawable(meControllerItem.orElse(ItemStack.EMPTY)); + ItemDrawable meControllerDrawable = new ItemDrawable(getStackForm()); final int width = 110; return GTGuis.createPopupPanel("settings", width, getSettingsPopupHeight()) From 7cbf9218e69cef18ddb1cf9e441aa9a6fae8378f Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Wed, 4 Jun 2025 00:38:52 -0400 Subject: [PATCH 078/136] Pull the preview widget implementations into their own class --- .../appeng/fluid/AEFluidConfigSlot.java | 29 -------------- .../fluid/AEFluidStackPreviewWidget.java | 40 +++++++++++++++++++ .../widget/appeng/item/AEItemConfigSlot.java | 29 -------------- .../appeng/item/AEItemStackPreviewWidget.java | 39 ++++++++++++++++++ 4 files changed, 79 insertions(+), 58 deletions(-) create mode 100644 src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidStackPreviewWidget.java create mode 100644 src/main/java/gregtech/api/mui/widget/appeng/item/AEItemStackPreviewWidget.java diff --git a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java index c571cc4682d..950515b0314 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java @@ -16,7 +16,6 @@ import appeng.api.storage.data.IAEFluidStack; import com.cleanroommc.modularui.api.widget.Interactable; -import com.cleanroommc.modularui.drawable.GuiDraw; import com.cleanroommc.modularui.integration.jei.JeiGhostIngredientSlot; import com.cleanroommc.modularui.integration.jei.ModularUIJeiPlugin; import com.cleanroommc.modularui.screen.RichTooltip; @@ -27,7 +26,6 @@ import org.jetbrains.annotations.Nullable; import java.util.function.BooleanSupplier; -import java.util.function.Supplier; public class AEFluidConfigSlot extends AEConfigSlot implements Interactable, JeiGhostIngredientSlot { @@ -129,31 +127,4 @@ public void setGhostIngredient(@NotNull FluidStack ingredient) { return new AEFluidStackPreviewWidget(() -> getSyncHandler().getConfig(index)) .background(GTGuiTextures.FLUID_SLOT); } - - private static class AEFluidStackPreviewWidget extends AEStackPreviewWidget { - - public AEFluidStackPreviewWidget(@NotNull Supplier stackToDraw) { - super(stackToDraw); - } - - @Override - protected void buildTooltip(@NotNull RichTooltip tooltip) { - if (stackToDraw.get() instanceof WrappedFluidStack wrappedFluidStack) { - KeyUtil.fluidInfo(wrappedFluidStack.getDelegate(), tooltip, false, true, false); - } - } - - @Override - public void draw(@Nullable IAEFluidStack stackToDraw, int x, int y, int width, int height) { - if (stackToDraw instanceof WrappedFluidStack wrappedFluidStack) { - GuiDraw.drawFluidTexture(wrappedFluidStack.getDelegate(), x, y, width, height, 0.0f); - } - } - - @Override - public @Nullable Object getIngredient() { - IAEFluidStack stack = stackToDraw.get(); - return stack == null ? null : stack.getFluidStack(); - } - } } diff --git a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidStackPreviewWidget.java b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidStackPreviewWidget.java new file mode 100644 index 00000000000..7ce53255121 --- /dev/null +++ b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidStackPreviewWidget.java @@ -0,0 +1,40 @@ +package gregtech.api.mui.widget.appeng.fluid; + +import gregtech.api.mui.widget.appeng.AEStackPreviewWidget; +import gregtech.api.util.KeyUtil; +import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedFluidStack; + +import appeng.api.storage.data.IAEFluidStack; +import com.cleanroommc.modularui.drawable.GuiDraw; +import com.cleanroommc.modularui.screen.RichTooltip; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.function.Supplier; + +class AEFluidStackPreviewWidget extends AEStackPreviewWidget { + + public AEFluidStackPreviewWidget(@NotNull Supplier stackToDraw) { + super(stackToDraw); + } + + @Override + protected void buildTooltip(@NotNull RichTooltip tooltip) { + if (stackToDraw.get() instanceof WrappedFluidStack wrappedFluidStack) { + KeyUtil.fluidInfo(wrappedFluidStack.getDelegate(), tooltip, false, true, false); + } + } + + @Override + public void draw(@Nullable IAEFluidStack stackToDraw, int x, int y, int width, int height) { + if (stackToDraw instanceof WrappedFluidStack wrappedFluidStack) { + GuiDraw.drawFluidTexture(wrappedFluidStack.getDelegate(), x, y, width, height, 0.0f); + } + } + + @Override + public @Nullable Object getIngredient() { + IAEFluidStack stack = stackToDraw.get(); + return stack == null ? null : stack.getFluidStack(); + } +} diff --git a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java index b32984b2d66..1e8c0f71e22 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java @@ -12,7 +12,6 @@ import net.minecraft.item.ItemStack; import appeng.api.storage.data.IAEItemStack; -import com.cleanroommc.modularui.drawable.GuiDraw; import com.cleanroommc.modularui.integration.jei.JeiGhostIngredientSlot; import com.cleanroommc.modularui.integration.jei.ModularUIJeiPlugin; import com.cleanroommc.modularui.screen.RichTooltip; @@ -23,7 +22,6 @@ import org.jetbrains.annotations.Nullable; import java.util.function.BooleanSupplier; -import java.util.function.Supplier; public class AEItemConfigSlot extends AEConfigSlot implements JeiGhostIngredientSlot { @@ -127,31 +125,4 @@ public void setGhostIngredient(@NotNull ItemStack ingredient) { return new AEItemStackPreviewWidget(() -> getSyncHandler().getConfig(index)) .background(GTGuiTextures.SLOT); } - - private static class AEItemStackPreviewWidget extends AEStackPreviewWidget { - - public AEItemStackPreviewWidget(@NotNull Supplier stackToDraw) { - super(stackToDraw); - } - - @Override - protected void buildTooltip(@NotNull RichTooltip tooltip) { - if (stackToDraw.get() instanceof WrappedItemStack wrappedItemStack) { - tooltip.addFromItem(wrappedItemStack.getDefinition()); - } - } - - @Override - public void draw(@Nullable IAEItemStack stackToDraw, int x, int y, int width, int height) { - if (stackToDraw instanceof WrappedItemStack wrappedItemStack) { - GuiDraw.drawItem(wrappedItemStack.getDefinition(), x, y, width, height); - } - } - - @Override - public @Nullable Object getIngredient() { - IAEItemStack stack = stackToDraw.get(); - return stack == null ? null : stack.createItemStack(); - } - } } diff --git a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemStackPreviewWidget.java b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemStackPreviewWidget.java new file mode 100644 index 00000000000..8acf2bedcea --- /dev/null +++ b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemStackPreviewWidget.java @@ -0,0 +1,39 @@ +package gregtech.api.mui.widget.appeng.item; + +import gregtech.api.mui.widget.appeng.AEStackPreviewWidget; +import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedItemStack; + +import appeng.api.storage.data.IAEItemStack; +import com.cleanroommc.modularui.drawable.GuiDraw; +import com.cleanroommc.modularui.screen.RichTooltip; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.function.Supplier; + +class AEItemStackPreviewWidget extends AEStackPreviewWidget { + + public AEItemStackPreviewWidget(@NotNull Supplier stackToDraw) { + super(stackToDraw); + } + + @Override + protected void buildTooltip(@NotNull RichTooltip tooltip) { + if (stackToDraw.get() instanceof WrappedItemStack wrappedItemStack) { + tooltip.addFromItem(wrappedItemStack.getDefinition()); + } + } + + @Override + public void draw(@Nullable IAEItemStack stackToDraw, int x, int y, int width, int height) { + if (stackToDraw instanceof WrappedItemStack wrappedItemStack) { + GuiDraw.drawItem(wrappedItemStack.getDefinition(), x, y, width, height); + } + } + + @Override + public @Nullable Object getIngredient() { + IAEItemStack stack = stackToDraw.get(); + return stack == null ? null : stack.createItemStack(); + } +} From 8c50044883e06dc01468bbb6b0769c5828f5d0e0 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Wed, 4 Jun 2025 00:45:29 -0400 Subject: [PATCH 079/136] Delete the old MUI0 AE2 widgets --- .../gui/widget/appeng/AEConfigWidget.java | 147 --------- .../widget/appeng/AEFluidConfigWidget.java | 68 ---- .../gui/widget/appeng/AEItemConfigWidget.java | 68 ---- .../gui/widget/appeng/slot/AEConfigSlot.java | 82 ----- .../widget/appeng/slot/AEFluidConfigSlot.java | 294 ------------------ .../widget/appeng/slot/AEItemConfigSlot.java | 255 --------------- .../gui/widget/appeng/slot/AmountSetSlot.java | 86 ----- 7 files changed, 1000 deletions(-) delete mode 100644 src/main/java/gregtech/common/gui/widget/appeng/AEConfigWidget.java delete mode 100644 src/main/java/gregtech/common/gui/widget/appeng/AEFluidConfigWidget.java delete mode 100644 src/main/java/gregtech/common/gui/widget/appeng/AEItemConfigWidget.java delete mode 100644 src/main/java/gregtech/common/gui/widget/appeng/slot/AEConfigSlot.java delete mode 100644 src/main/java/gregtech/common/gui/widget/appeng/slot/AEFluidConfigSlot.java delete mode 100644 src/main/java/gregtech/common/gui/widget/appeng/slot/AEItemConfigSlot.java delete mode 100644 src/main/java/gregtech/common/gui/widget/appeng/slot/AmountSetSlot.java diff --git a/src/main/java/gregtech/common/gui/widget/appeng/AEConfigWidget.java b/src/main/java/gregtech/common/gui/widget/appeng/AEConfigWidget.java deleted file mode 100644 index 1195fa8f34f..00000000000 --- a/src/main/java/gregtech/common/gui/widget/appeng/AEConfigWidget.java +++ /dev/null @@ -1,147 +0,0 @@ -package gregtech.common.gui.widget.appeng; - -import gregtech.api.gui.Widget; -import gregtech.api.gui.widgets.AbstractWidgetGroup; -import gregtech.api.util.Position; -import gregtech.api.util.Size; -import gregtech.common.gui.widget.appeng.slot.AEConfigSlot; -import gregtech.common.gui.widget.appeng.slot.AmountSetSlot; -import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.IConfigurableSlot; - -import appeng.api.storage.data.IAEStack; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; - -import java.io.IOException; - -/** - * @Author GlodBlock - * @Description Display the config like ME Interface - * @Date 2023/4/21-0:27 - */ -public abstract class AEConfigWidget> extends AbstractWidgetGroup { - - protected final IConfigurableSlot[] config; - protected IConfigurableSlot[] cached; - protected Int2ObjectMap> changeMap = new Int2ObjectOpenHashMap<>(); - protected IConfigurableSlot[] displayList; - protected AmountSetSlot amountSetWidget; - protected final boolean isStocking; - protected final static int UPDATE_ID = 1000; - - public AEConfigWidget(int x, int y, IConfigurableSlot[] config, boolean isStocking) { - super(new Position(x, y), new Size(config.length * 18, 18 * 2)); - this.isStocking = isStocking; - this.config = config; - this.init(); - if (!isStocking()) { - this.amountSetWidget = new AmountSetSlot<>(80, -40, this); - this.addWidget(this.amountSetWidget); - this.addWidget(this.amountSetWidget.getText()); - this.amountSetWidget.setVisible(false); - this.amountSetWidget.getText().setVisible(false); - } - } - - public void enableAmount(int slotIndex) { - // Only allow the amount set widget if not stocking, as amount is useless for stocking - if (isStocking()) return; - this.amountSetWidget.setSlotIndex(slotIndex); - this.amountSetWidget.setVisible(true); - this.amountSetWidget.getText().setVisible(true); - } - - public void disableAmount() { - // Only allow the amount set widget if not stocking, as amount is useless for stocking - if (isStocking()) return; - this.amountSetWidget.setSlotIndex(-1); - this.amountSetWidget.setVisible(false); - this.amountSetWidget.getText().setVisible(false); - } - - @Override - public boolean mouseClicked(int mouseX, int mouseY, int button) { - // Only allow the amount set widget if not stocking, as amount is useless for stocking - if (!isStocking()) { - if (this.amountSetWidget.isVisible()) { - if (this.amountSetWidget.getText().mouseClicked(mouseX, mouseY, button)) { - return true; - } - } - for (Widget w : this.widgets) { - if (w instanceof AEConfigSlot) { - ((AEConfigSlot) w).setSelect(false); - } - } - this.disableAmount(); - } - return super.mouseClicked(mouseX, mouseY, button); - } - - abstract void init(); - - public boolean isStocking() { - return isStocking; - } - - @Override - public void detectAndSendChanges() { - super.detectAndSendChanges(); - this.changeMap.clear(); - for (int index = 0; index < this.config.length; index++) { - IConfigurableSlot newSlot = this.config[index]; - IConfigurableSlot oldSlot = this.cached[index]; - T nConfig = newSlot.getConfig(); - T nStock = newSlot.getStock(); - T oConfig = oldSlot.getConfig(); - T oStock = oldSlot.getStock(); - if (!areAEStackCountEquals(nConfig, oConfig) || !areAEStackCountEquals(nStock, oStock)) { - this.changeMap.put(index, newSlot.copy()); - this.cached[index] = this.config[index].copy(); - this.gui.holder.markAsDirty(); - } - } - if (!this.changeMap.isEmpty()) { - this.writeUpdateInfo(UPDATE_ID, buf -> { - try { - buf.writeVarInt(this.changeMap.size()); - for (int index : this.changeMap.keySet()) { - T sConfig = this.changeMap.get(index).getConfig(); - T sStock = this.changeMap.get(index).getStock(); - buf.writeVarInt(index); - if (sConfig != null) { - buf.writeBoolean(true); - sConfig.writeToPacket(buf); - } else { - buf.writeBoolean(false); - } - if (sStock != null) { - buf.writeBoolean(true); - sStock.writeToPacket(buf); - } else { - buf.writeBoolean(false); - } - } - } catch (IOException ignored) {} - }); - } - } - - public final IConfigurableSlot getConfig(int index) { - return this.config[index]; - } - - public final IConfigurableSlot getDisplay(int index) { - return this.displayList[index]; - } - - protected final boolean areAEStackCountEquals(T s1, T s2) { - if (s2 == s1) { - return true; - } - if (s1 != null && s2 != null) { - return s1.getStackSize() == s2.getStackSize() && s1.equals(s2); - } - return false; - } -} diff --git a/src/main/java/gregtech/common/gui/widget/appeng/AEFluidConfigWidget.java b/src/main/java/gregtech/common/gui/widget/appeng/AEFluidConfigWidget.java deleted file mode 100644 index b5f709b0b86..00000000000 --- a/src/main/java/gregtech/common/gui/widget/appeng/AEFluidConfigWidget.java +++ /dev/null @@ -1,68 +0,0 @@ -package gregtech.common.gui.widget.appeng; - -import gregtech.common.gui.widget.appeng.slot.AEFluidConfigSlot; -import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEFluidList; -import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEFluidSlot; -import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.IConfigurableSlot; -import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedFluidStack; - -import net.minecraft.network.PacketBuffer; -import net.minecraftforge.fluids.FluidStack; - -import appeng.api.storage.data.IAEFluidStack; - -public class AEFluidConfigWidget extends AEConfigWidget { - - final ExportOnlyAEFluidList fluidList; - - public AEFluidConfigWidget(int x, int y, ExportOnlyAEFluidList fluidList) { - super(x, y, fluidList.getInventory(), fluidList.isStocking()); - this.fluidList = fluidList; - } - - @Override - @SuppressWarnings("unchecked") - void init() { - final int size = (int) Math.sqrt(this.config.length); - this.displayList = new IConfigurableSlot[this.config.length]; - this.cached = new IConfigurableSlot[this.config.length]; - for (int h = 0; h < size; h++) { - for (int w = 0; w < size; w++) { - final int index = h * size + w; - this.displayList[index] = new ExportOnlyAEFluidSlot(); - this.cached[index] = new ExportOnlyAEFluidSlot(); - this.addWidget(new AEFluidConfigSlot(w * 18, h * 18, this, index)); - } - } - } - - public boolean hasStackInConfig(FluidStack stack) { - return fluidList.hasStackInConfig(stack, true); - } - - public boolean isAutoPull() { - return fluidList.isAutoPull(); - } - - @Override - public void readUpdateInfo(int id, PacketBuffer buffer) { - super.readUpdateInfo(id, buffer); - if (id == UPDATE_ID) { - int size = buffer.readVarInt(); - for (int i = 0; i < size; i++) { - int index = buffer.readVarInt(); - IConfigurableSlot slot = this.displayList[index]; - if (buffer.readBoolean()) { - slot.setConfig(WrappedFluidStack.fromPacket(buffer)); - } else { - slot.setConfig(null); - } - if (buffer.readBoolean()) { - slot.setStock(WrappedFluidStack.fromPacket(buffer)); - } else { - slot.setStock(null); - } - } - } - } -} diff --git a/src/main/java/gregtech/common/gui/widget/appeng/AEItemConfigWidget.java b/src/main/java/gregtech/common/gui/widget/appeng/AEItemConfigWidget.java deleted file mode 100644 index 0f2afe98235..00000000000 --- a/src/main/java/gregtech/common/gui/widget/appeng/AEItemConfigWidget.java +++ /dev/null @@ -1,68 +0,0 @@ -package gregtech.common.gui.widget.appeng; - -import gregtech.common.gui.widget.appeng.slot.AEItemConfigSlot; -import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEItemList; -import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEItemSlot; -import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.IConfigurableSlot; -import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedItemStack; - -import net.minecraft.item.ItemStack; -import net.minecraft.network.PacketBuffer; - -import appeng.api.storage.data.IAEItemStack; - -public class AEItemConfigWidget extends AEConfigWidget { - - final ExportOnlyAEItemList itemList; - - public AEItemConfigWidget(int x, int y, ExportOnlyAEItemList itemList) { - super(x, y, itemList.getInventory(), itemList.isStocking()); - this.itemList = itemList; - } - - @Override - @SuppressWarnings("unchecked") - void init() { - final int size = (int) Math.sqrt(this.config.length); - this.displayList = new IConfigurableSlot[this.config.length]; - this.cached = new IConfigurableSlot[this.config.length]; - for (int h = 0; h < size; h++) { - for (int w = 0; w < size; w++) { - final int index = h * size + w; - this.displayList[index] = new ExportOnlyAEItemSlot(); - this.cached[index] = new ExportOnlyAEItemSlot(); - this.addWidget(new AEItemConfigSlot(w * 18, h * 18, this, index)); - } - } - } - - public boolean hasStackInConfig(ItemStack stack) { - return itemList.hasStackInConfig(stack, true); - } - - public boolean isAutoPull() { - return itemList.isAutoPull(); - } - - @Override - public void readUpdateInfo(int id, PacketBuffer buffer) { - super.readUpdateInfo(id, buffer); - if (id == UPDATE_ID) { - int size = buffer.readVarInt(); - for (int i = 0; i < size; i++) { - int index = buffer.readVarInt(); - IConfigurableSlot slot = this.displayList[index]; - if (buffer.readBoolean()) { - slot.setConfig(WrappedItemStack.fromPacket(buffer)); - } else { - slot.setConfig(null); - } - if (buffer.readBoolean()) { - slot.setStock(WrappedItemStack.fromPacket(buffer)); - } else { - slot.setStock(null); - } - } - } - } -} diff --git a/src/main/java/gregtech/common/gui/widget/appeng/slot/AEConfigSlot.java b/src/main/java/gregtech/common/gui/widget/appeng/slot/AEConfigSlot.java deleted file mode 100644 index d663340a451..00000000000 --- a/src/main/java/gregtech/common/gui/widget/appeng/slot/AEConfigSlot.java +++ /dev/null @@ -1,82 +0,0 @@ -package gregtech.common.gui.widget.appeng.slot; - -import gregtech.api.gui.Widget; -import gregtech.api.gui.ingredient.IGhostIngredientTarget; -import gregtech.api.util.Position; -import gregtech.api.util.Size; -import gregtech.common.gui.widget.appeng.AEConfigWidget; -import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.IConfigurableSlot; - -import net.minecraft.client.resources.I18n; -import net.minecraft.item.ItemStack; - -import appeng.api.storage.data.IAEStack; -import mezz.jei.api.gui.IGhostIngredientHandler; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -public class AEConfigSlot> extends Widget implements IGhostIngredientTarget { - - protected static final int DISPLAY_X_OFFSET = 18 * 5; - protected AEConfigWidget parentWidget; - protected int index; - protected final static int REMOVE_ID = 1000; - protected final static int UPDATE_ID = 1001; - protected final static int AMOUNT_CHANGE_ID = 1002; - protected boolean select = false; - - public AEConfigSlot(Position pos, Size size, AEConfigWidget widget, int index) { - super(pos, size); - this.parentWidget = widget; - this.index = index; - } - - @Override - public void drawInForeground(int mouseX, int mouseY) { - super.drawInForeground(mouseX, mouseY); - IConfigurableSlot slot = this.parentWidget.getDisplay(this.index); - if (slot.getConfig() == null && mouseOverConfig(mouseX, mouseY)) { - List hoverStringList = new ArrayList<>(); - addHoverText(hoverStringList); - if (!hoverStringList.isEmpty()) { - drawHoveringText(ItemStack.EMPTY, hoverStringList, -1, mouseX, mouseY); - } - } - } - - protected void addHoverText(List hoverText) { - hoverText.add(I18n.format("gregtech.gui.config_slot")); - if (!parentWidget.isStocking()) { - hoverText.add(I18n.format("gregtech.gui.config_slot.set")); - hoverText.add(I18n.format("gregtech.gui.config_slot.scroll")); - } else { - hoverText.add(I18n.format("gregtech.gui.config_slot.set_only")); - } - hoverText.add(I18n.format("gregtech.gui.config_slot.remove")); - } - - public void setSelect(boolean val) { - this.select = val; - } - - protected boolean mouseOverConfig(int mouseX, int mouseY) { - Position position = getPosition(); - return isMouseOver(position.x, position.y, 18, 18, mouseX, mouseY); - } - - protected boolean mouseOverStock(int mouseX, int mouseY) { - Position position = getPosition(); - return isMouseOver(position.x + DISPLAY_X_OFFSET, position.y, 18, 18, mouseX, mouseY); - } - - @Override - public List> getPhantomTargets(Object ingredient) { - return Collections.emptyList(); - } - - public AEConfigWidget getParentWidget() { - return parentWidget; - } -} diff --git a/src/main/java/gregtech/common/gui/widget/appeng/slot/AEFluidConfigSlot.java b/src/main/java/gregtech/common/gui/widget/appeng/slot/AEFluidConfigSlot.java deleted file mode 100644 index 2b852fdeb14..00000000000 --- a/src/main/java/gregtech/common/gui/widget/appeng/slot/AEFluidConfigSlot.java +++ /dev/null @@ -1,294 +0,0 @@ -package gregtech.common.gui.widget.appeng.slot; - -import gregtech.api.gui.GuiTextures; -import gregtech.api.gui.IRenderContext; -import gregtech.api.util.FluidTooltipUtil; -import gregtech.api.util.Position; -import gregtech.api.util.Size; -import gregtech.api.util.TextFormattingUtil; -import gregtech.client.utils.RenderUtil; -import gregtech.common.gui.widget.appeng.AEFluidConfigWidget; -import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.IConfigurableSlot; -import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedFluidStack; - -import net.minecraft.client.resources.I18n; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.network.PacketBuffer; -import net.minecraftforge.fluids.FluidRegistry; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.FluidUtil; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import appeng.api.storage.data.IAEFluidStack; -import com.google.common.collect.Lists; -import mezz.jei.api.gui.IGhostIngredientHandler; -import org.jetbrains.annotations.NotNull; - -import java.awt.*; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import static gregtech.api.capability.GregtechDataCodes.LOAD_PHANTOM_FLUID_STACK_FROM_NBT; -import static gregtech.api.util.GTUtility.getFluidFromContainer; - -public class AEFluidConfigSlot extends AEConfigSlot { - - public AEFluidConfigSlot(int x, int y, AEFluidConfigWidget widget, int index) { - super(new Position(x, y), new Size(18 * 6, 18), widget, index); - } - - @Override - public AEFluidConfigWidget getParentWidget() { - return (AEFluidConfigWidget) super.getParentWidget(); - } - - @Override - public void drawInBackground(int mouseX, int mouseY, float partialTicks, IRenderContext context) { - super.drawInBackground(mouseX, mouseY, partialTicks, context); - AEFluidConfigWidget pw = getParentWidget(); - Position position = getPosition(); - IConfigurableSlot slot = pw.getDisplay(this.index); - IAEFluidStack config = slot.getConfig(); - IAEFluidStack stock = slot.getStock(); - drawSlots(pw.isAutoPull(), position.x, position.y); - if (this.select) { - GuiTextures.SELECT_BOX.draw(position.x, position.y, 18, 18); - } - int stackX = position.x + 1; - int stackY = position.y + 1; - if (config != null) { - RenderUtil.drawFluidForGui(config.getFluidStack(), config.getFluidStack().amount, stackX, stackY, 17, 17); - - if (!pw.isStocking()) { - String amountStr = TextFormattingUtil.formatLongToCompactString(config.getStackSize(), 4) + "L"; - drawStringFixedCorner(amountStr, stackX + 17, stackY + 17, 16777215, true, 0.5f); - } - } - if (stock != null) { - RenderUtil.drawFluidForGui(stock.getFluidStack(), stock.getFluidStack().amount, stackX + DISPLAY_X_OFFSET, - stackY, 17, 17); - String amountStr = TextFormattingUtil.formatLongToCompactString(stock.getStackSize(), 4) + "L"; - drawStringFixedCorner(amountStr, stackX + DISPLAY_X_OFFSET + 17, stackY + 17, 16777215, true, 0.5f); - } - if (mouseOverConfig(mouseX, mouseY)) { - drawSelectionOverlay(stackX, stackY, 16, 16); - } else if (mouseOverStock(mouseX, mouseY)) { - drawSelectionOverlay(stackX + DISPLAY_X_OFFSET, stackY, 16, 16); - } - } - - private void drawSlots(boolean autoPull, int x, int y) { - if (autoPull) { - GuiTextures.SLOT_DARK.draw(x, y, 18, 18); - } else { - GuiTextures.FLUID_SLOT.draw(x, y, 18, 18); - } - GuiTextures.SLOT_DARK.draw(x + DISPLAY_X_OFFSET, y, 18, 18); - GuiTextures.CONFIG_ARROW.draw(x, y, 18, 18); - } - - @Override - public void drawInForeground(int mouseX, int mouseY) { - super.drawInForeground(mouseX, mouseY); - IAEFluidStack fluid = null; - boolean displayAmt = false; - IConfigurableSlot slot = this.parentWidget.getDisplay(this.index); - if (mouseOverConfig(mouseX, mouseY)) { - fluid = slot.getConfig(); - } else if (mouseOverStock(mouseX, mouseY)) { - fluid = slot.getStock(); - displayAmt = true; - } - if (fluid != null) { - List hoverStringList = new ArrayList<>(); - hoverStringList.add(fluid.getFluidStack().getLocalizedName()); - if (displayAmt) { - hoverStringList.add(String.format("%,d L", fluid.getStackSize())); - } - List formula = FluidTooltipUtil.getFluidTooltip(fluid.getFluidStack()); - if (formula != null) { - for (String s : formula) { - if (s.isEmpty()) continue; - hoverStringList.add(s); - } - } - drawHoveringText(ItemStack.EMPTY, hoverStringList, -1, mouseX, mouseY); - } - } - - @Override - protected void addHoverText(List hoverText) { - if (getParentWidget().isAutoPull()) { - hoverText.add(I18n.format("gregtech.gui.config_slot")); - hoverText.add(I18n.format("gregtech.gui.config_slot.auto_pull_managed")); - } else { - super.addHoverText(hoverText); - } - } - - @Override - public boolean mouseClicked(int mouseX, int mouseY, int button) { - AEFluidConfigWidget pw = getParentWidget(); - if (pw.isAutoPull()) { - return false; - } - - if (mouseOverConfig(mouseX, mouseY)) { - if (button == 1) { - // Right click to clear - writeClientAction(REMOVE_ID, buf -> {}); - - if (!pw.isStocking()) { - this.parentWidget.disableAmount(); - } - } else if (button == 0) { - // Left click to set/select - ItemStack hold = this.gui.entityPlayer.inventory.getItemStack(); - FluidStack fluid = FluidUtil.getFluidContained(hold); - - if (fluid != null) { - writeClientAction(UPDATE_ID, buf -> { - buf.writeString(fluid.getFluid().getName()); - buf.writeVarInt(fluid.amount); - }); - } - - if (!pw.isStocking()) { - this.parentWidget.enableAmount(this.index); - this.select = true; - } - } - return true; - } - return false; - } - - @Override - public void handleClientAction(int id, PacketBuffer buffer) { - super.handleClientAction(id, buffer); - IConfigurableSlot slot = this.parentWidget.getConfig(this.index); - if (id == REMOVE_ID) { - slot.setConfig(null); - this.parentWidget.disableAmount(); - writeUpdateInfo(REMOVE_ID, buf -> {}); - } - if (id == UPDATE_ID) { - FluidStack fluid = FluidRegistry.getFluidStack(buffer.readString(Integer.MAX_VALUE / 16), - buffer.readVarInt()); - if (!isFluidValidForSlot(fluid)) return; - slot.setConfig(WrappedFluidStack.fromFluidStack(fluid)); - this.parentWidget.enableAmount(this.index); - if (fluid != null) { - writeUpdateInfo(UPDATE_ID, buf -> { - buf.writeString(fluid.getFluid().getName()); - buf.writeVarInt(fluid.amount); - }); - } - } - if (id == AMOUNT_CHANGE_ID) { - if (slot.getConfig() != null) { - int amt = buffer.readInt(); - slot.getConfig().setStackSize(amt); - writeUpdateInfo(AMOUNT_CHANGE_ID, buf -> buf.writeInt(amt)); - } - } - if (id == LOAD_PHANTOM_FLUID_STACK_FROM_NBT) { - try { - FluidStack fluid = FluidStack.loadFluidStackFromNBT(buffer.readCompoundTag()); - slot.setConfig(WrappedFluidStack.fromFluidStack(fluid)); - this.parentWidget.enableAmount(this.index); - if (fluid != null) { - writeUpdateInfo(UPDATE_ID, buf -> { - buf.writeString(fluid.getFluid().getName()); - buf.writeVarInt(fluid.amount); - }); - } - } catch (IOException e) { - throw new RuntimeException(e); - } - } - } - - @Override - public void readUpdateInfo(int id, PacketBuffer buffer) { - super.readUpdateInfo(id, buffer); - IConfigurableSlot slot = this.parentWidget.getDisplay(this.index); - if (id == REMOVE_ID) { - slot.setConfig(null); - } - if (id == UPDATE_ID) { - FluidStack fluid = FluidRegistry.getFluidStack(buffer.readString(Integer.MAX_VALUE / 16), - buffer.readVarInt()); - slot.setConfig(WrappedFluidStack.fromFluidStack(fluid)); - } - if (id == AMOUNT_CHANGE_ID) { - if (slot.getConfig() != null) { - int amt = buffer.readInt(); - slot.getConfig().setStackSize(amt); - } - } - } - - private boolean isFluidValidForSlot(FluidStack stack) { - if (stack == null) return true; - AEFluidConfigWidget pw = getParentWidget(); - if (!pw.isStocking()) return true; - return !pw.hasStackInConfig(stack); - } - - @Override - public List> getPhantomTargets(Object ingredient) { - if (getFluidFromContainer(ingredient) == null) { - return Collections.emptyList(); - } - Rectangle rectangle = toRectangleBox(); - rectangle.width /= 6; - return Lists.newArrayList(new IGhostIngredientHandler.Target<>() { - - @NotNull - @Override - public Rectangle getArea() { - return rectangle; - } - - @Override - public void accept(@NotNull Object ingredient) { - FluidStack stack = getFluidFromContainer(ingredient); - - if (stack != null) { - NBTTagCompound compound = stack.writeToNBT(new NBTTagCompound()); - writeClientAction(LOAD_PHANTOM_FLUID_STACK_FROM_NBT, buf -> buf.writeCompoundTag(compound)); - } - } - }); - } - - @SideOnly(Side.CLIENT) - public boolean mouseWheelMove(int mouseX, int mouseY, int wheelDelta) { - if (parentWidget.isStocking()) return false; - IConfigurableSlot slot = this.parentWidget.getDisplay(this.index); - Rectangle rectangle = toRectangleBox(); - rectangle.width /= 6; - if (slot.getConfig() == null || wheelDelta == 0 || !rectangle.contains(mouseX, mouseY)) { - return false; - } - FluidStack fluid = slot.getConfig().getFluidStack(); - long amt; - if (isCtrlDown()) { - amt = wheelDelta > 0 ? fluid.amount * 2L : fluid.amount / 2L; - } else { - amt = wheelDelta > 0 ? fluid.amount + 1L : fluid.amount - 1L; - } - - if (amt > 0 && amt < Integer.MAX_VALUE + 1L) { - int finalAmt = (int) amt; - writeClientAction(AMOUNT_CHANGE_ID, buf -> buf.writeInt(finalAmt)); - return true; - } - return false; - } -} diff --git a/src/main/java/gregtech/common/gui/widget/appeng/slot/AEItemConfigSlot.java b/src/main/java/gregtech/common/gui/widget/appeng/slot/AEItemConfigSlot.java deleted file mode 100644 index 3dff4140249..00000000000 --- a/src/main/java/gregtech/common/gui/widget/appeng/slot/AEItemConfigSlot.java +++ /dev/null @@ -1,255 +0,0 @@ -package gregtech.common.gui.widget.appeng.slot; - -import gregtech.api.gui.GuiTextures; -import gregtech.api.gui.IRenderContext; -import gregtech.api.util.Position; -import gregtech.api.util.Size; -import gregtech.api.util.TextFormattingUtil; -import gregtech.common.gui.widget.appeng.AEItemConfigWidget; -import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.IConfigurableSlot; -import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedItemStack; - -import net.minecraft.client.resources.I18n; -import net.minecraft.item.ItemStack; -import net.minecraft.network.PacketBuffer; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -import appeng.api.storage.data.IAEItemStack; -import com.google.common.collect.Lists; -import mezz.jei.api.gui.IGhostIngredientHandler; -import org.jetbrains.annotations.NotNull; - -import java.awt.*; -import java.io.IOException; -import java.util.Collections; -import java.util.List; - -public class AEItemConfigSlot extends AEConfigSlot { - - public AEItemConfigSlot(int x, int y, AEItemConfigWidget widget, int index) { - super(new Position(x, y), new Size(18 * 6, 18), widget, index); - } - - @Override - public AEItemConfigWidget getParentWidget() { - return (AEItemConfigWidget) super.getParentWidget(); - } - - @Override - public void drawInBackground(int mouseX, int mouseY, float partialTicks, IRenderContext context) { - super.drawInBackground(mouseX, mouseY, partialTicks, context); - AEItemConfigWidget pw = getParentWidget(); - Position position = getPosition(); - IConfigurableSlot slot = pw.getDisplay(this.index); - IAEItemStack config = slot.getConfig(); - IAEItemStack stock = slot.getStock(); - drawSlots(pw.isAutoPull(), position.x, position.y); - if (this.select) { - GuiTextures.SELECT_BOX.draw(position.x, position.y, 18, 18); - } - int stackX = position.x + 1; - int stackY = position.y + 1; - if (config != null) { - ItemStack stack = config.createItemStack(); - stack.setCount(1); - drawItemStack(stack, stackX, stackY, null); - - // Only draw the config amount if not stocking, as its meaningless when stocking - if (!pw.isStocking()) { - String amountStr = TextFormattingUtil.formatLongToCompactString(config.getStackSize(), 4); - drawStringFixedCorner(amountStr, stackX + 17, stackY + 17, 16777215, true, 0.5f); - } - } - if (stock != null) { - ItemStack stack = stock.createItemStack(); - stack.setCount(1); - drawItemStack(stack, stackX + DISPLAY_X_OFFSET, stackY, null); - String amountStr = TextFormattingUtil.formatLongToCompactString(stock.getStackSize(), 4); - drawStringFixedCorner(amountStr, stackX + DISPLAY_X_OFFSET + 17, stackY + 17, 16777215, true, 0.5f); - } - if (mouseOverConfig(mouseX, mouseY)) { - drawSelectionOverlay(stackX, stackY, 16, 16); - } else if (mouseOverStock(mouseX, mouseY)) { - drawSelectionOverlay(stackX + DISPLAY_X_OFFSET, stackY, 16, 16); - } - } - - private void drawSlots(boolean autoPull, int x, int y) { - if (autoPull) { - GuiTextures.SLOT_DARK.draw(x, y, 18, 18); - GuiTextures.CONFIG_ARROW.draw(x, y, 18, 18); - } else { - GuiTextures.SLOT.draw(x, y, 18, 18); - GuiTextures.CONFIG_ARROW_DARK.draw(x, y, 18, 18); - } - GuiTextures.SLOT_DARK.draw(x + DISPLAY_X_OFFSET, y, 18, 18); - } - - @Override - public void drawInForeground(int mouseX, int mouseY) { - super.drawInForeground(mouseX, mouseY); - IAEItemStack item = null; - IConfigurableSlot slot = this.getParentWidget().getDisplay(this.index); - if (mouseOverConfig(mouseX, mouseY)) { - item = slot.getConfig(); - } else if (mouseOverStock(mouseX, mouseY)) { - item = slot.getStock(); - } - if (item != null) { - drawHoveringText(item.createItemStack(), getItemToolTip(item.createItemStack()), -1, mouseX, mouseY); - } - } - - @Override - protected void addHoverText(List hoverText) { - if (getParentWidget().isAutoPull()) { - hoverText.add(I18n.format("gregtech.gui.config_slot")); - hoverText.add(I18n.format("gregtech.gui.config_slot.auto_pull_managed")); - } else { - super.addHoverText(hoverText); - } - } - - @Override - public boolean mouseClicked(int mouseX, int mouseY, int button) { - AEItemConfigWidget pw = getParentWidget(); - // don't allow manual interaction with config slots when auto pull is enabled - if (pw.isAutoPull()) { - return false; - } - - if (mouseOverConfig(mouseX, mouseY)) { - if (button == 1) { - // Right click to clear - writeClientAction(REMOVE_ID, buf -> {}); - - if (!pw.isStocking()) { - pw.disableAmount(); - } - } else if (button == 0) { - // Left click to set/select - ItemStack item = this.gui.entityPlayer.inventory.getItemStack(); - - if (!item.isEmpty()) { - writeClientAction(UPDATE_ID, buf -> buf.writeItemStack(item)); - return true; - } - - if (!pw.isStocking()) { - pw.enableAmount(this.index); - this.select = true; - } - } - return true; - } - return false; - } - - @Override - public void handleClientAction(int id, PacketBuffer buffer) { - super.handleClientAction(id, buffer); - IConfigurableSlot slot = this.parentWidget.getConfig(this.index); - if (id == REMOVE_ID) { - slot.setConfig(null); - this.parentWidget.disableAmount(); - writeUpdateInfo(REMOVE_ID, buf -> {}); - } - if (id == UPDATE_ID) { - try { - ItemStack item = buffer.readItemStack(); - if (!isItemValidForSlot(item)) return; - slot.setConfig(WrappedItemStack.fromItemStack(item)); - this.parentWidget.enableAmount(this.index); - if (!item.isEmpty()) { - writeUpdateInfo(UPDATE_ID, buf -> buf.writeItemStack(item)); - } - } catch (IOException ignored) {} - } - if (id == AMOUNT_CHANGE_ID) { - if (slot.getConfig() != null) { - int amt = buffer.readInt(); - slot.getConfig().setStackSize(amt); - writeUpdateInfo(AMOUNT_CHANGE_ID, buf -> buf.writeInt(amt)); - } - } - } - - @Override - public void readUpdateInfo(int id, PacketBuffer buffer) { - super.readUpdateInfo(id, buffer); - IConfigurableSlot slot = this.parentWidget.getDisplay(this.index); - if (id == REMOVE_ID) { - slot.setConfig(null); - } - if (id == UPDATE_ID) { - try { - ItemStack item = buffer.readItemStack(); - slot.setConfig(WrappedItemStack.fromItemStack(item)); - } catch (IOException ignored) {} - } - if (id == AMOUNT_CHANGE_ID) { - if (slot.getConfig() != null) { - int amt = buffer.readInt(); - slot.getConfig().setStackSize(amt); - } - } - } - - // Method for server-side validation of an attempted new configured item - private boolean isItemValidForSlot(ItemStack stack) { - if (stack == null || stack.isEmpty()) return true; - AEItemConfigWidget pw = getParentWidget(); - if (!pw.isStocking()) return true; - return !pw.hasStackInConfig(stack); - } - - @Override - public List> getPhantomTargets(Object ingredient) { - if (!(ingredient instanceof ItemStack)) { - return Collections.emptyList(); - } - Rectangle rectangle = toRectangleBox(); - rectangle.width /= 6; - return Lists.newArrayList(new IGhostIngredientHandler.Target<>() { - - @NotNull - @Override - public Rectangle getArea() { - return rectangle; - } - - @Override - public void accept(@NotNull Object ingredient) { - if (ingredient instanceof ItemStack) { - writeClientAction(UPDATE_ID, buf -> buf.writeItemStack((ItemStack) ingredient)); - } - } - }); - } - - @SideOnly(Side.CLIENT) - public boolean mouseWheelMove(int mouseX, int mouseY, int wheelDelta) { - // Only allow the amount scrolling if not stocking, as amount is useless for stocking - if (parentWidget.isStocking()) return false; - IConfigurableSlot slot = this.parentWidget.getDisplay(this.index); - Rectangle rectangle = toRectangleBox(); - rectangle.width /= 6; - if (slot.getConfig() == null || wheelDelta == 0 || !rectangle.contains(mouseX, mouseY)) { - return false; - } - ItemStack stack = slot.getConfig().createItemStack(); - long amt; - if (isCtrlDown()) { - amt = wheelDelta > 0 ? stack.getCount() * 2L : stack.getCount() / 2L; - } else { - amt = wheelDelta > 0 ? stack.getCount() + 1L : stack.getCount() - 1L; - } - if (amt > 0 && amt < Integer.MAX_VALUE + 1L) { - int finalAmt = (int) amt; - writeClientAction(AMOUNT_CHANGE_ID, buf -> buf.writeInt(finalAmt)); - return true; - } - return false; - } -} diff --git a/src/main/java/gregtech/common/gui/widget/appeng/slot/AmountSetSlot.java b/src/main/java/gregtech/common/gui/widget/appeng/slot/AmountSetSlot.java deleted file mode 100644 index 35063d5638b..00000000000 --- a/src/main/java/gregtech/common/gui/widget/appeng/slot/AmountSetSlot.java +++ /dev/null @@ -1,86 +0,0 @@ -package gregtech.common.gui.widget.appeng.slot; - -import gregtech.api.gui.GuiTextures; -import gregtech.api.gui.IRenderContext; -import gregtech.api.gui.Widget; -import gregtech.api.gui.widgets.TextFieldWidget2; -import gregtech.api.util.Position; -import gregtech.common.gui.widget.appeng.AEConfigWidget; -import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.IConfigurableSlot; - -import net.minecraft.network.PacketBuffer; - -import appeng.api.storage.data.IAEStack; - -/** - * @Author GlodBlock - * @Description The amount set widget for config slot - * @Date 2023/4/21-21:20 - */ -public class AmountSetSlot> extends Widget { - - private int index = -1; - private final TextFieldWidget2 amountText; - private final AEConfigWidget parentWidget; - - public AmountSetSlot(int x, int y, AEConfigWidget widget) { - super(x, y, 80, 30); - this.parentWidget = widget; - this.amountText = new TextFieldWidget2(x + 3, y + 14, 60, 15, this::getAmountStr, this::setNewAmount) - .setNumbersOnly(0, Integer.MAX_VALUE) - .setMaxLength(10); - } - - public void setSlotIndex(int slotIndex) { - this.index = slotIndex; - writeClientAction(0, buf -> buf.writeVarInt(this.index)); - } - - public TextFieldWidget2 getText() { - return this.amountText; - } - - public String getAmountStr() { - if (this.index < 0) { - return "0"; - } - IConfigurableSlot slot = this.parentWidget.getConfig(this.index); - if (slot.getConfig() != null) { - return String.valueOf(slot.getConfig().getStackSize()); - } - return "0"; - } - - public void setNewAmount(String amount) { - try { - long newAmount = Long.parseLong(amount); - writeClientAction(1, buf -> buf.writeVarLong(newAmount)); - } catch (NumberFormatException ignore) {} - } - - @Override - public void handleClientAction(int id, PacketBuffer buffer) { - super.handleClientAction(id, buffer); - if (id == 0) { - this.index = buffer.readVarInt(); - } else if (id == 1) { - if (this.index < 0) { - return; - } - IConfigurableSlot slot = this.parentWidget.getConfig(this.index); - long newAmt = buffer.readVarLong(); - if (newAmt > 0 && slot.getConfig() != null) { - slot.getConfig().setStackSize(newAmt); - } - } - } - - @Override - public void drawInBackground(int mouseX, int mouseY, float partialTicks, IRenderContext context) { - super.drawInBackground(mouseX, mouseY, partialTicks, context); - Position position = getPosition(); - GuiTextures.BACKGROUND.draw(position.x, position.y, 80, 30); - drawStringSized("Amount", position.x + 3, position.y + 3, 0x404040, false, 1f, false); - GuiTextures.DISPLAY.draw(position.x + 3, position.y + 11, 65, 14); - } -} From 765f255b62040ff912e4bf7ed560799ce04c372d Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Fri, 6 Jun 2025 17:27:42 -0400 Subject: [PATCH 080/136] Improve JEIUtil and collapse methods. Separate ghost circuit items out. --- .../gregtech/api/items/metaitem/MetaItem.java | 2 +- .../mui/sync/appeng/AEFluidSyncHandler.java | 13 +- .../mui/sync/appeng/AEItemSyncHandler.java | 32 ++-- .../ingredients/IntCircuitIngredient.java | 3 +- .../java/gregtech/api/util/GTUtility.java | 34 +++- src/main/java/gregtech/api/util/JEIUtil.java | 156 +++++++++++------- .../appeng/MetaTileEntityMEInputBus.java | 3 +- 7 files changed, 151 insertions(+), 92 deletions(-) diff --git a/src/main/java/gregtech/api/items/metaitem/MetaItem.java b/src/main/java/gregtech/api/items/metaitem/MetaItem.java index 52b94672421..0957de3996d 100644 --- a/src/main/java/gregtech/api/items/metaitem/MetaItem.java +++ b/src/main/java/gregtech/api/items/metaitem/MetaItem.java @@ -1011,7 +1011,7 @@ public ItemStack getStackForm(int amount) { return new ItemStack(MetaItem.this, amount, metaItemOffset + metaValue); } - public boolean isItemEqual(ItemStack itemStack) { + public boolean isItemEqual(@NotNull ItemStack itemStack) { return itemStack.getItem() == MetaItem.this && itemStack.getItemDamage() == (metaItemOffset + metaValue); } diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java index a0bec7a99d7..e34a015c197 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java @@ -13,6 +13,7 @@ import appeng.api.storage.data.IAEFluidStack; import com.cleanroommc.modularui.utils.serialization.IByteBufAdapter; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import mezz.jei.api.gui.IRecipeLayout; import mezz.jei.api.recipe.transfer.IRecipeTransferError; import org.jetbrains.annotations.NotNull; @@ -23,7 +24,7 @@ public class AEFluidSyncHandler extends AESyncHandler { - private final ExportOnlyAEFluidList fluidList; + protected final ExportOnlyAEFluidList fluidList; public AEFluidSyncHandler(ExportOnlyAEFluidList fluidList, @Nullable Runnable dirtyNotifier) { super(fluidList.getInventory(), fluidList.isStocking(), dirtyNotifier); @@ -57,13 +58,9 @@ public IRecipeTransferError receiveRecipe(@NotNull IRecipeLayout recipeLayout, b boolean simulate) { if (simulate) return null; - List originalFluidStacks = JEIUtil.getDisplayedInputFluidStacks(recipeLayout.getFluidStacks()); - List fluidInputs = new ArrayList<>(originalFluidStacks.size()); - originalFluidStacks.forEach(stack -> { - if (stack != null) { - fluidInputs.add(stack.copy()); - } - }); + Int2ObjectMap originalFluidInputs = JEIUtil + .getDisplayedInputFluidStacks(recipeLayout.getFluidStacks(), false, true); + List fluidInputs = new ArrayList<>(originalFluidInputs.values()); GTUtility.collapseFluidList(fluidInputs); for (int index = 0; index < slots.length; index++) { diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java index e337819a6d0..fca74fb8e1c 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java @@ -1,5 +1,7 @@ package gregtech.api.mui.sync.appeng; +import gregtech.api.capability.impl.GhostCircuitItemStackHandler; +import gregtech.api.recipes.ingredients.IntCircuitIngredient; import gregtech.api.util.GTUtility; import gregtech.api.util.JEIUtil; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEItemList; @@ -13,6 +15,7 @@ import appeng.api.storage.data.IAEItemStack; import com.cleanroommc.modularui.utils.serialization.IByteBufAdapter; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import mezz.jei.api.gui.IRecipeLayout; import mezz.jei.api.recipe.transfer.IRecipeTransferError; import org.jetbrains.annotations.NotNull; @@ -23,11 +26,14 @@ public class AEItemSyncHandler extends AESyncHandler { - private final ExportOnlyAEItemList itemList; + protected final ExportOnlyAEItemList itemList; + protected final GhostCircuitItemStackHandler ghostCircuitHandler; - public AEItemSyncHandler(ExportOnlyAEItemList itemList, @Nullable Runnable dirtyNotifier) { + public AEItemSyncHandler(ExportOnlyAEItemList itemList, @Nullable Runnable dirtyNotifier, + @NotNull GhostCircuitItemStackHandler ghostCircuitHandler) { super(itemList.getInventory(), itemList.isStocking(), dirtyNotifier); this.itemList = itemList; + this.ghostCircuitHandler = ghostCircuitHandler; } @Override @@ -57,19 +63,21 @@ public IRecipeTransferError receiveRecipe(@NotNull IRecipeLayout recipeLayout, b boolean simulate) { if (simulate) return null; - List originalItemInputs = JEIUtil.getDisplayedInputItemStacks(recipeLayout.getItemStacks()); - List itemInputs = new ArrayList<>(originalItemInputs.size()); - originalItemInputs.forEach(stack -> { - if (!stack.isEmpty()) { - itemInputs.add(stack.copy()); - } - }); + Int2ObjectMap originalItemInputs = JEIUtil.getDisplayedInputItemStacks(recipeLayout.getItemStacks(), + false, true); + List itemInputs = new ArrayList<>(originalItemInputs.values()); GTUtility.collapseItemList(itemInputs); + int circuitValue = GhostCircuitItemStackHandler.NO_CONFIG; for (int index = 0; index < slots.length; index++) { ItemStack stackToSet = index >= itemInputs.size() ? null : itemInputs.get(index); - setConfig(index, stackToSet); + if (IntCircuitIngredient.isIntegratedCircuit(stackToSet)) { + circuitValue = IntCircuitIngredient.getCircuitConfiguration(stackToSet); + } else { + setConfig(index, stackToSet); + } } + setGhostCircuit(circuitValue); return null; } @@ -78,4 +86,8 @@ public IRecipeTransferError receiveRecipe(@NotNull IRecipeLayout recipeLayout, b public void setConfig(int index, @Nullable ItemStack stack) { setConfig(index, WrappedItemStack.fromItemStack(stack)); } + + protected void setGhostCircuit(int circuitValue) { + ghostCircuitHandler.setCircuitValue(circuitValue); + } } diff --git a/src/main/java/gregtech/api/recipes/ingredients/IntCircuitIngredient.java b/src/main/java/gregtech/api/recipes/ingredients/IntCircuitIngredient.java index ee259cf24f1..f9dab92efcd 100644 --- a/src/main/java/gregtech/api/recipes/ingredients/IntCircuitIngredient.java +++ b/src/main/java/gregtech/api/recipes/ingredients/IntCircuitIngredient.java @@ -144,7 +144,8 @@ public static int getCircuitConfiguration(ItemStack itemStack) { return 0; } - public static boolean isIntegratedCircuit(ItemStack itemStack) { + public static boolean isIntegratedCircuit(@Nullable ItemStack itemStack) { + if (itemStack == null) return false; boolean isCircuit = MetaItems.INTEGRATED_CIRCUIT.isItemEqual(itemStack); if (isCircuit && !itemStack.hasTagCompound()) { NBTTagCompound compound = new NBTTagCompound(); diff --git a/src/main/java/gregtech/api/util/GTUtility.java b/src/main/java/gregtech/api/util/GTUtility.java index c4cbdce70b5..29907c4c8c0 100644 --- a/src/main/java/gregtech/api/util/GTUtility.java +++ b/src/main/java/gregtech/api/util/GTUtility.java @@ -988,13 +988,16 @@ public static int combineRGB(@Range(from = 0, to = 255) int r, @Range(from = 0, /** * Attempts to collapse a {@link List} of {@link ItemStack}s by combining similar stacks downwards (towards index * 0).
- * WARNING: Mutates original item stacks, you might want to make a new list with copies! + * WARNING: Mutates original item stacks and list, you might want to make a new list with copies! * * @param stacks the list to collapse * @param maxStackSize the max stack size of the to-be combined stack + * @param removeEmpty if true, will remove entries from the list if they're empty after collapsing */ public static void collapseItemList(@NotNull List stacks, - @Range(from = 1, to = Integer.MAX_VALUE) int maxStackSize) { + @Range(from = 1, to = Integer.MAX_VALUE) int maxStackSize, + boolean removeEmpty) { + stacks.removeIf(Objects::isNull); Hash.Strategy stackStrategy = ItemStackHashStrategy.comparingAllButCount(); for (int checkingSlot = 0; checkingSlot < stacks.size(); checkingSlot++) { @@ -1017,26 +1020,34 @@ public static void collapseItemList(@NotNull List stacks, } } } + + if (removeEmpty) { + stacks.removeIf(ItemStack::isEmpty); + } } /** - * The same as {@link #collapseItemList(List, int)} but has a stack size limit of {@link Integer#MAX_VALUE}
+ * The same as {@link #collapseItemList(List, int, boolean)} but has a stack size limit of {@link Integer#MAX_VALUE} + * and removes empty stacks.
* WARNING: Mutates original item stacks, you might want to make a new list with copies! */ public static void collapseItemList(List stacks) { - collapseItemList(stacks, Integer.MAX_VALUE); + collapseItemList(stacks, Integer.MAX_VALUE, true); } /** * Attempts to collapse a {@link List} of {@link FluidStack}s by combining similar stacks downwards (towards index * 0).
- * WARNING: Mutates original fluid stacks, you might want to make a new list with copies! + * WARNING: Mutates original fluid stacks and list, you might want to make a new list with copies! * * @param stacks the list to collapse * @param maxStackSize the max stack size of the to-be combined stack + * @param removeEmpty if true, will remove entries from the list if they're empty after collapsing */ public static void collapseFluidList(@NotNull List stacks, - @Range(from = 1, to = Integer.MAX_VALUE) int maxStackSize) { + @Range(from = 1, to = Integer.MAX_VALUE) int maxStackSize, + boolean removeEmpty) { + stacks.removeIf(Objects::isNull); // TODO: replace with FluidStackHashStrategy once the MUI2 Multi PR merges Hash.Strategy stackStrategy = new Hash.Strategy<>() { @@ -1051,7 +1062,7 @@ public boolean equals(FluidStack a, FluidStack b) { if (a == null) return b == null; if (b == null) return false; - return a.getFluid() == b.getFluid() && a.tag.equals(b.tag); + return a.getFluid() == b.getFluid() && Objects.equals(a.tag, b.tag); } }; @@ -1075,13 +1086,18 @@ public boolean equals(FluidStack a, FluidStack b) { } } } + + if (removeEmpty) { + stacks.removeIf(stack -> stack.amount < 1); + } } /** - * The same as {@link #collapseFluidList(List, int)} but has a stack size limit of {@link Integer#MAX_VALUE}
+ * The same as {@link #collapseFluidList(List, int, boolean)} but has a stack size limit of + * {@link Integer#MAX_VALUE} and removes empty stacks.
* WARNING: Mutates original fluid stacks, you might want to make a new list with copies! */ public static void collapseFluidList(List stacks) { - collapseFluidList(stacks, Integer.MAX_VALUE); + collapseFluidList(stacks, Integer.MAX_VALUE, true); } } diff --git a/src/main/java/gregtech/api/util/JEIUtil.java b/src/main/java/gregtech/api/util/JEIUtil.java index 7141cfa66d8..591f8e3e9e5 100644 --- a/src/main/java/gregtech/api/util/JEIUtil.java +++ b/src/main/java/gregtech/api/util/JEIUtil.java @@ -5,105 +5,137 @@ import net.minecraft.item.ItemStack; import net.minecraftforge.fluids.FluidStack; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectMaps; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import mezz.jei.api.gui.IGuiFluidStackGroup; +import mezz.jei.api.gui.IGuiIngredientGroup; import mezz.jei.api.gui.IGuiItemStackGroup; import org.jetbrains.annotations.NotNull; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; import java.util.Set; public class JEIUtil { /** - * Collects all the item stacks from the input slots of a {@link IGuiItemStackGroup}. Empty slots will be set as - * {@link ItemStack#EMPTY}. - * - * @param stackGroup the group to collect {@link ItemStack}s from - * @return the list of collected item stacks + * Collects all the item stacks from the input slots of a {@link IGuiItemStackGroup}. + * + * @param stackGroup the group to collect {@link ItemStack}s from + * @param getEmptySlots if true, empty slots will be entered into the map as {@link ItemStack#EMPTY} + * @return a map of collected item stacks to their slot index */ - public static @NotNull List getDisplayedInputItemStacks(@NotNull IGuiItemStackGroup stackGroup) { - var stackMap = stackGroup.getGuiIngredients(); - Set inputIndexes = ((GuiIngredientGroupAccessor) stackGroup).getInputSlotIndexes(); - if (inputIndexes.isEmpty()) return Collections.emptyList(); - - List itemStacks = new ArrayList<>(inputIndexes.size()); - for (var index : stackMap.keySet()) { + public static @NotNull Int2ObjectMap getDisplayedInputItemStacks(@NotNull IGuiItemStackGroup stackGroup, + boolean getEmptySlots, + boolean copyStacks) { + var originalMap = stackGroup.getGuiIngredients(); + Set inputIndexes = getInputIndexes(stackGroup); + if (inputIndexes.isEmpty()) return Int2ObjectMaps.emptyMap(); + + Int2ObjectMap stackMap = new Int2ObjectOpenHashMap<>(inputIndexes.size()); + for (var index : originalMap.keySet()) { if (inputIndexes.contains(index)) { - ItemStack displayStack = stackMap.get(index).getDisplayedIngredient(); - itemStacks.add(displayStack == null ? ItemStack.EMPTY : displayStack); + ItemStack displayStack = originalMap.get(index).getDisplayedIngredient(); + if (displayStack == null && getEmptySlots) { + stackMap.put(index, ItemStack.EMPTY); + } else if (displayStack != null && !displayStack.isEmpty()) { + stackMap.put(index, copyStacks ? displayStack.copy() : displayStack); + } } } - return itemStacks; + return stackMap; } /** - * Collects all the item stacks from the output slots of a {@link IGuiItemStackGroup}. Empty slots will be set as - * {@link ItemStack#EMPTY}. - * - * @param stackGroup the group to collect {@link ItemStack}s from - * @return the list of collected item stacks + * Collects all the item stacks from the input slots of a {@link IGuiItemStackGroup}. + * + * @param stackGroup the group to collect {@link ItemStack}s from + * @param getEmptySlots if true, empty slots will be entered into the map as {@link ItemStack#EMPTY} + * @return a map of collected item stacks to their slot index */ - public static @NotNull List getDisplayedOutputItemStacks(@NotNull IGuiItemStackGroup stackGroup) { - var stackMap = stackGroup.getGuiIngredients(); - Set inputIndexes = ((GuiIngredientGroupAccessor) stackGroup).getInputSlotIndexes(); - int outputCount = stackMap.size() - inputIndexes.size(); - if (outputCount < 1) return Collections.emptyList(); - - List itemStacks = new ArrayList<>(outputCount); - for (var index : stackMap.keySet()) { + public static @NotNull Int2ObjectMap getDisplayedOutputItemStacks(@NotNull IGuiItemStackGroup stackGroup, + boolean getEmptySlots, + boolean copyStacks) { + var originalMap = stackGroup.getGuiIngredients(); + Set inputIndexes = getInputIndexes(stackGroup); + int outputCount = originalMap.size() - inputIndexes.size(); + if (outputCount < 1) return Int2ObjectMaps.emptyMap(); + + Int2ObjectMap stackMap = new Int2ObjectOpenHashMap<>(outputCount); + for (var index : originalMap.keySet()) { if (!inputIndexes.contains(index)) { - itemStacks.add(stackMap.get(index).getDisplayedIngredient()); + ItemStack displayStack = originalMap.get(index).getDisplayedIngredient(); + if (displayStack == null && getEmptySlots) { + stackMap.put(index, ItemStack.EMPTY); + } else if (displayStack != null && !displayStack.isEmpty()) { + stackMap.put(index, copyStacks ? displayStack.copy() : displayStack); + } } } - return itemStacks; + return stackMap; } /** - * Collects all the fluid stacks from the input slots of a {@link IGuiFluidStackGroup}. Empty slots will be set as - * null. - * - * @param stackGroup the group to collect {@link FluidStack}s from - * @return the list of collected fluid stacks + * Collects all the fluid stacks from the input slots of a {@link IGuiFluidStackGroup}. + * + * @param stackGroup the group to collect {@link FluidStack}s from + * @param getEmptySlots if true, empty slots will be entered into the map as null + * @return a map of collected fluid stacks */ - public static @NotNull List getDisplayedInputFluidStacks(@NotNull IGuiFluidStackGroup stackGroup) { - var stackMap = stackGroup.getGuiIngredients(); - Set inputIndexes = ((GuiIngredientGroupAccessor) stackGroup).getInputSlotIndexes(); - if (inputIndexes.isEmpty()) return Collections.emptyList(); - - List fluidStacks = new ArrayList<>(inputIndexes.size()); - for (var index : stackMap.keySet()) { + public static @NotNull Int2ObjectMap getDisplayedInputFluidStacks(@NotNull IGuiFluidStackGroup stackGroup, + boolean getEmptySlots, + boolean copyStacks) { + var originalMap = stackGroup.getGuiIngredients(); + Set inputIndexes = getInputIndexes(stackGroup); + if (inputIndexes.isEmpty()) return Int2ObjectMaps.emptyMap(); + + Int2ObjectMap stackMap = new Int2ObjectOpenHashMap<>(inputIndexes.size()); + for (var index : originalMap.keySet()) { if (inputIndexes.contains(index)) { - fluidStacks.add(stackMap.get(index).getDisplayedIngredient()); + FluidStack displayStack = originalMap.get(index).getDisplayedIngredient(); + if (displayStack == null && getEmptySlots) { + stackMap.put(index, null); + } else if (displayStack != null) { + stackMap.put(index, copyStacks ? displayStack.copy() : displayStack); + } } } - return fluidStacks; + return stackMap; } /** - * Collects all the fluid stacks from the output slots of a {@link IGuiFluidStackGroup}. Empty slots will be set as - * null. - * - * @param stackGroup the group to collect {@link FluidStack}s from - * @return the list of collected fluid stacks + * Collects all the fluid stacks from the output slots of a {@link IGuiFluidStackGroup}. + * + * @param stackGroup the group to collect {@link FluidStack}s from + * @param getEmptySlots if true, empty slots will be entered into the map as null + * @return a map of collected fluid stacks */ - public static @NotNull List getDisplayedOutputFluidStacks(@NotNull IGuiFluidStackGroup stackGroup) { - var stackMap = stackGroup.getGuiIngredients(); - Set inputIndexes = ((GuiIngredientGroupAccessor) stackGroup).getInputSlotIndexes(); - int outputCount = stackMap.size() - inputIndexes.size(); - if (outputCount < 1) return Collections.emptyList(); - - List fluidStacks = new ArrayList<>(outputCount); - for (var index : stackMap.keySet()) { + public static @NotNull Int2ObjectMap getDisplayedOutputFluidStacks(@NotNull IGuiFluidStackGroup stackGroup, + boolean getEmptySlots, + boolean copyStacks) { + var originalMap = stackGroup.getGuiIngredients(); + Set inputIndexes = getInputIndexes(stackGroup); + int outputCount = originalMap.size() - inputIndexes.size(); + if (outputCount < 1) return Int2ObjectMaps.emptyMap(); + + Int2ObjectMap stackMap = new Int2ObjectOpenHashMap<>(outputCount); + for (var index : originalMap.keySet()) { if (!inputIndexes.contains(index)) { - fluidStacks.add(stackMap.get(index).getDisplayedIngredient()); + FluidStack displayStack = originalMap.get(index).getDisplayedIngredient(); + if (displayStack == null && getEmptySlots) { + stackMap.put(index, null); + } else if (displayStack != null) { + stackMap.put(index, copyStacks ? displayStack.copy() : displayStack); + } } } - return fluidStacks; + return stackMap; + } + + private static Set getInputIndexes(IGuiIngredientGroup ingredientGroup) { + return ((GuiIngredientGroupAccessor) ingredientGroup).getInputSlotIndexes(); } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java index 8cae10e7d4b..60a40fa073f 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java @@ -219,7 +219,8 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) guiSyncManager.registerSlotGroup("extra_slot", 1); final String syncHandlerName = "aeSync"; - guiSyncManager.syncValue(syncHandlerName, new AEItemSyncHandler(getAEItemHandler(), this::markDirty)); + guiSyncManager.syncValue(syncHandlerName, + new AEItemSyncHandler(getAEItemHandler(), this::markDirty, circuitInventory)); Grid configGrid = new Grid() .pos(7, 25) From ad31cc74b25bb17b79b01000f4ab74287f0048cd Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Fri, 6 Jun 2025 17:44:31 -0400 Subject: [PATCH 081/136] Slightly more efficient config setting from recipe transfer --- .../mui/sync/appeng/AEFluidSyncHandler.java | 8 +++++--- .../mui/sync/appeng/AEItemSyncHandler.java | 20 +++++++++++++------ .../api/mui/sync/appeng/AESyncHandler.java | 14 ++++++++++++- 3 files changed, 32 insertions(+), 10 deletions(-) diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java index e34a015c197..d097b62ef57 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java @@ -63,10 +63,12 @@ public IRecipeTransferError receiveRecipe(@NotNull IRecipeLayout recipeLayout, b List fluidInputs = new ArrayList<>(originalFluidInputs.values()); GTUtility.collapseFluidList(fluidInputs); - for (int index = 0; index < slots.length; index++) { - FluidStack stackToSet = index >= fluidInputs.size() ? null : fluidInputs.get(index); - setConfig(index, stackToSet); + int lastSlotIndex; + for (lastSlotIndex = 0; lastSlotIndex < fluidInputs.size(); lastSlotIndex++) { + FluidStack newConfig = fluidInputs.get(lastSlotIndex); + setConfig(lastSlotIndex, newConfig); } + clearConfigFrom(lastSlotIndex); return null; } diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java index fca74fb8e1c..bf29dbf6659 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java @@ -22,6 +22,7 @@ import org.jetbrains.annotations.Nullable; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; public class AEItemSyncHandler extends AESyncHandler { @@ -69,16 +70,23 @@ public IRecipeTransferError receiveRecipe(@NotNull IRecipeLayout recipeLayout, b GTUtility.collapseItemList(itemInputs); int circuitValue = GhostCircuitItemStackHandler.NO_CONFIG; - for (int index = 0; index < slots.length; index++) { - ItemStack stackToSet = index >= itemInputs.size() ? null : itemInputs.get(index); - if (IntCircuitIngredient.isIntegratedCircuit(stackToSet)) { - circuitValue = IntCircuitIngredient.getCircuitConfiguration(stackToSet); - } else { - setConfig(index, stackToSet); + Iterator inputsIterator = itemInputs.iterator(); + while (inputsIterator.hasNext()) { + ItemStack stack = inputsIterator.next(); + if (IntCircuitIngredient.isIntegratedCircuit(stack)) { + inputsIterator.remove(); + circuitValue = IntCircuitIngredient.getCircuitConfiguration(stack); } } setGhostCircuit(circuitValue); + int lastSlotIndex; + for (lastSlotIndex = 0; lastSlotIndex < itemInputs.size(); lastSlotIndex++) { + ItemStack newConfig = itemInputs.get(lastSlotIndex); + setConfig(lastSlotIndex, newConfig); + } + clearConfigFrom(lastSlotIndex); + return null; } diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java index 23a3d2b635a..aebabebb35c 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java @@ -23,7 +23,8 @@ public abstract class AESyncHandler> extends SyncHandler i public static final int slotSyncID = 0; public static final int setConfigID = 1; public static final int clearConfigID = 2; - public static final int changeConfigAmountID = 3; + public static final int bulkClearConfigID = 3; + public static final int changeConfigAmountID = 4; protected final boolean isStocking; protected final IConfigurableSlot[] slots; @@ -116,6 +117,12 @@ public void readOnServer(int id, PacketBuffer buf) throws IOException { IConfigurableSlot slot = slots[index]; slot.setConfig(newConfig); } + } else if (id == bulkClearConfigID) { + int indexFrom = buf.readVarInt(); + for (int index = indexFrom; index < slots.length; index++) { + IConfigurableSlot slot = slots[index]; + slot.setConfig(null); + } } } @@ -147,6 +154,11 @@ public void clearConfig(int index) { syncToServer(clearConfigID, buf -> buf.writeVarInt(index)); } + @SideOnly(Side.CLIENT) + public void clearConfigFrom(int startingIndex) { + syncToServer(bulkClearConfigID, buf -> buf.writeVarInt(startingIndex)); + } + @SideOnly(Side.CLIENT) public void setConfig(int index, @Nullable T newConfig) { if (newConfig == null) { From 1d9f1b514863e7ae319376f794ef3bf0f985bc7a Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Wed, 11 Jun 2025 11:17:11 -0400 Subject: [PATCH 082/136] Remove duplicate call and redundant method --- .../gregtech/api/mui/sync/appeng/AESyncHandler.java | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java index aebabebb35c..4b4042233c1 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java @@ -64,9 +64,9 @@ public void detectAndSendChanges(boolean init) { if (init || !areAEStackCountEquals(newConfig, cachedConfig) || !areAEStackCountEquals(newStock, cachedStock)) { - cached[index] = slot.copy(); - changeMap.put(index, slot.copy()); - notifyChange(); + IConfigurableSlot newCache = slot.copy(); + cached[index] = newCache; + changeMap.put(index, newCache); } } @@ -97,6 +97,7 @@ public void detectAndSendChanges(boolean init) { if (dirtyNotifier != null) { dirtyNotifier.run(); } + changeMap.clear(); } } @@ -202,12 +203,6 @@ public T getStock(int index) { return slots[index].getStock(); } - protected void notifyChange() { - if (dirtyNotifier != null) { - dirtyNotifier.run(); - } - } - @SuppressWarnings("BooleanMethodIsAlwaysInverted") public final boolean areAEStackCountEquals(T stack1, T stack2) { if (stack2 == stack1) { From 55b574c4c97f65d942055b44e853f716acb16ec6 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Wed, 11 Jun 2025 11:21:07 -0400 Subject: [PATCH 083/136] use hasconfig --- src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java index 176b92fc0a2..9f01486f9a9 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java @@ -130,7 +130,7 @@ public int getSlotHoverColor() { @Override public boolean onMouseScroll(ModularScreen.UpOrDown scrollDirection, int scrollAmount) { - if (getSyncHandler().getConfig(index) == null || isStocking) return false; + if (getSyncHandler().hasConfig(index) || isStocking) return false; long newStackSize = getSyncHandler().getConfigAmount(index); From 1b7140f5374740182cb6004fd5d841bcd1214deb Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Wed, 11 Jun 2025 11:29:05 -0400 Subject: [PATCH 084/136] Reduce copying and use override convenience method --- .../api/mui/widget/appeng/fluid/AEFluidConfigSlot.java | 4 ++-- .../api/mui/widget/appeng/fluid/AEFluidDisplaySlot.java | 2 +- .../api/mui/widget/appeng/item/AEItemConfigSlot.java | 5 ++--- .../api/mui/widget/appeng/item/AEItemDisplaySlot.java | 2 +- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java index 950515b0314..27f5be037d1 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java @@ -65,7 +65,7 @@ public boolean isValidSyncHandler(SyncHandler syncHandler) { public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { IAEFluidStack config = getSyncHandler().getConfig(index); if (config != null) { - FluidStack stack = config.getFluidStack(); + FluidStack stack = ((WrappedFluidStack) config).getDelegate(); RenderUtil.drawFluidForGui(stack, stack.amount, 1, 1, 17, 17); if (!isStocking) { @@ -98,7 +98,7 @@ public void drawOverlay(ModularGuiContext context, WidgetTheme widgetTheme) { FluidStack heldFluid = FluidUtil.getFluidContained(heldItem); if (heldFluid != null) { - getSyncHandler().setConfig(index, WrappedFluidStack.fromFluidStack(heldFluid)); + getSyncHandler().setConfig(index, heldFluid); return Result.SUCCESS; } } diff --git a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidDisplaySlot.java b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidDisplaySlot.java index a17edc1ceba..4941233d969 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidDisplaySlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidDisplaySlot.java @@ -46,7 +46,7 @@ public boolean isValidSyncHandler(SyncHandler syncHandler) { public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { IAEFluidStack stock = getSyncHandler().getStock(index); if (stock != null) { - FluidStack stack = stock.getFluidStack(); + FluidStack stack = ((WrappedFluidStack) stock).getDelegate(); RenderUtil.drawFluidForGui(stack, stack.amount, 1, 1, 17, 17); String amount = TextFormattingUtil.formatLongToCompactString(stack.amount, 4); diff --git a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java index 1e8c0f71e22..5b352064504 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java @@ -60,7 +60,7 @@ public boolean isValidSyncHandler(SyncHandler syncHandler) { public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { IAEItemStack config = getSyncHandler().getConfig(index); if (config != null) { - ItemStack stack = config.createItemStack(); + ItemStack stack = config.createItemStack(); // have to copy the stack here since the count is set to 1 if (!stack.isEmpty()) { stack.setCount(1); RenderUtil.renderItem(stack, 1, 1, 16f, 16f); @@ -92,11 +92,10 @@ public void drawOverlay(ModularGuiContext context, WidgetTheme widgetTheme) { if (isAutoPull.getAsBoolean()) return Result.IGNORE; if (mouseButton == 0) { - // Left click to set item/change amount ItemStack heldItem = getSyncHandler().getSyncManager().getCursorItem(); if (!heldItem.isEmpty()) { - getSyncHandler().setConfig(index, WrappedItemStack.fromItemStack(heldItem)); + getSyncHandler().setConfig(index, heldItem); return Result.SUCCESS; } } diff --git a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemDisplaySlot.java b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemDisplaySlot.java index 4a39412861c..2c8b1940858 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemDisplaySlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemDisplaySlot.java @@ -44,7 +44,7 @@ public boolean isValidSyncHandler(SyncHandler syncHandler) { public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { IAEItemStack stock = getSyncHandler().getStock(index); if (stock != null) { - ItemStack stack = stock.createItemStack(); + ItemStack stack = stock.createItemStack(); // have to copy the stack here since the count is set to 1 if (!stack.isEmpty()) { stack.setCount(1); RenderUtil.renderItem(stack, 1, 1, 16f, 16f); From 267b9d08835579a8731e2db3e23857db53a1985c Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Wed, 11 Jun 2025 11:34:11 -0400 Subject: [PATCH 085/136] Spotless --- .../gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java index 5b352064504..ea030a6e5ec 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java @@ -6,7 +6,6 @@ import gregtech.api.mui.widget.appeng.AEStackPreviewWidget; import gregtech.api.util.TextFormattingUtil; import gregtech.client.utils.RenderUtil; -import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedItemStack; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.item.ItemStack; From 63106cc091ca25b62bf68f17befa0a72b969a84b Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Wed, 11 Jun 2025 11:34:35 -0400 Subject: [PATCH 086/136] Move the tier of the stocking parts into the constructor too --- .../metatileentities/MetaTileEntityRegistration.java | 4 ++-- .../multiblockpart/appeng/MetaTileEntityMEStockingBus.java | 7 +++---- .../appeng/MetaTileEntityMEStockingHatch.java | 7 +++---- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/MetaTileEntityRegistration.java b/src/main/java/gregtech/common/metatileentities/MetaTileEntityRegistration.java index a6ed0530ca5..1fe3b082d3d 100644 --- a/src/main/java/gregtech/common/metatileentities/MetaTileEntityRegistration.java +++ b/src/main/java/gregtech/common/metatileentities/MetaTileEntityRegistration.java @@ -1060,9 +1060,9 @@ private static void multiblockParts() { MetaTileEntities.FLUID_IMPORT_HATCH_ME = MetaTileEntities.registerMetaTileEntity(11526, new MetaTileEntityMEInputHatch(gregtechId("me_import_fluid_hatch"), GTValues.EV)); MetaTileEntities.STOCKING_BUS_ME = MetaTileEntities.registerMetaTileEntity(11527, - new MetaTileEntityMEStockingBus(gregtechId("me_stocking_item_bus"))); + new MetaTileEntityMEStockingBus(gregtechId("me_stocking_item_bus"), GTValues.IV)); MetaTileEntities.STOCKING_HATCH_ME = MetaTileEntities.registerMetaTileEntity(11528, - new MetaTileEntityMEStockingHatch(gregtechId("me_stocking_fluid_hatch"))); + new MetaTileEntityMEStockingHatch(gregtechId("me_stocking_fluid_hatch"), GTValues.IV)); // slots left for CRIB and CRIBuffer in the future for nicer sorting order MetaTileEntities.ITEM_EXPORT_BUS_ME = MetaTileEntities.registerMetaTileEntity(11532, new MetaTileEntityMEOutputBus(gregtechId("me_export_item_bus"))); diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java index 7c78eb2674a..2c4c51d0f60 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java @@ -1,6 +1,5 @@ package gregtech.common.metatileentities.multi.multiblockpart.appeng; -import gregtech.api.GTValues; import gregtech.api.capability.impl.ItemHandlerList; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; @@ -56,14 +55,14 @@ public class MetaTileEntityMEStockingBus extends MetaTileEntityMEInputBus { private Predicate autoPullTest; private int minimumStackSize = 0; - public MetaTileEntityMEStockingBus(ResourceLocation metaTileEntityId) { - super(metaTileEntityId, GTValues.IV); + public MetaTileEntityMEStockingBus(ResourceLocation metaTileEntityId, int tier) { + super(metaTileEntityId, tier); this.autoPullTest = $ -> false; } @Override public MetaTileEntity createMetaTileEntity(IGregTechTileEntity iGregTechTileEntity) { - return new MetaTileEntityMEStockingBus(metaTileEntityId); + return new MetaTileEntityMEStockingBus(metaTileEntityId, getTier()); } @Override diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java index b8653921408..85894e39f9c 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java @@ -1,6 +1,5 @@ package gregtech.common.metatileentities.multi.multiblockpart.appeng; -import gregtech.api.GTValues; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.metatileentity.multiblock.MultiblockAbility; @@ -54,14 +53,14 @@ public class MetaTileEntityMEStockingHatch extends MetaTileEntityMEInputHatch { private Predicate autoPullTest; private int minimumStackSize = 0; - public MetaTileEntityMEStockingHatch(ResourceLocation metaTileEntityId) { - super(metaTileEntityId, GTValues.IV); + public MetaTileEntityMEStockingHatch(ResourceLocation metaTileEntityId, int tier) { + super(metaTileEntityId, tier); this.autoPullTest = $ -> false; } @Override public MetaTileEntity createMetaTileEntity(IGregTechTileEntity iGregTechTileEntity) { - return new MetaTileEntityMEStockingHatch(metaTileEntityId); + return new MetaTileEntityMEStockingHatch(metaTileEntityId, getTier()); } @Override From 331e14be2d6ec80e71f8eba6d25ddb025373bb94 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Wed, 11 Jun 2025 15:26:46 -0400 Subject: [PATCH 087/136] Fix usage of I18n on servers --- .../multiblockpart/appeng/MetaTileEntityMEInputBus.java | 5 +++-- .../multiblockpart/appeng/MetaTileEntityMEInputHatch.java | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java index 60a40fa073f..77c9d9f0484 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java @@ -243,8 +243,9 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) return mainPanel.child(IKey.lang(getMetaFullName()).asWidget().pos(5, 5)) .child(SlotGroupWidget.playerInventory().left(7).bottom(7)) - .child(IKey.dynamic(() -> isOnline() ? I18n.format("gregtech.gui.me_network.online") : - I18n.format("gregtech.gui.me_network.offline")).asWidget().pos(5, 15)) + .child(IKey.lang(() -> isOnline() ? "gregtech.gui.me_network.online" : + "gregtech.gui.me_network.offline") + .asWidget().pos(5, 15)) .child(configGrid) .child(new Grid() .pos(7 + 18 * 5, 25) diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java index e5201e7355e..597810a3da7 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java @@ -201,8 +201,9 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) return mainPanel.child(IKey.lang(getMetaFullName()).asWidget().pos(5, 5)) .child(SlotGroupWidget.playerInventory().left(7).bottom(7)) - .child(IKey.dynamic(() -> isOnline() ? I18n.format("gregtech.gui.me_network.online") : - I18n.format("gregtech.gui.me_network.offline")).asWidget().pos(5, 15)) + .child(IKey.lang(() -> isOnline() ? "gregtech.gui.me_network.online" : + "gregtech.gui.me_network.offline") + .asWidget().pos(5, 15)) .child(configGrid) .child(new Grid() .pos(7 + 18 * 5, 25) From 2feeffe456ec3d468e9d59f69d1b9f6e2a673401 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Wed, 11 Jun 2025 15:27:40 -0400 Subject: [PATCH 088/136] Fix regression in 55b574c4 which broke scrolling --- src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java index 9f01486f9a9..f737dd656f5 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java @@ -130,7 +130,7 @@ public int getSlotHoverColor() { @Override public boolean onMouseScroll(ModularScreen.UpOrDown scrollDirection, int scrollAmount) { - if (getSyncHandler().hasConfig(index) || isStocking) return false; + if (!getSyncHandler().hasConfig(index) || isStocking) return false; long newStackSize = getSyncHandler().getConfigAmount(index); From 97e790456fa6e443c80c33f0c84d6c3f0845fa84 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Wed, 11 Jun 2025 22:07:12 -0400 Subject: [PATCH 089/136] Use childIf --- src/main/java/gregtech/api/mui/GTGuis.java | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/gregtech/api/mui/GTGuis.java b/src/main/java/gregtech/api/mui/GTGuis.java index 55ef0d32ff7..0b116b9caa7 100644 --- a/src/main/java/gregtech/api/mui/GTGuis.java +++ b/src/main/java/gregtech/api/mui/GTGuis.java @@ -117,16 +117,16 @@ private PopupPanel(@NotNull String name, boolean addCloseButton) { super(name); align(Alignment.Center); background(GTGuiTextures.BACKGROUND_POPUP); - if (addCloseButton) { - child(ButtonWidget.panelCloseButton().top(5).right(5) - .onMousePressed(mouseButton -> { - if (mouseButton == 0 || mouseButton == 1) { - this.closeIfOpen(true); - return true; - } - return false; - })); - } + childIf(addCloseButton, () -> ButtonWidget.panelCloseButton() + .top(5).right(5) + .onMousePressed(mouseButton -> { + if (mouseButton == 0 || mouseButton == 1) { + closeIfOpen(true); + return true; + } + + return false; + })); } @Override From ce3aae626762435cc8c21cdf0147108c71237823 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Wed, 11 Jun 2025 22:13:37 -0400 Subject: [PATCH 090/136] Use RecipeTransferErrorInternal#INSTANCE for hiding the + button --- .../gregtech/api/mui/GregTechGuiScreen.java | 5 ++-- .../gregtech/api/mui/IJEIRecipeReceiver.java | 23 ++++--------------- .../workbench/CraftingRecipeLogic.java | 3 ++- 3 files changed, 9 insertions(+), 22 deletions(-) diff --git a/src/main/java/gregtech/api/mui/GregTechGuiScreen.java b/src/main/java/gregtech/api/mui/GregTechGuiScreen.java index e951ad6e529..06d6b942085 100644 --- a/src/main/java/gregtech/api/mui/GregTechGuiScreen.java +++ b/src/main/java/gregtech/api/mui/GregTechGuiScreen.java @@ -16,14 +16,13 @@ import com.cleanroommc.modularui.value.sync.SyncHandler; import mezz.jei.api.gui.IRecipeLayout; import mezz.jei.api.recipe.transfer.IRecipeTransferError; +import mezz.jei.transfer.RecipeTransferErrorInternal; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import static gregtech.api.mui.IJEIRecipeReceiver.DEFAULT_JEI_ERROR; - @SuppressWarnings("UnstableApiUsage") @SideOnly(Side.CLIENT) public class GregTechGuiScreen extends ModularScreen implements JeiRecipeTransferHandler { @@ -70,6 +69,6 @@ public IRecipeTransferError transferRecipe(IRecipeLayout recipeLayout, boolean m } // Hide the + button by default if no recipe receiver was found. - return DEFAULT_JEI_ERROR; + return RecipeTransferErrorInternal.INSTANCE; } } diff --git a/src/main/java/gregtech/api/mui/IJEIRecipeReceiver.java b/src/main/java/gregtech/api/mui/IJEIRecipeReceiver.java index ac00989037a..db0b1004813 100644 --- a/src/main/java/gregtech/api/mui/IJEIRecipeReceiver.java +++ b/src/main/java/gregtech/api/mui/IJEIRecipeReceiver.java @@ -1,6 +1,5 @@ package gregtech.api.mui; -import net.minecraft.client.Minecraft; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -18,23 +17,11 @@ public interface IJEIRecipeReceiver { /** - * Return this the recipe is invalid for the receiver to hide the + button. - */ - IRecipeTransferError DEFAULT_JEI_ERROR = new IRecipeTransferError() { - - @Override - public @NotNull Type getType() { - return Type.INTERNAL; - } - - @Override - public void showError(@NotNull Minecraft minecraft, int mouseX, int mouseY, - @NotNull IRecipeLayout recipeLayout, int recipeX, int recipeY) { - // nothing to show, just hide the + button - } - }; - - /** + * Returning an {@link IRecipeTransferError} with a type of {@link IRecipeTransferError.Type#INTERNAL} will hide the + * + button.
+ * JEI has a static instance available at {@link mezz.jei.transfer.RecipeTransferErrorInternal#INSTANCE} for this + * purpose. + * * @param recipeLayout the recipe layout that contains the recipe category, and the item and fluid stacks * @param maxTransfer if the receiver should try to move as many ingredients as possible to the crafting slots, ie * a crafting table diff --git a/src/main/java/gregtech/common/metatileentities/workbench/CraftingRecipeLogic.java b/src/main/java/gregtech/common/metatileentities/workbench/CraftingRecipeLogic.java index 30ebc07451b..0980184842e 100644 --- a/src/main/java/gregtech/common/metatileentities/workbench/CraftingRecipeLogic.java +++ b/src/main/java/gregtech/common/metatileentities/workbench/CraftingRecipeLogic.java @@ -41,6 +41,7 @@ import mezz.jei.api.gui.IGuiItemStackGroup; import mezz.jei.api.gui.IRecipeLayout; import mezz.jei.api.recipe.transfer.IRecipeTransferError; +import mezz.jei.transfer.RecipeTransferErrorInternal; import org.jetbrains.annotations.NotNull; import java.util.*; @@ -451,7 +452,7 @@ public void syncMatrix() { public IRecipeTransferError receiveRecipe(@NotNull IRecipeLayout recipeLayout, boolean maxTransfer, boolean simulate) { if (!recipeLayout.getRecipeCategory().getUid().equals("minecraft.crafting")) { - return DEFAULT_JEI_ERROR; + return RecipeTransferErrorInternal.INSTANCE; } if (simulate) { From 3bdd1292cafab3e2740ccf96ef0bd5d058d9d386 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Wed, 11 Jun 2025 22:20:52 -0400 Subject: [PATCH 091/136] Delete EmptyWidget --- .../java/gregtech/api/mui/widget/EmptyWidget.java | 12 ------------ .../appeng/MetaTileEntityMEInputBus.java | 3 +-- .../appeng/MetaTileEntityMEInputHatch.java | 5 ++--- 3 files changed, 3 insertions(+), 17 deletions(-) delete mode 100644 src/main/java/gregtech/api/mui/widget/EmptyWidget.java diff --git a/src/main/java/gregtech/api/mui/widget/EmptyWidget.java b/src/main/java/gregtech/api/mui/widget/EmptyWidget.java deleted file mode 100644 index 80ccf58c4bc..00000000000 --- a/src/main/java/gregtech/api/mui/widget/EmptyWidget.java +++ /dev/null @@ -1,12 +0,0 @@ -package gregtech.api.mui.widget; - -import com.cleanroommc.modularui.widget.Widget; - -/** - * A widget that does absolutely nothing. Is currently used to take up space in a Flow in the non-stocking ME Input Bus - * to be replaced by the auto pull button in the stocking ME Input Bus. - * Hopefully Ghzdude or Brachy will show me a better way to do this. - */ -public class EmptyWidget extends Widget { - -} diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java index 77c9d9f0484..23a2b6b38f3 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java @@ -17,7 +17,6 @@ import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuis; import gregtech.api.mui.sync.appeng.AEItemSyncHandler; -import gregtech.api.mui.widget.EmptyWidget; import gregtech.api.mui.widget.GhostCircuitSlotWidget; import gregtech.api.mui.widget.appeng.item.AEItemConfigSlot; import gregtech.api.mui.widget.appeng.item.AEItemDisplaySlot; @@ -324,7 +323,7 @@ protected int getSettingsPopupHeight() { } protected Widget getExtraButton() { - return new EmptyWidget() + return new Widget<>() .size(18); } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java index 597810a3da7..06e5ed532e7 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java @@ -12,7 +12,6 @@ import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuis; import gregtech.api.mui.sync.appeng.AEFluidSyncHandler; -import gregtech.api.mui.widget.EmptyWidget; import gregtech.api.mui.widget.appeng.fluid.AEFluidConfigSlot; import gregtech.api.mui.widget.appeng.fluid.AEFluidDisplaySlot; import gregtech.client.renderer.texture.Textures; @@ -221,7 +220,7 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) .size(18, 18 * 4) .child(getExtraButton()) .child(GTGuiTextures.ARROW_DOUBLE.asWidget()) - .child(new EmptyWidget() + .child(new Widget<>() .size(18)) .child(GTGuiTextures.getLogo(getUITheme()).asWidget() .size(17))) @@ -280,7 +279,7 @@ protected int getSettingsPopupHeight() { } protected Widget getExtraButton() { - return new EmptyWidget() + return new Widget<>() .size(18); } From de60ad0fc0dd136db77806345b7f647ea630156e Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Fri, 13 Jun 2025 11:19:55 -0400 Subject: [PATCH 092/136] Doubling and dividing, no texture or lang --- .../api/mui/sync/appeng/AESyncHandler.java | 43 +++++++++++++++++++ .../appeng/MetaTileEntityMEInputBus.java | 29 +++++++++++-- .../appeng/MetaTileEntityMEInputHatch.java | 29 +++++++++++-- 3 files changed, 94 insertions(+), 7 deletions(-) diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java index 4b4042233c1..d75bc9a57f2 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java @@ -11,12 +11,15 @@ import appeng.api.storage.data.IAEStack; import com.cleanroommc.modularui.utils.serialization.IByteBufAdapter; import com.cleanroommc.modularui.value.sync.SyncHandler; +import it.unimi.dsi.fastutil.ints.Int2IntArrayMap; +import it.unimi.dsi.fastutil.ints.Int2IntMap; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.IOException; +import java.util.function.IntBinaryOperator; public abstract class AESyncHandler> extends SyncHandler implements IJEIRecipeReceiver { @@ -25,6 +28,7 @@ public abstract class AESyncHandler> extends SyncHandler i public static final int clearConfigID = 2; public static final int bulkClearConfigID = 3; public static final int changeConfigAmountID = 4; + public static final int bulkConfigAmountChangeID = 5; protected final boolean isStocking; protected final IConfigurableSlot[] slots; @@ -124,6 +128,15 @@ public void readOnServer(int id, PacketBuffer buf) throws IOException { IConfigurableSlot slot = slots[index]; slot.setConfig(null); } + } else if (id == bulkConfigAmountChangeID) { + int size = buf.readVarInt(); + for (int i = 0; i < size; i++) { + T config = slots[buf.readVarInt()].getConfig(); + int newAmount = buf.readInt(); + if (config != null) { + config.setStackSize(newAmount); + } + } } } @@ -203,6 +216,36 @@ public T getStock(int index) { return slots[index].getStock(); } + /** + * Operate over the amounts of all slots, skipping empty slots. + * + * @param function a function that takes the slot index and the original stack size, and returns a new stack size + */ + @SideOnly(Side.CLIENT) + public void modifyConfigAmounts(IntBinaryOperator function) { + Int2IntMap changeMap = new Int2IntArrayMap(slots.length); + + for (int index = 0; index < slots.length; index++) { + T config = slots[index].getConfig(); + if (config != null) { + int originalSize = GTUtility.safeCastLongToInt(config.getStackSize()); + int newSize = function.applyAsInt(index, originalSize); + if (newSize != originalSize) { + changeMap.put(index, newSize); + } + } + } + + syncToServer(bulkConfigAmountChangeID, buf -> { + buf.writeVarInt(changeMap.size()); + + for (int index : changeMap.keySet()) { + buf.writeVarInt(index); + buf.writeInt(changeMap.get(index)); + } + }); + } + @SuppressWarnings("BooleanMethodIsAlwaysInverted") public final boolean areAEStackCountEquals(T stack1, T stack2) { if (stack2 == stack1) { diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java index 23a2b6b38f3..a6314caf657 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java @@ -218,8 +218,8 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) guiSyncManager.registerSlotGroup("extra_slot", 1); final String syncHandlerName = "aeSync"; - guiSyncManager.syncValue(syncHandlerName, - new AEItemSyncHandler(getAEItemHandler(), this::markDirty, circuitInventory)); + AEItemSyncHandler syncHandler = new AEItemSyncHandler(getAEItemHandler(), this::markDirty, circuitInventory); + guiSyncManager.syncValue(syncHandlerName, syncHandler); Grid configGrid = new Grid() .pos(7, 25) @@ -269,9 +269,30 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) .slot(SyncHandlers.itemSlot(extraSlotInventory, 0) .slotGroup("extra_slot")) .addTooltipLine(IKey.lang("gregtech.gui.me_bus.extra_slot")))) - .child(getSettingWidget(guiSyncManager) + .child(Flow.row() + .width(isStocking ? 18 : 18 * 2) + .height(18) + .top(5) .right(7) - .top(5)); + .childIf(!isStocking, new ButtonWidget<>() + .width(9) + .height(18) + .onMousePressed(mouseButton -> { + syncHandler.modifyConfigAmounts((index, amount) -> Math.max(1, amount / 2)); + + return true; + }) + .addTooltipLine(IKey.str("Click to divide all slots by 2"))) // TODO: lang + .childIf(!isStocking, new ButtonWidget<>() + .width(9) + .height(18).onMousePressed(mouseButton -> { + syncHandler.modifyConfigAmounts( + (index, amount) -> GTUtility.safeCastLongToInt((long) amount * 2)); + + return true; + }) + .addTooltipLine(IKey.str("Click to multiply all slots by 2"))) // TODO: lang + .child(getSettingWidget(guiSyncManager))); } protected Widget getSettingWidget(PanelSyncManager guiSyncManager) { diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java index 06e5ed532e7..a772ab11d97 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java @@ -14,6 +14,7 @@ import gregtech.api.mui.sync.appeng.AEFluidSyncHandler; import gregtech.api.mui.widget.appeng.fluid.AEFluidConfigSlot; import gregtech.api.mui.widget.appeng.fluid.AEFluidDisplaySlot; +import gregtech.api.util.GTUtility; import gregtech.client.renderer.texture.Textures; import gregtech.common.ConfigHolder; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEFluidList; @@ -177,7 +178,8 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) final boolean isStocking = getAEFluidHandler().isStocking(); final String syncHandlerName = "aeSync"; - guiSyncManager.syncValue(syncHandlerName, new AEFluidSyncHandler(getAEFluidHandler(), this::markDirty)); + AEFluidSyncHandler syncHandler = new AEFluidSyncHandler(getAEFluidHandler(), this::markDirty); + guiSyncManager.syncValue(syncHandlerName, syncHandler); Grid configGrid = new Grid() .pos(7, 25) @@ -224,9 +226,30 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) .size(18)) .child(GTGuiTextures.getLogo(getUITheme()).asWidget() .size(17))) - .child(getSettingWidget(guiSyncManager) + .child(Flow.row() + .width(isStocking ? 18 : 18 * 2) + .height(18) + .top(5) .right(7) - .top(5)); + .childIf(!isStocking, new ButtonWidget<>() + .width(9) + .height(18) + .onMousePressed(mouseButton -> { + syncHandler.modifyConfigAmounts((index, amount) -> Math.max(1, amount / 2)); + + return true; + }) + .addTooltipLine(IKey.str("Click to divide all slots by 2"))) // TODO: lang + .childIf(!isStocking, new ButtonWidget<>() + .width(9) + .height(18).onMousePressed(mouseButton -> { + syncHandler.modifyConfigAmounts( + (index, amount) -> GTUtility.safeCastLongToInt((long) amount * 2)); + + return true; + }) + .addTooltipLine(IKey.str("Click to multiply all slots by 2"))) // TODO: lang + .child(getSettingWidget(guiSyncManager))); } protected Widget getSettingWidget(PanelSyncManager guiSyncManager) { From 9d1033e5bbc13b90e0d8699520ade1b151cb0024 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Sat, 14 Jun 2025 11:48:30 -0400 Subject: [PATCH 093/136] Minor SH changes --- .../api/mui/sync/appeng/AESyncHandler.java | 35 +++++++++---------- 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java index d75bc9a57f2..8a6ed0d2752 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java @@ -175,18 +175,15 @@ public void clearConfigFrom(int startingIndex) { @SideOnly(Side.CLIENT) public void setConfig(int index, @Nullable T newConfig) { - if (newConfig == null) { - syncToServer(setConfigID, buf -> { - buf.writeVarInt(index); + syncToServer(setConfigID, buf -> { + buf.writeVarInt(index); + if (newConfig == null) { buf.writeBoolean(false); - }); - } else { - syncToServer(setConfigID, buf -> { - buf.writeVarInt(index); + } else { buf.writeBoolean(true); - newConfig.writeToPacket(buf); - }); - } + byteBufAdapter.serialize(buf, newConfig); + } + }); } @Nullable @@ -222,7 +219,7 @@ public T getStock(int index) { * @param function a function that takes the slot index and the original stack size, and returns a new stack size */ @SideOnly(Side.CLIENT) - public void modifyConfigAmounts(IntBinaryOperator function) { + public void modifyConfigAmounts(@NotNull IntBinaryOperator function) { Int2IntMap changeMap = new Int2IntArrayMap(slots.length); for (int index = 0; index < slots.length; index++) { @@ -236,14 +233,16 @@ public void modifyConfigAmounts(IntBinaryOperator function) { } } - syncToServer(bulkConfigAmountChangeID, buf -> { - buf.writeVarInt(changeMap.size()); + if (!changeMap.isEmpty()) { + syncToServer(bulkConfigAmountChangeID, buf -> { + buf.writeVarInt(changeMap.size()); - for (int index : changeMap.keySet()) { - buf.writeVarInt(index); - buf.writeInt(changeMap.get(index)); - } - }); + for (int index : changeMap.keySet()) { + buf.writeVarInt(index); + buf.writeInt(changeMap.get(index)); + } + }); + } } @SuppressWarnings("BooleanMethodIsAlwaysInverted") From 2308b1e67ad277f170cdfd9c69b6f147e24008fb Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Sat, 14 Jun 2025 14:47:06 -0400 Subject: [PATCH 094/136] Work on better multiplier controls --- .../java/gregtech/api/util/GTUtility.java | 7 ++ .../appeng/MetaTileEntityMEInputBus.java | 79 +++++++++++++----- .../appeng/MetaTileEntityMEInputHatch.java | 80 ++++++++++++++----- .../resources/assets/gregtech/lang/en_us.lang | 1 + 4 files changed, 123 insertions(+), 44 deletions(-) diff --git a/src/main/java/gregtech/api/util/GTUtility.java b/src/main/java/gregtech/api/util/GTUtility.java index 29907c4c8c0..1e6dd2fa2b6 100644 --- a/src/main/java/gregtech/api/util/GTUtility.java +++ b/src/main/java/gregtech/api/util/GTUtility.java @@ -924,6 +924,13 @@ public static int safeCastLongToInt(long v) { return v > Integer.MAX_VALUE ? Integer.MAX_VALUE : (int) v; } + /** + * Safely multiply two Ints without overflowing + */ + public static int safeIntegerMultiplication(int a, int b) { + return safeCastLongToInt((long) a * b); + } + /** * Scales a proposed recipe voltage according to a provided Material working tier. * diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java index a6314caf657..99b35aec8b5 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java @@ -55,7 +55,9 @@ import com.cleanroommc.modularui.drawable.ItemDrawable; import com.cleanroommc.modularui.factory.PosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.value.IntValue; import com.cleanroommc.modularui.value.sync.IntSyncValue; +import com.cleanroommc.modularui.value.sync.PanelSyncHandler; import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.value.sync.SyncHandlers; import com.cleanroommc.modularui.widget.Widget; @@ -77,6 +79,7 @@ public class MetaTileEntityMEInputBus extends MetaTileEntityAEHostableChannelPar public static final String ITEM_BUFFER_TAG = "ItemSlots"; public static final String WORKING_TAG = "WorkingEnabled"; + public static final String SYNC_HANDLER_NAME = "aeSync"; public final static int CONFIG_SIZE = 16; protected ExportOnlyAEItemList aeItemHandler; @@ -217,9 +220,8 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) final boolean isStocking = getAEItemHandler().isStocking(); guiSyncManager.registerSlotGroup("extra_slot", 1); - final String syncHandlerName = "aeSync"; AEItemSyncHandler syncHandler = new AEItemSyncHandler(getAEItemHandler(), this::markDirty, circuitInventory); - guiSyncManager.syncValue(syncHandlerName, syncHandler); + guiSyncManager.syncValue(SYNC_HANDLER_NAME, 0, syncHandler); Grid configGrid = new Grid() .pos(7, 25) @@ -229,7 +231,7 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) .minRowHeight(18) .matrix(Grid.mapToMatrix((int) Math.sqrt(CONFIG_SIZE), CONFIG_SIZE, index -> new AEItemConfigSlot(isStocking, index, this::isAutoPull) - .syncHandler(syncHandlerName) + .syncHandler(SYNC_HANDLER_NAME, 0) .debugName("Index " + index))); for (IWidget aeWidget : configGrid.getChildren()) { @@ -255,7 +257,7 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) .matrix(Grid.mapToMatrix((int) Math.sqrt(CONFIG_SIZE), CONFIG_SIZE, index -> new AEItemDisplaySlot(index) .background(GTGuiTextures.SLOT_DARK) - .syncHandler(syncHandlerName) + .syncHandler(SYNC_HANDLER_NAME, 0) .debugName("Index " + index)))) .child(Flow.column() .pos(7 + 18 * 4, 25) @@ -274,24 +276,7 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) .height(18) .top(5) .right(7) - .childIf(!isStocking, new ButtonWidget<>() - .width(9) - .height(18) - .onMousePressed(mouseButton -> { - syncHandler.modifyConfigAmounts((index, amount) -> Math.max(1, amount / 2)); - - return true; - }) - .addTooltipLine(IKey.str("Click to divide all slots by 2"))) // TODO: lang - .childIf(!isStocking, new ButtonWidget<>() - .width(9) - .height(18).onMousePressed(mouseButton -> { - syncHandler.modifyConfigAmounts( - (index, amount) -> GTUtility.safeCastLongToInt((long) amount * 2)); - - return true; - }) - .addTooltipLine(IKey.str("Click to multiply all slots by 2"))) // TODO: lang + .childIf(!isStocking, getMultiplierWidget(guiSyncManager)) .child(getSettingWidget(guiSyncManager))); } @@ -343,6 +328,56 @@ protected int getSettingsPopupHeight() { return 33 + 14 + 5; } + protected Widget getMultiplierWidget(PanelSyncManager syncManager) { + IPanelHandler multiplierPopup = syncManager.panel("multiplier_panel", this::buildMultiplierPopup, true); + + return new ButtonWidget<>() + .onMousePressed(mouse -> { + if (multiplierPopup.isPanelOpen()) { + multiplierPopup.closePanel(); + } else { + multiplierPopup.openPanel(); + } + + return true; + }) + .addTooltipLine(IKey.lang("gregtech.machine.me.multiplier.button")); + // TODO button overlay + } + + protected ModularPanel buildMultiplierPopup(PanelSyncManager syncManager, IPanelHandler syncHandler) { + AEItemSyncHandler aeSyncHandler = (AEItemSyncHandler) ((PanelSyncHandler) syncHandler).getSyncManager() + .getSyncHandler(PanelSyncManager.makeSyncKey(SYNC_HANDLER_NAME, 0)); + IntValue multiplier = new IntValue(2); + + return GTGuis.blankPopupPanel("multiplier", 100, 32) + .child(new ButtonWidget<>() + .onMousePressed(mouse -> { + aeSyncHandler.modifyConfigAmounts( + (index, amount) -> Math.max(1, amount / multiplier.getIntValue())); + return true; + }) + .left(5) + .top(7) + .overlay(IKey.str("÷"))) + .child(new TextFieldWidget() + .alignX(0.5f) + .top(5) + .widthRel(0.5f) + .height(18) + .setNumbers(2, Integer.MAX_VALUE) + .value(multiplier)) + .child(new ButtonWidget<>() + .onMousePressed(mouse -> { + aeSyncHandler.modifyConfigAmounts((index, amount) -> GTUtility + .safeIntegerMultiplication(amount, multiplier.getIntValue())); + return true; + }) + .right(5) + .top(7) + .overlay(IKey.str("x"))); + } + protected Widget getExtraButton() { return new Widget<>() .size(18); diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java index a772ab11d97..057effd0b47 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java @@ -48,7 +48,9 @@ import com.cleanroommc.modularui.drawable.ItemDrawable; import com.cleanroommc.modularui.factory.PosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.value.IntValue; import com.cleanroommc.modularui.value.sync.IntSyncValue; +import com.cleanroommc.modularui.value.sync.PanelSyncHandler; import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.widget.Widget; import com.cleanroommc.modularui.widgets.ButtonWidget; @@ -67,6 +69,7 @@ public class MetaTileEntityMEInputHatch extends MetaTileEntityAEHostableChannelP public static final String FLUID_BUFFER_TAG = "FluidTanks"; public static final String WORKING_TAG = "WorkingEnabled"; + public static final String SYNC_HANDLER_NAME = "aeSync"; public final static int CONFIG_SIZE = 16; protected ExportOnlyAEFluidList aeFluidHandler; @@ -177,9 +180,8 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) final boolean isStocking = getAEFluidHandler().isStocking(); - final String syncHandlerName = "aeSync"; AEFluidSyncHandler syncHandler = new AEFluidSyncHandler(getAEFluidHandler(), this::markDirty); - guiSyncManager.syncValue(syncHandlerName, syncHandler); + guiSyncManager.syncValue(SYNC_HANDLER_NAME, 0, syncHandler); Grid configGrid = new Grid() .pos(7, 25) @@ -189,7 +191,7 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) .minRowHeight(18) .matrix(Grid.mapToMatrix((int) Math.sqrt(CONFIG_SIZE), CONFIG_SIZE, index -> new AEFluidConfigSlot(isStocking, index, this::isAutoPull) - .syncHandler(syncHandlerName) + .syncHandler(SYNC_HANDLER_NAME, 0) .debugName("Index " + index))); for (IWidget aeWidget : configGrid.getChildren()) { @@ -215,7 +217,7 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) .matrix(Grid.mapToMatrix((int) Math.sqrt(CONFIG_SIZE), CONFIG_SIZE, index -> new AEFluidDisplaySlot(index) .background(GTGuiTextures.SLOT_DARK) - .syncHandler(syncHandlerName) + .syncHandler(SYNC_HANDLER_NAME, 0) .debugName("Index " + index)))) .child(Flow.column() .pos(7 + 18 * 4, 25) @@ -231,24 +233,7 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) .height(18) .top(5) .right(7) - .childIf(!isStocking, new ButtonWidget<>() - .width(9) - .height(18) - .onMousePressed(mouseButton -> { - syncHandler.modifyConfigAmounts((index, amount) -> Math.max(1, amount / 2)); - - return true; - }) - .addTooltipLine(IKey.str("Click to divide all slots by 2"))) // TODO: lang - .childIf(!isStocking, new ButtonWidget<>() - .width(9) - .height(18).onMousePressed(mouseButton -> { - syncHandler.modifyConfigAmounts( - (index, amount) -> GTUtility.safeCastLongToInt((long) amount * 2)); - - return true; - }) - .addTooltipLine(IKey.str("Click to multiply all slots by 2"))) // TODO: lang + .childIf(!isStocking, getMultiplierWidget(guiSyncManager)) .child(getSettingWidget(guiSyncManager))); } @@ -301,6 +286,57 @@ protected int getSettingsPopupHeight() { return 33 + 14 + 5; } + protected Widget getMultiplierWidget(PanelSyncManager syncManager) { + IPanelHandler multiplierPopup = syncManager.panel("multiplier_panel", this::buildMultiplierPopup, true); + + return new ButtonWidget<>() + .onMousePressed(mouse -> { + if (multiplierPopup.isPanelOpen()) { + multiplierPopup.closePanel(); + } else { + multiplierPopup.openPanel(); + } + + return true; + }) + .addTooltipLine(IKey.lang("gregtech.machine.me.multiplier.button")); + // TODO button overlay + } + + protected ModularPanel buildMultiplierPopup(PanelSyncManager syncManager, IPanelHandler syncHandler) { + AEFluidSyncHandler aeSyncHandler = (AEFluidSyncHandler) ((PanelSyncHandler) syncHandler).getSyncManager() + .getSyncHandler(PanelSyncManager.makeSyncKey(SYNC_HANDLER_NAME, 0)); + IntValue multiplier = new IntValue(2); + + return GTGuis.createPopupPanel("multiplier", 100, 35) + .child(new ButtonWidget<>() + .onMousePressed(mouse -> { + aeSyncHandler.modifyConfigAmounts( + (index, amount) -> Math.max(1, amount / multiplier.getIntValue())); + return true; + }) + .left(5) + .top(7) + .overlay(IKey.str("÷"))) + .child(new TextFieldWidget() + .alignX(0.5f) + .top(5) + .widthRel(0.5f) + .height(20) + .setNumbers(2, Integer.MAX_VALUE) + .setDefaultNumber(2) + .value(multiplier)) + .child(new ButtonWidget<>() + .onMousePressed(mouse -> { + aeSyncHandler.modifyConfigAmounts((index, amount) -> GTUtility + .safeIntegerMultiplication(amount, multiplier.getIntValue())); + return true; + }) + .right(5) + .top(7) + .overlay(IKey.str("x"))); + } + protected Widget getExtraButton() { return new Widget<>() .size(18); diff --git a/src/main/resources/assets/gregtech/lang/en_us.lang b/src/main/resources/assets/gregtech/lang/en_us.lang index 5a496126c1f..0b6848e2a22 100644 --- a/src/main/resources/assets/gregtech/lang/en_us.lang +++ b/src/main/resources/assets/gregtech/lang/en_us.lang @@ -5530,6 +5530,7 @@ gregtech.machine.me.settings.button=ME Settings gregtech.machine.me.settings.refresh_rate=Refresh rate: gregtech.machine.me.settings.minimum=Minimum stack size: gregtech.machine.me.settings.minimum.tooltip=Set to 0 to disable the minimum stack size filtering +gregtech.machine.me.multiplier.button=Config multiplier # Universal tooltips gregtech.universal.tooltip.voltage_in=§aVoltage IN: §f%,d EU/t (%s§f) From ec626145be68525d61e222c80f94bd4efee8f2cf Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Sat, 14 Jun 2025 20:42:36 -0400 Subject: [PATCH 095/136] Fix that opening JEI would brick popup panels --- .../gregtech/client/IsGuiActuallyClosing.java | 6 ++++++ .../mixins/minecraft/MinecraftMixin.java | 10 ++++++++++ .../mixins/mui2/ModularSyncManagerMixin.java | 20 +++++++++++++++++++ src/main/resources/mixins.gregtech.mui2.json | 3 ++- 4 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 src/main/java/gregtech/client/IsGuiActuallyClosing.java create mode 100644 src/main/java/gregtech/mixins/mui2/ModularSyncManagerMixin.java diff --git a/src/main/java/gregtech/client/IsGuiActuallyClosing.java b/src/main/java/gregtech/client/IsGuiActuallyClosing.java new file mode 100644 index 00000000000..3e7c765d3a0 --- /dev/null +++ b/src/main/java/gregtech/client/IsGuiActuallyClosing.java @@ -0,0 +1,6 @@ +package gregtech.client; + +public class IsGuiActuallyClosing { + + public static boolean isGuiActuallyClosing; +} diff --git a/src/main/java/gregtech/mixins/minecraft/MinecraftMixin.java b/src/main/java/gregtech/mixins/minecraft/MinecraftMixin.java index 0bba8ad4f03..1154f92e033 100644 --- a/src/main/java/gregtech/mixins/minecraft/MinecraftMixin.java +++ b/src/main/java/gregtech/mixins/minecraft/MinecraftMixin.java @@ -1,19 +1,24 @@ package gregtech.mixins.minecraft; import gregtech.api.items.toolitem.ItemGTToolbelt; +import gregtech.client.IsGuiActuallyClosing; import gregtech.common.ConfigHolder; import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.text.TextComponentTranslation; +import org.jetbrains.annotations.Nullable; import org.lwjgl.input.Keyboard; import org.objectweb.asm.Opcodes; +import org.spongepowered.asm.mixin.Debug; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(Minecraft.class) @@ -42,4 +47,9 @@ public void interceptHotbarKeybindsForToolbelt(InventoryPlayer inventoryPlayer, } inventoryPlayer.currentItem = i; } + + @Inject(method = "displayGuiScreen", at = @At(value = "HEAD")) + public void captureNewGUI(@Nullable GuiScreen guiScreenIn, CallbackInfo ci) { + IsGuiActuallyClosing.isGuiActuallyClosing = guiScreenIn == null; + } } diff --git a/src/main/java/gregtech/mixins/mui2/ModularSyncManagerMixin.java b/src/main/java/gregtech/mixins/mui2/ModularSyncManagerMixin.java new file mode 100644 index 00000000000..9346f9b614e --- /dev/null +++ b/src/main/java/gregtech/mixins/mui2/ModularSyncManagerMixin.java @@ -0,0 +1,20 @@ +package gregtech.mixins.mui2; + +import gregtech.client.IsGuiActuallyClosing; + +import com.cleanroommc.modularui.value.sync.ModularSyncManager; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(value = ModularSyncManager.class, remap = false) +public class ModularSyncManagerMixin { + + @Inject(method = "onClose", at = @At(value = "HEAD"), cancellable = true) + private void cancelIfGUIAboutToOpenIsJEI(CallbackInfo ci) { + if (!IsGuiActuallyClosing.isGuiActuallyClosing) { + ci.cancel(); + } + } +} diff --git a/src/main/resources/mixins.gregtech.mui2.json b/src/main/resources/mixins.gregtech.mui2.json index d8ad3dec6d1..f073ef37502 100644 --- a/src/main/resources/mixins.gregtech.mui2.json +++ b/src/main/resources/mixins.gregtech.mui2.json @@ -14,7 +14,8 @@ "PanelSyncManagerAccessor" ], "client": [ - "LangKeyMixin" + "LangKeyMixin", + "ModularSyncManagerMixin" ], "server": [] } From ed2f617aa20c6aebe096b0993839cd3dca131950 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Sat, 14 Jun 2025 20:51:11 -0400 Subject: [PATCH 096/136] =?UTF-8?q?Use=20/=20instead=20of=20=C3=B7=20becau?= =?UTF-8?q?se=20it=20wasn't=20centered=20in=20the=20button?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java | 2 +- .../multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java index 99b35aec8b5..fdc4032a8a5 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java @@ -359,7 +359,7 @@ protected ModularPanel buildMultiplierPopup(PanelSyncManager syncManager, IPanel }) .left(5) .top(7) - .overlay(IKey.str("÷"))) + .overlay(IKey.str("/"))) .child(new TextFieldWidget() .alignX(0.5f) .top(5) diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java index 057effd0b47..5e38fb41fd4 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java @@ -317,7 +317,7 @@ protected ModularPanel buildMultiplierPopup(PanelSyncManager syncManager, IPanel }) .left(5) .top(7) - .overlay(IKey.str("÷"))) + .overlay(IKey.str("/"))) .child(new TextFieldWidget() .alignX(0.5f) .top(5) From b730d76b412cd168ec7475d8ee20e4df11d82805 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Sat, 14 Jun 2025 22:01:35 -0400 Subject: [PATCH 097/136] Add overlay to multiplier button (looks kinda ugly tbh) --- src/main/java/gregtech/api/mui/GTGuiTextures.java | 1 + .../appeng/MetaTileEntityMEInputBus.java | 4 ++-- .../appeng/MetaTileEntityMEInputHatch.java | 4 ++-- .../textures/gui/widget/opposite_arrows.png | Bin 0 -> 313 bytes 4 files changed, 5 insertions(+), 4 deletions(-) create mode 100644 src/main/resources/assets/gregtech/textures/gui/widget/opposite_arrows.png diff --git a/src/main/java/gregtech/api/mui/GTGuiTextures.java b/src/main/java/gregtech/api/mui/GTGuiTextures.java index b63f933228d..0ec10f17fb5 100644 --- a/src/main/java/gregtech/api/mui/GTGuiTextures.java +++ b/src/main/java/gregtech/api/mui/GTGuiTextures.java @@ -528,6 +528,7 @@ public static class IDs { public static final UITexture SELECT_BOX = fullImage("textures/gui/widget/select_box.png"); public static final UITexture BUTTON_AUTO_PULL = fullImage("textures/gui/widget/button_me_auto_pull.png"); public static final UITexture ARROW_DOUBLE = fullImage("textures/gui/widget/arrow_double.png"); + public static final UITexture ARROW_OPPOSITE = fullImage("textures/gui/widget/opposite_arrows.png"); public static final UITexture[] AUTO_PULL = slice("textures/gui/widget/button_me_auto_pull.png", 16, 32, 16, 16, true); diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java index fdc4032a8a5..95f5d77ad5a 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java @@ -341,8 +341,8 @@ protected Widget getMultiplierWidget(PanelSyncManager syncManager) { return true; }) - .addTooltipLine(IKey.lang("gregtech.machine.me.multiplier.button")); - // TODO button overlay + .addTooltipLine(IKey.lang("gregtech.machine.me.multiplier.button")) + .overlay(GTGuiTextures.ARROW_OPPOSITE); } protected ModularPanel buildMultiplierPopup(PanelSyncManager syncManager, IPanelHandler syncHandler) { diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java index 5e38fb41fd4..5e815e82d4f 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java @@ -299,8 +299,8 @@ protected Widget getMultiplierWidget(PanelSyncManager syncManager) { return true; }) - .addTooltipLine(IKey.lang("gregtech.machine.me.multiplier.button")); - // TODO button overlay + .addTooltipLine(IKey.lang("gregtech.machine.me.multiplier.button")) + .overlay(GTGuiTextures.ARROW_OPPOSITE); } protected ModularPanel buildMultiplierPopup(PanelSyncManager syncManager, IPanelHandler syncHandler) { diff --git a/src/main/resources/assets/gregtech/textures/gui/widget/opposite_arrows.png b/src/main/resources/assets/gregtech/textures/gui/widget/opposite_arrows.png new file mode 100644 index 0000000000000000000000000000000000000000..4d79e31215af87d1280c9ed8dd2b94e72633f57d GIT binary patch literal 313 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|#^NA%C&rs6b?Si}mUKs7M+SzC z{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweEp zc6VX;4}uH!E}sk(;VkfoEM{QPQwCwiilz2tKtc8rPhVH|mu&oumeT9zYu5sWYCT;X zLo80eopg}*fC7i>{$;`yg=*Uq*w_-;wil@BuW|67b?n8#Z`Z!vRd~qA_#j$f;?gNO zXN)%sPCT3S$A^i*(Cti$_MaPuEf*fk-Yn#GIbynSmD2M!dA?s-;sf0xmhM>F36$n!=$W+k>Mj4XD*De^W*#yN(p#9c1?Uh4Pgg&ebxsLQ0A@>S8vp Date: Sat, 14 Jun 2025 22:01:39 -0400 Subject: [PATCH 098/136] spotless --- src/main/java/gregtech/mixins/minecraft/MinecraftMixin.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/gregtech/mixins/minecraft/MinecraftMixin.java b/src/main/java/gregtech/mixins/minecraft/MinecraftMixin.java index 1154f92e033..810be316d44 100644 --- a/src/main/java/gregtech/mixins/minecraft/MinecraftMixin.java +++ b/src/main/java/gregtech/mixins/minecraft/MinecraftMixin.java @@ -13,7 +13,6 @@ import org.jetbrains.annotations.Nullable; import org.lwjgl.input.Keyboard; import org.objectweb.asm.Opcodes; -import org.spongepowered.asm.mixin.Debug; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; From 2f0e8684503937f1f54f90283cb28f173e05f7c9 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Tue, 17 Jun 2025 23:38:40 -0400 Subject: [PATCH 099/136] Post merge shenanigans --- .../gregtech/api/mui/GTByteBufAdapters.java | 10 +++ .../mui/sync/appeng/AEFluidSyncHandler.java | 3 +- .../mui/sync/appeng/AEItemSyncHandler.java | 3 +- .../sync/appeng/AEStackByteBufAdapter.java | 62 ------------------- src/main/java/gregtech/api/util/KeyUtil.java | 14 ++--- .../appeng/stack/WrappedFluidStack.java | 10 ++- .../appeng/stack/WrappedItemStack.java | 14 +++-- 7 files changed, 35 insertions(+), 81 deletions(-) delete mode 100644 src/main/java/gregtech/api/mui/sync/appeng/AEStackByteBufAdapter.java diff --git a/src/main/java/gregtech/api/mui/GTByteBufAdapters.java b/src/main/java/gregtech/api/mui/GTByteBufAdapters.java index 8ace8f6a5f3..e2f7e12ee77 100644 --- a/src/main/java/gregtech/api/mui/GTByteBufAdapters.java +++ b/src/main/java/gregtech/api/mui/GTByteBufAdapters.java @@ -3,10 +3,14 @@ import gregtech.api.recipes.chance.output.impl.ChancedFluidOutput; import gregtech.api.recipes.chance.output.impl.ChancedItemOutput; import gregtech.api.util.NetworkUtil; +import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedFluidStack; +import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedItemStack; import net.minecraft.network.PacketBuffer; import net.minecraftforge.fluids.Fluid; +import appeng.api.storage.data.IAEFluidStack; +import appeng.api.storage.data.IAEItemStack; import com.cleanroommc.modularui.utils.serialization.*; import org.jetbrains.annotations.NotNull; @@ -28,6 +32,12 @@ public class GTByteBufAdapters { public static final IByteBufAdapter FLUID = makeAdapter(NetworkUtil::readFluid, NetworkUtil::writeFluid); + public static final IByteBufAdapter WRAPPED_ITEM_STACK = makeAdapter(WrappedItemStack::fromPacket, + (buffer, value) -> value.writeToPacket(buffer)); + + public static final IByteBufAdapter WRAPPED_FLUID_STACK = makeAdapter( + WrappedFluidStack::fromPacket, (buffer, value) -> value.writeToPacket(buffer)); + public static IByteBufAdapter makeAdapter(@NotNull IByteBufDeserializer deserializer, @NotNull IByteBufSerializer serializer) { return makeAdapter(deserializer, serializer, IEquals.defaultTester()); diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java index d097b62ef57..474edc5046e 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java @@ -1,5 +1,6 @@ package gregtech.api.mui.sync.appeng; +import gregtech.api.mui.GTByteBufAdapters; import gregtech.api.util.GTUtility; import gregtech.api.util.JEIUtil; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEFluidList; @@ -43,7 +44,7 @@ public AEFluidSyncHandler(ExportOnlyAEFluidList fluidList, @Nullable Runnable di @Override protected @NotNull IByteBufAdapter initializeByteBufAdapter() { - return AEStackByteBufAdapter.wrappedFluidStackAdapter; + return GTByteBufAdapters.WRAPPED_FLUID_STACK; } @Override diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java index bf29dbf6659..a20e46186a5 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java @@ -1,6 +1,7 @@ package gregtech.api.mui.sync.appeng; import gregtech.api.capability.impl.GhostCircuitItemStackHandler; +import gregtech.api.mui.GTByteBufAdapters; import gregtech.api.recipes.ingredients.IntCircuitIngredient; import gregtech.api.util.GTUtility; import gregtech.api.util.JEIUtil; @@ -49,7 +50,7 @@ public AEItemSyncHandler(ExportOnlyAEItemList itemList, @Nullable Runnable dirty @Override protected @NotNull IByteBufAdapter initializeByteBufAdapter() { - return AEStackByteBufAdapter.wrappedItemStackAdapter; + return GTByteBufAdapters.WRAPPED_ITEM_STACK; } @Override diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AEStackByteBufAdapter.java b/src/main/java/gregtech/api/mui/sync/appeng/AEStackByteBufAdapter.java deleted file mode 100644 index 1099a9eee41..00000000000 --- a/src/main/java/gregtech/api/mui/sync/appeng/AEStackByteBufAdapter.java +++ /dev/null @@ -1,62 +0,0 @@ -package gregtech.api.mui.sync.appeng; - -import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedFluidStack; -import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedItemStack; - -import net.minecraft.network.PacketBuffer; - -import appeng.api.storage.data.IAEFluidStack; -import appeng.api.storage.data.IAEItemStack; -import appeng.api.storage.data.IAEStack; -import com.cleanroommc.modularui.utils.serialization.IByteBufAdapter; -import com.cleanroommc.modularui.utils.serialization.IByteBufDeserializer; -import com.cleanroommc.modularui.utils.serialization.IByteBufSerializer; -import org.jetbrains.annotations.NotNull; - -import java.io.IOException; -import java.util.Objects; - -public class AEStackByteBufAdapter> implements IByteBufAdapter { - - public static final AEStackByteBufAdapter wrappedItemStackAdapter = specificDeserializer( - WrappedItemStack::fromPacket); - public static final AEStackByteBufAdapter wrappedFluidStackAdapter = specificDeserializer( - WrappedFluidStack::fromPacket); - - @NotNull - private final IByteBufSerializer serializer; - @NotNull - private final IByteBufDeserializer deserializer; - - private AEStackByteBufAdapter(@NotNull IByteBufSerializer serializer, - @NotNull IByteBufDeserializer deserializer) { - this.serializer = serializer; - this.deserializer = deserializer; - } - - public static < - T extends IAEStack> AEStackByteBufAdapter createAdapter(@NotNull IByteBufSerializer serializer, - @NotNull IByteBufDeserializer deserializer) { - return new AEStackByteBufAdapter<>(serializer, deserializer); - } - - public static < - T extends IAEStack> AEStackByteBufAdapter specificDeserializer(@NotNull IByteBufDeserializer deserializer) { - return createAdapter((buf, stack) -> stack.writeToPacket(buf), deserializer); - } - - @Override - public T deserialize(PacketBuffer buffer) throws IOException { - return deserializer.deserialize(buffer); - } - - @Override - public void serialize(PacketBuffer buffer, T stackToSerialize) throws IOException { - serializer.serialize(buffer, stackToSerialize); - } - - @Override - public boolean areEqual(@NotNull T t1, @NotNull T t2) { - return Objects.equals(t1, t2); - } -} diff --git a/src/main/java/gregtech/api/util/KeyUtil.java b/src/main/java/gregtech/api/util/KeyUtil.java index 9418522ef9b..7d7936a471c 100644 --- a/src/main/java/gregtech/api/util/KeyUtil.java +++ b/src/main/java/gregtech/api/util/KeyUtil.java @@ -1,7 +1,5 @@ package gregtech.api.util; -import com.cleanroommc.modularui.screen.RichTooltip; - import gregtech.api.GTValues; import gregtech.api.fluids.GTFluid; @@ -11,6 +9,7 @@ import com.cleanroommc.modularui.api.drawable.IDrawable; import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.screen.RichTooltip; import org.apache.commons.lang3.ArrayUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -152,23 +151,18 @@ public static void fluidInfo(@Nullable FluidStack stack, @NotNull RichTooltip to boolean showTooltip, boolean showMolAmount) { if (stack == null) return; - // TODO: use GTFluid.GTMaterialFluid#getLocalizedKey when 2672 merges for more accurate names - tooltip.addLine(IKey.str(stack.getLocalizedName())); + tooltip.addLine(fluid(stack)); if (showAmount) { tooltip.addLine(IKey.str("%,d L", stack.amount)); } if (showTooltip) { - for (String fluidToolTip : FluidTooltipUtil.getFluidTooltip(stack)) { - if (!tooltip.isEmpty()) { - tooltip.addLine(IKey.str(fluidToolTip)); - } - } + FluidTooltipUtil.handleFluidTooltip(tooltip, stack); } if (showMolAmount) { - GTFluidSlot.addIngotMolFluidTooltip(stack, tooltip); + FluidTooltipUtil.addIngotMolFluidTooltip(tooltip, stack); } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedFluidStack.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedFluidStack.java index 8d3223081fa..1d8471a2a3b 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedFluidStack.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedFluidStack.java @@ -4,9 +4,9 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.PacketBuffer; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fml.common.network.ByteBufUtils; import appeng.api.AEApi; import appeng.api.config.FuzzyMode; @@ -39,7 +39,7 @@ public static WrappedFluidStack fromNBT(NBTTagCompound data) { return fromFluidStack(fluidStack); } - public static WrappedFluidStack fromPacket(@NotNull ByteBuf buffer) { + public static WrappedFluidStack fromPacket(@NotNull PacketBuffer buffer) { return fromFluidStack(NetworkUtil.readFluidStack(buffer)); } @@ -143,7 +143,11 @@ public boolean fuzzyComparison(IAEFluidStack stack, FuzzyMode fuzzyMode) { @Override public void writeToPacket(ByteBuf buffer) { - ByteBufUtils.writeTag(buffer, serializeToNBT()); + writeToPacket(new PacketBuffer(buffer)); + } + + public void writeToPacket(@NotNull PacketBuffer packetBuffer) { + NetworkUtil.writeFluidStack(packetBuffer, this.delegate); } @Override diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedItemStack.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedItemStack.java index e6bf9e41710..f61e1d48724 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedItemStack.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedItemStack.java @@ -1,9 +1,11 @@ package gregtech.common.metatileentities.multi.multiblockpart.appeng.stack; +import gregtech.api.util.NetworkUtil; + import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import net.minecraftforge.fml.common.network.ByteBufUtils; +import net.minecraft.network.PacketBuffer; import appeng.api.config.FuzzyMode; import appeng.api.storage.IStorageChannel; @@ -41,8 +43,8 @@ public static WrappedItemStack fromNBT(@Nullable NBTTagCompound i) { } } - public static WrappedItemStack fromPacket(@NotNull ByteBuf data) { - return fromNBT(ByteBufUtils.readTag(data)); + public static WrappedItemStack fromPacket(@NotNull PacketBuffer data) { + return fromItemStack(NetworkUtil.readItemStack(data)); } public AEItemStack getAEStack() { @@ -138,7 +140,11 @@ public boolean fuzzyComparison(IAEItemStack stack, FuzzyMode fuzzyMode) { @Override public void writeToPacket(ByteBuf byteBuf) { - ByteBufUtils.writeTag(byteBuf, this.delegate.serializeNBT()); + writeToPacket(new PacketBuffer(byteBuf)); + } + + public void writeToPacket(@NotNull PacketBuffer packetBuffer) { + NetworkUtil.writeItemStack(packetBuffer, this.delegate); } @Override From 2b022ad8c09f2356ca9f678e7fe7c7d67ce1e341 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Tue, 17 Jun 2025 23:45:55 -0400 Subject: [PATCH 100/136] Do todo after mui2 multis merged --- .../api/mui/widget/appeng/fluid/AEFluidConfigSlot.java | 7 +------ .../api/mui/widget/appeng/item/AEItemConfigSlot.java | 7 +------ src/main/java/gregtech/client/utils/RenderUtil.java | 8 +++++--- 3 files changed, 7 insertions(+), 15 deletions(-) diff --git a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java index 27f5be037d1..61e80b9e31b 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java @@ -77,12 +77,7 @@ public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { @Override public void drawOverlay(ModularGuiContext context, WidgetTheme widgetTheme) { - // TODO: replace with RenderUtil.handleJeiGhostHighlight(this); when 2812 merges (thx ghz) - if (ModularUIJeiPlugin.hoveringOverIngredient(this)) { - GlStateManager.colorMask(true, true, true, false); - drawHighlight(getArea(), isHovering()); - GlStateManager.colorMask(true, true, true, true); - } else if (isHovering()) { + if (!RenderUtil.handleJeiGhostHighlight(this)) { drawSlotOverlay(); } diff --git a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java index ea030a6e5ec..457d8ca36e8 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java @@ -74,12 +74,7 @@ public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { @Override public void drawOverlay(ModularGuiContext context, WidgetTheme widgetTheme) { - // TODO: replace with RenderUtil.handleJeiGhostHighlight(this); when 2812 merges (thx ghz) - if (ModularUIJeiPlugin.hoveringOverIngredient(this)) { - GlStateManager.colorMask(true, true, true, false); - drawHighlight(getArea(), isHovering()); - GlStateManager.colorMask(true, true, true, true); - } else if (isHovering()) { + if (!RenderUtil.handleJeiGhostHighlight(this)) { drawSlotOverlay(); } diff --git a/src/main/java/gregtech/client/utils/RenderUtil.java b/src/main/java/gregtech/client/utils/RenderUtil.java index 9b39a891421..94336e8acdb 100644 --- a/src/main/java/gregtech/client/utils/RenderUtil.java +++ b/src/main/java/gregtech/client/utils/RenderUtil.java @@ -735,14 +735,16 @@ public void put(int element, float @NotNull... data) { return getTextureMap().getMissingSprite(); } - public static void handleJeiGhostHighlight(IWidget slot) { - if (!Mods.JustEnoughItems.isModLoaded()) return; - if (!(slot instanceof JeiGhostIngredientSlotingredientSlot)) return; + public static boolean handleJeiGhostHighlight(IWidget slot) { + if (!Mods.JustEnoughItems.isModLoaded()) return false; + if (!(slot instanceof JeiGhostIngredientSlotingredientSlot)) return false; if (ModularUIJeiPlugin.hasDraggingGhostIngredient() || ModularUIJeiPlugin.hoveringOverIngredient(ingredientSlot)) { GlStateManager.colorMask(true, true, true, false); ingredientSlot.drawHighlight(slot.getArea(), slot.isHovering()); GlStateManager.colorMask(true, true, true, true); + return true; } + return false; } } From 2ac3140b0a4da4b341d8bb6c989c8cbef3287992 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Tue, 17 Jun 2025 23:47:51 -0400 Subject: [PATCH 101/136] spotless --- .../gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java | 2 -- .../gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java | 2 -- 2 files changed, 4 deletions(-) diff --git a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java index 61e80b9e31b..ff0836d57ac 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java @@ -9,7 +9,6 @@ import gregtech.client.utils.RenderUtil; import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedFluidStack; -import net.minecraft.client.renderer.GlStateManager; import net.minecraft.item.ItemStack; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidUtil; @@ -17,7 +16,6 @@ import appeng.api.storage.data.IAEFluidStack; import com.cleanroommc.modularui.api.widget.Interactable; import com.cleanroommc.modularui.integration.jei.JeiGhostIngredientSlot; -import com.cleanroommc.modularui.integration.jei.ModularUIJeiPlugin; import com.cleanroommc.modularui.screen.RichTooltip; import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; import com.cleanroommc.modularui.theme.WidgetTheme; diff --git a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java index 457d8ca36e8..8eb09bea031 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java @@ -7,12 +7,10 @@ import gregtech.api.util.TextFormattingUtil; import gregtech.client.utils.RenderUtil; -import net.minecraft.client.renderer.GlStateManager; import net.minecraft.item.ItemStack; import appeng.api.storage.data.IAEItemStack; import com.cleanroommc.modularui.integration.jei.JeiGhostIngredientSlot; -import com.cleanroommc.modularui.integration.jei.ModularUIJeiPlugin; import com.cleanroommc.modularui.screen.RichTooltip; import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; import com.cleanroommc.modularui.theme.WidgetTheme; From 0f3a9199308d7e5a4a93cba82ce193d690a1b193 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Fri, 19 Sep 2025 15:01:55 -0400 Subject: [PATCH 102/136] Port ME output parts pt1 --- .../api/mui/sync/appeng/AESyncHandler.java | 103 +++--- .../gui/widget/appeng/AEFluidGridWidget.java | 96 ----- .../gui/widget/appeng/AEItemGridWidget.java | 100 ----- .../gui/widget/appeng/AEListGridWidget.java | 79 ---- .../appeng/slot/AEFluidDisplayWidget.java | 73 ---- .../appeng/slot/AEItemDisplayWidget.java | 60 --- .../appeng/SerializableFluidList.java | 146 -------- .../appeng/SerializableItemList.java | 107 ------ .../appeng/MetaTileEntityMEOutputBase.java | 341 ++++++++++++++++++ .../appeng/MetaTileEntityMEOutputBus.java | 212 ++++------- .../appeng/MetaTileEntityMEOutputHatch.java | 216 ++++------- .../appeng/stack/IWrappedStack.java | 23 ++ .../appeng/stack/WrappedFluidStack.java | 101 ++++-- .../appeng/stack/WrappedItemStack.java | 108 ++++-- 14 files changed, 710 insertions(+), 1055 deletions(-) delete mode 100644 src/main/java/gregtech/common/gui/widget/appeng/AEFluidGridWidget.java delete mode 100644 src/main/java/gregtech/common/gui/widget/appeng/AEItemGridWidget.java delete mode 100644 src/main/java/gregtech/common/gui/widget/appeng/AEListGridWidget.java delete mode 100644 src/main/java/gregtech/common/gui/widget/appeng/slot/AEFluidDisplayWidget.java delete mode 100644 src/main/java/gregtech/common/gui/widget/appeng/slot/AEItemDisplayWidget.java delete mode 100644 src/main/java/gregtech/common/inventory/appeng/SerializableFluidList.java delete mode 100644 src/main/java/gregtech/common/inventory/appeng/SerializableItemList.java create mode 100644 src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBase.java create mode 100644 src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/IWrappedStack.java diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java index 8a6ed0d2752..a8bbbaf1949 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java @@ -21,7 +21,8 @@ import java.io.IOException; import java.util.function.IntBinaryOperator; -public abstract class AESyncHandler> extends SyncHandler implements IJEIRecipeReceiver { +public abstract class AESyncHandler> extends SyncHandler + implements IJEIRecipeReceiver { public static final int slotSyncID = 0; public static final int setConfigID = 1; @@ -31,16 +32,16 @@ public abstract class AESyncHandler> extends SyncHandler i public static final int bulkConfigAmountChangeID = 5; protected final boolean isStocking; - protected final IConfigurableSlot[] slots; - private final IConfigurableSlot[] cached; - private final Int2ObjectMap> changeMap = new Int2ObjectOpenHashMap<>(); + protected final @NotNull IConfigurableSlot[] slots; + private final @NotNull IConfigurableSlot[] cached; + private final Int2ObjectMap<@NotNull IConfigurableSlot> changeMap = new Int2ObjectOpenHashMap<>(); - private final IByteBufAdapter byteBufAdapter; + private final IByteBufAdapter byteBufAdapter; @Nullable private final Runnable dirtyNotifier; - public AESyncHandler(IConfigurableSlot[] slots, boolean isStocking, @Nullable Runnable dirtyNotifier) { + public AESyncHandler(IConfigurableSlot[] slots, boolean isStocking, @Nullable Runnable dirtyNotifier) { this.slots = slots; this.isStocking = isStocking; this.dirtyNotifier = dirtyNotifier; @@ -48,27 +49,27 @@ public AESyncHandler(IConfigurableSlot[] slots, boolean isStocking, @Nullable this.byteBufAdapter = initializeByteBufAdapter(); } - protected abstract @NotNull IConfigurableSlot @NotNull [] initializeCache(); + protected abstract @NotNull IConfigurableSlot @NotNull [] initializeCache(); - protected abstract @NotNull IByteBufAdapter initializeByteBufAdapter(); + protected abstract @NotNull IByteBufAdapter initializeByteBufAdapter(); - public abstract boolean isStackValidForSlot(int index, @Nullable T stack); + public abstract boolean isStackValidForSlot(int index, @Nullable AEStackType stack); @SuppressWarnings("DuplicatedCode") @Override public void detectAndSendChanges(boolean init) { for (int index = 0; index < slots.length; index++) { - IConfigurableSlot slot = slots[index]; - IConfigurableSlot cache = cached[index]; + IConfigurableSlot slot = slots[index]; + IConfigurableSlot cache = cached[index]; - T newConfig = slot.getConfig(); - T cachedConfig = cache.getConfig(); - T newStock = slot.getStock(); - T cachedStock = cache.getStock(); + AEStackType newConfig = slot.getConfig(); + AEStackType cachedConfig = cache.getConfig(); + AEStackType newStock = slot.getStock(); + AEStackType cachedStock = cache.getStock(); if (init || !areAEStackCountEquals(newConfig, cachedConfig) || !areAEStackCountEquals(newStock, cachedStock)) { - IConfigurableSlot newCache = slot.copy(); + IConfigurableSlot newCache = slot.copy(); cached[index] = newCache; changeMap.put(index, newCache); } @@ -80,7 +81,7 @@ public void detectAndSendChanges(boolean init) { for (int index : changeMap.keySet()) { buf.writeVarInt(index); - T syncConfig = changeMap.get(index).getConfig(); + AEStackType syncConfig = changeMap.get(index).getConfig(); if (syncConfig == null) { buf.writeBoolean(false); } else { @@ -88,7 +89,7 @@ public void detectAndSendChanges(boolean init) { syncConfig.writeToPacket(buf); } - T syncStock = changeMap.get(index).getStock(); + AEStackType syncStock = changeMap.get(index).getStock(); if (syncStock == null) { buf.writeBoolean(false); } else { @@ -108,33 +109,37 @@ public void detectAndSendChanges(boolean init) { @Override public void readOnServer(int id, PacketBuffer buf) throws IOException { - if (id == clearConfigID) { - slots[buf.readVarInt()].setConfig(null); - } else if (id == changeConfigAmountID) { - T config = getConfig(buf.readVarInt()); - if (config != null) { - config.setStackSize(buf.readInt()); + switch (id) { + case clearConfigID -> slots[buf.readVarInt()].setConfig(null); + case changeConfigAmountID -> { + AEStackType config = getConfig(buf.readVarInt()); + if (config != null) { + config.setStackSize(buf.readInt()); + } } - } else if (id == setConfigID) { - int index = buf.readVarInt(); - T newConfig = buf.readBoolean() ? byteBufAdapter.deserialize(buf) : null; - if (isStackValidForSlot(index, newConfig)) { - IConfigurableSlot slot = slots[index]; - slot.setConfig(newConfig); + case setConfigID -> { + int index = buf.readVarInt(); + AEStackType newConfig = buf.readBoolean() ? byteBufAdapter.deserialize(buf) : null; + if (isStackValidForSlot(index, newConfig)) { + IConfigurableSlot slot = slots[index]; + slot.setConfig(newConfig); + } } - } else if (id == bulkClearConfigID) { - int indexFrom = buf.readVarInt(); - for (int index = indexFrom; index < slots.length; index++) { - IConfigurableSlot slot = slots[index]; - slot.setConfig(null); + case bulkClearConfigID -> { + int indexFrom = buf.readVarInt(); + for (int index = indexFrom; index < slots.length; index++) { + IConfigurableSlot slot = slots[index]; + slot.setConfig(null); + } } - } else if (id == bulkConfigAmountChangeID) { - int size = buf.readVarInt(); - for (int i = 0; i < size; i++) { - T config = slots[buf.readVarInt()].getConfig(); - int newAmount = buf.readInt(); - if (config != null) { - config.setStackSize(newAmount); + case bulkConfigAmountChangeID -> { + int size = buf.readVarInt(); + for (int i = 0; i < size; i++) { + AEStackType config = slots[buf.readVarInt()].getConfig(); + int newAmount = buf.readInt(); + if (config != null) { + config.setStackSize(newAmount); + } } } } @@ -146,7 +151,7 @@ public void readOnClient(int id, PacketBuffer buf) throws IOException { int size = buf.readVarInt(); for (int i = 0; i < size; i++) { int index = buf.readVarInt(); - IConfigurableSlot slot = slots[index]; + IConfigurableSlot slot = slots[index]; if (buf.readBoolean()) { slot.setConfig(byteBufAdapter.deserialize(buf)); @@ -174,7 +179,7 @@ public void clearConfigFrom(int startingIndex) { } @SideOnly(Side.CLIENT) - public void setConfig(int index, @Nullable T newConfig) { + public void setConfig(int index, @Nullable AEStackType newConfig) { syncToServer(setConfigID, buf -> { buf.writeVarInt(index); if (newConfig == null) { @@ -187,7 +192,7 @@ public void setConfig(int index, @Nullable T newConfig) { } @Nullable - public T getConfig(int index) { + public AEStackType getConfig(int index) { return slots[index].getConfig(); } @@ -196,7 +201,7 @@ public boolean hasConfig(int index) { } public int getConfigAmount(int index) { - T config = getConfig(index); + AEStackType config = getConfig(index); return config == null ? 0 : GTUtility.safeCastLongToInt(config.getStackSize()); } @@ -209,7 +214,7 @@ public void setConfigAmount(int index, int newAmount) { } @Nullable - public T getStock(int index) { + public AEStackType getStock(int index) { return slots[index].getStock(); } @@ -223,7 +228,7 @@ public void modifyConfigAmounts(@NotNull IntBinaryOperator function) { Int2IntMap changeMap = new Int2IntArrayMap(slots.length); for (int index = 0; index < slots.length; index++) { - T config = slots[index].getConfig(); + AEStackType config = slots[index].getConfig(); if (config != null) { int originalSize = GTUtility.safeCastLongToInt(config.getStackSize()); int newSize = function.applyAsInt(index, originalSize); @@ -246,7 +251,7 @@ public void modifyConfigAmounts(@NotNull IntBinaryOperator function) { } @SuppressWarnings("BooleanMethodIsAlwaysInverted") - public final boolean areAEStackCountEquals(T stack1, T stack2) { + public final boolean areAEStackCountEquals(AEStackType stack1, AEStackType stack2) { if (stack2 == stack1) { return true; } diff --git a/src/main/java/gregtech/common/gui/widget/appeng/AEFluidGridWidget.java b/src/main/java/gregtech/common/gui/widget/appeng/AEFluidGridWidget.java deleted file mode 100644 index 3f7d1358e99..00000000000 --- a/src/main/java/gregtech/common/gui/widget/appeng/AEFluidGridWidget.java +++ /dev/null @@ -1,96 +0,0 @@ -package gregtech.common.gui.widget.appeng; - -import gregtech.api.gui.Widget; -import gregtech.common.gui.widget.appeng.slot.AEFluidDisplayWidget; - -import net.minecraft.network.PacketBuffer; -import net.minecraftforge.fluids.FluidRegistry; -import net.minecraftforge.fluids.FluidStack; - -import appeng.api.storage.data.IAEFluidStack; -import appeng.api.storage.data.IItemList; -import appeng.fluids.util.AEFluidStack; -import appeng.fluids.util.FluidList; -import it.unimi.dsi.fastutil.objects.Object2LongMap; -import it.unimi.dsi.fastutil.objects.Object2LongOpenHashMap; - -/** - * @Author GlodBlock - * @Description Display fluid list - * @Date 2023/4/19-0:28 - */ -public class AEFluidGridWidget extends AEListGridWidget { - - private final Object2LongMap changeMap = new Object2LongOpenHashMap<>(); - protected final IItemList cached = new FluidList(); - protected final IItemList displayList = new FluidList(); - - public AEFluidGridWidget(int x, int y, int slotsY, IItemList internalList) { - super(x, y, slotsY, internalList); - } - - @Override - public IAEFluidStack getAt(int index) { - int cnt = 0; - for (IAEFluidStack fluid : this.displayList) { - if (cnt == index) { - return fluid; - } - cnt++; - } - return null; - } - - @Override - protected void addSlotRows(int amount) { - for (int i = 0; i < amount; i++) { - int widgetAmount = this.widgets.size(); - Widget widget = new AEFluidDisplayWidget(0, 0, this, widgetAmount); - this.addWidget(widget); - } - } - - @Override - protected void writeListChange() { - this.changeMap.clear(); - // Remove fluid - for (IAEFluidStack fluid : this.cached) { - if (this.list.findPrecise(fluid) == null || this.list.findPrecise(fluid).getStackSize() == 0) { - this.changeMap.put(fluid.copy(), -fluid.getStackSize()); - fluid.reset(); - } - } - // Change/Add fluid - for (IAEFluidStack fluid : this.list) { - IAEFluidStack cachedFluid = this.cached.findPrecise(fluid); - if (cachedFluid == null || cachedFluid.getStackSize() == 0) { - this.changeMap.put(fluid.copy(), fluid.getStackSize()); - this.cached.add(fluid.copy()); - } else { - if (cachedFluid.getStackSize() != fluid.getStackSize()) { - this.changeMap.put(fluid.copy(), fluid.getStackSize() - cachedFluid.getStackSize()); - this.cached.add(fluid.copy().setStackSize(fluid.getStackSize() - cachedFluid.getStackSize())); - } - } - } - this.writeUpdateInfo(CONTENT_CHANGE_ID, buf -> { - buf.writeVarInt(this.changeMap.size()); - for (IAEFluidStack fluid : this.changeMap.keySet()) { - buf.writeString(fluid.getFluid().getName()); - buf.writeVarLong(this.changeMap.get(fluid)); - } - }); - } - - @Override - protected void readListChange(PacketBuffer buffer) { - int size = buffer.readVarInt(); - for (int i = 0; i < size; i++) { - FluidStack fluid = FluidRegistry.getFluidStack(buffer.readString(Integer.MAX_VALUE / 16), 1); - long delta = buffer.readVarLong(); - if (fluid != null) { - this.displayList.add(AEFluidStack.fromFluidStack(fluid).setStackSize(delta)); - } - } - } -} diff --git a/src/main/java/gregtech/common/gui/widget/appeng/AEItemGridWidget.java b/src/main/java/gregtech/common/gui/widget/appeng/AEItemGridWidget.java deleted file mode 100644 index 7b036eee6af..00000000000 --- a/src/main/java/gregtech/common/gui/widget/appeng/AEItemGridWidget.java +++ /dev/null @@ -1,100 +0,0 @@ -package gregtech.common.gui.widget.appeng; - -import gregtech.api.gui.Widget; -import gregtech.common.gui.widget.appeng.slot.AEItemDisplayWidget; - -import net.minecraft.item.ItemStack; -import net.minecraft.network.PacketBuffer; - -import appeng.api.storage.data.IAEItemStack; -import appeng.api.storage.data.IItemList; -import appeng.util.item.AEItemStack; -import appeng.util.item.ItemList; -import it.unimi.dsi.fastutil.objects.Object2LongMap; -import it.unimi.dsi.fastutil.objects.Object2LongOpenHashMap; - -import java.io.IOException; - -/** - * @Author GlodBlock - * @Description Display item list - * @Date 2023/4/19-21:33 - */ -public class AEItemGridWidget extends AEListGridWidget { - - private final Object2LongMap changeMap = new Object2LongOpenHashMap<>(); - protected final IItemList cached = new ItemList(); - protected final IItemList displayList = new ItemList(); - - public AEItemGridWidget(int x, int y, int slotsY, IItemList internalList) { - super(x, y, slotsY, internalList); - } - - @Override - public IAEItemStack getAt(int index) { - int cnt = 0; - for (IAEItemStack item : this.displayList) { - if (cnt == index) { - return item; - } - cnt++; - } - return null; - } - - @Override - protected void addSlotRows(int amount) { - for (int i = 0; i < amount; i++) { - int widgetAmount = this.widgets.size(); - Widget widget = new AEItemDisplayWidget(0, 0, this, widgetAmount); - this.addWidget(widget); - } - } - - @Override - protected void writeListChange() { - this.changeMap.clear(); - // Remove item - for (IAEItemStack item : this.cached) { - if (this.list.findPrecise(item) == null || this.list.findPrecise(item).getStackSize() == 0) { - this.changeMap.put(item.copy(), -item.getStackSize()); - item.reset(); - } - } - // Change/Add item - for (IAEItemStack item : this.list) { - IAEItemStack cachedItem = this.cached.findPrecise(item); - if (cachedItem == null || cachedItem.getStackSize() == 0) { - this.changeMap.put(item.copy(), item.getStackSize()); - this.cached.add(item.copy()); - } else { - if (cachedItem.getStackSize() != item.getStackSize()) { - this.changeMap.put(item.copy(), item.getStackSize() - cachedItem.getStackSize()); - this.cached.add(item.copy().setStackSize(item.getStackSize() - cachedItem.getStackSize())); - } - } - } - this.writeUpdateInfo(CONTENT_CHANGE_ID, buf -> { - buf.writeVarInt(this.changeMap.size()); - for (IAEItemStack item : this.changeMap.keySet()) { - buf.writeItemStack(item.createItemStack()); - buf.writeVarLong(this.changeMap.get(item)); - } - }); - } - - @Override - protected void readListChange(PacketBuffer buffer) { - int size = buffer.readVarInt(); - try { - for (int i = 0; i < size; i++) { - ItemStack item = buffer.readItemStack(); - item.setCount(1); - long delta = buffer.readVarLong(); - if (!item.isEmpty()) { - this.displayList.add(AEItemStack.fromItemStack(item).setStackSize(delta)); - } - } - } catch (IOException ignore) {} - } -} diff --git a/src/main/java/gregtech/common/gui/widget/appeng/AEListGridWidget.java b/src/main/java/gregtech/common/gui/widget/appeng/AEListGridWidget.java deleted file mode 100644 index 1cdcdf4804b..00000000000 --- a/src/main/java/gregtech/common/gui/widget/appeng/AEListGridWidget.java +++ /dev/null @@ -1,79 +0,0 @@ -package gregtech.common.gui.widget.appeng; - -import gregtech.api.gui.Widget; -import gregtech.api.gui.widgets.ScrollableListWidget; - -import net.minecraft.network.PacketBuffer; - -import appeng.api.storage.data.IAEStack; -import appeng.api.storage.data.IItemList; - -/** - * @Author GlodBlock - * @Description A display only widget for {@link IItemList} - * @Date 2023/4/19-0:18 - */ -public abstract class AEListGridWidget> extends ScrollableListWidget { - - protected final IItemList list; - private final int slotAmountY; - private int slotRowsAmount = 0; - protected final static int ROW_CHANGE_ID = 2; - protected final static int CONTENT_CHANGE_ID = 3; - - public AEListGridWidget(int x, int y, int slotsY, IItemList internalList) { - super(x, y, 18 + 140, slotsY * 18); - this.list = internalList; - this.slotAmountY = slotsY; - } - - public abstract T getAt(int index); - - protected abstract void addSlotRows(int amount); - - private void removeSlotRows(int amount) { - for (int i = 0; i < amount; i++) { - Widget slotWidget = this.widgets.remove(this.widgets.size() - 1); - removeWidget(slotWidget); - } - } - - private void modifySlotRows(int delta) { - if (delta > 0) { - addSlotRows(delta); - } else { - removeSlotRows(delta); - } - } - - @Override - public void detectAndSendChanges() { - super.detectAndSendChanges(); - if (this.list == null) return; - int amountOfTypes = this.list.size(); - int slotRowsRequired = Math.max(this.slotAmountY, amountOfTypes); - if (this.slotRowsAmount != slotRowsRequired) { - int slotsToAdd = slotRowsRequired - this.slotRowsAmount; - this.slotRowsAmount = slotRowsRequired; - this.writeUpdateInfo(ROW_CHANGE_ID, buf -> buf.writeVarInt(slotsToAdd)); - this.modifySlotRows(slotsToAdd); - } - this.writeListChange(); - } - - protected abstract void writeListChange(); - - @Override - public void readUpdateInfo(int id, PacketBuffer buffer) { - super.readUpdateInfo(id, buffer); - if (id == ROW_CHANGE_ID) { - int slotsToAdd = buffer.readVarInt(); - this.modifySlotRows(slotsToAdd); - } - if (id == CONTENT_CHANGE_ID) { - this.readListChange(buffer); - } - } - - protected abstract void readListChange(PacketBuffer buffer); -} diff --git a/src/main/java/gregtech/common/gui/widget/appeng/slot/AEFluidDisplayWidget.java b/src/main/java/gregtech/common/gui/widget/appeng/slot/AEFluidDisplayWidget.java deleted file mode 100644 index 6aa47927c36..00000000000 --- a/src/main/java/gregtech/common/gui/widget/appeng/slot/AEFluidDisplayWidget.java +++ /dev/null @@ -1,73 +0,0 @@ -package gregtech.common.gui.widget.appeng.slot; - -import gregtech.api.gui.GuiTextures; -import gregtech.api.gui.IRenderContext; -import gregtech.api.gui.Widget; -import gregtech.api.util.FluidTooltipUtil; -import gregtech.api.util.Position; -import gregtech.api.util.Size; -import gregtech.client.utils.RenderUtil; -import gregtech.common.gui.widget.appeng.AEListGridWidget; - -import net.minecraft.item.ItemStack; - -import appeng.api.storage.data.IAEFluidStack; - -import java.util.ArrayList; -import java.util.List; - -/** - * @Author GlodBlock - * @Description Display a certain {@link IAEFluidStack} element. - * @Date 2023/4/19-0:30 - */ -public class AEFluidDisplayWidget extends Widget { - - private final AEListGridWidget gridWidget; - private final int index; - - public AEFluidDisplayWidget(int x, int y, AEListGridWidget gridWidget, int index) { - super(new Position(x, y), new Size(18, 18)); - this.gridWidget = gridWidget; - this.index = index; - } - - @Override - public void drawInBackground(int mouseX, int mouseY, float partialTicks, IRenderContext context) { - super.drawInBackground(mouseX, mouseY, partialTicks, context); - Position position = getPosition(); - IAEFluidStack fluid = this.gridWidget.getAt(this.index); - GuiTextures.FLUID_SLOT.draw(position.x, position.y, 18, 18); - GuiTextures.NUMBER_BACKGROUND.draw(position.x + 18, position.y, 140, 18); - int stackX = position.x + 1; - int stackY = position.y + 1; - if (fluid != null) { - RenderUtil.drawFluidForGui(fluid.getFluidStack(), fluid.getFluidStack().amount, stackX, stackY, 17, 17); - String amountStr = String.format("x%,d", fluid.getStackSize()); - drawText(amountStr, stackX + 20, stackY + 5, 1, 0xFFFFFFFF); - } - if (isMouseOverElement(mouseX, mouseY)) { - drawSelectionOverlay(stackX, stackY, 16, 16); - } - } - - @Override - public void drawInForeground(int mouseX, int mouseY) { - if (isMouseOverElement(mouseX, mouseY)) { - IAEFluidStack fluid = this.gridWidget.getAt(this.index); - if (fluid != null) { - List hoverStringList = new ArrayList<>(); - hoverStringList.add(fluid.getFluidStack().getLocalizedName()); - hoverStringList.add(String.format("%,d L", fluid.getStackSize())); - List formula = FluidTooltipUtil.getFluidTooltip(fluid.getFluidStack()); - if (formula != null) { - for (String s : formula) { - if (s.isEmpty()) continue; - hoverStringList.add(s); - } - } - drawHoveringText(ItemStack.EMPTY, hoverStringList, -1, mouseX, mouseY); - } - } - } -} diff --git a/src/main/java/gregtech/common/gui/widget/appeng/slot/AEItemDisplayWidget.java b/src/main/java/gregtech/common/gui/widget/appeng/slot/AEItemDisplayWidget.java deleted file mode 100644 index 62ffe78c113..00000000000 --- a/src/main/java/gregtech/common/gui/widget/appeng/slot/AEItemDisplayWidget.java +++ /dev/null @@ -1,60 +0,0 @@ -package gregtech.common.gui.widget.appeng.slot; - -import gregtech.api.gui.GuiTextures; -import gregtech.api.gui.IRenderContext; -import gregtech.api.gui.Widget; -import gregtech.api.util.Position; -import gregtech.api.util.Size; -import gregtech.common.gui.widget.appeng.AEListGridWidget; - -import net.minecraft.item.ItemStack; - -import appeng.api.storage.data.IAEItemStack; - -/** - * @Author GlodBlock - * @Description Display a certain {@link IAEItemStack} element. - * @Date 2023/4/19-21:23 - */ -public class AEItemDisplayWidget extends Widget { - - private final AEListGridWidget gridWidget; - private final int index; - - public AEItemDisplayWidget(int x, int y, AEListGridWidget gridWidget, int index) { - super(new Position(x, y), new Size(18, 18)); - this.gridWidget = gridWidget; - this.index = index; - } - - @Override - public void drawInBackground(int mouseX, int mouseY, float partialTicks, IRenderContext context) { - super.drawInBackground(mouseX, mouseY, partialTicks, context); - Position position = getPosition(); - IAEItemStack item = this.gridWidget.getAt(this.index); - GuiTextures.SLOT.draw(position.x, position.y, 18, 18); - GuiTextures.NUMBER_BACKGROUND.draw(position.x + 18, position.y, 140, 18); - int stackX = position.x + 1; - int stackY = position.y + 1; - if (item != null) { - ItemStack realStack = item.createItemStack(); - realStack.setCount(1); - drawItemStack(realStack, stackX, stackY, null); - String amountStr = String.format("x%,d", item.getStackSize()); - drawText(amountStr, stackX + 20, stackY + 5, 1, 0xFFFFFFFF); - } - if (isMouseOverElement(mouseX, mouseY)) { - drawSelectionOverlay(stackX, stackY, 16, 16); - } - } - - @Override - public void drawInForeground(int mouseX, int mouseY) { - if (isMouseOverElement(mouseX, mouseY)) { - IAEItemStack item = this.gridWidget.getAt(this.index); - if (item != null) { - drawHoveringText(item.createItemStack(), getItemToolTip(item.createItemStack()), -1, mouseX, mouseY); - } - } - } -} diff --git a/src/main/java/gregtech/common/inventory/appeng/SerializableFluidList.java b/src/main/java/gregtech/common/inventory/appeng/SerializableFluidList.java deleted file mode 100644 index 2e6ac5ca429..00000000000 --- a/src/main/java/gregtech/common/inventory/appeng/SerializableFluidList.java +++ /dev/null @@ -1,146 +0,0 @@ -package gregtech.common.inventory.appeng; - -import net.minecraft.nbt.NBTBase; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; -import net.minecraftforge.common.util.INBTSerializable; -import net.minecraftforge.fluids.Fluid; -import net.minecraftforge.fluids.FluidStack; - -import appeng.api.config.FuzzyMode; -import appeng.api.storage.data.IAEFluidStack; -import appeng.api.storage.data.IItemList; -import appeng.fluids.util.AEFluidStack; -import appeng.fluids.util.MeaningfulFluidIterator; -import it.unimi.dsi.fastutil.objects.Reference2ObjectMap; -import it.unimi.dsi.fastutil.objects.Reference2ObjectOpenHashMap; -import org.jetbrains.annotations.NotNull; - -import java.util.Collection; -import java.util.Collections; -import java.util.Iterator; - -/** - * @Author GlodBlock - * @Description A serializable {@link IItemList} from AE2, specially improved for fluid. - * @Date 2023/4/18-23:52 - */ -public class SerializableFluidList implements IItemList, INBTSerializable { - - private final Reference2ObjectMap records = new Reference2ObjectOpenHashMap<>(); - - public SerializableFluidList() {} - - @Override - public void add(IAEFluidStack fluid) { - if (fluid != null) { - this.getOrCreateRecord(fluid).add(fluid); - } - } - - @Override - public IAEFluidStack findPrecise(IAEFluidStack fluid) { - if (fluid == null) { - return null; - } else { - return this.records.get(fluid.getFluid()); - } - } - - @Override - public Collection findFuzzy(IAEFluidStack filter, FuzzyMode fuzzy) { - IAEFluidStack stack = findPrecise(filter); - return stack != null ? Collections.singleton(stack) : Collections.emptyList(); - } - - @Override - public boolean isEmpty() { - return !this.iterator().hasNext(); - } - - private IAEFluidStack getOrCreateRecord(@NotNull IAEFluidStack fluid) { - return this.records.computeIfAbsent(fluid.getFluid(), - key -> AEFluidStack.fromFluidStack(new FluidStack(key, 0))); - } - - private IAEFluidStack getRecord(@NotNull IAEFluidStack fluid) { - return this.records.get(fluid.getFluid()); - } - - @Override - public void addStorage(IAEFluidStack fluid) { - if (fluid != null) { - this.getOrCreateRecord(fluid).incStackSize(fluid.getStackSize()); - } - } - - @Override - public void addCrafting(IAEFluidStack fluid) { - if (fluid != null) { - IAEFluidStack record = this.getRecord(fluid); - if (record != null) { - record.setCraftable(true); - } - } - } - - @Override - public void addRequestable(IAEFluidStack fluid) { - if (fluid != null) { - IAEFluidStack record = this.getRecord(fluid); - if (record != null) { - record.setCountRequestable(record.getCountRequestable() + fluid.getCountRequestable()); - } - } - } - - @Override - public IAEFluidStack getFirstItem() { - for (final IAEFluidStack fluid : this) { - return fluid; - } - return null; - } - - @Override - public int size() { - return this.records.size(); - } - - @Override - public Iterator iterator() { - return new MeaningfulFluidIterator<>(this.records.values().iterator()); - } - - @Override - public void resetStatus() { - for (final IAEFluidStack i : this) { - i.reset(); - } - } - - @Override - public NBTTagList serializeNBT() { - NBTTagList list = new NBTTagList(); - for (IAEFluidStack fluid : this) { - if (fluid != null) { - NBTTagCompound tag = new NBTTagCompound(); - fluid.writeToNBT(tag); - list.appendTag(tag); - } - } - return list; - } - - @Override - public void deserializeNBT(NBTTagList list) { - for (NBTBase tag : list) { - if (tag instanceof NBTTagCompound) { - IAEFluidStack fluid = AEFluidStack.fromNBT((NBTTagCompound) tag); - if (fluid != null) { - this.records.put(fluid.getFluid(), fluid); - } - } - } - } -} diff --git a/src/main/java/gregtech/common/inventory/appeng/SerializableItemList.java b/src/main/java/gregtech/common/inventory/appeng/SerializableItemList.java deleted file mode 100644 index ad09fa2e5b6..00000000000 --- a/src/main/java/gregtech/common/inventory/appeng/SerializableItemList.java +++ /dev/null @@ -1,107 +0,0 @@ -package gregtech.common.inventory.appeng; - -import net.minecraft.nbt.NBTBase; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; -import net.minecraftforge.common.util.INBTSerializable; - -import appeng.api.config.FuzzyMode; -import appeng.api.storage.data.IAEItemStack; -import appeng.api.storage.data.IItemList; -import appeng.util.item.AEItemStack; -import appeng.util.item.ItemList; - -import java.util.Collection; -import java.util.Iterator; - -/** - * @Author GlodBlock - * @Description A serializable {@link IItemList} from AE2 - * @Date 2023/4/18-23:52 - */ -public class SerializableItemList implements IItemList, INBTSerializable { - - private final ItemList parent = new ItemList(); - - public SerializableItemList() {} - - @Override - public void addStorage(IAEItemStack stack) { - this.parent.addStorage(stack); - } - - @Override - public void addCrafting(IAEItemStack stack) { - this.parent.addStorage(stack); - } - - @Override - public void addRequestable(IAEItemStack stack) { - this.parent.addRequestable(stack); - } - - @Override - public IAEItemStack getFirstItem() { - return this.parent.getFirstItem(); - } - - @Override - public int size() { - return this.parent.size(); - } - - @Override - public Iterator iterator() { - return this.parent.iterator(); - } - - @Override - public void resetStatus() { - this.parent.resetStatus(); - } - - @Override - public void add(IAEItemStack stack) { - this.parent.add(stack); - } - - @Override - public IAEItemStack findPrecise(IAEItemStack stack) { - return this.parent.findPrecise(stack); - } - - @Override - public Collection findFuzzy(IAEItemStack stack, FuzzyMode fuzzyMode) { - return this.parent.findFuzzy(stack, fuzzyMode); - } - - @Override - public boolean isEmpty() { - return this.parent.isEmpty(); - } - - @Override - public NBTTagList serializeNBT() { - NBTTagList list = new NBTTagList(); - for (IAEItemStack item : this) { - if (item != null) { - NBTTagCompound tag = new NBTTagCompound(); - item.writeToNBT(tag); - list.appendTag(tag); - } - } - return list; - } - - @Override - public void deserializeNBT(NBTTagList list) { - for (NBTBase tag : list) { - if (tag instanceof NBTTagCompound) { - IAEItemStack item = AEItemStack.fromNBT((NBTTagCompound) tag); - if (item != null) { - this.parent.add(item); - } - } - } - } -} diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBase.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBase.java new file mode 100644 index 00000000000..9052eb60431 --- /dev/null +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBase.java @@ -0,0 +1,341 @@ +package gregtech.common.metatileentities.multi.multiblockpart.appeng; + +import gregtech.api.capability.GregtechDataCodes; +import gregtech.api.capability.GregtechTileCapabilities; +import gregtech.api.capability.INotifiableHandler; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.mui.GTGuiTextures; +import gregtech.api.mui.GTGuis; +import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.IWrappedStack; +import gregtech.common.mui.widget.ScrollableTextWidget; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.PacketBuffer; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.World; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +import appeng.api.config.Actionable; +import appeng.api.storage.IMEMonitor; +import appeng.api.storage.IStorageChannel; +import appeng.api.storage.data.IAEStack; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.drawable.text.RichText; +import com.cleanroommc.modularui.factory.PosGuiData; +import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.utils.serialization.IByteBufDeserializer; +import com.cleanroommc.modularui.value.sync.BooleanSyncValue; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.value.sync.SyncHandler; +import com.cleanroommc.modularui.widgets.SlotGroupWidget; +import it.unimi.dsi.fastutil.Hash; +import it.unimi.dsi.fastutil.ints.IntOpenHashSet; +import it.unimi.dsi.fastutil.ints.IntSet; +import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +public abstract class MetaTileEntityMEOutputBase, RealStackType> + extends MetaTileEntityAEHostableChannelPart { + + public final static String WORKING_TAG = "WorkingEnabled"; + + protected boolean workingEnabled = true; + protected List<@NotNull IWrappedStack> internalBuffer; + + public MetaTileEntityMEOutputBase(ResourceLocation metaTileEntityId, int tier, + Class> storageChannel) { + super(metaTileEntityId, tier, true, storageChannel); + } + + @Override + protected void initializeInventory() { + super.initializeInventory(); + this.internalBuffer = new ObjectArrayList<>(); + } + + @Override + public void update() { + super.update(); + if (!getWorld().isRemote && this.workingEnabled && this.shouldSyncME() && updateMEStatus()) { + if (this.internalBuffer.isEmpty()) return; + + IMEMonitor monitor = getMonitor(); + if (monitor == null) return; + + Iterator> internalBufferIterator = internalBuffer.iterator(); + while (internalBufferIterator.hasNext()) { + IWrappedStack stackInBuffer = internalBufferIterator.next(); + // We have to create an AEItem/FluidStack here, or it'll cause a CCE in ItemVariantList#L35 + AEStackType notPushedToNetwork = monitor.injectItems(stackInBuffer.copyAsAEStack(), Actionable.MODULATE, + getActionSource()); + if (notPushedToNetwork != null && notPushedToNetwork.getStackSize() > 0L) { + stackInBuffer.setStackSize(notPushedToNetwork.getStackSize()); + } else { + internalBufferIterator.remove(); + } + } + } + } + + protected abstract @NotNull IByteBufDeserializer> getDeserializer(); + + @SideOnly(Side.CLIENT) + protected abstract void addStackLine(@NotNull RichText text, + @NotNull IWrappedStack wrappedStack); + + @Override + public boolean usesMui2() { + return true; + } + + @Override + public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManager) { + BooleanSyncValue onlineSync = new BooleanSyncValue(this::isOnline); + panelSyncManager.syncValue("online", 0, onlineSync); + + WrappedStackSyncHandler bufferSync = new WrappedStackSyncHandler<>(internalBuffer, + getDeserializer()); + panelSyncManager.syncValue("buffer", 0, bufferSync); + + ScrollableTextWidget textList = new ScrollableTextWidget() + .textBuilder(text -> { + for (IWrappedStack wrappedStack : bufferSync) { + addStackLine(text, wrappedStack); + } + }); + + bufferSync.setChangeListener(textList::markDirty); + + return GTGuis.createPanel(this, 176, 18 + 18 * 4 + 94) + .child(IKey.lang(getMetaFullName()) + .asWidget() + .pos(5, 5)) + .child(IKey.lang(() -> onlineSync.getBoolValue() ? + "gregtech.gui.me_network.online" : "gregtech.gui.me_network.offline") + .asWidget() + .pos(5, 15)) + .child(textList.pos(9, 25 + 4) + .size(158, 18 * 4 - 8) + .background(GTGuiTextures.DISPLAY.asIcon() + .margin(-4))) + .child(SlotGroupWidget.playerInventory()); + } + + @Override + public void onRemoval() { + IMEMonitor monitor = getMonitor(); + if (monitor != null) { + for (IWrappedStack stack : this.internalBuffer) { + monitor.injectItems(stack.copy(), Actionable.MODULATE, this.getActionSource()); + } + } + + super.onRemoval(); + } + + @Override + public boolean isWorkingEnabled() { + return this.workingEnabled; + } + + @Override + public void setWorkingEnabled(boolean workingEnabled) { + this.workingEnabled = workingEnabled; + + World world = this.getWorld(); + if (world != null && !world.isRemote) { + writeCustomData(GregtechDataCodes.WORKING_ENABLED, buf -> buf.writeBoolean(workingEnabled)); + } + } + + @Override + public T getCapability(Capability capability, EnumFacing side) { + if (capability == GregtechTileCapabilities.CAPABILITY_CONTROLLABLE) { + return GregtechTileCapabilities.CAPABILITY_CONTROLLABLE.cast(this); + } + + return super.getCapability(capability, side); + } + + @Override + public void writeInitialSyncData(PacketBuffer buf) { + super.writeInitialSyncData(buf); + buf.writeBoolean(workingEnabled); + } + + @Override + public void receiveInitialSyncData(PacketBuffer buf) { + super.receiveInitialSyncData(buf); + this.workingEnabled = buf.readBoolean(); + } + + @Override + public NBTTagCompound writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + data.setBoolean(WORKING_TAG, this.workingEnabled); + return data; + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + if (data.hasKey(WORKING_TAG)) { + this.workingEnabled = data.getBoolean(WORKING_TAG); + } + } + + protected static abstract class InaccessibleInfiniteHandler, + RealStackType> implements INotifiableHandler { + + protected final List> internalBuffer; + protected final List notifiableEntities = new ArrayList<>(); + protected final MetaTileEntity holder; + protected final Hash.Strategy strategy; + + public InaccessibleInfiniteHandler(@NotNull MetaTileEntity holder, + @NotNull List> internalBuffer, + @NotNull MetaTileEntity mte, + @NotNull Hash.Strategy strategy) { + this.holder = holder; + this.internalBuffer = internalBuffer; + this.notifiableEntities.add(mte); + this.strategy = strategy; + } + + protected void add(@NotNull RealStackType stackToAdd, int amount) { + for (IWrappedStack bufferedAEStack : internalBuffer) { + long bufferedAEStackSize = bufferedAEStack.getStackSize(); + RealStackType bufferStack = bufferedAEStack.getDefinition(); + if (strategy.equals(bufferStack, stackToAdd) && bufferedAEStackSize < Long.MAX_VALUE) { + int amountToMerge = (int) Math.min(amount, Long.MAX_VALUE - bufferedAEStackSize); + bufferedAEStack.incStackSize(amountToMerge); + amount -= amountToMerge; + + if (amount == 0) break; + } + } + + if (amount > 0) { + internalBuffer.add(wrapStack(stackToAdd, amount)); + } + } + + protected abstract @NotNull IWrappedStack wrapStack(@NotNull RealStackType stack, + long amount); + + @Override + public void addNotifiableMetaTileEntity(MetaTileEntity metaTileEntity) { + this.notifiableEntities.add(metaTileEntity); + } + + @Override + public void removeNotifiableMetaTileEntity(MetaTileEntity metaTileEntity) { + this.notifiableEntities.remove(metaTileEntity); + } + + protected void trigger() { + this.holder.markDirty(); + for (MetaTileEntity metaTileEntity : this.notifiableEntities) { + if (metaTileEntity != null && metaTileEntity.isValid()) { + this.addToNotifiedList(metaTileEntity, this, true); + } + } + } + } + + private static class WrappedStackSyncHandler, + RealStackType> extends SyncHandler implements Iterable> { + + private final List<@NotNull IWrappedStack> source; + private final ObjectArrayList<@NotNull IWrappedStack> cache = new ObjectArrayList<>(); + private final IByteBufDeserializer<@NotNull IWrappedStack> deserializer; + private final IntSet changedIndexes = new IntOpenHashSet(); + @Nullable + private Runnable changeListener; + + public WrappedStackSyncHandler(@NotNull List> source, + @NotNull IByteBufDeserializer> deserializer) { + this.source = source; + this.deserializer = deserializer; + } + + @Override + public void detectAndSendChanges(boolean init) { + int sourceSize = source.size(); + boolean cacheSizeChange = cache.size() != sourceSize; + if (cacheSizeChange) { + cache.size(sourceSize); + } + + for (int index = 0; index < source.size(); index++) { + IWrappedStack newStack = source.get(index); + IWrappedStack cachedStack = cache.get(index); + + if (init || !newStack.delegateAndSizeEqual(cachedStack)) { + IWrappedStack copy = newStack.copyWrapped(); + changedIndexes.add(index); + cache.set(index, copy); + } + } + + if (!changedIndexes.isEmpty() || cacheSizeChange) { + syncToClient(0, buf -> { + buf.writeVarInt(cache.size()); + buf.writeVarInt(changedIndexes.size()); + + for (int index : changedIndexes) { + buf.writeVarInt(index); + cache.get(index).writeToPacketBuffer(buf); + } + }); + + onChange(); + changedIndexes.clear(); + } + } + + @Override + public void readOnClient(int id, PacketBuffer buf) throws IOException { + if (id != 0) return; + + cache.size(buf.readVarInt()); + int changed = buf.readVarInt(); + for (int ignore = 0; ignore < changed; ignore++) { + int index = buf.readVarInt(); + IWrappedStack newStack = deserializer.deserialize(buf); + cache.set(index, newStack); + } + + onChange(); + } + + @Override + public void readOnServer(int id, PacketBuffer buf) { + // This sync handler is Server -> Client only. + } + + @Override + public @NotNull Iterator> iterator() { + return cache.iterator(); + } + + public void setChangeListener(@NotNull Runnable listener) { + this.changeListener = listener; + } + + private void onChange() { + if (changeListener != null) { + changeListener.run(); + } + } + } +} diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBus.java index 847bcfaf2a1..f46c1f309c5 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBus.java @@ -1,92 +1,48 @@ package gregtech.common.metatileentities.multi.multiblockpart.appeng; import gregtech.api.GTValues; -import gregtech.api.capability.GregtechDataCodes; -import gregtech.api.capability.GregtechTileCapabilities; -import gregtech.api.capability.INotifiableHandler; -import gregtech.api.gui.GuiTextures; -import gregtech.api.gui.ModularUI; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.metatileentity.multiblock.*; +import gregtech.api.mui.drawable.GTObjectDrawable; +import gregtech.api.util.GTLog; +import gregtech.api.util.ItemStackHashStrategy; import gregtech.client.renderer.texture.Textures; -import gregtech.common.gui.widget.appeng.AEItemGridWidget; -import gregtech.common.inventory.appeng.SerializableItemList; +import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.IWrappedStack; +import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedItemStack; import net.minecraft.client.resources.I18n; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTBase; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; -import net.minecraft.network.PacketBuffer; -import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; import net.minecraft.world.World; -import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.util.Constants; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.items.IItemHandlerModifiable; -import appeng.api.config.Actionable; -import appeng.api.storage.IMEMonitor; import appeng.api.storage.channels.IItemStorageChannel; import appeng.api.storage.data.IAEItemStack; -import appeng.api.storage.data.IItemList; -import appeng.util.item.AEItemStack; import codechicken.lib.render.CCRenderState; import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.drawable.text.RichText; +import com.cleanroommc.modularui.utils.serialization.IByteBufDeserializer; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; import java.util.List; -public class MetaTileEntityMEOutputBus extends MetaTileEntityAEHostableChannelPart +public class MetaTileEntityMEOutputBus extends MetaTileEntityMEOutputBase implements IMultiblockAbilityPart { public final static String ITEM_BUFFER_TAG = "ItemBuffer"; - public final static String WORKING_TAG = "WorkingEnabled"; - private boolean workingEnabled = true; - private SerializableItemList internalBuffer; public MetaTileEntityMEOutputBus(ResourceLocation metaTileEntityId) { - super(metaTileEntityId, GTValues.EV, true, IItemStorageChannel.class); - } - - @Override - protected void initializeInventory() { - this.internalBuffer = new SerializableItemList(); - super.initializeInventory(); - } - - @Override - public void update() { - super.update(); - if (!getWorld().isRemote && this.workingEnabled && this.shouldSyncME() && this.updateMEStatus()) { - if (this.internalBuffer.isEmpty()) return; - - IMEMonitor monitor = getMonitor(); - if (monitor == null) return; - - for (IAEItemStack item : this.internalBuffer) { - IAEItemStack notInserted = monitor.injectItems(item.copy(), Actionable.MODULATE, getActionSource()); - if (notInserted != null && notInserted.getStackSize() > 0) { - item.setStackSize(notInserted.getStackSize()); - } else { - item.reset(); - } - } - } - } - - @Override - public void onRemoval() { - IMEMonitor monitor = getMonitor(); - if (monitor != null) { - for (IAEItemStack item : this.internalBuffer) { - monitor.injectItems(item.copy(), Actionable.MODULATE, this.getActionSource()); - } - } - super.onRemoval(); + super(metaTileEntityId, GTValues.EV, IItemStorageChannel.class); } @Override @@ -95,72 +51,59 @@ public MetaTileEntity createMetaTileEntity(IGregTechTileEntity iGregTechTileEnti } @Override - protected ModularUI createUI(EntityPlayer entityPlayer) { - ModularUI.Builder builder = ModularUI - .builder(GuiTextures.BACKGROUND, 176, 18 + 18 * 4 + 94) - .label(10, 5, getMetaFullName()); - // ME Network status - builder.dynamicLabel(10, 15, () -> isOnline() ? - I18n.format("gregtech.gui.me_network.online") : - I18n.format("gregtech.gui.me_network.offline"), - 0x404040); - builder.label(10, 25, "gregtech.gui.waiting_list", 0xFFFFFFFF); - builder.widget(new AEItemGridWidget(10, 35, 3, this.internalBuffer)); - - builder.bindPlayerInventory(entityPlayer.inventory, GuiTextures.SLOT, 7, 18 + 18 * 4 + 12); - return builder.build(this.getHolder(), entityPlayer); + protected @NotNull IByteBufDeserializer> getDeserializer() { + return WrappedItemStack::fromPacket; } + @SideOnly(Side.CLIENT) @Override - public boolean isWorkingEnabled() { - return this.workingEnabled; + protected void addStackLine(@NotNull RichText text, @NotNull IWrappedStack wrappedStack) { + ItemStack stack = wrappedStack.getDefinition(); + text.add(new GTObjectDrawable(stack, 0) + .asIcon() + .asHoverable() + // Auto update has to be true for "Press CTRL for Advanced Info" to work + .tooltipAutoUpdate(true) + .tooltipBuilder(tooltip -> tooltip.addFromItem(stack))); + text.space(); + text.addLine(IKey.str("%dx %s", wrappedStack.getStackSize(), stack.getDisplayName()) + .color(0xFFFFFF)); } @Override - public void setWorkingEnabled(boolean workingEnabled) { - this.workingEnabled = workingEnabled; - World world = this.getWorld(); - if (world != null && !world.isRemote) { - writeCustomData(GregtechDataCodes.WORKING_ENABLED, buf -> buf.writeBoolean(workingEnabled)); - } - } + public NBTTagCompound writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); - @Override - public T getCapability(Capability capability, EnumFacing side) { - if (capability == GregtechTileCapabilities.CAPABILITY_CONTROLLABLE) { - return GregtechTileCapabilities.CAPABILITY_CONTROLLABLE.cast(this); + NBTTagList nbtList = new NBTTagList(); + for (IWrappedStack stack : internalBuffer) { + NBTTagCompound stackTag = new NBTTagCompound(); + stack.writeToNBT(stackTag); + nbtList.appendTag(stackTag); } - return super.getCapability(capability, side); - } + data.setTag(ITEM_BUFFER_TAG, nbtList); - @Override - public void writeInitialSyncData(PacketBuffer buf) { - super.writeInitialSyncData(buf); - buf.writeBoolean(workingEnabled); - } - - @Override - public void receiveInitialSyncData(PacketBuffer buf) { - super.receiveInitialSyncData(buf); - this.workingEnabled = buf.readBoolean(); - } - - @Override - public NBTTagCompound writeToNBT(NBTTagCompound data) { - super.writeToNBT(data); - data.setBoolean(WORKING_TAG, this.workingEnabled); - data.setTag(ITEM_BUFFER_TAG, this.internalBuffer.serializeNBT()); return data; } @Override public void readFromNBT(NBTTagCompound data) { super.readFromNBT(data); - if (data.hasKey(WORKING_TAG)) { - this.workingEnabled = data.getBoolean(WORKING_TAG); - } - if (data.hasKey(ITEM_BUFFER_TAG, 9)) { - this.internalBuffer.deserializeNBT((NBTTagList) data.getTag(ITEM_BUFFER_TAG)); + for (NBTBase tag : data.getTagList(ITEM_BUFFER_TAG, Constants.NBT.TAG_COMPOUND)) { + NBTTagCompound tagCompound = (NBTTagCompound) tag; + + WrappedItemStack stack; + // Migrate from AEItemStacks to WrappedItemStacks + if (tagCompound.getBoolean("wrapped")) { + stack = WrappedItemStack.fromNBT(tagCompound); + } else { + stack = WrappedItemStack.fromItemStack(new ItemStack(tagCompound), tagCompound.getLong("Cnt")); + } + + if (stack == null) { + GTLog.logger.error("Error reading AEFluidStack from ME Output Hatch buffer tag list"); + } else { + internalBuffer.add(stack); + } } } @@ -200,28 +143,23 @@ public void registerAbilities(@NotNull AbilityInstances abilityInstances) { @Override public void addToMultiBlock(MultiblockControllerBase controllerBase) { super.addToMultiBlock(controllerBase); - if (controllerBase instanceof MultiblockWithDisplayBase) { - ((MultiblockWithDisplayBase) controllerBase).enableItemInfSink(); + if (controllerBase instanceof MultiblockWithDisplayBase multiblockWithDisplayBase) { + multiblockWithDisplayBase.enableItemInfSink(); } } - private static class InaccessibleInfiniteSlot implements IItemHandlerModifiable, INotifiableHandler { - - private final IItemList internalBuffer; - private final List notifiableEntities = new ArrayList<>(); - private final MetaTileEntity holder; + private static class InaccessibleInfiniteSlot extends InaccessibleInfiniteHandler + implements IItemHandlerModifiable { - public InaccessibleInfiniteSlot(MetaTileEntity holder, IItemList internalBuffer, - MetaTileEntity mte) { - this.holder = holder; - this.internalBuffer = internalBuffer; - this.notifiableEntities.add(mte); + public InaccessibleInfiniteSlot(@NotNull MetaTileEntity holder, + @NotNull List> internalBuffer, + @NotNull MetaTileEntity mte) { + super(holder, internalBuffer, mte, ItemStackHashStrategy.comparingAllButCount()); } @Override public void setStackInSlot(int slot, @NotNull ItemStack stack) { - this.internalBuffer.add(AEItemStack.fromItemStack(stack)); - this.holder.markDirty(); + insertItem(slot, stack, false); this.trigger(); } @@ -238,15 +176,16 @@ public ItemStack getStackInSlot(int slot) { @NotNull @Override - public ItemStack insertItem(int slot, @NotNull ItemStack stack, boolean simulate) { - if (stack.isEmpty()) { + public ItemStack insertItem(int slot, @NotNull ItemStack stackToInsert, boolean simulate) { + if (stackToInsert.isEmpty()) { return ItemStack.EMPTY; } + if (!simulate) { - this.internalBuffer.add(AEItemStack.fromItemStack(stack)); - this.holder.markDirty(); + add(stackToInsert, stackToInsert.getCount()); + this.trigger(); } - this.trigger(); + return ItemStack.EMPTY; } @@ -262,21 +201,8 @@ public int getSlotLimit(int slot) { } @Override - public void addNotifiableMetaTileEntity(MetaTileEntity metaTileEntity) { - this.notifiableEntities.add(metaTileEntity); - } - - @Override - public void removeNotifiableMetaTileEntity(MetaTileEntity metaTileEntity) { - this.notifiableEntities.remove(metaTileEntity); - } - - private void trigger() { - for (MetaTileEntity metaTileEntity : this.notifiableEntities) { - if (metaTileEntity != null && metaTileEntity.isValid()) { - this.addToNotifiedList(metaTileEntity, this, true); - } - } + protected @NotNull WrappedItemStack wrapStack(@NotNull ItemStack stack, long amount) { + return WrappedItemStack.fromItemStack(stack, amount); } } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputHatch.java index ecbf4bcc989..215a0718475 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputHatch.java @@ -1,94 +1,52 @@ package gregtech.common.metatileentities.multi.multiblockpart.appeng; import gregtech.api.GTValues; -import gregtech.api.capability.GregtechDataCodes; -import gregtech.api.capability.GregtechTileCapabilities; -import gregtech.api.capability.INotifiableHandler; -import gregtech.api.gui.GuiTextures; -import gregtech.api.gui.ModularUI; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.metatileentity.multiblock.*; +import gregtech.api.mui.drawable.GTObjectDrawable; +import gregtech.api.util.FluidStackHashStrategy; +import gregtech.api.util.FluidTooltipUtil; +import gregtech.api.util.GTLog; +import gregtech.api.util.KeyUtil; import gregtech.client.renderer.texture.Textures; -import gregtech.common.gui.widget.appeng.AEFluidGridWidget; -import gregtech.common.inventory.appeng.SerializableFluidList; +import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.IWrappedStack; +import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedFluidStack; import net.minecraft.client.resources.I18n; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTBase; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; -import net.minecraft.network.PacketBuffer; -import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; import net.minecraft.world.World; -import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.util.Constants; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidTankInfo; import net.minecraftforge.fluids.IFluidTank; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; -import appeng.api.config.Actionable; -import appeng.api.storage.IMEMonitor; import appeng.api.storage.channels.IFluidStorageChannel; import appeng.api.storage.data.IAEFluidStack; -import appeng.api.storage.data.IItemList; -import appeng.fluids.util.AEFluidStack; import codechicken.lib.render.CCRenderState; import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.drawable.text.RichText; +import com.cleanroommc.modularui.utils.serialization.IByteBufDeserializer; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; import java.util.List; -public class MetaTileEntityMEOutputHatch extends MetaTileEntityAEHostableChannelPart +public class MetaTileEntityMEOutputHatch extends MetaTileEntityMEOutputBase implements IMultiblockAbilityPart { public final static String FLUID_BUFFER_TAG = "FluidBuffer"; - public final static String WORKING_TAG = "WorkingEnabled"; - private boolean workingEnabled = true; - private SerializableFluidList internalBuffer; public MetaTileEntityMEOutputHatch(ResourceLocation metaTileEntityId) { - super(metaTileEntityId, GTValues.EV, true, IFluidStorageChannel.class); - } - - @Override - protected void initializeInventory() { - this.internalBuffer = new SerializableFluidList(); - super.initializeInventory(); - } - - @Override - public void update() { - super.update(); - if (!getWorld().isRemote && this.workingEnabled && this.shouldSyncME() && updateMEStatus()) { - if (this.internalBuffer.isEmpty()) return; - - IMEMonitor monitor = getMonitor(); - if (monitor == null) return; - - for (IAEFluidStack fluid : this.internalBuffer) { - IAEFluidStack notInserted = monitor.injectItems(fluid.copy(), Actionable.MODULATE, getActionSource()); - if (notInserted != null && notInserted.getStackSize() > 0) { - fluid.setStackSize(notInserted.getStackSize()); - } else { - fluid.reset(); - } - } - } - } - - @Override - public void onRemoval() { - IMEMonitor monitor = getMonitor(); - if (monitor == null) return; - - for (IAEFluidStack fluid : this.internalBuffer) { - monitor.injectItems(fluid.copy(), Actionable.MODULATE, this.getActionSource()); - } - super.onRemoval(); + super(metaTileEntityId, GTValues.EV, IFluidStorageChannel.class); } @Override @@ -97,72 +55,62 @@ public MetaTileEntity createMetaTileEntity(IGregTechTileEntity iGregTechTileEnti } @Override - protected ModularUI createUI(EntityPlayer entityPlayer) { - ModularUI.Builder builder = ModularUI - .builder(GuiTextures.BACKGROUND, 176, 18 + 18 * 4 + 94) - .label(10, 5, getMetaFullName()); - // ME Network status - builder.dynamicLabel(10, 15, () -> isOnline() ? - I18n.format("gregtech.gui.me_network.online") : - I18n.format("gregtech.gui.me_network.offline"), - 0x404040); - builder.label(10, 25, "gregtech.gui.waiting_list", 0xFFFFFFFF); - builder.widget(new AEFluidGridWidget(10, 35, 3, this.internalBuffer)); - - builder.bindPlayerInventory(entityPlayer.inventory, GuiTextures.SLOT, 7, 18 + 18 * 4 + 12); - return builder.build(this.getHolder(), entityPlayer); + protected @NotNull IByteBufDeserializer> getDeserializer() { + return WrappedFluidStack::fromPacket; } + @SideOnly(Side.CLIENT) @Override - public boolean isWorkingEnabled() { - return this.workingEnabled; + protected void addStackLine(@NotNull RichText text, + @NotNull IWrappedStack wrappedStack) { + FluidStack stack = wrappedStack.getDefinition(); + text.add(new GTObjectDrawable(stack, 0) + .asIcon() + .asHoverable() + .tooltip(tooltip -> { + tooltip.addLine(KeyUtil.fluid(stack)); + FluidTooltipUtil.handleFluidTooltip(tooltip, stack); + })); + text.space(); + text.addLine(IKey.str("%dx %s", wrappedStack.getStackSize(), KeyUtil.fluid(stack)) + .color(0xFFFFFF)); } @Override - public void setWorkingEnabled(boolean workingEnabled) { - this.workingEnabled = workingEnabled; - World world = this.getWorld(); - if (world != null && !world.isRemote) { - writeCustomData(GregtechDataCodes.WORKING_ENABLED, buf -> buf.writeBoolean(workingEnabled)); - } - } + public NBTTagCompound writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); - @Override - public T getCapability(Capability capability, EnumFacing side) { - if (capability == GregtechTileCapabilities.CAPABILITY_CONTROLLABLE) { - return GregtechTileCapabilities.CAPABILITY_CONTROLLABLE.cast(this); + NBTTagList nbtList = new NBTTagList(); + for (IWrappedStack stack : internalBuffer) { + NBTTagCompound stackTag = new NBTTagCompound(); + stack.writeToNBT(stackTag); + nbtList.appendTag(stackTag); } - return super.getCapability(capability, side); - } - - @Override - public void writeInitialSyncData(PacketBuffer buf) { - super.writeInitialSyncData(buf); - buf.writeBoolean(workingEnabled); - } + data.setTag(FLUID_BUFFER_TAG, nbtList); - @Override - public void receiveInitialSyncData(PacketBuffer buf) { - super.receiveInitialSyncData(buf); - this.workingEnabled = buf.readBoolean(); - } - - @Override - public NBTTagCompound writeToNBT(NBTTagCompound data) { - super.writeToNBT(data); - data.setBoolean(WORKING_TAG, this.workingEnabled); - data.setTag(FLUID_BUFFER_TAG, this.internalBuffer.serializeNBT()); return data; } @Override public void readFromNBT(NBTTagCompound data) { super.readFromNBT(data); - if (data.hasKey(WORKING_TAG)) { - this.workingEnabled = data.getBoolean(WORKING_TAG); - } - if (data.hasKey(FLUID_BUFFER_TAG, 9)) { - this.internalBuffer.deserializeNBT((NBTTagList) data.getTag(FLUID_BUFFER_TAG)); + for (NBTBase tag : data.getTagList(FLUID_BUFFER_TAG, Constants.NBT.TAG_COMPOUND)) { + NBTTagCompound tagCompound = (NBTTagCompound) tag; + + WrappedFluidStack stack; + // Migrate from AEFluidStacks to WrappedFluidStacks + if (tagCompound.getBoolean("wrapped")) { + stack = WrappedFluidStack.fromNBT(tagCompound); + } else { + stack = WrappedFluidStack.fromFluidStack(FluidStack.loadFluidStackFromNBT(tagCompound), + data.getLong("Cnt")); + } + + if (stack == null) { + GTLog.logger.error("Error reading AEFluidStack from ME Output Hatch buffer tag list"); + } else { + internalBuffer.add(stack); + } } } @@ -202,22 +150,18 @@ public void registerAbilities(@NotNull AbilityInstances abilityInstances) { @Override public void addToMultiBlock(MultiblockControllerBase controllerBase) { super.addToMultiBlock(controllerBase); - if (controllerBase instanceof MultiblockWithDisplayBase) { - ((MultiblockWithDisplayBase) controllerBase).enableFluidInfSink(); + if (controllerBase instanceof MultiblockWithDisplayBase multiblockWithDisplayBase) { + multiblockWithDisplayBase.enableFluidInfSink(); } } - private static class InaccessibleInfiniteTank implements IFluidTank, INotifiableHandler { - - private final IItemList internalBuffer; - private final List notifiableEntities = new ArrayList<>(); - private final MetaTileEntity holder; + private static class InaccessibleInfiniteTank extends InaccessibleInfiniteHandler + implements IFluidTank { - public InaccessibleInfiniteTank(MetaTileEntity holder, IItemList internalBuffer, - MetaTileEntity mte) { - this.holder = holder; - this.internalBuffer = internalBuffer; - this.notifiableEntities.add(mte); + public InaccessibleInfiniteTank(@NotNull MetaTileEntity holder, + @NotNull List> internalBuffer, + @NotNull MetaTileEntity mte) { + super(holder, internalBuffer, mte, FluidStackHashStrategy.comparingAllButAmount()); } @Nullable @@ -242,16 +186,17 @@ public FluidTankInfo getInfo() { } @Override - public int fill(FluidStack resource, boolean doFill) { - if (resource == null) { + public int fill(@Nullable FluidStack stackToInsert, boolean doFill) { + if (stackToInsert == null || stackToInsert.amount < 1) { return 0; } + if (doFill) { - this.internalBuffer.add(AEFluidStack.fromFluidStack(resource)); - holder.markDirty(); + add(stackToInsert, stackToInsert.amount); + this.trigger(); } - this.trigger(); - return resource.amount; + + return stackToInsert.amount; } @Nullable @@ -261,21 +206,8 @@ public FluidStack drain(int maxDrain, boolean doDrain) { } @Override - public void addNotifiableMetaTileEntity(MetaTileEntity metaTileEntity) { - this.notifiableEntities.add(metaTileEntity); - } - - @Override - public void removeNotifiableMetaTileEntity(MetaTileEntity metaTileEntity) { - this.notifiableEntities.remove(metaTileEntity); - } - - private void trigger() { - for (MetaTileEntity metaTileEntity : this.notifiableEntities) { - if (metaTileEntity != null && metaTileEntity.isValid()) { - this.addToNotifiedList(metaTileEntity, this, true); - } - } + protected @NotNull IWrappedStack wrapStack(@NotNull FluidStack stack, long amount) { + return WrappedFluidStack.fromFluidStack(stack, amount); } } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/IWrappedStack.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/IWrappedStack.java new file mode 100644 index 00000000000..e3eb7a5a6c4 --- /dev/null +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/IWrappedStack.java @@ -0,0 +1,23 @@ +package gregtech.common.metatileentities.multi.multiblockpart.appeng.stack; + +import net.minecraft.network.PacketBuffer; + +import appeng.api.storage.data.IAEStack; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public interface IWrappedStack, RealStackType> extends IAEStack { + + @NotNull + RealStackType getDefinition(); + + void writeToPacketBuffer(@NotNull PacketBuffer packetBuffer); + + boolean delegateAndSizeEqual(@Nullable IWrappedStack wrappedStack); + + @NotNull + IWrappedStack copyWrapped(); + + @NotNull + AEStackType copyAsAEStack(); +} diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedFluidStack.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedFluidStack.java index 1d8471a2a3b..ff709e17265 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedFluidStack.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedFluidStack.java @@ -15,37 +15,50 @@ import appeng.api.storage.data.IAEFluidStack; import appeng.fluids.util.AEFluidStack; import io.netty.buffer.ByteBuf; -import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -public class WrappedFluidStack implements IAEFluidStack { +import java.util.Objects; + +public class WrappedFluidStack implements IAEFluidStack, IWrappedStack { @NotNull private FluidStack delegate; + private long stackSize; - private WrappedFluidStack(@NotNull FluidStack stack) { + private WrappedFluidStack(@NotNull FluidStack stack, long stackSize) { this.delegate = stack; + this.stackSize = stackSize; } - @Contract("null -> null; !null -> !null") public static WrappedFluidStack fromFluidStack(@Nullable FluidStack fluidStack) { - return fluidStack == null ? null : new WrappedFluidStack(fluidStack); + return fluidStack == null ? null : new WrappedFluidStack(fluidStack, fluidStack.amount); } - @Contract("null -> null") - public static WrappedFluidStack fromNBT(NBTTagCompound data) { - FluidStack fluidStack = FluidStack.loadFluidStackFromNBT(data); - return fromFluidStack(fluidStack); + public static WrappedFluidStack fromFluidStack(@Nullable FluidStack fluidStack, long amount) { + return fluidStack == null ? null : new WrappedFluidStack(fluidStack, amount); + } + + public static WrappedFluidStack fromNBT(@NotNull NBTTagCompound data) { + // Migrate old NBT entries from the old format + if (data.getBoolean("wrapped")) { + FluidStack stack = FluidStack.loadFluidStackFromNBT(data.getCompoundTag("stack")); + if (stack == null) return null; + return new WrappedFluidStack(stack, data.getLong("stackSize")); + } else { + return fromFluidStack(FluidStack.loadFluidStackFromNBT(data)); + } } public static WrappedFluidStack fromPacket(@NotNull PacketBuffer buffer) { - return fromFluidStack(NetworkUtil.readFluidStack(buffer)); + return new WrappedFluidStack(Objects.requireNonNull(NetworkUtil.readFluidStack(buffer)), buffer.readLong()); } @NotNull public AEFluidStack getAEStack() { - return AEFluidStack.fromFluidStack(this.delegate); + AEFluidStack aeFluidStack = AEFluidStack.fromFluidStack(this.delegate); + aeFluidStack.setStackSize(stackSize); + return aeFluidStack; } @NotNull @@ -60,17 +73,19 @@ public FluidStack getFluidStack() { @Override public void add(IAEFluidStack iaeFluidStack) { - this.delegate.amount += iaeFluidStack.getStackSize(); + if (equals(iaeFluidStack)) { + incStackSize(iaeFluidStack.getStackSize()); + } } @Override public long getStackSize() { - return this.delegate.amount; + return stackSize; } @Override - public IAEFluidStack setStackSize(long l) { - this.delegate.amount = (int) l; + public IAEFluidStack setStackSize(long newStackSize) { + this.stackSize = newStackSize; return this; } @@ -97,6 +112,7 @@ public IAEFluidStack setCraftable(boolean b) { @Override public IAEFluidStack reset() { this.delegate.amount = 0; + this.stackSize = 0L; return this; } @@ -106,13 +122,15 @@ public boolean isMeaningful() { } @Override - public void incStackSize(long l) { - this.delegate.amount += l; + public void incStackSize(long add) { + if (add < 1) return; + this.stackSize += Math.min(Long.MAX_VALUE - this.stackSize, add); } @Override - public void decStackSize(long l) { - this.delegate.amount -= l; + public void decStackSize(long sub) { + if (sub < 1) return; + this.stackSize -= Math.min(this.stackSize, sub); } @Override @@ -127,7 +145,9 @@ public void decCountRequestable(long l) { @Override public void writeToNBT(NBTTagCompound nbtTagCompound) { - this.delegate.writeToNBT(nbtTagCompound); + nbtTagCompound.setTag("stack", this.delegate.writeToNBT(new NBTTagCompound())); + nbtTagCompound.setLong("stackSize", this.stackSize); + nbtTagCompound.setBoolean("wrapped", true); } public NBTTagCompound serializeToNBT() { @@ -143,21 +163,34 @@ public boolean fuzzyComparison(IAEFluidStack stack, FuzzyMode fuzzyMode) { @Override public void writeToPacket(ByteBuf buffer) { - writeToPacket(new PacketBuffer(buffer)); + writeToPacketBuffer(new PacketBuffer(buffer)); } - public void writeToPacket(@NotNull PacketBuffer packetBuffer) { + public void writeToPacketBuffer(@NotNull PacketBuffer packetBuffer) { NetworkUtil.writeFluidStack(packetBuffer, this.delegate); + packetBuffer.writeLong(this.stackSize); } @Override public IAEFluidStack copy() { - return new WrappedFluidStack(this.delegate.copy()); + return new WrappedFluidStack(delegate.copy(), stackSize); + } + + @Override + public @NotNull IAEFluidStack copyAsAEStack() { + IAEFluidStack stack = AEFluidStack.fromFluidStack(delegate.copy()); + stack.setStackSize(stackSize); + return stack; + } + + @Override + public @NotNull IWrappedStack copyWrapped() { + return new WrappedFluidStack(delegate.copy(), stackSize); } @Override public IAEFluidStack empty() { - IAEFluidStack dup = new WrappedFluidStack(this.delegate.copy()); + IAEFluidStack dup = copy(); dup.reset(); return dup; } @@ -187,16 +220,28 @@ public Fluid getFluid() { return this.delegate.getFluid(); } + @Override + public @NotNull FluidStack getDefinition() { + return delegate; + } + @Override public boolean equals(Object other) { - if (other instanceof WrappedFluidStack) { - return ((WrappedFluidStack) other).delegate.isFluidEqual(this.delegate); - } else if (other instanceof FluidStack) { - return ((FluidStack) other).isFluidEqual(this.delegate); + if (other instanceof WrappedFluidStack wrappedFluidStack) { + return wrappedFluidStack.delegate.isFluidEqual(this.delegate); + } else if (other instanceof FluidStack fluidStack) { + return fluidStack.isFluidEqual(this.delegate); } + return false; } + @Override + public boolean delegateAndSizeEqual(@Nullable IWrappedStack wrappedStack) { + if (wrappedStack == null) return false; + return delegate.isFluidEqual(wrappedStack.getDefinition()) && stackSize == wrappedStack.getStackSize(); + } + @Override public int hashCode() { int result = 1; diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedItemStack.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedItemStack.java index f61e1d48724..a0a8d9a8349 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedItemStack.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedItemStack.java @@ -14,41 +14,55 @@ import appeng.core.Api; import appeng.util.item.AEItemStack; import io.netty.buffer.ByteBuf; -import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -public class WrappedItemStack implements IAEItemStack { +public class WrappedItemStack implements IAEItemStack, IWrappedStack { @NotNull private ItemStack delegate; + private long stackSize; - private WrappedItemStack(@NotNull ItemStack itemStack) { + private WrappedItemStack(@NotNull ItemStack itemStack, long stackSize) { this.delegate = itemStack; + this.stackSize = stackSize; } - @Contract("null -> null") public static WrappedItemStack fromItemStack(@Nullable ItemStack stack) { if (stack == null) return null; - return stack.isEmpty() ? null : new WrappedItemStack(stack); + return stack.isEmpty() ? null : new WrappedItemStack(stack, stack.getCount()); } - @Contract("null -> null") - public static WrappedItemStack fromNBT(@Nullable NBTTagCompound i) { - if (i == null) { + public static WrappedItemStack fromItemStack(@Nullable ItemStack stack, long amount) { + if (stack == null) return null; + return stack.isEmpty() ? null : new WrappedItemStack(stack, amount); + } + + public static WrappedItemStack fromNBT(@Nullable NBTTagCompound tag) { + if (tag == null) { return null; } else { - ItemStack itemstack = new ItemStack(i); - return fromItemStack(itemstack); + // Migrate old NBT entries from the old format + if (tag.getBoolean("wrapped")) { + return new WrappedItemStack(new ItemStack(tag.getCompoundTag("stack")), tag.getLong("stackSize")); + } else { + ItemStack itemStack = new ItemStack(tag); + return fromItemStack(itemStack); + } } } public static WrappedItemStack fromPacket(@NotNull PacketBuffer data) { - return fromItemStack(NetworkUtil.readItemStack(data)); + WrappedItemStack wrappedItemStack = fromItemStack(NetworkUtil.readItemStack(data)); + wrappedItemStack.setStackSize(data.readLong()); + return wrappedItemStack; } public AEItemStack getAEStack() { - return AEItemStack.fromItemStack(this.delegate); + AEItemStack aeItemStack = AEItemStack.fromItemStack(this.delegate); + assert aeItemStack != null; + aeItemStack.setStackSize(stackSize); + return aeItemStack; } @Override @@ -63,17 +77,19 @@ public boolean hasTagCompound() { @Override public void add(IAEItemStack iaeItemStack) { - this.delegate.grow((int) iaeItemStack.getStackSize()); + if (equals(iaeItemStack)) { + incStackSize(iaeItemStack.getStackSize()); + } } @Override public long getStackSize() { - return this.delegate.getCount(); + return stackSize; } @Override - public IAEItemStack setStackSize(long l) { - this.delegate.setCount((int) l); + public IAEItemStack setStackSize(long newStackSize) { + this.stackSize = newStackSize; return this; } @@ -100,6 +116,7 @@ public IAEItemStack setCraftable(boolean b) { @Override public IAEItemStack reset() { this.delegate.setCount(0); + this.stackSize = 0; return this; } @@ -109,13 +126,15 @@ public boolean isMeaningful() { } @Override - public void incStackSize(long l) { - this.delegate.grow((int) l); + public void incStackSize(long add) { + if (add < 1) return; + this.stackSize += Math.min(Long.MAX_VALUE - this.stackSize, add); } @Override - public void decStackSize(long l) { - this.delegate.shrink((int) l); + public void decStackSize(long sub) { + if (sub < 1) return; + this.stackSize -= Math.min(this.stackSize, sub); } @Override @@ -130,7 +149,9 @@ public void decCountRequestable(long l) { @Override public void writeToNBT(NBTTagCompound nbtTagCompound) { - this.delegate.writeToNBT(nbtTagCompound); + nbtTagCompound.setTag("stack", this.delegate.serializeNBT()); + nbtTagCompound.setLong("stackSize", this.stackSize); + nbtTagCompound.setBoolean("wrapped", true); } @Override @@ -140,21 +161,38 @@ public boolean fuzzyComparison(IAEItemStack stack, FuzzyMode fuzzyMode) { @Override public void writeToPacket(ByteBuf byteBuf) { - writeToPacket(new PacketBuffer(byteBuf)); + writeToPacketBuffer(new PacketBuffer(byteBuf)); } - public void writeToPacket(@NotNull PacketBuffer packetBuffer) { + public void writeToPacketBuffer(@NotNull PacketBuffer packetBuffer) { NetworkUtil.writeItemStack(packetBuffer, this.delegate); + packetBuffer.writeLong(this.stackSize); } @Override public IAEItemStack copy() { - return new WrappedItemStack(this.delegate.copy()); + return new WrappedItemStack(delegate.copy(), stackSize); + } + + @Override + public @NotNull IAEItemStack copyAsAEStack() { + IAEItemStack stack = AEItemStack.fromItemStack(delegate.copy()); + if (stack == null) { + throw new IllegalStateException("Error creating AEItemStack from delegate"); + } + + stack.setStackSize(stackSize); + return stack; + } + + @Override + public @NotNull IWrappedStack copyWrapped() { + return new WrappedItemStack(delegate.copy(), stackSize); } @Override public IAEItemStack empty() { - IAEItemStack copy = this.copy(); + IAEItemStack copy = copy(); copy.reset(); return copy; } @@ -211,7 +249,7 @@ public boolean isSameType(ItemStack itemStack) { } @Override - public ItemStack getDefinition() { + public @NotNull ItemStack getDefinition() { return this.delegate; } @@ -222,15 +260,21 @@ public boolean equals(ItemStack itemStack) { @Override public boolean equals(Object other) { - if (other instanceof IAEItemStack) { - return this.delegate.isItemEqual(((IAEItemStack) other).createItemStack()); - } - if (other instanceof ItemStack) { - return this.delegate.isItemEqual((ItemStack) other); + if (other instanceof IAEItemStack stack) { + return this.delegate.isItemEqual(stack.createItemStack()); + } else if (other instanceof ItemStack itemStack) { + return this.equals(itemStack); } + return false; } + @Override + public boolean delegateAndSizeEqual(@Nullable IWrappedStack wrappedStack) { + if (wrappedStack == null) return false; + return delegate.isItemEqual(wrappedStack.getDefinition()) && stackSize == wrappedStack.getStackSize(); + } + @Override public int hashCode() { int result = 1; @@ -254,6 +298,6 @@ public void setCachedItemStack(ItemStack itemStack) { @Override public String toString() { - return String.format("Wrapped: %s", delegate); + return String.format("Wrapped: %s, Stack Size: %d", delegate, stackSize); } } From 7f0747ce21826589adae8aa709d4b5a3d01dbdf1 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Fri, 19 Sep 2025 15:04:42 -0400 Subject: [PATCH 103/136] Add .run to gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index c2fb66e1e33..b45d4a7a171 100644 --- a/.gitignore +++ b/.gitignore @@ -74,6 +74,7 @@ local.properties /classes/ /out/ /build/ +.run # Linux *~ From d9447516d320df4b33ac6a1cdc12b0607e9bd5ec Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Fri, 19 Sep 2025 15:04:57 -0400 Subject: [PATCH 104/136] Post merge spotless --- src/main/java/gregtech/api/util/JEIUtil.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/main/java/gregtech/api/util/JEIUtil.java b/src/main/java/gregtech/api/util/JEIUtil.java index 47cf37145dc..81762a81255 100644 --- a/src/main/java/gregtech/api/util/JEIUtil.java +++ b/src/main/java/gregtech/api/util/JEIUtil.java @@ -1,19 +1,17 @@ package gregtech.api.util; -import com.cleanroommc.modularui.integration.jei.JeiGhostIngredientSlot; -import com.cleanroommc.modularui.integration.jei.ModularUIJeiPlugin; - import gregtech.mixins.jei.GuiIngredientGroupAccessor; -import mezz.jei.Internal; - import net.minecraft.enchantment.EnchantmentData; import net.minecraft.item.ItemStack; import net.minecraftforge.fluids.FluidStack; +import com.cleanroommc.modularui.integration.jei.JeiGhostIngredientSlot; +import com.cleanroommc.modularui.integration.jei.ModularUIJeiPlugin; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectMaps; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; +import mezz.jei.Internal; import mezz.jei.api.gui.IGuiFluidStackGroup; import mezz.jei.api.gui.IGuiIngredientGroup; import mezz.jei.api.gui.IGuiItemStackGroup; From f852cff109f719e1c41191527ab8b533bed7a09a Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Fri, 19 Sep 2025 15:10:37 -0400 Subject: [PATCH 105/136] Post merge fixes --- .../api/mui/widget/appeng/AEConfigSlot.java | 19 ------------------- .../appeng/fluid/AEFluidConfigSlot.java | 9 +-------- .../widget/appeng/item/AEItemConfigSlot.java | 9 +-------- 3 files changed, 2 insertions(+), 35 deletions(-) diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java index f737dd656f5..d8697e5cac6 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java @@ -4,22 +4,18 @@ import gregtech.api.mui.GTGuis; import gregtech.api.mui.sync.appeng.AESyncHandler; -import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.resources.I18n; import appeng.api.storage.data.IAEStack; import com.cleanroommc.modularui.api.IPanelHandler; -import com.cleanroommc.modularui.api.ITheme; import com.cleanroommc.modularui.api.drawable.IDrawable; import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.api.widget.Interactable; -import com.cleanroommc.modularui.drawable.GuiDraw; import com.cleanroommc.modularui.integration.jei.JeiIngredientProvider; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.screen.ModularScreen; import com.cleanroommc.modularui.screen.RichTooltip; import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; -import com.cleanroommc.modularui.theme.WidgetSlotTheme; import com.cleanroommc.modularui.theme.WidgetTheme; import com.cleanroommc.modularui.value.IntValue; import com.cleanroommc.modularui.value.sync.SyncHandler; @@ -93,21 +89,6 @@ public void drawOverlay(ModularGuiContext context, WidgetTheme widgetTheme) { } } - // TODO: get rid of these two methods when 2817 merges - protected void drawSlotOverlay() { - GlStateManager.colorMask(true, true, true, false); - GuiDraw.drawRect(1, 1, 16, 16, getSlotHoverColor()); - GlStateManager.colorMask(true, true, true, true); - } - - public int getSlotHoverColor() { - WidgetTheme theme = getWidgetTheme(getContext().getTheme()); - if (theme instanceof WidgetSlotTheme slotTheme) { - return slotTheme.getSlotHoverColor(); - } - return ITheme.getDefault().getItemSlotTheme().getSlotHoverColor(); - } - @Override public @NotNull Result onMousePressed(int mouseButton) { if (mouseButton == 1) { diff --git a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java index ff0836d57ac..6001c89da53 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java @@ -71,15 +71,8 @@ public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { RenderUtil.renderTextFixedCorner(amount, 17d, 18d, 0xFFFFFF, true, 0.5f); } } - } - - @Override - public void drawOverlay(ModularGuiContext context, WidgetTheme widgetTheme) { - if (!RenderUtil.handleJeiGhostHighlight(this)) { - drawSlotOverlay(); - } - super.drawOverlay(context, widgetTheme); + RenderUtil.handleJEIGhostSlotOverlay(this, widgetTheme); } @Override diff --git a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java index 8eb09bea031..ef8010eac11 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java @@ -68,15 +68,8 @@ public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { RenderUtil.renderTextFixedCorner(amount, 17d, 18d, 0xFFFFFF, true, 0.5f); } } - } - - @Override - public void drawOverlay(ModularGuiContext context, WidgetTheme widgetTheme) { - if (!RenderUtil.handleJeiGhostHighlight(this)) { - drawSlotOverlay(); - } - super.drawOverlay(context, widgetTheme); + RenderUtil.handleJEIGhostSlotOverlay(this, widgetTheme); } @Override From 54c9b8019a48fd3e1e366222b3d2c8f737ae36c6 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Fri, 19 Sep 2025 15:49:17 -0400 Subject: [PATCH 106/136] Just write amount next to item --- .../multiblockpart/appeng/MetaTileEntityMEOutputBus.java | 6 +++--- .../multiblockpart/appeng/MetaTileEntityMEOutputHatch.java | 5 ++--- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBus.java index f46c1f309c5..0203c9d2598 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBus.java @@ -7,6 +7,7 @@ import gregtech.api.mui.drawable.GTObjectDrawable; import gregtech.api.util.GTLog; import gregtech.api.util.ItemStackHashStrategy; +import gregtech.api.util.KeyUtil; import gregtech.client.renderer.texture.Textures; import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.IWrappedStack; import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedItemStack; @@ -17,6 +18,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.util.ResourceLocation; +import net.minecraft.util.text.TextFormatting; import net.minecraft.world.World; import net.minecraftforge.common.util.Constants; import net.minecraftforge.fml.relauncher.Side; @@ -28,7 +30,6 @@ import codechicken.lib.render.CCRenderState; import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; -import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.drawable.text.RichText; import com.cleanroommc.modularui.utils.serialization.IByteBufDeserializer; import org.jetbrains.annotations.NotNull; @@ -66,8 +67,7 @@ protected void addStackLine(@NotNull RichText text, @NotNull IWrappedStack tooltip.addFromItem(stack))); text.space(); - text.addLine(IKey.str("%dx %s", wrappedStack.getStackSize(), stack.getDisplayName()) - .color(0xFFFFFF)); + text.addLine(KeyUtil.number(TextFormatting.WHITE, wrappedStack.getStackSize(), "x")); } @Override diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputHatch.java index 215a0718475..61348014196 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputHatch.java @@ -19,6 +19,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.util.ResourceLocation; +import net.minecraft.util.text.TextFormatting; import net.minecraft.world.World; import net.minecraftforge.common.util.Constants; import net.minecraftforge.fluids.FluidStack; @@ -32,7 +33,6 @@ import codechicken.lib.render.CCRenderState; import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; -import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.drawable.text.RichText; import com.cleanroommc.modularui.utils.serialization.IByteBufDeserializer; import org.jetbrains.annotations.NotNull; @@ -72,8 +72,7 @@ protected void addStackLine(@NotNull RichText text, FluidTooltipUtil.handleFluidTooltip(tooltip, stack); })); text.space(); - text.addLine(IKey.str("%dx %s", wrappedStack.getStackSize(), KeyUtil.fluid(stack)) - .color(0xFFFFFF)); + text.addLine(KeyUtil.number(TextFormatting.WHITE, wrappedStack.getStackSize(), "x")); } @Override From 77ed01b9e5f2326983cc5f7c7949ede345a718f5 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Fri, 19 Sep 2025 18:58:48 -0400 Subject: [PATCH 107/136] change comment wording --- .../multi/multiblockpart/appeng/MetaTileEntityMEOutputBus.java | 2 +- .../multiblockpart/appeng/MetaTileEntityMEOutputHatch.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBus.java index 0203c9d2598..56ae36c4611 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBus.java @@ -100,7 +100,7 @@ public void readFromNBT(NBTTagCompound data) { } if (stack == null) { - GTLog.logger.error("Error reading AEFluidStack from ME Output Hatch buffer tag list"); + GTLog.logger.error("Error reading ME Output Hatch buffer tag list"); } else { internalBuffer.add(stack); } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputHatch.java index 61348014196..2541bba5a18 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputHatch.java @@ -106,7 +106,7 @@ public void readFromNBT(NBTTagCompound data) { } if (stack == null) { - GTLog.logger.error("Error reading AEFluidStack from ME Output Hatch buffer tag list"); + GTLog.logger.error("Error reading ME Output Hatch buffer tag list"); } else { internalBuffer.add(stack); } From 61ff047f1af2c5a9f67e55275731f4b7d288ff43 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Fri, 19 Sep 2025 19:00:21 -0400 Subject: [PATCH 108/136] Fix text lines getting cut off --- .../appeng/MetaTileEntityMEOutputBase.java | 31 +++++++++---------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBase.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBase.java index 9052eb60431..4ad963f45de 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBase.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBase.java @@ -26,6 +26,7 @@ import com.cleanroommc.modularui.drawable.text.RichText; import com.cleanroommc.modularui.factory.PosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.utils.Alignment; import com.cleanroommc.modularui.utils.serialization.IByteBufDeserializer; import com.cleanroommc.modularui.value.sync.BooleanSyncValue; import com.cleanroommc.modularui.value.sync.PanelSyncManager; @@ -42,6 +43,7 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import java.util.function.Consumer; public abstract class MetaTileEntityMEOutputBase, RealStackType> extends MetaTileEntityAEHostableChannelPart { @@ -106,13 +108,7 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManage getDeserializer()); panelSyncManager.syncValue("buffer", 0, bufferSync); - ScrollableTextWidget textList = new ScrollableTextWidget() - .textBuilder(text -> { - for (IWrappedStack wrappedStack : bufferSync) { - addStackLine(text, wrappedStack); - } - }); - + ScrollableTextWidget textList = new ScrollableTextWidget(); bufferSync.setChangeListener(textList::markDirty); return GTGuis.createPanel(this, 176, 18 + 18 * 4 + 94) @@ -124,9 +120,11 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManage .asWidget() .pos(5, 15)) .child(textList.pos(9, 25 + 4) - .size(158, 18 * 4 - 8) + .size(158, 18 * 4 - 6) + .textBuilder(text -> bufferSync.cacheForEach(stack -> addStackLine(text, stack))) + .alignment(Alignment.TopLeft) .background(GTGuiTextures.DISPLAY.asIcon() - .margin(-4))) + .margin(-2, -2))) .child(SlotGroupWidget.playerInventory()); } @@ -211,7 +209,7 @@ public InaccessibleInfiniteHandler(@NotNull MetaTileEntity holder, this.strategy = strategy; } - protected void add(@NotNull RealStackType stackToAdd, int amount) { + protected void add(@NotNull RealStackType stackToAdd, long amount) { for (IWrappedStack bufferedAEStack : internalBuffer) { long bufferedAEStackSize = bufferedAEStack.getStackSize(); RealStackType bufferStack = bufferedAEStack.getDefinition(); @@ -253,7 +251,7 @@ protected void trigger() { } private static class WrappedStackSyncHandler, - RealStackType> extends SyncHandler implements Iterable> { + RealStackType> extends SyncHandler { private final List<@NotNull IWrappedStack> source; private final ObjectArrayList<@NotNull IWrappedStack> cache = new ObjectArrayList<>(); @@ -323,11 +321,6 @@ public void readOnServer(int id, PacketBuffer buf) { // This sync handler is Server -> Client only. } - @Override - public @NotNull Iterator> iterator() { - return cache.iterator(); - } - public void setChangeListener(@NotNull Runnable listener) { this.changeListener = listener; } @@ -337,5 +330,11 @@ private void onChange() { changeListener.run(); } } + + public void cacheForEach(@NotNull Consumer<@NotNull IWrappedStack> consumer) { + for (IWrappedStack stack : cache) { + consumer.accept(stack); + } + } } } From 59e3eec3b6c2038b62c069e073ef69678145d600 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Fri, 19 Sep 2025 19:13:46 -0400 Subject: [PATCH 109/136] exposed outside its defined visibility scope!!! --- .../multiblockpart/appeng/MetaTileEntityMEStockingBus.java | 2 +- .../multiblockpart/appeng/MetaTileEntityMEStockingHatch.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java index 2c4c51d0f60..ce2bb667cb0 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java @@ -488,7 +488,7 @@ protected void readConfigFromTag(NBTTagCompound tag) { super.readConfigFromTag(tag); } - private static class ExportOnlyAEStockingItemList extends ExportOnlyAEItemList { + public static class ExportOnlyAEStockingItemList extends ExportOnlyAEItemList { private final MetaTileEntityMEStockingBus holder; diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java index 85894e39f9c..c812d48f18c 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java @@ -439,7 +439,7 @@ protected MetaTileEntityMEStockingHatch getHolder() { } } - private static class ExportOnlyAEStockingFluidList extends ExportOnlyAEFluidList { + public static class ExportOnlyAEStockingFluidList extends ExportOnlyAEFluidList { private final MetaTileEntityMEStockingHatch holder; From 681adcde4ecf72bd0eae29bb687c87e1c95e53b7 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Fri, 19 Sep 2025 19:16:40 -0400 Subject: [PATCH 110/136] Fix the extra slot item in input buses not dropping --- .../multiblockpart/appeng/MetaTileEntityMEInputBus.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java index 95f5d77ad5a..fd556ee5e86 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java @@ -161,6 +161,14 @@ protected void syncME() { } } + @Override + public void clearMachineInventory(@NotNull List<@NotNull ItemStack> itemBuffer) { + ItemStack extraSlotStack = extraSlotInventory.getStackInSlot(0); + if (!extraSlotStack.isEmpty()) { + itemBuffer.add(extraSlotStack); + } + } + @Override public void onRemoval() { flushInventory(); From debdba83b5e324379a3eca3d1b51b0e09500138f Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Fri, 19 Sep 2025 23:46:48 -0400 Subject: [PATCH 111/136] Fix the width of the online text widget being too thin if the gui was opened and then it went offline (unwanted text wrapping) --- .../multiblockpart/appeng/MetaTileEntityMEInputBus.java | 5 ++++- .../multiblockpart/appeng/MetaTileEntityMEInputHatch.java | 5 ++++- .../multiblockpart/appeng/MetaTileEntityMEOutputBase.java | 4 +++- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java index fd556ee5e86..cf48e6bd2a1 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java @@ -254,7 +254,10 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) .child(SlotGroupWidget.playerInventory().left(7).bottom(7)) .child(IKey.lang(() -> isOnline() ? "gregtech.gui.me_network.online" : "gregtech.gui.me_network.offline") - .asWidget().pos(5, 15)) + .asWidget() + .marginLeft(5) + .widthRel(1.0f) + .top(15)) .child(configGrid) .child(new Grid() .pos(7 + 18 * 5, 25) diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java index 5e815e82d4f..ecf783218c0 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java @@ -206,7 +206,10 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) .child(SlotGroupWidget.playerInventory().left(7).bottom(7)) .child(IKey.lang(() -> isOnline() ? "gregtech.gui.me_network.online" : "gregtech.gui.me_network.offline") - .asWidget().pos(5, 15)) + .asWidget() + .marginLeft(5) + .widthRel(1.0f) + .top(15)) .child(configGrid) .child(new Grid() .pos(7 + 18 * 5, 25) diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBase.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBase.java index 4ad963f45de..7028a29f7b2 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBase.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBase.java @@ -118,7 +118,9 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManage .child(IKey.lang(() -> onlineSync.getBoolValue() ? "gregtech.gui.me_network.online" : "gregtech.gui.me_network.offline") .asWidget() - .pos(5, 15)) + .marginLeft(5) + .widthRel(1.0f) + .top(15)) .child(textList.pos(9, 25 + 4) .size(158, 18 * 4 - 6) .textBuilder(text -> bufferSync.cacheForEach(stack -> addStackLine(text, stack))) From c4564be00efcc97e7ab86b1d038c9d8d1b60b7a0 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Sat, 20 Sep 2025 17:37:41 -0400 Subject: [PATCH 112/136] Use L instead of x for the amount in ME output hatches --- .../multiblockpart/appeng/MetaTileEntityMEOutputHatch.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputHatch.java index 2541bba5a18..2d47b2ee9ae 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputHatch.java @@ -72,7 +72,7 @@ protected void addStackLine(@NotNull RichText text, FluidTooltipUtil.handleFluidTooltip(tooltip, stack); })); text.space(); - text.addLine(KeyUtil.number(TextFormatting.WHITE, wrappedStack.getStackSize(), "x")); + text.addLine(KeyUtil.number(TextFormatting.WHITE, wrappedStack.getStackSize(), "L")); } @Override From d8d2a82358039875e9aaa7b34e70f29de28d5c98 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Sat, 20 Sep 2025 17:47:21 -0400 Subject: [PATCH 113/136] Revert nullability change to IntCircuitIngredient --- .../mui/sync/appeng/AEItemSyncHandler.java | 1 + .../ingredients/IntCircuitIngredient.java | 23 ++++++++----------- 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java index a20e46186a5..3c550ac0dff 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java @@ -74,6 +74,7 @@ public IRecipeTransferError receiveRecipe(@NotNull IRecipeLayout recipeLayout, b Iterator inputsIterator = itemInputs.iterator(); while (inputsIterator.hasNext()) { ItemStack stack = inputsIterator.next(); + if (stack == null) continue; if (IntCircuitIngredient.isIntegratedCircuit(stack)) { inputsIterator.remove(); circuitValue = IntCircuitIngredient.getCircuitConfiguration(stack); diff --git a/src/main/java/gregtech/api/recipes/ingredients/IntCircuitIngredient.java b/src/main/java/gregtech/api/recipes/ingredients/IntCircuitIngredient.java index f9dab92efcd..911304019ff 100644 --- a/src/main/java/gregtech/api/recipes/ingredients/IntCircuitIngredient.java +++ b/src/main/java/gregtech/api/recipes/ingredients/IntCircuitIngredient.java @@ -3,12 +3,14 @@ import gregtech.api.items.gui.PlayerInventoryHolder; import gregtech.api.recipes.ingredients.nbtmatch.NBTCondition; import gregtech.api.recipes.ingredients.nbtmatch.NBTMatcher; +import gregtech.api.util.GTUtility; import gregtech.common.items.MetaItems; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.math.MathHelper; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Objects; @@ -93,16 +95,14 @@ protected int computeHash() { @Override public boolean equals(Object obj) { if (this == obj) return true; - if (!(obj instanceof IntCircuitIngredient)) return false; - IntCircuitIngredient other = (IntCircuitIngredient) obj; + if (!(obj instanceof IntCircuitIngredient other)) return false; return this.isConsumable == other.isConsumable && this.matchingConfigurations == other.matchingConfigurations; } @Override public boolean equalIgnoreAmount(GTRecipeInput input) { if (this == input) return true; - if (!(input instanceof IntCircuitIngredient)) return false; - IntCircuitIngredient other = (IntCircuitIngredient) input; + if (!(input instanceof IntCircuitIngredient other)) return false; return this.matchingConfigurations == other.matchingConfigurations; } @@ -116,26 +116,22 @@ public String toString() { return "1xcircuit(" + matchingConfigurations + ")"; } - public static ItemStack getIntegratedCircuit(int configuration) { + public static @NotNull ItemStack getIntegratedCircuit(int configuration) { ItemStack stack = MetaItems.INTEGRATED_CIRCUIT.getStackForm(); setCircuitConfiguration(stack, configuration); return stack; } - public static void setCircuitConfiguration(ItemStack itemStack, int configuration) { + public static void setCircuitConfiguration(@NotNull ItemStack itemStack, int configuration) { if (!MetaItems.INTEGRATED_CIRCUIT.isItemEqual(itemStack)) throw new IllegalArgumentException("Given item stack is not an integrated circuit!"); if (configuration < 0 || configuration > CIRCUIT_MAX) throw new IllegalArgumentException("Given configuration number is out of range!"); - NBTTagCompound tagCompound = itemStack.getTagCompound(); - if (tagCompound == null) { - tagCompound = new NBTTagCompound(); - itemStack.setTagCompound(tagCompound); - } + NBTTagCompound tagCompound = GTUtility.getOrCreateNbtCompound(itemStack); tagCompound.setInteger("Configuration", configuration); } - public static int getCircuitConfiguration(ItemStack itemStack) { + public static int getCircuitConfiguration(@NotNull ItemStack itemStack) { if (!isIntegratedCircuit(itemStack)) return 0; NBTTagCompound tagCompound = itemStack.getTagCompound(); if (tagCompound != null) { @@ -144,8 +140,7 @@ public static int getCircuitConfiguration(ItemStack itemStack) { return 0; } - public static boolean isIntegratedCircuit(@Nullable ItemStack itemStack) { - if (itemStack == null) return false; + public static boolean isIntegratedCircuit(@NotNull ItemStack itemStack) { boolean isCircuit = MetaItems.INTEGRATED_CIRCUIT.isItemEqual(itemStack); if (isCircuit && !itemStack.hasTagCompound()) { NBTTagCompound compound = new NBTTagCompound(); From 64bca50ed16a625f1bbf1f47307d83c8246a00f3 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Sat, 20 Sep 2025 17:49:38 -0400 Subject: [PATCH 114/136] Address TODO in GTUtility --- .../java/gregtech/api/util/GTUtility.java | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/src/main/java/gregtech/api/util/GTUtility.java b/src/main/java/gregtech/api/util/GTUtility.java index e87e3f052b3..7c333ca2e03 100644 --- a/src/main/java/gregtech/api/util/GTUtility.java +++ b/src/main/java/gregtech/api/util/GTUtility.java @@ -1095,23 +1095,6 @@ public static void collapseFluidList(@NotNull List stacks, @Range(from = 1, to = Integer.MAX_VALUE) int maxStackSize, boolean removeEmpty) { stacks.removeIf(Objects::isNull); - // TODO: replace with FluidStackHashStrategy once the MUI2 Multi PR merges - Hash.Strategy stackStrategy = new Hash.Strategy<>() { - - @Override - public int hashCode(FluidStack o) { - // don't need to do this since I'll only call equals - return 0; - } - - @Override - public boolean equals(FluidStack a, FluidStack b) { - if (a == null) return b == null; - if (b == null) return false; - - return a.getFluid() == b.getFluid() && Objects.equals(a.tag, b.tag); - } - }; for (int checkingSlot = 0; checkingSlot < stacks.size(); checkingSlot++) { FluidStack stackToCheck = stacks.get(checkingSlot); @@ -1121,7 +1104,7 @@ public boolean equals(FluidStack a, FluidStack b) { FluidStack collapsingStack = stacks.get(collapsingSlot); if (collapsingStack.amount < 1) continue; - if (stackStrategy.equals(stackToCheck, collapsingStack)) { + if (FluidStackHashStrategy.comparingAllButAmount().equals(stackToCheck, collapsingStack)) { final int checkingSize = stackToCheck.amount; final int collapsingSize = collapsingStack.amount; From 654e3f431c6b304aa934e313d3ebcf11fc24e928 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Sat, 20 Sep 2025 18:51:07 -0400 Subject: [PATCH 115/136] Check NBT in `WrappedItemStack#equals` --- .../appeng/stack/WrappedItemStack.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedItemStack.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedItemStack.java index a0a8d9a8349..383c7e08d00 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedItemStack.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedItemStack.java @@ -261,7 +261,19 @@ public boolean equals(ItemStack itemStack) { @Override public boolean equals(Object other) { if (other instanceof IAEItemStack stack) { - return this.delegate.isItemEqual(stack.createItemStack()); + ItemStack otherStack = stack.getCachedItemStack(stack.getStackSize()); + NBTTagCompound thisTag = delegate.getTagCompound(); + NBTTagCompound otherTag = otherStack.getTagCompound(); + + boolean nbtMatch; + if (thisTag == null) { + nbtMatch = otherTag == null; + } else { + // noinspection PointlessNullCheck + nbtMatch = otherTag != null && thisTag.equals(otherTag); + } + + return this.delegate.isItemEqual(otherStack) && nbtMatch; } else if (other instanceof ItemStack itemStack) { return this.equals(itemStack); } From 4002e42247c523b36f3628f7c9add4500958240f Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Sun, 21 Sep 2025 18:19:28 -0400 Subject: [PATCH 116/136] Fix the amount text and always show the scroll tooltip --- .../mui/sync/appeng/AEFluidSyncHandler.java | 2 +- .../api/mui/widget/appeng/AEConfigSlot.java | 2 -- .../appeng/fluid/AEFluidConfigSlot.java | 19 ++++++++--------- .../appeng/fluid/AEFluidDisplaySlot.java | 19 ++++++++--------- .../fluid/AEFluidStackPreviewWidget.java | 4 ++-- .../widget/appeng/item/AEItemConfigSlot.java | 20 +++++++----------- .../widget/appeng/item/AEItemDisplaySlot.java | 21 +++++++++---------- .../appeng/slot/ExportOnlyAEFluidSlot.java | 2 +- .../appeng/stack/WrappedFluidStack.java | 5 ----- .../resources/assets/gregtech/lang/en_us.lang | 2 -- 10 files changed, 40 insertions(+), 56 deletions(-) diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java index 474edc5046e..cbaa2b9c861 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java @@ -51,7 +51,7 @@ public AEFluidSyncHandler(ExportOnlyAEFluidList fluidList, @Nullable Runnable di public boolean isStackValidForSlot(int index, @Nullable IAEFluidStack stack) { if (stack == null) return true; if (!isStocking) return true; - return !fluidList.hasStackInConfig(((WrappedFluidStack) stack).getDelegate(), true); + return !fluidList.hasStackInConfig(((WrappedFluidStack) stack).getDefinition(), true); } @Override diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java index d8697e5cac6..d8208a4c058 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java @@ -54,8 +54,6 @@ public AEConfigSlot(boolean isStocking, int index, BooleanSupplier isAutoPull) { } protected void buildTooltip(@NotNull RichTooltip tooltip) { - tooltip.addLine(IKey.lang("gregtech.gui.config_slot")); - if (isAutoPull.getAsBoolean()) { tooltip.add(I18n.format("gregtech.gui.config_slot.auto_pull_managed")); } else { diff --git a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java index 6001c89da53..32aeb414a29 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java @@ -15,6 +15,7 @@ import appeng.api.storage.data.IAEFluidStack; import com.cleanroommc.modularui.api.widget.Interactable; +import com.cleanroommc.modularui.drawable.GuiDraw; import com.cleanroommc.modularui.integration.jei.JeiGhostIngredientSlot; import com.cleanroommc.modularui.screen.RichTooltip; import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; @@ -42,11 +43,11 @@ public void onInit() { @Override protected void buildTooltip(@NotNull RichTooltip tooltip) { IAEFluidStack config = getSyncHandler().getConfig(index); - if (config == null) { - super.buildTooltip(tooltip); - } else { - KeyUtil.fluidInfo(((WrappedFluidStack) config).getDelegate(), tooltip, false, true, true); + if (config != null) { + KeyUtil.fluidInfo(((WrappedFluidStack) config).getDefinition(), tooltip, false, true, true); } + + super.buildTooltip(tooltip); } @Override @@ -61,14 +62,12 @@ public boolean isValidSyncHandler(SyncHandler syncHandler) { @Override public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { - IAEFluidStack config = getSyncHandler().getConfig(index); + WrappedFluidStack config = (WrappedFluidStack) getSyncHandler().getConfig(index); if (config != null) { - FluidStack stack = ((WrappedFluidStack) config).getDelegate(); - RenderUtil.drawFluidForGui(stack, stack.amount, 1, 1, 17, 17); - + GuiDraw.drawFluidTexture(config.getDefinition(), 1, 1, getArea().w() - 2, getArea().h() - 2, 0); if (!isStocking) { - String amount = TextFormattingUtil.formatLongToCompactString(stack.amount, 4); - RenderUtil.renderTextFixedCorner(amount, 17d, 18d, 0xFFFFFF, true, 0.5f); + RenderUtil.renderTextFixedCorner(TextFormattingUtil.formatLongToCompactString(config.getStackSize(), 4), + 17d, 18d, 0xFFFFFF, true, 0.5f); } } diff --git a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidDisplaySlot.java b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidDisplaySlot.java index 4941233d969..776aac24f5a 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidDisplaySlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidDisplaySlot.java @@ -7,9 +7,8 @@ import gregtech.client.utils.RenderUtil; import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedFluidStack; -import net.minecraftforge.fluids.FluidStack; - import appeng.api.storage.data.IAEFluidStack; +import com.cleanroommc.modularui.drawable.GuiDraw; import com.cleanroommc.modularui.screen.RichTooltip; import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; import com.cleanroommc.modularui.theme.WidgetTheme; @@ -26,9 +25,9 @@ public AEFluidDisplaySlot(int index) { @Override protected void buildTooltip(@NotNull RichTooltip tooltip) { - IAEFluidStack stock = getSyncHandler().getStock(index); + WrappedFluidStack stock = (WrappedFluidStack) getSyncHandler().getStock(index); if (stock != null) { - KeyUtil.fluidInfo(((WrappedFluidStack) stock).getDelegate(), tooltip); + KeyUtil.fluidInfo(stock.getDefinition(), tooltip); } } @@ -44,14 +43,14 @@ public boolean isValidSyncHandler(SyncHandler syncHandler) { @Override public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { - IAEFluidStack stock = getSyncHandler().getStock(index); + WrappedFluidStack stock = (WrappedFluidStack) getSyncHandler().getStock(index); if (stock != null) { - FluidStack stack = ((WrappedFluidStack) stock).getDelegate(); - RenderUtil.drawFluidForGui(stack, stack.amount, 1, 1, 17, 17); - - String amount = TextFormattingUtil.formatLongToCompactString(stack.amount, 4); - RenderUtil.renderTextFixedCorner(amount, 17d, 18d, 0xFFFFFF, true, 0.5f); + GuiDraw.drawFluidTexture(stock.getDefinition(), 1, 1, getArea().w() - 2, getArea().h() - 2, 0); + RenderUtil.renderTextFixedCorner(TextFormattingUtil.formatLongToCompactString(stock.getStackSize(), 4), 17d, + 18d, 0xFFFFFF, true, 0.5f); } + + RenderUtil.handleSlotOverlay(this, widgetTheme); } @Override diff --git a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidStackPreviewWidget.java b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidStackPreviewWidget.java index 7ce53255121..541605a8b68 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidStackPreviewWidget.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidStackPreviewWidget.java @@ -21,14 +21,14 @@ public AEFluidStackPreviewWidget(@NotNull Supplier stackToDraw) { @Override protected void buildTooltip(@NotNull RichTooltip tooltip) { if (stackToDraw.get() instanceof WrappedFluidStack wrappedFluidStack) { - KeyUtil.fluidInfo(wrappedFluidStack.getDelegate(), tooltip, false, true, false); + KeyUtil.fluidInfo(wrappedFluidStack.getDefinition(), tooltip, false, true, false); } } @Override public void draw(@Nullable IAEFluidStack stackToDraw, int x, int y, int width, int height) { if (stackToDraw instanceof WrappedFluidStack wrappedFluidStack) { - GuiDraw.drawFluidTexture(wrappedFluidStack.getDelegate(), x, y, width, height, 0.0f); + GuiDraw.drawFluidTexture(wrappedFluidStack.getDefinition(), x, y, width, height, 0.0f); } } diff --git a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java index ef8010eac11..38718b29889 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java @@ -6,6 +6,7 @@ import gregtech.api.mui.widget.appeng.AEStackPreviewWidget; import gregtech.api.util.TextFormattingUtil; import gregtech.client.utils.RenderUtil; +import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedItemStack; import net.minecraft.item.ItemStack; @@ -36,11 +37,11 @@ public void onInit() { @Override protected void buildTooltip(@NotNull RichTooltip tooltip) { IAEItemStack config = getSyncHandler().getConfig(index); - if (config == null) { - super.buildTooltip(tooltip); - } else { + if (config != null) { tooltip.addFromItem(config.createItemStack()); } + + super.buildTooltip(tooltip); } @Override @@ -55,17 +56,12 @@ public boolean isValidSyncHandler(SyncHandler syncHandler) { @Override public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { - IAEItemStack config = getSyncHandler().getConfig(index); + WrappedItemStack config = (WrappedItemStack) getSyncHandler().getConfig(index); if (config != null) { - ItemStack stack = config.createItemStack(); // have to copy the stack here since the count is set to 1 - if (!stack.isEmpty()) { - stack.setCount(1); - RenderUtil.renderItem(stack, 1, 1, 16f, 16f); - } - + RenderUtil.renderItem(config.getDefinition(), 1, 1, 16f, 16f); if (!isStocking) { - String amount = TextFormattingUtil.formatLongToCompactString(config.getStackSize(), 4); - RenderUtil.renderTextFixedCorner(amount, 17d, 18d, 0xFFFFFF, true, 0.5f); + RenderUtil.renderTextFixedCorner(TextFormattingUtil.formatLongToCompactString(config.getStackSize(), 4), + 17d, 18d, 0xFFFFFF, true, 0.5f); } } diff --git a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemDisplaySlot.java b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemDisplaySlot.java index 2c8b1940858..df865903f2e 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemDisplaySlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemDisplaySlot.java @@ -4,6 +4,7 @@ import gregtech.api.mui.widget.appeng.AEDisplaySlot; import gregtech.api.util.TextFormattingUtil; import gregtech.client.utils.RenderUtil; +import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedItemStack; import net.minecraft.item.ItemStack; @@ -24,9 +25,9 @@ public AEItemDisplaySlot(int index) { @Override protected void buildTooltip(@NotNull RichTooltip tooltip) { - IAEItemStack stock = getSyncHandler().getStock(index); + WrappedItemStack stock = (WrappedItemStack) getSyncHandler().getStock(index); if (stock != null) { - tooltip.addFromItem(stock.createItemStack()); + tooltip.addFromItem(stock.getDefinition()); } } @@ -42,17 +43,15 @@ public boolean isValidSyncHandler(SyncHandler syncHandler) { @Override public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { - IAEItemStack stock = getSyncHandler().getStock(index); + WrappedItemStack stock = (WrappedItemStack) getSyncHandler().getStock(index); if (stock != null) { - ItemStack stack = stock.createItemStack(); // have to copy the stack here since the count is set to 1 - if (!stack.isEmpty()) { - stack.setCount(1); - RenderUtil.renderItem(stack, 1, 1, 16f, 16f); - } - - String amount = TextFormattingUtil.formatLongToCompactString(stock.getStackSize(), 4); - RenderUtil.renderTextFixedCorner(amount, 17d, 18d, 0xFFFFFF, true, 0.5f); + ItemStack stack = stock.createItemStack(); + RenderUtil.renderItem(stack, 1, 1, 16f, 16f); + RenderUtil.renderTextFixedCorner(TextFormattingUtil.formatLongToCompactString(stock.getStackSize(), 4), 17d, + 18d, 0xFFFFFF, true, 0.5f); } + + RenderUtil.handleSlotOverlay(this, widgetTheme); } @Override diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEFluidSlot.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEFluidSlot.java index 464c77b1659..0329ccd37bb 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEFluidSlot.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEFluidSlot.java @@ -97,7 +97,7 @@ public void deserializeNBT(NBTTagCompound nbt) { @Override public FluidStack getFluid() { if (this.stock instanceof WrappedFluidStack wrappedFluidStack) { - return wrappedFluidStack.getDelegate(); + return wrappedFluidStack.getDefinition(); } return null; } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedFluidStack.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedFluidStack.java index ff709e17265..1a6c801db40 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedFluidStack.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedFluidStack.java @@ -61,11 +61,6 @@ public AEFluidStack getAEStack() { return aeFluidStack; } - @NotNull - public FluidStack getDelegate() { - return this.delegate; - } - @Override public FluidStack getFluidStack() { return this.delegate.copy(); diff --git a/src/main/resources/assets/gregtech/lang/en_us.lang b/src/main/resources/assets/gregtech/lang/en_us.lang index b1af264cfe4..a325e07a918 100644 --- a/src/main/resources/assets/gregtech/lang/en_us.lang +++ b/src/main/resources/assets/gregtech/lang/en_us.lang @@ -5673,8 +5673,6 @@ gregtech.gui.multiblock_voiding_not_supported=This Multiblock does not support V gregtech.gui.multiblock.recipe_producing=Producing: gregtech.gui.me_network.online=Network: §aOnline§r gregtech.gui.me_network.offline=Network: §4Offline§r -gregtech.gui.waiting_list=Sending Queue: -gregtech.gui.config_slot=§fConfig Slot§r gregtech.gui.config_slot.set=§7Click to §bset/select§7 config slot.§r gregtech.gui.config_slot.set_only=§7Click to §bset§7 config slot.§r gregtech.gui.config_slot.scroll=§7Scroll wheel to §achange§7 config amount.§r From e4666ef6888af86cc1f6af966965eda991dde2de Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Sun, 21 Sep 2025 19:35:36 -0400 Subject: [PATCH 117/136] Add line separator between fluid/item description and scroll control lines --- .../appeng/fluid/AEFluidConfigSlot.java | 14 +++++++++++-- .../widget/appeng/item/AEItemConfigSlot.java | 21 +++++++++++++++++-- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java index 32aeb414a29..ad225ed50b4 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java @@ -1,5 +1,8 @@ package gregtech.api.mui.widget.appeng.fluid; +import com.cleanroommc.modularui.drawable.text.TextRenderer; +import com.cleanroommc.modularui.utils.Color; + import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.sync.appeng.AEFluidSyncHandler; import gregtech.api.mui.widget.appeng.AEConfigSlot; @@ -10,10 +13,12 @@ import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedFluidStack; import net.minecraft.item.ItemStack; +import net.minecraft.util.text.TextFormatting; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidUtil; import appeng.api.storage.data.IAEFluidStack; +import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.api.widget.Interactable; import com.cleanroommc.modularui.drawable.GuiDraw; import com.cleanroommc.modularui.integration.jei.JeiGhostIngredientSlot; @@ -42,9 +47,14 @@ public void onInit() { @Override protected void buildTooltip(@NotNull RichTooltip tooltip) { - IAEFluidStack config = getSyncHandler().getConfig(index); + WrappedFluidStack config = (WrappedFluidStack) getSyncHandler().getConfig(index); if (config != null) { - KeyUtil.fluidInfo(((WrappedFluidStack) config).getDefinition(), tooltip, false, true, true); + KeyUtil.fluidInfo(config.getDefinition(), tooltip, false, true, true); + tooltip.addLine(IKey.str("§9§oMod Name Here§r")); + tooltip.addLine((context, x, y, width, height, widgetTheme) -> { + final int color = Color.GREY.darker(2); + codechicken.lib.gui.GuiDraw.drawRect(x, y + 3, (int) TextRenderer.SHARED.getLastWidth(), 2, color); + }); } super.buildTooltip(tooltip); diff --git a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java index 38718b29889..4d39ce512bf 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java @@ -1,5 +1,13 @@ package gregtech.api.mui.widget.appeng.item; +import codechicken.lib.gui.GuiDraw; +import com.cleanroommc.modularui.api.drawable.IDrawable; + +import com.cleanroommc.modularui.drawable.text.TextRenderer; +import com.cleanroommc.modularui.screen.viewport.GuiContext; + +import com.cleanroommc.modularui.utils.Color; + import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.sync.appeng.AEItemSyncHandler; import gregtech.api.mui.widget.appeng.AEConfigSlot; @@ -11,11 +19,15 @@ import net.minecraft.item.ItemStack; import appeng.api.storage.data.IAEItemStack; +import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.integration.jei.JeiGhostIngredientSlot; import com.cleanroommc.modularui.screen.RichTooltip; import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; import com.cleanroommc.modularui.theme.WidgetTheme; import com.cleanroommc.modularui.value.sync.SyncHandler; + +import net.minecraft.util.text.TextFormatting; + import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -36,9 +48,14 @@ public void onInit() { @Override protected void buildTooltip(@NotNull RichTooltip tooltip) { - IAEItemStack config = getSyncHandler().getConfig(index); + WrappedItemStack config = (WrappedItemStack) getSyncHandler().getConfig(index); if (config != null) { - tooltip.addFromItem(config.createItemStack()); + tooltip.addFromItem(config.getDefinition()); + tooltip.addLine(IKey.str("§9§oMod Name Here§r")); + tooltip.addLine((context, x, y, width, height, widgetTheme) -> { + final int color = Color.GREY.darker(2); + GuiDraw.drawRect(x, y + 3, (int) TextRenderer.SHARED.getLastWidth(), 2, color); + }); } super.buildTooltip(tooltip); From 274c4b90d99d5637c822ee42d75210e55bf83a51 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Sun, 21 Sep 2025 19:55:32 -0400 Subject: [PATCH 118/136] Add mod name to item tooltips --- .../appeng/fluid/AEFluidConfigSlot.java | 6 ++-- .../widget/appeng/item/AEItemConfigSlot.java | 16 ++-------- src/main/java/gregtech/api/util/Mods.java | 2 ++ .../gregtech/mixins/mui2/MCHelperMixin.java | 30 +++++++++++++++++++ src/main/resources/mixins.gregtech.mui2.json | 3 +- 5 files changed, 39 insertions(+), 18 deletions(-) create mode 100644 src/main/java/gregtech/mixins/mui2/MCHelperMixin.java diff --git a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java index ad225ed50b4..970f534469d 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java @@ -1,8 +1,5 @@ package gregtech.api.mui.widget.appeng.fluid; -import com.cleanroommc.modularui.drawable.text.TextRenderer; -import com.cleanroommc.modularui.utils.Color; - import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.sync.appeng.AEFluidSyncHandler; import gregtech.api.mui.widget.appeng.AEConfigSlot; @@ -13,7 +10,6 @@ import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedFluidStack; import net.minecraft.item.ItemStack; -import net.minecraft.util.text.TextFormatting; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidUtil; @@ -21,10 +17,12 @@ import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.api.widget.Interactable; import com.cleanroommc.modularui.drawable.GuiDraw; +import com.cleanroommc.modularui.drawable.text.TextRenderer; import com.cleanroommc.modularui.integration.jei.JeiGhostIngredientSlot; import com.cleanroommc.modularui.screen.RichTooltip; import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; import com.cleanroommc.modularui.theme.WidgetTheme; +import com.cleanroommc.modularui.utils.Color; import com.cleanroommc.modularui.value.sync.SyncHandler; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java index 4d39ce512bf..2f30a62e7b7 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java @@ -1,13 +1,5 @@ package gregtech.api.mui.widget.appeng.item; -import codechicken.lib.gui.GuiDraw; -import com.cleanroommc.modularui.api.drawable.IDrawable; - -import com.cleanroommc.modularui.drawable.text.TextRenderer; -import com.cleanroommc.modularui.screen.viewport.GuiContext; - -import com.cleanroommc.modularui.utils.Color; - import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.sync.appeng.AEItemSyncHandler; import gregtech.api.mui.widget.appeng.AEConfigSlot; @@ -19,15 +11,14 @@ import net.minecraft.item.ItemStack; import appeng.api.storage.data.IAEItemStack; -import com.cleanroommc.modularui.api.drawable.IKey; +import codechicken.lib.gui.GuiDraw; +import com.cleanroommc.modularui.drawable.text.TextRenderer; import com.cleanroommc.modularui.integration.jei.JeiGhostIngredientSlot; import com.cleanroommc.modularui.screen.RichTooltip; import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; import com.cleanroommc.modularui.theme.WidgetTheme; +import com.cleanroommc.modularui.utils.Color; import com.cleanroommc.modularui.value.sync.SyncHandler; - -import net.minecraft.util.text.TextFormatting; - import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -51,7 +42,6 @@ protected void buildTooltip(@NotNull RichTooltip tooltip) { WrappedItemStack config = (WrappedItemStack) getSyncHandler().getConfig(index); if (config != null) { tooltip.addFromItem(config.getDefinition()); - tooltip.addLine(IKey.str("§9§oMod Name Here§r")); tooltip.addLine((context, x, y, width, height, widgetTheme) -> { final int color = Color.GREY.darker(2); GuiDraw.drawRect(x, y + 3, (int) TextRenderer.SHARED.getLastWidth(), 2, color); diff --git a/src/main/java/gregtech/api/util/Mods.java b/src/main/java/gregtech/api/util/Mods.java index 4cbd4031fa3..a2cec7b5654 100644 --- a/src/main/java/gregtech/api/util/Mods.java +++ b/src/main/java/gregtech/api/util/Mods.java @@ -78,6 +78,7 @@ public enum Mods { XaerosMinimap(Names.XAEROS_MINIMAP), Vintagium(Names.VINTAGIUM), Alfheim(Names.ALFHEIM), + ModNameTooltip(Names.MOD_NAME_TOOLTIP), // Special Optifine handler, but consolidated here for simplicity Optifine(null) { @@ -151,6 +152,7 @@ public static class Names { public static final String XAEROS_MINIMAP = "xaerominimap"; public static final String VINTAGIUM = "vintagium"; public static final String ALFHEIM = "alfheim"; + public static final String MOD_NAME_TOOLTIP = "modnametooltip"; } private final String ID; diff --git a/src/main/java/gregtech/mixins/mui2/MCHelperMixin.java b/src/main/java/gregtech/mixins/mui2/MCHelperMixin.java new file mode 100644 index 00000000000..eaebbfc006a --- /dev/null +++ b/src/main/java/gregtech/mixins/mui2/MCHelperMixin.java @@ -0,0 +1,30 @@ +package gregtech.mixins.mui2; + +import gregtech.api.util.Mods; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.fml.common.Loader; +import net.minecraftforge.fml.common.ModContainer; + +import com.cleanroommc.modularui.api.MCHelper; +import com.llamalad7.mixinextras.injector.ModifyReturnValue; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +import java.util.List; + +@Mixin(value = MCHelper.class, remap = false) +public class MCHelperMixin { + + @ModifyReturnValue(method = "getItemToolTip", at = @At(value = "RETURN")) + private static List addModName(List original, ItemStack stack) { + if (original.isEmpty() || Mods.ModNameTooltip.isModLoaded()) return original; + + ModContainer modContainer = Loader.instance().getIndexedModList().get(stack.getItem().getCreatorModId(stack)); + if (modContainer != null) { + original.add("§9§o" + modContainer.getName() + "§r"); + } + + return original; + } +} diff --git a/src/main/resources/mixins.gregtech.mui2.json b/src/main/resources/mixins.gregtech.mui2.json index ccc6592be5a..157f4c0b4e6 100644 --- a/src/main/resources/mixins.gregtech.mui2.json +++ b/src/main/resources/mixins.gregtech.mui2.json @@ -21,7 +21,8 @@ "LangKeyMixin", "ModularUIJeiPluginMixin", "ItemSlotMixin", - "ModularSyncManagerMixin" + "ModularSyncManagerMixin", + "MCHelperMixin" ], "server": [] } From 0656f025b1d8eeb98ebb2751ffe2b64a9bb499cb Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Sun, 21 Sep 2025 20:52:06 -0400 Subject: [PATCH 119/136] Add the mod name to all MUI2 item slots and our fluid slots Fix no newline after the fluid mol tooltip --- .../gregtech/api/gui/widgets/TankWidget.java | 2 +- .../api/mui/sync/GTFluidSyncHandler.java | 11 ++--- .../appeng/fluid/AEFluidConfigSlot.java | 8 ++-- .../appeng/fluid/AEFluidDisplaySlot.java | 8 +++- .../fluid/AEFluidStackPreviewWidget.java | 4 +- .../gregtech/api/util/FluidTooltipUtil.java | 45 ++++++++++++++++++- src/main/java/gregtech/api/util/KeyUtil.java | 24 ---------- .../resources/assets/gregtech/lang/en_us.lang | 2 +- .../resources/assets/gregtech/lang/ja_jp.lang | 2 +- .../resources/assets/gregtech/lang/ru_ru.lang | 2 +- .../resources/assets/gregtech/lang/zh_cn.lang | 2 +- 11 files changed, 69 insertions(+), 41 deletions(-) diff --git a/src/main/java/gregtech/api/gui/widgets/TankWidget.java b/src/main/java/gregtech/api/gui/widgets/TankWidget.java index 7a550ff478e..fa5398efd2c 100644 --- a/src/main/java/gregtech/api/gui/widgets/TankWidget.java +++ b/src/main/java/gregtech/api/gui/widgets/TankWidget.java @@ -511,7 +511,7 @@ public static void addIngotMolFluidTooltip(FluidStack fluidStack, List t if (extra != 0) { fluidAmount += String.format(" + %d L", extra); } - tooltip.add(TextFormatting.GRAY + LocalizationUtils.format("gregtech.gui.amount_raw") + fluidAmount); + tooltip.add(TextFormatting.GRAY + LocalizationUtils.format("gregtech.gui.amount_raw", fluidAmount)); } } } diff --git a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java index 7f81a1c32b9..81ce9a47330 100644 --- a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java @@ -253,14 +253,15 @@ public void handleTooltip(@NotNull RichTooltip tooltip) { if (tankFluid == null) { tankFluid = getLockedFluid(); } + if (tankFluid == null) return; - if (tankFluid != null) { - FluidTooltipUtil.handleFluidTooltip(tooltip, tankFluid); + FluidTooltipUtil.handleFluidTooltip(tooltip, tankFluid); - if (showAmountInTooltip()) { - FluidTooltipUtil.addIngotMolFluidTooltip(tooltip, tankFluid); - } + if (showAmountInTooltip()) { + FluidTooltipUtil.addIngotMolFluidTooltip(tooltip, tankFluid); } + + tooltip.add(FluidTooltipUtil.getFluidModName(tankFluid)); } @Override diff --git a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java index 970f534469d..4ac2577136d 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java @@ -4,6 +4,7 @@ import gregtech.api.mui.sync.appeng.AEFluidSyncHandler; import gregtech.api.mui.widget.appeng.AEConfigSlot; import gregtech.api.mui.widget.appeng.AEStackPreviewWidget; +import gregtech.api.util.FluidTooltipUtil; import gregtech.api.util.KeyUtil; import gregtech.api.util.TextFormattingUtil; import gregtech.client.utils.RenderUtil; @@ -14,7 +15,6 @@ import net.minecraftforge.fluids.FluidUtil; import appeng.api.storage.data.IAEFluidStack; -import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.api.widget.Interactable; import com.cleanroommc.modularui.drawable.GuiDraw; import com.cleanroommc.modularui.drawable.text.TextRenderer; @@ -47,8 +47,10 @@ public void onInit() { protected void buildTooltip(@NotNull RichTooltip tooltip) { WrappedFluidStack config = (WrappedFluidStack) getSyncHandler().getConfig(index); if (config != null) { - KeyUtil.fluidInfo(config.getDefinition(), tooltip, false, true, true); - tooltip.addLine(IKey.str("§9§oMod Name Here§r")); + FluidStack stack = config.getDefinition(); + tooltip.addLine(KeyUtil.fluid(stack)); + FluidTooltipUtil.fluidInfo(stack, tooltip, false, true, true); + tooltip.addLine(FluidTooltipUtil.getFluidModNameKey(stack)); tooltip.addLine((context, x, y, width, height, widgetTheme) -> { final int color = Color.GREY.darker(2); codechicken.lib.gui.GuiDraw.drawRect(x, y + 3, (int) TextRenderer.SHARED.getLastWidth(), 2, color); diff --git a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidDisplaySlot.java b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidDisplaySlot.java index 776aac24f5a..5cc87f2d34c 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidDisplaySlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidDisplaySlot.java @@ -2,11 +2,14 @@ import gregtech.api.mui.sync.appeng.AEFluidSyncHandler; import gregtech.api.mui.widget.appeng.AEDisplaySlot; +import gregtech.api.util.FluidTooltipUtil; import gregtech.api.util.KeyUtil; import gregtech.api.util.TextFormattingUtil; import gregtech.client.utils.RenderUtil; import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedFluidStack; +import net.minecraftforge.fluids.FluidStack; + import appeng.api.storage.data.IAEFluidStack; import com.cleanroommc.modularui.drawable.GuiDraw; import com.cleanroommc.modularui.screen.RichTooltip; @@ -27,7 +30,10 @@ public AEFluidDisplaySlot(int index) { protected void buildTooltip(@NotNull RichTooltip tooltip) { WrappedFluidStack stock = (WrappedFluidStack) getSyncHandler().getStock(index); if (stock != null) { - KeyUtil.fluidInfo(stock.getDefinition(), tooltip); + FluidStack stack = stock.getDefinition(); + tooltip.addLine(KeyUtil.fluid(stack)); + FluidTooltipUtil.fluidInfo(stack, tooltip); + tooltip.addLine(FluidTooltipUtil.getFluidModNameKey(stack)); } } diff --git a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidStackPreviewWidget.java b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidStackPreviewWidget.java index 541605a8b68..0ce3552abc5 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidStackPreviewWidget.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidStackPreviewWidget.java @@ -1,7 +1,7 @@ package gregtech.api.mui.widget.appeng.fluid; import gregtech.api.mui.widget.appeng.AEStackPreviewWidget; -import gregtech.api.util.KeyUtil; +import gregtech.api.util.FluidTooltipUtil; import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedFluidStack; import appeng.api.storage.data.IAEFluidStack; @@ -21,7 +21,7 @@ public AEFluidStackPreviewWidget(@NotNull Supplier stackToDraw) { @Override protected void buildTooltip(@NotNull RichTooltip tooltip) { if (stackToDraw.get() instanceof WrappedFluidStack wrappedFluidStack) { - KeyUtil.fluidInfo(wrappedFluidStack.getDefinition(), tooltip, false, true, false); + FluidTooltipUtil.fluidInfo(wrappedFluidStack.getDefinition(), tooltip, false, true, false); } } diff --git a/src/main/java/gregtech/api/util/FluidTooltipUtil.java b/src/main/java/gregtech/api/util/FluidTooltipUtil.java index a4afad4796f..c713442f3d5 100644 --- a/src/main/java/gregtech/api/util/FluidTooltipUtil.java +++ b/src/main/java/gregtech/api/util/FluidTooltipUtil.java @@ -11,6 +11,8 @@ import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fml.common.Loader; +import net.minecraftforge.fml.common.ModContainer; import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.screen.RichTooltip; @@ -133,6 +135,27 @@ public static Supplier> createFluidTooltip(@Nullable Material mater }; } + public static void fluidInfo(@Nullable FluidStack stack, @NotNull RichTooltip tooltip, boolean showAmount, + boolean showTooltip, boolean showMolAmount) { + if (stack == null) return; + + if (showAmount) { + tooltip.addLine(IKey.str("%,d L", stack.amount)); + } + + if (showTooltip) { + handleFluidTooltip(tooltip, stack); + } + + if (showMolAmount) { + addIngotMolFluidTooltip(tooltip, stack); + } + } + + public static void fluidInfo(@Nullable FluidStack stack, @NotNull RichTooltip tooltip) { + fluidInfo(stack, tooltip, true, true, true); + } + public static void addIngotMolFluidTooltip(@NotNull RichTooltip tooltip, @NotNull FluidStack fluidStack) { // Add tooltip showing how many "ingot moles" (increments of 144) this fluid is if shift is held if (TooltipHelper.isShiftDown() && fluidStack.amount > GTValues.L) { @@ -142,7 +165,27 @@ public static void addIngotMolFluidTooltip(@NotNull RichTooltip tooltip, @NotNul if (extra != 0) { fluidAmount += String.format(" + %d L", extra); } - tooltip.add(TextFormatting.GRAY + LocalizationUtils.format("gregtech.gui.amount_raw") + fluidAmount); + tooltip.addLine(KeyUtil.lang(TextFormatting.GRAY, "gregtech.gui.amount_raw", fluidAmount)); } } + + public static @NotNull IKey getFluidModNameKey(@NotNull FluidStack fluidStack) { + return IKey.str(getFluidModName(fluidStack.getFluid())); + } + + public static @NotNull String getFluidModName(@NotNull FluidStack fluidStack) { + return getFluidModName(fluidStack.getFluid()); + } + + public static @NotNull String getFluidModName(@NotNull Fluid fluid) { + ModContainer modContainer = Loader.instance().getIndexedModList().get(getFluidModID(fluid)); + if (modContainer == null) throw new IllegalStateException( + "Tried to get the mod name of a fluid that isn't registered to the Forge FluidRegistry"); + return "§9§o" + modContainer.getName() + "§r"; + } + + public static @NotNull String getFluidModID(@NotNull Fluid fluid) { + String fluidModName = FluidRegistry.getDefaultFluidName(fluid); + return fluidModName.substring(0, fluidModName.indexOf(":")); + } } diff --git a/src/main/java/gregtech/api/util/KeyUtil.java b/src/main/java/gregtech/api/util/KeyUtil.java index 7d7936a471c..1b547e2fa69 100644 --- a/src/main/java/gregtech/api/util/KeyUtil.java +++ b/src/main/java/gregtech/api/util/KeyUtil.java @@ -9,7 +9,6 @@ import com.cleanroommc.modularui.api.drawable.IDrawable; import com.cleanroommc.modularui.api.drawable.IKey; -import com.cleanroommc.modularui.screen.RichTooltip; import org.apache.commons.lang3.ArrayUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -146,27 +145,4 @@ public static IKey fluid(@Nullable Fluid fluid, @Nullable FluidStack stack) { if (stack == null) return IKey.lang(fluid.getUnlocalizedName()); else return IKey.lang(fluid.getUnlocalizedName(stack)); } - - public static void fluidInfo(@Nullable FluidStack stack, @NotNull RichTooltip tooltip, boolean showAmount, - boolean showTooltip, boolean showMolAmount) { - if (stack == null) return; - - tooltip.addLine(fluid(stack)); - - if (showAmount) { - tooltip.addLine(IKey.str("%,d L", stack.amount)); - } - - if (showTooltip) { - FluidTooltipUtil.handleFluidTooltip(tooltip, stack); - } - - if (showMolAmount) { - FluidTooltipUtil.addIngotMolFluidTooltip(tooltip, stack); - } - } - - public static void fluidInfo(@Nullable FluidStack stack, @NotNull RichTooltip tooltip) { - fluidInfo(stack, tooltip, true, true, true); - } } diff --git a/src/main/resources/assets/gregtech/lang/en_us.lang b/src/main/resources/assets/gregtech/lang/en_us.lang index a325e07a918..152ea14f319 100644 --- a/src/main/resources/assets/gregtech/lang/en_us.lang +++ b/src/main/resources/assets/gregtech/lang/en_us.lang @@ -5639,7 +5639,7 @@ gregtech.fluid.state_plasma=§aState: Plasma gregtech.fluid.type_acid.tooltip=§6Acidic! Handle with care! gregtech.gui.fuel_amount=Fuel Amount: gregtech.gui.fluid_amount=Fluid Amount: -gregtech.gui.amount_raw=Amount: +gregtech.gui.amount_raw=Amount: %s gregtech.gui.toggle_view.disabled=Toggle View (Fluids) gregtech.gui.toggle_view.enabled=Toggle View (Items) gregtech.gui.overclock.enabled=Overclocking Enabled./nClick to Disable diff --git a/src/main/resources/assets/gregtech/lang/ja_jp.lang b/src/main/resources/assets/gregtech/lang/ja_jp.lang index 846a51bd8f6..135fc75e5f9 100644 --- a/src/main/resources/assets/gregtech/lang/ja_jp.lang +++ b/src/main/resources/assets/gregtech/lang/ja_jp.lang @@ -5578,7 +5578,7 @@ gregtech.fluid.state_plasma=§a状態: プラズマ gregtech.fluid.type_acid.tooltip=§6酸性! 取扱注意! gregtech.gui.fuel_amount=燃料量: gregtech.gui.fluid_amount=液体量: -gregtech.gui.amount_raw=液体量 (詳細): +gregtech.gui.amount_raw=液体量 (詳細): %s gregtech.gui.toggle_view.disabled=液体スロット切り替え gregtech.gui.toggle_view.enabled=アイテムスロット切り替え gregtech.gui.overclock.enabled=オーバークロックが有効。/nクリックで無効化 diff --git a/src/main/resources/assets/gregtech/lang/ru_ru.lang b/src/main/resources/assets/gregtech/lang/ru_ru.lang index b55ab882948..7eed9eeaeb8 100644 --- a/src/main/resources/assets/gregtech/lang/ru_ru.lang +++ b/src/main/resources/assets/gregtech/lang/ru_ru.lang @@ -4821,7 +4821,7 @@ gregtech.fluid.state_plasma=§7Состояние: Плазма gregtech.fluid.type_acid.tooltip=§6Кислота! Соблюдайте осторожность! gregtech.gui.fuel_amount=Кол. топлива: gregtech.gui.fluid_amount=Кол. жидкости: -gregtech.gui.amount_raw=Кол-во: +gregtech.gui.amount_raw=Кол-во: %s gregtech.gui.toggle_view.disabled=Переключить вид (Жидкости) gregtech.gui.toggle_view.enabled=Переключить вид (Предметы) gregtech.gui.overclock.enabled=Ускорение включено./nНажмите, чтобы отключить diff --git a/src/main/resources/assets/gregtech/lang/zh_cn.lang b/src/main/resources/assets/gregtech/lang/zh_cn.lang index d7ae88a79b3..5485a1ce4d7 100644 --- a/src/main/resources/assets/gregtech/lang/zh_cn.lang +++ b/src/main/resources/assets/gregtech/lang/zh_cn.lang @@ -5630,7 +5630,7 @@ gregtech.fluid.state_plasma=§a状态:等离子态 gregtech.fluid.type_acid.tooltip=§6酸性物质!轻拿轻放! gregtech.gui.fuel_amount=燃料总量: gregtech.gui.fluid_amount=流体总量: -gregtech.gui.amount_raw=数量: +gregtech.gui.amount_raw=数量:%s gregtech.gui.toggle_view.disabled=切换视图(流体) gregtech.gui.toggle_view.enabled=切换视图(物品) gregtech.gui.overclock.enabled=已启用超频/n点击以禁用 From cb63af87776fd2aa414f0d70a40b0ebbee878aff Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Sun, 21 Sep 2025 23:16:16 -0400 Subject: [PATCH 120/136] Input parts code dedup pt1 --- .../impl/GhostCircuitItemStackHandler.java | 10 +- .../SimpleMachineMetaTileEntity.java | 1 - .../mui/sync/appeng/AEFluidSyncHandler.java | 20 +- .../mui/sync/appeng/AEItemSyncHandler.java | 16 +- .../api/mui/sync/appeng/AESyncHandler.java | 6 +- .../api/mui/widget/appeng/AEConfigSlot.java | 2 +- .../appeng/fluid/AEFluidConfigSlot.java | 2 +- .../widget/appeng/item/AEItemConfigSlot.java | 2 +- .../MetaTileEntityFluidHatch.java | 1 - .../multiblockpart/MetaTileEntityItemBus.java | 1 - .../MetaTileEntityReservoirHatch.java | 1 - .../MetaTileEntityAEHostableChannelPart.java | 6 +- .../appeng/MetaTileEntityAEHostablePart.java | 4 + .../appeng/MetaTileEntityMEInputBase.java | 376 ++++++++++++++++++ .../appeng/MetaTileEntityMEInputBus.java | 366 +++-------------- .../appeng/MetaTileEntityMEInputHatch.java | 338 ++-------------- .../appeng/MetaTileEntityMEOutputBase.java | 6 +- .../appeng/MetaTileEntityMEStockingBus.java | 51 +-- .../appeng/MetaTileEntityMEStockingHatch.java | 53 +-- .../appeng/slot/ExportOnlyAEFluidList.java | 5 +- .../appeng/slot/ExportOnlyAEFluidSlot.java | 6 + .../appeng/slot/ExportOnlyAEItemList.java | 4 +- .../appeng/slot/ExportOnlyAEItemSlot.java | 6 + .../appeng/slot/ExportOnlyAESlot.java | 5 + .../appeng/slot/IExportOnlyAEStackList.java | 14 + 25 files changed, 601 insertions(+), 701 deletions(-) create mode 100644 src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBase.java create mode 100644 src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/IExportOnlyAEStackList.java diff --git a/src/main/java/gregtech/api/capability/impl/GhostCircuitItemStackHandler.java b/src/main/java/gregtech/api/capability/impl/GhostCircuitItemStackHandler.java index 81a2b901f8a..1dfd56e7396 100644 --- a/src/main/java/gregtech/api/capability/impl/GhostCircuitItemStackHandler.java +++ b/src/main/java/gregtech/api/capability/impl/GhostCircuitItemStackHandler.java @@ -12,6 +12,7 @@ import net.minecraftforge.items.IItemHandlerModifiable; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; @@ -29,8 +30,15 @@ public class GhostCircuitItemStackHandler extends GTItemStackHandler private int circuitValue = NO_CONFIG; private ItemStack circuitStack = ItemStack.EMPTY; - public GhostCircuitItemStackHandler(MetaTileEntity metaTileEntity) { + public GhostCircuitItemStackHandler(@NotNull MetaTileEntity metaTileEntity) { + this(metaTileEntity, metaTileEntity); + } + + public GhostCircuitItemStackHandler(@NotNull MetaTileEntity metaTileEntity, @Nullable MetaTileEntity mteToNotify) { super(metaTileEntity); + if (mteToNotify != null) { + notifiableEntities.add(mteToNotify); + } } /** diff --git a/src/main/java/gregtech/api/metatileentity/SimpleMachineMetaTileEntity.java b/src/main/java/gregtech/api/metatileentity/SimpleMachineMetaTileEntity.java index 5ecd01baa1a..18d34751e39 100644 --- a/src/main/java/gregtech/api/metatileentity/SimpleMachineMetaTileEntity.java +++ b/src/main/java/gregtech/api/metatileentity/SimpleMachineMetaTileEntity.java @@ -127,7 +127,6 @@ protected void initializeInventory() { this.outputFluidInventory = new FluidHandlerProxy(new FluidTankList(false), exportFluids); if (this.hasGhostCircuitInventory()) { this.circuitInventory = new GhostCircuitItemStackHandler(this); - this.circuitInventory.addNotifiableMetaTileEntity(this); } this.actualImportItems = null; diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java index cbaa2b9c861..4c709dcad85 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java @@ -1,6 +1,8 @@ package gregtech.api.mui.sync.appeng; +import gregtech.api.capability.impl.GhostCircuitItemStackHandler; import gregtech.api.mui.GTByteBufAdapters; +import gregtech.api.recipes.ingredients.IntCircuitIngredient; import gregtech.api.util.GTUtility; import gregtech.api.util.JEIUtil; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEFluidList; @@ -8,6 +10,7 @@ import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.IConfigurableSlot; import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedFluidStack; +import net.minecraft.item.ItemStack; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -22,13 +25,15 @@ import java.util.ArrayList; import java.util.List; +import java.util.function.IntConsumer; public class AEFluidSyncHandler extends AESyncHandler { protected final ExportOnlyAEFluidList fluidList; - public AEFluidSyncHandler(ExportOnlyAEFluidList fluidList, @Nullable Runnable dirtyNotifier) { - super(fluidList.getInventory(), fluidList.isStocking(), dirtyNotifier); + public AEFluidSyncHandler(ExportOnlyAEFluidList fluidList, @Nullable Runnable dirtyNotifier, + @NotNull IntConsumer circuitChangeConsumer) { + super(fluidList.getInventory(), fluidList.isStocking(), dirtyNotifier, circuitChangeConsumer); this.fluidList = fluidList; } @@ -71,6 +76,17 @@ public IRecipeTransferError receiveRecipe(@NotNull IRecipeLayout recipeLayout, b } clearConfigFrom(lastSlotIndex); + Int2ObjectMap itemInputs = JEIUtil.getDisplayedInputItemStacks(recipeLayout.getItemStacks(), false, + false); + int circuitValue = GhostCircuitItemStackHandler.NO_CONFIG; + for (ItemStack inputStack : itemInputs.values()) { + if (IntCircuitIngredient.isIntegratedCircuit(inputStack)) { + circuitValue = IntCircuitIngredient.getCircuitConfiguration(inputStack); + break; + } + } + ghostCircuitConfig.accept(circuitValue); + return null; } diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java index 3c550ac0dff..0c47dd99745 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java @@ -25,17 +25,16 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import java.util.function.IntConsumer; public class AEItemSyncHandler extends AESyncHandler { protected final ExportOnlyAEItemList itemList; - protected final GhostCircuitItemStackHandler ghostCircuitHandler; public AEItemSyncHandler(ExportOnlyAEItemList itemList, @Nullable Runnable dirtyNotifier, - @NotNull GhostCircuitItemStackHandler ghostCircuitHandler) { - super(itemList.getInventory(), itemList.isStocking(), dirtyNotifier); + @NotNull IntConsumer circuitChangeConsumer) { + super(itemList.getInventory(), itemList.isStocking(), dirtyNotifier, circuitChangeConsumer); this.itemList = itemList; - this.ghostCircuitHandler = ghostCircuitHandler; } @Override @@ -76,11 +75,12 @@ public IRecipeTransferError receiveRecipe(@NotNull IRecipeLayout recipeLayout, b ItemStack stack = inputsIterator.next(); if (stack == null) continue; if (IntCircuitIngredient.isIntegratedCircuit(stack)) { - inputsIterator.remove(); circuitValue = IntCircuitIngredient.getCircuitConfiguration(stack); + inputsIterator.remove(); + break; } } - setGhostCircuit(circuitValue); + ghostCircuitConfig.accept(circuitValue); int lastSlotIndex; for (lastSlotIndex = 0; lastSlotIndex < itemInputs.size(); lastSlotIndex++) { @@ -96,8 +96,4 @@ public IRecipeTransferError receiveRecipe(@NotNull IRecipeLayout recipeLayout, b public void setConfig(int index, @Nullable ItemStack stack) { setConfig(index, WrappedItemStack.fromItemStack(stack)); } - - protected void setGhostCircuit(int circuitValue) { - ghostCircuitHandler.setCircuitValue(circuitValue); - } } diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java index a8bbbaf1949..bf3fced9863 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java @@ -20,6 +20,7 @@ import java.io.IOException; import java.util.function.IntBinaryOperator; +import java.util.function.IntConsumer; public abstract class AESyncHandler> extends SyncHandler implements IJEIRecipeReceiver { @@ -32,6 +33,7 @@ public abstract class AESyncHandler> e public static final int bulkConfigAmountChangeID = 5; protected final boolean isStocking; + protected final IntConsumer ghostCircuitConfig; protected final @NotNull IConfigurableSlot[] slots; private final @NotNull IConfigurableSlot[] cached; private final Int2ObjectMap<@NotNull IConfigurableSlot> changeMap = new Int2ObjectOpenHashMap<>(); @@ -41,9 +43,11 @@ public abstract class AESyncHandler> e @Nullable private final Runnable dirtyNotifier; - public AESyncHandler(IConfigurableSlot[] slots, boolean isStocking, @Nullable Runnable dirtyNotifier) { + public AESyncHandler(IConfigurableSlot[] slots, boolean isStocking, @Nullable Runnable dirtyNotifier, + @NotNull IntConsumer ghostCircuitConfig) { this.slots = slots; this.isStocking = isStocking; + this.ghostCircuitConfig = ghostCircuitConfig; this.dirtyNotifier = dirtyNotifier; this.cached = initializeCache(); this.byteBufAdapter = initializeByteBufAdapter(); diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java index d8208a4c058..f97f148f4c5 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java @@ -45,7 +45,7 @@ public abstract class AEConfigSlot> extends Widget implements Interactable, JeiGhostIngredientSlot { - public AEFluidConfigSlot(boolean isStocking, int index, BooleanSupplier isAutoPull) { + public AEFluidConfigSlot(boolean isStocking, int index, @NotNull BooleanSupplier isAutoPull) { super(isStocking, index, isAutoPull); tooltipAutoUpdate(true); } diff --git a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java index 2f30a62e7b7..c1952a303d7 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java @@ -26,7 +26,7 @@ public class AEItemConfigSlot extends AEConfigSlot implements JeiGhostIngredientSlot { - public AEItemConfigSlot(boolean isStocking, int index, BooleanSupplier isAutoPull) { + public AEItemConfigSlot(boolean isStocking, int index, @NotNull BooleanSupplier isAutoPull) { super(isStocking, index, isAutoPull); tooltipAutoUpdate(true); } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java index f9a5876a59c..a2e82eaa09b 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java @@ -90,7 +90,6 @@ protected void initializeInventory() { super.initializeInventory(); if (this.hasGhostCircuitInventory()) { this.circuitInventory = new GhostCircuitItemStackHandler(this); - this.circuitInventory.addNotifiableMetaTileEntity(this); } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityItemBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityItemBus.java index c3dae2f0e06..74962974f8d 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityItemBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityItemBus.java @@ -84,7 +84,6 @@ protected void initializeInventory() { super.initializeInventory(); if (this.hasGhostCircuitInventory()) { this.circuitInventory = new GhostCircuitItemStackHandler(this); - this.circuitInventory.addNotifiableMetaTileEntity(this); this.actualImportItems = new ItemHandlerList(Arrays.asList(super.getImportItems(), this.circuitInventory)); } else { this.actualImportItems = null; diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityReservoirHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityReservoirHatch.java index 9f8a133d401..3c9b80ea177 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityReservoirHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityReservoirHatch.java @@ -78,7 +78,6 @@ public MetaTileEntity createMetaTileEntity(IGregTechTileEntity tileEntity) { protected void initializeInventory() { super.initializeInventory(); this.circuitInventory = new GhostCircuitItemStackHandler(this); - this.circuitInventory.addNotifiableMetaTileEntity(this); } @Override diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostableChannelPart.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostableChannelPart.java index 62fd65c566a..912c4b9765a 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostableChannelPart.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostableChannelPart.java @@ -1,6 +1,5 @@ package gregtech.common.metatileentities.multi.multiblockpart.appeng; -import gregtech.api.capability.IControllable; import gregtech.common.ConfigHolder; import net.minecraft.item.ItemStack; @@ -18,8 +17,7 @@ import java.util.List; -public abstract class MetaTileEntityAEHostableChannelPart> extends MetaTileEntityAEHostablePart - implements IControllable { +public abstract class MetaTileEntityAEHostableChannelPart> extends MetaTileEntityAEHostablePart { public static final String REFRESH_RATE_TAG = "RefreshRate"; @@ -40,7 +38,7 @@ public MetaTileEntityAEHostableChannelPart(ResourceLocation metaTileEntityId, in @Override public void clearMachineInventory(@NotNull List<@NotNull ItemStack> itemBuffer) {} - protected boolean shouldSyncME() { + protected boolean shouldOperateOnME() { return getMEUpdateTick() % refreshRate == 0; } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostablePart.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostablePart.java index d67e90ac4e9..a20e0cb8903 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostablePart.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostablePart.java @@ -174,9 +174,11 @@ public AENetworkProxy getProxy() { if (aeProxy == null) { return aeProxy = createProxy(); } + if (!aeProxy.isReady() && getWorld() != null) { aeProxy.onReady(); } + return aeProxy; } @@ -184,6 +186,7 @@ protected IActionSource getActionSource() { if (this.getHolder() instanceof IActionHost holder) { return new MachineSource(holder); } + return new BaseActionSource(); } @@ -206,6 +209,7 @@ public boolean updateMEStatus() { meStatusChanged = false; } } + return isOnline; } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBase.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBase.java new file mode 100644 index 00000000000..0cb62a9484a --- /dev/null +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBase.java @@ -0,0 +1,376 @@ +package gregtech.common.metatileentities.multi.multiblockpart.appeng; + +import gregtech.api.capability.GregtechDataCodes; +import gregtech.api.capability.GregtechTileCapabilities; +import gregtech.api.capability.IControllable; +import gregtech.api.capability.IGhostSlotConfigurable; +import gregtech.api.capability.impl.GhostCircuitItemStackHandler; +import gregtech.api.metatileentity.multiblock.MultiblockControllerBase; +import gregtech.api.mui.GTGuiTextures; +import gregtech.api.mui.GTGuis; +import gregtech.api.mui.sync.appeng.AEFluidSyncHandler; +import gregtech.api.mui.widget.GhostCircuitSlotWidget; +import gregtech.api.util.GTUtility; +import gregtech.common.ConfigHolder; +import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAESlot; +import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.IExportOnlyAEStackList; +import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.IWrappedStack; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.PacketBuffer; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.World; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.util.Constants; + +import appeng.api.config.Actionable; +import appeng.api.storage.IMEMonitor; +import appeng.api.storage.IStorageChannel; +import appeng.api.storage.data.IAEStack; +import com.cleanroommc.modularui.api.IPanelHandler; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.drawable.ItemDrawable; +import com.cleanroommc.modularui.factory.PosGuiData; +import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.value.IntValue; +import com.cleanroommc.modularui.value.sync.IntSyncValue; +import com.cleanroommc.modularui.value.sync.PanelSyncHandler; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.value.sync.SyncHandlers; +import com.cleanroommc.modularui.widget.Widget; +import com.cleanroommc.modularui.widgets.ButtonWidget; +import com.cleanroommc.modularui.widgets.SlotGroupWidget; +import com.cleanroommc.modularui.widgets.layout.Flow; +import com.cleanroommc.modularui.widgets.textfield.TextFieldWidget; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Range; + +public abstract class MetaTileEntityMEInputBase> + extends MetaTileEntityAEHostableChannelPart + implements IControllable, IGhostSlotConfigurable { + + public final static int CONFIG_SIZE = 16; + public static final String WORKING_TAG = "WorkingEnabled"; + public static final String SYNC_HANDLER_NAME = "aeSync"; + + protected GhostCircuitItemStackHandler circuitInventory; + protected boolean workingEnabled = true; + + public MetaTileEntityMEInputBase(ResourceLocation metaTileEntityId, int tier, boolean isExportHatch, + Class> storageChannel) { + super(metaTileEntityId, tier, isExportHatch, storageChannel); + } + + @Override + protected void initializeInventory() { + this.circuitInventory = new GhostCircuitItemStackHandler(this); + } + + @Override + public void update() { + super.update(); + if (!getWorld().isRemote && this.workingEnabled && updateMEStatus() && shouldOperateOnME()) { + operateOnME(); + } + } + + public abstract @NotNull IExportOnlyAEStackList getAEHandler(); + + public boolean isAutoPull() { + return getAEHandler().isAutoPull(); + } + + public boolean isStocking() { + return getAEHandler().isStocking(); + } + + protected void operateOnME() { + syncME(); + } + + protected void syncME() { + IMEMonitor monitor = getMonitor(); + if (monitor == null) return; + + for (ExportOnlyAESlot slot : getAEHandler().getInventory()) { + AEStackType exceedStack = slot.exceedStack(); + if (exceedStack != null) { + long total = exceedStack.getStackSize(); + AEStackType notInserted = monitor.injectItems(exceedStack, Actionable.MODULATE, getActionSource()); + if (notInserted != null && notInserted.getStackSize() > 0L) { + slot.decrementStock(total - notInserted.getStackSize()); + continue; + } else { + slot.decrementStock(total); + } + } + + AEStackType requestStack = slot.requestStack(); + if (requestStack == null) continue; + AEStackType extracted = monitor.extractItems(requestStack, Actionable.MODULATE, getActionSource()); + if (extracted == null) continue; + slot.addStack(extracted); + } + } + + @Override + public void onRemoval() { + flushInventory(); + super.onRemoval(); + } + + protected void flushInventory() { + IMEMonitor monitor = getMonitor(); + if (monitor == null) return; + + for (ExportOnlyAESlot slot : getAEHandler().getInventory()) { + AEStackType stock = slot.getStock(); + if (stock instanceof IWrappedStackwrappedStack) { + // noinspection unchecked + stock = (AEStackType) wrappedStack.copyAsAEStack(); + } + + if (stock == null) continue; + monitor.injectItems(stock, Actionable.MODULATE, getActionSource()); + } + } + + @Override + public boolean usesMui2() { + return true; + } + + @Override + public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManager) { + ModularPanel mainPanel = GTGuis.createPanel(this, 176, 18 + 18 * 4 + 94); + final boolean isStocking = getAEHandler().isStocking(); + + return mainPanel.child(IKey.lang(getMetaFullName()) + .asWidget() + .pos(5, 5)) + .child(SlotGroupWidget.playerInventory() + .left(7) + .bottom(7)) + .child(IKey.lang(() -> isOnline() ? "gregtech.gui.me_network.online" : + "gregtech.gui.me_network.offline") + .asWidget() + .marginLeft(5) + .widthRel(1.0f) + .top(15)) + .child(createConfigGrid(guiData, panelSyncManager)) + .child(Flow.column() + .pos(7 + 18 * 4, 25) + .size(18, 18 * 4) + .child(createMainColumnWidget(0, guiData, panelSyncManager)) + .child(createMainColumnWidget(1, guiData, panelSyncManager)) + .child(createMainColumnWidget(2, guiData, panelSyncManager)) + .child(createMainColumnWidget(3, guiData, panelSyncManager))) + .child(createDisplayGrid(guiData, panelSyncManager)) + .child(Flow.row() + .width(isStocking ? 18 : 18 * 2) + .height(18) + .top(5) + .right(7) + .childIf(!isStocking, getMultiplierWidget(guiData, panelSyncManager)) + .child(getSettingWidget(guiData, panelSyncManager))); + } + + protected abstract @NotNull Widget createConfigGrid(@NotNull PosGuiData guiData, + @NotNull PanelSyncManager panelSyncManager); + + protected abstract @NotNull Widget createDisplayGrid(@NotNull PosGuiData guiData, + @NotNull PanelSyncManager panelSyncManager); + + protected @NotNull Widget createMainColumnWidget(@Range(from = 0, to = 3) int index, @NotNull PosGuiData guiData, + @NotNull PanelSyncManager panelSyncManager) { + return switch (index) { + case 1 -> GTGuiTextures.ARROW_DOUBLE.asWidget(); + case 2 -> new GhostCircuitSlotWidget() + .slot(SyncHandlers.itemSlot(circuitInventory, 0)) + .background(GTGuiTextures.SLOT, GTGuiTextures.INT_CIRCUIT_OVERLAY); + default -> new Widget<>() + .size(18); + }; + } + + protected Widget getSettingWidget(@NotNull PosGuiData guiData, @NotNull PanelSyncManager guiSyncManager) { + IPanelHandler settingPopup = guiSyncManager.panel("settings_panel", this::buildSettingsPopup, true); + + return new ButtonWidget<>() + .onMousePressed(mouse -> { + if (settingPopup.isPanelOpen()) { + settingPopup.closePanel(); + } else { + settingPopup.openPanel(); + } + + return true; + }) + .addTooltipLine(IKey.lang("gregtech.machine.me.settings.button")) + .overlay(GTGuiTextures.FILTER_SETTINGS_OVERLAY); + } + + protected ModularPanel buildSettingsPopup(PanelSyncManager syncManager, IPanelHandler syncHandler) { + IntSyncValue refreshRateSync = new IntSyncValue(this::getRefreshRate, this::setRefreshRate); + ItemDrawable meControllerDrawable = new ItemDrawable(getStackForm()); + + final int width = 110; + return GTGuis.createPopupPanel("settings", width, getSettingsPopupHeight()) + .child(Flow.row() + .pos(4, 4) + .height(16) + .child(meControllerDrawable.asWidget() + .size(16) + .marginRight(4)) + .child(IKey.lang("gregtech.machine.me.settings.button") + .asWidget() + .heightRel(1.0f))) + .child(IKey.lang("gregtech.machine.me.settings.refresh_rate") + .asWidget() + .left(5) + .top(5 + 18)) + .child(new TextFieldWidget() + .left(5) + .top(15 + 18) + .size(width - 10, 10) + .setNumbers(1, Integer.MAX_VALUE) + .setDefaultNumber(ConfigHolder.compat.ae2.updateIntervals) + .value(refreshRateSync)); + } + + protected int getSettingsPopupHeight() { + return 33 + 14 + 5; + } + + protected Widget getMultiplierWidget(@NotNull PosGuiData guiData, @NotNull PanelSyncManager syncManager) { + IPanelHandler multiplierPopup = syncManager.panel("multiplier_panel", this::buildMultiplierPopup, true); + + return new ButtonWidget<>() + .onMousePressed(mouse -> { + if (multiplierPopup.isPanelOpen()) { + multiplierPopup.closePanel(); + } else { + multiplierPopup.openPanel(); + } + + return true; + }) + .addTooltipLine(IKey.lang("gregtech.machine.me.multiplier.button")) + .overlay(GTGuiTextures.ARROW_OPPOSITE); + } + + protected ModularPanel buildMultiplierPopup(PanelSyncManager syncManager, IPanelHandler syncHandler) { + AEFluidSyncHandler aeSyncHandler = (AEFluidSyncHandler) ((PanelSyncHandler) syncHandler).getSyncManager() + .getSyncHandler(PanelSyncManager.makeSyncKey(SYNC_HANDLER_NAME, 0)); + IntValue multiplier = new IntValue(2); + + return GTGuis.createPopupPanel("multiplier", 100, 35) + .child(new ButtonWidget<>() + .onMousePressed(mouse -> { + aeSyncHandler.modifyConfigAmounts( + (index, amount) -> Math.max(1, amount / multiplier.getIntValue())); + return true; + }) + .left(5) + .top(7) + .overlay(IKey.str("/"))) + .child(new TextFieldWidget() + .alignX(0.5f) + .top(5) + .widthRel(0.5f) + .height(20) + .setNumbers(2, Integer.MAX_VALUE) + .setDefaultNumber(2) + .value(multiplier)) + .child(new ButtonWidget<>() + .onMousePressed(mouse -> { + aeSyncHandler.modifyConfigAmounts((index, amount) -> GTUtility + .safeIntegerMultiplication(amount, multiplier.getIntValue())); + return true; + }) + .right(5) + .top(7) + .overlay(IKey.str("x"))); + } + + @Override + public void addToMultiBlock(MultiblockControllerBase controllerBase) { + super.addToMultiBlock(controllerBase); + circuitInventory.addNotifiableMetaTileEntity(controllerBase); + circuitInventory.addToNotifiedList(this, circuitInventory, false); + } + + @Override + public void removeFromMultiBlock(MultiblockControllerBase controllerBase) { + super.removeFromMultiBlock(controllerBase); + circuitInventory.removeNotifiableMetaTileEntity(controllerBase); + } + + @Override + public boolean isWorkingEnabled() { + return this.workingEnabled; + } + + @Override + public void setWorkingEnabled(boolean workingEnabled) { + this.workingEnabled = workingEnabled; + World world = this.getWorld(); + if (world != null && !world.isRemote) { + writeCustomData(GregtechDataCodes.WORKING_ENABLED, buf -> buf.writeBoolean(workingEnabled)); + } + } + + @Override + public boolean hasGhostCircuitInventory() { + return true; + } + + @Override + public void setGhostCircuitConfig(int config) { + if (this.circuitInventory.getCircuitValue() == config) { + return; + } + + this.circuitInventory.setCircuitValue(config); + if (!getWorld().isRemote) { + markDirty(); + } + } + + @Override + public T getCapability(Capability capability, EnumFacing side) { + if (capability == GregtechTileCapabilities.CAPABILITY_CONTROLLABLE) { + return GregtechTileCapabilities.CAPABILITY_CONTROLLABLE.cast(this); + } + + return super.getCapability(capability, side); + } + + @Override + public void writeInitialSyncData(PacketBuffer buf) { + super.writeInitialSyncData(buf); + buf.writeBoolean(this.workingEnabled); + } + + @Override + public void receiveInitialSyncData(PacketBuffer buf) { + super.receiveInitialSyncData(buf); + this.workingEnabled = buf.readBoolean(); + } + + @Override + public NBTTagCompound writeToNBT(NBTTagCompound data) { + super.writeToNBT(data); + data.setBoolean(WORKING_TAG, this.workingEnabled); + return data; + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + if (data.hasKey(WORKING_TAG, Constants.NBT.TAG_BYTE)) { + this.workingEnabled = data.getBoolean(WORKING_TAG); + } + } +} diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java index cf48e6bd2a1..277e6248be6 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java @@ -1,11 +1,7 @@ package gregtech.common.metatileentities.multi.multiblockpart.appeng; -import gregtech.api.capability.GregtechDataCodes; -import gregtech.api.capability.GregtechTileCapabilities; import gregtech.api.capability.IDataStickIntractable; -import gregtech.api.capability.IGhostSlotConfigurable; import gregtech.api.capability.INotifiableHandler; -import gregtech.api.capability.impl.GhostCircuitItemStackHandler; import gregtech.api.capability.impl.ItemHandlerList; import gregtech.api.capability.impl.NotifiableItemStackHandler; import gregtech.api.metatileentity.MetaTileEntity; @@ -15,14 +11,10 @@ import gregtech.api.metatileentity.multiblock.MultiblockAbility; import gregtech.api.metatileentity.multiblock.MultiblockControllerBase; import gregtech.api.mui.GTGuiTextures; -import gregtech.api.mui.GTGuis; -import gregtech.api.mui.sync.appeng.AEItemSyncHandler; -import gregtech.api.mui.widget.GhostCircuitSlotWidget; import gregtech.api.mui.widget.appeng.item.AEItemConfigSlot; import gregtech.api.mui.widget.appeng.item.AEItemDisplaySlot; import gregtech.api.util.GTUtility; import gregtech.client.renderer.texture.Textures; -import gregtech.common.ConfigHolder; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEItemList; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEItemSlot; import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedItemStack; @@ -33,83 +25,62 @@ import net.minecraft.nbt.NBTBase; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; -import net.minecraft.network.PacketBuffer; -import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; -import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandlerModifiable; -import appeng.api.config.Actionable; -import appeng.api.storage.IMEMonitor; import appeng.api.storage.channels.IItemStorageChannel; import appeng.api.storage.data.IAEItemStack; import codechicken.lib.render.CCRenderState; import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; -import com.cleanroommc.modularui.api.IPanelHandler; import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.api.widget.IWidget; -import com.cleanroommc.modularui.drawable.ItemDrawable; import com.cleanroommc.modularui.factory.PosGuiData; -import com.cleanroommc.modularui.screen.ModularPanel; -import com.cleanroommc.modularui.value.IntValue; -import com.cleanroommc.modularui.value.sync.IntSyncValue; -import com.cleanroommc.modularui.value.sync.PanelSyncHandler; import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.value.sync.SyncHandlers; import com.cleanroommc.modularui.widget.Widget; -import com.cleanroommc.modularui.widgets.ButtonWidget; import com.cleanroommc.modularui.widgets.ItemSlot; -import com.cleanroommc.modularui.widgets.SlotGroupWidget; -import com.cleanroommc.modularui.widgets.layout.Flow; import com.cleanroommc.modularui.widgets.layout.Grid; -import com.cleanroommc.modularui.widgets.textfield.TextFieldWidget; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.Range; import java.util.Arrays; import java.util.List; -public class MetaTileEntityMEInputBus extends MetaTileEntityAEHostableChannelPart - implements IMultiblockAbilityPart, - IGhostSlotConfigurable, IDataStickIntractable { +public class MetaTileEntityMEInputBus extends MetaTileEntityMEInputBase + implements IMultiblockAbilityPart, IDataStickIntractable { public static final String ITEM_BUFFER_TAG = "ItemSlots"; - public static final String WORKING_TAG = "WorkingEnabled"; - public static final String SYNC_HANDLER_NAME = "aeSync"; - public final static int CONFIG_SIZE = 16; protected ExportOnlyAEItemList aeItemHandler; - protected GhostCircuitItemStackHandler circuitInventory; protected NotifiableItemStackHandler extraSlotInventory; private ItemHandlerList actualImportItems; - private boolean workingEnabled = true; - public MetaTileEntityMEInputBus(ResourceLocation metaTileEntityId, int tier) { super(metaTileEntityId, tier, false, IItemStorageChannel.class); } - protected ExportOnlyAEItemList getAEItemHandler() { + @Override + public MetaTileEntity createMetaTileEntity(IGregTechTileEntity iGregTechTileEntity) { + return new MetaTileEntityMEInputBus(metaTileEntityId, getTier()); + } + + public @NotNull ExportOnlyAEItemList getAEHandler() { if (aeItemHandler == null) { aeItemHandler = new ExportOnlyAEItemList(this, CONFIG_SIZE, this.getController()); } - return aeItemHandler; - } - public boolean isAutoPull() { - return getAEItemHandler().isAutoPull(); + return aeItemHandler; } @Override protected void initializeInventory() { super.initializeInventory(); - this.aeItemHandler = getAEItemHandler(); - this.circuitInventory = new GhostCircuitItemStackHandler(this); - this.circuitInventory.addNotifiableMetaTileEntity(this); + this.aeItemHandler = getAEHandler(); this.extraSlotInventory = new NotifiableItemStackHandler(this, 1, this, false); this.extraSlotInventory.addNotifiableMetaTileEntity(this); this.actualImportItems = new ItemHandlerList( @@ -121,46 +92,6 @@ public IItemHandlerModifiable getImportItems() { return this.actualImportItems; } - @Override - public void update() { - super.update(); - if (!getWorld().isRemote && this.workingEnabled && updateMEStatus() && shouldSyncME()) { - operateOnME(); - } - } - - protected void operateOnME() { - syncME(); - } - - protected void syncME() { - IMEMonitor monitor = getMonitor(); - if (monitor == null) return; - - for (ExportOnlyAEItemSlot aeSlot : this.getAEItemHandler().getInventory()) { - // Try to clear the wrong item - IAEItemStack exceedItem = aeSlot.exceedStack(); - if (exceedItem != null) { - long total = exceedItem.getStackSize(); - IAEItemStack notInserted = monitor.injectItems(exceedItem, Actionable.MODULATE, this.getActionSource()); - if (notInserted != null && notInserted.getStackSize() > 0) { - aeSlot.extractItem(0, (int) (total - notInserted.getStackSize()), false); - continue; - } else { - aeSlot.extractItem(0, (int) total, false); - } - } - // Fill it - IAEItemStack reqItem = aeSlot.requestStack(); - if (reqItem != null) { - IAEItemStack extracted = monitor.extractItems(reqItem, Actionable.MODULATE, this.getActionSource()); - if (extracted != null) { - aeSlot.addStack(extracted); - } - } - } - } - @Override public void clearMachineInventory(@NotNull List<@NotNull ItemStack> itemBuffer) { ItemStack extraSlotStack = extraSlotInventory.getStackInSlot(0); @@ -169,32 +100,6 @@ public void clearMachineInventory(@NotNull List<@NotNull ItemStack> itemBuffer) } } - @Override - public void onRemoval() { - flushInventory(); - super.onRemoval(); - } - - protected void flushInventory() { - IMEMonitor monitor = getMonitor(); - if (monitor == null) return; - - for (ExportOnlyAEItemSlot aeSlot : this.getAEItemHandler().getInventory()) { - IAEItemStack stock = aeSlot.getStock(); - if (stock instanceof WrappedItemStack wrappedItemStack) { - stock = wrappedItemStack.getAEStack(); - } - if (stock != null) { - monitor.injectItems(stock, Actionable.MODULATE, this.getActionSource()); - } - } - } - - @Override - public MetaTileEntity createMetaTileEntity(IGregTechTileEntity iGregTechTileEntity) { - return new MetaTileEntityMEInputBus(metaTileEntityId, getTier()); - } - @Override public void addToMultiBlock(MultiblockControllerBase controllerBase) { super.addToMultiBlock(controllerBase); @@ -217,226 +122,67 @@ public void removeFromMultiBlock(MultiblockControllerBase controllerBase) { } @Override - public boolean usesMui2() { - return true; + protected @NotNull Widget createMainColumnWidget(@Range(from = 0, to = 3) int index, @NotNull PosGuiData guiData, + @NotNull PanelSyncManager panelSyncManager) { + if (index == 3) { + panelSyncManager.registerSlotGroup("extra_slot", 1); + return new ItemSlot() + .slot(SyncHandlers.itemSlot(extraSlotInventory, 0) + .slotGroup("extra_slot")) + .addTooltipLine(IKey.lang("gregtech.gui.me_bus.extra_slot")); + } + + return super.createMainColumnWidget(index, guiData, panelSyncManager); } @Override - public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) { - ModularPanel mainPanel = GTGuis.createPanel(this, 176, 18 + 18 * 4 + 94); - - final boolean isStocking = getAEItemHandler().isStocking(); - guiSyncManager.registerSlotGroup("extra_slot", 1); - - AEItemSyncHandler syncHandler = new AEItemSyncHandler(getAEItemHandler(), this::markDirty, circuitInventory); - guiSyncManager.syncValue(SYNC_HANDLER_NAME, 0, syncHandler); - - Grid configGrid = new Grid() + protected @NotNull Widget createConfigGrid(@NotNull PosGuiData guiData, + @NotNull PanelSyncManager panelSyncManager) { + Grid grid = new Grid() .pos(7, 25) .size(18 * 4) .minElementMargin(0, 0) .minColWidth(18) .minRowHeight(18) .matrix(Grid.mapToMatrix((int) Math.sqrt(CONFIG_SIZE), CONFIG_SIZE, - index -> new AEItemConfigSlot(isStocking, index, this::isAutoPull) + index -> new AEItemConfigSlot(isStocking(), index, this::isAutoPull) .syncHandler(SYNC_HANDLER_NAME, 0) .debugName("Index " + index))); - for (IWidget aeWidget : configGrid.getChildren()) { - ((AEItemConfigSlot) aeWidget).onSelect(() -> { - for (IWidget widget : configGrid.getChildren()) { - ((AEItemConfigSlot) widget).deselect(); + for (IWidget slotUpper : grid.getChildren()) { + ((AEItemConfigSlot) slotUpper).onSelect(() -> { + for (IWidget slotLower : grid.getChildren()) { + ((AEItemConfigSlot) slotLower).deselect(); } }); } - return mainPanel.child(IKey.lang(getMetaFullName()).asWidget().pos(5, 5)) - .child(SlotGroupWidget.playerInventory().left(7).bottom(7)) - .child(IKey.lang(() -> isOnline() ? "gregtech.gui.me_network.online" : - "gregtech.gui.me_network.offline") - .asWidget() - .marginLeft(5) - .widthRel(1.0f) - .top(15)) - .child(configGrid) - .child(new Grid() - .pos(7 + 18 * 5, 25) - .size(18 * 4) - .minElementMargin(0, 0) - .minColWidth(18) - .minRowHeight(18) - .matrix(Grid.mapToMatrix((int) Math.sqrt(CONFIG_SIZE), CONFIG_SIZE, - index -> new AEItemDisplaySlot(index) - .background(GTGuiTextures.SLOT_DARK) - .syncHandler(SYNC_HANDLER_NAME, 0) - .debugName("Index " + index)))) - .child(Flow.column() - .pos(7 + 18 * 4, 25) - .size(18, 18 * 4) - .child(getExtraButton()) - .child(GTGuiTextures.ARROW_DOUBLE.asWidget()) - .child(new GhostCircuitSlotWidget() - .slot(SyncHandlers.itemSlot(circuitInventory, 0)) - .background(GTGuiTextures.SLOT, GTGuiTextures.INT_CIRCUIT_OVERLAY)) - .child(new ItemSlot() - .slot(SyncHandlers.itemSlot(extraSlotInventory, 0) - .slotGroup("extra_slot")) - .addTooltipLine(IKey.lang("gregtech.gui.me_bus.extra_slot")))) - .child(Flow.row() - .width(isStocking ? 18 : 18 * 2) - .height(18) - .top(5) - .right(7) - .childIf(!isStocking, getMultiplierWidget(guiSyncManager)) - .child(getSettingWidget(guiSyncManager))); - } - - protected Widget getSettingWidget(PanelSyncManager guiSyncManager) { - IPanelHandler settingPopup = guiSyncManager.panel("settings_panel", this::buildSettingsPopup, true); - - return new ButtonWidget<>() - .onMousePressed(mouse -> { - if (settingPopup.isPanelOpen()) { - settingPopup.closePanel(); - } else { - settingPopup.openPanel(); - } - - return true; - }) - .addTooltipLine(IKey.lang("gregtech.machine.me.settings.button")) - .overlay(GTGuiTextures.FILTER_SETTINGS_OVERLAY); - } - - protected ModularPanel buildSettingsPopup(PanelSyncManager syncManager, IPanelHandler syncHandler) { - IntSyncValue refreshRateSync = new IntSyncValue(this::getRefreshRate, this::setRefreshRate); - ItemDrawable meControllerDrawable = new ItemDrawable(getStackForm()); - - return GTGuis.createPopupPanel("settings", 110, getSettingsPopupHeight()) - .child(Flow.row() - .pos(4, 4) - .height(16) - .child(meControllerDrawable.asWidget() - .size(16) - .marginRight(4)) - .child(IKey.lang("gregtech.machine.me.settings.button") - .asWidget() - .heightRel(1.0f))) - .child(IKey.lang("gregtech.machine.me.settings.refresh_rate") - .asWidget() - .left(5) - .top(5 + 18)) - .child(new TextFieldWidget() - .left(5) - .top(15 + 18) - .size(100, 10) - .setNumbers(1, Integer.MAX_VALUE) - .setDefaultNumber(ConfigHolder.compat.ae2.updateIntervals) - .value(refreshRateSync)); - } - - protected int getSettingsPopupHeight() { - return 33 + 14 + 5; - } - - protected Widget getMultiplierWidget(PanelSyncManager syncManager) { - IPanelHandler multiplierPopup = syncManager.panel("multiplier_panel", this::buildMultiplierPopup, true); - - return new ButtonWidget<>() - .onMousePressed(mouse -> { - if (multiplierPopup.isPanelOpen()) { - multiplierPopup.closePanel(); - } else { - multiplierPopup.openPanel(); - } - - return true; - }) - .addTooltipLine(IKey.lang("gregtech.machine.me.multiplier.button")) - .overlay(GTGuiTextures.ARROW_OPPOSITE); - } - - protected ModularPanel buildMultiplierPopup(PanelSyncManager syncManager, IPanelHandler syncHandler) { - AEItemSyncHandler aeSyncHandler = (AEItemSyncHandler) ((PanelSyncHandler) syncHandler).getSyncManager() - .getSyncHandler(PanelSyncManager.makeSyncKey(SYNC_HANDLER_NAME, 0)); - IntValue multiplier = new IntValue(2); - - return GTGuis.blankPopupPanel("multiplier", 100, 32) - .child(new ButtonWidget<>() - .onMousePressed(mouse -> { - aeSyncHandler.modifyConfigAmounts( - (index, amount) -> Math.max(1, amount / multiplier.getIntValue())); - return true; - }) - .left(5) - .top(7) - .overlay(IKey.str("/"))) - .child(new TextFieldWidget() - .alignX(0.5f) - .top(5) - .widthRel(0.5f) - .height(18) - .setNumbers(2, Integer.MAX_VALUE) - .value(multiplier)) - .child(new ButtonWidget<>() - .onMousePressed(mouse -> { - aeSyncHandler.modifyConfigAmounts((index, amount) -> GTUtility - .safeIntegerMultiplication(amount, multiplier.getIntValue())); - return true; - }) - .right(5) - .top(7) - .overlay(IKey.str("x"))); - } - - protected Widget getExtraButton() { - return new Widget<>() - .size(18); - } - - @Override - public boolean isWorkingEnabled() { - return this.workingEnabled; - } - - @Override - public void setWorkingEnabled(boolean workingEnabled) { - this.workingEnabled = workingEnabled; - World world = this.getWorld(); - if (world != null && !world.isRemote) { - writeCustomData(GregtechDataCodes.WORKING_ENABLED, buf -> buf.writeBoolean(workingEnabled)); - } - } - - @Override - public T getCapability(Capability capability, EnumFacing side) { - if (capability == GregtechTileCapabilities.CAPABILITY_CONTROLLABLE) { - return GregtechTileCapabilities.CAPABILITY_CONTROLLABLE.cast(this); - } - return super.getCapability(capability, side); + return grid; } @Override - public void writeInitialSyncData(PacketBuffer buf) { - super.writeInitialSyncData(buf); - buf.writeBoolean(this.workingEnabled); - } - - @Override - public void receiveInitialSyncData(PacketBuffer buf) { - super.receiveInitialSyncData(buf); - this.workingEnabled = buf.readBoolean(); + protected @NotNull Widget createDisplayGrid(@NotNull PosGuiData guiData, + @NotNull PanelSyncManager panelSyncManager) { + return new Grid() + .pos(7 + 18 * 5, 25) + .size(18 * 4) + .minElementMargin(0, 0) + .minColWidth(18) + .minRowHeight(18) + .matrix(Grid.mapToMatrix((int) Math.sqrt(CONFIG_SIZE), CONFIG_SIZE, + index -> new AEItemDisplaySlot(index) + .background(GTGuiTextures.SLOT_DARK) + .syncHandler(SYNC_HANDLER_NAME, 0) + .debugName("Index " + index))); } @Override public NBTTagCompound writeToNBT(NBTTagCompound data) { super.writeToNBT(data); - data.setBoolean(WORKING_TAG, this.workingEnabled); - NBTTagList slots = new NBTTagList(); for (int i = 0; i < CONFIG_SIZE; i++) { - ExportOnlyAEItemSlot slot = this.getAEItemHandler().getInventory()[i]; + ExportOnlyAEItemSlot slot = this.getAEHandler().getInventory()[i]; NBTTagCompound slotTag = new NBTTagCompound(); slotTag.setInteger("slot", i); slotTag.setTag("stack", slot.serializeNBT()); @@ -454,15 +200,11 @@ public NBTTagCompound writeToNBT(NBTTagCompound data) { public void readFromNBT(NBTTagCompound data) { super.readFromNBT(data); - if (data.hasKey(WORKING_TAG)) { - this.workingEnabled = data.getBoolean(WORKING_TAG); - } - if (data.hasKey(ITEM_BUFFER_TAG, 9)) { NBTTagList slots = (NBTTagList) data.getTag(ITEM_BUFFER_TAG); for (NBTBase nbtBase : slots) { NBTTagCompound slotTag = (NBTTagCompound) nbtBase; - ExportOnlyAEItemSlot slot = this.getAEItemHandler().getInventory()[slotTag.getInteger("slot")]; + ExportOnlyAEItemSlot slot = this.getAEHandler().getInventory()[slotTag.getInteger("slot")]; slot.deserializeNBT(slotTag.getCompoundTag("stack")); } } @@ -506,22 +248,6 @@ public void registerAbilities(@NotNull AbilityInstances abilityInstances) { abilityInstances.add(this.actualImportItems); } - @Override - public boolean hasGhostCircuitInventory() { - return true; - } - - @Override - public void setGhostCircuitConfig(int config) { - if (this.circuitInventory.getCircuitValue() == config) { - return; - } - this.circuitInventory.setCircuitValue(config); - if (!getWorld().isRemote) { - markDirty(); - } - } - @Override public final void onDataStickLeftClick(EntityPlayer player, ItemStack dataStick) { NBTTagCompound tag = new NBTTagCompound(); diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java index ecf783218c0..51747457771 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java @@ -1,7 +1,5 @@ package gregtech.common.metatileentities.multi.multiblockpart.appeng; -import gregtech.api.capability.GregtechDataCodes; -import gregtech.api.capability.GregtechTileCapabilities; import gregtech.api.capability.IDataStickIntractable; import gregtech.api.capability.impl.FluidTankList; import gregtech.api.metatileentity.MetaTileEntity; @@ -10,13 +8,9 @@ import gregtech.api.metatileentity.multiblock.IMultiblockAbilityPart; import gregtech.api.metatileentity.multiblock.MultiblockAbility; import gregtech.api.mui.GTGuiTextures; -import gregtech.api.mui.GTGuis; -import gregtech.api.mui.sync.appeng.AEFluidSyncHandler; import gregtech.api.mui.widget.appeng.fluid.AEFluidConfigSlot; import gregtech.api.mui.widget.appeng.fluid.AEFluidDisplaySlot; -import gregtech.api.util.GTUtility; import gregtech.client.renderer.texture.Textures; -import gregtech.common.ConfigHolder; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEFluidList; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEFluidSlot; import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedFluidStack; @@ -27,367 +21,111 @@ import net.minecraft.nbt.NBTBase; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; -import net.minecraft.network.PacketBuffer; -import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; -import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.fluids.IFluidTank; -import appeng.api.config.Actionable; -import appeng.api.storage.IMEMonitor; import appeng.api.storage.channels.IFluidStorageChannel; import appeng.api.storage.data.IAEFluidStack; import codechicken.lib.render.CCRenderState; import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; -import com.cleanroommc.modularui.api.IPanelHandler; -import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.api.widget.IWidget; -import com.cleanroommc.modularui.drawable.ItemDrawable; import com.cleanroommc.modularui.factory.PosGuiData; -import com.cleanroommc.modularui.screen.ModularPanel; -import com.cleanroommc.modularui.value.IntValue; -import com.cleanroommc.modularui.value.sync.IntSyncValue; -import com.cleanroommc.modularui.value.sync.PanelSyncHandler; import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.widget.Widget; -import com.cleanroommc.modularui.widgets.ButtonWidget; -import com.cleanroommc.modularui.widgets.SlotGroupWidget; -import com.cleanroommc.modularui.widgets.layout.Flow; import com.cleanroommc.modularui.widgets.layout.Grid; -import com.cleanroommc.modularui.widgets.textfield.TextFieldWidget; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Arrays; import java.util.List; -public class MetaTileEntityMEInputHatch extends MetaTileEntityAEHostableChannelPart +public class MetaTileEntityMEInputHatch extends MetaTileEntityMEInputBase implements IMultiblockAbilityPart, IDataStickIntractable { public static final String FLUID_BUFFER_TAG = "FluidTanks"; - public static final String WORKING_TAG = "WorkingEnabled"; - public static final String SYNC_HANDLER_NAME = "aeSync"; - public final static int CONFIG_SIZE = 16; protected ExportOnlyAEFluidList aeFluidHandler; - private boolean workingEnabled = true; - public MetaTileEntityMEInputHatch(ResourceLocation metaTileEntityId, int tier) { super(metaTileEntityId, tier, false, IFluidStorageChannel.class); } - protected ExportOnlyAEFluidList getAEFluidHandler() { + @Override + public MetaTileEntity createMetaTileEntity(IGregTechTileEntity iGregTechTileEntity) { + return new MetaTileEntityMEInputHatch(this.metaTileEntityId, getTier()); + } + + @Override + public @NotNull ExportOnlyAEFluidList getAEHandler() { if (aeFluidHandler == null) { aeFluidHandler = new ExportOnlyAEFluidList(this, CONFIG_SIZE, this.getController()); } - return aeFluidHandler; - } - public boolean isAutoPull() { - return getAEFluidHandler().isAutoPull(); + return aeFluidHandler; } @Override protected void initializeInventory() { - getAEFluidHandler(); // initialize it + getAEHandler(); // initialize it super.initializeInventory(); } @Override protected FluidTankList createImportFluidHandler() { - return new FluidTankList(false, getAEFluidHandler().getInventory()); - } - - @Override - public void update() { - super.update(); - if (!getWorld().isRemote && this.workingEnabled && updateMEStatus() && shouldSyncME()) { - operateOnME(); - } - } - - protected void operateOnME() { - syncME(); - } - - protected void syncME() { - IMEMonitor monitor = getMonitor(); - if (monitor == null) return; - - for (ExportOnlyAEFluidSlot aeTank : this.getAEFluidHandler().getInventory()) { - // Try to clear the wrong fluid - IAEFluidStack exceedFluid = aeTank.exceedStack(); - if (exceedFluid != null) { - long total = exceedFluid.getStackSize(); - IAEFluidStack notInserted = monitor.injectItems(exceedFluid, Actionable.MODULATE, - this.getActionSource()); - if (notInserted != null && notInserted.getStackSize() > 0) { - aeTank.drain((int) (total - notInserted.getStackSize()), true); - continue; - } else { - aeTank.drain((int) total, true); - } - } - // Fill it - IAEFluidStack reqFluid = aeTank.requestStack(); - if (reqFluid != null) { - IAEFluidStack extracted = monitor.extractItems(reqFluid, Actionable.MODULATE, this.getActionSource()); - if (extracted != null) { - aeTank.addStack(extracted); - } - } - } - } - - @Override - public void onRemoval() { - flushInventory(); - super.onRemoval(); - } - - protected void flushInventory() { - IMEMonitor monitor = getMonitor(); - if (monitor == null) return; - - for (ExportOnlyAEFluidSlot aeTank : this.getAEFluidHandler().getInventory()) { - IAEFluidStack stock = aeTank.getStock(); - if (stock instanceof WrappedFluidStack wrappedFluidStack) { - stock = wrappedFluidStack.getAEStack(); - } - if (stock != null) { - monitor.injectItems(stock, Actionable.MODULATE, this.getActionSource()); - } - } - } - - @Override - public MetaTileEntity createMetaTileEntity(IGregTechTileEntity iGregTechTileEntity) { - return new MetaTileEntityMEInputHatch(this.metaTileEntityId, getTier()); - } - - @Override - public boolean usesMui2() { - return true; + return new FluidTankList(false, getAEHandler().getInventory()); } @Override - public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) { - ModularPanel mainPanel = GTGuis.createPanel(this, 176, 18 + 18 * 4 + 94); - - final boolean isStocking = getAEFluidHandler().isStocking(); - - AEFluidSyncHandler syncHandler = new AEFluidSyncHandler(getAEFluidHandler(), this::markDirty); - guiSyncManager.syncValue(SYNC_HANDLER_NAME, 0, syncHandler); - - Grid configGrid = new Grid() + protected @NotNull Widget createConfigGrid(@NotNull PosGuiData guiData, + @NotNull PanelSyncManager panelSyncManager) { + Grid grid = new Grid() .pos(7, 25) .size(18 * 4) .minElementMargin(0, 0) .minColWidth(18) .minRowHeight(18) .matrix(Grid.mapToMatrix((int) Math.sqrt(CONFIG_SIZE), CONFIG_SIZE, - index -> new AEFluidConfigSlot(isStocking, index, this::isAutoPull) + index -> new AEFluidConfigSlot(isStocking(), index, this::isAutoPull) .syncHandler(SYNC_HANDLER_NAME, 0) .debugName("Index " + index))); - for (IWidget aeWidget : configGrid.getChildren()) { - ((AEFluidConfigSlot) aeWidget).onSelect(() -> { - for (IWidget widget : configGrid.getChildren()) { - ((AEFluidConfigSlot) widget).deselect(); + for (IWidget slotUpper : grid.getChildren()) { + ((AEFluidConfigSlot) slotUpper).onSelect(() -> { + for (IWidget slotLower : grid.getChildren()) { + ((AEFluidConfigSlot) slotLower).deselect(); } }); } - return mainPanel.child(IKey.lang(getMetaFullName()).asWidget().pos(5, 5)) - .child(SlotGroupWidget.playerInventory().left(7).bottom(7)) - .child(IKey.lang(() -> isOnline() ? "gregtech.gui.me_network.online" : - "gregtech.gui.me_network.offline") - .asWidget() - .marginLeft(5) - .widthRel(1.0f) - .top(15)) - .child(configGrid) - .child(new Grid() - .pos(7 + 18 * 5, 25) - .size(18 * 4) - .minElementMargin(0, 0) - .minColWidth(18) - .minRowHeight(18) - .matrix(Grid.mapToMatrix((int) Math.sqrt(CONFIG_SIZE), CONFIG_SIZE, - index -> new AEFluidDisplaySlot(index) - .background(GTGuiTextures.SLOT_DARK) - .syncHandler(SYNC_HANDLER_NAME, 0) - .debugName("Index " + index)))) - .child(Flow.column() - .pos(7 + 18 * 4, 25) - .size(18, 18 * 4) - .child(getExtraButton()) - .child(GTGuiTextures.ARROW_DOUBLE.asWidget()) - .child(new Widget<>() - .size(18)) - .child(GTGuiTextures.getLogo(getUITheme()).asWidget() - .size(17))) - .child(Flow.row() - .width(isStocking ? 18 : 18 * 2) - .height(18) - .top(5) - .right(7) - .childIf(!isStocking, getMultiplierWidget(guiSyncManager)) - .child(getSettingWidget(guiSyncManager))); - } - - protected Widget getSettingWidget(PanelSyncManager guiSyncManager) { - IPanelHandler settingPopup = guiSyncManager.panel("settings_panel", this::buildSettingsPopup, true); - - return new ButtonWidget<>() - .onMousePressed(mouse -> { - if (settingPopup.isPanelOpen()) { - settingPopup.closePanel(); - } else { - settingPopup.openPanel(); - } - - return true; - }) - .addTooltipLine(IKey.lang("gregtech.machine.me.settings.button")) - .overlay(GTGuiTextures.FILTER_SETTINGS_OVERLAY); - } - - protected ModularPanel buildSettingsPopup(PanelSyncManager syncManager, IPanelHandler syncHandler) { - IntSyncValue refreshRateSync = new IntSyncValue(this::getRefreshRate, this::setRefreshRate); - ItemDrawable meControllerDrawable = new ItemDrawable(getStackForm()); - - final int width = 110; - return GTGuis.createPopupPanel("settings", width, getSettingsPopupHeight()) - .child(Flow.row() - .pos(4, 4) - .height(16) - .child(meControllerDrawable.asWidget() - .size(16) - .marginRight(4)) - .child(IKey.lang("gregtech.machine.me.settings.button") - .asWidget() - .heightRel(1.0f))) - .child(IKey.lang("gregtech.machine.me.settings.refresh_rate") - .asWidget() - .left(5) - .top(5 + 18)) - .child(new TextFieldWidget() - .left(5) - .top(15 + 18) - .size(width - 10, 10) - .setNumbers(1, Integer.MAX_VALUE) - .setDefaultNumber(ConfigHolder.compat.ae2.updateIntervals) - .value(refreshRateSync)); - } - - protected int getSettingsPopupHeight() { - return 33 + 14 + 5; - } - - protected Widget getMultiplierWidget(PanelSyncManager syncManager) { - IPanelHandler multiplierPopup = syncManager.panel("multiplier_panel", this::buildMultiplierPopup, true); - - return new ButtonWidget<>() - .onMousePressed(mouse -> { - if (multiplierPopup.isPanelOpen()) { - multiplierPopup.closePanel(); - } else { - multiplierPopup.openPanel(); - } - - return true; - }) - .addTooltipLine(IKey.lang("gregtech.machine.me.multiplier.button")) - .overlay(GTGuiTextures.ARROW_OPPOSITE); - } - - protected ModularPanel buildMultiplierPopup(PanelSyncManager syncManager, IPanelHandler syncHandler) { - AEFluidSyncHandler aeSyncHandler = (AEFluidSyncHandler) ((PanelSyncHandler) syncHandler).getSyncManager() - .getSyncHandler(PanelSyncManager.makeSyncKey(SYNC_HANDLER_NAME, 0)); - IntValue multiplier = new IntValue(2); - - return GTGuis.createPopupPanel("multiplier", 100, 35) - .child(new ButtonWidget<>() - .onMousePressed(mouse -> { - aeSyncHandler.modifyConfigAmounts( - (index, amount) -> Math.max(1, amount / multiplier.getIntValue())); - return true; - }) - .left(5) - .top(7) - .overlay(IKey.str("/"))) - .child(new TextFieldWidget() - .alignX(0.5f) - .top(5) - .widthRel(0.5f) - .height(20) - .setNumbers(2, Integer.MAX_VALUE) - .setDefaultNumber(2) - .value(multiplier)) - .child(new ButtonWidget<>() - .onMousePressed(mouse -> { - aeSyncHandler.modifyConfigAmounts((index, amount) -> GTUtility - .safeIntegerMultiplication(amount, multiplier.getIntValue())); - return true; - }) - .right(5) - .top(7) - .overlay(IKey.str("x"))); - } - - protected Widget getExtraButton() { - return new Widget<>() - .size(18); + return grid; } @Override - public boolean isWorkingEnabled() { - return this.workingEnabled; - } - - @Override - public void setWorkingEnabled(boolean workingEnabled) { - this.workingEnabled = workingEnabled; - World world = this.getWorld(); - if (world != null && !world.isRemote) { - writeCustomData(GregtechDataCodes.WORKING_ENABLED, buf -> buf.writeBoolean(workingEnabled)); - } - } - - @Override - public T getCapability(Capability capability, EnumFacing side) { - if (capability == GregtechTileCapabilities.CAPABILITY_CONTROLLABLE) { - return GregtechTileCapabilities.CAPABILITY_CONTROLLABLE.cast(this); - } - return super.getCapability(capability, side); - } - - @Override - public void writeInitialSyncData(PacketBuffer buf) { - super.writeInitialSyncData(buf); - buf.writeBoolean(this.workingEnabled); - } - - @Override - public void receiveInitialSyncData(PacketBuffer buf) { - super.receiveInitialSyncData(buf); - this.workingEnabled = buf.readBoolean(); + protected @NotNull Widget createDisplayGrid(@NotNull PosGuiData guiData, + @NotNull PanelSyncManager panelSyncManager) { + return new Grid() + .pos(7 + 18 * 5, 25) + .size(18 * 4) + .minElementMargin(0, 0) + .minColWidth(18) + .minRowHeight(18) + .matrix(Grid.mapToMatrix((int) Math.sqrt(CONFIG_SIZE), CONFIG_SIZE, + index -> new AEFluidDisplaySlot(index) + .background(GTGuiTextures.SLOT_DARK) + .syncHandler(SYNC_HANDLER_NAME, 0) + .debugName("Index " + index))); } @Override public NBTTagCompound writeToNBT(NBTTagCompound data) { super.writeToNBT(data); - data.setBoolean(WORKING_TAG, this.workingEnabled); - NBTTagList tanks = new NBTTagList(); for (int i = 0; i < CONFIG_SIZE; i++) { - ExportOnlyAEFluidSlot tank = this.getAEFluidHandler().getInventory()[i]; + ExportOnlyAEFluidSlot tank = this.getAEHandler().getInventory()[i]; NBTTagCompound tankTag = new NBTTagCompound(); tankTag.setInteger("slot", i); tankTag.setTag("tank", tank.serializeNBT()); @@ -402,15 +140,11 @@ public NBTTagCompound writeToNBT(NBTTagCompound data) { public void readFromNBT(NBTTagCompound data) { super.readFromNBT(data); - if (data.hasKey(WORKING_TAG)) { - this.workingEnabled = data.getBoolean(WORKING_TAG); - } - if (data.hasKey(FLUID_BUFFER_TAG, 9)) { NBTTagList tanks = (NBTTagList) data.getTag(FLUID_BUFFER_TAG); for (NBTBase nbtBase : tanks) { NBTTagCompound tankTag = (NBTTagCompound) nbtBase; - ExportOnlyAEFluidSlot tank = this.getAEFluidHandler().getInventory()[tankTag.getInteger("slot")]; + ExportOnlyAEFluidSlot tank = this.getAEHandler().getInventory()[tankTag.getInteger("slot")]; tank.deserializeNBT(tankTag.getCompoundTag("tank")); } } @@ -447,7 +181,7 @@ public MultiblockAbility getAbility() { @Override public void registerAbilities(@NotNull AbilityInstances abilityInstances) { - abilityInstances.addAll(Arrays.asList(this.getAEFluidHandler().getInventory())); + abilityInstances.addAll(Arrays.asList(this.getAEHandler().getInventory())); } @Override diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBase.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBase.java index 7028a29f7b2..99c8577996c 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBase.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBase.java @@ -2,6 +2,7 @@ import gregtech.api.capability.GregtechDataCodes; import gregtech.api.capability.GregtechTileCapabilities; +import gregtech.api.capability.IControllable; import gregtech.api.capability.INotifiableHandler; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.mui.GTGuiTextures; @@ -46,7 +47,8 @@ import java.util.function.Consumer; public abstract class MetaTileEntityMEOutputBase, RealStackType> - extends MetaTileEntityAEHostableChannelPart { + extends MetaTileEntityAEHostableChannelPart + implements IControllable { public final static String WORKING_TAG = "WorkingEnabled"; @@ -67,7 +69,7 @@ protected void initializeInventory() { @Override public void update() { super.update(); - if (!getWorld().isRemote && this.workingEnabled && this.shouldSyncME() && updateMEStatus()) { + if (!getWorld().isRemote && this.workingEnabled && this.shouldOperateOnME() && updateMEStatus()) { if (this.internalBuffer.isEmpty()) return; IMEMonitor monitor = getMonitor(); diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java index ce2bb667cb0..c3f4ef84c76 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java @@ -31,6 +31,7 @@ import codechicken.lib.raytracer.CuboidRayTraceResult; import com.cleanroommc.modularui.api.IPanelHandler; import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.factory.PosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.value.sync.BooleanSyncValue; import com.cleanroommc.modularui.value.sync.IntSyncValue; @@ -40,6 +41,7 @@ import com.cleanroommc.modularui.widgets.textfield.TextFieldWidget; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.Range; import java.util.List; import java.util.function.Predicate; @@ -66,7 +68,7 @@ public MetaTileEntity createMetaTileEntity(IGregTechTileEntity iGregTechTileEnti } @Override - protected ExportOnlyAEStockingItemList getAEItemHandler() { + public @NotNull ExportOnlyAEStockingItemList getAEHandler() { if (this.aeItemHandler == null) { this.aeItemHandler = new ExportOnlyAEStockingItemList(this, CONFIG_SIZE, getController()); } @@ -83,7 +85,7 @@ public void update() { clearInventory(0); } else { for (int i = 0; i < CONFIG_SIZE; i++) { - getAEItemHandler().getInventory()[i].setStack(null); + getAEHandler().getInventory()[i].setStack(null); } } } @@ -106,7 +108,7 @@ protected void syncME() { IMEMonitor monitor = super.getMonitor(); if (monitor == null) return; - for (ExportOnlyAEStockingItemSlot slot : this.getAEItemHandler().getInventory()) { + for (ExportOnlyAEStockingItemSlot slot : this.getAEHandler().getInventory()) { if (slot.getConfig() == null) { slot.setStack(null); } else { @@ -145,7 +147,7 @@ public void removeFromMultiBlock(MultiblockControllerBase controllerBase) { this.autoPullTest = $ -> false; if (this.autoPull) { // may as well clear if we are auto-pull, no reason to preserve the config - this.getAEItemHandler().clearConfig(); + this.getAEHandler().clearConfig(); } super.removeFromMultiBlock(controllerBase); } @@ -165,7 +167,7 @@ public void onDistinctChange(boolean newValue) { * we are attached to. Prevents dupes in certain situations. */ private void validateConfig() { - for (var slot : this.getAEItemHandler().getInventory()) { + for (var slot : this.getAEHandler().getInventory()) { if (slot.getConfig() != null) { ItemStack configuredStack = slot.getConfig().createItemStack(); if (testConfiguredInOtherBus(configuredStack)) { @@ -219,7 +221,7 @@ private void setAutoPull(boolean autoPull) { markDirty(); if (!getWorld().isRemote) { if (!this.autoPull) { - this.getAEItemHandler().clearConfig(); + this.getAEHandler().clearConfig(); } else if (updateMEStatus()) { refreshList(); syncME(); @@ -259,7 +261,7 @@ private void refreshList() { IAEItemStack selectedStack = WrappedItemStack.fromItemStack(itemStack); if (selectedStack == null) continue; IAEItemStack configStack = selectedStack.copy().setStackSize(1); - var slot = this.getAEItemHandler().getInventory()[index]; + var slot = this.getAEHandler().getInventory()[index]; slot.setConfig(configStack); slot.setStack(selectedStack); index++; @@ -270,7 +272,7 @@ private void refreshList() { private void clearInventory(int startIndex) { for (int i = startIndex; i < CONFIG_SIZE; i++) { - var slot = this.getAEItemHandler().getInventory()[i]; + var slot = this.getAEHandler().getInventory()[i]; slot.setConfig(null); slot.setStack(null); } @@ -286,8 +288,6 @@ public void receiveCustomData(int dataId, PacketBuffer buf) { @Override protected ModularPanel buildSettingsPopup(PanelSyncManager syncManager, IPanelHandler syncHandler) { - IntSyncValue minimumStockSync = new IntSyncValue(this::getMinimumStackSize, this::setMinimumStackSize); - return super.buildSettingsPopup(syncManager, syncHandler) .child(IKey.lang("gregtech.machine.me.settings.minimum") .asWidget() @@ -299,7 +299,7 @@ protected ModularPanel buildSettingsPopup(PanelSyncManager syncManager, IPanelHa .size(100, 10) .setNumbers(0, Integer.MAX_VALUE) .setDefaultNumber(0) - .value(minimumStockSync)); + .value(new IntSyncValue(this::getMinimumStackSize, this::setMinimumStackSize))); } @Override @@ -308,18 +308,21 @@ protected int getSettingsPopupHeight() { } @Override - protected Widget getExtraButton() { - BooleanSyncValue autoPullSync = new BooleanSyncValue(() -> autoPull, this::setAutoPull); + protected @NotNull Widget createMainColumnWidget(@Range(from = 0, to = 3) int index, @NotNull PosGuiData guiData, + @NotNull PanelSyncManager panelSyncManager) { + if (index == 0) { + return new ToggleButton() + .size(16) + .margin(1) + .value(new BooleanSyncValue(this::isAutoPull, this::setAutoPull)) + .disableHoverBackground() + .overlay(false, GTGuiTextures.AUTO_PULL[0]) + .overlay(true, GTGuiTextures.AUTO_PULL[1]) + .addTooltip(false, IKey.lang("gregtech.machine.me.stocking_auto_pull_disabled")) + .addTooltip(true, IKey.lang("gregtech.machine.me.stocking_auto_pull_enabled")); + } - return new ToggleButton() - .size(16) - .margin(1) - .value(autoPullSync) - .disableHoverBackground() - .overlay(false, GTGuiTextures.AUTO_PULL[0]) - .overlay(true, GTGuiTextures.AUTO_PULL[1]) - .addTooltip(false, IKey.lang("gregtech.machine.me.stocking_auto_pull_disabled")) - .addTooltip(true, IKey.lang("gregtech.machine.me.stocking_auto_pull_enabled")); + return super.createMainColumnWidget(index, guiData, panelSyncManager); } public void setMinimumStackSize(int minimumStackSize) { @@ -381,7 +384,7 @@ public void receiveInitialSyncData(PacketBuffer buf) { this.autoPull = buf.readBoolean(); } - private static class ExportOnlyAEStockingItemSlot extends ExportOnlyAEItemSlot { + public static class ExportOnlyAEStockingItemSlot extends ExportOnlyAEItemSlot { private final MetaTileEntityMEStockingBus holder; @@ -513,7 +516,7 @@ protected void createInventory(MetaTileEntity holder) { } @Override - public ExportOnlyAEStockingItemSlot[] getInventory() { + public @NotNull ExportOnlyAEStockingItemSlot @NotNull [] getInventory() { return (ExportOnlyAEStockingItemSlot[]) super.getInventory(); } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java index c812d48f18c..941d3ad20de 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java @@ -29,6 +29,7 @@ import codechicken.lib.raytracer.CuboidRayTraceResult; import com.cleanroommc.modularui.api.IPanelHandler; import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.factory.PosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.value.sync.BooleanSyncValue; import com.cleanroommc.modularui.value.sync.IntSyncValue; @@ -38,6 +39,7 @@ import com.cleanroommc.modularui.widgets.textfield.TextFieldWidget; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.Range; import java.util.List; import java.util.function.Predicate; @@ -64,7 +66,7 @@ public MetaTileEntity createMetaTileEntity(IGregTechTileEntity iGregTechTileEnti } @Override - protected ExportOnlyAEStockingFluidList getAEFluidHandler() { + public @NotNull ExportOnlyAEStockingFluidList getAEHandler() { if (this.aeFluidHandler == null) { this.aeFluidHandler = new ExportOnlyAEStockingFluidList(this, CONFIG_SIZE, getController()); } @@ -78,10 +80,10 @@ public void update() { // Immediately clear cached fluids if the status changed, to prevent running recipes while offline if (this.meStatusChanged && !isOnline()) { if (autoPull) { - this.getAEFluidHandler().clearConfig(); + this.getAEHandler().clearConfig(); } else { for (int i = 0; i < CONFIG_SIZE; i++) { - getAEFluidHandler().getInventory()[i].setStack(null); + getAEHandler().getInventory()[i].setStack(null); } } } @@ -102,7 +104,7 @@ protected void syncME() { IMEMonitor monitor = super.getMonitor(); if (monitor == null) return; - for (ExportOnlyAEStockingFluidSlot slot : this.getAEFluidHandler().getInventory()) { + for (ExportOnlyAEStockingFluidSlot slot : this.getAEHandler().getInventory()) { if (slot.getConfig() == null) { slot.setStack(null); } else { @@ -136,13 +138,13 @@ public void addToMultiBlock(MultiblockControllerBase controllerBase) { public void removeFromMultiBlock(MultiblockControllerBase controllerBase) { this.autoPullTest = $ -> false; if (this.autoPull) { - this.getAEFluidHandler().clearConfig(); + this.getAEHandler().clearConfig(); } super.removeFromMultiBlock(controllerBase); } private void validateConfig() { - for (var slot : this.getAEFluidHandler().getInventory()) { + for (var slot : this.getAEHandler().getInventory()) { if (slot.getConfig() != null) { FluidStack configuredStack = slot.getConfig().getFluidStack(); if (testConfiguredInOtherHatch(configuredStack)) { @@ -162,7 +164,7 @@ private boolean testConfiguredInOtherHatch(FluidStack stack) { for (var ability : abilityList) { if (ability instanceof ExportOnlyAEStockingFluidSlot aeSlot) { if (aeSlot.getConfig() == null) continue; - if (getAEFluidHandler().ownsSlot(aeSlot)) continue; + if (getAEHandler().ownsSlot(aeSlot)) continue; if (aeSlot.getConfig().getFluid().equals(stack.getFluid())) { return true; } @@ -177,7 +179,7 @@ private void setAutoPull(boolean autoPull) { markDirty(); if (!getWorld().isRemote) { if (!this.autoPull) { - this.getAEFluidHandler().clearConfig(); + this.getAEHandler().clearConfig(); } else if (updateMEStatus()) { refreshList(); syncME(); @@ -211,7 +213,7 @@ private void refreshList() { if (autoPullTest != null && !autoPullTest.test(fluidStack)) continue; IAEFluidStack selectedStack = WrappedFluidStack.fromFluidStack(fluidStack); IAEFluidStack configStack = selectedStack.copy().setStackSize(1); - var slot = this.getAEFluidHandler().getInventory()[index]; + var slot = this.getAEHandler().getInventory()[index]; slot.setConfig(configStack); slot.setStack(selectedStack); index++; @@ -222,7 +224,7 @@ private void refreshList() { private void clearInventory(int startIndex) { for (int i = startIndex; i < CONFIG_SIZE; i++) { - var slot = this.getAEFluidHandler().getInventory()[i]; + var slot = this.getAEHandler().getInventory()[i]; slot.setConfig(null); slot.setStack(null); } @@ -260,18 +262,21 @@ protected int getSettingsPopupHeight() { } @Override - protected Widget getExtraButton() { - BooleanSyncValue autoPullSync = new BooleanSyncValue(() -> autoPull, this::setAutoPull); - - return new ToggleButton() - .size(16) - .margin(1) - .value(autoPullSync) - .disableHoverBackground() - .overlay(false, GTGuiTextures.AUTO_PULL[0]) - .overlay(true, GTGuiTextures.AUTO_PULL[1]) - .addTooltip(false, IKey.lang("gregtech.machine.me.stocking_auto_pull_disabled")) - .addTooltip(true, IKey.lang("gregtech.machine.me.stocking_auto_pull_enabled")); + protected @NotNull Widget createMainColumnWidget(@Range(from = 0, to = 3) int index, @NotNull PosGuiData guiData, + @NotNull PanelSyncManager panelSyncManager) { + if (index == 0) { + return new ToggleButton() + .size(16) + .margin(1) + .value(new BooleanSyncValue(this::isAutoPull, this::setAutoPull)) + .disableHoverBackground() + .overlay(false, GTGuiTextures.AUTO_PULL[0]) + .overlay(true, GTGuiTextures.AUTO_PULL[1]) + .addTooltip(false, IKey.lang("gregtech.machine.me.stocking_auto_pull_disabled")) + .addTooltip(true, IKey.lang("gregtech.machine.me.stocking_auto_pull_enabled")); + } + + return super.createMainColumnWidget(index, guiData, panelSyncManager); } public void setMinimumStackSize(int minimumStackSize) { @@ -380,7 +385,7 @@ protected void readConfigFromTag(NBTTagCompound tag) { super.readConfigFromTag(tag); } - private static class ExportOnlyAEStockingFluidSlot extends ExportOnlyAEFluidSlot { + public static class ExportOnlyAEStockingFluidSlot extends ExportOnlyAEFluidSlot { public ExportOnlyAEStockingFluidSlot(MetaTileEntityMEStockingHatch holder, IAEFluidStack config, IAEFluidStack stock, MetaTileEntity entityToNotify) { @@ -461,7 +466,7 @@ protected void createInventory(MetaTileEntity holder, MetaTileEntity entityToNot } @Override - public ExportOnlyAEStockingFluidSlot[] getInventory() { + public @NotNull ExportOnlyAEStockingFluidSlot @NotNull [] getInventory() { return (ExportOnlyAEStockingFluidSlot[]) super.getInventory(); } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEFluidList.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEFluidList.java index fd4b40ea7e5..600e9372d6b 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEFluidList.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEFluidList.java @@ -5,8 +5,9 @@ import net.minecraftforge.fluids.FluidStack; import appeng.api.storage.data.IAEFluidStack; +import org.jetbrains.annotations.NotNull; -public class ExportOnlyAEFluidList { +public class ExportOnlyAEFluidList implements IExportOnlyAEStackList { protected final int size; protected ExportOnlyAEFluidSlot[] inventory; @@ -23,7 +24,7 @@ protected void createInventory(MetaTileEntity holder, MetaTileEntity entityToNot } } - public ExportOnlyAEFluidSlot[] getInventory() { + public @NotNull ExportOnlyAEFluidSlot @NotNull [] getInventory() { return inventory; } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEFluidSlot.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEFluidSlot.java index 0329ccd37bb..2c7471f44fc 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEFluidSlot.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEFluidSlot.java @@ -39,6 +39,12 @@ public ExportOnlyAEFluidSlot() { super(); } + @Override + public void decrementStock(long amount) { + if (stock == null) return; + stock.decStackSize(amount); + } + @Override public IAEFluidStack requestStack() { IAEFluidStack result = super.requestStack(); diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEItemList.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEItemList.java index 995670eff15..31b5631d619 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEItemList.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEItemList.java @@ -9,7 +9,7 @@ import appeng.api.storage.data.IAEItemStack; import org.jetbrains.annotations.NotNull; -public class ExportOnlyAEItemList extends NotifiableItemStackHandler { +public class ExportOnlyAEItemList extends NotifiableItemStackHandler implements IExportOnlyAEStackList { protected final int size; protected ExportOnlyAEItemSlot[] inventory; @@ -30,7 +30,7 @@ protected void createInventory(MetaTileEntity holder) { } } - public ExportOnlyAEItemSlot[] getInventory() { + public @NotNull ExportOnlyAEItemSlot @NotNull [] getInventory() { return inventory; } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEItemSlot.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEItemSlot.java index 72b6b7d94ed..fc7fe955755 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEItemSlot.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEItemSlot.java @@ -44,6 +44,12 @@ public void deserializeNBT(NBTTagCompound nbt) { this.stock == null ? null : this.stock.copy()); } + @Override + public void decrementStock(long amount) { + if (stock == null) return; + stock.decStackSize(amount); + } + @Override public void setStackInSlot(int slot, @NotNull ItemStack stack) {} diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAESlot.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAESlot.java index 236152a69bc..1fa89d534e0 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAESlot.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAESlot.java @@ -47,9 +47,11 @@ public T exceedStack() { if (this.stock != null && !this.stock.isMeaningful()) { this.stock = null; } + if (this.config == null && this.stock != null) { return this.stock.copy(); } + if (this.config != null && this.stock != null) { if (this.config.equals(this.stock) && this.config.getStackSize() < this.stock.getStackSize()) { return this.stock.copy().setStackSize(this.stock.getStackSize() - this.config.getStackSize()); @@ -58,6 +60,7 @@ public T exceedStack() { return this.stock.copy(); } } + return null; } @@ -65,6 +68,8 @@ public T exceedStack() { public abstract void setStack(T stack); + public abstract void decrementStock(long amount); + @Override public NBTTagCompound serializeNBT() { NBTTagCompound tag = new NBTTagCompound(); diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/IExportOnlyAEStackList.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/IExportOnlyAEStackList.java new file mode 100644 index 00000000000..e226f62af2f --- /dev/null +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/IExportOnlyAEStackList.java @@ -0,0 +1,14 @@ +package gregtech.common.metatileentities.multi.multiblockpart.appeng.slot; + +import appeng.api.storage.data.IAEStack; +import org.jetbrains.annotations.NotNull; + +public interface IExportOnlyAEStackList> { + + @NotNull + ExportOnlyAESlot @NotNull [] getInventory(); + + boolean isAutoPull(); + + boolean isStocking(); +} From 9b3e7fc6f4bc3064fc8d99c3d8733babfab175e2 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Mon, 22 Sep 2025 14:53:52 -0400 Subject: [PATCH 121/136] Fix handler init stuff --- .../api/capability/impl/ItemHandlerList.java | 4 +- .../appeng/MetaTileEntityMEInputBase.java | 16 +++++++- .../appeng/MetaTileEntityMEInputBus.java | 40 ++++++++----------- .../appeng/MetaTileEntityMEInputHatch.java | 27 +++++-------- .../appeng/MetaTileEntityMEOutputBase.java | 5 +++ .../appeng/MetaTileEntityMEStockingBus.java | 13 +++--- .../appeng/MetaTileEntityMEStockingHatch.java | 11 +++-- 7 files changed, 64 insertions(+), 52 deletions(-) diff --git a/src/main/java/gregtech/api/capability/impl/ItemHandlerList.java b/src/main/java/gregtech/api/capability/impl/ItemHandlerList.java index 4f45f7b6d45..8cf116b5af5 100644 --- a/src/main/java/gregtech/api/capability/impl/ItemHandlerList.java +++ b/src/main/java/gregtech/api/capability/impl/ItemHandlerList.java @@ -20,9 +20,11 @@ public class ItemHandlerList implements IItemHandlerModifiable { private final Int2ObjectMap handlerBySlotIndex = new Int2ObjectOpenHashMap<>(); private final Object2IntMap baseIndexOffset = new Object2IntArrayMap<>(); - public ItemHandlerList(List itemHandlerList) { + public ItemHandlerList(@NotNull List itemHandlerList) { int currentSlotIndex = 0; for (IItemHandler itemHandler : itemHandlerList) { + Objects.requireNonNull(itemHandler, "Handler passed to ItemHandlerList was null."); + if (baseIndexOffset.containsKey(itemHandler)) { throw new IllegalArgumentException("Attempted to add item handler " + itemHandler + " twice"); } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBase.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBase.java index 0cb62a9484a..6b7b5dd571c 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBase.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBase.java @@ -54,6 +54,7 @@ public abstract class MetaTileEntityMEInputBase aeHandler; protected GhostCircuitItemStackHandler circuitInventory; protected boolean workingEnabled = true; @@ -64,9 +65,15 @@ public MetaTileEntityMEInputBase(ResourceLocation metaTileEntityId, int tier, bo @Override protected void initializeInventory() { + super.initializeInventory(); + this.aeHandler = initializeAEHandler(); this.circuitInventory = new GhostCircuitItemStackHandler(this); } + protected abstract @NotNull IExportOnlyAEStackList initializeAEHandler(); + + public abstract @NotNull IExportOnlyAEStackList getAEHandler(); + @Override public void update() { super.update(); @@ -75,8 +82,6 @@ public void update() { } } - public abstract @NotNull IExportOnlyAEStackList getAEHandler(); - public boolean isAutoPull() { return getAEHandler().isAutoPull(); } @@ -359,10 +364,16 @@ public void receiveInitialSyncData(PacketBuffer buf) { this.workingEnabled = buf.readBoolean(); } + @Override + protected boolean shouldSerializeInventories() { + return false; + } + @Override public NBTTagCompound writeToNBT(NBTTagCompound data) { super.writeToNBT(data); data.setBoolean(WORKING_TAG, this.workingEnabled); + this.circuitInventory.write(data); return data; } @@ -372,5 +383,6 @@ public void readFromNBT(NBTTagCompound data) { if (data.hasKey(WORKING_TAG, Constants.NBT.TAG_BYTE)) { this.workingEnabled = data.getBoolean(WORKING_TAG); } + this.circuitInventory.read(data); } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java index 277e6248be6..c8c45787cb1 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java @@ -17,6 +17,7 @@ import gregtech.client.renderer.texture.Textures; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEItemList; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEItemSlot; +import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.IExportOnlyAEStackList; import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedItemStack; import net.minecraft.client.resources.I18n; @@ -56,9 +57,7 @@ public class MetaTileEntityMEInputBus extends MetaTileEntityMEInputBase initializeAEHandler() { + return new ExportOnlyAEItemList(this, CONFIG_SIZE, this.getController()); + } + + public @NotNull ExportOnlyAEItemList getAEHandler() { + return (ExportOnlyAEItemList) aeHandler; } @Override @@ -103,7 +97,7 @@ public void clearMachineInventory(@NotNull List<@NotNull ItemStack> itemBuffer) @Override public void addToMultiBlock(MultiblockControllerBase controllerBase) { super.addToMultiBlock(controllerBase); - for (IItemHandler handler : this.actualImportItems.getBackingHandlers()) { + for (IItemHandler handler : ((ItemHandlerList) this.importItems).getBackingHandlers()) { if (handler instanceof INotifiableHandler notifiable) { notifiable.addNotifiableMetaTileEntity(controllerBase); notifiable.addToNotifiedList(this, handler, false); @@ -114,7 +108,7 @@ public void addToMultiBlock(MultiblockControllerBase controllerBase) { @Override public void removeFromMultiBlock(MultiblockControllerBase controllerBase) { super.removeFromMultiBlock(controllerBase); - for (IItemHandler handler : this.actualImportItems.getBackingHandlers()) { + for (IItemHandler handler : ((ItemHandlerList) this.importItems).getBackingHandlers()) { if (handler instanceof INotifiableHandler notifiable) { notifiable.removeNotifiableMetaTileEntity(controllerBase); } @@ -190,7 +184,6 @@ public NBTTagCompound writeToNBT(NBTTagCompound data) { } data.setTag(ITEM_BUFFER_TAG, slots); - this.circuitInventory.write(data); GTUtility.writeItems(this.extraSlotInventory, "ExtraInventory", data); return data; @@ -209,7 +202,6 @@ public void readFromNBT(NBTTagCompound data) { } } - this.circuitInventory.read(data); GTUtility.readItems(this.extraSlotInventory, "ExtraInventory", data); this.importItems = createImportItemHandler(); } @@ -245,7 +237,7 @@ public MultiblockAbility getAbility() { @Override public void registerAbilities(@NotNull AbilityInstances abilityInstances) { - abilityInstances.add(this.actualImportItems); + abilityInstances.add(this.importItems); } @Override @@ -262,7 +254,7 @@ protected NBTTagCompound writeConfigToTag() { NBTTagCompound configStacks = new NBTTagCompound(); tag.setTag("ConfigStacks", configStacks); for (int i = 0; i < CONFIG_SIZE; i++) { - var slot = this.aeItemHandler.getInventory()[i]; + var slot = this.aeHandler.getInventory()[i]; IAEItemStack config = slot.getConfig(); if (config == null) { continue; @@ -298,9 +290,9 @@ protected void readConfigFromTag(NBTTagCompound tag) { String key = Integer.toString(i); if (configStacks.hasKey(key)) { NBTTagCompound configTag = configStacks.getCompoundTag(key); - this.aeItemHandler.getInventory()[i].setConfig(WrappedItemStack.fromNBT(configTag)); + this.aeHandler.getInventory()[i].setConfig(WrappedItemStack.fromNBT(configTag)); } else { - this.aeItemHandler.getInventory()[i].setConfig(null); + this.aeHandler.getInventory()[i].setConfig(null); } } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java index 51747457771..9ee8d6b0c56 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java @@ -13,6 +13,7 @@ import gregtech.client.renderer.texture.Textures; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEFluidList; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEFluidSlot; +import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.IExportOnlyAEStackList; import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedFluidStack; import net.minecraft.client.resources.I18n; @@ -47,8 +48,6 @@ public class MetaTileEntityMEInputHatch extends MetaTileEntityMEInputBase initializeAEHandler() { + return new ExportOnlyAEFluidList(this, CONFIG_SIZE, this.getController()); } @Override - protected FluidTankList createImportFluidHandler() { - return new FluidTankList(false, getAEHandler().getInventory()); + public @NotNull ExportOnlyAEFluidList getAEHandler() { + return (ExportOnlyAEFluidList) aeHandler; } @Override @@ -198,7 +193,7 @@ protected NBTTagCompound writeConfigToTag() { NBTTagCompound configStacks = new NBTTagCompound(); tag.setTag("ConfigStacks", configStacks); for (int i = 0; i < CONFIG_SIZE; i++) { - var slot = this.aeFluidHandler.getInventory()[i]; + var slot = this.aeHandler.getInventory()[i]; IAEFluidStack config = slot.getConfig(); if (config == null) { continue; @@ -232,9 +227,9 @@ protected void readConfigFromTag(NBTTagCompound tag) { String key = Integer.toString(i); if (configStacks.hasKey(key)) { NBTTagCompound configTag = configStacks.getCompoundTag(key); - this.aeFluidHandler.getInventory()[i].setConfig(WrappedFluidStack.fromNBT(configTag)); + this.aeHandler.getInventory()[i].setConfig(WrappedFluidStack.fromNBT(configTag)); } else { - this.aeFluidHandler.getInventory()[i].setConfig(null); + this.aeHandler.getInventory()[i].setConfig(null); } } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBase.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBase.java index 99c8577996c..c63174be4ae 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBase.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBase.java @@ -180,6 +180,11 @@ public void receiveInitialSyncData(PacketBuffer buf) { this.workingEnabled = buf.readBoolean(); } + @Override + protected boolean shouldSerializeInventories() { + return false; + } + @Override public NBTTagCompound writeToNBT(NBTTagCompound data) { super.writeToNBT(data); diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java index c3f4ef84c76..dd36718de63 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java @@ -10,6 +10,7 @@ import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEItemList; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEItemSlot; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.IConfigurableSlot; +import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.IExportOnlyAEStackList; import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedItemStack; import net.minecraft.client.resources.I18n; @@ -67,12 +68,14 @@ public MetaTileEntity createMetaTileEntity(IGregTechTileEntity iGregTechTileEnti return new MetaTileEntityMEStockingBus(metaTileEntityId, getTier()); } + @Override + protected @NotNull IExportOnlyAEStackList initializeAEHandler() { + return new ExportOnlyAEStockingItemList(this, CONFIG_SIZE, getController()); + } + @Override public @NotNull ExportOnlyAEStockingItemList getAEHandler() { - if (this.aeItemHandler == null) { - this.aeItemHandler = new ExportOnlyAEStockingItemList(this, CONFIG_SIZE, getController()); - } - return (ExportOnlyAEStockingItemList) this.aeItemHandler; + return (ExportOnlyAEStockingItemList) aeHandler; } @Override @@ -209,7 +212,7 @@ private boolean testConfiguredInOtherBus(@Nullable ItemStack stack) { private boolean checkHandler(@NotNull IItemHandler itemHandler, @NotNull ItemStack stack) { if (itemHandler instanceof ExportOnlyAEStockingItemList itemList) { - if (itemList == this.aeItemHandler) return false; + if (itemList == this.aeHandler) return false; return itemList.hasStackInConfig(stack, false); } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java index 941d3ad20de..31f9bed7415 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java @@ -8,6 +8,7 @@ import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEFluidList; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEFluidSlot; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.IConfigurableSlot; +import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.IExportOnlyAEStackList; import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedFluidStack; import net.minecraft.client.resources.I18n; @@ -65,12 +66,14 @@ public MetaTileEntity createMetaTileEntity(IGregTechTileEntity iGregTechTileEnti return new MetaTileEntityMEStockingHatch(metaTileEntityId, getTier()); } + @Override + protected @NotNull IExportOnlyAEStackList initializeAEHandler() { + return new ExportOnlyAEStockingFluidList(this, CONFIG_SIZE, getController()); + } + @Override public @NotNull ExportOnlyAEStockingFluidList getAEHandler() { - if (this.aeFluidHandler == null) { - this.aeFluidHandler = new ExportOnlyAEStockingFluidList(this, CONFIG_SIZE, getController()); - } - return (ExportOnlyAEStockingFluidList) this.aeFluidHandler; + return (ExportOnlyAEStockingFluidList) this.aeHandler; } @Override From 2d2c600fa8620cdcc8489229490d28952fdf779c Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Mon, 22 Sep 2025 15:22:02 -0400 Subject: [PATCH 122/136] Circuit slot in input hatches --- .../appeng/MetaTileEntityMEInputBase.java | 16 +++++++++++++--- .../appeng/MetaTileEntityMEInputBus.java | 7 +++++++ .../appeng/MetaTileEntityMEInputHatch.java | 19 +++++++++++++++++++ 3 files changed, 39 insertions(+), 3 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBase.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBase.java index 6b7b5dd571c..6677380eea8 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBase.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBase.java @@ -9,6 +9,7 @@ import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuis; import gregtech.api.mui.sync.appeng.AEFluidSyncHandler; +import gregtech.api.mui.sync.appeng.AESyncHandler; import gregtech.api.mui.widget.GhostCircuitSlotWidget; import gregtech.api.util.GTUtility; import gregtech.common.ConfigHolder; @@ -146,11 +147,15 @@ public boolean usesMui2() { return true; } + protected abstract @NotNull AESyncHandler createAESyncHandler(); + @Override public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManager) { ModularPanel mainPanel = GTGuis.createPanel(this, 176, 18 + 18 * 4 + 94); final boolean isStocking = getAEHandler().isStocking(); + panelSyncManager.syncValue(SYNC_HANDLER_NAME, 0, createAESyncHandler()); + return mainPanel.child(IKey.lang(getMetaFullName()) .asWidget() .pos(5, 5)) @@ -191,14 +196,19 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManage @NotNull PanelSyncManager panelSyncManager) { return switch (index) { case 1 -> GTGuiTextures.ARROW_DOUBLE.asWidget(); - case 2 -> new GhostCircuitSlotWidget() - .slot(SyncHandlers.itemSlot(circuitInventory, 0)) - .background(GTGuiTextures.SLOT, GTGuiTextures.INT_CIRCUIT_OVERLAY); + case 2 -> createGhostCircuitWidget(); default -> new Widget<>() .size(18); }; } + protected @NotNull GhostCircuitSlotWidget createGhostCircuitWidget() { + // Grrr generics .background only returns ItemSlot + return (GhostCircuitSlotWidget) new GhostCircuitSlotWidget() + .slot(SyncHandlers.itemSlot(circuitInventory, 0)) + .background(GTGuiTextures.SLOT, GTGuiTextures.INT_CIRCUIT_OVERLAY); + } + protected Widget getSettingWidget(@NotNull PosGuiData guiData, @NotNull PanelSyncManager guiSyncManager) { IPanelHandler settingPopup = guiSyncManager.panel("settings_panel", this::buildSettingsPopup, true); diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java index c8c45787cb1..ca8010fcc44 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java @@ -11,6 +11,8 @@ import gregtech.api.metatileentity.multiblock.MultiblockAbility; import gregtech.api.metatileentity.multiblock.MultiblockControllerBase; import gregtech.api.mui.GTGuiTextures; +import gregtech.api.mui.sync.appeng.AEItemSyncHandler; +import gregtech.api.mui.sync.appeng.AESyncHandler; import gregtech.api.mui.widget.appeng.item.AEItemConfigSlot; import gregtech.api.mui.widget.appeng.item.AEItemDisplaySlot; import gregtech.api.util.GTUtility; @@ -115,6 +117,11 @@ public void removeFromMultiBlock(MultiblockControllerBase controllerBase) { } } + @Override + protected @NotNull AESyncHandler createAESyncHandler() { + return new AEItemSyncHandler(getAEHandler(), this::markDirty, circuitInventory::setCircuitValue); + } + @Override protected @NotNull Widget createMainColumnWidget(@Range(from = 0, to = 3) int index, @NotNull PosGuiData guiData, @NotNull PanelSyncManager panelSyncManager) { diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java index 9ee8d6b0c56..c6b3ed15fc2 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java @@ -8,6 +8,8 @@ import gregtech.api.metatileentity.multiblock.IMultiblockAbilityPart; import gregtech.api.metatileentity.multiblock.MultiblockAbility; import gregtech.api.mui.GTGuiTextures; +import gregtech.api.mui.sync.appeng.AEFluidSyncHandler; +import gregtech.api.mui.sync.appeng.AESyncHandler; import gregtech.api.mui.widget.appeng.fluid.AEFluidConfigSlot; import gregtech.api.mui.widget.appeng.fluid.AEFluidDisplaySlot; import gregtech.client.renderer.texture.Textures; @@ -39,6 +41,7 @@ import com.cleanroommc.modularui.widgets.layout.Grid; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.Range; import java.util.Arrays; import java.util.List; @@ -73,6 +76,22 @@ protected void initializeInventory() { return (ExportOnlyAEFluidList) aeHandler; } + @Override + protected @NotNull AESyncHandler createAESyncHandler() { + return new AEFluidSyncHandler(getAEHandler(), this::markDirty, circuitInventory::setCircuitValue); + } + + @Override + protected @NotNull Widget createMainColumnWidget(@Range(from = 0, to = 3) int index, @NotNull PosGuiData guiData, + @NotNull PanelSyncManager panelSyncManager) { + return switch (index) { + case 2 -> new Widget<>() + .size(18); + case 3 -> createGhostCircuitWidget(); + default -> super.createMainColumnWidget(index, guiData, panelSyncManager); + }; + } + @Override protected @NotNull Widget createConfigGrid(@NotNull PosGuiData guiData, @NotNull PanelSyncManager panelSyncManager) { From ecaeafc641ec84eaad383c5dcf4bc5b8a50efe34 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Mon, 22 Sep 2025 15:40:49 -0400 Subject: [PATCH 123/136] Actually add the circuit handler to the multiblock abilities list --- .../appeng/MetaTileEntityMEInputHatch.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java index c6b3ed15fc2..fa9a0e4ad1c 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java @@ -189,13 +189,17 @@ public void addInformation(ItemStack stack, @Nullable World player, @NotNull Lis } @Override - public MultiblockAbility getAbility() { - return MultiblockAbility.IMPORT_FLUIDS; + public @NotNull List> getAbilities() { + return Arrays.asList(MultiblockAbility.IMPORT_FLUIDS, MultiblockAbility.IMPORT_ITEMS); } @Override public void registerAbilities(@NotNull AbilityInstances abilityInstances) { - abilityInstances.addAll(Arrays.asList(this.getAEHandler().getInventory())); + if (abilityInstances.isKey(MultiblockAbility.IMPORT_FLUIDS)) { + abilityInstances.add(Arrays.asList(getAEHandler().getInventory())); + } else if (abilityInstances.isKey(MultiblockAbility.IMPORT_ITEMS)) { + abilityInstances.add(circuitInventory); + } } @Override From e02acdde94450a27863d1dc024b382fd5e77240d Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Mon, 22 Sep 2025 16:12:50 -0400 Subject: [PATCH 124/136] Fix notifiables --- ...etaTileEntityMultiblockNotifiablePart.java | 38 ++++++++++--------- .../appeng/MetaTileEntityMEInputBase.java | 14 +------ .../appeng/MetaTileEntityMEInputBus.java | 3 +- .../appeng/MetaTileEntityMEInputHatch.java | 3 +- .../appeng/MetaTileEntityMEStockingBus.java | 3 +- .../appeng/MetaTileEntityMEStockingHatch.java | 3 +- 6 files changed, 25 insertions(+), 39 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMultiblockNotifiablePart.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMultiblockNotifiablePart.java index 7efd88c5471..7f7b3831724 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMultiblockNotifiablePart.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMultiblockNotifiablePart.java @@ -9,6 +9,9 @@ import net.minecraft.util.ResourceLocation; import net.minecraftforge.fluids.IFluidTank; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + import java.util.ArrayList; import java.util.List; @@ -21,7 +24,7 @@ public MetaTileEntityMultiblockNotifiablePart(ResourceLocation metaTileEntityId, this.isExportHatch = isExportHatch; } - private List getItemHandlers() { + private @NotNull List getItemHandlers() { List notifiables = new ArrayList<>(); var mteHandler = isExportHatch ? getExportItems() : getImportItems(); if (mteHandler instanceof INotifiableHandler notifiable) { @@ -38,14 +41,14 @@ private List getItemHandlers() { return notifiables; } - private FluidTankList getFluidHandlers() { - FluidTankList handler = null; - if (isExportHatch && getExportFluids().getFluidTanks().size() > 0) { - handler = getExportFluids(); - } else if (!isExportHatch && getImportFluids().getFluidTanks().size() > 0) { - handler = getImportFluids(); + private @Nullable FluidTankList getFluidHandlers() { + if (isExportHatch) { + FluidTankList exports = getExportFluids(); + return exports.getFluidTanks().isEmpty() ? null : exports; + } else { + FluidTankList imports = getImportFluids(); + return imports.getFluidTanks().isEmpty() ? null : imports; } - return handler; } private List getPartHandlers() { @@ -57,19 +60,18 @@ private List getPartHandlers() { } } - if (this.fluidInventory.getTankProperties().length > 0) { - FluidTankList fluidTankList = getFluidHandlers(); - if (fluidTankList != null) { - for (IFluidTank fluidTank : fluidTankList) { - if (fluidTank instanceof IMultipleTankHandler.ITankEntry entry) { - fluidTank = entry.getDelegate(); - } - if (fluidTank instanceof INotifiableHandler) { - handlerList.add((INotifiableHandler) fluidTank); - } + FluidTankList fluidTankList = getFluidHandlers(); + if (fluidTankList != null) { + for (IFluidTank fluidTank : fluidTankList) { + if (fluidTank instanceof IMultipleTankHandler.ITankEntry entry) { + fluidTank = entry.getDelegate(); + } + if (fluidTank instanceof INotifiableHandler iNotifiableHandler) { + handlerList.add(iNotifiableHandler); } } } + return handlerList; } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBase.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBase.java index 6677380eea8..a074a276102 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBase.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBase.java @@ -69,6 +69,7 @@ protected void initializeInventory() { super.initializeInventory(); this.aeHandler = initializeAEHandler(); this.circuitInventory = new GhostCircuitItemStackHandler(this); + this.importItems = circuitInventory; } protected abstract @NotNull IExportOnlyAEStackList initializeAEHandler(); @@ -309,19 +310,6 @@ protected ModularPanel buildMultiplierPopup(PanelSyncManager syncManager, IPanel .overlay(IKey.str("x"))); } - @Override - public void addToMultiBlock(MultiblockControllerBase controllerBase) { - super.addToMultiBlock(controllerBase); - circuitInventory.addNotifiableMetaTileEntity(controllerBase); - circuitInventory.addToNotifiedList(this, circuitInventory, false); - } - - @Override - public void removeFromMultiBlock(MultiblockControllerBase controllerBase) { - super.removeFromMultiBlock(controllerBase); - circuitInventory.removeNotifiableMetaTileEntity(controllerBase); - } - @Override public boolean isWorkingEnabled() { return this.workingEnabled; diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java index ca8010fcc44..bd9db576eb1 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java @@ -19,7 +19,6 @@ import gregtech.client.renderer.texture.Textures; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEItemList; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEItemSlot; -import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.IExportOnlyAEStackList; import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedItemStack; import net.minecraft.client.resources.I18n; @@ -80,7 +79,7 @@ protected void initializeInventory() { } @Override - protected @NotNull IExportOnlyAEStackList initializeAEHandler() { + protected @NotNull ExportOnlyAEItemList initializeAEHandler() { return new ExportOnlyAEItemList(this, CONFIG_SIZE, this.getController()); } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java index fa9a0e4ad1c..b203458885f 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java @@ -15,7 +15,6 @@ import gregtech.client.renderer.texture.Textures; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEFluidList; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEFluidSlot; -import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.IExportOnlyAEStackList; import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedFluidStack; import net.minecraft.client.resources.I18n; @@ -67,7 +66,7 @@ protected void initializeInventory() { } @Override - protected @NotNull IExportOnlyAEStackList initializeAEHandler() { + protected @NotNull ExportOnlyAEFluidList initializeAEHandler() { return new ExportOnlyAEFluidList(this, CONFIG_SIZE, this.getController()); } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java index dd36718de63..7204f5d27c0 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java @@ -10,7 +10,6 @@ import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEItemList; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEItemSlot; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.IConfigurableSlot; -import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.IExportOnlyAEStackList; import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedItemStack; import net.minecraft.client.resources.I18n; @@ -69,7 +68,7 @@ public MetaTileEntity createMetaTileEntity(IGregTechTileEntity iGregTechTileEnti } @Override - protected @NotNull IExportOnlyAEStackList initializeAEHandler() { + protected @NotNull ExportOnlyAEStockingItemList initializeAEHandler() { return new ExportOnlyAEStockingItemList(this, CONFIG_SIZE, getController()); } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java index 31f9bed7415..6579200c26b 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java @@ -8,7 +8,6 @@ import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEFluidList; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEFluidSlot; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.IConfigurableSlot; -import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.IExportOnlyAEStackList; import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedFluidStack; import net.minecraft.client.resources.I18n; @@ -67,7 +66,7 @@ public MetaTileEntity createMetaTileEntity(IGregTechTileEntity iGregTechTileEnti } @Override - protected @NotNull IExportOnlyAEStackList initializeAEHandler() { + protected @NotNull ExportOnlyAEStockingFluidList initializeAEHandler() { return new ExportOnlyAEStockingFluidList(this, CONFIG_SIZE, getController()); } From 0a4bf36740aee487be045cc4533227a7f08c158a Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Wed, 24 Sep 2025 15:49:48 -0400 Subject: [PATCH 125/136] addline and lang --- src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java index f97f148f4c5..f102e4148f5 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java @@ -55,7 +55,7 @@ public AEConfigSlot(boolean isStocking, int index, @NotNull BooleanSupplier isAu protected void buildTooltip(@NotNull RichTooltip tooltip) { if (isAutoPull.getAsBoolean()) { - tooltip.add(I18n.format("gregtech.gui.config_slot.auto_pull_managed")); + tooltip.addLine(IKey.lang("gregtech.gui.config_slot.auto_pull_managed")); } else { if (isStocking) { tooltip.addLine(IKey.lang("gregtech.gui.config_slot.set_only")); From 1ce17aac81fed41f70df6083e9e23fe848c3735e Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Wed, 24 Sep 2025 16:33:49 -0400 Subject: [PATCH 126/136] Fix stocking hatches duping like crazy (Agh I want to redo how ARL sees and takes items from hatches so badly!1!1!) --- .../api/mui/widget/appeng/AEConfigSlot.java | 2 - .../appeng/MetaTileEntityMEInputBase.java | 1 - .../appeng/MetaTileEntityMEStockingBus.java | 55 ++++++++++--------- .../appeng/MetaTileEntityMEStockingHatch.java | 3 +- .../appeng/slot/ExportOnlyAEFluidSlot.java | 1 + .../appeng/stack/WrappedFluidStack.java | 3 +- .../appeng/stack/WrappedItemStack.java | 1 + 7 files changed, 34 insertions(+), 32 deletions(-) diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java index f102e4148f5..4bc69a5a14e 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java @@ -4,8 +4,6 @@ import gregtech.api.mui.GTGuis; import gregtech.api.mui.sync.appeng.AESyncHandler; -import net.minecraft.client.resources.I18n; - import appeng.api.storage.data.IAEStack; import com.cleanroommc.modularui.api.IPanelHandler; import com.cleanroommc.modularui.api.drawable.IDrawable; diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBase.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBase.java index a074a276102..ff4f31b393b 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBase.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBase.java @@ -5,7 +5,6 @@ import gregtech.api.capability.IControllable; import gregtech.api.capability.IGhostSlotConfigurable; import gregtech.api.capability.impl.GhostCircuitItemStackHandler; -import gregtech.api.metatileentity.multiblock.MultiblockControllerBase; import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuis; import gregtech.api.mui.sync.appeng.AEFluidSyncHandler; diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java index 7204f5d27c0..56b1ad0eba4 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java @@ -411,37 +411,38 @@ public ExportOnlyAEStockingItemSlot(MetaTileEntityMEStockingBus holder) { @Override public @NotNull ItemStack extractItem(int slot, int amount, boolean simulate) { - if (slot == 0 && this.stock != null) { - if (this.config != null) { - // Extract the items from the real net to either validate (simulate) - // or extract (modulate) when this is called - IMEMonitor monitor = holder.getMonitor(); - if (monitor == null) return ItemStack.EMPTY; - - Actionable action = simulate ? Actionable.SIMULATE : Actionable.MODULATE; - IAEItemStack request; - if (this.config instanceof WrappedItemStack wis) { - request = wis.getAEStack(); - } else { - request = this.config.copy(); + if (slot != 0 || this.stock == null || this.stock.getStackSize() <= 0) return ItemStack.EMPTY; + + if (this.config != null) { + // Extract the items from the real net to either validate (simulate) + // or extract (modulate) when this is called + IMEMonitor monitor = holder.getMonitor(); + if (monitor == null) return ItemStack.EMPTY; + + Actionable action = simulate ? Actionable.SIMULATE : Actionable.MODULATE; + IAEItemStack request; + if (this.config instanceof WrappedItemStack wis) { + request = wis.getAEStack(); + } else { + request = this.config.copy(); + } + request.setStackSize(amount); + + IAEItemStack result = monitor.extractItems(request, action, holder.getActionSource()); + if (result != null) { + int extracted = (int) Math.min(result.getStackSize(), amount); + this.stock.decStackSize(extracted); // may as well update the display here + if (this.trigger != null) { + this.trigger.accept(0); } - request.setStackSize(amount); - - IAEItemStack result = monitor.extractItems(request, action, holder.getActionSource()); - if (result != null) { - int extracted = (int) Math.min(result.getStackSize(), amount); - this.stock.decStackSize(extracted); // may as well update the display here - if (this.trigger != null) { - this.trigger.accept(0); - } - if (extracted != 0) { - ItemStack resultStack = this.config.createItemStack(); - resultStack.setCount(extracted); - return resultStack; - } + if (extracted != 0) { + ItemStack resultStack = this.config.createItemStack(); + resultStack.setCount(extracted); + return resultStack; } } } + return ItemStack.EMPTY; } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java index 6579200c26b..b10960115b9 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java @@ -414,9 +414,10 @@ protected MetaTileEntityMEStockingHatch getHolder() { @Override public @Nullable FluidStack drain(int maxDrain, boolean doDrain) { - if (this.stock == null) { + if (this.stock == null || this.stock.getStackSize() <= 0) { return null; } + if (this.config != null) { IMEMonitor monitor = getHolder().getMonitor(); if (monitor == null) return null; diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEFluidSlot.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEFluidSlot.java index 2c7471f44fc..397afc0f883 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEFluidSlot.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEFluidSlot.java @@ -105,6 +105,7 @@ public FluidStack getFluid() { if (this.stock instanceof WrappedFluidStack wrappedFluidStack) { return wrappedFluidStack.getDefinition(); } + return null; } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedFluidStack.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedFluidStack.java index 1a6c801db40..55e569bc225 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedFluidStack.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedFluidStack.java @@ -217,6 +217,7 @@ public Fluid getFluid() { @Override public @NotNull FluidStack getDefinition() { + delegate.amount = (int) stackSize; return delegate; } @@ -247,6 +248,6 @@ public int hashCode() { @Override public String toString() { - return String.format("Wrapped: %s", delegate); + return String.format("Wrapped: %s, Stack Size: %d", delegate, stackSize); } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedItemStack.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedItemStack.java index 383c7e08d00..ea337889db3 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedItemStack.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedItemStack.java @@ -250,6 +250,7 @@ public boolean isSameType(ItemStack itemStack) { @Override public @NotNull ItemStack getDefinition() { + delegate.setCount((int) stackSize); return this.delegate; } From e9290257d0dd15a562e8d09b54f4f4dd80091dec Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Wed, 24 Sep 2025 19:27:41 -0400 Subject: [PATCH 127/136] visibility change of getAEHandler --- .../multi/multiblockpart/appeng/MetaTileEntityMEInputBase.java | 2 +- .../multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java | 3 ++- .../multiblockpart/appeng/MetaTileEntityMEInputHatch.java | 3 ++- .../multiblockpart/appeng/MetaTileEntityMEStockingBus.java | 3 ++- .../multiblockpart/appeng/MetaTileEntityMEStockingHatch.java | 3 ++- 5 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBase.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBase.java index ff4f31b393b..6e833855f90 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBase.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBase.java @@ -73,7 +73,7 @@ protected void initializeInventory() { protected abstract @NotNull IExportOnlyAEStackList initializeAEHandler(); - public abstract @NotNull IExportOnlyAEStackList getAEHandler(); + protected abstract @NotNull IExportOnlyAEStackList getAEHandler(); @Override public void update() { diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java index bd9db576eb1..09b31876c7f 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java @@ -83,7 +83,8 @@ protected void initializeInventory() { return new ExportOnlyAEItemList(this, CONFIG_SIZE, this.getController()); } - public @NotNull ExportOnlyAEItemList getAEHandler() { + @NotNull + protected ExportOnlyAEItemList getAEHandler() { return (ExportOnlyAEItemList) aeHandler; } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java index b203458885f..b7396835de6 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java @@ -71,7 +71,8 @@ protected void initializeInventory() { } @Override - public @NotNull ExportOnlyAEFluidList getAEHandler() { + @NotNull + protected ExportOnlyAEFluidList getAEHandler() { return (ExportOnlyAEFluidList) aeHandler; } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java index 56b1ad0eba4..63b1300d2e6 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java @@ -73,7 +73,8 @@ public MetaTileEntity createMetaTileEntity(IGregTechTileEntity iGregTechTileEnti } @Override - public @NotNull ExportOnlyAEStockingItemList getAEHandler() { + @NotNull + protected ExportOnlyAEStockingItemList getAEHandler() { return (ExportOnlyAEStockingItemList) aeHandler; } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java index b10960115b9..b46afe94baa 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java @@ -71,7 +71,8 @@ public MetaTileEntity createMetaTileEntity(IGregTechTileEntity iGregTechTileEnti } @Override - public @NotNull ExportOnlyAEStockingFluidList getAEHandler() { + @NotNull + protected ExportOnlyAEStockingFluidList getAEHandler() { return (ExportOnlyAEStockingFluidList) this.aeHandler; } From a62f2f23117d130d4c1eb345baec98d70acafbea Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Wed, 24 Sep 2025 20:32:09 -0400 Subject: [PATCH 128/136] Add fluid name (fogor) to tooltip on amount popup and mod name --- .../widget/appeng/fluid/AEFluidStackPreviewWidget.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidStackPreviewWidget.java b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidStackPreviewWidget.java index 0ce3552abc5..61b6d0b3fe7 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidStackPreviewWidget.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidStackPreviewWidget.java @@ -2,8 +2,11 @@ import gregtech.api.mui.widget.appeng.AEStackPreviewWidget; import gregtech.api.util.FluidTooltipUtil; +import gregtech.api.util.KeyUtil; import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedFluidStack; +import net.minecraftforge.fluids.FluidStack; + import appeng.api.storage.data.IAEFluidStack; import com.cleanroommc.modularui.drawable.GuiDraw; import com.cleanroommc.modularui.screen.RichTooltip; @@ -21,7 +24,10 @@ public AEFluidStackPreviewWidget(@NotNull Supplier stackToDraw) { @Override protected void buildTooltip(@NotNull RichTooltip tooltip) { if (stackToDraw.get() instanceof WrappedFluidStack wrappedFluidStack) { - FluidTooltipUtil.fluidInfo(wrappedFluidStack.getDefinition(), tooltip, false, true, false); + FluidStack stack = wrappedFluidStack.getDefinition(); + tooltip.addLine(KeyUtil.fluid(stack)); + FluidTooltipUtil.fluidInfo(stack, tooltip, false, true, false); + tooltip.addLine(FluidTooltipUtil.getFluidModNameKey(stack)); } } From 5f213f96ddaf326f6268185a955bd19c852c41cb Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Wed, 24 Sep 2025 21:36:19 -0400 Subject: [PATCH 129/136] Support `long`s in input parts (only in buffering) --- .../api/mui/sync/appeng/AESyncHandler.java | 49 +++++++--------- .../api/mui/widget/appeng/AEConfigSlot.java | 56 +++++++------------ .../appeng/fluid/AEFluidDisplaySlot.java | 2 +- .../java/gregtech/api/util/GTUtility.java | 32 ++++++++--- .../appeng/MetaTileEntityMEInputBase.java | 14 ++--- .../appeng/MetaTileEntityMEStockingBus.java | 2 +- .../appeng/MetaTileEntityMEStockingHatch.java | 2 +- .../appeng/stack/WrappedFluidStack.java | 12 +++- .../appeng/stack/WrappedItemStack.java | 16 ++++-- 9 files changed, 93 insertions(+), 92 deletions(-) diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java index bf3fced9863..b78cadba8f8 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AESyncHandler.java @@ -1,7 +1,6 @@ package gregtech.api.mui.sync.appeng; import gregtech.api.mui.IJEIRecipeReceiver; -import gregtech.api.util.GTUtility; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.IConfigurableSlot; import net.minecraft.network.PacketBuffer; @@ -11,16 +10,14 @@ import appeng.api.storage.data.IAEStack; import com.cleanroommc.modularui.utils.serialization.IByteBufAdapter; import com.cleanroommc.modularui.value.sync.SyncHandler; -import it.unimi.dsi.fastutil.ints.Int2IntArrayMap; -import it.unimi.dsi.fastutil.ints.Int2IntMap; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.IOException; -import java.util.function.IntBinaryOperator; import java.util.function.IntConsumer; +import java.util.function.LongBinaryOperator; public abstract class AESyncHandler> extends SyncHandler implements IJEIRecipeReceiver { @@ -118,7 +115,7 @@ public void readOnServer(int id, PacketBuffer buf) throws IOException { case changeConfigAmountID -> { AEStackType config = getConfig(buf.readVarInt()); if (config != null) { - config.setStackSize(buf.readInt()); + config.setStackSize(buf.readLong()); } } case setConfigID -> { @@ -137,12 +134,11 @@ public void readOnServer(int id, PacketBuffer buf) throws IOException { } } case bulkConfigAmountChangeID -> { - int size = buf.readVarInt(); - for (int i = 0; i < size; i++) { - AEStackType config = slots[buf.readVarInt()].getConfig(); - int newAmount = buf.readInt(); + long[] changes = buf.readLongArray(new long[slots.length]); + for (int index = 0; index < slots.length; index++) { + AEStackType config = slots[index].getConfig(); if (config != null) { - config.setStackSize(newAmount); + config.setStackSize(changes[index]); } } } @@ -204,16 +200,16 @@ public boolean hasConfig(int index) { return getConfig(index) != null; } - public int getConfigAmount(int index) { + public long getConfigAmount(int index) { AEStackType config = getConfig(index); - return config == null ? 0 : GTUtility.safeCastLongToInt(config.getStackSize()); + return config == null ? 0 : config.getStackSize(); } @SideOnly(Side.CLIENT) - public void setConfigAmount(int index, int newAmount) { + public void setConfigAmount(int index, long newAmount) { syncToServer(changeConfigAmountID, buf -> { buf.writeVarInt(index); - buf.writeInt(newAmount); + buf.writeLong(newAmount); }); } @@ -228,30 +224,27 @@ public AEStackType getStock(int index) { * @param function a function that takes the slot index and the original stack size, and returns a new stack size */ @SideOnly(Side.CLIENT) - public void modifyConfigAmounts(@NotNull IntBinaryOperator function) { - Int2IntMap changeMap = new Int2IntArrayMap(slots.length); + public boolean modifyConfigAmounts(@NotNull LongBinaryOperator function) { + long[] newAmounts = new long[slots.length]; + boolean anyChanged = false; for (int index = 0; index < slots.length; index++) { AEStackType config = slots[index].getConfig(); if (config != null) { - int originalSize = GTUtility.safeCastLongToInt(config.getStackSize()); - int newSize = function.applyAsInt(index, originalSize); + long originalSize = config.getStackSize(); + long newSize = function.applyAsLong(index, originalSize); if (newSize != originalSize) { - changeMap.put(index, newSize); + anyChanged = true; + newAmounts[index] = newSize; } } } - if (!changeMap.isEmpty()) { - syncToServer(bulkConfigAmountChangeID, buf -> { - buf.writeVarInt(changeMap.size()); - - for (int index : changeMap.keySet()) { - buf.writeVarInt(index); - buf.writeInt(changeMap.get(index)); - } - }); + if (anyChanged) { + syncToServer(bulkConfigAmountChangeID, buf -> buf.writeLongArray(newAmounts)); } + + return anyChanged; } @SuppressWarnings("BooleanMethodIsAlwaysInverted") diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java index 4bc69a5a14e..a8b2e8719c9 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java @@ -10,15 +10,13 @@ import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.api.widget.Interactable; import com.cleanroommc.modularui.integration.jei.JeiIngredientProvider; -import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.screen.ModularScreen; import com.cleanroommc.modularui.screen.RichTooltip; import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; import com.cleanroommc.modularui.theme.WidgetTheme; -import com.cleanroommc.modularui.value.IntValue; +import com.cleanroommc.modularui.value.LongValue; import com.cleanroommc.modularui.value.sync.SyncHandler; import com.cleanroommc.modularui.widget.Widget; -import com.cleanroommc.modularui.widgets.ButtonWidget; import com.cleanroommc.modularui.widgets.textfield.TextFieldWidget; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -123,9 +121,8 @@ public boolean onMouseScroll(ModularScreen.UpOrDown scrollDirection, int scrollA } } - if (newStackSize > 0 && newStackSize < Integer.MAX_VALUE + 1L) { - int scaledStackSize = (int) newStackSize; - getSyncHandler().setConfigAmount(index, scaledStackSize); + if (newStackSize > 0) { + getSyncHandler().setConfigAmount(index, newStackSize); return true; } @@ -139,36 +136,23 @@ public boolean onMouseScroll(ModularScreen.UpOrDown scrollDirection, int scrollA protected IPanelHandler getAmountPanel() { if (amountPanel == null) { - amountPanel = IPanelHandler.simple(getPanel(), (parentPanel, player) -> { - ModularPanel popupPanel = GTGuis.blankPopupPanel("ae_slot_amount." + index, 100, 18 + 5 * 2) - .closeListener(onSelect) - .child(createPopupDrawable() - .size(18) - .left(5) - .top(5)) - .child(new TextFieldWidget() - .setNumbers(1, Integer.MAX_VALUE) - .setDefaultNumber(1) - .value(new IntValue.Dynamic(() -> getSyncHandler().getConfigAmount(index), - newAmount -> getSyncHandler().setConfigAmount(index, newAmount))) - .size(50, 10) - .left(18 + 5 * 2) - .top(7)); // alignY didn't work :whar: - - popupPanel.child(ButtonWidget.panelCloseButton() - .onMousePressed(button -> { - if (button == 0 || button == 1) { - popupPanel.closeIfOpen(true); - return true; - } - - return false; - }) - .right(5) - .alignY(0.5f)); - - return popupPanel; - }, true); + amountPanel = IPanelHandler.simple(getPanel(), + (parentPanel, player) -> GTGuis.blankPopupPanel("ae_slot_amount." + index, 150, 18 + 5 * 2) + .closeListener(onSelect) + .child(createPopupDrawable() + .size(18) + .left(5) + .top(5)) + .child(new TextFieldWidget() + .setNumbersLong(test -> test < 1 ? 1 : test) + .setDefaultNumber(1) + .value(new LongValue.Dynamic(() -> getSyncHandler().getConfigAmount(index), + newAmount -> getSyncHandler().setConfigAmount(index, newAmount))) + .size(100, 10) + .left(18 + 5 * 2) + // alignY didn't work :whar: + .top(7)), + true); } return amountPanel; diff --git a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidDisplaySlot.java b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidDisplaySlot.java index 5cc87f2d34c..d531c50d296 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidDisplaySlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidDisplaySlot.java @@ -32,7 +32,7 @@ protected void buildTooltip(@NotNull RichTooltip tooltip) { if (stock != null) { FluidStack stack = stock.getDefinition(); tooltip.addLine(KeyUtil.fluid(stack)); - FluidTooltipUtil.fluidInfo(stack, tooltip); + FluidTooltipUtil.fluidInfo(stack, tooltip, false, true, true); tooltip.addLine(FluidTooltipUtil.getFluidModNameKey(stack)); } } diff --git a/src/main/java/gregtech/api/util/GTUtility.java b/src/main/java/gregtech/api/util/GTUtility.java index 7c333ca2e03..d7f880cc566 100644 --- a/src/main/java/gregtech/api/util/GTUtility.java +++ b/src/main/java/gregtech/api/util/GTUtility.java @@ -955,22 +955,40 @@ public double getAsDouble() { } /** - * Safely cast a Long to an Int without overflow. + * Safely multiply two Integers without overflow or underflow, returning {@link Integer#MAX_VALUE} or + * {@link Integer#MIN_VALUE} if it would have. * - * @param v The Long value to cast to an Int. - * @return v, cast to Int, or Integer.MAX_VALUE if it would overflow. + * @param num The Long value to cast to an Int. */ - public static int safeCastLongToInt(long v) { - return v > Integer.MAX_VALUE ? Integer.MAX_VALUE : (int) v; + public static int safeCastLongToInt(long num) { + if (num > Integer.MAX_VALUE) { + return Integer.MAX_VALUE; + } else if (num < Integer.MIN_VALUE) { + return Integer.MIN_VALUE; + } else { + return (int) num; + } } /** - * Safely multiply two Ints without overflowing + * Safely multiply two Ints without overflow or underflow. */ - public static int safeIntegerMultiplication(int a, int b) { + public static int multiplySaturated(int a, int b) { return safeCastLongToInt((long) a * b); } + /** + * Safely multiply two Longs without overflow or underflow, returning {@link Long#MAX_VALUE} or + * {@link Long#MIN_VALUE} if it would have. + */ + public static long multiplySaturated(long a, long b) { + if (a > 0 && b > 0 && a > Long.MAX_VALUE / b) return Long.MAX_VALUE; + if (a < 0 && b < 0 && a < Long.MAX_VALUE / b) return Long.MAX_VALUE; + if (a > 0 && b < 0 && b < Long.MIN_VALUE / a) return Long.MIN_VALUE; + if (a < 0 && b > 0 && a < Long.MIN_VALUE / b) return Long.MIN_VALUE; + return a * b; + } + /** * Scales a proposed recipe voltage according to a provided Material working tier. * diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBase.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBase.java index 6e833855f90..7e4fda8522b 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBase.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBase.java @@ -282,11 +282,8 @@ protected ModularPanel buildMultiplierPopup(PanelSyncManager syncManager, IPanel return GTGuis.createPopupPanel("multiplier", 100, 35) .child(new ButtonWidget<>() - .onMousePressed(mouse -> { - aeSyncHandler.modifyConfigAmounts( - (index, amount) -> Math.max(1, amount / multiplier.getIntValue())); - return true; - }) + .onMousePressed(mouse -> aeSyncHandler + .modifyConfigAmounts((index, amount) -> Math.max(1, amount / multiplier.getIntValue()))) .left(5) .top(7) .overlay(IKey.str("/"))) @@ -299,11 +296,8 @@ protected ModularPanel buildMultiplierPopup(PanelSyncManager syncManager, IPanel .setDefaultNumber(2) .value(multiplier)) .child(new ButtonWidget<>() - .onMousePressed(mouse -> { - aeSyncHandler.modifyConfigAmounts((index, amount) -> GTUtility - .safeIntegerMultiplication(amount, multiplier.getIntValue())); - return true; - }) + .onMousePressed(mouse -> aeSyncHandler.modifyConfigAmounts( + (index, amount) -> GTUtility.multiplySaturated(amount, multiplier.getIntValue()))) .right(5) .top(7) .overlay(IKey.str("x"))); diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java index 63b1300d2e6..796462099bb 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java @@ -122,7 +122,7 @@ protected void syncME() { } else { request = slot.getConfig().copy(); } - request.setStackSize(Integer.MAX_VALUE); + request.setStackSize(Long.MAX_VALUE); IAEItemStack result = monitor.extractItems(request, Actionable.SIMULATE, getActionSource()); slot.setStack(result); } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java index b46afe94baa..0a2e35d57a8 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java @@ -118,7 +118,7 @@ protected void syncME() { } else { request = slot.getConfig().copy(); } - request.setStackSize(Integer.MAX_VALUE); + request.setStackSize(Long.MAX_VALUE); IAEFluidStack result = monitor.extractItems(request, Actionable.SIMULATE, getActionSource()); slot.setStack(result); } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedFluidStack.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedFluidStack.java index 55e569bc225..75f629249ca 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedFluidStack.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedFluidStack.java @@ -1,5 +1,6 @@ package gregtech.common.metatileentities.multi.multiblockpart.appeng.stack; +import gregtech.api.util.GTUtility; import gregtech.api.util.NetworkUtil; import net.minecraft.item.ItemStack; @@ -23,7 +24,7 @@ public class WrappedFluidStack implements IAEFluidStack, IWrappedStack { @NotNull - private FluidStack delegate; + private final FluidStack delegate; private long stackSize; private WrappedFluidStack(@NotNull FluidStack stack, long stackSize) { @@ -63,7 +64,9 @@ public AEFluidStack getAEStack() { @Override public FluidStack getFluidStack() { - return this.delegate.copy(); + FluidStack newStack = this.delegate.copy(); + newStack.amount = GTUtility.safeCastLongToInt(stackSize); + return newStack; } @Override @@ -217,7 +220,7 @@ public Fluid getFluid() { @Override public @NotNull FluidStack getDefinition() { - delegate.amount = (int) stackSize; + delegate.amount = GTUtility.safeCastLongToInt(stackSize); return delegate; } @@ -225,6 +228,9 @@ public Fluid getFluid() { public boolean equals(Object other) { if (other instanceof WrappedFluidStack wrappedFluidStack) { return wrappedFluidStack.delegate.isFluidEqual(this.delegate); + } else if (other instanceof AEFluidStack aeFluidStack) { + // noinspection EqualsBetweenInconvertibleTypes + return aeFluidStack.equals(delegate); } else if (other instanceof FluidStack fluidStack) { return fluidStack.isFluidEqual(this.delegate); } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedItemStack.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedItemStack.java index ea337889db3..128057c42d9 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedItemStack.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedItemStack.java @@ -1,5 +1,6 @@ package gregtech.common.metatileentities.multi.multiblockpart.appeng.stack; +import gregtech.api.util.GTUtility; import gregtech.api.util.NetworkUtil; import net.minecraft.item.Item; @@ -67,7 +68,9 @@ public AEItemStack getAEStack() { @Override public ItemStack createItemStack() { - return this.delegate.copy(); + ItemStack newStack = this.delegate.copy(); + newStack.setCount(GTUtility.safeCastLongToInt(stackSize)); + return newStack; } @Override @@ -214,6 +217,7 @@ public IStorageChannel getChannel() { @Override public ItemStack asItemStackRepresentation() { + delegate.setCount(GTUtility.safeCastLongToInt(stackSize)); return this.delegate; } @@ -250,7 +254,7 @@ public boolean isSameType(ItemStack itemStack) { @Override public @NotNull ItemStack getDefinition() { - delegate.setCount((int) stackSize); + delegate.setCount(GTUtility.safeCastLongToInt(stackSize)); return this.delegate; } @@ -261,8 +265,8 @@ public boolean equals(ItemStack itemStack) { @Override public boolean equals(Object other) { - if (other instanceof IAEItemStack stack) { - ItemStack otherStack = stack.getCachedItemStack(stack.getStackSize()); + if (other instanceof WrappedItemStack wrappedItemStack) { + ItemStack otherStack = wrappedItemStack.getDefinition(); NBTTagCompound thisTag = delegate.getTagCompound(); NBTTagCompound otherTag = otherStack.getTagCompound(); @@ -275,6 +279,8 @@ public boolean equals(Object other) { } return this.delegate.isItemEqual(otherStack) && nbtMatch; + } else if (other instanceof AEItemStack aeItemStack) { + return aeItemStack.equals(delegate); } else if (other instanceof ItemStack itemStack) { return this.equals(itemStack); } @@ -300,7 +306,7 @@ public int hashCode() { @Override public ItemStack getCachedItemStack(long l) { ItemStack copy = this.delegate.copy(); - copy.setCount((int) l); + copy.setCount(GTUtility.safeCastLongToInt(stackSize)); return copy; } From 97e6990b307ce9526d394a117c6c4a5c2367fa92 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 2 Oct 2025 22:00:50 -0700 Subject: [PATCH 130/136] create RecipeSyncHandler to simplify recipe transfer in GregTechGuiScreen register RecipeSyncHandler's to GregTechGuiScreen --- .../gregtech/api/mui/GregTechGuiScreen.java | 48 ++++++------------- .../api/mui/sync/RecipeSyncHandler.java | 22 +++++++++ .../workbench/CraftingRecipeLogic.java | 5 +- .../jei/JustEnoughItemsModule.java | 3 ++ 4 files changed, 42 insertions(+), 36 deletions(-) create mode 100644 src/main/java/gregtech/api/mui/sync/RecipeSyncHandler.java diff --git a/src/main/java/gregtech/api/mui/GregTechGuiScreen.java b/src/main/java/gregtech/api/mui/GregTechGuiScreen.java index 06d6b942085..685005a60f1 100644 --- a/src/main/java/gregtech/api/mui/GregTechGuiScreen.java +++ b/src/main/java/gregtech/api/mui/GregTechGuiScreen.java @@ -1,8 +1,7 @@ package gregtech.api.mui; import gregtech.api.GTValues; -import gregtech.api.util.MUIUtil; -import gregtech.mixins.mui2.ModularSyncManagerAccessor; +import gregtech.integration.jei.JustEnoughItemsModule; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -10,23 +9,17 @@ import com.cleanroommc.modularui.integration.jei.JeiRecipeTransferHandler; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.screen.ModularScreen; -import com.cleanroommc.modularui.utils.ObjectList; -import com.cleanroommc.modularui.value.sync.PanelSyncHandler; -import com.cleanroommc.modularui.value.sync.PanelSyncManager; -import com.cleanroommc.modularui.value.sync.SyncHandler; +import it.unimi.dsi.fastutil.objects.Object2ObjectMap; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import mezz.jei.api.gui.IRecipeLayout; import mezz.jei.api.recipe.transfer.IRecipeTransferError; -import mezz.jei.transfer.RecipeTransferErrorInternal; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; @SuppressWarnings("UnstableApiUsage") @SideOnly(Side.CLIENT) public class GregTechGuiScreen extends ModularScreen implements JeiRecipeTransferHandler { + private static final Object2ObjectMap knownRecipeReceivers = new Object2ObjectOpenHashMap<>(); + public GregTechGuiScreen(ModularPanel mainPanel) { this(mainPanel, GTGuiTheme.STANDARD); } @@ -46,29 +39,18 @@ public GregTechGuiScreen(String owner, ModularPanel mainPanel, String themeId) { @Override public IRecipeTransferError transferRecipe(IRecipeLayout recipeLayout, boolean maxTransfer, boolean simulate) { - Map> panelToSyncMap = new HashMap<>(); - ObjectList panels = ObjectList.create(); - panels.add(((ModularSyncManagerAccessor) getSyncManager()).getMainPanelSyncManager()); - while (!panels.isEmpty()) { - PanelSyncManager psm = panels.removeFirst(); - panelToSyncMap.put(psm.getPanelName(), new ArrayList<>(MUIUtil.getSyncHandlers(psm))); - - if (MUIUtil.hasSubPanels(psm)) { - for (PanelSyncHandler psh : MUIUtil.getSubPanels(psm)) { - if (MUIUtil.hasSyncManager(psh)) { - panels.add(MUIUtil.getPanelSyncManager(psh)); - } - } - } + for (IJEIRecipeReceiver handler : knownRecipeReceivers.values()) { + IRecipeTransferError error = handler.receiveRecipe(recipeLayout, maxTransfer, simulate); + if (error == null) return null; } + return JustEnoughItemsModule.transferHelper.createInternalError(); + } - for (SyncHandler syncHandler : panelToSyncMap.get(getPanelManager().getTopMostPanel().getName())) { - if (syncHandler instanceof IJEIRecipeReceiver recipeReceiver) { - return recipeReceiver.receiveRecipe(recipeLayout, maxTransfer, simulate); - } - } + public static void registerRecipeReceiver(String key, IJEIRecipeReceiver receiver) { + knownRecipeReceivers.put(key, receiver); + } - // Hide the + button by default if no recipe receiver was found. - return RecipeTransferErrorInternal.INSTANCE; + public static void removeRecipeReceiver(String key) { + knownRecipeReceivers.remove(key); } } diff --git a/src/main/java/gregtech/api/mui/sync/RecipeSyncHandler.java b/src/main/java/gregtech/api/mui/sync/RecipeSyncHandler.java new file mode 100644 index 00000000000..e08a77bc5d7 --- /dev/null +++ b/src/main/java/gregtech/api/mui/sync/RecipeSyncHandler.java @@ -0,0 +1,22 @@ +package gregtech.api.mui.sync; + +import gregtech.api.mui.GregTechGuiScreen; +import gregtech.api.mui.IJEIRecipeReceiver; + +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.value.sync.SyncHandler; + +public abstract class RecipeSyncHandler extends SyncHandler implements IJEIRecipeReceiver { + + @Override + public void init(String key, PanelSyncManager syncManager) { + super.init(key, syncManager); + GregTechGuiScreen.registerRecipeReceiver(getKey(), this); + } + + @Override + public void dispose() { + GregTechGuiScreen.removeRecipeReceiver(getKey()); + super.dispose(); + } +} diff --git a/src/main/java/gregtech/common/metatileentities/workbench/CraftingRecipeLogic.java b/src/main/java/gregtech/common/metatileentities/workbench/CraftingRecipeLogic.java index 0980184842e..2a9f3bdf136 100644 --- a/src/main/java/gregtech/common/metatileentities/workbench/CraftingRecipeLogic.java +++ b/src/main/java/gregtech/common/metatileentities/workbench/CraftingRecipeLogic.java @@ -1,8 +1,8 @@ package gregtech.common.metatileentities.workbench; import gregtech.api.items.toolitem.ItemGTToolbelt; -import gregtech.api.mui.IJEIRecipeReceiver; import gregtech.api.mui.sync.PagedWidgetSyncHandler; +import gregtech.api.mui.sync.RecipeSyncHandler; import gregtech.api.util.DummyContainer; import gregtech.api.util.GTTransferUtils; import gregtech.api.util.GTUtility; @@ -25,7 +25,6 @@ import net.minecraftforge.items.IItemHandlerModifiable; import com.cleanroommc.modularui.network.NetworkUtils; -import com.cleanroommc.modularui.value.sync.SyncHandler; import it.unimi.dsi.fastutil.Hash; import it.unimi.dsi.fastutil.ints.Int2BooleanArrayMap; import it.unimi.dsi.fastutil.ints.Int2IntArrayMap; @@ -46,7 +45,7 @@ import java.util.*; -public class CraftingRecipeLogic extends SyncHandler implements IJEIRecipeReceiver { +public class CraftingRecipeLogic extends RecipeSyncHandler { // client only public static final int UPDATE_INGREDIENTS = 1; diff --git a/src/main/java/gregtech/integration/jei/JustEnoughItemsModule.java b/src/main/java/gregtech/integration/jei/JustEnoughItemsModule.java index b001a92c919..c43c317a719 100644 --- a/src/main/java/gregtech/integration/jei/JustEnoughItemsModule.java +++ b/src/main/java/gregtech/integration/jei/JustEnoughItemsModule.java @@ -73,6 +73,7 @@ import mezz.jei.api.recipe.IRecipeCategory; import mezz.jei.api.recipe.IRecipeCategoryRegistration; import mezz.jei.api.recipe.VanillaRecipeCategoryUid; +import mezz.jei.api.recipe.transfer.IRecipeTransferHandlerHelper; import mezz.jei.config.Constants; import mezz.jei.input.IShowsRecipeFocuses; import mezz.jei.input.InputHandler; @@ -104,6 +105,7 @@ public class JustEnoughItemsModule extends IntegrationSubmodule implements IModP public static IIngredientRegistry ingredientRegistry; public static IJeiRuntime jeiRuntime; public static IGuiHelper guiHelper; + public static IRecipeTransferHandlerHelper transferHelper; @Override public void loadComplete(FMLLoadCompleteEvent event) { @@ -158,6 +160,7 @@ public void register(IModRegistry registry) { // register transfer handler for all categories, but not for the crafting station ModularUIGuiHandler modularUIGuiHandler = new ModularUIGuiHandler(jeiHelpers.recipeTransferHandlerHelper()); + transferHelper = jeiHelpers.recipeTransferHandlerHelper(); modularUIGuiHandler.blacklistCategory( IntCircuitCategory.UID, MaterialTreeCategory.UID, From 4f43375c441491253f758a9b8b01a2c567d1bd1c Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 2 Oct 2025 22:07:11 -0700 Subject: [PATCH 131/136] remove mixins that are now unused --- src/main/java/gregtech/api/util/MUIUtil.java | 79 ------------------- .../mui2/ModularSyncManagerAccessor.java | 19 ----- .../mixins/mui2/PanelSyncHandlerAccessor.java | 13 --- .../mixins/mui2/PanelSyncManagerAccessor.java | 18 ----- src/main/resources/mixins.gregtech.mui2.json | 5 +- 5 files changed, 1 insertion(+), 133 deletions(-) delete mode 100644 src/main/java/gregtech/api/util/MUIUtil.java delete mode 100644 src/main/java/gregtech/mixins/mui2/ModularSyncManagerAccessor.java delete mode 100644 src/main/java/gregtech/mixins/mui2/PanelSyncHandlerAccessor.java delete mode 100644 src/main/java/gregtech/mixins/mui2/PanelSyncManagerAccessor.java diff --git a/src/main/java/gregtech/api/util/MUIUtil.java b/src/main/java/gregtech/api/util/MUIUtil.java deleted file mode 100644 index 8558aa1467c..00000000000 --- a/src/main/java/gregtech/api/util/MUIUtil.java +++ /dev/null @@ -1,79 +0,0 @@ -package gregtech.api.util; - -import gregtech.mixins.mui2.PanelSyncHandlerAccessor; -import gregtech.mixins.mui2.PanelSyncManagerAccessor; - -import com.cleanroommc.modularui.value.sync.PanelSyncHandler; -import com.cleanroommc.modularui.value.sync.PanelSyncManager; -import com.cleanroommc.modularui.value.sync.SyncHandler; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; - -public class MUIUtil { - - /** - * Checks if the {@link PanelSyncManager} has any sub panels. - * - * @param panelSyncManager the panel sync manager to check - * @return if it has sub panels - */ - public static boolean hasSubPanels(PanelSyncManager panelSyncManager) { - return !((PanelSyncManagerAccessor) panelSyncManager).getSubPanels().isEmpty(); - } - - /** - * Retrieves all sub panel {@link PanelSyncHandler}s from a {@link PanelSyncManager}. - * - * @param panelSyncManager the panel sync manager to gather the sub panel handlers from - * @return a list of all sub panel handlers - */ - public static List getSubPanels(PanelSyncManager panelSyncManager) { - if (!hasSubPanels(panelSyncManager)) { - return Collections.emptyList(); - } - - List subPanels = new ArrayList<>(); - Collection syncHandlers = ((PanelSyncManagerAccessor) panelSyncManager).getSubPanels().values(); - - for (SyncHandler syncHandler : syncHandlers) { - if (syncHandler instanceof PanelSyncHandler panelSyncHandler) { - subPanels.add(panelSyncHandler); - } - } - - return subPanels; - } - - /** - * Gets all of the {@link SyncHandler}s from a {@link PanelSyncManager}. - * - * @param panelSyncManager the panel sync manager to gather the sync handlers from - * @return a list of all the sync handlers - */ - public static Collection getSyncHandlers(PanelSyncManager panelSyncManager) { - return ((PanelSyncManagerAccessor) panelSyncManager).getSyncHandlers().values(); - } - - /** - * Checks if a {@link PanelSyncHandler} has a {@link PanelSyncManager}. - * - * @param panelSyncHandler the panel sync handler to check - * @return if the panel sync handler has a panel sync manager - */ - public static boolean hasSyncManager(PanelSyncHandler panelSyncHandler) { - return ((PanelSyncHandlerAccessor) (Object) panelSyncHandler).getPanelSyncManager() != null; - } - - /** - * Gets the {@link PanelSyncManager} from a {@link PanelSyncHandler}. - * - * @param panelSyncHandler the panel sync handler to get the panel sync manager from - * @return the panel sync manager of the panel sync handler - */ - public static PanelSyncManager getPanelSyncManager(PanelSyncHandler panelSyncHandler) { - return ((PanelSyncHandlerAccessor) (Object) panelSyncHandler).getPanelSyncManager(); - } -} diff --git a/src/main/java/gregtech/mixins/mui2/ModularSyncManagerAccessor.java b/src/main/java/gregtech/mixins/mui2/ModularSyncManagerAccessor.java deleted file mode 100644 index 91a50004bf4..00000000000 --- a/src/main/java/gregtech/mixins/mui2/ModularSyncManagerAccessor.java +++ /dev/null @@ -1,19 +0,0 @@ -package gregtech.mixins.mui2; - -import com.cleanroommc.modularui.value.sync.ModularSyncManager; -import com.cleanroommc.modularui.value.sync.PanelSyncManager; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -import java.util.Map; - -// TODO: MUI2 2.5 RC5 changes getMainPSM() to public -@Mixin(value = ModularSyncManager.class, remap = false) -public interface ModularSyncManagerAccessor { - - @Accessor(value = "panelSyncManagerMap") - Map getPanelSyncManagers(); - - @Accessor(value = "mainPSM") - PanelSyncManager getMainPanelSyncManager(); -} diff --git a/src/main/java/gregtech/mixins/mui2/PanelSyncHandlerAccessor.java b/src/main/java/gregtech/mixins/mui2/PanelSyncHandlerAccessor.java deleted file mode 100644 index ee2f4e60633..00000000000 --- a/src/main/java/gregtech/mixins/mui2/PanelSyncHandlerAccessor.java +++ /dev/null @@ -1,13 +0,0 @@ -package gregtech.mixins.mui2; - -import com.cleanroommc.modularui.value.sync.PanelSyncHandler; -import com.cleanroommc.modularui.value.sync.PanelSyncManager; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(value = PanelSyncHandler.class, remap = false) -public interface PanelSyncHandlerAccessor { - - @Accessor(value = "syncManager") - PanelSyncManager getPanelSyncManager(); -} diff --git a/src/main/java/gregtech/mixins/mui2/PanelSyncManagerAccessor.java b/src/main/java/gregtech/mixins/mui2/PanelSyncManagerAccessor.java deleted file mode 100644 index d91aead6136..00000000000 --- a/src/main/java/gregtech/mixins/mui2/PanelSyncManagerAccessor.java +++ /dev/null @@ -1,18 +0,0 @@ -package gregtech.mixins.mui2; - -import com.cleanroommc.modularui.value.sync.PanelSyncManager; -import com.cleanroommc.modularui.value.sync.SyncHandler; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -import java.util.Map; - -@Mixin(value = PanelSyncManager.class, remap = false) -public interface PanelSyncManagerAccessor { - - @Accessor() - Map getSyncHandlers(); - - @Accessor() - Map getSubPanels(); -} diff --git a/src/main/resources/mixins.gregtech.mui2.json b/src/main/resources/mixins.gregtech.mui2.json index 157f4c0b4e6..425f3dec9dd 100644 --- a/src/main/resources/mixins.gregtech.mui2.json +++ b/src/main/resources/mixins.gregtech.mui2.json @@ -12,10 +12,7 @@ "IconMixin", "IconMixin$DelegateMixin", "ModularPanelMixin", - "RichTextCompilerMixin", - "ModularSyncManagerAccessor", - "PanelSyncHandlerAccessor", - "PanelSyncManagerAccessor" + "RichTextCompilerMixin" ], "client": [ "LangKeyMixin", From 013a3b52757b7a56c91360ac3c59db6f82f910c3 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Sat, 29 Nov 2025 01:22:25 -0500 Subject: [PATCH 132/136] Just get it compiling again --- .../java/gregtech/api/mui/GTGuiTextures.java | 2 +- .../gregtech/api/mui/GregTechGuiScreen.java | 4 +-- .../api/mui/widget/appeng/AEConfigSlot.java | 12 +++---- .../api/mui/widget/appeng/AEDisplaySlot.java | 34 ++----------------- .../widget/appeng/AEStackPreviewWidget.java | 8 ++--- .../appeng/fluid/AEFluidConfigSlot.java | 14 ++++---- .../appeng/fluid/AEFluidDisplaySlot.java | 4 +-- .../widget/appeng/item/AEItemConfigSlot.java | 15 ++++---- .../widget/appeng/item/AEItemDisplaySlot.java | 6 ++-- .../appeng/item/AEItemStackPreviewWidget.java | 4 +-- src/main/java/gregtech/api/util/JEIUtil.java | 6 ++-- .../appeng/slot/AEItemDisplayWidget.java | 1 + .../appeng/MetaTileEntityMEInputBase.java | 16 ++++----- .../appeng/MetaTileEntityMEInputBus.java | 6 ++-- .../appeng/MetaTileEntityMEInputHatch.java | 4 +-- .../appeng/MetaTileEntityMEOutputBase.java | 11 +++--- .../appeng/MetaTileEntityMEOutputBus.java | 5 +-- .../appeng/MetaTileEntityMEOutputHatch.java | 4 +-- .../workbench/CraftingRecipeLogic.java | 2 -- 19 files changed, 65 insertions(+), 93 deletions(-) diff --git a/src/main/java/gregtech/api/mui/GTGuiTextures.java b/src/main/java/gregtech/api/mui/GTGuiTextures.java index dbb282bbb85..8743c140536 100644 --- a/src/main/java/gregtech/api/mui/GTGuiTextures.java +++ b/src/main/java/gregtech/api/mui/GTGuiTextures.java @@ -727,7 +727,7 @@ private static String id(String path) { public static final UITexture ARROW_DOUBLE = fullImage("textures/gui/widget/arrow_double.png"); public static final UITexture ARROW_OPPOSITE = fullImage("textures/gui/widget/opposite_arrows.png"); public static final UITexture[] AUTO_PULL = slice("textures/gui/widget/button_me_auto_pull.png", - 16, 32, 16, 16, true); + 16, 32, 16, 16, ColorType.DEFAULT); public static void init() {/**/} diff --git a/src/main/java/gregtech/api/mui/GregTechGuiScreen.java b/src/main/java/gregtech/api/mui/GregTechGuiScreen.java index 685005a60f1..d7a42853e3e 100644 --- a/src/main/java/gregtech/api/mui/GregTechGuiScreen.java +++ b/src/main/java/gregtech/api/mui/GregTechGuiScreen.java @@ -6,7 +6,7 @@ import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import com.cleanroommc.modularui.integration.jei.JeiRecipeTransferHandler; +import com.cleanroommc.modularui.integration.recipeviewer.RecipeViewerRecipeTransferHandler; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.screen.ModularScreen; import it.unimi.dsi.fastutil.objects.Object2ObjectMap; @@ -16,7 +16,7 @@ @SuppressWarnings("UnstableApiUsage") @SideOnly(Side.CLIENT) -public class GregTechGuiScreen extends ModularScreen implements JeiRecipeTransferHandler { +public class GregTechGuiScreen extends ModularScreen implements RecipeViewerRecipeTransferHandler { private static final Object2ObjectMap knownRecipeReceivers = new Object2ObjectOpenHashMap<>(); diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java index a8b2e8719c9..9737b7d437f 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEConfigSlot.java @@ -6,14 +6,14 @@ import appeng.api.storage.data.IAEStack; import com.cleanroommc.modularui.api.IPanelHandler; +import com.cleanroommc.modularui.api.UpOrDown; import com.cleanroommc.modularui.api.drawable.IDrawable; import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.api.widget.Interactable; -import com.cleanroommc.modularui.integration.jei.JeiIngredientProvider; -import com.cleanroommc.modularui.screen.ModularScreen; +import com.cleanroommc.modularui.integration.recipeviewer.RecipeViewerIngredientProvider; import com.cleanroommc.modularui.screen.RichTooltip; import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; -import com.cleanroommc.modularui.theme.WidgetTheme; +import com.cleanroommc.modularui.theme.WidgetThemeEntry; import com.cleanroommc.modularui.value.LongValue; import com.cleanroommc.modularui.value.sync.SyncHandler; import com.cleanroommc.modularui.widget.Widget; @@ -24,7 +24,7 @@ import java.util.function.BooleanSupplier; public abstract class AEConfigSlot> extends Widget> - implements JeiIngredientProvider, Interactable { + implements RecipeViewerIngredientProvider, Interactable { protected final boolean isStocking; protected final int index; @@ -75,7 +75,7 @@ public boolean isValidSyncHandler(SyncHandler syncHandler) { } @Override - public void drawOverlay(ModularGuiContext context, WidgetTheme widgetTheme) { + public void drawOverlay(ModularGuiContext context, WidgetThemeEntry widgetTheme) { super.drawOverlay(context, widgetTheme); if (selected) { @@ -104,7 +104,7 @@ public void drawOverlay(ModularGuiContext context, WidgetTheme widgetTheme) { } @Override - public boolean onMouseScroll(ModularScreen.UpOrDown scrollDirection, int scrollAmount) { + public boolean onMouseScroll(UpOrDown scrollDirection, int scrollAmount) { if (!getSyncHandler().hasConfig(index) || isStocking) return false; long newStackSize = getSyncHandler().getConfigAmount(index); diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEDisplaySlot.java b/src/main/java/gregtech/api/mui/widget/appeng/AEDisplaySlot.java index b8986ff5c8f..d8b3f76288b 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEDisplaySlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEDisplaySlot.java @@ -1,20 +1,13 @@ package gregtech.api.mui.widget.appeng; -import net.minecraft.client.renderer.GlStateManager; - import appeng.api.storage.data.IAEStack; -import com.cleanroommc.modularui.api.ITheme; -import com.cleanroommc.modularui.drawable.GuiDraw; -import com.cleanroommc.modularui.integration.jei.JeiIngredientProvider; +import com.cleanroommc.modularui.integration.recipeviewer.RecipeViewerIngredientProvider; import com.cleanroommc.modularui.screen.RichTooltip; -import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; -import com.cleanroommc.modularui.theme.WidgetSlotTheme; -import com.cleanroommc.modularui.theme.WidgetTheme; import com.cleanroommc.modularui.widget.Widget; import org.jetbrains.annotations.NotNull; public abstract class AEDisplaySlot> extends Widget> - implements JeiIngredientProvider { + implements RecipeViewerIngredientProvider { protected final int index; @@ -25,27 +18,4 @@ public AEDisplaySlot(int index) { } protected abstract void buildTooltip(@NotNull RichTooltip tooltip); - - @Override - public void drawOverlay(ModularGuiContext context, WidgetTheme widgetTheme) { - super.drawOverlay(context, widgetTheme); - - if (isHovering()) { - drawSlotOverlay(); - } - } - - protected void drawSlotOverlay() { - GlStateManager.colorMask(true, true, true, false); - GuiDraw.drawRect(1, 1, 16, 16, getSlotHoverColor()); - GlStateManager.colorMask(true, true, true, true); - } - - public int getSlotHoverColor() { - WidgetTheme theme = getWidgetTheme(getContext().getTheme()); - if (theme instanceof WidgetSlotTheme slotTheme) { - return slotTheme.getSlotHoverColor(); - } - return ITheme.getDefault().getItemSlotTheme().getSlotHoverColor(); - } } diff --git a/src/main/java/gregtech/api/mui/widget/appeng/AEStackPreviewWidget.java b/src/main/java/gregtech/api/mui/widget/appeng/AEStackPreviewWidget.java index 81b14af9016..cc0f9c3252f 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/AEStackPreviewWidget.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/AEStackPreviewWidget.java @@ -1,10 +1,10 @@ package gregtech.api.mui.widget.appeng; import appeng.api.storage.data.IAEStack; -import com.cleanroommc.modularui.integration.jei.JeiIngredientProvider; +import com.cleanroommc.modularui.integration.recipeviewer.RecipeViewerIngredientProvider; import com.cleanroommc.modularui.screen.RichTooltip; import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; -import com.cleanroommc.modularui.theme.WidgetTheme; +import com.cleanroommc.modularui.theme.WidgetThemeEntry; import com.cleanroommc.modularui.widget.Widget; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -12,7 +12,7 @@ import java.util.function.Supplier; public abstract class AEStackPreviewWidget> extends Widget> - implements JeiIngredientProvider { + implements RecipeViewerIngredientProvider { @NotNull protected final Supplier stackToDraw; @@ -26,7 +26,7 @@ public AEStackPreviewWidget(@NotNull Supplier stackToDraw) { protected abstract void buildTooltip(@NotNull RichTooltip tooltip); @Override - public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { + public void draw(ModularGuiContext context, WidgetThemeEntry widgetTheme) { draw(stackToDraw.get(), 1, 1, getArea().w() - 2, getArea().h() - 2); } diff --git a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java index ae1505cdfde..4bea3e7e5f1 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java @@ -18,10 +18,10 @@ import com.cleanroommc.modularui.api.widget.Interactable; import com.cleanroommc.modularui.drawable.GuiDraw; import com.cleanroommc.modularui.drawable.text.TextRenderer; -import com.cleanroommc.modularui.integration.jei.JeiGhostIngredientSlot; +import com.cleanroommc.modularui.integration.recipeviewer.RecipeViewerGhostIngredientSlot; import com.cleanroommc.modularui.screen.RichTooltip; import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; -import com.cleanroommc.modularui.theme.WidgetTheme; +import com.cleanroommc.modularui.theme.WidgetThemeEntry; import com.cleanroommc.modularui.utils.Color; import com.cleanroommc.modularui.value.sync.SyncHandler; import org.jetbrains.annotations.NotNull; @@ -30,7 +30,7 @@ import java.util.function.BooleanSupplier; public class AEFluidConfigSlot extends AEConfigSlot - implements Interactable, JeiGhostIngredientSlot { + implements Interactable, RecipeViewerGhostIngredientSlot { public AEFluidConfigSlot(boolean isStocking, int index, @NotNull BooleanSupplier isAutoPull) { super(isStocking, index, isAutoPull); @@ -40,7 +40,7 @@ public AEFluidConfigSlot(boolean isStocking, int index, @NotNull BooleanSupplier @Override public void onInit() { super.onInit(); - getContext().getJeiSettings().addJeiGhostIngredientSlot(this); + getContext().getRecipeViewerSettings().addGhostIngredientSlot(this); } @Override @@ -53,7 +53,9 @@ protected void buildTooltip(@NotNull RichTooltip tooltip) { tooltip.addLine(FluidTooltipUtil.getFluidModNameKey(stack)); tooltip.addLine((context, x, y, width, height, widgetTheme) -> { final int color = Color.GREY.darker(2); - codechicken.lib.gui.GuiDraw.drawRect(x, y + 3, (int) TextRenderer.SHARED.getLastWidth(), 2, color); + // TODO: do I need to access the text renderer like this? + codechicken.lib.gui.GuiDraw.drawRect(x, y + 3, (int) TextRenderer.SHARED.getLastActualWidth(), 2, + color); }); } @@ -71,7 +73,7 @@ public boolean isValidSyncHandler(SyncHandler syncHandler) { } @Override - public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { + public void draw(ModularGuiContext context, WidgetThemeEntry widgetTheme) { WrappedFluidStack config = (WrappedFluidStack) getSyncHandler().getConfig(index); if (config != null) { GuiDraw.drawFluidTexture(config.getDefinition(), 1, 1, getArea().w() - 2, getArea().h() - 2, 0); diff --git a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidDisplaySlot.java b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidDisplaySlot.java index d531c50d296..bcad0fd4b1a 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidDisplaySlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidDisplaySlot.java @@ -14,7 +14,7 @@ import com.cleanroommc.modularui.drawable.GuiDraw; import com.cleanroommc.modularui.screen.RichTooltip; import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; -import com.cleanroommc.modularui.theme.WidgetTheme; +import com.cleanroommc.modularui.theme.WidgetThemeEntry; import com.cleanroommc.modularui.value.sync.SyncHandler; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -48,7 +48,7 @@ public boolean isValidSyncHandler(SyncHandler syncHandler) { } @Override - public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { + public void draw(ModularGuiContext context, WidgetThemeEntry widgetTheme) { WrappedFluidStack stock = (WrappedFluidStack) getSyncHandler().getStock(index); if (stock != null) { GuiDraw.drawFluidTexture(stock.getDefinition(), 1, 1, getArea().w() - 2, getArea().h() - 2, 0); diff --git a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java index c1952a303d7..de31ad2e6f9 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java @@ -13,10 +13,10 @@ import appeng.api.storage.data.IAEItemStack; import codechicken.lib.gui.GuiDraw; import com.cleanroommc.modularui.drawable.text.TextRenderer; -import com.cleanroommc.modularui.integration.jei.JeiGhostIngredientSlot; +import com.cleanroommc.modularui.integration.recipeviewer.RecipeViewerGhostIngredientSlot; import com.cleanroommc.modularui.screen.RichTooltip; import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; -import com.cleanroommc.modularui.theme.WidgetTheme; +import com.cleanroommc.modularui.theme.WidgetThemeEntry; import com.cleanroommc.modularui.utils.Color; import com.cleanroommc.modularui.value.sync.SyncHandler; import org.jetbrains.annotations.NotNull; @@ -24,7 +24,7 @@ import java.util.function.BooleanSupplier; -public class AEItemConfigSlot extends AEConfigSlot implements JeiGhostIngredientSlot { +public class AEItemConfigSlot extends AEConfigSlot implements RecipeViewerGhostIngredientSlot { public AEItemConfigSlot(boolean isStocking, int index, @NotNull BooleanSupplier isAutoPull) { super(isStocking, index, isAutoPull); @@ -34,7 +34,7 @@ public AEItemConfigSlot(boolean isStocking, int index, @NotNull BooleanSupplier @Override public void onInit() { super.onInit(); - getContext().getJeiSettings().addJeiGhostIngredientSlot(this); + getContext().getRecipeViewerSettings().addGhostIngredientSlot(this); } @Override @@ -44,7 +44,8 @@ protected void buildTooltip(@NotNull RichTooltip tooltip) { tooltip.addFromItem(config.getDefinition()); tooltip.addLine((context, x, y, width, height, widgetTheme) -> { final int color = Color.GREY.darker(2); - GuiDraw.drawRect(x, y + 3, (int) TextRenderer.SHARED.getLastWidth(), 2, color); + // TODO: do I need to access the text renderer like this? + GuiDraw.drawRect(x, y + 3, (int) TextRenderer.SHARED.getLastActualWidth(), 2, color); }); } @@ -62,10 +63,10 @@ public boolean isValidSyncHandler(SyncHandler syncHandler) { } @Override - public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { + public void draw(ModularGuiContext context, WidgetThemeEntry widgetTheme) { WrappedItemStack config = (WrappedItemStack) getSyncHandler().getConfig(index); if (config != null) { - RenderUtil.renderItem(config.getDefinition(), 1, 1, 16f, 16f); + RenderUtil.drawItemStack(config.getDefinition(), 1, 1, false); if (!isStocking) { RenderUtil.renderTextFixedCorner(TextFormattingUtil.formatLongToCompactString(config.getStackSize(), 4), 17d, 18d, 0xFFFFFF, true, 0.5f); diff --git a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemDisplaySlot.java b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemDisplaySlot.java index df865903f2e..e3bc2c84322 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemDisplaySlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemDisplaySlot.java @@ -11,7 +11,7 @@ import appeng.api.storage.data.IAEItemStack; import com.cleanroommc.modularui.screen.RichTooltip; import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; -import com.cleanroommc.modularui.theme.WidgetTheme; +import com.cleanroommc.modularui.theme.WidgetThemeEntry; import com.cleanroommc.modularui.value.sync.SyncHandler; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -42,11 +42,11 @@ public boolean isValidSyncHandler(SyncHandler syncHandler) { } @Override - public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { + public void draw(ModularGuiContext context, WidgetThemeEntry widgetTheme) { WrappedItemStack stock = (WrappedItemStack) getSyncHandler().getStock(index); if (stock != null) { ItemStack stack = stock.createItemStack(); - RenderUtil.renderItem(stack, 1, 1, 16f, 16f); + RenderUtil.drawItemStack(stack, 1, 1, false); RenderUtil.renderTextFixedCorner(TextFormattingUtil.formatLongToCompactString(stock.getStackSize(), 4), 17d, 18d, 0xFFFFFF, true, 0.5f); } diff --git a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemStackPreviewWidget.java b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemStackPreviewWidget.java index 8acf2bedcea..92a30c18dcd 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemStackPreviewWidget.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemStackPreviewWidget.java @@ -1,10 +1,10 @@ package gregtech.api.mui.widget.appeng.item; import gregtech.api.mui.widget.appeng.AEStackPreviewWidget; +import gregtech.client.utils.RenderUtil; import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedItemStack; import appeng.api.storage.data.IAEItemStack; -import com.cleanroommc.modularui.drawable.GuiDraw; import com.cleanroommc.modularui.screen.RichTooltip; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -27,7 +27,7 @@ protected void buildTooltip(@NotNull RichTooltip tooltip) { @Override public void draw(@Nullable IAEItemStack stackToDraw, int x, int y, int width, int height) { if (stackToDraw instanceof WrappedItemStack wrappedItemStack) { - GuiDraw.drawItem(wrappedItemStack.getDefinition(), x, y, width, height); + RenderUtil.drawItemStack(wrappedItemStack.getDefinition(), x, y, false); } } diff --git a/src/main/java/gregtech/api/util/JEIUtil.java b/src/main/java/gregtech/api/util/JEIUtil.java index 7b33e252092..45721bdd692 100644 --- a/src/main/java/gregtech/api/util/JEIUtil.java +++ b/src/main/java/gregtech/api/util/JEIUtil.java @@ -1,18 +1,16 @@ package gregtech.api.util; +import gregtech.integration.jei.JustEnoughItemsModule; import gregtech.mixins.jei.GuiIngredientGroupAccessor; -import gregtech.integration.jei.JustEnoughItemsModule; import net.minecraft.item.ItemStack; import net.minecraftforge.fluids.FluidStack; -import net.minecraft.item.ItemStack; - import com.cleanroommc.modularui.integration.jei.ModularUIJeiPlugin; +import com.cleanroommc.modularui.integration.recipeviewer.RecipeViewerGhostIngredientSlot; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectMaps; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; -import com.cleanroommc.modularui.integration.recipeviewer.RecipeViewerGhostIngredientSlot; import mezz.jei.api.gui.IGuiFluidStackGroup; import mezz.jei.api.gui.IGuiIngredientGroup; import mezz.jei.api.gui.IGuiItemStackGroup; diff --git a/src/main/java/gregtech/common/gui/widget/appeng/slot/AEItemDisplayWidget.java b/src/main/java/gregtech/common/gui/widget/appeng/slot/AEItemDisplayWidget.java index e69de29bb2d..8b137891791 100644 --- a/src/main/java/gregtech/common/gui/widget/appeng/slot/AEItemDisplayWidget.java +++ b/src/main/java/gregtech/common/gui/widget/appeng/slot/AEItemDisplayWidget.java @@ -0,0 +1 @@ + diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBase.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBase.java index 7e4fda8522b..e7c9ec63d75 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBase.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBase.java @@ -7,7 +7,6 @@ import gregtech.api.capability.impl.GhostCircuitItemStackHandler; import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuis; -import gregtech.api.mui.sync.appeng.AEFluidSyncHandler; import gregtech.api.mui.sync.appeng.AESyncHandler; import gregtech.api.mui.widget.GhostCircuitSlotWidget; import gregtech.api.util.GTUtility; @@ -33,11 +32,11 @@ import com.cleanroommc.modularui.drawable.ItemDrawable; import com.cleanroommc.modularui.factory.PosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.screen.UISettings; import com.cleanroommc.modularui.value.IntValue; import com.cleanroommc.modularui.value.sync.IntSyncValue; import com.cleanroommc.modularui.value.sync.PanelSyncHandler; import com.cleanroommc.modularui.value.sync.PanelSyncManager; -import com.cleanroommc.modularui.value.sync.SyncHandlers; import com.cleanroommc.modularui.widget.Widget; import com.cleanroommc.modularui.widgets.ButtonWidget; import com.cleanroommc.modularui.widgets.SlotGroupWidget; @@ -150,7 +149,7 @@ public boolean usesMui2() { protected abstract @NotNull AESyncHandler createAESyncHandler(); @Override - public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManager) { + public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManager, UISettings settings) { ModularPanel mainPanel = GTGuis.createPanel(this, 176, 18 + 18 * 4 + 94); final boolean isStocking = getAEHandler().isStocking(); @@ -159,7 +158,7 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManage return mainPanel.child(IKey.lang(getMetaFullName()) .asWidget() .pos(5, 5)) - .child(SlotGroupWidget.playerInventory() + .child(SlotGroupWidget.playerInventory(false) .left(7) .bottom(7)) .child(IKey.lang(() -> isOnline() ? "gregtech.gui.me_network.online" : @@ -203,9 +202,8 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManage } protected @NotNull GhostCircuitSlotWidget createGhostCircuitWidget() { - // Grrr generics .background only returns ItemSlot - return (GhostCircuitSlotWidget) new GhostCircuitSlotWidget() - .slot(SyncHandlers.itemSlot(circuitInventory, 0)) + return new GhostCircuitSlotWidget() + .slot(circuitInventory, 0) .background(GTGuiTextures.SLOT, GTGuiTextures.INT_CIRCUIT_OVERLAY); } @@ -276,8 +274,8 @@ protected Widget getMultiplierWidget(@NotNull PosGuiData guiData, @NotNull Pa } protected ModularPanel buildMultiplierPopup(PanelSyncManager syncManager, IPanelHandler syncHandler) { - AEFluidSyncHandler aeSyncHandler = (AEFluidSyncHandler) ((PanelSyncHandler) syncHandler).getSyncManager() - .getSyncHandler(PanelSyncManager.makeSyncKey(SYNC_HANDLER_NAME, 0)); + AESyncHandler aeSyncHandler = ((PanelSyncHandler) syncHandler).getSyncManager() + .findSyncHandler(SYNC_HANDLER_NAME, 0, AESyncHandler.class); IntValue multiplier = new IntValue(2); return GTGuis.createPopupPanel("multiplier", 100, 35) diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java index 09b31876c7f..e338ea523ae 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java @@ -44,8 +44,8 @@ import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.value.sync.SyncHandlers; import com.cleanroommc.modularui.widget.Widget; -import com.cleanroommc.modularui.widgets.ItemSlot; import com.cleanroommc.modularui.widgets.layout.Grid; +import com.cleanroommc.modularui.widgets.slot.ItemSlot; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Range; @@ -148,7 +148,7 @@ public void removeFromMultiBlock(MultiblockControllerBase controllerBase) { .matrix(Grid.mapToMatrix((int) Math.sqrt(CONFIG_SIZE), CONFIG_SIZE, index -> new AEItemConfigSlot(isStocking(), index, this::isAutoPull) .syncHandler(SYNC_HANDLER_NAME, 0) - .debugName("Index " + index))); + .name("Index " + index))); for (IWidget slotUpper : grid.getChildren()) { ((AEItemConfigSlot) slotUpper).onSelect(() -> { @@ -174,7 +174,7 @@ public void removeFromMultiBlock(MultiblockControllerBase controllerBase) { index -> new AEItemDisplaySlot(index) .background(GTGuiTextures.SLOT_DARK) .syncHandler(SYNC_HANDLER_NAME, 0) - .debugName("Index " + index))); + .name("Index " + index))); } @Override diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java index b7396835de6..9bfe4af7fe1 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java @@ -104,7 +104,7 @@ protected ExportOnlyAEFluidList getAEHandler() { .matrix(Grid.mapToMatrix((int) Math.sqrt(CONFIG_SIZE), CONFIG_SIZE, index -> new AEFluidConfigSlot(isStocking(), index, this::isAutoPull) .syncHandler(SYNC_HANDLER_NAME, 0) - .debugName("Index " + index))); + .name("Index " + index))); for (IWidget slotUpper : grid.getChildren()) { ((AEFluidConfigSlot) slotUpper).onSelect(() -> { @@ -130,7 +130,7 @@ protected ExportOnlyAEFluidList getAEHandler() { index -> new AEFluidDisplaySlot(index) .background(GTGuiTextures.SLOT_DARK) .syncHandler(SYNC_HANDLER_NAME, 0) - .debugName("Index " + index))); + .name("Index " + index))); } @Override diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBase.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBase.java index c63174be4ae..158c040d444 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBase.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBase.java @@ -24,9 +24,10 @@ import appeng.api.storage.IStorageChannel; import appeng.api.storage.data.IAEStack; import com.cleanroommc.modularui.api.drawable.IKey; -import com.cleanroommc.modularui.drawable.text.RichText; +import com.cleanroommc.modularui.api.drawable.IRichTextBuilder; import com.cleanroommc.modularui.factory.PosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.screen.UISettings; import com.cleanroommc.modularui.utils.Alignment; import com.cleanroommc.modularui.utils.serialization.IByteBufDeserializer; import com.cleanroommc.modularui.value.sync.BooleanSyncValue; @@ -93,7 +94,7 @@ public void update() { protected abstract @NotNull IByteBufDeserializer> getDeserializer(); @SideOnly(Side.CLIENT) - protected abstract void addStackLine(@NotNull RichText text, + protected abstract void addStackLine(@NotNull IRichTextBuilder text, @NotNull IWrappedStack wrappedStack); @Override @@ -102,7 +103,7 @@ public boolean usesMui2() { } @Override - public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManager) { + public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManager, UISettings settings) { BooleanSyncValue onlineSync = new BooleanSyncValue(this::isOnline); panelSyncManager.syncValue("online", 0, onlineSync); @@ -129,7 +130,9 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManage .alignment(Alignment.TopLeft) .background(GTGuiTextures.DISPLAY.asIcon() .margin(-2, -2))) - .child(SlotGroupWidget.playerInventory()); + .child(SlotGroupWidget.playerInventory(false) + .left(7) + .bottom(7)); } @Override diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBus.java index 56ae36c4611..fb153560732 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBus.java @@ -30,7 +30,7 @@ import codechicken.lib.render.CCRenderState; import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; -import com.cleanroommc.modularui.drawable.text.RichText; +import com.cleanroommc.modularui.api.drawable.IRichTextBuilder; import com.cleanroommc.modularui.utils.serialization.IByteBufDeserializer; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -58,7 +58,8 @@ public MetaTileEntity createMetaTileEntity(IGregTechTileEntity iGregTechTileEnti @SideOnly(Side.CLIENT) @Override - protected void addStackLine(@NotNull RichText text, @NotNull IWrappedStack wrappedStack) { + protected void addStackLine(@NotNull IRichTextBuilder text, + @NotNull IWrappedStack wrappedStack) { ItemStack stack = wrappedStack.getDefinition(); text.add(new GTObjectDrawable(stack, 0) .asIcon() diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputHatch.java index 2d47b2ee9ae..476ea46e2c0 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputHatch.java @@ -33,7 +33,7 @@ import codechicken.lib.render.CCRenderState; import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; -import com.cleanroommc.modularui.drawable.text.RichText; +import com.cleanroommc.modularui.api.drawable.IRichTextBuilder; import com.cleanroommc.modularui.utils.serialization.IByteBufDeserializer; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -61,7 +61,7 @@ public MetaTileEntity createMetaTileEntity(IGregTechTileEntity iGregTechTileEnti @SideOnly(Side.CLIENT) @Override - protected void addStackLine(@NotNull RichText text, + protected void addStackLine(@NotNull IRichTextBuilder text, @NotNull IWrappedStack wrappedStack) { FluidStack stack = wrappedStack.getDefinition(); text.add(new GTObjectDrawable(stack, 0) diff --git a/src/main/java/gregtech/common/metatileentities/workbench/CraftingRecipeLogic.java b/src/main/java/gregtech/common/metatileentities/workbench/CraftingRecipeLogic.java index ea94305e72d..96c4116aa17 100644 --- a/src/main/java/gregtech/common/metatileentities/workbench/CraftingRecipeLogic.java +++ b/src/main/java/gregtech/common/metatileentities/workbench/CraftingRecipeLogic.java @@ -25,8 +25,6 @@ import net.minecraftforge.items.IItemHandlerModifiable; import com.cleanroommc.modularui.network.NetworkUtils; -import com.cleanroommc.modularui.value.sync.SyncHandler; -import it.unimi.dsi.fastutil.Hash; import it.unimi.dsi.fastutil.ints.Int2BooleanArrayMap; import it.unimi.dsi.fastutil.ints.Int2BooleanMap; import it.unimi.dsi.fastutil.ints.Int2IntArrayMap; From 8317f81c4990e612d52e4352f8225cbcb70fac4d Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Sun, 14 Dec 2025 00:05:37 -0500 Subject: [PATCH 133/136] Delete wrapped stacks from output hatches --- .../gregtech/api/mui/GTByteBufAdapters.java | 10 - .../MetaTileEntityAEHostableChannelPart.java | 39 --- .../appeng/MetaTileEntityAEHostablePart.java | 66 ++-- .../appeng/MetaTileEntityMEInputBase.java | 7 +- .../appeng/MetaTileEntityMEOutputBase.java | 88 ++--- .../appeng/MetaTileEntityMEOutputBus.java | 65 ++-- .../appeng/MetaTileEntityMEOutputHatch.java | 64 ++-- .../appeng/MetaTileEntityMEStockingBus.java | 2 +- .../appeng/MetaTileEntityMEStockingHatch.java | 2 +- .../appeng/stack/IWrappedStack.java | 23 -- .../appeng/stack/WrappedFluidStack.java | 259 -------------- .../appeng/stack/WrappedItemStack.java | 322 ------------------ 12 files changed, 121 insertions(+), 826 deletions(-) delete mode 100644 src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/IWrappedStack.java delete mode 100644 src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedFluidStack.java delete mode 100644 src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedItemStack.java diff --git a/src/main/java/gregtech/api/mui/GTByteBufAdapters.java b/src/main/java/gregtech/api/mui/GTByteBufAdapters.java index 770b4a3178b..8f286097c98 100644 --- a/src/main/java/gregtech/api/mui/GTByteBufAdapters.java +++ b/src/main/java/gregtech/api/mui/GTByteBufAdapters.java @@ -3,14 +3,10 @@ import gregtech.api.recipes.chance.output.impl.ChancedFluidOutput; import gregtech.api.recipes.chance.output.impl.ChancedItemOutput; import gregtech.api.util.NetworkUtil; -import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedFluidStack; -import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedItemStack; import net.minecraft.network.PacketBuffer; import net.minecraftforge.fluids.Fluid; -import appeng.api.storage.data.IAEFluidStack; -import appeng.api.storage.data.IAEItemStack; import com.cleanroommc.modularui.utils.serialization.*; import org.jetbrains.annotations.NotNull; @@ -27,12 +23,6 @@ public class GTByteBufAdapters { public static final IByteBufAdapter FLUID = makeAdapter(NetworkUtil::readFluid, NetworkUtil::writeFluid); - public static final IByteBufAdapter WRAPPED_ITEM_STACK = makeAdapter(WrappedItemStack::fromPacket, - (buffer, value) -> value.writeToPacket(buffer)); - - public static final IByteBufAdapter WRAPPED_FLUID_STACK = makeAdapter( - WrappedFluidStack::fromPacket, (buffer, value) -> value.writeToPacket(buffer)); - public static IByteBufAdapter makeAdapter(@NotNull IByteBufDeserializer deserializer, @NotNull IByteBufSerializer serializer) { return makeAdapter(deserializer, serializer, IEquals.defaultTester()); diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostableChannelPart.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostableChannelPart.java index 912c4b9765a..eba9990a1a4 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostableChannelPart.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostableChannelPart.java @@ -1,9 +1,6 @@ package gregtech.common.metatileentities.multi.multiblockpart.appeng; -import gregtech.common.ConfigHolder; - import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.ResourceLocation; import appeng.api.AEApi; @@ -19,8 +16,6 @@ public abstract class MetaTileEntityAEHostableChannelPart> extends MetaTileEntityAEHostablePart { - public static final String REFRESH_RATE_TAG = "RefreshRate"; - private final Class> storageChannel; protected int refreshRate; @@ -28,7 +23,6 @@ public MetaTileEntityAEHostableChannelPart(ResourceLocation metaTileEntityId, in Class> storageChannel) { super(metaTileEntityId, tier, isExportHatch); this.storageChannel = storageChannel; - this.refreshRate = ConfigHolder.compat.ae2.updateIntervals; } /** @@ -38,10 +32,6 @@ public MetaTileEntityAEHostableChannelPart(ResourceLocation metaTileEntityId, in @Override public void clearMachineInventory(@NotNull List<@NotNull ItemStack> itemBuffer) {} - protected boolean shouldOperateOnME() { - return getMEUpdateTick() % refreshRate == 0; - } - @NotNull protected IStorageChannel getStorageChannel() { return AEApi.instance().storage().getStorageChannel(storageChannel); @@ -60,33 +50,4 @@ protected IMEMonitor getMonitor() { return null; } } - - public int getRefreshRate() { - return this.refreshRate; - } - - protected void setRefreshRate(int newRefreshRate) { - this.refreshRate = newRefreshRate; - if (!getWorld().isRemote) { - markDirty(); - } - } - - @Override - public NBTTagCompound writeToNBT(NBTTagCompound data) { - super.writeToNBT(data); - - data.setInteger(REFRESH_RATE_TAG, this.refreshRate); - - return data; - } - - @Override - public void readFromNBT(NBTTagCompound data) { - super.readFromNBT(data); - - if (data.hasKey(REFRESH_RATE_TAG)) { - this.refreshRate = data.getInteger(REFRESH_RATE_TAG); - } - } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostablePart.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostablePart.java index a20e0cb8903..9a599d8d0f5 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostablePart.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostablePart.java @@ -28,13 +28,16 @@ import java.io.IOException; import java.util.EnumSet; +import static gregtech.api.capability.GregtechDataCodes.UPDATE_IO_SPEED; import static gregtech.api.capability.GregtechDataCodes.UPDATE_ONLINE_STATUS; public abstract class MetaTileEntityAEHostablePart extends MetaTileEntityMultiblockNotifiablePart implements IAEStatusProvider { + public static final String REFRESH_RATE_TAG = "RefreshRate"; + private AENetworkProxy aeProxy; - private int meUpdateTick = 0; + protected int refreshRate = ConfigHolder.compat.ae2.updateIntervals; protected boolean isOnline; protected boolean allowsExtraConnections = false; protected boolean meStatusChanged = false; @@ -46,22 +49,7 @@ public MetaTileEntityAEHostablePart(ResourceLocation metaTileEntityId, int tier, @Override public void update() { super.update(); - if (!this.getWorld().isRemote) { - this.meUpdateTick++; - } - } - - public boolean isOnline() { - return isOnline; - } - - public int getMEUpdateTick() { - return meUpdateTick; - } - - @Override - public boolean allowsExtraConnections() { - return allowsExtraConnections; + updateMEStatus(); } @Override @@ -77,7 +65,7 @@ public void writeInitialSyncData(PacketBuffer buf) { buf.writeBoolean(false); } - buf.writeInt(meUpdateTick); + buf.writeVarInt(refreshRate); buf.writeBoolean(isOnline); buf.writeBoolean(allowsExtraConnections); } @@ -99,7 +87,7 @@ public void receiveInitialSyncData(PacketBuffer buf) { } } - meUpdateTick = buf.readInt(); + refreshRate = buf.readVarInt(); isOnline = buf.readBoolean(); allowsExtraConnections = buf.readBoolean(); } @@ -113,6 +101,31 @@ public void receiveCustomData(int dataId, PacketBuffer buf) { this.isOnline = isOnline; scheduleRenderUpdate(); } + } else if (dataId == UPDATE_IO_SPEED) { + refreshRate = buf.readVarInt(); + } + } + + public boolean isOnline() { + return isOnline; + } + + @Override + public boolean allowsExtraConnections() { + return allowsExtraConnections; + } + + public int getRefreshRate() { + return this.refreshRate; + } + + protected void setRefreshRate(int newRefreshRate) { + if (this.refreshRate == newRefreshRate) return; + + this.refreshRate = newRefreshRate; + if (!getWorld().isRemote) { + markDirty(); + writeCustomData(UPDATE_IO_SPEED, buf -> buf.writeVarInt(refreshRate)); } } @@ -190,15 +203,10 @@ protected IActionSource getActionSource() { return new BaseActionSource(); } - @Override - public void gridChanged() {} - /** - * Get the me network connection status, updating it if on serverside. - * - * @return the updated status. + * Update the connection status to the ME system. */ - public boolean updateMEStatus() { + public void updateMEStatus() { if (!getWorld().isRemote) { boolean isOnline = this.aeProxy != null && this.aeProxy.isActive() && this.aeProxy.isPowered(); if (this.isOnline != isOnline) { @@ -209,14 +217,13 @@ public boolean updateMEStatus() { meStatusChanged = false; } } - - return isOnline; } @Override public NBTTagCompound writeToNBT(NBTTagCompound data) { super.writeToNBT(data); data.setBoolean("AllowExtraConnections", allowsExtraConnections); + data.setInteger(REFRESH_RATE_TAG, this.refreshRate); return data; } @@ -224,5 +231,8 @@ public NBTTagCompound writeToNBT(NBTTagCompound data) { public void readFromNBT(NBTTagCompound data) { super.readFromNBT(data); allowsExtraConnections = data.getBoolean("AllowExtraConnections"); + if (data.hasKey(REFRESH_RATE_TAG)) { + this.refreshRate = data.getInteger(REFRESH_RATE_TAG); + } } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBase.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBase.java index e7c9ec63d75..fbb852e1025 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBase.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBase.java @@ -13,7 +13,6 @@ import gregtech.common.ConfigHolder; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAESlot; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.IExportOnlyAEStackList; -import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.IWrappedStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.PacketBuffer; @@ -77,7 +76,7 @@ protected void initializeInventory() { @Override public void update() { super.update(); - if (!getWorld().isRemote && this.workingEnabled && updateMEStatus() && shouldOperateOnME()) { + if (!getWorld().isRemote && workingEnabled && isOnline && (getOffsetTimer() % refreshRate == 0)) { operateOnME(); } } @@ -131,10 +130,6 @@ protected void flushInventory() { for (ExportOnlyAESlot slot : getAEHandler().getInventory()) { AEStackType stock = slot.getStock(); - if (stock instanceof IWrappedStackwrappedStack) { - // noinspection unchecked - stock = (AEStackType) wrappedStack.copyAsAEStack(); - } if (stock == null) continue; monitor.injectItems(stock, Actionable.MODULATE, getActionSource()); diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBase.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBase.java index 158c040d444..431ef7df9f8 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBase.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBase.java @@ -7,7 +7,6 @@ import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuis; -import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.IWrappedStack; import gregtech.common.mui.widget.ScrollableTextWidget; import net.minecraft.nbt.NBTTagCompound; @@ -34,7 +33,6 @@ import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.value.sync.SyncHandler; import com.cleanroommc.modularui.widgets.SlotGroupWidget; -import it.unimi.dsi.fastutil.Hash; import it.unimi.dsi.fastutil.ints.IntOpenHashSet; import it.unimi.dsi.fastutil.ints.IntSet; import it.unimi.dsi.fastutil.objects.ObjectArrayList; @@ -47,14 +45,14 @@ import java.util.List; import java.util.function.Consumer; -public abstract class MetaTileEntityMEOutputBase, RealStackType> +public abstract class MetaTileEntityMEOutputBase> extends MetaTileEntityAEHostableChannelPart implements IControllable { public final static String WORKING_TAG = "WorkingEnabled"; protected boolean workingEnabled = true; - protected List<@NotNull IWrappedStack> internalBuffer; + protected List internalBuffer; public MetaTileEntityMEOutputBase(ResourceLocation metaTileEntityId, int tier, Class> storageChannel) { @@ -70,17 +68,17 @@ protected void initializeInventory() { @Override public void update() { super.update(); - if (!getWorld().isRemote && this.workingEnabled && this.shouldOperateOnME() && updateMEStatus()) { + if (!getWorld().isRemote && workingEnabled && isOnline && (getOffsetTimer() % refreshRate == 0)) { if (this.internalBuffer.isEmpty()) return; IMEMonitor monitor = getMonitor(); if (monitor == null) return; - Iterator> internalBufferIterator = internalBuffer.iterator(); + Iterator internalBufferIterator = internalBuffer.iterator(); while (internalBufferIterator.hasNext()) { - IWrappedStack stackInBuffer = internalBufferIterator.next(); + AEStackType stackInBuffer = internalBufferIterator.next(); // We have to create an AEItem/FluidStack here, or it'll cause a CCE in ItemVariantList#L35 - AEStackType notPushedToNetwork = monitor.injectItems(stackInBuffer.copyAsAEStack(), Actionable.MODULATE, + AEStackType notPushedToNetwork = monitor.injectItems(stackInBuffer.copy(), Actionable.MODULATE, getActionSource()); if (notPushedToNetwork != null && notPushedToNetwork.getStackSize() > 0L) { stackInBuffer.setStackSize(notPushedToNetwork.getStackSize()); @@ -91,11 +89,11 @@ public void update() { } } - protected abstract @NotNull IByteBufDeserializer> getDeserializer(); + protected abstract @NotNull IByteBufDeserializer getDeserializer(); @SideOnly(Side.CLIENT) protected abstract void addStackLine(@NotNull IRichTextBuilder text, - @NotNull IWrappedStack wrappedStack); + @NotNull AEStackType stack); @Override public boolean usesMui2() { @@ -107,8 +105,7 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManage BooleanSyncValue onlineSync = new BooleanSyncValue(this::isOnline); panelSyncManager.syncValue("online", 0, onlineSync); - WrappedStackSyncHandler bufferSync = new WrappedStackSyncHandler<>(internalBuffer, - getDeserializer()); + AEStackListSyncHandler bufferSync = new AEStackListSyncHandler(); panelSyncManager.syncValue("buffer", 0, bufferSync); ScrollableTextWidget textList = new ScrollableTextWidget(); @@ -139,7 +136,7 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManage public void onRemoval() { IMEMonitor monitor = getMonitor(); if (monitor != null) { - for (IWrappedStack stack : this.internalBuffer) { + for (AEStackType stack : this.internalBuffer) { monitor.injectItems(stack.copy(), Actionable.MODULATE, this.getActionSource()); } } @@ -203,45 +200,17 @@ public void readFromNBT(NBTTagCompound data) { } } - protected static abstract class InaccessibleInfiniteHandler, - RealStackType> implements INotifiableHandler { + protected abstract static class InaccessibleInfiniteHandler implements INotifiableHandler { - protected final List> internalBuffer; protected final List notifiableEntities = new ArrayList<>(); protected final MetaTileEntity holder; - protected final Hash.Strategy strategy; public InaccessibleInfiniteHandler(@NotNull MetaTileEntity holder, - @NotNull List> internalBuffer, - @NotNull MetaTileEntity mte, - @NotNull Hash.Strategy strategy) { + @NotNull MetaTileEntity mte) { this.holder = holder; - this.internalBuffer = internalBuffer; this.notifiableEntities.add(mte); - this.strategy = strategy; } - protected void add(@NotNull RealStackType stackToAdd, long amount) { - for (IWrappedStack bufferedAEStack : internalBuffer) { - long bufferedAEStackSize = bufferedAEStack.getStackSize(); - RealStackType bufferStack = bufferedAEStack.getDefinition(); - if (strategy.equals(bufferStack, stackToAdd) && bufferedAEStackSize < Long.MAX_VALUE) { - int amountToMerge = (int) Math.min(amount, Long.MAX_VALUE - bufferedAEStackSize); - bufferedAEStack.incStackSize(amountToMerge); - amount -= amountToMerge; - - if (amount == 0) break; - } - } - - if (amount > 0) { - internalBuffer.add(wrapStack(stackToAdd, amount)); - } - } - - protected abstract @NotNull IWrappedStack wrapStack(@NotNull RealStackType stack, - long amount); - @Override public void addNotifiableMetaTileEntity(MetaTileEntity metaTileEntity) { this.notifiableEntities.add(metaTileEntity); @@ -262,36 +231,27 @@ protected void trigger() { } } - private static class WrappedStackSyncHandler, - RealStackType> extends SyncHandler { + protected class AEStackListSyncHandler extends SyncHandler { - private final List<@NotNull IWrappedStack> source; - private final ObjectArrayList<@NotNull IWrappedStack> cache = new ObjectArrayList<>(); - private final IByteBufDeserializer<@NotNull IWrappedStack> deserializer; + private final ObjectArrayList cache = new ObjectArrayList<>(); private final IntSet changedIndexes = new IntOpenHashSet(); @Nullable private Runnable changeListener; - public WrappedStackSyncHandler(@NotNull List> source, - @NotNull IByteBufDeserializer> deserializer) { - this.source = source; - this.deserializer = deserializer; - } - @Override public void detectAndSendChanges(boolean init) { - int sourceSize = source.size(); + int sourceSize = internalBuffer.size(); boolean cacheSizeChange = cache.size() != sourceSize; if (cacheSizeChange) { cache.size(sourceSize); } - for (int index = 0; index < source.size(); index++) { - IWrappedStack newStack = source.get(index); - IWrappedStack cachedStack = cache.get(index); + for (int index = 0; index < internalBuffer.size(); index++) { + AEStackType newStack = internalBuffer.get(index); + AEStackType cachedStack = cache.get(index); - if (init || !newStack.delegateAndSizeEqual(cachedStack)) { - IWrappedStack copy = newStack.copyWrapped(); + if (init || !newStack.equals(cachedStack)) { + AEStackType copy = newStack.copy(); changedIndexes.add(index); cache.set(index, copy); } @@ -304,7 +264,7 @@ public void detectAndSendChanges(boolean init) { for (int index : changedIndexes) { buf.writeVarInt(index); - cache.get(index).writeToPacketBuffer(buf); + cache.get(index).writeToPacket(buf); } }); @@ -321,7 +281,7 @@ public void readOnClient(int id, PacketBuffer buf) throws IOException { int changed = buf.readVarInt(); for (int ignore = 0; ignore < changed; ignore++) { int index = buf.readVarInt(); - IWrappedStack newStack = deserializer.deserialize(buf); + AEStackType newStack = getDeserializer().deserialize(buf); cache.set(index, newStack); } @@ -343,8 +303,8 @@ private void onChange() { } } - public void cacheForEach(@NotNull Consumer<@NotNull IWrappedStack> consumer) { - for (IWrappedStack stack : cache) { + public void cacheForEach(@NotNull Consumer consumer) { + for (AEStackType stack : cache) { consumer.accept(stack); } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBus.java index fb153560732..31b97244c9e 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBus.java @@ -5,12 +5,8 @@ import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.metatileentity.multiblock.*; import gregtech.api.mui.drawable.GTObjectDrawable; -import gregtech.api.util.GTLog; -import gregtech.api.util.ItemStackHashStrategy; import gregtech.api.util.KeyUtil; import gregtech.client.renderer.texture.Textures; -import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.IWrappedStack; -import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedItemStack; import net.minecraft.client.resources.I18n; import net.minecraft.item.ItemStack; @@ -27,6 +23,7 @@ import appeng.api.storage.channels.IItemStorageChannel; import appeng.api.storage.data.IAEItemStack; +import appeng.util.item.AEItemStack; import codechicken.lib.render.CCRenderState; import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; @@ -37,7 +34,7 @@ import java.util.List; -public class MetaTileEntityMEOutputBus extends MetaTileEntityMEOutputBase +public class MetaTileEntityMEOutputBus extends MetaTileEntityMEOutputBase implements IMultiblockAbilityPart { public final static String ITEM_BUFFER_TAG = "ItemBuffer"; @@ -52,14 +49,14 @@ public MetaTileEntity createMetaTileEntity(IGregTechTileEntity iGregTechTileEnti } @Override - protected @NotNull IByteBufDeserializer> getDeserializer() { - return WrappedItemStack::fromPacket; + protected @NotNull IByteBufDeserializer getDeserializer() { + return AEItemStack::fromPacket; } @SideOnly(Side.CLIENT) @Override protected void addStackLine(@NotNull IRichTextBuilder text, - @NotNull IWrappedStack wrappedStack) { + @NotNull IAEItemStack wrappedStack) { ItemStack stack = wrappedStack.getDefinition(); text.add(new GTObjectDrawable(stack, 0) .asIcon() @@ -76,7 +73,7 @@ public NBTTagCompound writeToNBT(NBTTagCompound data) { super.writeToNBT(data); NBTTagList nbtList = new NBTTagList(); - for (IWrappedStack stack : internalBuffer) { + for (IAEItemStack stack : internalBuffer) { NBTTagCompound stackTag = new NBTTagCompound(); stack.writeToNBT(stackTag); nbtList.appendTag(stackTag); @@ -91,20 +88,7 @@ public void readFromNBT(NBTTagCompound data) { super.readFromNBT(data); for (NBTBase tag : data.getTagList(ITEM_BUFFER_TAG, Constants.NBT.TAG_COMPOUND)) { NBTTagCompound tagCompound = (NBTTagCompound) tag; - - WrappedItemStack stack; - // Migrate from AEItemStacks to WrappedItemStacks - if (tagCompound.getBoolean("wrapped")) { - stack = WrappedItemStack.fromNBT(tagCompound); - } else { - stack = WrappedItemStack.fromItemStack(new ItemStack(tagCompound), tagCompound.getLong("Cnt")); - } - - if (stack == null) { - GTLog.logger.error("Error reading ME Output Hatch buffer tag list"); - } else { - internalBuffer.add(stack); - } + internalBuffer.add(AEItemStack.fromNBT(tagCompound)); } } @@ -138,7 +122,7 @@ public MultiblockAbility getAbility() { @Override public void registerAbilities(@NotNull AbilityInstances abilityInstances) { - abilityInstances.add(new InaccessibleInfiniteSlot(this, this.internalBuffer, this.getController())); + abilityInstances.add(new InaccessibleInfiniteSlot(this, this.getController())); } @Override @@ -149,13 +133,11 @@ public void addToMultiBlock(MultiblockControllerBase controllerBase) { } } - private static class InaccessibleInfiniteSlot extends InaccessibleInfiniteHandler - implements IItemHandlerModifiable { + private class InaccessibleInfiniteSlot extends InaccessibleInfiniteHandler implements IItemHandlerModifiable { public InaccessibleInfiniteSlot(@NotNull MetaTileEntity holder, - @NotNull List> internalBuffer, @NotNull MetaTileEntity mte) { - super(holder, internalBuffer, mte, ItemStackHashStrategy.comparingAllButCount()); + super(holder, mte); } @Override @@ -178,15 +160,29 @@ public ItemStack getStackInSlot(int slot) { @NotNull @Override public ItemStack insertItem(int slot, @NotNull ItemStack stackToInsert, boolean simulate) { - if (stackToInsert.isEmpty()) { + if (stackToInsert.isEmpty() || simulate) { return ItemStack.EMPTY; } - if (!simulate) { - add(stackToInsert, stackToInsert.getCount()); - this.trigger(); + int amount = stackToInsert.getCount(); + for (IAEItemStack bufferedStack : internalBuffer) { + long bufferedStackSize = bufferedStack.getStackSize(); + if (bufferedStack.equals(stackToInsert) && bufferedStackSize < Long.MAX_VALUE) { + int amountToAdd = (int) Math.min(amount, Long.MAX_VALUE - bufferedStackSize); + bufferedStack.incStackSize(amountToAdd); + amount -= amountToAdd; + if (amount < 1) break; + } } + if (amount > 0) { + IAEItemStack newStack = AEItemStack.fromItemStack(stackToInsert); + // noinspection DataFlowIssue + newStack.setStackSize(amount); + internalBuffer.add(newStack); + } + + trigger(); return ItemStack.EMPTY; } @@ -200,10 +196,5 @@ public ItemStack extractItem(int slot, int amount, boolean simulate) { public int getSlotLimit(int slot) { return Integer.MAX_VALUE - 1; } - - @Override - protected @NotNull WrappedItemStack wrapStack(@NotNull ItemStack stack, long amount) { - return WrappedItemStack.fromItemStack(stack, amount); - } } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputHatch.java index 476ea46e2c0..f0bea9edc21 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputHatch.java @@ -5,13 +5,9 @@ import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.metatileentity.multiblock.*; import gregtech.api.mui.drawable.GTObjectDrawable; -import gregtech.api.util.FluidStackHashStrategy; import gregtech.api.util.FluidTooltipUtil; -import gregtech.api.util.GTLog; import gregtech.api.util.KeyUtil; import gregtech.client.renderer.texture.Textures; -import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.IWrappedStack; -import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedFluidStack; import net.minecraft.client.resources.I18n; import net.minecraft.item.ItemStack; @@ -30,6 +26,7 @@ import appeng.api.storage.channels.IFluidStorageChannel; import appeng.api.storage.data.IAEFluidStack; +import appeng.fluids.util.AEFluidStack; import codechicken.lib.render.CCRenderState; import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; @@ -40,7 +37,7 @@ import java.util.List; -public class MetaTileEntityMEOutputHatch extends MetaTileEntityMEOutputBase +public class MetaTileEntityMEOutputHatch extends MetaTileEntityMEOutputBase implements IMultiblockAbilityPart { public final static String FLUID_BUFFER_TAG = "FluidBuffer"; @@ -55,15 +52,15 @@ public MetaTileEntity createMetaTileEntity(IGregTechTileEntity iGregTechTileEnti } @Override - protected @NotNull IByteBufDeserializer> getDeserializer() { - return WrappedFluidStack::fromPacket; + protected @NotNull IByteBufDeserializer getDeserializer() { + return AEFluidStack::fromPacket; } @SideOnly(Side.CLIENT) @Override protected void addStackLine(@NotNull IRichTextBuilder text, - @NotNull IWrappedStack wrappedStack) { - FluidStack stack = wrappedStack.getDefinition(); + @NotNull IAEFluidStack wrappedStack) { + FluidStack stack = wrappedStack.getFluidStack(); text.add(new GTObjectDrawable(stack, 0) .asIcon() .asHoverable() @@ -80,7 +77,7 @@ public NBTTagCompound writeToNBT(NBTTagCompound data) { super.writeToNBT(data); NBTTagList nbtList = new NBTTagList(); - for (IWrappedStack stack : internalBuffer) { + for (IAEFluidStack stack : internalBuffer) { NBTTagCompound stackTag = new NBTTagCompound(); stack.writeToNBT(stackTag); nbtList.appendTag(stackTag); @@ -95,21 +92,7 @@ public void readFromNBT(NBTTagCompound data) { super.readFromNBT(data); for (NBTBase tag : data.getTagList(FLUID_BUFFER_TAG, Constants.NBT.TAG_COMPOUND)) { NBTTagCompound tagCompound = (NBTTagCompound) tag; - - WrappedFluidStack stack; - // Migrate from AEFluidStacks to WrappedFluidStacks - if (tagCompound.getBoolean("wrapped")) { - stack = WrappedFluidStack.fromNBT(tagCompound); - } else { - stack = WrappedFluidStack.fromFluidStack(FluidStack.loadFluidStackFromNBT(tagCompound), - data.getLong("Cnt")); - } - - if (stack == null) { - GTLog.logger.error("Error reading ME Output Hatch buffer tag list"); - } else { - internalBuffer.add(stack); - } + internalBuffer.add(AEFluidStack.fromNBT(tagCompound)); } } @@ -143,7 +126,7 @@ public MultiblockAbility getAbility() { @Override public void registerAbilities(@NotNull AbilityInstances abilityInstances) { - abilityInstances.add(new InaccessibleInfiniteTank(this, this.internalBuffer, this.getController())); + abilityInstances.add(new InaccessibleInfiniteTank(this, this.getController())); } @Override @@ -154,13 +137,11 @@ public void addToMultiBlock(MultiblockControllerBase controllerBase) { } } - private static class InaccessibleInfiniteTank extends InaccessibleInfiniteHandler - implements IFluidTank { + protected class InaccessibleInfiniteTank extends InaccessibleInfiniteHandler implements IFluidTank { public InaccessibleInfiniteTank(@NotNull MetaTileEntity holder, - @NotNull List> internalBuffer, @NotNull MetaTileEntity mte) { - super(holder, internalBuffer, mte, FluidStackHashStrategy.comparingAllButAmount()); + super(holder, mte); } @Nullable @@ -191,7 +172,23 @@ public int fill(@Nullable FluidStack stackToInsert, boolean doFill) { } if (doFill) { - add(stackToInsert, stackToInsert.amount); + int amount = stackToInsert.amount; + for (IAEFluidStack bufferedStack : internalBuffer) { + long bufferedStackSize = bufferedStack.getStackSize(); + if (bufferedStack.equals(stackToInsert) && bufferedStackSize < Long.MAX_VALUE) { + int amountToAdd = (int) Math.min(amount, Long.MAX_VALUE - bufferedStackSize); + bufferedStack.incStackSize(amountToAdd); + amount -= amountToAdd; + if (amount < 1) break; + } + } + + if (amount > 0) { + IAEFluidStack newStack = AEFluidStack.fromFluidStack(stackToInsert); + newStack.setStackSize(amount); + internalBuffer.add(newStack); + } + this.trigger(); } @@ -203,10 +200,5 @@ public int fill(@Nullable FluidStack stackToInsert, boolean doFill) { public FluidStack drain(int maxDrain, boolean doDrain) { return null; } - - @Override - protected @NotNull IWrappedStack wrapStack(@NotNull FluidStack stack, long amount) { - return WrappedFluidStack.fromFluidStack(stack, amount); - } } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java index 796462099bb..dbd3ee5ac99 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java @@ -225,7 +225,7 @@ private void setAutoPull(boolean autoPull) { if (!getWorld().isRemote) { if (!this.autoPull) { this.getAEHandler().clearConfig(); - } else if (updateMEStatus()) { + } else if (isOnline) { refreshList(); syncME(); } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java index 0a2e35d57a8..982fb7c3ccc 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java @@ -183,7 +183,7 @@ private void setAutoPull(boolean autoPull) { if (!getWorld().isRemote) { if (!this.autoPull) { this.getAEHandler().clearConfig(); - } else if (updateMEStatus()) { + } else if (isOnline) { refreshList(); syncME(); } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/IWrappedStack.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/IWrappedStack.java deleted file mode 100644 index e3eb7a5a6c4..00000000000 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/IWrappedStack.java +++ /dev/null @@ -1,23 +0,0 @@ -package gregtech.common.metatileentities.multi.multiblockpart.appeng.stack; - -import net.minecraft.network.PacketBuffer; - -import appeng.api.storage.data.IAEStack; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -public interface IWrappedStack, RealStackType> extends IAEStack { - - @NotNull - RealStackType getDefinition(); - - void writeToPacketBuffer(@NotNull PacketBuffer packetBuffer); - - boolean delegateAndSizeEqual(@Nullable IWrappedStack wrappedStack); - - @NotNull - IWrappedStack copyWrapped(); - - @NotNull - AEStackType copyAsAEStack(); -} diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedFluidStack.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedFluidStack.java deleted file mode 100644 index 75f629249ca..00000000000 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedFluidStack.java +++ /dev/null @@ -1,259 +0,0 @@ -package gregtech.common.metatileentities.multi.multiblockpart.appeng.stack; - -import gregtech.api.util.GTUtility; -import gregtech.api.util.NetworkUtil; - -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.network.PacketBuffer; -import net.minecraftforge.fluids.Fluid; -import net.minecraftforge.fluids.FluidStack; - -import appeng.api.AEApi; -import appeng.api.config.FuzzyMode; -import appeng.api.storage.IStorageChannel; -import appeng.api.storage.channels.IFluidStorageChannel; -import appeng.api.storage.data.IAEFluidStack; -import appeng.fluids.util.AEFluidStack; -import io.netty.buffer.ByteBuf; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.Objects; - -public class WrappedFluidStack implements IAEFluidStack, IWrappedStack { - - @NotNull - private final FluidStack delegate; - private long stackSize; - - private WrappedFluidStack(@NotNull FluidStack stack, long stackSize) { - this.delegate = stack; - this.stackSize = stackSize; - } - - public static WrappedFluidStack fromFluidStack(@Nullable FluidStack fluidStack) { - return fluidStack == null ? null : new WrappedFluidStack(fluidStack, fluidStack.amount); - } - - public static WrappedFluidStack fromFluidStack(@Nullable FluidStack fluidStack, long amount) { - return fluidStack == null ? null : new WrappedFluidStack(fluidStack, amount); - } - - public static WrappedFluidStack fromNBT(@NotNull NBTTagCompound data) { - // Migrate old NBT entries from the old format - if (data.getBoolean("wrapped")) { - FluidStack stack = FluidStack.loadFluidStackFromNBT(data.getCompoundTag("stack")); - if (stack == null) return null; - return new WrappedFluidStack(stack, data.getLong("stackSize")); - } else { - return fromFluidStack(FluidStack.loadFluidStackFromNBT(data)); - } - } - - public static WrappedFluidStack fromPacket(@NotNull PacketBuffer buffer) { - return new WrappedFluidStack(Objects.requireNonNull(NetworkUtil.readFluidStack(buffer)), buffer.readLong()); - } - - @NotNull - public AEFluidStack getAEStack() { - AEFluidStack aeFluidStack = AEFluidStack.fromFluidStack(this.delegate); - aeFluidStack.setStackSize(stackSize); - return aeFluidStack; - } - - @Override - public FluidStack getFluidStack() { - FluidStack newStack = this.delegate.copy(); - newStack.amount = GTUtility.safeCastLongToInt(stackSize); - return newStack; - } - - @Override - public void add(IAEFluidStack iaeFluidStack) { - if (equals(iaeFluidStack)) { - incStackSize(iaeFluidStack.getStackSize()); - } - } - - @Override - public long getStackSize() { - return stackSize; - } - - @Override - public IAEFluidStack setStackSize(long newStackSize) { - this.stackSize = newStackSize; - return this; - } - - @Override - public long getCountRequestable() { - return 0; - } - - @Override - public IAEFluidStack setCountRequestable(long l) { - return this; - } - - @Override - public boolean isCraftable() { - return false; - } - - @Override - public IAEFluidStack setCraftable(boolean b) { - return this; - } - - @Override - public IAEFluidStack reset() { - this.delegate.amount = 0; - this.stackSize = 0L; - return this; - } - - @Override - public boolean isMeaningful() { - return this.delegate.amount > 0; - } - - @Override - public void incStackSize(long add) { - if (add < 1) return; - this.stackSize += Math.min(Long.MAX_VALUE - this.stackSize, add); - } - - @Override - public void decStackSize(long sub) { - if (sub < 1) return; - this.stackSize -= Math.min(this.stackSize, sub); - } - - @Override - public void incCountRequestable(long l) { - // NO-OP - } - - @Override - public void decCountRequestable(long l) { - // NO-OP - } - - @Override - public void writeToNBT(NBTTagCompound nbtTagCompound) { - nbtTagCompound.setTag("stack", this.delegate.writeToNBT(new NBTTagCompound())); - nbtTagCompound.setLong("stackSize", this.stackSize); - nbtTagCompound.setBoolean("wrapped", true); - } - - public NBTTagCompound serializeToNBT() { - NBTTagCompound tag = new NBTTagCompound(); - writeToNBT(tag); - return tag; - } - - @Override - public boolean fuzzyComparison(IAEFluidStack stack, FuzzyMode fuzzyMode) { - return this.delegate.getFluid() == stack.getFluid(); - } - - @Override - public void writeToPacket(ByteBuf buffer) { - writeToPacketBuffer(new PacketBuffer(buffer)); - } - - public void writeToPacketBuffer(@NotNull PacketBuffer packetBuffer) { - NetworkUtil.writeFluidStack(packetBuffer, this.delegate); - packetBuffer.writeLong(this.stackSize); - } - - @Override - public IAEFluidStack copy() { - return new WrappedFluidStack(delegate.copy(), stackSize); - } - - @Override - public @NotNull IAEFluidStack copyAsAEStack() { - IAEFluidStack stack = AEFluidStack.fromFluidStack(delegate.copy()); - stack.setStackSize(stackSize); - return stack; - } - - @Override - public @NotNull IWrappedStack copyWrapped() { - return new WrappedFluidStack(delegate.copy(), stackSize); - } - - @Override - public IAEFluidStack empty() { - IAEFluidStack dup = copy(); - dup.reset(); - return dup; - } - - @Override - public boolean isItem() { - return false; - } - - @Override - public boolean isFluid() { - return true; - } - - @Override - public IStorageChannel getChannel() { - return AEApi.instance().storage().getStorageChannel(IFluidStorageChannel.class); - } - - @Override - public ItemStack asItemStackRepresentation() { - return ItemStack.EMPTY; - } - - @Override - public Fluid getFluid() { - return this.delegate.getFluid(); - } - - @Override - public @NotNull FluidStack getDefinition() { - delegate.amount = GTUtility.safeCastLongToInt(stackSize); - return delegate; - } - - @Override - public boolean equals(Object other) { - if (other instanceof WrappedFluidStack wrappedFluidStack) { - return wrappedFluidStack.delegate.isFluidEqual(this.delegate); - } else if (other instanceof AEFluidStack aeFluidStack) { - // noinspection EqualsBetweenInconvertibleTypes - return aeFluidStack.equals(delegate); - } else if (other instanceof FluidStack fluidStack) { - return fluidStack.isFluidEqual(this.delegate); - } - - return false; - } - - @Override - public boolean delegateAndSizeEqual(@Nullable IWrappedStack wrappedStack) { - if (wrappedStack == null) return false; - return delegate.isFluidEqual(wrappedStack.getDefinition()) && stackSize == wrappedStack.getStackSize(); - } - - @Override - public int hashCode() { - int result = 1; - result = 31 * result + this.delegate.getFluid().hashCode(); - result = 31 * result + (this.delegate.tag == null ? 0 : this.delegate.tag.hashCode()); - return result; - } - - @Override - public String toString() { - return String.format("Wrapped: %s, Stack Size: %d", delegate, stackSize); - } -} diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedItemStack.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedItemStack.java deleted file mode 100644 index 128057c42d9..00000000000 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/stack/WrappedItemStack.java +++ /dev/null @@ -1,322 +0,0 @@ -package gregtech.common.metatileentities.multi.multiblockpart.appeng.stack; - -import gregtech.api.util.GTUtility; -import gregtech.api.util.NetworkUtil; - -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.network.PacketBuffer; - -import appeng.api.config.FuzzyMode; -import appeng.api.storage.IStorageChannel; -import appeng.api.storage.channels.IItemStorageChannel; -import appeng.api.storage.data.IAEItemStack; -import appeng.core.Api; -import appeng.util.item.AEItemStack; -import io.netty.buffer.ByteBuf; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -public class WrappedItemStack implements IAEItemStack, IWrappedStack { - - @NotNull - private ItemStack delegate; - private long stackSize; - - private WrappedItemStack(@NotNull ItemStack itemStack, long stackSize) { - this.delegate = itemStack; - this.stackSize = stackSize; - } - - public static WrappedItemStack fromItemStack(@Nullable ItemStack stack) { - if (stack == null) return null; - return stack.isEmpty() ? null : new WrappedItemStack(stack, stack.getCount()); - } - - public static WrappedItemStack fromItemStack(@Nullable ItemStack stack, long amount) { - if (stack == null) return null; - return stack.isEmpty() ? null : new WrappedItemStack(stack, amount); - } - - public static WrappedItemStack fromNBT(@Nullable NBTTagCompound tag) { - if (tag == null) { - return null; - } else { - // Migrate old NBT entries from the old format - if (tag.getBoolean("wrapped")) { - return new WrappedItemStack(new ItemStack(tag.getCompoundTag("stack")), tag.getLong("stackSize")); - } else { - ItemStack itemStack = new ItemStack(tag); - return fromItemStack(itemStack); - } - } - } - - public static WrappedItemStack fromPacket(@NotNull PacketBuffer data) { - WrappedItemStack wrappedItemStack = fromItemStack(NetworkUtil.readItemStack(data)); - wrappedItemStack.setStackSize(data.readLong()); - return wrappedItemStack; - } - - public AEItemStack getAEStack() { - AEItemStack aeItemStack = AEItemStack.fromItemStack(this.delegate); - assert aeItemStack != null; - aeItemStack.setStackSize(stackSize); - return aeItemStack; - } - - @Override - public ItemStack createItemStack() { - ItemStack newStack = this.delegate.copy(); - newStack.setCount(GTUtility.safeCastLongToInt(stackSize)); - return newStack; - } - - @Override - public boolean hasTagCompound() { - return this.delegate.hasTagCompound(); - } - - @Override - public void add(IAEItemStack iaeItemStack) { - if (equals(iaeItemStack)) { - incStackSize(iaeItemStack.getStackSize()); - } - } - - @Override - public long getStackSize() { - return stackSize; - } - - @Override - public IAEItemStack setStackSize(long newStackSize) { - this.stackSize = newStackSize; - return this; - } - - @Override - public long getCountRequestable() { - return 0; - } - - @Override - public IAEItemStack setCountRequestable(long l) { - return this; - } - - @Override - public boolean isCraftable() { - return false; - } - - @Override - public IAEItemStack setCraftable(boolean b) { - return this; - } - - @Override - public IAEItemStack reset() { - this.delegate.setCount(0); - this.stackSize = 0; - return this; - } - - @Override - public boolean isMeaningful() { - return !this.delegate.isEmpty(); - } - - @Override - public void incStackSize(long add) { - if (add < 1) return; - this.stackSize += Math.min(Long.MAX_VALUE - this.stackSize, add); - } - - @Override - public void decStackSize(long sub) { - if (sub < 1) return; - this.stackSize -= Math.min(this.stackSize, sub); - } - - @Override - public void incCountRequestable(long l) { - // NO-OP - } - - @Override - public void decCountRequestable(long l) { - // NO-OP - } - - @Override - public void writeToNBT(NBTTagCompound nbtTagCompound) { - nbtTagCompound.setTag("stack", this.delegate.serializeNBT()); - nbtTagCompound.setLong("stackSize", this.stackSize); - nbtTagCompound.setBoolean("wrapped", true); - } - - @Override - public boolean fuzzyComparison(IAEItemStack stack, FuzzyMode fuzzyMode) { - return stack.createItemStack().isItemEqual(this.delegate); - } - - @Override - public void writeToPacket(ByteBuf byteBuf) { - writeToPacketBuffer(new PacketBuffer(byteBuf)); - } - - public void writeToPacketBuffer(@NotNull PacketBuffer packetBuffer) { - NetworkUtil.writeItemStack(packetBuffer, this.delegate); - packetBuffer.writeLong(this.stackSize); - } - - @Override - public IAEItemStack copy() { - return new WrappedItemStack(delegate.copy(), stackSize); - } - - @Override - public @NotNull IAEItemStack copyAsAEStack() { - IAEItemStack stack = AEItemStack.fromItemStack(delegate.copy()); - if (stack == null) { - throw new IllegalStateException("Error creating AEItemStack from delegate"); - } - - stack.setStackSize(stackSize); - return stack; - } - - @Override - public @NotNull IWrappedStack copyWrapped() { - return new WrappedItemStack(delegate.copy(), stackSize); - } - - @Override - public IAEItemStack empty() { - IAEItemStack copy = copy(); - copy.reset(); - return copy; - } - - @Override - public boolean isItem() { - return true; - } - - @Override - public boolean isFluid() { - return false; - } - - @Override - public IStorageChannel getChannel() { - return Api.INSTANCE.storage().getStorageChannel(IItemStorageChannel.class); - } - - @Override - public ItemStack asItemStackRepresentation() { - delegate.setCount(GTUtility.safeCastLongToInt(stackSize)); - return this.delegate; - } - - @Override - public Item getItem() { - return this.delegate.getItem(); - } - - @Override - public int getItemDamage() { - return this.delegate.getItemDamage(); - } - - @Override - public boolean sameOre(IAEItemStack iaeItemStack) { - return false; - } - - @Override - public boolean isSameType(IAEItemStack iaeItemStack) { - if (iaeItemStack == null) return false; - IAEItemStack aeStack = AEItemStack.fromItemStack(this.delegate); - if (aeStack == null) return false; - return aeStack.isSameType(iaeItemStack); - } - - @Override - public boolean isSameType(ItemStack itemStack) { - if (this.delegate.isEmpty()) return itemStack.isEmpty(); - IAEItemStack aeStack = AEItemStack.fromItemStack(this.delegate); - if (aeStack == null) return false; - return aeStack.isSameType(itemStack); - } - - @Override - public @NotNull ItemStack getDefinition() { - delegate.setCount(GTUtility.safeCastLongToInt(stackSize)); - return this.delegate; - } - - @Override - public boolean equals(ItemStack itemStack) { - return this.delegate.isItemEqual(itemStack); - } - - @Override - public boolean equals(Object other) { - if (other instanceof WrappedItemStack wrappedItemStack) { - ItemStack otherStack = wrappedItemStack.getDefinition(); - NBTTagCompound thisTag = delegate.getTagCompound(); - NBTTagCompound otherTag = otherStack.getTagCompound(); - - boolean nbtMatch; - if (thisTag == null) { - nbtMatch = otherTag == null; - } else { - // noinspection PointlessNullCheck - nbtMatch = otherTag != null && thisTag.equals(otherTag); - } - - return this.delegate.isItemEqual(otherStack) && nbtMatch; - } else if (other instanceof AEItemStack aeItemStack) { - return aeItemStack.equals(delegate); - } else if (other instanceof ItemStack itemStack) { - return this.equals(itemStack); - } - - return false; - } - - @Override - public boolean delegateAndSizeEqual(@Nullable IWrappedStack wrappedStack) { - if (wrappedStack == null) return false; - return delegate.isItemEqual(wrappedStack.getDefinition()) && stackSize == wrappedStack.getStackSize(); - } - - @Override - public int hashCode() { - int result = 1; - result = 31 * result + this.delegate.getItem().hashCode(); - result = 31 * result + this.delegate.getItemDamage(); - result = 31 * result + (this.delegate.getTagCompound() == null ? 0 : this.delegate.getTagCompound().hashCode()); - return result; - } - - @Override - public ItemStack getCachedItemStack(long l) { - ItemStack copy = this.delegate.copy(); - copy.setCount(GTUtility.safeCastLongToInt(stackSize)); - return copy; - } - - @Override - public void setCachedItemStack(ItemStack itemStack) { - this.delegate = itemStack; - } - - @Override - public String toString() { - return String.format("Wrapped: %s, Stack Size: %d", delegate, stackSize); - } -} From e7a962cad9cf8aad073695d4eb4abc45c53d0ae3 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Sun, 14 Dec 2025 18:52:37 -0500 Subject: [PATCH 134/136] remove IsGuiActuallyClosing --- .../gregtech/client/IsGuiActuallyClosing.java | 6 ------ .../mixins/minecraft/MinecraftMixin.java | 9 --------- .../mixins/mui2/ModularSyncManagerMixin.java | 20 ------------------- src/main/resources/mixins.gregtech.mui2.json | 1 - 4 files changed, 36 deletions(-) delete mode 100644 src/main/java/gregtech/client/IsGuiActuallyClosing.java delete mode 100644 src/main/java/gregtech/mixins/mui2/ModularSyncManagerMixin.java diff --git a/src/main/java/gregtech/client/IsGuiActuallyClosing.java b/src/main/java/gregtech/client/IsGuiActuallyClosing.java deleted file mode 100644 index 3e7c765d3a0..00000000000 --- a/src/main/java/gregtech/client/IsGuiActuallyClosing.java +++ /dev/null @@ -1,6 +0,0 @@ -package gregtech.client; - -public class IsGuiActuallyClosing { - - public static boolean isGuiActuallyClosing; -} diff --git a/src/main/java/gregtech/mixins/minecraft/MinecraftMixin.java b/src/main/java/gregtech/mixins/minecraft/MinecraftMixin.java index 810be316d44..0bba8ad4f03 100644 --- a/src/main/java/gregtech/mixins/minecraft/MinecraftMixin.java +++ b/src/main/java/gregtech/mixins/minecraft/MinecraftMixin.java @@ -1,23 +1,19 @@ package gregtech.mixins.minecraft; import gregtech.api.items.toolitem.ItemGTToolbelt; -import gregtech.client.IsGuiActuallyClosing; import gregtech.common.ConfigHolder; import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.text.TextComponentTranslation; -import org.jetbrains.annotations.Nullable; import org.lwjgl.input.Keyboard; import org.objectweb.asm.Opcodes; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Redirect; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(Minecraft.class) @@ -46,9 +42,4 @@ public void interceptHotbarKeybindsForToolbelt(InventoryPlayer inventoryPlayer, } inventoryPlayer.currentItem = i; } - - @Inject(method = "displayGuiScreen", at = @At(value = "HEAD")) - public void captureNewGUI(@Nullable GuiScreen guiScreenIn, CallbackInfo ci) { - IsGuiActuallyClosing.isGuiActuallyClosing = guiScreenIn == null; - } } diff --git a/src/main/java/gregtech/mixins/mui2/ModularSyncManagerMixin.java b/src/main/java/gregtech/mixins/mui2/ModularSyncManagerMixin.java deleted file mode 100644 index 9346f9b614e..00000000000 --- a/src/main/java/gregtech/mixins/mui2/ModularSyncManagerMixin.java +++ /dev/null @@ -1,20 +0,0 @@ -package gregtech.mixins.mui2; - -import gregtech.client.IsGuiActuallyClosing; - -import com.cleanroommc.modularui.value.sync.ModularSyncManager; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(value = ModularSyncManager.class, remap = false) -public class ModularSyncManagerMixin { - - @Inject(method = "onClose", at = @At(value = "HEAD"), cancellable = true) - private void cancelIfGUIAboutToOpenIsJEI(CallbackInfo ci) { - if (!IsGuiActuallyClosing.isGuiActuallyClosing) { - ci.cancel(); - } - } -} diff --git a/src/main/resources/mixins.gregtech.mui2.json b/src/main/resources/mixins.gregtech.mui2.json index a1fa54c6e06..db262e13a60 100644 --- a/src/main/resources/mixins.gregtech.mui2.json +++ b/src/main/resources/mixins.gregtech.mui2.json @@ -13,7 +13,6 @@ ], "client": [ "LangKeyMixin", - "ModularSyncManagerMixin", "MCHelperMixin" ], "server": [] From 6418f7104e5bd90c54be1dfc80f6377da389a5bd Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Sun, 14 Dec 2025 19:16:43 -0500 Subject: [PATCH 135/136] Explode wrapped item/fluid stacks --- .../gregtech/api/mui/GTByteBufAdapters.java | 10 +++ .../mui/sync/appeng/AEFluidSyncHandler.java | 8 +- .../mui/sync/appeng/AEItemSyncHandler.java | 6 +- .../appeng/fluid/AEFluidConfigSlot.java | 9 +-- .../appeng/fluid/AEFluidDisplaySlot.java | 9 +-- .../fluid/AEFluidStackPreviewWidget.java | 19 +++-- .../widget/appeng/item/AEItemConfigSlot.java | 5 +- .../widget/appeng/item/AEItemDisplaySlot.java | 7 +- .../appeng/item/AEItemStackPreviewWidget.java | 12 ++- .../appeng/MetaTileEntityMEInputBase.java | 77 ++++++++++++++++++- .../appeng/MetaTileEntityMEInputBus.java | 76 +++--------------- .../appeng/MetaTileEntityMEInputHatch.java | 71 +++-------------- .../appeng/MetaTileEntityMEStockingBus.java | 28 +++---- .../appeng/MetaTileEntityMEStockingHatch.java | 25 ++---- .../appeng/slot/ExportOnlyAEFluidSlot.java | 56 ++++++-------- .../appeng/slot/ExportOnlyAEItemSlot.java | 45 +++++------ 16 files changed, 200 insertions(+), 263 deletions(-) diff --git a/src/main/java/gregtech/api/mui/GTByteBufAdapters.java b/src/main/java/gregtech/api/mui/GTByteBufAdapters.java index 8f286097c98..b812a6be85f 100644 --- a/src/main/java/gregtech/api/mui/GTByteBufAdapters.java +++ b/src/main/java/gregtech/api/mui/GTByteBufAdapters.java @@ -7,6 +7,10 @@ import net.minecraft.network.PacketBuffer; import net.minecraftforge.fluids.Fluid; +import appeng.api.storage.data.IAEFluidStack; +import appeng.api.storage.data.IAEItemStack; +import appeng.fluids.util.AEFluidStack; +import appeng.util.item.AEItemStack; import com.cleanroommc.modularui.utils.serialization.*; import org.jetbrains.annotations.NotNull; @@ -23,6 +27,12 @@ public class GTByteBufAdapters { public static final IByteBufAdapter FLUID = makeAdapter(NetworkUtil::readFluid, NetworkUtil::writeFluid); + public static final IByteBufAdapter AE_ITEM_STACK = makeAdapter(AEItemStack::fromPacket, + (buf, stack) -> stack.writeToPacket(buf)); + + public static final IByteBufAdapter AE_FLUID_STACK = makeAdapter(AEFluidStack::fromPacket, + (buf, stack) -> stack.writeToPacket(buf)); + public static IByteBufAdapter makeAdapter(@NotNull IByteBufDeserializer deserializer, @NotNull IByteBufSerializer serializer) { return makeAdapter(deserializer, serializer, IEquals.defaultTester()); diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java index 4c709dcad85..9d214a6d01f 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AEFluidSyncHandler.java @@ -8,7 +8,6 @@ import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEFluidList; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEFluidSlot; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.IConfigurableSlot; -import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedFluidStack; import net.minecraft.item.ItemStack; import net.minecraftforge.fluids.FluidStack; @@ -16,6 +15,7 @@ import net.minecraftforge.fml.relauncher.SideOnly; import appeng.api.storage.data.IAEFluidStack; +import appeng.fluids.util.AEFluidStack; import com.cleanroommc.modularui.utils.serialization.IByteBufAdapter; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import mezz.jei.api.gui.IRecipeLayout; @@ -49,14 +49,14 @@ public AEFluidSyncHandler(ExportOnlyAEFluidList fluidList, @Nullable Runnable di @Override protected @NotNull IByteBufAdapter initializeByteBufAdapter() { - return GTByteBufAdapters.WRAPPED_FLUID_STACK; + return GTByteBufAdapters.AE_FLUID_STACK; } @Override public boolean isStackValidForSlot(int index, @Nullable IAEFluidStack stack) { if (stack == null) return true; if (!isStocking) return true; - return !fluidList.hasStackInConfig(((WrappedFluidStack) stack).getDefinition(), true); + return !fluidList.hasStackInConfig(stack.getFluidStack(), true); } @Override @@ -92,6 +92,6 @@ public IRecipeTransferError receiveRecipe(@NotNull IRecipeLayout recipeLayout, b @SideOnly(Side.CLIENT) public void setConfig(int index, @Nullable FluidStack stack) { - setConfig(index, WrappedFluidStack.fromFluidStack(stack)); + setConfig(index, stack == null ? null : AEFluidStack.fromFluidStack(stack)); } } diff --git a/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java b/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java index 0c47dd99745..6079732bfa3 100644 --- a/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/appeng/AEItemSyncHandler.java @@ -8,13 +8,13 @@ import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEItemList; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEItemSlot; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.IConfigurableSlot; -import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedItemStack; import net.minecraft.item.ItemStack; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import appeng.api.storage.data.IAEItemStack; +import appeng.util.item.AEItemStack; import com.cleanroommc.modularui.utils.serialization.IByteBufAdapter; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import mezz.jei.api.gui.IRecipeLayout; @@ -49,7 +49,7 @@ public AEItemSyncHandler(ExportOnlyAEItemList itemList, @Nullable Runnable dirty @Override protected @NotNull IByteBufAdapter initializeByteBufAdapter() { - return GTByteBufAdapters.WRAPPED_ITEM_STACK; + return GTByteBufAdapters.AE_ITEM_STACK; } @Override @@ -94,6 +94,6 @@ public IRecipeTransferError receiveRecipe(@NotNull IRecipeLayout recipeLayout, b @SideOnly(Side.CLIENT) public void setConfig(int index, @Nullable ItemStack stack) { - setConfig(index, WrappedItemStack.fromItemStack(stack)); + setConfig(index, stack == null ? null : AEItemStack.fromItemStack(stack)); } } diff --git a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java index 4bea3e7e5f1..c79a1695237 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidConfigSlot.java @@ -8,7 +8,6 @@ import gregtech.api.util.KeyUtil; import gregtech.api.util.TextFormattingUtil; import gregtech.client.utils.RenderUtil; -import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedFluidStack; import net.minecraft.item.ItemStack; import net.minecraftforge.fluids.FluidStack; @@ -45,9 +44,9 @@ public void onInit() { @Override protected void buildTooltip(@NotNull RichTooltip tooltip) { - WrappedFluidStack config = (WrappedFluidStack) getSyncHandler().getConfig(index); + IAEFluidStack config = getSyncHandler().getConfig(index); if (config != null) { - FluidStack stack = config.getDefinition(); + FluidStack stack = config.getFluidStack(); tooltip.addLine(KeyUtil.fluid(stack)); FluidTooltipUtil.fluidInfo(stack, tooltip, false, true, true); tooltip.addLine(FluidTooltipUtil.getFluidModNameKey(stack)); @@ -74,9 +73,9 @@ public boolean isValidSyncHandler(SyncHandler syncHandler) { @Override public void draw(ModularGuiContext context, WidgetThemeEntry widgetTheme) { - WrappedFluidStack config = (WrappedFluidStack) getSyncHandler().getConfig(index); + IAEFluidStack config = getSyncHandler().getConfig(index); if (config != null) { - GuiDraw.drawFluidTexture(config.getDefinition(), 1, 1, getArea().w() - 2, getArea().h() - 2, 0); + GuiDraw.drawFluidTexture(config.getFluidStack(), 1, 1, getArea().w() - 2, getArea().h() - 2, 0); if (!isStocking) { RenderUtil.renderTextFixedCorner(TextFormattingUtil.formatLongToCompactString(config.getStackSize(), 4), 17d, 18d, 0xFFFFFF, true, 0.5f); diff --git a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidDisplaySlot.java b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidDisplaySlot.java index bcad0fd4b1a..2aefba2f810 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidDisplaySlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidDisplaySlot.java @@ -6,7 +6,6 @@ import gregtech.api.util.KeyUtil; import gregtech.api.util.TextFormattingUtil; import gregtech.client.utils.RenderUtil; -import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedFluidStack; import net.minecraftforge.fluids.FluidStack; @@ -28,9 +27,9 @@ public AEFluidDisplaySlot(int index) { @Override protected void buildTooltip(@NotNull RichTooltip tooltip) { - WrappedFluidStack stock = (WrappedFluidStack) getSyncHandler().getStock(index); + IAEFluidStack stock = getSyncHandler().getStock(index); if (stock != null) { - FluidStack stack = stock.getDefinition(); + FluidStack stack = stock.getFluidStack(); tooltip.addLine(KeyUtil.fluid(stack)); FluidTooltipUtil.fluidInfo(stack, tooltip, false, true, true); tooltip.addLine(FluidTooltipUtil.getFluidModNameKey(stack)); @@ -49,9 +48,9 @@ public boolean isValidSyncHandler(SyncHandler syncHandler) { @Override public void draw(ModularGuiContext context, WidgetThemeEntry widgetTheme) { - WrappedFluidStack stock = (WrappedFluidStack) getSyncHandler().getStock(index); + IAEFluidStack stock = getSyncHandler().getStock(index); if (stock != null) { - GuiDraw.drawFluidTexture(stock.getDefinition(), 1, 1, getArea().w() - 2, getArea().h() - 2, 0); + GuiDraw.drawFluidTexture(stock.getFluidStack(), 1, 1, getArea().w() - 2, getArea().h() - 2, 0); RenderUtil.renderTextFixedCorner(TextFormattingUtil.formatLongToCompactString(stock.getStackSize(), 4), 17d, 18d, 0xFFFFFF, true, 0.5f); } diff --git a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidStackPreviewWidget.java b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidStackPreviewWidget.java index 61b6d0b3fe7..0fc3ae23219 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidStackPreviewWidget.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/fluid/AEFluidStackPreviewWidget.java @@ -3,7 +3,6 @@ import gregtech.api.mui.widget.appeng.AEStackPreviewWidget; import gregtech.api.util.FluidTooltipUtil; import gregtech.api.util.KeyUtil; -import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedFluidStack; import net.minecraftforge.fluids.FluidStack; @@ -23,19 +22,19 @@ public AEFluidStackPreviewWidget(@NotNull Supplier stackToDraw) { @Override protected void buildTooltip(@NotNull RichTooltip tooltip) { - if (stackToDraw.get() instanceof WrappedFluidStack wrappedFluidStack) { - FluidStack stack = wrappedFluidStack.getDefinition(); - tooltip.addLine(KeyUtil.fluid(stack)); - FluidTooltipUtil.fluidInfo(stack, tooltip, false, true, false); - tooltip.addLine(FluidTooltipUtil.getFluidModNameKey(stack)); - } + IAEFluidStack stack = stackToDraw.get(); + if (stack == null) return; + + FluidStack fluidStack = stack.getFluidStack(); + tooltip.addLine(KeyUtil.fluid(fluidStack)); + FluidTooltipUtil.fluidInfo(fluidStack, tooltip, false, true, false); + tooltip.addLine(FluidTooltipUtil.getFluidModNameKey(fluidStack)); } @Override public void draw(@Nullable IAEFluidStack stackToDraw, int x, int y, int width, int height) { - if (stackToDraw instanceof WrappedFluidStack wrappedFluidStack) { - GuiDraw.drawFluidTexture(wrappedFluidStack.getDefinition(), x, y, width, height, 0.0f); - } + if (stackToDraw == null) return; + GuiDraw.drawFluidTexture(stackToDraw.getFluidStack(), x, y, width, height, 0.0f); } @Override diff --git a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java index de31ad2e6f9..16e87d65e71 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemConfigSlot.java @@ -6,7 +6,6 @@ import gregtech.api.mui.widget.appeng.AEStackPreviewWidget; import gregtech.api.util.TextFormattingUtil; import gregtech.client.utils.RenderUtil; -import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedItemStack; import net.minecraft.item.ItemStack; @@ -39,7 +38,7 @@ public void onInit() { @Override protected void buildTooltip(@NotNull RichTooltip tooltip) { - WrappedItemStack config = (WrappedItemStack) getSyncHandler().getConfig(index); + IAEItemStack config = getSyncHandler().getConfig(index); if (config != null) { tooltip.addFromItem(config.getDefinition()); tooltip.addLine((context, x, y, width, height, widgetTheme) -> { @@ -64,7 +63,7 @@ public boolean isValidSyncHandler(SyncHandler syncHandler) { @Override public void draw(ModularGuiContext context, WidgetThemeEntry widgetTheme) { - WrappedItemStack config = (WrappedItemStack) getSyncHandler().getConfig(index); + IAEItemStack config = getSyncHandler().getConfig(index); if (config != null) { RenderUtil.drawItemStack(config.getDefinition(), 1, 1, false); if (!isStocking) { diff --git a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemDisplaySlot.java b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemDisplaySlot.java index e3bc2c84322..c8383d4134b 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemDisplaySlot.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemDisplaySlot.java @@ -4,7 +4,6 @@ import gregtech.api.mui.widget.appeng.AEDisplaySlot; import gregtech.api.util.TextFormattingUtil; import gregtech.client.utils.RenderUtil; -import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedItemStack; import net.minecraft.item.ItemStack; @@ -25,7 +24,7 @@ public AEItemDisplaySlot(int index) { @Override protected void buildTooltip(@NotNull RichTooltip tooltip) { - WrappedItemStack stock = (WrappedItemStack) getSyncHandler().getStock(index); + IAEItemStack stock = getSyncHandler().getStock(index); if (stock != null) { tooltip.addFromItem(stock.getDefinition()); } @@ -43,9 +42,9 @@ public boolean isValidSyncHandler(SyncHandler syncHandler) { @Override public void draw(ModularGuiContext context, WidgetThemeEntry widgetTheme) { - WrappedItemStack stock = (WrappedItemStack) getSyncHandler().getStock(index); + IAEItemStack stock = getSyncHandler().getStock(index); if (stock != null) { - ItemStack stack = stock.createItemStack(); + ItemStack stack = stock.getDefinition(); RenderUtil.drawItemStack(stack, 1, 1, false); RenderUtil.renderTextFixedCorner(TextFormattingUtil.formatLongToCompactString(stock.getStackSize(), 4), 17d, 18d, 0xFFFFFF, true, 0.5f); diff --git a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemStackPreviewWidget.java b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemStackPreviewWidget.java index 92a30c18dcd..6c6fa14fe2e 100644 --- a/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemStackPreviewWidget.java +++ b/src/main/java/gregtech/api/mui/widget/appeng/item/AEItemStackPreviewWidget.java @@ -2,7 +2,6 @@ import gregtech.api.mui.widget.appeng.AEStackPreviewWidget; import gregtech.client.utils.RenderUtil; -import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedItemStack; import appeng.api.storage.data.IAEItemStack; import com.cleanroommc.modularui.screen.RichTooltip; @@ -19,16 +18,15 @@ public AEItemStackPreviewWidget(@NotNull Supplier stackToDraw) { @Override protected void buildTooltip(@NotNull RichTooltip tooltip) { - if (stackToDraw.get() instanceof WrappedItemStack wrappedItemStack) { - tooltip.addFromItem(wrappedItemStack.getDefinition()); - } + IAEItemStack stack = stackToDraw.get(); + if (stack == null) return; + tooltip.addFromItem(stack.getDefinition()); } @Override public void draw(@Nullable IAEItemStack stackToDraw, int x, int y, int width, int height) { - if (stackToDraw instanceof WrappedItemStack wrappedItemStack) { - RenderUtil.drawItemStack(wrappedItemStack.getDefinition(), x, y, false); - } + if (stackToDraw == null) return; + RenderUtil.drawItemStack(stackToDraw.getDefinition(), x, y, false); } @Override diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBase.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBase.java index fbb852e1025..3340b6f0cf9 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBase.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBase.java @@ -3,6 +3,7 @@ import gregtech.api.capability.GregtechDataCodes; import gregtech.api.capability.GregtechTileCapabilities; import gregtech.api.capability.IControllable; +import gregtech.api.capability.IDataStickIntractable; import gregtech.api.capability.IGhostSlotConfigurable; import gregtech.api.capability.impl.GhostCircuitItemStackHandler; import gregtech.api.mui.GTGuiTextures; @@ -14,10 +15,13 @@ import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAESlot; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.IExportOnlyAEStackList; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.PacketBuffer; import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; +import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.Constants; @@ -42,11 +46,12 @@ import com.cleanroommc.modularui.widgets.layout.Flow; import com.cleanroommc.modularui.widgets.textfield.TextFieldWidget; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Range; public abstract class MetaTileEntityMEInputBase> extends MetaTileEntityAEHostableChannelPart - implements IControllable, IGhostSlotConfigurable { + implements IControllable, IGhostSlotConfigurable, IDataStickIntractable { public final static int CONFIG_SIZE = 16; public static final String WORKING_TAG = "WorkingEnabled"; @@ -369,4 +374,74 @@ public void readFromNBT(NBTTagCompound data) { } this.circuitInventory.read(data); } + + @Override + public final void onDataStickLeftClick(EntityPlayer player, ItemStack dataStick) { + NBTTagCompound tag = new NBTTagCompound(); + tag.setTag("MEInputBus", writeConfigToTag()); + dataStick.setTagCompound(tag); + dataStick.setTranslatableName("gregtech.machine.me.item_import.data_stick.name"); + player.sendStatusMessage(new TextComponentTranslation("gregtech.machine.me.import_copy_settings"), true); + } + + protected NBTTagCompound writeConfigToTag() { + NBTTagCompound tag = new NBTTagCompound(); + NBTTagCompound configStacks = new NBTTagCompound(); + + ExportOnlyAESlot[] inventory = getAEHandler().getInventory(); + tag.setTag("ConfigStacks", configStacks); + for (int index = 0; index < CONFIG_SIZE; index++) { + ExportOnlyAESlot slot = inventory[index]; + AEStackType config = slot.getConfig(); + if (config == null) continue; + + NBTTagCompound stackNBT = new NBTTagCompound(); + config.writeToNBT(stackNBT); + configStacks.setTag(Integer.toString(index), stackNBT); + } + + tag.setByte("GhostCircuit", (byte) this.circuitInventory.getCircuitValue()); + tag.setInteger(REFRESH_RATE_TAG, this.refreshRate); + return tag; + } + + @Override + public final boolean onDataStickRightClick(EntityPlayer player, ItemStack dataStick) { + NBTTagCompound tag = dataStick.getTagCompound(); + if (tag == null || !tag.hasKey("MEInputBus")) { + return false; + } + readConfigFromTag(tag.getCompoundTag("MEInputBus")); + syncME(); + player.sendStatusMessage(new TextComponentTranslation("gregtech.machine.me.import_paste_settings"), true); + return true; + } + + protected void readConfigFromTag(NBTTagCompound tag) { + if (tag.hasKey("ConfigStacks")) { + ExportOnlyAESlot[] inventory = getAEHandler().getInventory(); + NBTTagCompound configStacks = tag.getCompoundTag("ConfigStacks"); + for (int index = 0; index < CONFIG_SIZE; index++) { + AEStackType stack = null; + String key = Integer.toString(index); + if (configStacks.hasKey(key)) { + NBTTagCompound configTag = configStacks.getCompoundTag(key); + stack = readStackFromNBT(configTag); + } + + inventory[index].setConfig(stack); + } + } + + if (tag.hasKey("GhostCircuit")) { + this.setGhostCircuitConfig(tag.getByte("GhostCircuit")); + } + + if (tag.hasKey(REFRESH_RATE_TAG)) { + this.refreshRate = tag.getInteger(REFRESH_RATE_TAG); + } + } + + @Nullable + protected abstract AEStackType readStackFromNBT(@NotNull NBTTagCompound tagCompound); } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java index e338ea523ae..adc023b9201 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java @@ -1,6 +1,5 @@ package gregtech.common.metatileentities.multi.multiblockpart.appeng; -import gregtech.api.capability.IDataStickIntractable; import gregtech.api.capability.INotifiableHandler; import gregtech.api.capability.impl.ItemHandlerList; import gregtech.api.capability.impl.NotifiableItemStackHandler; @@ -19,22 +18,21 @@ import gregtech.client.renderer.texture.Textures; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEItemList; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEItemSlot; -import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedItemStack; import net.minecraft.client.resources.I18n; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTBase; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.util.ResourceLocation; -import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; +import net.minecraftforge.common.util.Constants; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandlerModifiable; import appeng.api.storage.channels.IItemStorageChannel; import appeng.api.storage.data.IAEItemStack; +import appeng.util.item.AEItemStack; import codechicken.lib.render.CCRenderState; import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; @@ -54,7 +52,7 @@ import java.util.List; public class MetaTileEntityMEInputBus extends MetaTileEntityMEInputBase - implements IMultiblockAbilityPart, IDataStickIntractable { + implements IMultiblockAbilityPart { public static final String ITEM_BUFFER_TAG = "ItemSlots"; @@ -248,68 +246,12 @@ public void registerAbilities(@NotNull AbilityInstances abilityInstances) { } @Override - public final void onDataStickLeftClick(EntityPlayer player, ItemStack dataStick) { - NBTTagCompound tag = new NBTTagCompound(); - tag.setTag("MEInputBus", writeConfigToTag()); - dataStick.setTagCompound(tag); - dataStick.setTranslatableName("gregtech.machine.me.item_import.data_stick.name"); - player.sendStatusMessage(new TextComponentTranslation("gregtech.machine.me.import_copy_settings"), true); - } - - protected NBTTagCompound writeConfigToTag() { - NBTTagCompound tag = new NBTTagCompound(); - NBTTagCompound configStacks = new NBTTagCompound(); - tag.setTag("ConfigStacks", configStacks); - for (int i = 0; i < CONFIG_SIZE; i++) { - var slot = this.aeHandler.getInventory()[i]; - IAEItemStack config = slot.getConfig(); - if (config == null) { - continue; - } - NBTTagCompound stackNbt = new NBTTagCompound(); - config.getDefinition().writeToNBT(stackNbt); - configStacks.setTag(Integer.toString(i), stackNbt); - } - - tag.setByte("GhostCircuit", (byte) this.circuitInventory.getCircuitValue()); - - tag.setInteger(REFRESH_RATE_TAG, this.refreshRate); - - return tag; - } - - @Override - public final boolean onDataStickRightClick(EntityPlayer player, ItemStack dataStick) { - NBTTagCompound tag = dataStick.getTagCompound(); - if (tag == null || !tag.hasKey("MEInputBus")) { - return false; - } - readConfigFromTag(tag.getCompoundTag("MEInputBus")); - syncME(); - player.sendStatusMessage(new TextComponentTranslation("gregtech.machine.me.import_paste_settings"), true); - return true; - } - - protected void readConfigFromTag(NBTTagCompound tag) { - if (tag.hasKey("ConfigStacks")) { - NBTTagCompound configStacks = tag.getCompoundTag("ConfigStacks"); - for (int i = 0; i < CONFIG_SIZE; i++) { - String key = Integer.toString(i); - if (configStacks.hasKey(key)) { - NBTTagCompound configTag = configStacks.getCompoundTag(key); - this.aeHandler.getInventory()[i].setConfig(WrappedItemStack.fromNBT(configTag)); - } else { - this.aeHandler.getInventory()[i].setConfig(null); - } - } - } - - if (tag.hasKey("GhostCircuit")) { - this.setGhostCircuitConfig(tag.getByte("GhostCircuit")); - } - - if (tag.hasKey(REFRESH_RATE_TAG)) { - this.refreshRate = tag.getInteger(REFRESH_RATE_TAG); + protected @Nullable IAEItemStack readStackFromNBT(@NotNull NBTTagCompound tagCompound) { + // Check if the Cnt tag is present. If it isn't, the config was written with the old wrapped stacks. + if (tagCompound.hasKey("Cnt", Constants.NBT.TAG_LONG)) { + return AEItemStack.fromNBT(tagCompound); + } else { + return AEItemStack.fromItemStack(new ItemStack(tagCompound)); } } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java index 9bfe4af7fe1..4ca20a4dd14 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java @@ -1,6 +1,5 @@ package gregtech.common.metatileentities.multi.multiblockpart.appeng; -import gregtech.api.capability.IDataStickIntractable; import gregtech.api.capability.impl.FluidTankList; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; @@ -15,21 +14,21 @@ import gregtech.client.renderer.texture.Textures; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEFluidList; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEFluidSlot; -import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedFluidStack; import net.minecraft.client.resources.I18n; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTBase; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.util.ResourceLocation; -import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; +import net.minecraftforge.common.util.Constants; +import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.IFluidTank; import appeng.api.storage.channels.IFluidStorageChannel; import appeng.api.storage.data.IAEFluidStack; +import appeng.fluids.util.AEFluidStack; import codechicken.lib.render.CCRenderState; import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; @@ -46,7 +45,7 @@ import java.util.List; public class MetaTileEntityMEInputHatch extends MetaTileEntityMEInputBase - implements IMultiblockAbilityPart, IDataStickIntractable { + implements IMultiblockAbilityPart { public static final String FLUID_BUFFER_TAG = "FluidTanks"; @@ -203,62 +202,12 @@ public void registerAbilities(@NotNull AbilityInstances abilityInstances) { } @Override - public final void onDataStickLeftClick(EntityPlayer player, ItemStack dataStick) { - NBTTagCompound tag = new NBTTagCompound(); - tag.setTag("MEInputHatch", writeConfigToTag()); - dataStick.setTagCompound(tag); - dataStick.setTranslatableName("gregtech.machine.me.fluid_import.data_stick.name"); - player.sendStatusMessage(new TextComponentTranslation("gregtech.machine.me.import_copy_settings"), true); - } - - protected NBTTagCompound writeConfigToTag() { - NBTTagCompound tag = new NBTTagCompound(); - NBTTagCompound configStacks = new NBTTagCompound(); - tag.setTag("ConfigStacks", configStacks); - for (int i = 0; i < CONFIG_SIZE; i++) { - var slot = this.aeHandler.getInventory()[i]; - IAEFluidStack config = slot.getConfig(); - if (config == null) { - continue; - } - NBTTagCompound stackNbt = new NBTTagCompound(); - config.writeToNBT(stackNbt); - configStacks.setTag(Integer.toString(i), stackNbt); - } - - tag.setInteger(REFRESH_RATE_TAG, this.refreshRate); - - return tag; - } - - @Override - public final boolean onDataStickRightClick(EntityPlayer player, ItemStack dataStick) { - NBTTagCompound tag = dataStick.getTagCompound(); - if (tag == null || !tag.hasKey("MEInputHatch")) { - return false; - } - readConfigFromTag(tag.getCompoundTag("MEInputHatch")); - syncME(); - player.sendStatusMessage(new TextComponentTranslation("gregtech.machine.me.import_paste_settings"), true); - return true; - } - - protected void readConfigFromTag(NBTTagCompound tag) { - if (tag.hasKey("ConfigStacks")) { - NBTTagCompound configStacks = tag.getCompoundTag("ConfigStacks"); - for (int i = 0; i < CONFIG_SIZE; i++) { - String key = Integer.toString(i); - if (configStacks.hasKey(key)) { - NBTTagCompound configTag = configStacks.getCompoundTag(key); - this.aeHandler.getInventory()[i].setConfig(WrappedFluidStack.fromNBT(configTag)); - } else { - this.aeHandler.getInventory()[i].setConfig(null); - } - } - } - - if (tag.hasKey(REFRESH_RATE_TAG)) { - this.refreshRate = tag.getInteger(REFRESH_RATE_TAG); + protected @Nullable IAEFluidStack readStackFromNBT(@NotNull NBTTagCompound tagCompound) { + // Check if the Cnt tag is present. If it isn't, the config was written with the old wrapped stacks. + if (tagCompound.hasKey("Cnt", Constants.NBT.TAG_LONG)) { + return AEFluidStack.fromNBT(tagCompound); + } else { + return AEFluidStack.fromFluidStack(FluidStack.loadFluidStackFromNBT(tagCompound)); } } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java index dbd3ee5ac99..75e27baf738 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingBus.java @@ -10,7 +10,6 @@ import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEItemList; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEItemSlot; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.IConfigurableSlot; -import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedItemStack; import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.EntityPlayer; @@ -116,12 +115,7 @@ protected void syncME() { slot.setStack(null); } else { // Try to fill the slot - IAEItemStack request; - if (slot.getConfig() instanceof WrappedItemStack wis) { - request = wis.getAEStack(); - } else { - request = slot.getConfig().copy(); - } + IAEItemStack request = slot.getConfig().copy(); request.setStackSize(Long.MAX_VALUE); IAEItemStack result = monitor.extractItems(request, Actionable.SIMULATE, getActionSource()); slot.setStack(result); @@ -251,20 +245,21 @@ private void refreshList() { } int index = 0; + ExportOnlyAEStockingItemSlot[] inventory = getAEHandler().getInventory(); for (IAEItemStack stack : storageList) { if (index >= CONFIG_SIZE) break; - if (stack.getStackSize() == 0 || stack.getStackSize() < minimumStackSize) continue; + if (stack.getStackSize() < minimumStackSize) continue; + stack = monitor.extractItems(stack, Actionable.SIMULATE, getActionSource()); - if (stack == null || stack.getStackSize() == 0) continue; + if (stack == null || stack.getStackSize() < minimumStackSize) continue; - ItemStack itemStack = stack.createItemStack(); + ItemStack itemStack = stack.getDefinition(); if (itemStack == null || itemStack.isEmpty()) continue; // Ensure that it is valid to configure with this stack if (autoPullTest != null && !autoPullTest.test(itemStack)) continue; - IAEItemStack selectedStack = WrappedItemStack.fromItemStack(itemStack); - if (selectedStack == null) continue; + IAEItemStack selectedStack = stack.copy(); IAEItemStack configStack = selectedStack.copy().setStackSize(1); - var slot = this.getAEHandler().getInventory()[index]; + ExportOnlyAEStockingItemSlot slot = inventory[index]; slot.setConfig(configStack); slot.setStack(selectedStack); index++; @@ -421,12 +416,7 @@ public ExportOnlyAEStockingItemSlot(MetaTileEntityMEStockingBus holder) { if (monitor == null) return ItemStack.EMPTY; Actionable action = simulate ? Actionable.SIMULATE : Actionable.MODULATE; - IAEItemStack request; - if (this.config instanceof WrappedItemStack wis) { - request = wis.getAEStack(); - } else { - request = this.config.copy(); - } + IAEItemStack request = config.copy(); request.setStackSize(amount); IAEItemStack result = monitor.extractItems(request, action, holder.getActionSource()); diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java index 982fb7c3ccc..a86e9ecf386 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEStockingHatch.java @@ -8,7 +8,6 @@ import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEFluidList; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.ExportOnlyAEFluidSlot; import gregtech.common.metatileentities.multi.multiblockpart.appeng.slot.IConfigurableSlot; -import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedFluidStack; import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.EntityPlayer; @@ -112,12 +111,7 @@ protected void syncME() { slot.setStack(null); } else { // Try to fill the slot - IAEFluidStack request; - if (slot.getConfig() instanceof WrappedFluidStack wfs) { - request = wfs.getAEStack(); - } else { - request = slot.getConfig().copy(); - } + IAEFluidStack request = slot.getConfig().copy(); request.setStackSize(Long.MAX_VALUE); IAEFluidStack result = monitor.extractItems(request, Actionable.SIMULATE, getActionSource()); slot.setStack(result); @@ -205,18 +199,20 @@ private void refreshList() { } int index = 0; + ExportOnlyAEStockingFluidSlot[] inventory = getAEHandler().getInventory(); for (IAEFluidStack stack : storageList) { if (index >= CONFIG_SIZE) break; - if (stack.getStackSize() == 0 || stack.getStackSize() < minimumStackSize) continue; + if (stack.getStackSize() < minimumStackSize) continue; + stack = monitor.extractItems(stack, Actionable.SIMULATE, getActionSource()); - if (stack == null || stack.getStackSize() == 0) continue; + if (stack == null || stack.getStackSize() < minimumStackSize) continue; FluidStack fluidStack = stack.getFluidStack(); if (fluidStack == null) continue; if (autoPullTest != null && !autoPullTest.test(fluidStack)) continue; - IAEFluidStack selectedStack = WrappedFluidStack.fromFluidStack(fluidStack); + IAEFluidStack selectedStack = stack.copy(); IAEFluidStack configStack = selectedStack.copy().setStackSize(1); - var slot = this.getAEHandler().getInventory()[index]; + var slot = inventory[index]; slot.setConfig(configStack); slot.setStack(selectedStack); index++; @@ -424,12 +420,7 @@ protected MetaTileEntityMEStockingHatch getHolder() { if (monitor == null) return null; Actionable action = doDrain ? Actionable.MODULATE : Actionable.SIMULATE; - IAEFluidStack request; - if (this.config instanceof WrappedFluidStack wfs) { - request = wfs.getAEStack(); - } else { - request = this.config.copy(); - } + IAEFluidStack request = config.copy(); request.setStackSize(maxDrain); IAEFluidStack result = monitor.extractItems(request, action, getHolder().getActionSource()); diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEFluidSlot.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEFluidSlot.java index 397afc0f883..15b6de6c7a1 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEFluidSlot.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEFluidSlot.java @@ -2,9 +2,9 @@ import gregtech.api.capability.INotifiableHandler; import gregtech.api.metatileentity.MetaTileEntity; -import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedFluidStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.Constants; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidTankInfo; import net.minecraftforge.fluids.IFluidTank; @@ -13,6 +13,7 @@ import net.minecraftforge.fluids.capability.IFluidTankProperties; import appeng.api.storage.data.IAEFluidStack; +import appeng.fluids.util.AEFluidStack; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -45,33 +46,14 @@ public void decrementStock(long amount) { stock.decStackSize(amount); } - @Override - public IAEFluidStack requestStack() { - IAEFluidStack result = super.requestStack(); - if (result instanceof WrappedFluidStack) { - return ((WrappedFluidStack) result).getAEStack(); - } else { - return result; - } - } - - @Override - public IAEFluidStack exceedStack() { - IAEFluidStack result = super.exceedStack(); - if (result instanceof WrappedFluidStack) { - return ((WrappedFluidStack) result).getAEStack(); - } else { - return result; - } - } - @Override public void addStack(IAEFluidStack stack) { if (this.stock == null) { - this.stock = WrappedFluidStack.fromFluidStack(stack.getFluidStack()); + this.stock = stack.copy(); } else { this.stock.add(stack); } + trigger(); } @@ -82,31 +64,43 @@ public void setStack(IAEFluidStack stack) { } else if (stack == null) { this.stock = null; } else if (this.stock == null || this.stock.getFluid() != stack.getFluid()) { - this.stock = WrappedFluidStack.fromFluidStack(stack.getFluidStack()); + this.stock = stack.copy(); } else if (this.stock.getStackSize() != stack.getStackSize()) { this.stock.setStackSize(stack.getStackSize()); - } else return; + } else { + return; + } + trigger(); } @Override public void deserializeNBT(NBTTagCompound nbt) { if (nbt.hasKey(CONFIG_TAG)) { - this.config = WrappedFluidStack.fromNBT(nbt.getCompoundTag(CONFIG_TAG)); + NBTTagCompound tag = nbt.getCompoundTag(CONFIG_TAG); + // Check if the Cnt tag is present. If it isn't, the config was written with the old wrapped stacks. + if (tag.hasKey("Cnt", Constants.NBT.TAG_LONG)) { + this.config = AEFluidStack.fromNBT(tag); + } else { + this.config = AEFluidStack.fromFluidStack(FluidStack.loadFluidStackFromNBT(tag)); + } } + if (nbt.hasKey(STOCK_TAG)) { - this.stock = WrappedFluidStack.fromNBT(nbt.getCompoundTag(STOCK_TAG)); + NBTTagCompound tag = nbt.getCompoundTag(STOCK_TAG); + // Check if the Cnt tag is present. If it isn't, the config was written with the old wrapped stacks. + if (tag.hasKey("Cnt", Constants.NBT.TAG_LONG)) { + this.stock = AEFluidStack.fromNBT(tag); + } else { + this.stock = AEFluidStack.fromFluidStack(FluidStack.loadFluidStackFromNBT(tag)); + } } } @Nullable @Override public FluidStack getFluid() { - if (this.stock instanceof WrappedFluidStack wrappedFluidStack) { - return wrappedFluidStack.getDefinition(); - } - - return null; + return stock == null ? null : stock.getFluidStack(); } @Override diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEItemSlot.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEItemSlot.java index fc7fe955755..37c8089e6ca 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEItemSlot.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/slot/ExportOnlyAEItemSlot.java @@ -1,12 +1,12 @@ package gregtech.common.metatileentities.multi.multiblockpart.appeng.slot; -import gregtech.common.metatileentities.multi.multiblockpart.appeng.stack.WrappedItemStack; - import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.Constants; import net.minecraftforge.items.IItemHandlerModifiable; import appeng.api.storage.data.IAEItemStack; +import appeng.util.item.AEItemStack; import org.jetbrains.annotations.NotNull; import java.util.function.Consumer; @@ -30,10 +30,23 @@ public void setTrigger(Consumer trigger) { @Override public void deserializeNBT(NBTTagCompound nbt) { if (nbt.hasKey(CONFIG_TAG)) { - this.config = WrappedItemStack.fromNBT(nbt.getCompoundTag(CONFIG_TAG)); + NBTTagCompound tag = nbt.getCompoundTag(CONFIG_TAG); + // Check if the Cnt tag is present. If it isn't, the config was written with the old wrapped stacks. + if (tag.hasKey("Cnt", Constants.NBT.TAG_LONG)) { + this.config = AEItemStack.fromNBT(tag); + } else { + this.config = AEItemStack.fromItemStack(new ItemStack(tag)); + } } + if (nbt.hasKey(STOCK_TAG)) { - this.stock = WrappedItemStack.fromNBT(nbt.getCompoundTag(STOCK_TAG)); + NBTTagCompound tag = nbt.getCompoundTag(STOCK_TAG); + // Check if the Cnt tag is present. If it isn't, the config was written with the old wrapped stacks. + if (tag.hasKey("Cnt", Constants.NBT.TAG_LONG)) { + this.stock = AEItemStack.fromNBT(tag); + } else { + this.stock = AEItemStack.fromItemStack(new ItemStack(tag)); + } } } @@ -94,30 +107,10 @@ public ItemStack extractItem(int slot, int amount, boolean simulate) { return ItemStack.EMPTY; } - @Override - public IAEItemStack requestStack() { - IAEItemStack result = super.requestStack(); - if (result instanceof WrappedItemStack wrappedItemStack) { - return wrappedItemStack.getAEStack(); - } else { - return result; - } - } - - @Override - public IAEItemStack exceedStack() { - IAEItemStack result = super.exceedStack(); - if (result instanceof WrappedItemStack wrappedItemStack) { - return wrappedItemStack.getAEStack(); - } else { - return result; - } - } - @Override public void addStack(IAEItemStack stack) { if (this.stock == null) { - this.stock = WrappedItemStack.fromItemStack(stack.createItemStack()); + this.stock = stack.copy(); } else { this.stock.add(stack); } @@ -132,7 +125,7 @@ public void setStack(IAEItemStack stack) { this.stock = null; } else { // todo this could maybe be improved with better comparison check - this.stock = WrappedItemStack.fromItemStack(stack.createItemStack()); + this.stock = stack.copy(); } this.trigger.accept(0); } From d86f5e1deaf26fbfcb95e915886e0920314455b9 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Mon, 15 Dec 2025 13:48:42 -0500 Subject: [PATCH 136/136] fix a few things --- .../api/capability/impl/ItemHandlerList.java | 4 +++ ...etaTileEntityMultiblockNotifiablePart.java | 11 +++--- .../MetaTileEntityAEHostableChannelPart.java | 1 - .../appeng/MetaTileEntityAEHostablePart.java | 5 +-- .../appeng/MetaTileEntityMEInputBase.java | 15 +++++--- .../appeng/MetaTileEntityMEInputBus.java | 34 ++++--------------- .../appeng/MetaTileEntityMEInputHatch.java | 5 ++- .../appeng/MetaTileEntityMEOutputBase.java | 4 +-- 8 files changed, 34 insertions(+), 45 deletions(-) diff --git a/src/main/java/gregtech/api/capability/impl/ItemHandlerList.java b/src/main/java/gregtech/api/capability/impl/ItemHandlerList.java index 8cf116b5af5..f0ca1312948 100644 --- a/src/main/java/gregtech/api/capability/impl/ItemHandlerList.java +++ b/src/main/java/gregtech/api/capability/impl/ItemHandlerList.java @@ -20,6 +20,10 @@ public class ItemHandlerList implements IItemHandlerModifiable { private final Int2ObjectMap handlerBySlotIndex = new Int2ObjectOpenHashMap<>(); private final Object2IntMap baseIndexOffset = new Object2IntArrayMap<>(); + public ItemHandlerList(@NotNull IItemHandler @NotNull... handlers) { + this(Arrays.asList(handlers)); + } + public ItemHandlerList(@NotNull List itemHandlerList) { int currentSlotIndex = 0; for (IItemHandler itemHandler : itemHandlerList) { diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMultiblockNotifiablePart.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMultiblockNotifiablePart.java index 7f7b3831724..95530451aac 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMultiblockNotifiablePart.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMultiblockNotifiablePart.java @@ -8,6 +8,8 @@ import net.minecraft.util.ResourceLocation; import net.minecraftforge.fluids.IFluidTank; +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.IItemHandlerModifiable; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -26,13 +28,14 @@ public MetaTileEntityMultiblockNotifiablePart(ResourceLocation metaTileEntityId, private @NotNull List getItemHandlers() { List notifiables = new ArrayList<>(); - var mteHandler = isExportHatch ? getExportItems() : getImportItems(); + IItemHandlerModifiable mteHandler = isExportHatch ? getExportItems() : getImportItems(); if (mteHandler instanceof INotifiableHandler notifiable) { notifiables.add(notifiable); } else if (mteHandler instanceof ItemHandlerList list) { - for (var handler : list.getBackingHandlers()) { - if (handler instanceof INotifiableHandler notifiable) + for (IItemHandler handler : list.getBackingHandlers()) { + if (handler instanceof INotifiableHandler notifiable) { notifiables.add(notifiable); + } } } if (getItemInventory() instanceof INotifiableHandler notifiable) { @@ -54,7 +57,7 @@ public MetaTileEntityMultiblockNotifiablePart(ResourceLocation metaTileEntityId, private List getPartHandlers() { List handlerList = new ArrayList<>(); - for (var notif : getItemHandlers()) { + for (INotifiableHandler notif : getItemHandlers()) { if (notif.size() > 0) { handlerList.add(notif); } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostableChannelPart.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostableChannelPart.java index eba9990a1a4..fd0d2ad1f99 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostableChannelPart.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostableChannelPart.java @@ -17,7 +17,6 @@ public abstract class MetaTileEntityAEHostableChannelPart> extends MetaTileEntityAEHostablePart { private final Class> storageChannel; - protected int refreshRate; public MetaTileEntityAEHostableChannelPart(ResourceLocation metaTileEntityId, int tier, boolean isExportHatch, Class> storageChannel) { diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostablePart.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostablePart.java index 9a599d8d0f5..d3b48316659 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostablePart.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityAEHostablePart.java @@ -37,7 +37,7 @@ public abstract class MetaTileEntityAEHostablePart extends MetaTileEntityMultibl public static final String REFRESH_RATE_TAG = "RefreshRate"; private AENetworkProxy aeProxy; - protected int refreshRate = ConfigHolder.compat.ae2.updateIntervals; + private int refreshRate = ConfigHolder.compat.ae2.updateIntervals; protected boolean isOnline; protected boolean allowsExtraConnections = false; protected boolean meStatusChanged = false; @@ -120,7 +120,8 @@ public int getRefreshRate() { } protected void setRefreshRate(int newRefreshRate) { - if (this.refreshRate == newRefreshRate) return; + if (newRefreshRate == this.refreshRate) return; + if (newRefreshRate < 1) throw new IllegalArgumentException("Refresh rate of AE part cannot be below 1!"); this.refreshRate = newRefreshRate; if (!getWorld().isRemote) { diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBase.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBase.java index 3340b6f0cf9..8e884d67fa7 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBase.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBase.java @@ -25,6 +25,7 @@ import net.minecraft.world.World; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.Constants; +import net.minecraftforge.items.IItemHandlerModifiable; import appeng.api.config.Actionable; import appeng.api.storage.IMEMonitor; @@ -68,10 +69,14 @@ public MetaTileEntityMEInputBase(ResourceLocation metaTileEntityId, int tier, bo @Override protected void initializeInventory() { - super.initializeInventory(); this.aeHandler = initializeAEHandler(); this.circuitInventory = new GhostCircuitItemStackHandler(this); - this.importItems = circuitInventory; + super.initializeInventory(); + } + + @Override + protected IItemHandlerModifiable createImportItemHandler() { + return circuitInventory; } protected abstract @NotNull IExportOnlyAEStackList initializeAEHandler(); @@ -81,7 +86,7 @@ protected void initializeInventory() { @Override public void update() { super.update(); - if (!getWorld().isRemote && workingEnabled && isOnline && (getOffsetTimer() % refreshRate == 0)) { + if (!getWorld().isRemote && workingEnabled && isOnline && (getOffsetTimer() % getRefreshRate() == 0)) { operateOnME(); } } @@ -401,7 +406,7 @@ protected NBTTagCompound writeConfigToTag() { } tag.setByte("GhostCircuit", (byte) this.circuitInventory.getCircuitValue()); - tag.setInteger(REFRESH_RATE_TAG, this.refreshRate); + tag.setInteger(REFRESH_RATE_TAG, getRefreshRate()); return tag; } @@ -438,7 +443,7 @@ protected void readConfigFromTag(NBTTagCompound tag) { } if (tag.hasKey(REFRESH_RATE_TAG)) { - this.refreshRate = tag.getInteger(REFRESH_RATE_TAG); + setRefreshRate(tag.getInteger(REFRESH_RATE_TAG)); } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java index adc023b9201..d06b856cdb0 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputBus.java @@ -1,6 +1,5 @@ package gregtech.common.metatileentities.multi.multiblockpart.appeng; -import gregtech.api.capability.INotifiableHandler; import gregtech.api.capability.impl.ItemHandlerList; import gregtech.api.capability.impl.NotifiableItemStackHandler; import gregtech.api.metatileentity.MetaTileEntity; @@ -8,7 +7,6 @@ import gregtech.api.metatileentity.multiblock.AbilityInstances; import gregtech.api.metatileentity.multiblock.IMultiblockAbilityPart; import gregtech.api.metatileentity.multiblock.MultiblockAbility; -import gregtech.api.metatileentity.multiblock.MultiblockControllerBase; import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.sync.appeng.AEItemSyncHandler; import gregtech.api.mui.sync.appeng.AESyncHandler; @@ -27,7 +25,6 @@ import net.minecraft.util.ResourceLocation; import net.minecraft.world.World; import net.minecraftforge.common.util.Constants; -import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandlerModifiable; import appeng.api.storage.channels.IItemStorageChannel; @@ -48,7 +45,6 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Range; -import java.util.Arrays; import java.util.List; public class MetaTileEntityMEInputBus extends MetaTileEntityMEInputBase @@ -69,11 +65,14 @@ public MetaTileEntity createMetaTileEntity(IGregTechTileEntity iGregTechTileEnti @Override protected void initializeInventory() { - super.initializeInventory(); this.extraSlotInventory = new NotifiableItemStackHandler(this, 1, this, false); this.extraSlotInventory.addNotifiableMetaTileEntity(this); - this.importItems = new ItemHandlerList( - Arrays.asList(getAEHandler(), this.circuitInventory, this.extraSlotInventory)); + super.initializeInventory(); + } + + @Override + protected IItemHandlerModifiable createImportItemHandler() { + return new ItemHandlerList(getAEHandler(), circuitInventory, extraSlotInventory); } @Override @@ -94,27 +93,6 @@ public void clearMachineInventory(@NotNull List<@NotNull ItemStack> itemBuffer) } } - @Override - public void addToMultiBlock(MultiblockControllerBase controllerBase) { - super.addToMultiBlock(controllerBase); - for (IItemHandler handler : ((ItemHandlerList) this.importItems).getBackingHandlers()) { - if (handler instanceof INotifiableHandler notifiable) { - notifiable.addNotifiableMetaTileEntity(controllerBase); - notifiable.addToNotifiedList(this, handler, false); - } - } - } - - @Override - public void removeFromMultiBlock(MultiblockControllerBase controllerBase) { - super.removeFromMultiBlock(controllerBase); - for (IItemHandler handler : ((ItemHandlerList) this.importItems).getBackingHandlers()) { - if (handler instanceof INotifiableHandler notifiable) { - notifiable.removeNotifiableMetaTileEntity(controllerBase); - } - } - } - @Override protected @NotNull AESyncHandler createAESyncHandler() { return new AEItemSyncHandler(getAEHandler(), this::markDirty, circuitInventory::setCircuitValue); diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java index 4ca20a4dd14..27e72cdf6b0 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java @@ -59,9 +59,8 @@ public MetaTileEntity createMetaTileEntity(IGregTechTileEntity iGregTechTileEnti } @Override - protected void initializeInventory() { - super.initializeInventory(); - this.importFluids = new FluidTankList(false, getAEHandler().getInventory()); + protected FluidTankList createImportFluidHandler() { + return new FluidTankList(false, getAEHandler().getInventory()); } @Override diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBase.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBase.java index 431ef7df9f8..57f37c23ed2 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBase.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEOutputBase.java @@ -68,7 +68,7 @@ protected void initializeInventory() { @Override public void update() { super.update(); - if (!getWorld().isRemote && workingEnabled && isOnline && (getOffsetTimer() % refreshRate == 0)) { + if (!getWorld().isRemote && workingEnabled && isOnline && (getOffsetTimer() % getRefreshRate() == 0)) { if (this.internalBuffer.isEmpty()) return; IMEMonitor monitor = getMonitor(); @@ -250,7 +250,7 @@ public void detectAndSendChanges(boolean init) { AEStackType newStack = internalBuffer.get(index); AEStackType cachedStack = cache.get(index); - if (init || !newStack.equals(cachedStack)) { + if (init || !newStack.equals(cachedStack) || newStack.getStackSize() != cachedStack.getStackSize()) { AEStackType copy = newStack.copy(); changedIndexes.add(index); cache.set(index, copy);