From 5309d4732fc9a5987fbfb6816fdb75eaf20e30a9 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 26 Dec 2024 23:51:35 -0700 Subject: [PATCH] add filtering to base handler classes rename and rework IFilteredHandler for item handlers as well deprecate some classes --- ...idContainer.java => IFilteredHandler.java} | 14 +++++-- .../api/capability/MultipleTankHandler.java | 4 +- .../capability/impl/CommonFluidFilters.java | 36 +++++++++------- .../capability/impl/FilteredFluidHandler.java | 5 ++- .../capability/impl/FilteredItemHandler.java | 22 ++++++---- .../impl/GTFluidHandlerItemStack.java | 4 +- .../impl/GTSimpleFluidHandlerItemStack.java | 5 ++- .../impl/NotifiableFilteredFluidHandler.java | 34 ++------------- .../capability/impl/NotifiableFluidTank.java | 32 +++++++++++++- .../impl/NotifiableItemStackHandler.java | 5 +-- .../capability/impl/SingleFluidFilter.java | 2 +- .../itemhandlers/GTItemStackHandler.java | 31 +++++++++++++- .../gregtech/api/items/metaitem/MetaItem.java | 4 +- .../MetaTileEntityFluidHatch.java | 42 ++++++++----------- .../storage/MetaTileEntityQuantumTank.java | 4 +- 15 files changed, 142 insertions(+), 102 deletions(-) rename src/main/java/gregtech/api/capability/{IFilteredFluidContainer.java => IFilteredHandler.java} (58%) diff --git a/src/main/java/gregtech/api/capability/IFilteredFluidContainer.java b/src/main/java/gregtech/api/capability/IFilteredHandler.java similarity index 58% rename from src/main/java/gregtech/api/capability/IFilteredFluidContainer.java rename to src/main/java/gregtech/api/capability/IFilteredHandler.java index c1920fda635..b0787c18fe6 100644 --- a/src/main/java/gregtech/api/capability/IFilteredFluidContainer.java +++ b/src/main/java/gregtech/api/capability/IFilteredHandler.java @@ -1,5 +1,6 @@ package gregtech.api.capability; +import net.minecraft.item.ItemStack; import net.minecraftforge.fluids.FluidStack; import org.jetbrains.annotations.Nullable; @@ -10,18 +11,23 @@ * Interface for fluid containers ({@link net.minecraftforge.fluids.IFluidTank IFluidTank} or * {@link net.minecraftforge.fluids.capability.IFluidHandler IFluidHandler}) associated with {@link IFilter}. */ -public interface IFilteredFluidContainer { +public interface IFilteredHandler { /** * Compare logic for filtered instances. */ - Comparator COMPARATOR = Comparator.nullsLast( - Comparator.comparing(IFilteredFluidContainer::getFilter, IFilter.FILTER_COMPARATOR)); + Comparator> COMPARATOR = Comparator.nullsLast( + Comparator.comparing(IFilteredHandler::getFilter, IFilter.FILTER_COMPARATOR)); /** * @return instance of {@link IFilter} associated to this object, or {@code null} if there's no filter * associated. */ @Nullable - IFilter getFilter(); + IFilter getFilter(); + + // for type safe casting + interface FluidHandler extends IFilteredHandler {} + + interface ItemHandler extends IFilteredHandler {} } diff --git a/src/main/java/gregtech/api/capability/MultipleTankHandler.java b/src/main/java/gregtech/api/capability/MultipleTankHandler.java index 6b39b82768c..b6f6e133f06 100644 --- a/src/main/java/gregtech/api/capability/MultipleTankHandler.java +++ b/src/main/java/gregtech/api/capability/MultipleTankHandler.java @@ -102,7 +102,7 @@ public MultipleTankHandler addTanks(IFluidTank... tanks) { * Entry of multi fluid tanks. Retains reference to original {@link MultipleTankHandler} for accessing * information such as {@link MultipleTankHandler#allowSameFluidFill()}. */ - public static class Entry implements IFluidTank, IFilteredFluidContainer, INBTSerializable, + public static class Entry implements IFluidTank, IFilteredHandler, INBTSerializable, IFluidTankProperties { private final IFluidTank tank; @@ -128,7 +128,7 @@ public boolean allowSameFluidFill() { @Nullable @Override public IFilter getFilter() { - return getDelegate() instanceof IFilteredFluidContainer filtered ? filtered.getFilter() : null; + return getDelegate() instanceof IFilteredHandler.FluidHandler filter ? filter.getFilter() : null; } @Nullable diff --git a/src/main/java/gregtech/api/capability/impl/CommonFluidFilters.java b/src/main/java/gregtech/api/capability/impl/CommonFluidFilters.java index bca26ca9f25..38f907084d3 100644 --- a/src/main/java/gregtech/api/capability/impl/CommonFluidFilters.java +++ b/src/main/java/gregtech/api/capability/impl/CommonFluidFilters.java @@ -11,12 +11,14 @@ import org.jetbrains.annotations.NotNull; +import static gregtech.api.capability.IFilter.*; + /** * Common fluid filter implementations. */ -public enum CommonFluidFilters implements IFilter { +public class CommonFluidFilters { - ALLOW_ALL { + public static final IFilter ALLOW_ALL = new IFilter<>() { @Override public boolean test(@NotNull FluidStack fluid) { @@ -29,11 +31,12 @@ public int getPriority() { } @Override - public IFilter negate() { + public @NotNull IFilter negate() { return DISALLOW_ALL; } - }, - DISALLOW_ALL { + }; + + public static final IFilter DISALLOW_ALL = new IFilter<>() { @Override public boolean test(@NotNull FluidStack fluid) { @@ -46,11 +49,12 @@ public int getPriority() { } @Override - public IFilter negate() { + public @NotNull IFilter negate() { return ALLOW_ALL; } - }, - BOILER_FLUID { + }; + + public static final IFilter BOILER_FLUID = new IFilter<>() { @Override public boolean test(@NotNull FluidStack fluid) { @@ -69,10 +73,11 @@ public boolean test(@NotNull FluidStack fluid) { @Override public int getPriority() { - return IFilter.whitelistLikePriority(); + return whitelistLikePriority(); } - }, - STEAM { + }; + + public static final IFilter STEAM = new IFilter<>() { @Override public boolean test(@NotNull FluidStack fluid) { @@ -81,10 +86,11 @@ public boolean test(@NotNull FluidStack fluid) { @Override public int getPriority() { - return IFilter.whitelistPriority(1); + return whitelistPriority(1); } - }, - LIGHTER_FUEL { + }; + + public static final IFilter LIGHTER_FUEL = new IFilter<>() { @Override public boolean test(@NotNull FluidStack fluidStack) { @@ -93,7 +99,7 @@ public boolean test(@NotNull FluidStack fluidStack) { @Override public int getPriority() { - return IFilter.whitelistPriority(2); + return whitelistPriority(2); } }; diff --git a/src/main/java/gregtech/api/capability/impl/FilteredFluidHandler.java b/src/main/java/gregtech/api/capability/impl/FilteredFluidHandler.java index 7d6e2f6d811..62e6800e96f 100644 --- a/src/main/java/gregtech/api/capability/impl/FilteredFluidHandler.java +++ b/src/main/java/gregtech/api/capability/impl/FilteredFluidHandler.java @@ -1,7 +1,7 @@ package gregtech.api.capability.impl; import gregtech.api.capability.IFilter; -import gregtech.api.capability.IFilteredFluidContainer; +import gregtech.api.capability.IFilteredHandler; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidStack; @@ -10,7 +10,8 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -public class FilteredFluidHandler extends FluidTank implements IFilteredFluidContainer { +@Deprecated +public class FilteredFluidHandler extends FluidTank implements IFilteredHandler.FluidHandler { @Nullable private IFilter filter; diff --git a/src/main/java/gregtech/api/capability/impl/FilteredItemHandler.java b/src/main/java/gregtech/api/capability/impl/FilteredItemHandler.java index 63e3131365e..0e5da9afca8 100644 --- a/src/main/java/gregtech/api/capability/impl/FilteredItemHandler.java +++ b/src/main/java/gregtech/api/capability/impl/FilteredItemHandler.java @@ -1,5 +1,6 @@ package gregtech.api.capability.impl; +import gregtech.api.capability.IFilter; import gregtech.api.items.itemhandlers.GTItemStackHandler; import gregtech.api.metatileentity.MetaTileEntity; @@ -11,14 +12,13 @@ import java.util.function.Predicate; +@Deprecated public class FilteredItemHandler extends GTItemStackHandler { public static Predicate getCapabilityFilter(Capability cap) { return stack -> stack.hasCapability(cap, null); } - private Predicate fillPredicate; - public FilteredItemHandler(MetaTileEntity metaTileEntity) { super(metaTileEntity, 1); } @@ -32,12 +32,18 @@ public FilteredItemHandler(MetaTileEntity metaTileEntity, NonNullList } public FilteredItemHandler setFillPredicate(Predicate fillPredicate) { - this.fillPredicate = fillPredicate; + setFilter(new IFilter<>() { + + @Override + public boolean test(@NotNull ItemStack stack) { + return fillPredicate.test(stack); + } + + @Override + public int getPriority() { + return IFilter.noPriority(); + } + }); return this; } - - @Override - public boolean isItemValid(int slot, @NotNull ItemStack stack) { - return fillPredicate == null || fillPredicate.test(stack); - } } diff --git a/src/main/java/gregtech/api/capability/impl/GTFluidHandlerItemStack.java b/src/main/java/gregtech/api/capability/impl/GTFluidHandlerItemStack.java index 8e1d72cda81..d0f79c3425a 100644 --- a/src/main/java/gregtech/api/capability/impl/GTFluidHandlerItemStack.java +++ b/src/main/java/gregtech/api/capability/impl/GTFluidHandlerItemStack.java @@ -1,7 +1,7 @@ package gregtech.api.capability.impl; import gregtech.api.capability.IFilter; -import gregtech.api.capability.IFilteredFluidContainer; +import gregtech.api.capability.IFilteredHandler; import net.minecraft.item.ItemStack; import net.minecraftforge.fluids.FluidStack; @@ -11,7 +11,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -public class GTFluidHandlerItemStack extends FluidHandlerItemStack implements IFilteredFluidContainer { +public class GTFluidHandlerItemStack extends FluidHandlerItemStack implements IFilteredHandler.FluidHandler { @Nullable private IFilter filter; diff --git a/src/main/java/gregtech/api/capability/impl/GTSimpleFluidHandlerItemStack.java b/src/main/java/gregtech/api/capability/impl/GTSimpleFluidHandlerItemStack.java index 8e1116ceb5b..98c0be49d7b 100644 --- a/src/main/java/gregtech/api/capability/impl/GTSimpleFluidHandlerItemStack.java +++ b/src/main/java/gregtech/api/capability/impl/GTSimpleFluidHandlerItemStack.java @@ -1,7 +1,7 @@ package gregtech.api.capability.impl; import gregtech.api.capability.IFilter; -import gregtech.api.capability.IFilteredFluidContainer; +import gregtech.api.capability.IFilteredHandler; import net.minecraft.item.ItemStack; import net.minecraftforge.fluids.FluidStack; @@ -11,7 +11,8 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -public class GTSimpleFluidHandlerItemStack extends FluidHandlerItemStackSimple implements IFilteredFluidContainer { +public class GTSimpleFluidHandlerItemStack extends FluidHandlerItemStackSimple + implements IFilteredHandler.FluidHandler { @Nullable private IFilter filter; diff --git a/src/main/java/gregtech/api/capability/impl/NotifiableFilteredFluidHandler.java b/src/main/java/gregtech/api/capability/impl/NotifiableFilteredFluidHandler.java index fe44ad8db4a..78b69fbee7f 100644 --- a/src/main/java/gregtech/api/capability/impl/NotifiableFilteredFluidHandler.java +++ b/src/main/java/gregtech/api/capability/impl/NotifiableFilteredFluidHandler.java @@ -1,39 +1,11 @@ package gregtech.api.capability.impl; -import gregtech.api.capability.INotifiableHandler; import gregtech.api.metatileentity.MetaTileEntity; -import java.util.ArrayList; -import java.util.List; - -public class NotifiableFilteredFluidHandler extends FilteredFluidHandler implements INotifiableHandler { - - List notifiableEntities = new ArrayList<>(); - private final boolean isExport; +@Deprecated +public class NotifiableFilteredFluidHandler extends NotifiableFluidTank { public NotifiableFilteredFluidHandler(int capacity, MetaTileEntity entityToNotify, boolean isExport) { - super(capacity); - this.notifiableEntities.add(entityToNotify); - this.isExport = isExport; - } - - @Override - protected void onContentsChanged() { - super.onContentsChanged(); - for (MetaTileEntity metaTileEntity : notifiableEntities) { - if (metaTileEntity != null && metaTileEntity.isValid()) { - addToNotifiedList(metaTileEntity, this, isExport); - } - } - } - - @Override - public void addNotifiableMetaTileEntity(MetaTileEntity metaTileEntity) { - this.notifiableEntities.add(metaTileEntity); - } - - @Override - public void removeNotifiableMetaTileEntity(MetaTileEntity metaTileEntity) { - this.notifiableEntities.remove(metaTileEntity); + super(capacity, entityToNotify, isExport); } } diff --git a/src/main/java/gregtech/api/capability/impl/NotifiableFluidTank.java b/src/main/java/gregtech/api/capability/impl/NotifiableFluidTank.java index 2669fa35097..c941f54fcfa 100644 --- a/src/main/java/gregtech/api/capability/impl/NotifiableFluidTank.java +++ b/src/main/java/gregtech/api/capability/impl/NotifiableFluidTank.java @@ -1,17 +1,24 @@ package gregtech.api.capability.impl; +import gregtech.api.capability.IFilter; +import gregtech.api.capability.IFilteredHandler; import gregtech.api.capability.INotifiableHandler; import gregtech.api.metatileentity.MetaTileEntity; +import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidTank; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + import java.util.ArrayList; import java.util.List; -public class NotifiableFluidTank extends FluidTank implements INotifiableHandler { +public class NotifiableFluidTank extends FluidTank implements INotifiableHandler, IFilteredHandler.FluidHandler { List notifiableEntities = new ArrayList<>(); private final boolean isExport; + private IFilter filter; public NotifiableFluidTank(int capacity, MetaTileEntity entityToNotify, boolean isExport) { super(capacity); @@ -38,4 +45,27 @@ public void addNotifiableMetaTileEntity(MetaTileEntity metaTileEntity) { public void removeNotifiableMetaTileEntity(MetaTileEntity metaTileEntity) { this.notifiableEntities.remove(metaTileEntity); } + + @Nullable + @Override + public IFilter getFilter() { + return this.filter; + } + + /** + * Set filter instance. If {@code null} is given, then the filter is set to be + * + * @param filter new filter instance + * @return this + */ + @NotNull + public NotifiableFluidTank setFilter(@Nullable IFilter filter) { + this.filter = filter; + return this; + } + + @Override + public boolean canFillFluidType(FluidStack fluid) { + return canFill() && (this.filter == null || this.filter.test(fluid)); + } } diff --git a/src/main/java/gregtech/api/capability/impl/NotifiableItemStackHandler.java b/src/main/java/gregtech/api/capability/impl/NotifiableItemStackHandler.java index 472c29e033f..ec6a44ba6a6 100644 --- a/src/main/java/gregtech/api/capability/impl/NotifiableItemStackHandler.java +++ b/src/main/java/gregtech/api/capability/impl/NotifiableItemStackHandler.java @@ -4,13 +4,10 @@ import gregtech.api.items.itemhandlers.GTItemStackHandler; import gregtech.api.metatileentity.MetaTileEntity; -import net.minecraftforge.items.IItemHandlerModifiable; - import java.util.ArrayList; import java.util.List; -public class NotifiableItemStackHandler extends GTItemStackHandler - implements IItemHandlerModifiable, INotifiableHandler { +public class NotifiableItemStackHandler extends GTItemStackHandler implements INotifiableHandler { List notifiableEntities = new ArrayList<>(); private final boolean isExport; diff --git a/src/main/java/gregtech/api/capability/impl/SingleFluidFilter.java b/src/main/java/gregtech/api/capability/impl/SingleFluidFilter.java index 51c1d8eb682..1f164f9353c 100644 --- a/src/main/java/gregtech/api/capability/impl/SingleFluidFilter.java +++ b/src/main/java/gregtech/api/capability/impl/SingleFluidFilter.java @@ -43,7 +43,7 @@ public int getPriority() { } @Override - public IFilter negate() { + public @NotNull IFilter negate() { return new SingleFluidFilter(this.fluid, !this.blacklist); } diff --git a/src/main/java/gregtech/api/items/itemhandlers/GTItemStackHandler.java b/src/main/java/gregtech/api/items/itemhandlers/GTItemStackHandler.java index eab9612c747..d33126a32bb 100644 --- a/src/main/java/gregtech/api/items/itemhandlers/GTItemStackHandler.java +++ b/src/main/java/gregtech/api/items/itemhandlers/GTItemStackHandler.java @@ -1,14 +1,20 @@ package gregtech.api.items.itemhandlers; +import gregtech.api.capability.IFilter; +import gregtech.api.capability.IFilteredHandler; import gregtech.api.metatileentity.MetaTileEntity; import net.minecraft.item.ItemStack; import net.minecraft.util.NonNullList; import net.minecraftforge.items.ItemStackHandler; -public class GTItemStackHandler extends ItemStackHandler { +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; - final private MetaTileEntity metaTileEntity; +public class GTItemStackHandler extends ItemStackHandler implements IFilteredHandler.ItemHandler { + + private final MetaTileEntity metaTileEntity; + private IFilter filter; public GTItemStackHandler(MetaTileEntity metaTileEntity) { super(); @@ -30,4 +36,25 @@ public void onContentsChanged(int slot) { super.onContentsChanged(slot); metaTileEntity.markDirty(); } + + @Override + public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) { + if (!isItemValid(slot, stack)) return stack; + return super.insertItem(slot, stack, simulate); + } + + @Override + public boolean isItemValid(int slot, @NotNull ItemStack stack) { + return filter == null || filter.test(stack); + } + + public GTItemStackHandler setFilter(IFilter filter) { + this.filter = filter; + return this; + } + + @Override + public @Nullable IFilter getFilter() { + return null; + } } diff --git a/src/main/java/gregtech/api/items/metaitem/MetaItem.java b/src/main/java/gregtech/api/items/metaitem/MetaItem.java index a17559b05b2..7bc7bf58f2d 100644 --- a/src/main/java/gregtech/api/items/metaitem/MetaItem.java +++ b/src/main/java/gregtech/api/items/metaitem/MetaItem.java @@ -3,7 +3,7 @@ import gregtech.api.GTValues; import gregtech.api.capability.GregtechCapabilities; import gregtech.api.capability.IElectricItem; -import gregtech.api.capability.IFilteredFluidContainer; +import gregtech.api.capability.IFilteredHandler; import gregtech.api.capability.IPropertyFluidFilter; import gregtech.api.capability.impl.CombinedCapabilityProvider; import gregtech.api.capability.impl.ElectricItem; @@ -639,7 +639,7 @@ public void addInformation(@NotNull ItemStack itemStack, @Nullable World worldIn fluidTankProperties.getCapacity(), fluid == null ? "" : fluid.getLocalizedName())); - if (fluidHandler instanceof IFilteredFluidContainer filtered && + if (fluidHandler instanceof IFilteredHandler.FluidHandler filtered && filtered.getFilter() instanceof IPropertyFluidFilter propertyFilter) { propertyFilter.appendTooltips(lines, false, 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 8cf7c4f2e6a..2b5e876cf50 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java @@ -339,10 +339,27 @@ private void setLocked(boolean locked) { fluidTank.onContentsChanged(); } - protected class HatchFluidTank extends NotifiableFluidTank implements IFilteredFluidContainer, IFilter { + // todo remove + @Deprecated + protected class HatchFluidTank extends NotifiableFluidTank { public HatchFluidTank(int capacity, MetaTileEntity entityToNotify, boolean isExport) { super(capacity, entityToNotify, isExport); + setFilter(new IFilter<>() { + + @Override + public boolean test(@NotNull FluidStack fluidStack) { + if (!isExportHatch) return true; + return !locked || lockedFluid == null || fluidStack.isFluidEqual(lockedFluid); + } + + @Override + public int getPriority() { + if (!isExportHatch) return IFilter.noPriority(); + return !locked || lockedFluid == null ? IFilter.noPriority() : + IFilter.whitelistPriority(1); + } + }); } @Override @@ -356,33 +373,10 @@ public int fillInternal(FluidStack resource, boolean doFill) { return accepted; } - @Override - public boolean canFillFluidType(FluidStack fluid) { - return test(fluid); - } - // override for visibility @Override public void onContentsChanged() { super.onContentsChanged(); } - - @Nullable - @Override - public IFilter getFilter() { - return this; - } - - @Override - public boolean test(@NotNull FluidStack fluidStack) { - if (!isExportHatch) return true; - return !locked || lockedFluid == null || fluidStack.isFluidEqual(lockedFluid); - } - - @Override - public int getPriority() { - if (!isExportHatch) return IFilter.noPriority(); - return !locked || lockedFluid == null ? IFilter.noPriority() : IFilter.whitelistPriority(1); - } } } diff --git a/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityQuantumTank.java b/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityQuantumTank.java index 0d675b9b1c9..66fc832792f 100644 --- a/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityQuantumTank.java +++ b/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityQuantumTank.java @@ -3,7 +3,7 @@ import gregtech.api.capability.GregtechTileCapabilities; import gregtech.api.capability.IActiveOutputSide; import gregtech.api.capability.IFilter; -import gregtech.api.capability.IFilteredFluidContainer; +import gregtech.api.capability.IFilteredHandler; import gregtech.api.capability.impl.FilteredItemHandler; import gregtech.api.capability.impl.FluidHandlerProxy; import gregtech.api.capability.impl.FluidTankList; @@ -676,7 +676,7 @@ public int getLightOpacity() { return 0; } - private class QuantumFluidTank extends FluidTank implements IFilteredFluidContainer, IFilter { + private class QuantumFluidTank extends FluidTank implements IFilteredHandler.FluidHandler, IFilter { public QuantumFluidTank(int capacity) { super(capacity);