From 2d732479e672901dbc8c423dad97c7068c639fcc Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Fri, 11 Oct 2024 00:33:43 -0600 Subject: [PATCH] Add in-line filtering for item and fluid pipes (#2126) --- .../gtceu/common/cover/FluidFilterCover.java | 41 +++++++++++++++++++ .../gtceu/common/cover/ItemFilterCover.java | 40 ++++++++++++++++++ 2 files changed, 81 insertions(+) diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/FluidFilterCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/FluidFilterCover.java index 19232c0cf6..a4094f0155 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/FluidFilterCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/FluidFilterCover.java @@ -5,15 +5,21 @@ import com.gregtechceu.gtceu.api.cover.CoverDefinition; import com.gregtechceu.gtceu.api.cover.IUICover; import com.gregtechceu.gtceu.api.cover.filter.FluidFilter; +import com.gregtechceu.gtceu.api.transfer.fluid.FluidTransferDelegate; import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; import com.lowdragmc.lowdraglib.gui.widget.Widget; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; import com.lowdragmc.lowdraglib.side.fluid.FluidTransferHelper; +import com.lowdragmc.lowdraglib.side.fluid.IFluidHandlerModifiable; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; +import net.neoforged.neoforge.fluids.FluidStack; +import net.neoforged.neoforge.fluids.capability.IFluidHandler; +import org.jetbrains.annotations.Nullable; + import javax.annotation.ParametersAreNonnullByDefault; /** @@ -26,6 +32,7 @@ public class FluidFilterCover extends CoverBehavior implements IUICover { protected FluidFilter fluidFilter; + private FilteredFluidTransferWrapper fluidFilterWrapper; public FluidFilterCover(CoverDefinition definition, ICoverable coverHolder, Direction attachedSide) { super(definition, coverHolder, attachedSide); @@ -43,6 +50,19 @@ public FluidFilter getFluidFilter() { return fluidFilter; } + @Override + public @Nullable IFluidHandlerModifiable getFluidTransferCap(@Nullable IFluidHandlerModifiable defaultValue) { + if (defaultValue == null) { + return null; + } + + if (fluidFilterWrapper == null || fluidFilterWrapper.delegate != defaultValue) { + this.fluidFilterWrapper = new FilteredFluidTransferWrapper(defaultValue); + } + + return fluidFilterWrapper; + } + @Override public Widget createUIWidget() { final var group = new WidgetGroup(0, 0, 176, 80); @@ -50,4 +70,25 @@ public Widget createUIWidget() { group.addWidget(getFluidFilter().openConfigurator((176 - 80) / 2, (60 - 55) / 2 + 15)); return group; } + + private class FilteredFluidTransferWrapper extends FluidTransferDelegate { + + public FilteredFluidTransferWrapper(IFluidHandlerModifiable delegate) { + super(delegate); + } + + @Override + public int fill(FluidStack resource, FluidAction action) { + if (!fluidFilter.test(resource)) + return 0; + return super.fill(resource, action); + } + + @Override + public FluidStack drain(FluidStack resource, FluidAction action) { + if (!fluidFilter.test(resource)) + return FluidStack.EMPTY; + return super.drain(resource, action); + } + } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/ItemFilterCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/ItemFilterCover.java index 4dfd227b83..973c279be8 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/ItemFilterCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ItemFilterCover.java @@ -6,6 +6,7 @@ import com.gregtechceu.gtceu.api.cover.IUICover; import com.gregtechceu.gtceu.api.cover.filter.ItemFilter; import com.gregtechceu.gtceu.api.gui.widget.EnumSelectorWidget; +import com.gregtechceu.gtceu.api.transfer.item.ItemTransferDelegate; import com.gregtechceu.gtceu.common.cover.data.ItemFilterMode; import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; @@ -18,8 +19,12 @@ import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; +import net.minecraft.world.item.ItemStack; import lombok.Getter; +import net.neoforged.neoforge.items.IItemHandlerModifiable; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import javax.annotation.ParametersAreNonnullByDefault; @@ -40,6 +45,7 @@ public class ItemFilterCover extends CoverBehavior implements IUICover { @DescSynced @Getter protected ItemFilterMode filterMode = ItemFilterMode.FILTER_INSERT; + private FilteredItemTransferWrapper itemFilterWrapper; public ItemFilterCover(CoverDefinition definition, ICoverable coverHolder, Direction attachedSide) { super(definition, coverHolder, attachedSide); @@ -62,6 +68,17 @@ public boolean canAttach() { return ItemTransferHelper.getItemTransfer(coverHolder.getLevel(), coverHolder.getPos(), attachedSide) != null; } + @Override + public @Nullable IItemHandlerModifiable getItemTransferCap(IItemHandlerModifiable defaultValue) { + if (defaultValue == null) { + return null; + } + if (itemFilterWrapper == null || itemFilterWrapper.delegate != defaultValue) { + this.itemFilterWrapper = new ItemFilterCover.FilteredItemTransferWrapper(defaultValue); + } + return itemFilterWrapper; + } + @Override public Widget createUIWidget() { final var group = new WidgetGroup(0, 0, 176, 85); @@ -76,4 +93,27 @@ public Widget createUIWidget() { public ManagedFieldHolder getFieldHolder() { return MANAGED_FIELD_HOLDER; } + + private class FilteredItemTransferWrapper extends ItemTransferDelegate { + + public FilteredItemTransferWrapper(IItemHandlerModifiable delegate) { + super(delegate); + } + + @Override + public @NotNull ItemStack insertItem(int slot, @NotNull ItemStack stack, boolean simulate) { + if (filterMode != ItemFilterMode.FILTER_EXTRACT && !itemFilter.test(stack)) + return stack; + return super.insertItem(slot, stack, simulate); + } + + @Override + public @NotNull ItemStack extractItem(int slot, int amount, boolean simulate) { + ItemStack result = super.extractItem(slot, amount, true); + if (result.isEmpty() || (filterMode != ItemFilterMode.FILTER_INSERT && !itemFilter.test(result))) { + return ItemStack.EMPTY; + } + return simulate ? result : super.extractItem(slot, amount, false); + } + } }