From a66322e212f9217ae3087baa4228f0f20adc74ec Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Sun, 7 Sep 2025 13:11:28 -0400 Subject: [PATCH 1/4] Fix an empty tooltip on phantom GT fluid slots if it had a fluid and then was cleared --- .../api/mui/sync/GTFluidSyncHandler.java | 49 ++++++++++++++++--- .../java/gregtech/api/util/GTUtility.java | 6 +++ .../MetaTileEntityFluidHatch.java | 2 +- .../common/mui/widget/GTFluidSlot.java | 8 ++- 4 files changed, 51 insertions(+), 14 deletions(-) diff --git a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java index 54808e28719..2328983ffad 100644 --- a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java @@ -41,6 +41,7 @@ public class GTFluidSyncHandler extends SyncHandler { private final IFluidTank tank; private Consumer jeiHandler; private BooleanConsumer lockHandler; + private BooleanSupplier isLocked; private Supplier lockedFluid; private FluidStack lastFluid; private FluidStack phantomFluid; @@ -50,6 +51,8 @@ public class GTFluidSyncHandler extends SyncHandler { private BooleanSupplier showAmountInTooltip = () -> true; private BooleanSupplier showAmountOnSlot = () -> true; private BooleanSupplier drawAlwaysFull = () -> true; + @Nullable + private Consumer<@Nullable FluidStack> changeConsumer; public GTFluidSyncHandler(IFluidTank tank) { this.tank = tank; @@ -57,8 +60,8 @@ public GTFluidSyncHandler(IFluidTank tank) { @Override public void detectAndSendChanges(boolean init) { - var current = getFluid(); - if (init || current == null || lastFluid == null || current.isFluidEqual(lastFluid)) { + FluidStack current = getFluid(); + if (init || !GTUtility.areFluidsEqual(current, lastFluid)) { lastFluid = current == null ? null : current.copy(); syncToClient(UPDATE_TANK, buffer -> NetworkUtils.writeFluidStack(buffer, current)); } else if (lastFluid != null && current.amount != lastFluid.amount) { @@ -84,11 +87,13 @@ public void lockFluid(boolean locked, boolean sync) { }); } - public GTFluidSyncHandler handleLocking(Supplier lockedFluid, Consumer jeiHandler, - BooleanConsumer lockHandler) { + public GTFluidSyncHandler handleLocking(@NotNull Supplier lockedFluid, + @NotNull Consumer jeiHandler, + @NotNull BooleanConsumer lockHandler, @NotNull BooleanSupplier isLocked) { this.lockedFluid = lockedFluid; this.jeiHandler = jeiHandler; this.lockHandler = lockHandler; + this.isLocked = isLocked; return this; } @@ -194,6 +199,16 @@ public boolean drawAlwaysFull() { return this.drawAlwaysFull.getAsBoolean(); } + public void setChangeConsumer(@Nullable Consumer<@Nullable FluidStack> changeConsumer) { + this.changeConsumer = changeConsumer; + } + + protected void onChange(@Nullable FluidStack fluidStack) { + if (changeConsumer != null) { + changeConsumer.accept(fluidStack); + } + } + public @NotNull String getFormattedFluidAmount() { var tankFluid = this.tank.getFluid(); return String.format("%,d", tankFluid == null ? 0 : tankFluid.amount); @@ -220,7 +235,14 @@ public int getFluidAmount() { return tankFluid == null ? IKey.EMPTY : KeyUtil.fluid(tankFluid); } + protected boolean shouldShowTooltip() { + if (getFluid() != null) return true; + return canLockFluid() && isLocked.getAsBoolean(); + } + public void handleTooltip(@NotNull RichTooltip tooltip) { + if (!shouldShowTooltip()) return; + tooltip.addLine(getFluidNameKey()); if (showAmountInTooltip()) { @@ -249,9 +271,20 @@ public void handleTooltip(@NotNull RichTooltip tooltip) { public void readOnClient(int id, PacketBuffer buf) { switch (id) { case TRY_CLICK_CONTAINER -> replaceCursorItemStack(NetworkUtils.readItemStack(buf)); - case UPDATE_TANK -> setFluid(NetworkUtils.readFluidStack(buf)); - case UPDATE_AMOUNT -> setAmount(buf.readInt()); - case LOCK_FLUID -> lockFluid(NetworkUtils.readFluidStack(buf), false); + case UPDATE_TANK -> { + FluidStack stack = NetworkUtils.readFluidStack(buf); + setFluid(stack); + onChange(stack); + } + case UPDATE_AMOUNT -> { + setAmount(buf.readInt()); + onChange(getFluid()); + } + case LOCK_FLUID -> { + lockFluid(NetworkUtils.readFluidStack(buf), false); + FluidStack stack = getFluid(); + onChange(stack == null ? getLockedFluid() : stack); + } } } @@ -545,7 +578,7 @@ public FluidStack getLockedFluid() { } public boolean canLockFluid() { - return jeiHandler != null && lockHandler != null && lockedFluid != null; + return jeiHandler != null && lockHandler != null && lockedFluid != null && isLocked != null; } public void toggleLockFluid() { diff --git a/src/main/java/gregtech/api/util/GTUtility.java b/src/main/java/gregtech/api/util/GTUtility.java index a4f44bb2bce..fea0a6268e4 100644 --- a/src/main/java/gregtech/api/util/GTUtility.java +++ b/src/main/java/gregtech/api/util/GTUtility.java @@ -1023,4 +1023,10 @@ public static int combineRGB(@Range(from = 0, to = 255) int r, @Range(from = 0, } return map.get(key.toWildcard()); } + + public static boolean areFluidsEqual(@Nullable FluidStack a, @Nullable FluidStack b) { + if (a == b) return true; + if (a == null) return false; + return a.isFluidEqual(b); + } } 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 2c11138db0c..f9a5876a59c 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java @@ -291,7 +291,7 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) setLocked(fluidStack != null); this.lockedFluid = fluidStack; this.fluidTank.onContentsChanged(); - }, this::setLocked); + }, this::setLocked, this::isLocked); } return GTGuis.createPanel(this, 176, 166) diff --git a/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java b/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java index 79c31bd31cd..0099b74a1d7 100644 --- a/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java +++ b/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java @@ -38,11 +38,7 @@ public final class GTFluidSlot extends Widget implements Interactab private boolean disableBackground = false; public GTFluidSlot() { - tooltip().setAutoUpdate(true).titleMargin(); - tooltipBuilder(tooltip -> { - if (!isSynced()) return; - syncHandler.handleTooltip(tooltip); - }); + tooltip().titleMargin(); } public static GTFluidSyncHandler sync(IFluidTank tank) { @@ -57,6 +53,8 @@ public void onInit() { if (syncHandler.canLockFluid() || syncHandler.isPhantom()) { getContext().getJeiSettings().addJeiGhostIngredientSlot(this); } + tooltipBuilder(syncHandler::handleTooltip); + syncHandler.setChangeConsumer($ -> markTooltipDirty()); } public GTFluidSlot syncHandler(IFluidTank fluidTank) { From 36af047b9042665a1d8012af822e15755f385cb7 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Sun, 7 Sep 2025 13:24:07 -0400 Subject: [PATCH 2/4] Accidentally broke slots that are supposed to have a "0/x" tooltip when empty. --- .../api/mui/sync/GTFluidSyncHandler.java | 20 ++++++++----------- 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java index 2328983ffad..29c285f5383 100644 --- a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java @@ -221,29 +221,25 @@ public int getFluidAmount() { public @Nullable String getFluidLocalizedName() { var tankFluid = this.tank.getFluid(); - if (tankFluid == null && canLockFluid()) - tankFluid = this.lockedFluid.get(); + if (tankFluid == null) + tankFluid = getLockedFluid(); return tankFluid == null ? null : tankFluid.getLocalizedName(); } public @NotNull IKey getFluidNameKey() { FluidStack tankFluid = tank.getFluid(); - if (tankFluid == null && canLockFluid()) { - tankFluid = lockedFluid.get(); + if (tankFluid == null) { + tankFluid = getLockedFluid(); } return tankFluid == null ? IKey.EMPTY : KeyUtil.fluid(tankFluid); } - protected boolean shouldShowTooltip() { - if (getFluid() != null) return true; - return canLockFluid() && isLocked.getAsBoolean(); - } - public void handleTooltip(@NotNull RichTooltip tooltip) { - if (!shouldShowTooltip()) return; - - tooltip.addLine(getFluidNameKey()); + IKey nameKey = getFluidNameKey(); + if (nameKey != IKey.EMPTY) { + tooltip.addLine(nameKey); + } if (showAmountInTooltip()) { tooltip.addLine(IKey.lang("gregtech.fluid.amount", getFluidAmount(), getCapacity())); From 455c87adcefeca8bdbd470ae532a096c7a20c774 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Mon, 15 Sep 2025 11:37:20 -0400 Subject: [PATCH 3/4] Rename util method --- src/main/java/gregtech/api/util/GTUtility.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/gregtech/api/util/GTUtility.java b/src/main/java/gregtech/api/util/GTUtility.java index fea0a6268e4..597f8ef6095 100644 --- a/src/main/java/gregtech/api/util/GTUtility.java +++ b/src/main/java/gregtech/api/util/GTUtility.java @@ -1024,7 +1024,7 @@ public static int combineRGB(@Range(from = 0, to = 255) int r, @Range(from = 0, return map.get(key.toWildcard()); } - public static boolean areFluidsEqual(@Nullable FluidStack a, @Nullable FluidStack b) { + public static boolean areFluidStacksEqual(@Nullable FluidStack a, @Nullable FluidStack b) { if (a == b) return true; if (a == null) return false; return a.isFluidEqual(b); From e22c7db69d6459b7f388a6d1ec69ce615426cde3 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Mon, 15 Sep 2025 11:47:54 -0400 Subject: [PATCH 4/4] I am very smart --- src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java index 29c285f5383..7f81a1c32b9 100644 --- a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java @@ -61,7 +61,7 @@ public GTFluidSyncHandler(IFluidTank tank) { @Override public void detectAndSendChanges(boolean init) { FluidStack current = getFluid(); - if (init || !GTUtility.areFluidsEqual(current, lastFluid)) { + if (init || !GTUtility.areFluidStacksEqual(current, lastFluid)) { lastFluid = current == null ? null : current.copy(); syncToClient(UPDATE_TANK, buffer -> NetworkUtils.writeFluidStack(buffer, current)); } else if (lastFluid != null && current.amount != lastFluid.amount) {