Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 42 additions & 13 deletions src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ public class GTFluidSyncHandler extends SyncHandler {
private final IFluidTank tank;
private Consumer<FluidStack> jeiHandler;
private BooleanConsumer lockHandler;
private BooleanSupplier isLocked;
private Supplier<FluidStack> lockedFluid;
private FluidStack lastFluid;
private FluidStack phantomFluid;
Expand All @@ -50,15 +51,17 @@ 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;
}

@Override
public void detectAndSendChanges(boolean init) {
var current = getFluid();
if (init || current == null || lastFluid == null || current.isFluidEqual(lastFluid)) {
FluidStack current = getFluid();
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) {
Expand All @@ -84,11 +87,13 @@ public void lockFluid(boolean locked, boolean sync) {
});
}

public GTFluidSyncHandler handleLocking(Supplier<FluidStack> lockedFluid, Consumer<FluidStack> jeiHandler,
BooleanConsumer lockHandler) {
public GTFluidSyncHandler handleLocking(@NotNull Supplier<FluidStack> lockedFluid,
@NotNull Consumer<FluidStack> jeiHandler,
@NotNull BooleanConsumer lockHandler, @NotNull BooleanSupplier isLocked) {
this.lockedFluid = lockedFluid;
this.jeiHandler = jeiHandler;
this.lockHandler = lockHandler;
this.isLocked = isLocked;
return this;
}

Expand Down Expand Up @@ -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);
Expand All @@ -206,22 +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);
}

public void handleTooltip(@NotNull RichTooltip tooltip) {
tooltip.addLine(getFluidNameKey());
IKey nameKey = getFluidNameKey();
if (nameKey != IKey.EMPTY) {
tooltip.addLine(nameKey);
}

if (showAmountInTooltip()) {
tooltip.addLine(IKey.lang("gregtech.fluid.amount", getFluidAmount(), getCapacity()));
Expand Down Expand Up @@ -249,9 +267,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);
}
}
}

Expand Down Expand Up @@ -545,7 +574,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() {
Expand Down
6 changes: 6 additions & 0 deletions src/main/java/gregtech/api/util/GTUtility.java
Original file line number Diff line number Diff line change
Expand Up @@ -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 areFluidStacksEqual(@Nullable FluidStack a, @Nullable FluidStack b) {
if (a == b) return true;
if (a == null) return false;
return a.isFluidEqual(b);
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why make this when it is covered by FluidStack#isFluidEqual()?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Because it replaces if (init || current == null || lastFluid == null || current.isFluidEqual(lastFluid)) { so it works when both stacks are null.

}
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
8 changes: 3 additions & 5 deletions src/main/java/gregtech/common/mui/widget/GTFluidSlot.java
Original file line number Diff line number Diff line change
Expand Up @@ -38,11 +38,7 @@ public final class GTFluidSlot extends Widget<GTFluidSlot> 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) {
Expand All @@ -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) {
Expand Down
Loading