From 0a6de05bd45621922245f044483ffc78722c1d6b Mon Sep 17 00:00:00 2001 From: Glease <4586901+Glease@users.noreply.github.com> Date: Sun, 8 Jan 2023 19:44:52 +0800 Subject: allow filtering what is accepted in a fluid slot (#1641) --- .../gui/modularui/widget/FluidDisplaySlotWidget.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'src/main/java/gregtech/common/gui/modularui/widget/FluidDisplaySlotWidget.java') diff --git a/src/main/java/gregtech/common/gui/modularui/widget/FluidDisplaySlotWidget.java b/src/main/java/gregtech/common/gui/modularui/widget/FluidDisplaySlotWidget.java index 99200e5e8d..427947d39c 100644 --- a/src/main/java/gregtech/common/gui/modularui/widget/FluidDisplaySlotWidget.java +++ b/src/main/java/gregtech/common/gui/modularui/widget/FluidDisplaySlotWidget.java @@ -12,6 +12,7 @@ import java.io.IOException; import java.util.Collections; import java.util.List; import java.util.function.BiFunction; +import java.util.function.Predicate; import java.util.function.Supplier; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; @@ -27,6 +28,7 @@ public class FluidDisplaySlotWidget extends SlotWidget { private Supplier fluidAccessConstructor; private Supplier canDrainGetter; private Supplier canFillGetter; + private Predicate canFillFilter; private Action actionRealClick = Action.NONE; private Action actionDragAndDrop = Action.NONE; private BiFunction beforeRealClick; @@ -176,6 +178,8 @@ public class FluidDisplaySlotWidget extends SlotWidget { if (tFluidHeld == null) // no fluid to fill return null; + // apply filter here + if (!canFillFilter.test(tFluidHeld.getFluid())) return null; return fillFluid(aFluidAccess, aPlayer, tFluidHeld, aProcessFullStack); } // tank not empty, both action possible @@ -183,6 +187,8 @@ public class FluidDisplaySlotWidget extends SlotWidget { // both nonnull and have space left for filling. if (aCanFill) // actually both pickup and fill is reasonable, but I'll go with fill here + // there is already fluid in here. so we assume the slot will not accept this fluid anyway if it doesn't + // pass the filter. return fillFluid(aFluidAccess, aPlayer, tFluidHeld, aProcessFullStack); if (!aCanDrain) // cannot take AND cannot fill, why make this call then? @@ -395,6 +401,15 @@ public class FluidDisplaySlotWidget extends SlotWidget { return this; } + /** + * Add a predicate on whether a client stack will be accepted. Note this will only be called when this slot is already + * empty. It is assumed whatever is already in the slot will pass the filter. + */ + public FluidDisplaySlotWidget setEmptyCanFillFilter(Predicate canFillFilter) { + this.canFillFilter = canFillFilter; + return this; + } + /** * Sets action called on drag-and-drop from NEI. * You can't use {@link Action#TRANSFER} here. -- cgit