From bb574165823beea9d78d23ad87a21034799c3f3e Mon Sep 17 00:00:00 2001 From: Gustavo Date: Thu, 18 Jun 2026 21:41:52 +1000 Subject: [PATCH 01/12] refactor filter ctors --- .../api/cover/filter/SimpleFluidFilter.java | 24 ++++++++---------- .../api/cover/filter/SimpleItemFilter.java | 22 +++++++--------- .../api/cover/filter/SmartItemFilter.java | 17 +++++-------- .../api/cover/filter/TagFluidFilter.java | 25 ++++++------------- .../gtceu/api/cover/filter/TagItemFilter.java | 25 ++++++------------- .../gtceu/common/data/GTItems.java | 10 ++++---- .../common/cover/ItemFilterCoverTest.java | 8 +++++- 7 files changed, 51 insertions(+), 80 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SimpleFluidFilter.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SimpleFluidFilter.java index 527ff4bf2f7..33ec8577f9f 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SimpleFluidFilter.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SimpleFluidFilter.java @@ -42,7 +42,7 @@ public class SimpleFluidFilter implements FluidFilter { @Getter protected FluidStack[] matches = new FluidStack[9]; - protected Consumer itemWriter = filter -> {}; + protected Consumer itemWriter; protected Consumer onUpdated = filter -> itemWriter.accept(filter); @Getter @@ -50,7 +50,10 @@ public class SimpleFluidFilter implements FluidFilter { private final CustomFluidTank[] fluidStorageSlots = new CustomFluidTank[9]; - protected SimpleFluidFilter() { + public SimpleFluidFilter(ItemStack stack) { + itemWriter = filter -> stack.setTag(filter.saveFilter()); + var tag = stack.getOrCreateTag(); + for (int i = 0; i < 9; i++) { int finalI = i; fluidStorageSlots[i] = new CustomFluidTank(64000); @@ -60,23 +63,16 @@ protected SimpleFluidFilter() { }); } Arrays.fill(matches, FluidStack.EMPTY); - } - public static SimpleFluidFilter loadFilter(ItemStack itemStack) { - return loadFilter(itemStack.getOrCreateTag(), filter -> itemStack.setTag(filter.saveFilter())); - } + if (tag.isEmpty()) return; - private static SimpleFluidFilter loadFilter(CompoundTag tag, Consumer itemWriter) { - var handler = new SimpleFluidFilter(); - handler.itemWriter = itemWriter; - handler.isBlackList = tag.getBoolean("isBlackList"); - handler.ignoreNbt = tag.getBoolean("matchNbt"); + isBlackList = tag.getBoolean("isBlackList"); + ignoreNbt = tag.getBoolean("matchNbt"); var list = tag.getList("matches", Tag.TAG_COMPOUND); for (int i = 0; i < list.size(); i++) { - handler.matches[i] = FluidStack.loadFluidStackFromNBT((CompoundTag) list.get(i)); - handler.fluidStorageSlots[i].setFluid(handler.matches[i]); + matches[i] = FluidStack.loadFluidStackFromNBT((CompoundTag) list.get(i)); + fluidStorageSlots[i].setFluid(matches[i]); } - return handler; } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SimpleItemFilter.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SimpleItemFilter.java index 706e10961ac..f163111bf78 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SimpleItemFilter.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SimpleItemFilter.java @@ -44,31 +44,27 @@ public class SimpleItemFilter implements ItemFilter { @Getter protected ItemStack[] matches = new ItemStack[9]; - protected Consumer itemWriter = filter -> {}; + protected Consumer itemWriter; protected Consumer onUpdated = filter -> itemWriter.accept(filter); @Getter protected int maxStackSize; - protected SimpleItemFilter() { + public SimpleItemFilter(ItemStack stack) { + itemWriter = filter -> stack.setTag(filter.saveFilter()); + var tag = stack.getOrCreateTag(); + Arrays.fill(matches, ItemStack.EMPTY); maxStackSize = 1; - } - public static SimpleItemFilter loadFilter(ItemStack itemStack) { - return loadFilter(itemStack.getOrCreateTag(), filter -> itemStack.setTag(filter.saveFilter())); - } + if (tag.isEmpty()) return; - private static SimpleItemFilter loadFilter(CompoundTag tag, Consumer itemWriter) { - var handler = new SimpleItemFilter(); - handler.itemWriter = itemWriter; - handler.isBlackList = tag.getBoolean("isBlackList"); - handler.ignoreNbt = tag.getBoolean("matchNbt"); + isBlackList = tag.getBoolean("isBlackList"); + ignoreNbt = tag.getBoolean("matchNbt"); var list = tag.getList("matches", Tag.TAG_COMPOUND); for (int i = 0; i < list.size(); i++) { - handler.matches[i] = ItemStack.of((CompoundTag) list.get(i)); + matches[i] = ItemStack.of((CompoundTag) list.get(i)); } - return handler; } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SmartItemFilter.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SmartItemFilter.java index 7957bfa91fb..d9007ab84e2 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SmartItemFilter.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SmartItemFilter.java @@ -43,23 +43,18 @@ public class SmartItemFilter implements ItemFilter { - protected Consumer itemWriter = filter -> {}; + protected Consumer itemWriter; protected Consumer onUpdated = filter -> itemWriter.accept(filter); @Getter private SmartFilteringMode filterMode = SmartFilteringMode.ELECTROLYZER; - protected SmartItemFilter() {} + public SmartItemFilter(ItemStack stack) { + itemWriter = filter -> stack.setTag(filter.saveFilter()); + var tag = stack.getOrCreateTag(); + if (tag.isEmpty()) return; - public static SmartItemFilter loadFilter(ItemStack itemStack) { - return loadFilter(itemStack.getOrCreateTag(), filter -> itemStack.setTag(filter.saveFilter())); - } - - private static SmartItemFilter loadFilter(CompoundTag tag, Consumer itemWriter) { - var handler = new SmartItemFilter(); - handler.itemWriter = itemWriter; - handler.filterMode = SmartFilteringMode.VALUES[tag.getInt("filterMode")]; - return handler; + filterMode = SmartFilteringMode.VALUES[tag.getInt("filterMode")]; } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagFluidFilter.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagFluidFilter.java index c4e3b7891e2..e85f0d3b28b 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagFluidFilter.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagFluidFilter.java @@ -3,7 +3,6 @@ import com.gregtechceu.gtceu.common.data.GTItems; import com.gregtechceu.gtceu.utils.TagExprFilter; -import net.minecraft.nbt.CompoundTag; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.material.Fluid; import net.minecraftforge.fluids.FluidStack; @@ -15,28 +14,18 @@ import it.unimi.dsi.fastutil.objects.Object2BooleanMap; import it.unimi.dsi.fastutil.objects.Object2BooleanOpenHashMap; -import java.util.Objects; -import java.util.function.Consumer; - public class TagFluidFilter extends TagFilter implements FluidFilter { private final Object2BooleanMap cache = new Object2BooleanOpenHashMap<>(); - protected TagFluidFilter() {} - - public static TagFluidFilter loadFilter(ItemStack itemStack) { - return loadFilter(Objects.requireNonNullElseGet(itemStack.getTag(), CompoundTag::new), - filter -> itemStack.setTag(filter.saveFilter())); - } + public TagFluidFilter(ItemStack stack) { + itemWriter = filter -> stack.setTag(filter.saveFilter()); + var tag = stack.getOrCreateTag(); - private static TagFluidFilter loadFilter(CompoundTag tag, Consumer itemWriter) { - var handler = new TagFluidFilter(); - handler.itemWriter = itemWriter; - handler.filterString = tag.getString("oreDict"); - handler.matchExpr = null; - handler.cache.clear(); - handler.matchExpr = TagExprFilter.parseExpression(handler.filterString); - return handler; + filterString = tag.getString("oreDict"); + matchExpr = null; + cache.clear(); + matchExpr = TagExprFilter.parseExpression(filterString); } public void setFilterString(String oreDict) { diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagItemFilter.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagItemFilter.java index f58fb0f8eda..c3e11737d32 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagItemFilter.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagItemFilter.java @@ -3,7 +3,6 @@ import com.gregtechceu.gtceu.common.data.GTItems; import com.gregtechceu.gtceu.utils.TagExprFilter; -import net.minecraft.nbt.CompoundTag; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; @@ -14,28 +13,18 @@ import it.unimi.dsi.fastutil.objects.Object2BooleanMap; import it.unimi.dsi.fastutil.objects.Object2BooleanOpenHashMap; -import java.util.Objects; -import java.util.function.Consumer; - public class TagItemFilter extends TagFilter implements ItemFilter { private final Object2BooleanMap cache = new Object2BooleanOpenHashMap<>(); - protected TagItemFilter() {} - - public static TagItemFilter loadFilter(ItemStack itemStack) { - return loadFilter(Objects.requireNonNullElseGet(itemStack.getTag(), CompoundTag::new), - filter -> itemStack.setTag(filter.saveFilter())); - } + public TagItemFilter(ItemStack stack) { + itemWriter = filter -> stack.setTag(filter.saveFilter()); + var tag = stack.getOrCreateTag(); - private static TagItemFilter loadFilter(CompoundTag tag, Consumer itemWriter) { - var handler = new TagItemFilter(); - handler.itemWriter = itemWriter; - handler.filterString = tag.getString("oreDict"); - handler.matchExpr = null; - handler.cache.clear(); - handler.matchExpr = TagExprFilter.parseExpression(handler.filterString); - return handler; + filterString = tag.getString("oreDict"); + matchExpr = null; + cache.clear(); + matchExpr = TagExprFilter.parseExpression(filterString); } public void setFilterString(String oreDict) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java index fafef5889c9..8e61ec82814 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java @@ -1790,7 +1790,7 @@ public static ItemEntry createFluidCell(Material mat, int capacit ///////////////////////////////////////// public static ItemEntry ITEM_FILTER = REGISTRATE.item("item_filter", ComponentItem::create) - .onRegister(attach(new ItemFilterBehaviour(SimpleItemFilter::loadFilter), + .onRegister(attach(new ItemFilterBehaviour(SimpleItemFilter::new), new CoverPlaceBehavior(GTCovers.ITEM_FILTER))) .onRegister(materialInfo(new ItemMaterialInfo(new MaterialStack(GTMaterials.Zinc, GTValues.M * 2), new MaterialStack(GTMaterials.Steel, GTValues.M)))) @@ -1798,25 +1798,25 @@ public static ItemEntry createFluidCell(Material mat, int capacit public static ItemEntry TAG_FILTER = REGISTRATE .item("item_tag_filter", ComponentItem::create) .lang("Item Tag Filter") - .onRegister(attach(new ItemFilterBehaviour(TagItemFilter::loadFilter), + .onRegister(attach(new ItemFilterBehaviour(TagItemFilter::new), new CoverPlaceBehavior(GTCovers.ITEM_FILTER))) .onRegister(materialInfo(new ItemMaterialInfo(new MaterialStack(GTMaterials.Zinc, GTValues.M * 2)))) .register(); public static ItemEntry SMART_ITEM_FILTER = REGISTRATE .item("item_smart_filter", ComponentItem::create) .lang("Smart Item Filter") - .onRegister(attach(new ItemFilterBehaviour(SmartItemFilter::loadFilter), + .onRegister(attach(new ItemFilterBehaviour(SmartItemFilter::new), new CoverPlaceBehavior(GTCovers.ITEM_FILTER))) .onRegister(materialInfo(new ItemMaterialInfo(new MaterialStack(GTMaterials.Zinc, GTValues.M * 3 / 2)))) .register(); public static ItemEntry FLUID_FILTER = REGISTRATE.item("fluid_filter", ComponentItem::create) - .onRegister(attach(new FluidFilterBehaviour(SimpleFluidFilter::loadFilter), + .onRegister(attach(new FluidFilterBehaviour(SimpleFluidFilter::new), new CoverPlaceBehavior(GTCovers.FLUID_FILTER))) .onRegister(materialInfo(new ItemMaterialInfo(new MaterialStack(GTMaterials.Zinc, GTValues.M * 2)))) .register(); public static ItemEntry TAG_FLUID_FILTER = REGISTRATE.item("fluid_tag_filter", ComponentItem::create) .lang("Fluid Tag Filter") - .onRegister(attach(new FluidFilterBehaviour(TagFluidFilter::loadFilter), + .onRegister(attach(new FluidFilterBehaviour(TagFluidFilter::new), new CoverPlaceBehavior(GTCovers.FLUID_FILTER))) .onRegister(materialInfo(new ItemMaterialInfo(new MaterialStack(GTMaterials.Zinc, GTValues.M * 3 / 2)))) .register(); diff --git a/src/test/java/com/gregtechceu/gtceu/common/cover/ItemFilterCoverTest.java b/src/test/java/com/gregtechceu/gtceu/common/cover/ItemFilterCoverTest.java index 61ea1458ec4..50981825c07 100644 --- a/src/test/java/com/gregtechceu/gtceu/common/cover/ItemFilterCoverTest.java +++ b/src/test/java/com/gregtechceu/gtceu/common/cover/ItemFilterCoverTest.java @@ -19,13 +19,15 @@ import net.minecraftforge.gametest.GameTestHolder; import net.minecraftforge.gametest.PrefixGameTestTemplate; +import java.util.Objects; + @PrefixGameTestTemplate(false) @GameTestHolder(GTCEu.MOD_ID) public class ItemFilterCoverTest { private static ItemStack makeDiamondFilter() { ItemStack stack = GTItems.ITEM_FILTER.asStack(); - SimpleItemFilter filter = SimpleItemFilter.loadFilter(stack); + SimpleItemFilter filter = new SimpleItemFilter(stack); filter.getMatches()[0] = Items.DIAMOND.getDefaultInstance(); stack.setTag(filter.saveFilter()); return stack; @@ -42,6 +44,10 @@ public static void conveyorTransfersFilteredItemsTest(GameTestHelper helper) { setupCrates(helper); BufferMachine crate1 = (BufferMachine) helper.getBlockEntity(new BlockPos(0, 1, 0)); BufferMachine crate2 = (BufferMachine) helper.getBlockEntity(new BlockPos(0, 2, 0)); + + Objects.requireNonNull(crate1); + Objects.requireNonNull(crate2); + crate1.getInventory().setStackInSlot(0, new ItemStack(Items.FLINT, 8)); crate1.getInventory().setStackInSlot(1, new ItemStack(Items.DIAMOND, 16)); // LV Cover From 053a1c7b0ea49890b2af2651224804ab1a22b04b Mon Sep 17 00:00:00 2001 From: Gustavo Date: Fri, 19 Jun 2026 00:10:55 +1000 Subject: [PATCH 02/12] refactor filters --- .../gtceu/api/cover/filter/Filter.java | 57 +++++++-- .../gtceu/api/cover/filter/FilterHandler.java | 14 +-- .../api/cover/filter/FilterHandlers.java | 24 ++-- .../gtceu/api/cover/filter/Filters.java | 119 ++++++++++++++++++ .../gtceu/api/cover/filter/FluidFilter.java | 79 ------------ .../gtceu/api/cover/filter/ItemFilter.java | 78 ------------ .../api/cover/filter/SimpleFluidFilter.java | 33 ++--- .../api/cover/filter/SimpleItemFilter.java | 48 +++---- .../api/cover/filter/SmartItemFilter.java | 32 ++--- .../gtceu/api/cover/filter/TagFilter.java | 81 ++++++++---- .../api/cover/filter/TagFluidFilter.java | 67 ---------- .../gtceu/api/cover/filter/TagItemFilter.java | 66 ---------- .../gtceu/api/cover/filter/package-info.java | 4 + .../gtceu/common/cover/ConveyorCover.java | 12 +- .../gtceu/common/cover/FluidFilterCover.java | 11 +- .../common/cover/FluidRegulatorCover.java | 6 +- .../gtceu/common/cover/ItemFilterCover.java | 18 +-- .../gtceu/common/cover/PumpCover.java | 4 +- .../gtceu/common/cover/RobotArmCover.java | 6 +- .../detector/AdvancedFluidDetectorCover.java | 6 +- .../detector/AdvancedItemDetectorCover.java | 6 +- .../cover/ender/EnderFluidLinkCover.java | 4 +- .../cover/ender/EnderItemLinkCover.java | 4 +- .../voiding/AdvancedFluidVoidingCover.java | 6 +- .../voiding/AdvancedItemVoidingCover.java | 6 +- .../cover/voiding/ItemVoidingCover.java | 4 +- .../gtceu/common/data/GTItems.java | 7 +- .../gtceu/common/data/GTPlaceholders.java | 10 +- .../item/behavior/FluidFilterBehaviour.java | 10 +- .../item/behavior/ItemFilterBehaviour.java | 19 +-- .../item/behavior/ItemMagnetBehavior.java | 55 ++++---- .../electric/ItemCollectorMachine.java | 7 +- .../multiblock/part/ItemBusPartMachine.java | 4 +- .../gtceu/common/mui/GTMuiWidgets.java | 18 +-- .../common/pipelike/item/ItemNetHandler.java | 6 +- .../data/recipe/misc/CustomToolRecipes.java | 10 +- .../integration/ae2/GTAEPlaceholders.java | 9 +- 37 files changed, 406 insertions(+), 544 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/api/cover/filter/Filters.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/cover/filter/FluidFilter.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/cover/filter/ItemFilter.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagFluidFilter.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagItemFilter.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/cover/filter/package-info.java diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/Filter.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/Filter.java index 9cd2950f54f..e5bc161d610 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/Filter.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/Filter.java @@ -1,34 +1,75 @@ package com.gregtechceu.gtceu.api.cover.filter; import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.item.ItemStack; import brachy.modularui.factory.GuiData; import brachy.modularui.screen.ModularPanel; import brachy.modularui.screen.UISettings; import brachy.modularui.value.sync.PanelSyncManager; import brachy.modularui.widgets.layout.Flow; +import lombok.Getter; +import lombok.Setter; +import org.jetbrains.annotations.Nullable; import java.util.function.Consumer; import java.util.function.Predicate; -public interface Filter> extends Predicate { +public abstract class Filter implements Predicate { + + @Setter + protected Consumer> itemWriter; + protected Consumer> onUpdated = filter -> itemWriter.accept(filter); + + @Getter + protected final ItemStack filterItemStack; + + public Filter(ItemStack stack) { + this.filterItemStack = stack; + itemWriter = filter -> stack.setTag(filter.saveFilter()); + } /** * @return Filter panel when opened by itself (including the player inventory) */ - ModularPanel getPanel(GuiData data, PanelSyncManager syncManager, UISettings settings); + public abstract ModularPanel getPanel(GuiData data, PanelSyncManager syncManager, UISettings settings); - Flow getFilterUI(GuiData data, PanelSyncManager syncManager, UISettings settings); + public abstract Flow getFilterUI(GuiData data, PanelSyncManager syncManager, UISettings settings); - CompoundTag saveFilter(); + @Nullable + protected abstract CompoundTag saveFilter(); - void setOnUpdated(Consumer onUpdated); + public void setOnUpdated(Consumer> onUpdated) { + this.onUpdated = filter -> { + this.itemWriter.accept(filter); + onUpdated.accept(filter); + }; + } - default boolean isBlackList() { + public boolean isBlackList() { return false; } - default boolean isBlank() { - return false; + /** + * @return Whether this filter supports querying for exact content amounts. + */ + public boolean supportsAmounts() { + return !isBlackList(); } + + /** + * Tests if the given stack matches this filter. + * + * @return If the given stack matches this filter. + */ + @Override + public abstract boolean test(T t); + + /** + * Retrieves the configured count for the stack. + * + * @return The amount configured for the stack.
+ * If the stack is not matched by this filter, 0 is returned instead. + */ + public abstract int testAmount(T stack); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandler.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandler.java index a08a1a89b5d..0e6ed4bb9b0 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandler.java @@ -14,7 +14,6 @@ import net.minecraft.world.item.ItemStack; import lombok.Getter; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.function.Consumer; @@ -23,7 +22,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public abstract class FilterHandler> implements ISyncManaged { +public abstract class FilterHandler> implements ISyncManaged { @Getter private final SyncDataHolder syncDataHolder = new SyncDataHolder(this); @@ -33,14 +32,14 @@ public abstract class FilterHandler> implements ISyncM @SaveField @SyncToClient @Getter - private @NotNull ItemStack filterItem = ItemStack.EMPTY; + private ItemStack filterItem = ItemStack.EMPTY; private @Nullable F filter; private @Nullable CustomItemStackHandler filterSlot; - private @NotNull Consumer onFilterLoaded = (filter) -> {}; - private @NotNull Runnable onFilterRemoved = () -> {}; - private @NotNull Consumer onFilterUpdated = (filter) -> {}; + private Consumer onFilterLoaded = (filter) -> {}; + private Runnable onFilterRemoved = () -> {}; + private Consumer onFilterUpdated = (filter) -> {}; public FilterHandler(ISyncManaged container) { this.container = container; @@ -136,10 +135,11 @@ private void updateFilter() { loadFilterFromItem(); } + @SuppressWarnings("unchecked") private void loadFilterFromItem() { if (!this.filterItem.isEmpty()) { this.filter = loadFilter(this.filterItem); - filter.setOnUpdated(this.onFilterUpdated); + filter.setOnUpdated((Consumer>) this.onFilterUpdated); if (filter instanceof SmartItemFilter smart && container instanceof CoverBehavior cover && cover.coverHolder instanceof MachineCoverContainer mcc) { diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandlers.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandlers.java index 0c776f14a7b..5ff84b7598a 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandlers.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandlers.java @@ -12,42 +12,42 @@ @MethodsReturnNonnullByDefault public interface FilterHandlers { - static FilterHandler item(ISyncManaged container) { + static FilterHandler> item(ISyncManaged container) { return new FilterHandler<>(container) { @Override - public ItemFilter loadFilter(ItemStack filterItem) { - return ItemFilter.loadFilter(filterItem); + public Filter loadFilter(ItemStack filterItem) { + return Filters.loadItemFilter(filterItem); } @Override - protected ItemFilter getEmptyFilter() { - return ItemFilter.EMPTY; + protected Filter getEmptyFilter() { + return Filters.EMPTY_ITEM; } @Override public boolean canInsertFilterItem(ItemStack itemStack) { - return ItemFilter.FILTERS.containsKey(itemStack.getItem()); + return Filters.isValidFilter(ItemStack.class, itemStack.getItem()); } }; } - static FilterHandler fluid(ISyncManaged container) { + static FilterHandler> fluid(ISyncManaged container) { return new FilterHandler<>(container) { @Override - public FluidFilter loadFilter(ItemStack filterItem) { - return FluidFilter.loadFilter(filterItem); + public Filter loadFilter(ItemStack filterItem) { + return Filters.loadFluidFilter(filterItem); } @Override - protected FluidFilter getEmptyFilter() { - return FluidFilter.EMPTY; + protected Filter getEmptyFilter() { + return Filters.EMPTY_FLUID; } @Override public boolean canInsertFilterItem(ItemStack itemStack) { - return FluidFilter.FILTERS.containsKey(itemStack.getItem()); + return Filters.isValidFilter(FluidStack.class, itemStack.getItem()); } }; } diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/Filters.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/Filters.java new file mode 100644 index 00000000000..e45273afbc2 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/Filters.java @@ -0,0 +1,119 @@ +package com.gregtechceu.gtceu.api.cover.filter; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.fluids.FluidStack; + +import brachy.modularui.factory.GuiData; +import brachy.modularui.screen.ModularPanel; +import brachy.modularui.screen.UISettings; +import brachy.modularui.value.sync.PanelSyncManager; +import brachy.modularui.widgets.layout.Flow; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import org.apache.commons.lang3.NotImplementedException; + +import java.util.Map; +import java.util.function.Consumer; +import java.util.function.Function; + +public class Filters { + + private static final Map> FILTERS = new Object2ObjectOpenHashMap<>(); + + public static void registerFilter(Class filterable, Item item, + Function> filterFactory) { + FILTERS.put(item, new FilterEntry<>(filterable, filterFactory)); + } + + @SuppressWarnings({ "unchecked", "DataFlowIssue" }) + public static Filter loadFilter(Class filterableType, ItemStack stack) { + var entry = FILTERS.get(stack.getItem()); + if (entry.filterable != filterableType) return null; + return (Filter) entry.filterFactory.apply(stack); + } + + public static Filter loadItemFilter(ItemStack stack) { + return loadFilter(ItemStack.class, stack); + } + + public static Filter loadFluidFilter(ItemStack stack) { + return loadFilter(FluidStack.class, stack); + } + + public static boolean isValidFilter(Class filterableType, Item item) { + if (!FILTERS.containsKey(item)) return false; + return FILTERS.get(item).filterable == filterableType; + } + + public static final Filter EMPTY_ITEM = new Filter<>(ItemStack.EMPTY) { + + @Override + public int testAmount(ItemStack itemStack) { + return Integer.MAX_VALUE; + } + + @Override + public boolean test(ItemStack itemStack) { + return true; + } + + @Override + public ModularPanel getPanel(GuiData data, PanelSyncManager syncManager, UISettings settings) { + return null; + } + + @Override + public Flow getFilterUI(GuiData data, PanelSyncManager syncManager, UISettings settings) { + return null; + } + + @Override + public CompoundTag saveFilter() { + throw new NotImplementedException("Not available for empty item filter"); + } + + @Override + public void setOnUpdated(Consumer> onUpdated) { + throw new NotImplementedException("Not available for empty item filter"); + } + }; + + public static final Filter EMPTY_FLUID = new Filter<>(ItemStack.EMPTY) { + + @Override + public boolean test(FluidStack fluidStack) { + return true; + } + + @Override + public int testAmount(FluidStack fluidStack) { + return Integer.MAX_VALUE; + } + + @Override + public ModularPanel getPanel(GuiData data, PanelSyncManager syncManager, UISettings settings) { + return null; + } + + @Override + public Flow getFilterUI(GuiData data, PanelSyncManager syncManager, UISettings settings) { + return null; + } + + @Override + public CompoundTag saveFilter() { + throw new NotImplementedException("Not available for empty fluid filter"); + } + + @Override + public void setOnUpdated(Consumer> onUpdated) { + throw new NotImplementedException("Not available for empty fluid filter"); + } + }; + + /** + * @param filterable The object/stack type that this filter supports. + */ + private record FilterEntry(Class filterable, Function> filterFactory) {} +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FluidFilter.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FluidFilter.java deleted file mode 100644 index 4cdb6ad3643..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FluidFilter.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.gregtechceu.gtceu.api.cover.filter; - -import net.minecraft.nbt.CompoundTag; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.ItemLike; -import net.minecraftforge.fluids.FluidStack; - -import brachy.modularui.factory.GuiData; -import brachy.modularui.screen.ModularPanel; -import brachy.modularui.screen.UISettings; -import brachy.modularui.value.sync.PanelSyncManager; -import brachy.modularui.widgets.layout.Flow; -import org.apache.commons.lang3.NotImplementedException; - -import java.util.HashMap; -import java.util.Map; -import java.util.function.Consumer; -import java.util.function.Function; - -public interface FluidFilter extends Filter { - - Map> FILTERS = new HashMap<>(); - - static FluidFilter loadFilter(ItemStack itemStack) { - return FILTERS.get(itemStack.getItem()).apply(itemStack); - } - - /** - * Retrieves the configured fluid amount for the supplied fluid. - * - * @return The amount configured for the supplied fluid stack.
- * If the stack is not matched by this filter, 0 is returned instead. - */ - int testFluidAmount(FluidStack fluidStack); - - /** - * @return Whether this filter supports querying for exact fluid amounts. - */ - default boolean supportsAmounts() { - return !isBlackList(); - } - - /** - * An empty fluid filter that allows all fluids.
- * ONLY TO BE USED FOR FLUID MATCHING! All other functionality will throw an exception. - */ - FluidFilter EMPTY = new FluidFilter() { - - @Override - public boolean test(FluidStack fluidStack) { - return true; - } - - @Override - public int testFluidAmount(FluidStack fluidStack) { - return Integer.MAX_VALUE; - } - - @Override - public ModularPanel getPanel(GuiData data, PanelSyncManager syncManager, UISettings settings) { - return null; - } - - @Override - public Flow getFilterUI(GuiData data, PanelSyncManager syncManager, UISettings settings) { - return null; - } - - @Override - public CompoundTag saveFilter() { - throw new NotImplementedException("Not available for empty fluid filter"); - } - - @Override - public void setOnUpdated(Consumer onUpdated) { - throw new NotImplementedException("Not available for empty fluid filter"); - } - }; -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/ItemFilter.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/ItemFilter.java deleted file mode 100644 index bdfa2d85206..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/ItemFilter.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.gregtechceu.gtceu.api.cover.filter; - -import net.minecraft.nbt.CompoundTag; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.ItemLike; - -import brachy.modularui.factory.GuiData; -import brachy.modularui.screen.ModularPanel; -import brachy.modularui.screen.UISettings; -import brachy.modularui.value.sync.PanelSyncManager; -import brachy.modularui.widgets.layout.Flow; -import org.apache.commons.lang3.NotImplementedException; - -import java.util.HashMap; -import java.util.Map; -import java.util.function.Consumer; -import java.util.function.Function; - -public interface ItemFilter extends Filter { - - Map> FILTERS = new HashMap<>(); - - static ItemFilter loadFilter(ItemStack itemStack) { - return FILTERS.get(itemStack.getItem()).apply(itemStack); - } - - /** - * Retrieves the configured item count for the supplied item. - * - * @return The amount configured for the supplied item stack.
- * If the stack is not matched by this filter, 0 is returned instead. - */ - int testItemCount(ItemStack itemStack); - - /** - * @return Whether this filter supports querying for exact item amounts. - */ - default boolean supportsAmounts() { - return !isBlackList(); - } - - /** - * An empty item filter that allows all items.
- * ONLY TO BE USED FOR ITEM MATCHING! All other functionality will throw an exception. - */ - ItemFilter EMPTY = new ItemFilter() { - - @Override - public int testItemCount(ItemStack itemStack) { - return Integer.MAX_VALUE; - } - - @Override - public boolean test(ItemStack itemStack) { - return true; - } - - @Override - public ModularPanel getPanel(GuiData data, PanelSyncManager syncManager, UISettings settings) { - return null; - } - - @Override - public Flow getFilterUI(GuiData data, PanelSyncManager syncManager, UISettings settings) { - return null; - } - - @Override - public CompoundTag saveFilter() { - throw new NotImplementedException("Not available for empty item filter"); - } - - @Override - public void setOnUpdated(Consumer onUpdated) { - throw new NotImplementedException("Not available for empty item filter"); - } - }; -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SimpleFluidFilter.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SimpleFluidFilter.java index 33ec8577f9f..0d6e0e3b730 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SimpleFluidFilter.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SimpleFluidFilter.java @@ -25,15 +25,15 @@ import brachy.modularui.widgets.layout.Grid; import brachy.modularui.widgets.slot.FluidSlot; import lombok.Getter; +import org.jetbrains.annotations.Nullable; import java.util.Arrays; -import java.util.function.Consumer; import javax.annotation.ParametersAreNonnullByDefault; @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class SimpleFluidFilter implements FluidFilter { +public class SimpleFluidFilter extends Filter { @Getter protected boolean isBlackList; @@ -42,16 +42,13 @@ public class SimpleFluidFilter implements FluidFilter { @Getter protected FluidStack[] matches = new FluidStack[9]; - protected Consumer itemWriter; - protected Consumer onUpdated = filter -> itemWriter.accept(filter); - @Getter protected int maxStackSize = 1; private final CustomFluidTank[] fluidStorageSlots = new CustomFluidTank[9]; public SimpleFluidFilter(ItemStack stack) { - itemWriter = filter -> stack.setTag(filter.saveFilter()); + super(stack); var tag = stack.getOrCreateTag(); for (int i = 0; i < 9; i++) { @@ -75,21 +72,8 @@ public SimpleFluidFilter(ItemStack stack) { } } - @Override - public void setOnUpdated(Consumer onUpdated) { - this.onUpdated = filter -> { - this.itemWriter.accept(filter); - onUpdated.accept(filter); - }; - } - - @Override - public boolean isBlank() { - return !isBlackList && !ignoreNbt && Arrays.stream(matches).allMatch(FluidStack::isEmpty); - } - - public CompoundTag saveFilter() { - if (isBlank()) { + public @Nullable CompoundTag saveFilter() { + if (!isBlackList && !ignoreNbt && Arrays.stream(matches).allMatch(FluidStack::isEmpty)) { return null; } var tag = new CompoundTag(); @@ -152,11 +136,11 @@ public Flow getFilterUI(GuiData data, PanelSyncManager syncManager, UISettings s @Override public boolean test(FluidStack other) { - return testFluidAmount(other) > 0L; + return testAmount(other) > 0L; } @Override - public int testFluidAmount(FluidStack fluidStack) { + public int testAmount(FluidStack fluidStack) { int totalFluidAmount = getTotalConfiguredFluidAmount(fluidStack); if (isBlackList) { @@ -185,8 +169,7 @@ public void setMaxStackSize(int maxStackSize) { this.maxStackSize = maxStackSize; for (CustomFluidTank slot : fluidStorageSlots) { - if (slot != null) - slot.setCapacity(maxStackSize); + slot.setCapacity(maxStackSize); } for (FluidStack match : matches) { diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SimpleItemFilter.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SimpleItemFilter.java index f163111bf78..182c550967f 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SimpleItemFilter.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SimpleItemFilter.java @@ -26,16 +26,15 @@ import brachy.modularui.widgets.slot.ModularSlot; import brachy.modularui.widgets.slot.PhantomItemSlot; import lombok.Getter; -import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.Arrays; -import java.util.function.Consumer; import javax.annotation.ParametersAreNonnullByDefault; @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class SimpleItemFilter implements ItemFilter { +public class SimpleItemFilter extends Filter { @Getter protected boolean isBlackList; @@ -44,14 +43,12 @@ public class SimpleItemFilter implements ItemFilter { @Getter protected ItemStack[] matches = new ItemStack[9]; - protected Consumer itemWriter; - protected Consumer onUpdated = filter -> itemWriter.accept(filter); - @Getter protected int maxStackSize; public SimpleItemFilter(ItemStack stack) { - itemWriter = filter -> stack.setTag(filter.saveFilter()); + super(stack); + var tag = stack.getOrCreateTag(); Arrays.fill(matches, ItemStack.EMPTY); @@ -67,21 +64,8 @@ public SimpleItemFilter(ItemStack stack) { } } - @Override - public void setOnUpdated(Consumer onUpdated) { - this.onUpdated = filter -> { - this.itemWriter.accept(filter); - onUpdated.accept(filter); - }; - } - - @Override - public boolean isBlank() { - return !isBlackList && !ignoreNbt && Arrays.stream(matches).allMatch(ItemStack::isEmpty); - } - - public CompoundTag saveFilter() { - if (isBlank()) { + public @Nullable CompoundTag saveFilter() { + if (!isBlackList && !ignoreNbt && Arrays.stream(matches).allMatch(ItemStack::isEmpty)) { return null; } var tag = new CompoundTag(); @@ -125,9 +109,9 @@ public Flow getFilterUI(GuiData data, PanelSyncManager syncManager, UISettings s .gridOfSizeWidth(9, 3, (x, y, i) -> new PhantomItemSlot() .size(16) .syncHandler(new PhantomItemSlotSyncHandler(new ModularSlot(handler, i) - .changeListener((stack, amount, client, init) -> { - handler.setStackInSlot(i, stack); - }).ignoreMaxStackSize(true).accessibility(true, false)))); + .changeListener((stack, amount, client, init) -> handler.setStackInSlot(i, stack)) + .ignoreMaxStackSize(true) + .accessibility(true, false)))); BooleanSyncValue blacklist = new BooleanSyncValue(this::isBlackList, this::setBlackList).allowC2S(); syncManager.syncValue("blacklist", blacklist); @@ -161,17 +145,17 @@ public FilterItemStackHandler(ItemStack[] matches, SimpleItemFilter simpleItemFi } @Override - public @NotNull ItemStack getStackInSlot(int slot) { + public ItemStack getStackInSlot(int slot) { return matches[slot]; } @Override - protected int getStackLimit(int slot, @NotNull ItemStack stack) { + protected int getStackLimit(int slot, ItemStack stack) { return 1; } @Override - public @NotNull ItemStack extractItem(int slot, int amount, boolean simulate) { + public ItemStack extractItem(int slot, int amount, boolean simulate) { if (amount >= matches[slot].getCount()) { matches[slot] = ItemStack.EMPTY; } @@ -179,12 +163,12 @@ protected int getStackLimit(int slot, @NotNull ItemStack stack) { } @Override - public @NotNull ItemStack insertItem(int slot, @NotNull ItemStack stack, boolean simulate) { + public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) { return stack; } @Override - public void setStackInSlot(int slot, @NotNull ItemStack stack) { + public void setStackInSlot(int slot, ItemStack stack) { super.setStackInSlot(slot, stack); matches[slot] = stack.copyWithCount(1); filter.onUpdated.accept(filter); @@ -193,11 +177,11 @@ public void setStackInSlot(int slot, @NotNull ItemStack stack) { @Override public boolean test(ItemStack itemStack) { - return testItemCount(itemStack) > 0; + return testAmount(itemStack) > 0; } @Override - public int testItemCount(ItemStack itemStack) { + public int testAmount(ItemStack itemStack) { int totalItemCount = getTotalConfiguredItemCount(itemStack); if (isBlackList) { diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SmartItemFilter.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SmartItemFilter.java index d9007ab84e2..7292d4c8726 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SmartItemFilter.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SmartItemFilter.java @@ -36,43 +36,27 @@ import brachy.modularui.widgets.menu.Menu; import it.unimi.dsi.fastutil.objects.Object2IntOpenCustomHashMap; import lombok.Getter; +import org.jetbrains.annotations.Nullable; import java.util.Arrays; import java.util.Collections; -import java.util.function.Consumer; -public class SmartItemFilter implements ItemFilter { - - protected Consumer itemWriter; - protected Consumer onUpdated = filter -> itemWriter.accept(filter); +public class SmartItemFilter extends Filter { @Getter private SmartFilteringMode filterMode = SmartFilteringMode.ELECTROLYZER; public SmartItemFilter(ItemStack stack) { - itemWriter = filter -> stack.setTag(filter.saveFilter()); + super(stack); + var tag = stack.getOrCreateTag(); if (tag.isEmpty()) return; - filterMode = SmartFilteringMode.VALUES[tag.getInt("filterMode")]; } @Override - public void setOnUpdated(Consumer onUpdated) { - this.onUpdated = filter -> { - this.itemWriter.accept(filter); - onUpdated.accept(filter); - }; - } - - @Override - public boolean isBlank() { - return filterMode.ordinal() == 0; - } - - @Override - public CompoundTag saveFilter() { - if (isBlank()) { + public @Nullable CompoundTag saveFilter() { + if (filterMode.ordinal() == 0) { return null; } var tag = new CompoundTag(); @@ -135,11 +119,11 @@ public Flow getFilterUI(GuiData data, PanelSyncManager syncManager, UISettings s @Override public boolean test(ItemStack itemStack) { - return testItemCount(itemStack) > 0; + return testAmount(itemStack) > 0; } @Override - public int testItemCount(ItemStack itemStack) { + public int testAmount(ItemStack itemStack) { return filterMode.cache.computeIfAbsent(itemStack, this::lookup); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagFilter.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagFilter.java index 0f221b89b72..db2bd69b6a1 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagFilter.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagFilter.java @@ -5,6 +5,8 @@ import com.gregtechceu.gtceu.utils.TagExprFilter; import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagKey; import net.minecraft.world.item.ItemStack; import brachy.modularui.factory.GuiData; @@ -17,29 +19,41 @@ import brachy.modularui.widgets.SlotGroupWidget; import brachy.modularui.widgets.layout.Flow; import brachy.modularui.widgets.textfield.TextFieldWidget; +import it.unimi.dsi.fastutil.objects.Object2BooleanMap; +import it.unimi.dsi.fastutil.objects.Object2BooleanOpenHashMap; import lombok.Getter; +import org.jetbrains.annotations.Nullable; -import java.util.function.Consumer; +import java.util.Set; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; -public abstract class TagFilter> implements Filter { +public class TagFilter extends Filter { @Getter - protected String filterString = ""; + protected String filterString; - protected Consumer itemWriter = filter -> {}; - protected Consumer onUpdated = filter -> itemWriter.accept(filter); + private final Object2BooleanMap matchResultCache = new Object2BooleanOpenHashMap<>(); - protected TagExprFilter.TagExprParser.MatchExpr matchExpr = null; + protected @Nullable TagExprFilter.TagExprParser.MatchExpr matchExpr; + private final Function tagHolderObject; + private final Function>> tagsSupplier; - protected TagFilter() {} + public TagFilter(ItemStack stack, Function tagHolderObjectSupplier, + Function>> tagsSupplier) { + super(stack); + this.tagHolderObject = tagHolderObjectSupplier; + this.tagsSupplier = tagsSupplier; - @Override - public boolean isBlank() { - return filterString.isBlank(); + var tag = stack.getOrCreateTag(); + + filterString = tag.getString("oreDict"); + matchExpr = TagExprFilter.parseExpression(filterString); } - public CompoundTag saveFilter() { - if (isBlank()) { + public @Nullable CompoundTag saveFilter() { + if (filterString.isBlank()) { return null; } var tag = new CompoundTag(); @@ -48,20 +62,19 @@ public CompoundTag saveFilter() { } public void setFilterString(String filterString) { + matchResultCache.clear(); this.filterString = filterString; matchExpr = TagExprFilter.parseExpression(filterString); - onUpdated.accept((S) this); + onUpdated.accept(this); } - protected abstract ItemStack getFilterItem(); - @Override public ModularPanel getPanel(GuiData data, PanelSyncManager syncManager, UISettings settings) { return new Dialog<>("tag_filter") .disablePanelsBelow(false) .draggable(true) .closeOnOutOfBoundsClick(true) - .child(GTMuiWidgets.createTitleBar(() -> getFilterItem(), 176, GTGuiTextures.BACKGROUND)) + .child(GTMuiWidgets.createTitleBar(this::getFilterItemStack, 176, GTGuiTextures.BACKGROUND)) .child(getFilterUI(data, syncManager, settings).margin(7).horizontalCenter()) .child(SlotGroupWidget.playerInventory(false).left(7).bottom(7)); } @@ -71,18 +84,40 @@ public Flow getFilterUI(GuiData data, PanelSyncManager syncManager, UISettings s StringSyncValue filterString = new StringSyncValue(this::getFilterString, this::setFilterString).allowC2S(); RichTooltip infoTooltip = new RichTooltip().add("cover.tag_filter.info"); - var inputRow = Flow.row() + return Flow.row() .coverChildren() .child(new TextFieldWidget().width(140).value(filterString)) .child(GTGuiTextures.INFO.asWidget().tooltip(infoTooltip)); - return inputRow; } @Override - public void setOnUpdated(Consumer onUpdated) { - this.onUpdated = filter -> { - this.itemWriter.accept(filter); - onUpdated.accept(filter); - }; + public boolean supportsAmounts() { + return false; + } + + private boolean testTagExpr(T t) { + Set tags = tagsSupplier.apply(t) + .map(TagKey::location) + .map(ResourceLocation::toString) + .collect(Collectors.toSet()); + + return matchExpr != null && matchExpr.matches(tags); + } + + @Override + public boolean test(T t) { + var tagHolder = tagHolderObject.apply(t); + + if (filterString.isEmpty()) return false; + if (matchResultCache.containsKey(tagHolder)) return matchResultCache.getOrDefault(tagHolder, false); + + var result = testTagExpr(t); + matchResultCache.put(tagHolder, result); + return result; + } + + @Override + public int testAmount(T stack) { + return test(stack) ? Integer.MAX_VALUE : 0; } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagFluidFilter.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagFluidFilter.java deleted file mode 100644 index e85f0d3b28b..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagFluidFilter.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.gregtechceu.gtceu.api.cover.filter; - -import com.gregtechceu.gtceu.common.data.GTItems; -import com.gregtechceu.gtceu.utils.TagExprFilter; - -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.material.Fluid; -import net.minecraftforge.fluids.FluidStack; - -import brachy.modularui.factory.GuiData; -import brachy.modularui.screen.UISettings; -import brachy.modularui.value.sync.PanelSyncManager; -import brachy.modularui.widgets.layout.Flow; -import it.unimi.dsi.fastutil.objects.Object2BooleanMap; -import it.unimi.dsi.fastutil.objects.Object2BooleanOpenHashMap; - -public class TagFluidFilter extends TagFilter implements FluidFilter { - - private final Object2BooleanMap cache = new Object2BooleanOpenHashMap<>(); - - public TagFluidFilter(ItemStack stack) { - itemWriter = filter -> stack.setTag(filter.saveFilter()); - var tag = stack.getOrCreateTag(); - - filterString = tag.getString("oreDict"); - matchExpr = null; - cache.clear(); - matchExpr = TagExprFilter.parseExpression(filterString); - } - - public void setFilterString(String oreDict) { - cache.clear(); - super.setFilterString(oreDict); - } - - @Override - protected ItemStack getFilterItem() { - return GTItems.TAG_FLUID_FILTER.asStack(); - } - - @Override - public boolean test(FluidStack fluidStack) { - if (filterString.isEmpty()) return false; - if (cache.containsKey(fluidStack.getFluid())) return cache.getOrDefault(fluidStack.getFluid(), false); - if (TagExprFilter.tagsMatch(matchExpr, fluidStack)) { - cache.put(fluidStack.getFluid(), true); - return true; - } - cache.put(fluidStack.getFluid(), false); - return false; - } - - @Override - public Flow getFilterUI(GuiData data, PanelSyncManager syncManager, UISettings settings) { - return super.getFilterUI(data, syncManager, settings); - } - - @Override - public int testFluidAmount(FluidStack fluidStack) { - return test(fluidStack) ? Integer.MAX_VALUE : 0; - } - - @Override - public boolean supportsAmounts() { - return false; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagItemFilter.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagItemFilter.java deleted file mode 100644 index c3e11737d32..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagItemFilter.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.gregtechceu.gtceu.api.cover.filter; - -import com.gregtechceu.gtceu.common.data.GTItems; -import com.gregtechceu.gtceu.utils.TagExprFilter; - -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; - -import brachy.modularui.factory.GuiData; -import brachy.modularui.screen.UISettings; -import brachy.modularui.value.sync.PanelSyncManager; -import brachy.modularui.widgets.layout.Flow; -import it.unimi.dsi.fastutil.objects.Object2BooleanMap; -import it.unimi.dsi.fastutil.objects.Object2BooleanOpenHashMap; - -public class TagItemFilter extends TagFilter implements ItemFilter { - - private final Object2BooleanMap cache = new Object2BooleanOpenHashMap<>(); - - public TagItemFilter(ItemStack stack) { - itemWriter = filter -> stack.setTag(filter.saveFilter()); - var tag = stack.getOrCreateTag(); - - filterString = tag.getString("oreDict"); - matchExpr = null; - cache.clear(); - matchExpr = TagExprFilter.parseExpression(filterString); - } - - public void setFilterString(String oreDict) { - cache.clear(); - super.setFilterString(oreDict); - } - - @Override - public Flow getFilterUI(GuiData data, PanelSyncManager syncManager, UISettings settings) { - return super.getFilterUI(data, syncManager, settings); - } - - @Override - protected ItemStack getFilterItem() { - return GTItems.TAG_FILTER.asStack(); - } - - @Override - public boolean test(ItemStack itemStack) { - if (filterString.isEmpty()) return false; - if (cache.containsKey(itemStack.getItem())) return cache.getOrDefault(itemStack.getItem(), false); - if (TagExprFilter.tagsMatch(matchExpr, itemStack)) { - cache.put(itemStack.getItem(), true); - return true; - } - cache.put(itemStack.getItem(), false); - return false; - } - - @Override - public int testItemCount(ItemStack itemStack) { - return test(itemStack) ? Integer.MAX_VALUE : 0; - } - - @Override - public boolean supportsAmounts() { - return false; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/package-info.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/package-info.java new file mode 100644 index 00000000000..8624f96b7d8 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/package-info.java @@ -0,0 +1,4 @@ +@NotNullByDefault +package com.gregtechceu.gtceu.api.cover.filter; + +import org.jetbrains.annotations.NotNullByDefault; diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/ConveyorCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/ConveyorCover.java index 379ab99fb64..de6f401edaa 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/ConveyorCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ConveyorCover.java @@ -5,9 +5,9 @@ import com.gregtechceu.gtceu.api.capability.ICoverable; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.cover.*; +import com.gregtechceu.gtceu.api.cover.filter.Filter; import com.gregtechceu.gtceu.api.cover.filter.FilterHandler; import com.gregtechceu.gtceu.api.cover.filter.FilterHandlers; -import com.gregtechceu.gtceu.api.cover.filter.ItemFilter; import com.gregtechceu.gtceu.api.machine.ConditionalSubscriptionHandler; import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; @@ -87,7 +87,7 @@ public class ConveyorCover extends CoverBehavior implements IIOCover, IMuiCover, @SaveField @SyncToClient @Getter - protected final FilterHandler filterHandler; + protected final FilterHandler> filterHandler; protected final ConditionalSubscriptionHandler subscriptionHandler; public ConveyorCover(CoverDefinition definition, ICoverable coverHolder, Direction attachedSide, int tier, @@ -213,7 +213,7 @@ protected int doTransferItems(IItemHandler sourceInventory, IItemHandler targetI protected int moveInventoryItems(IItemHandler sourceInventory, IItemHandler targetInventory, int maxTransferAmount) { - ItemFilter filter = filterHandler.getFilter(); + Filter filter = filterHandler.getFilter(); int itemsLeftToTransfer = maxTransferAmount; for (int srcIndex = 0; srcIndex < sourceInventory.getSlots(); srcIndex++) { @@ -301,7 +301,7 @@ protected static boolean moveInventoryItemsExact(IItemHandler sourceInventory, I protected int moveInventoryItems(IItemHandler sourceInventory, IItemHandler targetInventory, Map itemInfos, int maxTransferAmount) { - ItemFilter filter = filterHandler.getFilter(); + Filter filter = filterHandler.getFilter(); int itemsLeftToTransfer = maxTransferAmount; for (int i = 0; i < sourceInventory.getSlots(); i++) { @@ -343,7 +343,7 @@ protected int moveInventoryItems(IItemHandler sourceInventory, IItemHandler targ } protected Map countInventoryItemsByType(IItemHandler inventory) { - ItemFilter filter = filterHandler.getFilter(); + Filter filter = filterHandler.getFilter(); Map result = new Object2ObjectOpenCustomHashMap<>( ItemStackHashStrategy.comparingAllButCount()); @@ -363,7 +363,7 @@ protected Map countInventoryItemsByType(IItemHandler in } protected Map countInventoryItemsByMatchSlot(IItemHandler inventory) { - ItemFilter filter = filterHandler.getFilter(); + Filter filter = filterHandler.getFilter(); Map result = new Object2ObjectOpenCustomHashMap<>( ItemStackHashStrategy.comparingAllButCount()); 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 82b451e2bfd..cdaf60a1a48 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/FluidFilterCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/FluidFilterCover.java @@ -4,7 +4,8 @@ import com.gregtechceu.gtceu.api.cover.CoverBehavior; import com.gregtechceu.gtceu.api.cover.CoverDefinition; import com.gregtechceu.gtceu.api.cover.IMuiCover; -import com.gregtechceu.gtceu.api.cover.filter.FluidFilter; +import com.gregtechceu.gtceu.api.cover.filter.Filter; +import com.gregtechceu.gtceu.api.cover.filter.Filters; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.transfer.fluid.FluidHandlerDelegate; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; @@ -34,7 +35,7 @@ @MethodsReturnNonnullByDefault public class FluidFilterCover extends CoverBehavior implements IMuiCover { - protected FluidFilter fluidFilter; + protected @Nullable Filter fluidFilter; @Setter @SaveField @Getter @@ -54,9 +55,9 @@ public boolean canAttach() { return super.canAttach() && coverHolder.getFluidHandlerCap(attachedSide, false) != null; } - public FluidFilter getFluidFilter() { + public Filter getFluidFilter() { if (fluidFilter == null) { - fluidFilter = FluidFilter.loadFilter(attachItem); + fluidFilter = Filters.loadFluidFilter(attachItem); } return fluidFilter; } @@ -143,7 +144,7 @@ public void copyConfig(CompoundTag tag) { public void pasteConfig(ServerPlayer player, CompoundTag tag) { setAllowFlow(ManualIOMode.values()[tag.getInt("manualIO")]); setFilterMode(FilterMode.values()[tag.getInt("filterMode")]); - fluidFilter = FluidFilter.loadFilter(ItemStack.of(tag.getCompound("filter"))); + fluidFilter = Filters.loadFluidFilter(ItemStack.of(tag.getCompound("filter"))); super.pasteConfig(player, tag); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/FluidRegulatorCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/FluidRegulatorCover.java index 0f641519ec3..c802d6725d8 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/FluidRegulatorCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/FluidRegulatorCover.java @@ -2,7 +2,7 @@ import com.gregtechceu.gtceu.api.capability.ICoverable; import com.gregtechceu.gtceu.api.cover.CoverDefinition; -import com.gregtechceu.gtceu.api.cover.filter.FluidFilter; +import com.gregtechceu.gtceu.api.cover.filter.Filter; import com.gregtechceu.gtceu.api.cover.filter.SimpleFluidFilter; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; @@ -172,8 +172,8 @@ private int getFilteredFluidAmount(FluidStack fluidStack) { if (!filterHandler.isFilterPresent()) return globalTransferLimit; - FluidFilter filter = filterHandler.getFilter(); - return (filter.supportsAmounts() ? filter.testFluidAmount(fluidStack) : globalTransferLimit); + Filter filter = filterHandler.getFilter(); + return (filter.supportsAmounts() ? filter.testAmount(fluidStack) : globalTransferLimit); } /////////////////////////// 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 17488d479a1..6fa6c3e04d1 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/ItemFilterCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ItemFilterCover.java @@ -4,7 +4,8 @@ import com.gregtechceu.gtceu.api.cover.CoverBehavior; import com.gregtechceu.gtceu.api.cover.CoverDefinition; import com.gregtechceu.gtceu.api.cover.IMuiCover; -import com.gregtechceu.gtceu.api.cover.filter.ItemFilter; +import com.gregtechceu.gtceu.api.cover.filter.Filter; +import com.gregtechceu.gtceu.api.cover.filter.Filters; import com.gregtechceu.gtceu.api.cover.filter.SmartItemFilter; import com.gregtechceu.gtceu.api.machine.MachineCoverContainer; import com.gregtechceu.gtceu.api.machine.MetaMachine; @@ -28,7 +29,6 @@ import brachy.modularui.widgets.layout.Flow; import lombok.Getter; import lombok.Setter; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.annotation.ParametersAreNonnullByDefault; @@ -37,7 +37,7 @@ @MethodsReturnNonnullByDefault public class ItemFilterCover extends CoverBehavior implements IMuiCover { - protected ItemFilter itemFilter; + protected @Nullable Filter itemFilter; @Setter @SaveField @Getter @@ -52,9 +52,9 @@ public ItemFilterCover(CoverDefinition definition, ICoverable coverHolder, Direc super(definition, coverHolder, attachedSide); } - public ItemFilter getItemFilter() { + public Filter getItemFilter() { if (itemFilter == null) { - itemFilter = ItemFilter.loadFilter(attachItem); + itemFilter = Filters.loadItemFilter(attachItem); if (itemFilter instanceof SmartItemFilter smart && coverHolder instanceof MachineCoverContainer mcc) { var machine = MetaMachine.getMachine(mcc.getLevel(), mcc.getBlockPos()); if (machine != null) smart.setModeFromMachine(machine.getDefinition().getName()); @@ -69,7 +69,7 @@ public boolean canAttach() { } @Override - public @Nullable IItemHandlerModifiable getItemHandlerCap(IItemHandlerModifiable defaultValue) { + public @Nullable IItemHandlerModifiable getItemHandlerCap(@Nullable IItemHandlerModifiable defaultValue) { if (defaultValue == null) { return null; } @@ -110,7 +110,7 @@ public FilteredItemHandlerWrapper(IItemHandlerModifiable delegate) { } @Override - public @NotNull ItemStack insertItem(int slot, @NotNull ItemStack stack, boolean simulate) { + public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) { if (filterMode == FilterMode.FILTER_EXTRACT) { if (allowFlow == ManualIOMode.DISABLED) { return stack; @@ -126,7 +126,7 @@ public FilteredItemHandlerWrapper(IItemHandlerModifiable delegate) { } @Override - public @NotNull ItemStack extractItem(int slot, int amount, boolean simulate) { + public ItemStack extractItem(int slot, int amount, boolean simulate) { if (filterMode == FilterMode.FILTER_INSERT) { if (allowFlow == ManualIOMode.DISABLED) { return ItemStack.EMPTY; @@ -155,7 +155,7 @@ public void copyConfig(CompoundTag tag) { public void pasteConfig(ServerPlayer player, CompoundTag tag) { setAllowFlow(ManualIOMode.values()[tag.getInt("manualIO")]); setFilterMode(FilterMode.values()[tag.getInt("filterMode")]); - itemFilter = ItemFilter.loadFilter(ItemStack.of(tag.getCompound("filter"))); + itemFilter = Filters.loadItemFilter(ItemStack.of(tag.getCompound("filter"))); super.pasteConfig(player, tag); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/PumpCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/PumpCover.java index c2d9849fd39..1aabfc6fe15 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/PumpCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/PumpCover.java @@ -5,9 +5,9 @@ import com.gregtechceu.gtceu.api.capability.ICoverable; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.cover.*; +import com.gregtechceu.gtceu.api.cover.filter.Filter; import com.gregtechceu.gtceu.api.cover.filter.FilterHandler; import com.gregtechceu.gtceu.api.cover.filter.FilterHandlers; -import com.gregtechceu.gtceu.api.cover.filter.FluidFilter; import com.gregtechceu.gtceu.api.machine.ConditionalSubscriptionHandler; import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; @@ -85,7 +85,7 @@ public class PumpCover extends CoverBehavior implements IIOCover, IMuiCover, ICo @SaveField @SyncToClient - protected final FilterHandler filterHandler; + protected final FilterHandler> filterHandler; protected final ConditionalSubscriptionHandler subscriptionHandler; public PumpCover(CoverDefinition definition, ICoverable coverHolder, Direction attachedSide, int tier, diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/RobotArmCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/RobotArmCover.java index c929660023a..0a76ada49bf 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/RobotArmCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/RobotArmCover.java @@ -3,7 +3,7 @@ import com.gregtechceu.gtceu.api.capability.ICoverable; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.cover.CoverDefinition; -import com.gregtechceu.gtceu.api.cover.filter.ItemFilter; +import com.gregtechceu.gtceu.api.cover.filter.Filter; import com.gregtechceu.gtceu.api.cover.filter.SimpleItemFilter; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.common.cover.data.TransferMode; @@ -137,8 +137,8 @@ private int getFilteredItemAmount(ItemStack itemStack) { if (!filterHandler.isFilterPresent()) return globalTransferLimit; - ItemFilter filter = filterHandler.getFilter(); - return filter.supportsAmounts() ? filter.testItemCount(itemStack) : globalTransferLimit; + Filter filter = filterHandler.getFilter(); + return filter.supportsAmounts() ? filter.testAmount(itemStack) : globalTransferLimit; } public int getBuffer() { diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedFluidDetectorCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedFluidDetectorCover.java index da9648ad3c0..d525b153896 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedFluidDetectorCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedFluidDetectorCover.java @@ -3,9 +3,9 @@ import com.gregtechceu.gtceu.api.capability.ICoverable; import com.gregtechceu.gtceu.api.cover.CoverDefinition; import com.gregtechceu.gtceu.api.cover.IMuiCover; +import com.gregtechceu.gtceu.api.cover.filter.Filter; import com.gregtechceu.gtceu.api.cover.filter.FilterHandler; import com.gregtechceu.gtceu.api.cover.filter.FilterHandlers; -import com.gregtechceu.gtceu.api.cover.filter.FluidFilter; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.mui.GTGuiTextures; @@ -54,7 +54,7 @@ public class AdvancedFluidDetectorCover extends FluidDetectorCover implements IM @SaveField @SyncToClient @Getter - protected final FilterHandler filterHandler; + protected final FilterHandler> filterHandler; public AdvancedFluidDetectorCover(CoverDefinition definition, ICoverable coverHolder, Direction attachedSide) { super(definition, coverHolder, attachedSide); @@ -84,7 +84,7 @@ protected void update() { if (this.coverHolder.getOffsetTimer() % 20 != 0) return; - FluidFilter filter = filterHandler.getFilter(); + Filter filter = filterHandler.getFilter(); IFluidHandler fluidHandler = getFluidHandler(); if (fluidHandler == null) return; diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedItemDetectorCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedItemDetectorCover.java index 747b3ef1049..26f8761ddbb 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedItemDetectorCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedItemDetectorCover.java @@ -3,9 +3,9 @@ import com.gregtechceu.gtceu.api.capability.ICoverable; import com.gregtechceu.gtceu.api.cover.CoverDefinition; import com.gregtechceu.gtceu.api.cover.IMuiCover; +import com.gregtechceu.gtceu.api.cover.filter.Filter; import com.gregtechceu.gtceu.api.cover.filter.FilterHandler; import com.gregtechceu.gtceu.api.cover.filter.FilterHandlers; -import com.gregtechceu.gtceu.api.cover.filter.ItemFilter; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.mui.GTGuiTextures; @@ -51,7 +51,7 @@ public class AdvancedItemDetectorCover extends ItemDetectorCover implements IMui @SaveField @SyncToClient @Getter - protected final FilterHandler filterHandler; + protected final FilterHandler> filterHandler; public AdvancedItemDetectorCover(CoverDefinition definition, ICoverable coverHolder, Direction attachedSide) { super(definition, coverHolder, attachedSide); @@ -76,7 +76,7 @@ protected void update() { if (this.coverHolder.getOffsetTimer() % 20 != 0) return; - ItemFilter filter = filterHandler.getFilter(); + Filter filter = filterHandler.getFilter(); IItemHandler handler = getItemHandler(); if (handler == null) return; diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderFluidLinkCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderFluidLinkCover.java index 715f5e9c1a9..e55c1cae2c0 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderFluidLinkCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderFluidLinkCover.java @@ -2,9 +2,9 @@ import com.gregtechceu.gtceu.api.capability.ICoverable; import com.gregtechceu.gtceu.api.cover.CoverDefinition; +import com.gregtechceu.gtceu.api.cover.filter.Filter; import com.gregtechceu.gtceu.api.cover.filter.FilterHandler; import com.gregtechceu.gtceu.api.cover.filter.FilterHandlers; -import com.gregtechceu.gtceu.api.cover.filter.FluidFilter; import com.gregtechceu.gtceu.api.misc.virtualregistry.EntryTypes; import com.gregtechceu.gtceu.api.misc.virtualregistry.VirtualEntry; import com.gregtechceu.gtceu.api.misc.virtualregistry.entries.VirtualTank; @@ -43,7 +43,7 @@ public class EnderFluidLinkCover extends AbstractEnderLinkCover { @Getter @SaveField @SyncToClient - protected final FilterHandler filterHandler; + protected final FilterHandler> filterHandler; protected int mBLeftToTransferLastSecond; public EnderFluidLinkCover(CoverDefinition definition, ICoverable coverHolder, Direction attachedSide) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderItemLinkCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderItemLinkCover.java index 94ad94e6f2a..a40d6d1385f 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderItemLinkCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderItemLinkCover.java @@ -2,9 +2,9 @@ import com.gregtechceu.gtceu.api.capability.ICoverable; import com.gregtechceu.gtceu.api.cover.CoverDefinition; +import com.gregtechceu.gtceu.api.cover.filter.Filter; import com.gregtechceu.gtceu.api.cover.filter.FilterHandler; import com.gregtechceu.gtceu.api.cover.filter.FilterHandlers; -import com.gregtechceu.gtceu.api.cover.filter.ItemFilter; import com.gregtechceu.gtceu.api.misc.virtualregistry.EntryTypes; import com.gregtechceu.gtceu.api.misc.virtualregistry.VirtualEntry; import com.gregtechceu.gtceu.api.misc.virtualregistry.entries.VirtualItemStorage; @@ -41,7 +41,7 @@ public class EnderItemLinkCover extends AbstractEnderLinkCover filterHandler; + protected FilterHandler> filterHandler; public EnderItemLinkCover(CoverDefinition definition, ICoverable coverHolder, Direction attachedSide) { super(definition, coverHolder, attachedSide); diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/AdvancedFluidVoidingCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/AdvancedFluidVoidingCover.java index f858a0601ee..e6a715df02f 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/AdvancedFluidVoidingCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/AdvancedFluidVoidingCover.java @@ -2,7 +2,7 @@ import com.gregtechceu.gtceu.api.capability.ICoverable; import com.gregtechceu.gtceu.api.cover.CoverDefinition; -import com.gregtechceu.gtceu.api.cover.filter.FluidFilter; +import com.gregtechceu.gtceu.api.cover.filter.Filter; import com.gregtechceu.gtceu.api.cover.filter.SimpleFluidFilter; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; @@ -95,8 +95,8 @@ private int getFilteredFluidAmount(FluidStack fluidStack) { if (!filterHandler.isFilterPresent()) return globalTransferSizeMillibuckets; - FluidFilter filter = filterHandler.getFilter(); - return filter.isBlackList() ? globalTransferSizeMillibuckets : filter.testFluidAmount(fluidStack); + Filter filter = filterHandler.getFilter(); + return filter.isBlackList() ? globalTransferSizeMillibuckets : filter.testAmount(fluidStack); } public void setVoidingMode(VoidingMode voidingMode) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/AdvancedItemVoidingCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/AdvancedItemVoidingCover.java index a4b43f19a42..ea78a012480 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/AdvancedItemVoidingCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/AdvancedItemVoidingCover.java @@ -2,7 +2,7 @@ import com.gregtechceu.gtceu.api.capability.ICoverable; import com.gregtechceu.gtceu.api.cover.CoverDefinition; -import com.gregtechceu.gtceu.api.cover.filter.ItemFilter; +import com.gregtechceu.gtceu.api.cover.filter.Filter; import com.gregtechceu.gtceu.api.cover.filter.SimpleItemFilter; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; @@ -98,8 +98,8 @@ private int getFilteredItemAmount(ItemStack itemStack) { if (!filterHandler.isFilterPresent()) return globalVoidingLimit; - ItemFilter filter = filterHandler.getFilter(); - return filter.isBlackList() ? globalVoidingLimit : filter.testItemCount(itemStack); + Filter filter = filterHandler.getFilter(); + return filter.isBlackList() ? globalVoidingLimit : filter.testAmount(itemStack); } public void setVoidingMode(VoidingMode voidingMode) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/ItemVoidingCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/ItemVoidingCover.java index ec4ff903959..7bb3ee63dac 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/ItemVoidingCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/ItemVoidingCover.java @@ -3,7 +3,7 @@ import com.gregtechceu.gtceu.api.capability.IControllable; import com.gregtechceu.gtceu.api.capability.ICoverable; import com.gregtechceu.gtceu.api.cover.CoverDefinition; -import com.gregtechceu.gtceu.api.cover.filter.ItemFilter; +import com.gregtechceu.gtceu.api.cover.filter.Filter; import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.common.cover.ConveyorCover; import com.gregtechceu.gtceu.common.mui.GTGuiTextures; @@ -67,7 +67,7 @@ protected void doVoidItems() { } void voidAny(IItemHandler handler) { - ItemFilter filter = filterHandler.getFilter(); + Filter filter = filterHandler.getFilter(); for (int slot = 0; slot < handler.getSlots(); slot++) { ItemStack sourceStack = handler.extractItem(slot, Integer.MAX_VALUE, true); diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java index 8e61ec82814..12223b050d6 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java @@ -1798,7 +1798,8 @@ public static ItemEntry createFluidCell(Material mat, int capacit public static ItemEntry TAG_FILTER = REGISTRATE .item("item_tag_filter", ComponentItem::create) .lang("Item Tag Filter") - .onRegister(attach(new ItemFilterBehaviour(TagItemFilter::new), + .onRegister(attach( + new ItemFilterBehaviour(stack -> new TagFilter<>(stack, ItemStack::getItem, ItemStack::getTags)), new CoverPlaceBehavior(GTCovers.ITEM_FILTER))) .onRegister(materialInfo(new ItemMaterialInfo(new MaterialStack(GTMaterials.Zinc, GTValues.M * 2)))) .register(); @@ -1816,7 +1817,9 @@ public static ItemEntry createFluidCell(Material mat, int capacit .register(); public static ItemEntry TAG_FLUID_FILTER = REGISTRATE.item("fluid_tag_filter", ComponentItem::create) .lang("Fluid Tag Filter") - .onRegister(attach(new FluidFilterBehaviour(TagFluidFilter::new), + .onRegister(attach( + new FluidFilterBehaviour(stack -> new TagFilter<>(stack, FluidStack::getFluid, + f -> f.getFluid().defaultFluidState().getTags())), new CoverPlaceBehavior(GTCovers.FLUID_FILTER))) .onRegister(materialInfo(new ItemMaterialInfo(new MaterialStack(GTMaterials.Zinc, GTValues.M * 3 / 2)))) .register(); diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTPlaceholders.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTPlaceholders.java index b84b32de7e2..9f53fad533f 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTPlaceholders.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTPlaceholders.java @@ -2,7 +2,8 @@ import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.capability.*; -import com.gregtechceu.gtceu.api.cover.filter.ItemFilter; +import com.gregtechceu.gtceu.api.cover.filter.Filter; +import com.gregtechceu.gtceu.api.cover.filter.Filters; import com.gregtechceu.gtceu.api.item.ComponentItem; import com.gregtechceu.gtceu.api.item.IComponentItem; import com.gregtechceu.gtceu.api.item.component.IDataItem; @@ -81,7 +82,7 @@ public static int countFluids(@Nullable String id, @Nullable IFluidHandler fluid return cnt; } - public static int countItems(@Nullable ItemFilter filter, @Nullable IItemHandler itemHandler) { + public static int countItems(@Nullable Filter filter, @Nullable IItemHandler itemHandler) { if (itemHandler == null) return -1; int cnt = 0; @@ -155,7 +156,8 @@ public MultiLineComponent apply(PlaceholderContext ctx, List args) throws PlaceholderException { if (ctx.pos() == null) throw new NoTargetException(); IItemHandler itemHandler = GTCapabilityHelper.getItemHandler(ctx.level(), ctx.pos(), ctx.side()); - if (args.isEmpty()) return MultiLineComponent.literal(countItems((ItemFilter) null, itemHandler)); + if (args.isEmpty()) + return MultiLineComponent.literal(countItems((Filter) null, itemHandler)); if (args.size() == 1) return MultiLineComponent .literal(countItems(GTStringUtils.componentsToString(args.get(0)), itemHandler)); if (GTStringUtils.equals(args.get(0), "filter")) { @@ -165,7 +167,7 @@ public MultiLineComponent apply(PlaceholderContext ctx, PlaceholderUtils.checkRange("slot index", 1, ctx.itemStackHandler().getSlots(), slot); try { return MultiLineComponent.literal(countItems( - ItemFilter.loadFilter(ctx.itemStackHandler().getStackInSlot(slot - 1)), itemHandler)); + Filters.loadItemFilter(ctx.itemStackHandler().getStackInSlot(slot - 1)), itemHandler)); } catch (NullPointerException e) { throw new MissingItemException("filter", slot); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/behavior/FluidFilterBehaviour.java b/src/main/java/com/gregtechceu/gtceu/common/item/behavior/FluidFilterBehaviour.java index 29da151b0f1..29df9ea4fec 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/behavior/FluidFilterBehaviour.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/behavior/FluidFilterBehaviour.java @@ -1,6 +1,7 @@ package com.gregtechceu.gtceu.common.item.behavior; -import com.gregtechceu.gtceu.api.cover.filter.FluidFilter; +import com.gregtechceu.gtceu.api.cover.filter.Filter; +import com.gregtechceu.gtceu.api.cover.filter.Filters; import com.gregtechceu.gtceu.api.mui.IItemUIHolder; import net.minecraft.world.InteractionHand; @@ -9,6 +10,7 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; +import net.minecraftforge.fluids.FluidStack; import brachy.modularui.factory.PlayerInventoryGuiData; import brachy.modularui.factory.UIFactories; @@ -18,11 +20,11 @@ import java.util.function.Function; -public record FluidFilterBehaviour(Function filterCreator) implements IItemUIHolder { +public record FluidFilterBehaviour(Function> filterCreator) implements IItemUIHolder { @Override public void onAttached(Item item) { - FluidFilter.FILTERS.put(item, filterCreator); + Filters.registerFilter(FluidStack.class, item, filterCreator); } @Override @@ -38,6 +40,6 @@ public InteractionResultHolder use(Item item, Level level, Player pla @Override public ModularPanel buildUI(PlayerInventoryGuiData data, PanelSyncManager syncManager, UISettings settings) { - return FluidFilter.loadFilter(data.getUsedItemStack()).getPanel(data, syncManager, settings); + return Filters.loadFluidFilter(data.getUsedItemStack()).getPanel(data, syncManager, settings); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/behavior/ItemFilterBehaviour.java b/src/main/java/com/gregtechceu/gtceu/common/item/behavior/ItemFilterBehaviour.java index 54bf60c67dc..9fca62547f4 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/behavior/ItemFilterBehaviour.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/behavior/ItemFilterBehaviour.java @@ -1,6 +1,7 @@ package com.gregtechceu.gtceu.common.item.behavior; -import com.gregtechceu.gtceu.api.cover.filter.ItemFilter; +import com.gregtechceu.gtceu.api.cover.filter.Filter; +import com.gregtechceu.gtceu.api.cover.filter.Filters; import com.gregtechceu.gtceu.api.item.component.IInteractionItem; import com.gregtechceu.gtceu.api.mui.IItemUIHolder; @@ -19,12 +20,12 @@ import java.util.function.Function; -public record ItemFilterBehaviour(Function filterCreator) +public record ItemFilterBehaviour(Function> filterCreator) implements IInteractionItem, IItemUIHolder { @Override public void onAttached(Item item) { - ItemFilter.FILTERS.put(item, filterCreator); + Filters.registerFilter(ItemStack.class, item, filterCreator); } @Override @@ -40,16 +41,6 @@ public InteractionResultHolder use(Item item, Level level, Player pla @Override public ModularPanel buildUI(PlayerInventoryGuiData data, PanelSyncManager syncManager, UISettings settings) { - return ItemFilter.loadFilter(data.getUsedItemStack()).getPanel(data, syncManager, settings); + return Filters.loadItemFilter(data.getUsedItemStack()).getPanel(data, syncManager, settings); } - - // @Override - // public ModularUI createUI(HeldItemUIFactory.HeldItemHolder holder, Player entityPlayer) { - // var held = holder.getHeld(); - // return new ModularUI(176, 157, holder, entityPlayer) - // .background(GuiTextures.BACKGROUND) - // .widget(new LabelWidget(5, 5, held.getDescriptionId())) - // .widget(ItemFilter.loadFilter(held).openConfigurator((176 - 80) / 2, (60 - 55) / 2 + 15)) - // .widget(UITemplate.bindPlayerInventory(entityPlayer.getInventory(), GuiTextures.SLOT, 7, 75, true)); - // } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/behavior/ItemMagnetBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/behavior/ItemMagnetBehavior.java index 5d64b8d5ec2..c637ec96b52 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/behavior/ItemMagnetBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/behavior/ItemMagnetBehavior.java @@ -4,9 +4,7 @@ import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; import com.gregtechceu.gtceu.api.capability.IElectricItem; -import com.gregtechceu.gtceu.api.cover.filter.ItemFilter; -import com.gregtechceu.gtceu.api.cover.filter.SimpleItemFilter; -import com.gregtechceu.gtceu.api.cover.filter.TagItemFilter; +import com.gregtechceu.gtceu.api.cover.filter.*; import com.gregtechceu.gtceu.api.item.ComponentItem; import com.gregtechceu.gtceu.api.item.IComponentItem; import com.gregtechceu.gtceu.api.item.component.IAddInformation; @@ -83,27 +81,29 @@ public ModularPanel buildUI(PlayerInventoryGuiData data, PanelSyncManager ItemStack held = data.getUsedItemStack(); CompoundTag heldTag = held.getOrCreateTag(); - Filter selectedFilter = Filter.get(heldTag.getInt(FILTER_ORDINAL_TAG)); - Map stacks = new EnumMap<>(Filter.class); + FilterMode selectedFilterMode = FilterMode.get(heldTag.getInt(FILTER_ORDINAL_TAG)); + Map stacks = new EnumMap<>(FilterMode.class); CompoundTag startFilterTag = heldTag.getCompound(FILTER_TAG).copy(); - for (Filter filter : Filter.values()) { - ItemStack stack = filter.getFilter(held); + for (FilterMode filterMode : FilterMode.values()) { + ItemStack stack = filterMode.getFilter(held); stack.setTag(startFilterTag.copy()); - stacks.put(filter, stack); + stacks.put(filterMode, stack); } - EnumSyncValue filterSync = new EnumSyncValue<>(Filter.class, - () -> Filter.get(data.getUsedItemStack().getOrCreateTag().getInt(FILTER_ORDINAL_TAG)), - filter -> data.getUsedItemStack().getOrCreateTag().putInt(FILTER_ORDINAL_TAG, filter.ordinal())) + EnumSyncValue filterSync = new EnumSyncValue<>(FilterMode.class, + () -> FilterMode.get(data.getUsedItemStack().getOrCreateTag().getInt(FILTER_ORDINAL_TAG)), + filterMode -> data.getUsedItemStack().getOrCreateTag().putInt(FILTER_ORDINAL_TAG, filterMode.ordinal())) .allowC2S(); PagedWidget pages = new PagedWidget<>() .left((176 - 80) / 2) .top((60 - 55) / 2 + 15) .size(80, 55) - .initialPage(selectedFilter.ordinal()) - .addPage(createSimpleFilterPage((SimpleItemFilter) ItemFilter.loadFilter(stacks.get(Filter.SIMPLE)))) - .addPage(createTagFilterPage((TagItemFilter) ItemFilter.loadFilter(stacks.get(Filter.TAG)))); + .initialPage(selectedFilterMode.ordinal()) + .addPage(createSimpleFilterPage( + (SimpleItemFilter) Filters.loadItemFilter(stacks.get(FilterMode.SIMPLE)))) + .addPage(createTagFilterPage( + (TagFilter) Filters.loadItemFilter(stacks.get(FilterMode.TAG)))); pages.onUpdateListener(widget -> { int selected = filterSync.getIntValue(); if (selected != widget.getCurrentPageIndex()) { @@ -114,7 +114,7 @@ public ModularPanel buildUI(PlayerInventoryGuiData data, PanelSyncManager syncManager.addCloseListener(player -> { ItemStack stack = data.getUsedItemStack(); CompoundTag tag = stack.getOrCreateTag(); - Filter selected = Filter.get(tag.getInt(FILTER_ORDINAL_TAG)); + FilterMode selected = FilterMode.get(tag.getInt(FILTER_ORDINAL_TAG)); tag.put(FILTER_TAG, stacks.get(selected).getOrCreateTag().copy()); }); @@ -130,9 +130,10 @@ public ModularPanel buildUI(PlayerInventoryGuiData data, PanelSyncManager .top(5) .size(20) .value(filterSync) - .stateCount(Filter.values().length) - .stateOverlay(Filter.SIMPLE, new ItemDrawable(GTItems.ITEM_FILTER.asItem()).asIcon().size(16)) - .stateOverlay(Filter.TAG, new ItemDrawable(GTItems.TAG_FILTER.asItem()).asIcon().size(16)) + .stateCount(FilterMode.values().length) + .stateOverlay(FilterMode.SIMPLE, + new ItemDrawable(GTItems.ITEM_FILTER.asItem()).asIcon().size(16)) + .stateOverlay(FilterMode.TAG, new ItemDrawable(GTItems.TAG_FILTER.asItem()).asIcon().size(16)) .tooltipBuilder(r -> r.addLine(Text.dynamic( () -> Component.translatable(filterSync.getValue().getTooltip()))))) .child(pages) @@ -165,7 +166,7 @@ private ParentWidget createSimpleFilterPage(SimpleItemFilter filter) { .child(filterButtons.left(58).top(0)); } - private ParentWidget createTagFilterPage(TagItemFilter filter) { + private ParentWidget createTagFilterPage(TagFilter filter) { StringSyncValue filterString = new StringSyncValue(filter::getFilterString, filter::setFilterString).allowC2S(); RichTooltip infoTooltip = new RichTooltip().add("cover.tag_filter.info"); @@ -233,7 +234,7 @@ public void inventoryTick(ItemStack stack, Level level, Entity entity, int slotI new AABB(entity.getX(), entity.getY(), entity.getZ(), entity.getX(), entity.getY(), entity.getZ()) .inflate(range, range, range)); - ItemFilter filter = null; + Filter filter = null; boolean didMoveEntity = false; for (ItemEntity itemEntity : items) { if (itemEntity.isRemoved()) { @@ -257,7 +258,7 @@ public void inventoryTick(ItemStack stack, Level level, Entity entity, int slotI if (!world.isClientSide) { if (filter == null) { - filter = Filter.get(stack.getOrCreateTag().getInt(FILTER_ORDINAL_TAG)).loadFilter(stack); + filter = FilterMode.get(stack.getOrCreateTag().getInt(FILTER_ORDINAL_TAG)).loadFilter(stack); } if (!filter.test(itemEntity.getItem())) { @@ -363,7 +364,7 @@ public static boolean hasMagnetCurios(Player player) { } } - public enum Filter { + public enum FilterMode { SIMPLE(GTItems.ITEM_FILTER, "item_filter"), TAG(GTItems.TAG_FILTER, "item_tag_filter"); @@ -371,7 +372,7 @@ public enum Filter { public final ItemEntry item; public final String texture; - Filter(ItemEntry item, String texture) { + FilterMode(ItemEntry item, String texture) { this.item = item; this.texture = texture; } @@ -383,13 +384,13 @@ public ItemStack getFilter(ItemStack magnet) { return mockStack; } - public ItemFilter loadFilter(ItemStack magnet) { + public Filter loadFilter(ItemStack magnet) { var stack = getFilter(magnet); - return ItemFilter.loadFilter(stack); + return Filters.loadItemFilter(stack); } - public static Filter get(int ordinal) { - return Filter.values()[ordinal]; + public static FilterMode get(int ordinal) { + return FilterMode.values()[ordinal]; } public @NotNull String getTooltip() { diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ItemCollectorMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ItemCollectorMachine.java index bd14bf21e00..1fc7233394a 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ItemCollectorMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ItemCollectorMachine.java @@ -4,7 +4,8 @@ import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; import com.gregtechceu.gtceu.api.capability.IWorkable; import com.gregtechceu.gtceu.api.capability.recipe.IO; -import com.gregtechceu.gtceu.api.cover.filter.ItemFilter; +import com.gregtechceu.gtceu.api.cover.filter.Filter; +import com.gregtechceu.gtceu.api.cover.filter.Filters; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.TieredEnergyMachine; import com.gregtechceu.gtceu.api.machine.feature.IMuiMachine; @@ -202,9 +203,9 @@ public void update() { } public void moveItemsInRange() { - ItemFilter filter = null; + Filter filter = null; if (!filterInventory.getStackInSlot(0).isEmpty()) - filter = ItemFilter.loadFilter(filterInventory.getStackInSlot(0)); + filter = Filters.loadItemFilter(filterInventory.getStackInSlot(0)); BlockPos centerPos = self().getBlockPos().above(); List itemEntities = getLevel().getEntitiesOfClass(ItemEntity.class, aabb); diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ItemBusPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ItemBusPartMachine.java index 4e1dee83d4a..cb060f4edf7 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ItemBusPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ItemBusPartMachine.java @@ -3,9 +3,9 @@ import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.blockentity.IPaintable; import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.cover.filter.Filter; import com.gregtechceu.gtceu.api.cover.filter.FilterHandler; import com.gregtechceu.gtceu.api.cover.filter.FilterHandlers; -import com.gregtechceu.gtceu.api.cover.filter.ItemFilter; import com.gregtechceu.gtceu.api.machine.MachineDefinition; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.feature.IHasCircuitSlot; @@ -73,7 +73,7 @@ public class ItemBusPartMachine extends TieredIOPartMachine @SaveField @SyncToClient @Getter - protected final FilterHandler filterHandler; + protected final FilterHandler> filterHandler; public ItemBusPartMachine(BlockEntityCreationInfo info, int tier, IO io) { super(info, tier, io); diff --git a/src/main/java/com/gregtechceu/gtceu/common/mui/GTMuiWidgets.java b/src/main/java/com/gregtechceu/gtceu/common/mui/GTMuiWidgets.java index b4e93736ffe..f87fd638fdc 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/mui/GTMuiWidgets.java +++ b/src/main/java/com/gregtechceu/gtceu/common/mui/GTMuiWidgets.java @@ -364,11 +364,11 @@ public static CycleButtonWidget createIOCycleButton(EnumSyncValue syncValue, return cycleButton; } - public static > ParentWidget createFilterRow(Flow existingRow, - FilterHandler filterHandler, - SidedPosGuiData data, - PanelSyncManager syncManager, - UISettings settings) { + public static > ParentWidget createFilterRow(Flow existingRow, + FilterHandler filterHandler, + SidedPosGuiData data, + PanelSyncManager syncManager, + UISettings settings) { var filterSlot = filterHandler.getFilterSlot(); ModularSlot modSlot = new ModularSlot(filterSlot, 0) @@ -393,10 +393,10 @@ public static > ParentWidget createFilterRow(Flow e .setEnabledIf((w) -> !filterSlotHandler.getSlot().getItem().isEmpty())); } - public static > ParentWidget createFilterRow(FilterHandler filterHandler, - SidedPosGuiData data, - PanelSyncManager syncManager, - UISettings settings) { + public static > ParentWidget createFilterRow(FilterHandler filterHandler, + SidedPosGuiData data, + PanelSyncManager syncManager, + UISettings settings) { Flow row = Flow.row().coverChildrenHeight().childPadding(2); return createFilterRow(row, filterHandler, data, syncManager, settings); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/pipelike/item/ItemNetHandler.java b/src/main/java/com/gregtechceu/gtceu/common/pipelike/item/ItemNetHandler.java index 7e16934cd12..5a16fba8e09 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/pipelike/item/ItemNetHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/common/pipelike/item/ItemNetHandler.java @@ -4,7 +4,7 @@ import com.gregtechceu.gtceu.api.capability.ICoverable; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.cover.CoverBehavior; -import com.gregtechceu.gtceu.api.cover.filter.ItemFilter; +import com.gregtechceu.gtceu.api.cover.filter.Filter; import com.gregtechceu.gtceu.api.cover.filter.SimpleItemFilter; import com.gregtechceu.gtceu.common.blockentity.ItemPipeBlockEntity; import com.gregtechceu.gtceu.common.cover.ConveyorCover; @@ -314,7 +314,7 @@ private ItemStack insertIntoDestination(IItemHandler handler, ItemStack stack, b /// Insert into a destination through a robot arm private ItemStack insertOverRobotArm(IItemHandler handler, RobotArmCover arm, ItemStack stack, boolean simulate, int allowed, boolean ignoreLimit) { - int rate = arm.getFilterHandler().getFilter().testItemCount(stack); + int rate = arm.getFilterHandler().getFilter().testAmount(stack); int count; switch (arm.getTransferMode()) { case TRANSFER_ANY: @@ -348,7 +348,7 @@ private ItemStack insertOverRobotArm(IItemHandler handler, RobotArmCover arm, It public static int countStack(IItemHandler handler, ItemStack stack, RobotArmCover arm) { if (arm == null) return 0; int count = 0; - ItemFilter filter = arm.getFilterHandler().getFilter(); + Filter filter = arm.getFilterHandler().getFilter(); boolean ignoreNBT = filter instanceof SimpleItemFilter simple && simple.isIgnoreNbt(); for (int i = 0; i < handler.getSlots(); i++) { ItemStack slot = handler.getStackInSlot(i); diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/CustomToolRecipes.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/CustomToolRecipes.java index e654851a7cd..58724ffebc8 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/CustomToolRecipes.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/CustomToolRecipes.java @@ -2,7 +2,7 @@ import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; -import com.gregtechceu.gtceu.api.cover.filter.ItemFilter; +import com.gregtechceu.gtceu.api.cover.filter.Filters; import com.gregtechceu.gtceu.api.cover.filter.SimpleItemFilter; import com.gregtechceu.gtceu.api.data.chemical.material.Material; import com.gregtechceu.gtceu.api.data.chemical.material.properties.PropertyKey; @@ -222,8 +222,8 @@ private static void registerElectricRecipes(@NotNull Consumer pr { var magnetStack = GTItems.ITEM_MAGNET_LV.asStack(); var tag = magnetStack.getOrCreateTag(); - var filter = (SimpleItemFilter) ItemFilter - .loadFilter(ItemMagnetBehavior.Filter.SIMPLE.getFilter(magnetStack)); + var filter = (SimpleItemFilter) Filters + .loadItemFilter(ItemMagnetBehavior.FilterMode.SIMPLE.getFilter(magnetStack)); filter.setBlackList(true); tag.put(ItemMagnetBehavior.FILTER_TAG, filter.saveFilter()); VanillaRecipeHelper.addShapedEnergyTransferRecipe(provider, true, false, true, @@ -265,8 +265,8 @@ private static void registerElectricRecipes(@NotNull Consumer pr { var magnetStack = GTItems.ITEM_MAGNET_HV.asStack(); var tag = magnetStack.getOrCreateTag(); - var filter = (SimpleItemFilter) ItemFilter - .loadFilter(ItemMagnetBehavior.Filter.SIMPLE.getFilter(magnetStack)); + var filter = (SimpleItemFilter) Filters + .loadItemFilter(ItemMagnetBehavior.FilterMode.SIMPLE.getFilter(magnetStack)); filter.setBlackList(true); tag.put(ItemMagnetBehavior.FILTER_TAG, filter.saveFilter()); VanillaRecipeHelper.addShapedEnergyTransferRecipe(provider, true, false, true, diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/GTAEPlaceholders.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/GTAEPlaceholders.java index 4db30093561..5f416ac1a03 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/GTAEPlaceholders.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/GTAEPlaceholders.java @@ -1,6 +1,7 @@ package com.gregtechceu.gtceu.integration.ae2; -import com.gregtechceu.gtceu.api.cover.filter.ItemFilter; +import com.gregtechceu.gtceu.api.cover.filter.Filter; +import com.gregtechceu.gtceu.api.cover.filter.Filters; import com.gregtechceu.gtceu.api.placeholder.*; import com.gregtechceu.gtceu.api.placeholder.exceptions.*; import com.gregtechceu.gtceu.utils.GTStringUtils; @@ -65,7 +66,7 @@ private static long countItems(String id, IGrid grid) { return grid.getStorageService().getInventory().getAvailableStacks().get(stack.what()); } - private static long countItems(@Nullable ItemFilter filter, IGrid grid) { + private static long countItems(@Nullable Filter filter, IGrid grid) { KeyCounter stacks = grid.getStorageService().getCachedInventory(); long count = 0; for (var stack : stacks) { @@ -106,7 +107,7 @@ public static void init() { public MultiLineComponent apply(PlaceholderContext ctx, List args) throws PlaceholderException { IGrid grid = getGrid(ctx); - if (args.isEmpty()) return MultiLineComponent.literal(countItems((ItemFilter) null, grid)); + if (args.isEmpty()) return MultiLineComponent.literal(countItems((Filter) null, grid)); if (args.size() == 1) return MultiLineComponent.literal(countItems(GTStringUtils.componentsToString(args.get(0)), grid)); if (GTStringUtils.equals(args.get(0), "filter")) { @@ -115,7 +116,7 @@ public MultiLineComponent apply(PlaceholderContext ctx, PlaceholderUtils.checkRange("slot index", 1, 8, slot); if (ctx.itemStackHandler() == null) throw new NotSupportedException(); return MultiLineComponent.literal(countItems( - ItemFilter.loadFilter(ctx.itemStackHandler().getStackInSlot(slot - 1)), grid)); + Filters.loadItemFilter(ctx.itemStackHandler().getStackInSlot(slot - 1)), grid)); } catch (NullPointerException e) { throw new MissingItemException("filter", slot); } From c5989fc6eb7c0bfd04cc6ffe50b363f5dc28f94d Mon Sep 17 00:00:00 2001 From: Gustavo Date: Fri, 19 Jun 2026 00:41:36 +1000 Subject: [PATCH 03/12] update filter handler --- .../gtceu/api/cover/filter/FilterHandler.java | 25 +++-- .../api/cover/filter/FilterHandlers.java | 54 ----------- .../gtceu/api/cover/filter/Filters.java | 96 ++++++------------- .../gtceu/common/cover/ConveyorCover.java | 3 +- .../gtceu/common/cover/PumpCover.java | 3 +- .../detector/AdvancedFluidDetectorCover.java | 3 +- .../detector/AdvancedItemDetectorCover.java | 3 +- .../cover/ender/EnderFluidLinkCover.java | 3 +- .../cover/ender/EnderItemLinkCover.java | 3 +- .../multiblock/part/ItemBusPartMachine.java | 3 +- 10 files changed, 55 insertions(+), 141 deletions(-) delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandlers.java diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandler.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandler.java index 0e6ed4bb9b0..b48e92f5436 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandler.java @@ -22,12 +22,13 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public abstract class FilterHandler> implements ISyncManaged { +public class FilterHandler> implements ISyncManaged { @Getter private final SyncDataHolder syncDataHolder = new SyncDataHolder(this); private final ISyncManaged container; + private final Class filterableType; @SaveField @SyncToClient @@ -41,28 +42,38 @@ public abstract class FilterHandler> implements ISyncMana private Runnable onFilterRemoved = () -> {}; private Consumer onFilterUpdated = (filter) -> {}; - public FilterHandler(ISyncManaged container) { + /** + * + * @param container The machine/pipe/cover/etc this filter handler is attached to. + * @param filterableType The stack/object type which this filter handler should hold filters for. + */ + public FilterHandler(ISyncManaged container, Class filterableType) { this.container = container; + this.filterableType = filterableType; } - public abstract F loadFilter(ItemStack filterItem); - - protected abstract F getEmptyFilter(); + @SuppressWarnings("unchecked") + public F loadFilter(ItemStack filterItem) { + return (F) Filters.loadFilter(filterableType, filterItem); + } ////////////////////////////////// // ***** PUBLIC API ******// ////////////////////////////////// - public abstract boolean canInsertFilterItem(ItemStack itemStack); + public boolean canInsertFilterItem(ItemStack itemStack) { + return Filters.isValidFilter(filterableType, itemStack.getItem()); + } public boolean isFilterPresent() { return filter != null || !filterItem.isEmpty(); } + @SuppressWarnings("unchecked") public F getFilter() { if (this.filter == null) { if (this.filterItem.isEmpty()) { - return getEmptyFilter(); + return (F) Filters.getEmptyFilter(); } else { loadFilterFromItem(); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandlers.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandlers.java deleted file mode 100644 index 5ff84b7598a..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandlers.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.gregtechceu.gtceu.api.cover.filter; - -import com.gregtechceu.gtceu.api.sync_system.managed.ISyncManaged; - -import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.world.item.ItemStack; -import net.minecraftforge.fluids.FluidStack; - -import javax.annotation.ParametersAreNonnullByDefault; - -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -public interface FilterHandlers { - - static FilterHandler> item(ISyncManaged container) { - return new FilterHandler<>(container) { - - @Override - public Filter loadFilter(ItemStack filterItem) { - return Filters.loadItemFilter(filterItem); - } - - @Override - protected Filter getEmptyFilter() { - return Filters.EMPTY_ITEM; - } - - @Override - public boolean canInsertFilterItem(ItemStack itemStack) { - return Filters.isValidFilter(ItemStack.class, itemStack.getItem()); - } - }; - } - - static FilterHandler> fluid(ISyncManaged container) { - return new FilterHandler<>(container) { - - @Override - public Filter loadFilter(ItemStack filterItem) { - return Filters.loadFluidFilter(filterItem); - } - - @Override - protected Filter getEmptyFilter() { - return Filters.EMPTY_FLUID; - } - - @Override - public boolean canInsertFilterItem(ItemStack itemStack) { - return Filters.isValidFilter(FluidStack.class, itemStack.getItem()); - } - }; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/Filters.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/Filters.java index e45273afbc2..349246bdd7a 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/Filters.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/Filters.java @@ -12,9 +12,9 @@ import brachy.modularui.widgets.layout.Flow; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import org.apache.commons.lang3.NotImplementedException; +import org.jetbrains.annotations.Nullable; import java.util.Map; -import java.util.function.Consumer; import java.util.function.Function; public class Filters { @@ -46,71 +46,35 @@ public static boolean isValidFilter(Class filterableType, Item item) { return FILTERS.get(item).filterable == filterableType; } - public static final Filter EMPTY_ITEM = new Filter<>(ItemStack.EMPTY) { - - @Override - public int testAmount(ItemStack itemStack) { - return Integer.MAX_VALUE; - } - - @Override - public boolean test(ItemStack itemStack) { - return true; - } - - @Override - public ModularPanel getPanel(GuiData data, PanelSyncManager syncManager, UISettings settings) { - return null; - } - - @Override - public Flow getFilterUI(GuiData data, PanelSyncManager syncManager, UISettings settings) { - return null; - } - - @Override - public CompoundTag saveFilter() { - throw new NotImplementedException("Not available for empty item filter"); - } - - @Override - public void setOnUpdated(Consumer> onUpdated) { - throw new NotImplementedException("Not available for empty item filter"); - } - }; - - public static final Filter EMPTY_FLUID = new Filter<>(ItemStack.EMPTY) { - - @Override - public boolean test(FluidStack fluidStack) { - return true; - } - - @Override - public int testAmount(FluidStack fluidStack) { - return Integer.MAX_VALUE; - } - - @Override - public ModularPanel getPanel(GuiData data, PanelSyncManager syncManager, UISettings settings) { - return null; - } - - @Override - public Flow getFilterUI(GuiData data, PanelSyncManager syncManager, UISettings settings) { - return null; - } - - @Override - public CompoundTag saveFilter() { - throw new NotImplementedException("Not available for empty fluid filter"); - } - - @Override - public void setOnUpdated(Consumer> onUpdated) { - throw new NotImplementedException("Not available for empty fluid filter"); - } - }; + public static Filter getEmptyFilter() { + return new Filter<>(ItemStack.EMPTY) { + + @Override + public ModularPanel getPanel(GuiData data, PanelSyncManager syncManager, UISettings settings) { + throw new NotImplementedException("Cannot open UI for empty filter"); + } + + @Override + public Flow getFilterUI(GuiData data, PanelSyncManager syncManager, UISettings settings) { + throw new NotImplementedException("Cannot open UI for empty filter"); + } + + @Override + protected @Nullable CompoundTag saveFilter() { + throw new NotImplementedException("Cannot save empty filter"); + } + + @Override + public boolean test(T t) { + return true; + } + + @Override + public int testAmount(T stack) { + return Integer.MAX_VALUE; + } + }; + } /** * @param filterable The object/stack type that this filter supports. diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/ConveyorCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/ConveyorCover.java index de6f401edaa..8c46bee3ce2 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/ConveyorCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ConveyorCover.java @@ -7,7 +7,6 @@ import com.gregtechceu.gtceu.api.cover.*; import com.gregtechceu.gtceu.api.cover.filter.Filter; import com.gregtechceu.gtceu.api.cover.filter.FilterHandler; -import com.gregtechceu.gtceu.api.cover.filter.FilterHandlers; import com.gregtechceu.gtceu.api.machine.ConditionalSubscriptionHandler; import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; @@ -101,7 +100,7 @@ public ConveyorCover(CoverDefinition definition, ICoverable coverHolder, Directi this.distributionMode = DistributionMode.INSERT_FIRST; subscriptionHandler = new ConditionalSubscriptionHandler(coverHolder, this::update, this::isSubscriptionActive); - filterHandler = FilterHandlers.item(this) + filterHandler = new FilterHandler<>(this, ItemStack.class) .onFilterLoaded(f -> configureFilter()) .onFilterUpdated(f -> configureFilter()) .onFilterRemoved(this::configureFilter); diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/PumpCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/PumpCover.java index 1aabfc6fe15..1951f38b508 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/PumpCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/PumpCover.java @@ -7,7 +7,6 @@ import com.gregtechceu.gtceu.api.cover.*; import com.gregtechceu.gtceu.api.cover.filter.Filter; import com.gregtechceu.gtceu.api.cover.filter.FilterHandler; -import com.gregtechceu.gtceu.api.cover.filter.FilterHandlers; import com.gregtechceu.gtceu.api.machine.ConditionalSubscriptionHandler; import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; @@ -98,7 +97,7 @@ public PumpCover(CoverDefinition definition, ICoverable coverHolder, Direction a this.mBLeftToTransferLastSecond = transferRate * 20; subscriptionHandler = new ConditionalSubscriptionHandler(coverHolder, this::update, this::isSubscriptionActive); - filterHandler = FilterHandlers.fluid(this) + filterHandler = new FilterHandler<>(this, FluidStack.class) .onFilterLoaded(f -> configureFilter()) .onFilterUpdated(f -> configureFilter()) .onFilterRemoved(this::configureFilter); diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedFluidDetectorCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedFluidDetectorCover.java index d525b153896..880a4e15680 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedFluidDetectorCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedFluidDetectorCover.java @@ -5,7 +5,6 @@ import com.gregtechceu.gtceu.api.cover.IMuiCover; import com.gregtechceu.gtceu.api.cover.filter.Filter; import com.gregtechceu.gtceu.api.cover.filter.FilterHandler; -import com.gregtechceu.gtceu.api.cover.filter.FilterHandlers; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.mui.GTGuiTextures; @@ -62,7 +61,7 @@ public AdvancedFluidDetectorCover(CoverDefinition definition, ICoverable coverHo this.minValue = DEFAULT_MIN; this.maxValue = DEFAULT_MAX; - filterHandler = FilterHandlers.fluid(this); + filterHandler = new FilterHandler<>(this, FluidStack.class); } public void setLatched(boolean latched) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedItemDetectorCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedItemDetectorCover.java index 26f8761ddbb..be3c2b1ff38 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedItemDetectorCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedItemDetectorCover.java @@ -5,7 +5,6 @@ import com.gregtechceu.gtceu.api.cover.IMuiCover; import com.gregtechceu.gtceu.api.cover.filter.Filter; import com.gregtechceu.gtceu.api.cover.filter.FilterHandler; -import com.gregtechceu.gtceu.api.cover.filter.FilterHandlers; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.mui.GTGuiTextures; @@ -59,7 +58,7 @@ public AdvancedItemDetectorCover(CoverDefinition definition, ICoverable coverHol this.minValue = DEFAULT_MIN; this.maxValue = DEFAULT_MAX; - filterHandler = FilterHandlers.item(this); + filterHandler = new FilterHandler<>(this, ItemStack.class); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderFluidLinkCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderFluidLinkCover.java index e55c1cae2c0..14b0d28a3aa 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderFluidLinkCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderFluidLinkCover.java @@ -4,7 +4,6 @@ import com.gregtechceu.gtceu.api.cover.CoverDefinition; import com.gregtechceu.gtceu.api.cover.filter.Filter; import com.gregtechceu.gtceu.api.cover.filter.FilterHandler; -import com.gregtechceu.gtceu.api.cover.filter.FilterHandlers; import com.gregtechceu.gtceu.api.misc.virtualregistry.EntryTypes; import com.gregtechceu.gtceu.api.misc.virtualregistry.VirtualEntry; import com.gregtechceu.gtceu.api.misc.virtualregistry.entries.VirtualTank; @@ -49,7 +48,7 @@ public class EnderFluidLinkCover extends AbstractEnderLinkCover { public EnderFluidLinkCover(CoverDefinition definition, ICoverable coverHolder, Direction attachedSide) { super(definition, coverHolder, attachedSide); this.mBLeftToTransferLastSecond = TRANSFER_RATE * 20; - filterHandler = FilterHandlers.fluid(this); + filterHandler = new FilterHandler<>(this, FluidStack.class); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderItemLinkCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderItemLinkCover.java index a40d6d1385f..82124f4bbc2 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderItemLinkCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderItemLinkCover.java @@ -4,7 +4,6 @@ import com.gregtechceu.gtceu.api.cover.CoverDefinition; import com.gregtechceu.gtceu.api.cover.filter.Filter; import com.gregtechceu.gtceu.api.cover.filter.FilterHandler; -import com.gregtechceu.gtceu.api.cover.filter.FilterHandlers; import com.gregtechceu.gtceu.api.misc.virtualregistry.EntryTypes; import com.gregtechceu.gtceu.api.misc.virtualregistry.VirtualEntry; import com.gregtechceu.gtceu.api.misc.virtualregistry.entries.VirtualItemStorage; @@ -46,7 +45,7 @@ public class EnderItemLinkCover extends AbstractEnderLinkCover(this, ItemStack.class); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ItemBusPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ItemBusPartMachine.java index cb060f4edf7..b7fdc38f8b7 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ItemBusPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ItemBusPartMachine.java @@ -5,7 +5,6 @@ import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.cover.filter.Filter; import com.gregtechceu.gtceu.api.cover.filter.FilterHandler; -import com.gregtechceu.gtceu.api.cover.filter.FilterHandlers; import com.gregtechceu.gtceu.api.machine.MachineDefinition; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.feature.IHasCircuitSlot; @@ -80,7 +79,7 @@ public ItemBusPartMachine(BlockEntityCreationInfo info, int tier, IO io) { this.inventory = attachTrait(createInventory()); this.circuitSlotEnabled = true; this.circuitInventory = attachTrait(createCircuitItemHandler(io)).shouldSearchContent(false); - filterHandler = FilterHandlers.item(this); + filterHandler = new FilterHandler<>(this, ItemStack.class); inventory.setFilter(this::matchesFilter); } From 36fcb58e9604ea093f388be0aec6d2f5d52f6df0 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Fri, 19 Jun 2026 00:45:33 +1000 Subject: [PATCH 04/12] remove extra generic from filter handler --- .../gtceu/api/cover/filter/FilterHandler.java | 31 ++++++++++--------- .../gtceu/common/cover/ConveyorCover.java | 2 +- .../gtceu/common/cover/PumpCover.java | 3 +- .../detector/AdvancedFluidDetectorCover.java | 2 +- .../detector/AdvancedItemDetectorCover.java | 2 +- .../cover/ender/AbstractEnderLinkCover.java | 2 +- .../cover/ender/EnderFluidLinkCover.java | 3 +- .../cover/ender/EnderItemLinkCover.java | 3 +- .../multiblock/part/ItemBusPartMachine.java | 3 +- .../gtceu/common/mui/GTMuiWidgets.java | 4 +-- 10 files changed, 26 insertions(+), 29 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandler.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandler.java index b48e92f5436..11bc6174a8d 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandler.java @@ -20,9 +20,13 @@ import javax.annotation.ParametersAreNonnullByDefault; +/** + * A filter handler represents a slot that can hold filters for a specific type of stack/object. + * @param The stack/object type this filter handler holds filters for. + */ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class FilterHandler> implements ISyncManaged { +public class FilterHandler implements ISyncManaged { @Getter private final SyncDataHolder syncDataHolder = new SyncDataHolder(this); @@ -35,12 +39,12 @@ public class FilterHandler> implements ISyncManaged { @Getter private ItemStack filterItem = ItemStack.EMPTY; - private @Nullable F filter; + private @Nullable Filter filter; private @Nullable CustomItemStackHandler filterSlot; - private Consumer onFilterLoaded = (filter) -> {}; + private Consumer> onFilterLoaded = (filter) -> {}; private Runnable onFilterRemoved = () -> {}; - private Consumer onFilterUpdated = (filter) -> {}; + private Consumer> onFilterUpdated = (filter) -> {}; /** * @@ -52,9 +56,8 @@ public FilterHandler(ISyncManaged container, Class filterableType) { this.filterableType = filterableType; } - @SuppressWarnings("unchecked") - public F loadFilter(ItemStack filterItem) { - return (F) Filters.loadFilter(filterableType, filterItem); + public Filter loadFilter(ItemStack filterItem) { + return Filters.loadFilter(filterableType, filterItem); } ////////////////////////////////// @@ -69,11 +72,10 @@ public boolean isFilterPresent() { return filter != null || !filterItem.isEmpty(); } - @SuppressWarnings("unchecked") - public F getFilter() { + public Filter getFilter() { if (this.filter == null) { if (this.filterItem.isEmpty()) { - return (F) Filters.getEmptyFilter(); + return Filters.getEmptyFilter(); } else { loadFilterFromItem(); } @@ -86,17 +88,17 @@ public boolean test(T resource) { return getFilter().test(resource); } - public FilterHandler onFilterLoaded(Consumer onFilterLoaded) { + public FilterHandler onFilterLoaded(Consumer> onFilterLoaded) { this.onFilterLoaded = onFilterLoaded; return this; } - public FilterHandler onFilterRemoved(Runnable onFilterRemoved) { + public FilterHandler onFilterRemoved(Runnable onFilterRemoved) { this.onFilterRemoved = onFilterRemoved; return this; } - public FilterHandler onFilterUpdated(Consumer onFilterUpdated) { + public FilterHandler onFilterUpdated(Consumer> onFilterUpdated) { this.onFilterUpdated = onFilterUpdated; return this; } @@ -146,11 +148,10 @@ private void updateFilter() { loadFilterFromItem(); } - @SuppressWarnings("unchecked") private void loadFilterFromItem() { if (!this.filterItem.isEmpty()) { this.filter = loadFilter(this.filterItem); - filter.setOnUpdated((Consumer>) this.onFilterUpdated); + filter.setOnUpdated(this.onFilterUpdated); if (filter instanceof SmartItemFilter smart && container instanceof CoverBehavior cover && cover.coverHolder instanceof MachineCoverContainer mcc) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/ConveyorCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/ConveyorCover.java index 8c46bee3ce2..ec28d91b926 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/ConveyorCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ConveyorCover.java @@ -86,7 +86,7 @@ public class ConveyorCover extends CoverBehavior implements IIOCover, IMuiCover, @SaveField @SyncToClient @Getter - protected final FilterHandler> filterHandler; + protected final FilterHandler filterHandler; protected final ConditionalSubscriptionHandler subscriptionHandler; public ConveyorCover(CoverDefinition definition, ICoverable coverHolder, Direction attachedSide, int tier, diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/PumpCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/PumpCover.java index 1951f38b508..d5310e14333 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/PumpCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/PumpCover.java @@ -5,7 +5,6 @@ import com.gregtechceu.gtceu.api.capability.ICoverable; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.cover.*; -import com.gregtechceu.gtceu.api.cover.filter.Filter; import com.gregtechceu.gtceu.api.cover.filter.FilterHandler; import com.gregtechceu.gtceu.api.machine.ConditionalSubscriptionHandler; import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; @@ -84,7 +83,7 @@ public class PumpCover extends CoverBehavior implements IIOCover, IMuiCover, ICo @SaveField @SyncToClient - protected final FilterHandler> filterHandler; + protected final FilterHandler filterHandler; protected final ConditionalSubscriptionHandler subscriptionHandler; public PumpCover(CoverDefinition definition, ICoverable coverHolder, Direction attachedSide, int tier, diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedFluidDetectorCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedFluidDetectorCover.java index 880a4e15680..2907f39490e 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedFluidDetectorCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedFluidDetectorCover.java @@ -53,7 +53,7 @@ public class AdvancedFluidDetectorCover extends FluidDetectorCover implements IM @SaveField @SyncToClient @Getter - protected final FilterHandler> filterHandler; + protected final FilterHandler filterHandler; public AdvancedFluidDetectorCover(CoverDefinition definition, ICoverable coverHolder, Direction attachedSide) { super(definition, coverHolder, attachedSide); diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedItemDetectorCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedItemDetectorCover.java index be3c2b1ff38..c75419e1734 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedItemDetectorCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/AdvancedItemDetectorCover.java @@ -50,7 +50,7 @@ public class AdvancedItemDetectorCover extends ItemDetectorCover implements IMui @SaveField @SyncToClient @Getter - protected final FilterHandler> filterHandler; + protected final FilterHandler filterHandler; public AdvancedItemDetectorCover(CoverDefinition definition, ICoverable coverHolder, Direction attachedSide) { super(definition, coverHolder, attachedSide); diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/ender/AbstractEnderLinkCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/ender/AbstractEnderLinkCover.java index f477122a704..65aef4b6d57 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/ender/AbstractEnderLinkCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ender/AbstractEnderLinkCover.java @@ -148,7 +148,7 @@ protected abstract IWidget createVirtualEntryWidget(PanelSyncManager manager, Vi int idx); @Nullable - protected FilterHandler getFilterHandler() { + protected FilterHandler getFilterHandler() { return null; } diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderFluidLinkCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderFluidLinkCover.java index 14b0d28a3aa..dbbcfa53166 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderFluidLinkCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderFluidLinkCover.java @@ -2,7 +2,6 @@ import com.gregtechceu.gtceu.api.capability.ICoverable; import com.gregtechceu.gtceu.api.cover.CoverDefinition; -import com.gregtechceu.gtceu.api.cover.filter.Filter; import com.gregtechceu.gtceu.api.cover.filter.FilterHandler; import com.gregtechceu.gtceu.api.misc.virtualregistry.EntryTypes; import com.gregtechceu.gtceu.api.misc.virtualregistry.VirtualEntry; @@ -42,7 +41,7 @@ public class EnderFluidLinkCover extends AbstractEnderLinkCover { @Getter @SaveField @SyncToClient - protected final FilterHandler> filterHandler; + protected final FilterHandler filterHandler; protected int mBLeftToTransferLastSecond; public EnderFluidLinkCover(CoverDefinition definition, ICoverable coverHolder, Direction attachedSide) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderItemLinkCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderItemLinkCover.java index 82124f4bbc2..db60818253a 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderItemLinkCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ender/EnderItemLinkCover.java @@ -2,7 +2,6 @@ import com.gregtechceu.gtceu.api.capability.ICoverable; import com.gregtechceu.gtceu.api.cover.CoverDefinition; -import com.gregtechceu.gtceu.api.cover.filter.Filter; import com.gregtechceu.gtceu.api.cover.filter.FilterHandler; import com.gregtechceu.gtceu.api.misc.virtualregistry.EntryTypes; import com.gregtechceu.gtceu.api.misc.virtualregistry.VirtualEntry; @@ -40,7 +39,7 @@ public class EnderItemLinkCover extends AbstractEnderLinkCover> filterHandler; + protected FilterHandler filterHandler; public EnderItemLinkCover(CoverDefinition definition, ICoverable coverHolder, Direction attachedSide) { super(definition, coverHolder, attachedSide); diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ItemBusPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ItemBusPartMachine.java index b7fdc38f8b7..ac8a6181b33 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ItemBusPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ItemBusPartMachine.java @@ -3,7 +3,6 @@ import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.blockentity.IPaintable; import com.gregtechceu.gtceu.api.capability.recipe.IO; -import com.gregtechceu.gtceu.api.cover.filter.Filter; import com.gregtechceu.gtceu.api.cover.filter.FilterHandler; import com.gregtechceu.gtceu.api.machine.MachineDefinition; import com.gregtechceu.gtceu.api.machine.TickableSubscription; @@ -72,7 +71,7 @@ public class ItemBusPartMachine extends TieredIOPartMachine @SaveField @SyncToClient @Getter - protected final FilterHandler> filterHandler; + protected final FilterHandler filterHandler; public ItemBusPartMachine(BlockEntityCreationInfo info, int tier, IO io) { super(info, tier, io); diff --git a/src/main/java/com/gregtechceu/gtceu/common/mui/GTMuiWidgets.java b/src/main/java/com/gregtechceu/gtceu/common/mui/GTMuiWidgets.java index f87fd638fdc..7e94abd6092 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/mui/GTMuiWidgets.java +++ b/src/main/java/com/gregtechceu/gtceu/common/mui/GTMuiWidgets.java @@ -365,7 +365,7 @@ public static CycleButtonWidget createIOCycleButton(EnumSyncValue syncValue, } public static > ParentWidget createFilterRow(Flow existingRow, - FilterHandler filterHandler, + FilterHandler filterHandler, SidedPosGuiData data, PanelSyncManager syncManager, UISettings settings) { @@ -393,7 +393,7 @@ public static > ParentWidget createFilterRow(Flow exis .setEnabledIf((w) -> !filterSlotHandler.getSlot().getItem().isEmpty())); } - public static > ParentWidget createFilterRow(FilterHandler filterHandler, + public static > ParentWidget createFilterRow(FilterHandler filterHandler, SidedPosGuiData data, PanelSyncManager syncManager, UISettings settings) { From f9ad277df6b3178cf94a3f4ff7eed1aacb5d69bb Mon Sep 17 00:00:00 2001 From: Gustavo Date: Fri, 19 Jun 2026 12:13:41 +1000 Subject: [PATCH 05/12] start working on composite filter --- docs/content/Modpacks/Changes/v8.0.0.md | 6 ++- .../api/cover/filter/CompositeFilter.java | 52 +++++++++++++++++++ .../gtceu/api/cover/filter/Filter.java | 41 +++++++++------ .../gtceu/api/cover/filter/Filters.java | 10 ++-- .../api/cover/filter/SimpleFluidFilter.java | 21 ++------ .../api/cover/filter/SimpleItemFilter.java | 16 ++---- .../api/cover/filter/SmartItemFilter.java | 12 ----- .../gtceu/api/cover/filter/TagFilter.java | 11 ---- .../gtceu/common/cover/RobotArmCover.java | 2 +- .../voiding/AdvancedFluidVoidingCover.java | 4 +- .../voiding/AdvancedItemVoidingCover.java | 4 +- .../gtceu/common/data/GTItems.java | 17 +++++- .../common/item/behavior/FilterBehaviour.java | 42 +++++++++++++++ .../item/behavior/FluidFilterBehaviour.java | 2 +- .../item/behavior/ItemFilterBehaviour.java | 2 +- .../gtceu/common/mui/GTMuiWidgets.java | 4 +- .../data/recipe/misc/MachineRecipeLoader.java | 6 +++ 17 files changed, 170 insertions(+), 82 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/api/cover/filter/CompositeFilter.java create mode 100644 src/main/java/com/gregtechceu/gtceu/common/item/behavior/FilterBehaviour.java diff --git a/docs/content/Modpacks/Changes/v8.0.0.md b/docs/content/Modpacks/Changes/v8.0.0.md index 260e0cddbcf..1f2d1b0658f 100644 --- a/docs/content/Modpacks/Changes/v8.0.0.md +++ b/docs/content/Modpacks/Changes/v8.0.0.md @@ -151,4 +151,8 @@ A few regexes for fixing all the MCMeta files is follows, run them in order: - Calling the battery buffer constructor with the following args gives the same behaviour as a charger machine: `(info, tier, inventorySize, BatteryBufferMachine.AMPS_PER_BATTERY_CHARGER, 0)` - Refactored Jade provider code. Use the `MachineInfoProvider` class for jade providers for a specific machine type, and `MachineTraitProvider` for providers for a specific machine trait. - `GTUtil.getMoltenFluid(Material)` has been moved to `Material.getHotFluid()`. -- `ICopyable::copyConfig`'s `CompoundTag` argument should now be mutated by reference instead of a new one returned (and thus, the return type has been changed to `void`). \ No newline at end of file +- `ICopyable::copyConfig`'s `CompoundTag` argument should now be mutated by reference instead of a new one returned (and thus, the return type has been changed to `void`). +- The API for using filters has changed: + - Instead of using the `ItemFilter` or `FluidFilter` interfaces, use `Filter` or `Filter` + - Filters are no longer hardcoded to either item or fluid, instead filters are grouped based on their filterable type (ItemStack, FluidStack, etc) + - FilterHandler no longer has wrappers for item and fluid filter handlers, it now represents a generic filter holder for filters with a specific filterable type. \ No newline at end of file diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/CompositeFilter.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/CompositeFilter.java new file mode 100644 index 00000000000..f6e5a217023 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/CompositeFilter.java @@ -0,0 +1,52 @@ +package com.gregtechceu.gtceu.api.cover.filter; + +import brachy.modularui.factory.GuiData; +import brachy.modularui.screen.UISettings; +import brachy.modularui.value.sync.PanelSyncManager; +import brachy.modularui.widgets.layout.Flow; +import lombok.Getter; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.Nullable; + +public class CompositeFilter extends Filter { + + private Class filterableType; + + @Getter + protected ItemStack[] itemStacks = new ItemStack[9]; + + @Getter + @SuppressWarnings("unchecked") + protected Filter[] filters = (Filter[])new Filter[9]; + + public CompositeFilter(ItemStack stack, Class filterableType) { + super(stack); + this.filterableType = filterableType; + } + + @Override + public Flow getFilterUI(GuiData data, PanelSyncManager syncManager, UISettings settings) { + return null; + } + + @Override + protected @Nullable CompoundTag saveFilter() { + return null; + } + + @Override + public boolean supportsAmounts() { + return false; + } + + @Override + public boolean test(T t) { + return false; + } + + @Override + public int testAmount(T stack) { + return 0; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/Filter.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/Filter.java index e5bc161d610..36f85ac3fc0 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/Filter.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/Filter.java @@ -1,5 +1,10 @@ package com.gregtechceu.gtceu.api.cover.filter; +import brachy.modularui.widgets.Dialog; +import brachy.modularui.widgets.SlotGroupWidget; +import com.gregtechceu.gtceu.common.mui.GTGuiTextures; +import com.gregtechceu.gtceu.common.mui.GTMuiWidgets; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.item.ItemStack; @@ -29,16 +34,6 @@ public Filter(ItemStack stack) { itemWriter = filter -> stack.setTag(filter.saveFilter()); } - /** - * @return Filter panel when opened by itself (including the player inventory) - */ - public abstract ModularPanel getPanel(GuiData data, PanelSyncManager syncManager, UISettings settings); - - public abstract Flow getFilterUI(GuiData data, PanelSyncManager syncManager, UISettings settings); - - @Nullable - protected abstract CompoundTag saveFilter(); - public void setOnUpdated(Consumer> onUpdated) { this.onUpdated = filter -> { this.itemWriter.accept(filter); @@ -46,16 +41,32 @@ public void setOnUpdated(Consumer> onUpdated) { }; } - public boolean isBlackList() { - return false; + /** + * @return Filter panel when opened by itself (including the player inventory) + */ + @SuppressWarnings("deprecation") + public ModularPanel getPanel(GuiData data, PanelSyncManager syncManager, UISettings settings, boolean displayPlayerInventory) { + return new Dialog<>(BuiltInRegistries.ITEM.getKey(filterItemStack.getItem()).toString()) + .disablePanelsBelow(false) + .draggable(true) + .closeOnOutOfBoundsClick(false) + .child(GTMuiWidgets.createTitleBar(() -> filterItemStack, 176, GTGuiTextures.BACKGROUND)) + .child(getFilterUI(data, syncManager, settings).top(10)) + .childIf(displayPlayerInventory, () -> SlotGroupWidget.playerInventory(false).left(7).bottom(7)); } + /** + * @return The filter UI. + */ + public abstract Flow getFilterUI(GuiData data, PanelSyncManager syncManager, UISettings settings); + + @Nullable + protected abstract CompoundTag saveFilter(); + /** * @return Whether this filter supports querying for exact content amounts. */ - public boolean supportsAmounts() { - return !isBlackList(); - } + public abstract boolean supportsAmounts(); /** * Tests if the given stack matches this filter. diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/Filters.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/Filters.java index 349246bdd7a..00d306fde2b 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/Filters.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/Filters.java @@ -49,11 +49,6 @@ public static boolean isValidFilter(Class filterableType, Item item) { public static Filter getEmptyFilter() { return new Filter<>(ItemStack.EMPTY) { - @Override - public ModularPanel getPanel(GuiData data, PanelSyncManager syncManager, UISettings settings) { - throw new NotImplementedException("Cannot open UI for empty filter"); - } - @Override public Flow getFilterUI(GuiData data, PanelSyncManager syncManager, UISettings settings) { throw new NotImplementedException("Cannot open UI for empty filter"); @@ -64,6 +59,11 @@ public Flow getFilterUI(GuiData data, PanelSyncManager syncManager, UISettings s throw new NotImplementedException("Cannot save empty filter"); } + @Override + public boolean supportsAmounts() { + return true; + } + @Override public boolean test(T t) { return true; diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SimpleFluidFilter.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SimpleFluidFilter.java index 0d6e0e3b730..1fe9aa2fd8b 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SimpleFluidFilter.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SimpleFluidFilter.java @@ -1,9 +1,7 @@ package com.gregtechceu.gtceu.api.cover.filter; import com.gregtechceu.gtceu.api.transfer.fluid.CustomFluidTank; -import com.gregtechceu.gtceu.common.data.GTItems; import com.gregtechceu.gtceu.common.mui.GTGuiTextures; -import com.gregtechceu.gtceu.common.mui.GTMuiWidgets; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.nbt.CompoundTag; @@ -13,13 +11,10 @@ import net.minecraftforge.fluids.FluidStack; import brachy.modularui.factory.GuiData; -import brachy.modularui.screen.ModularPanel; import brachy.modularui.screen.UISettings; import brachy.modularui.value.sync.BooleanSyncValue; import brachy.modularui.value.sync.FluidSlotSyncHandler; import brachy.modularui.value.sync.PanelSyncManager; -import brachy.modularui.widgets.Dialog; -import brachy.modularui.widgets.SlotGroupWidget; import brachy.modularui.widgets.ToggleButton; import brachy.modularui.widgets.layout.Flow; import brachy.modularui.widgets.layout.Grid; @@ -87,6 +82,11 @@ public SimpleFluidFilter(ItemStack stack) { return tag; } + @Override + public boolean supportsAmounts() { + return !isBlackList(); + } + public void setBlackList(boolean blackList) { isBlackList = blackList; onUpdated.accept(this); @@ -97,17 +97,6 @@ public void setIgnoreNbt(boolean ingoreNbt) { onUpdated.accept(this); } - @Override - public ModularPanel getPanel(GuiData data, PanelSyncManager syncManager, UISettings settings) { - return new Dialog<>("simple_fluid_filter") - .disablePanelsBelow(false) - .draggable(true) - .closeOnOutOfBoundsClick(true) - .child(GTMuiWidgets.createTitleBar(() -> GTItems.FLUID_FILTER.asStack(), 176, GTGuiTextures.BACKGROUND)) - .child(getFilterUI(data, syncManager, settings).top(10)) - .child(SlotGroupWidget.playerInventory(false).left(7).bottom(7)); - } - public Flow getFilterUI(GuiData data, PanelSyncManager syncManager, UISettings settings) { for (int i = 0; i < 9; i++) { syncManager.syncValue("filter_slot_" + i, diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SimpleItemFilter.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SimpleItemFilter.java index 182c550967f..1795b55d9f7 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SimpleItemFilter.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SimpleItemFilter.java @@ -64,6 +64,11 @@ public SimpleItemFilter(ItemStack stack) { } } + @Override + public boolean supportsAmounts() { + return !isBlackList(); + } + public @Nullable CompoundTag saveFilter() { if (!isBlackList && !ignoreNbt && Arrays.stream(matches).allMatch(ItemStack::isEmpty)) { return null; @@ -89,17 +94,6 @@ public void setIgnoreNbt(boolean ingoreNbt) { onUpdated.accept(this); } - @Override - public ModularPanel getPanel(GuiData data, PanelSyncManager syncManager, UISettings settings) { - return new Dialog<>("simple_item_filter") - .disablePanelsBelow(false) - .draggable(true) - .closeOnOutOfBoundsClick(true) - .child(GTMuiWidgets.createTitleBar(() -> GTItems.ITEM_FILTER.asStack(), 176, GTGuiTextures.BACKGROUND)) - .child(getFilterUI(data, syncManager, settings).top(10)) - .child(SlotGroupWidget.playerInventory(false).left(7).bottom(7)); - } - @Override public Flow getFilterUI(GuiData data, PanelSyncManager syncManager, UISettings settings) { FilterItemStackHandler handler = new FilterItemStackHandler(matches, this); diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SmartItemFilter.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SmartItemFilter.java index 7292d4c8726..2a1642b9b91 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SmartItemFilter.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SmartItemFilter.java @@ -69,18 +69,6 @@ private void setFilterMode(SmartFilteringMode filterMode) { onUpdated.accept(this); } - @Override - public ModularPanel getPanel(GuiData data, PanelSyncManager syncManager, UISettings settings) { - return new Dialog<>("smart_item_filter") - .disablePanelsBelow(false) - .draggable(true) - .closeOnOutOfBoundsClick(true) - .child(GTMuiWidgets.createTitleBar(() -> GTItems.SMART_ITEM_FILTER.asStack(), 176, - GTGuiTextures.BACKGROUND)) - .child(getFilterUI(data, syncManager, settings)) - .child(SlotGroupWidget.playerInventory(false).left(7).bottom(7)); - } - @Override public Flow getFilterUI(GuiData data, PanelSyncManager syncManager, UISettings settings) { EnumSyncValue mode = new EnumSyncValue<>(SmartFilteringMode.class, diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagFilter.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagFilter.java index db2bd69b6a1..3eb9e1b3a5b 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagFilter.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagFilter.java @@ -68,17 +68,6 @@ public void setFilterString(String filterString) { onUpdated.accept(this); } - @Override - public ModularPanel getPanel(GuiData data, PanelSyncManager syncManager, UISettings settings) { - return new Dialog<>("tag_filter") - .disablePanelsBelow(false) - .draggable(true) - .closeOnOutOfBoundsClick(true) - .child(GTMuiWidgets.createTitleBar(this::getFilterItemStack, 176, GTGuiTextures.BACKGROUND)) - .child(getFilterUI(data, syncManager, settings).margin(7).horizontalCenter()) - .child(SlotGroupWidget.playerInventory(false).left(7).bottom(7)); - } - @Override public Flow getFilterUI(GuiData data, PanelSyncManager syncManager, UISettings settings) { StringSyncValue filterString = new StringSyncValue(this::getFilterString, this::setFilterString).allowC2S(); diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/RobotArmCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/RobotArmCover.java index 0a76ada49bf..96b3d905b7c 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/RobotArmCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/RobotArmCover.java @@ -185,7 +185,7 @@ public void setTransferMode(TransferMode transferMode) { @Override protected void configureFilter() { if (filterHandler.getFilter() instanceof SimpleItemFilter filter) { - filter.setMaxStackSize(filter.isBlackList() ? 1 : transferMode.maxStackSize); + filter.setMaxStackSize(filter.supportsAmounts() ? transferMode.maxStackSize : 1); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/AdvancedFluidVoidingCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/AdvancedFluidVoidingCover.java index e6a715df02f..2c2deff19bc 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/AdvancedFluidVoidingCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/AdvancedFluidVoidingCover.java @@ -96,7 +96,7 @@ private int getFilteredFluidAmount(FluidStack fluidStack) { return globalTransferSizeMillibuckets; Filter filter = filterHandler.getFilter(); - return filter.isBlackList() ? globalTransferSizeMillibuckets : filter.testAmount(fluidStack); + return filter.supportsAmounts() ? filter.testAmount(fluidStack) : globalTransferSizeMillibuckets; } public void setVoidingMode(VoidingMode voidingMode) { @@ -168,7 +168,7 @@ private boolean shouldShowStackSize() { if (!this.filterHandler.isFilterPresent()) return true; - return this.filterHandler.getFilter().isBlackList(); + return this.filterHandler.getFilter().supportsAmounts(); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/AdvancedItemVoidingCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/AdvancedItemVoidingCover.java index ea78a012480..be6ab713b3e 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/AdvancedItemVoidingCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/AdvancedItemVoidingCover.java @@ -99,7 +99,7 @@ private int getFilteredItemAmount(ItemStack itemStack) { return globalVoidingLimit; Filter filter = filterHandler.getFilter(); - return filter.isBlackList() ? globalVoidingLimit : filter.testAmount(itemStack); + return filter.supportsAmounts() ? filter.testAmount(itemStack) : globalVoidingLimit; } public void setVoidingMode(VoidingMode voidingMode) { @@ -153,7 +153,7 @@ private boolean shouldShowStackSize() { if (!this.filterHandler.isFilterPresent()) return true; - return this.filterHandler.getFilter().isBlackList(); + return filterHandler.getFilter().supportsAmounts(); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java index 12223b050d6..ee747bda183 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java @@ -85,6 +85,7 @@ import static com.gregtechceu.gtceu.common.registry.GTRegistration.REGISTRATE; import static com.gregtechceu.gtceu.utils.FormattingUtil.toEnglishName; +@SuppressWarnings("unused") public class GTItems { ////////////////////////////////////// @@ -124,6 +125,7 @@ public class GTItems { .onRegister(materialInfo(new ItemMaterialInfo(new MaterialStack(GTMaterials.Steel, GTValues.M * 4)))) .register(); + @SuppressWarnings("unchecked") public static final ItemEntry[] SHAPE_MOLDS = new ItemEntry[18]; public static final ItemEntry SHAPE_MOLD_PLATE; public static final ItemEntry SHAPE_MOLD_GEAR; @@ -1823,6 +1825,17 @@ public static ItemEntry createFluidCell(Material mat, int capacit new CoverPlaceBehavior(GTCovers.FLUID_FILTER))) .onRegister(materialInfo(new ItemMaterialInfo(new MaterialStack(GTMaterials.Zinc, GTValues.M * 3 / 2)))) .register(); + + public static ItemEntry COMPOSITE_ITEM_FILTER = REGISTRATE.item("composite_item_filter", ComponentItem::create) + .lang("Composite Item Filter") + .onRegister(attach(new ItemFilterBehaviour(stack -> new CompositeFilter<>(stack, ItemStack.class)))) + .register(); + + public static ItemEntry COMPOSITE_FLUID_FILTER = REGISTRATE.item("composite_fluid_filter", ComponentItem::create) + .lang("Composite Fluid Filter") + .onRegister(attach(new FluidFilterBehaviour(stack -> new CompositeFilter<>(stack, FluidStack.class)))) + .register(); + public static ItemEntry COVER_WIRELESS_TRANSMITTER = REGISTRATE .item("wireless_transmitter_cover", ComponentItem::create) .lang("Wireless Transmitter") @@ -2652,8 +2665,8 @@ public static NonNullConsumer modelPredicate(ResourceLocatio public static void registerToolTier(MaterialToolTier tier, ResourceLocation id, Collection before, Collection after) { - TierSortingRegistry.registerTier(tier, id, Arrays.asList((Object[]) before.toArray(ResourceLocation[]::new)), - Arrays.asList((Object[]) after.toArray(ResourceLocation[]::new))); + TierSortingRegistry.registerTier(tier, id, Arrays.asList(before.toArray(ResourceLocation[]::new)), + Arrays.asList(after.toArray(ResourceLocation[]::new))); } public static ResourceLocation getTierName(Tier tier) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/behavior/FilterBehaviour.java b/src/main/java/com/gregtechceu/gtceu/common/item/behavior/FilterBehaviour.java new file mode 100644 index 00000000000..062b8f7c904 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/common/item/behavior/FilterBehaviour.java @@ -0,0 +1,42 @@ +package com.gregtechceu.gtceu.common.item.behavior; + +import brachy.modularui.factory.PlayerInventoryGuiData; +import brachy.modularui.factory.UIFactories; +import brachy.modularui.screen.ModularPanel; +import brachy.modularui.screen.UISettings; +import brachy.modularui.value.sync.PanelSyncManager; +import com.gregtechceu.gtceu.api.cover.filter.Filter; +import com.gregtechceu.gtceu.api.cover.filter.Filters; +import com.gregtechceu.gtceu.api.mui.IItemUIHolder; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; + +import java.util.function.Function; + +public record FilterBehaviour(Class filterableObjectType, Function> filterCreator) implements IItemUIHolder { + + @Override + public void onAttached(Item item) { + Filters.registerFilter(filterableObjectType, item, filterCreator); + } + + @Override + public InteractionResultHolder use(Item item, Level level, Player player, InteractionHand usedHand) { + if (!level.isClientSide) { + if (player.isCrouching()) { + UIFactories.playerInventory().openFromHand(player, usedHand); + return InteractionResultHolder.success(player.getItemInHand(usedHand)); + } + } + return InteractionResultHolder.fail(player.getItemInHand(usedHand)); + } + + @Override + public ModularPanel buildUI(PlayerInventoryGuiData data, PanelSyncManager syncManager, UISettings settings) { + return Filters.loadFilter(filterableObjectType, data.getUsedItemStack()).getPanel(data, syncManager, settings, true); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/behavior/FluidFilterBehaviour.java b/src/main/java/com/gregtechceu/gtceu/common/item/behavior/FluidFilterBehaviour.java index 29df9ea4fec..e05cbdbc0dd 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/behavior/FluidFilterBehaviour.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/behavior/FluidFilterBehaviour.java @@ -40,6 +40,6 @@ public InteractionResultHolder use(Item item, Level level, Player pla @Override public ModularPanel buildUI(PlayerInventoryGuiData data, PanelSyncManager syncManager, UISettings settings) { - return Filters.loadFluidFilter(data.getUsedItemStack()).getPanel(data, syncManager, settings); + return Filters.loadFluidFilter(data.getUsedItemStack()).getPanel(data, syncManager, settings, true); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/behavior/ItemFilterBehaviour.java b/src/main/java/com/gregtechceu/gtceu/common/item/behavior/ItemFilterBehaviour.java index 9fca62547f4..52ea984afe5 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/behavior/ItemFilterBehaviour.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/behavior/ItemFilterBehaviour.java @@ -41,6 +41,6 @@ public InteractionResultHolder use(Item item, Level level, Player pla @Override public ModularPanel buildUI(PlayerInventoryGuiData data, PanelSyncManager syncManager, UISettings settings) { - return Filters.loadItemFilter(data.getUsedItemStack()).getPanel(data, syncManager, settings); + return Filters.loadItemFilter(data.getUsedItemStack()).getPanel(data, syncManager, settings, true); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/mui/GTMuiWidgets.java b/src/main/java/com/gregtechceu/gtceu/common/mui/GTMuiWidgets.java index 7e94abd6092..dbb03d2f102 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/mui/GTMuiWidgets.java +++ b/src/main/java/com/gregtechceu/gtceu/common/mui/GTMuiWidgets.java @@ -69,7 +69,7 @@ public static Flow createTitleBar(MachineDefinition definition, int panelWidth) } public static Flow createTitleBar(MachineDefinition definition, int panelWidth, UITexture background) { - return createTitleBar(() -> definition.asStack(), panelWidth, background); + return createTitleBar(definition::asStack, panelWidth, background); } public static Flow createTitleBar(Supplier stackSupplier, int panelWidth, UITexture background) { @@ -379,7 +379,7 @@ public static > ParentWidget createFilterRow(Flow exis IPanelHandler panelHandler = syncManager.syncedPanel("filterPanel", true, (sm, sh) -> filterHandler.loadFilter(filterSlotHandler.getSlot().getItem()).getPanel(data, sm, - settings)); + settings, false)); return existingRow .child(new ItemSlot().syncHandler(filterSlotHandler)) diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MachineRecipeLoader.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MachineRecipeLoader.java index 5371cbd9b1b..bf2d4cd57e7 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MachineRecipeLoader.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MachineRecipeLoader.java @@ -1551,6 +1551,7 @@ private static void registerNBTRemoval(Consumer provider) { VanillaRecipeHelper.addShapelessRecipe(provider, "fluid_jetpack_clear", LIQUID_FUEL_JETPACK.asStack(), LIQUID_FUEL_JETPACK.asStack()); + // Filters VanillaRecipeHelper.addShapelessRecipe(provider, "item_filter_nbt", ITEM_FILTER.asStack(), ITEM_FILTER.asStack()); VanillaRecipeHelper.addShapelessRecipe(provider, "fluid_filter_nbt", FLUID_FILTER.asStack(), @@ -1559,6 +1560,11 @@ private static void registerNBTRemoval(Consumer provider) { TAG_FILTER.asStack()); VanillaRecipeHelper.addShapelessRecipe(provider, "fluid_tag_filter_nbt", TAG_FLUID_FILTER.asStack(), TAG_FLUID_FILTER.asStack()); + + VanillaRecipeHelper.addShapelessRecipe(provider, "composite_item_filter_nbt", COMPOSITE_ITEM_FILTER.asStack(), + COMPOSITE_ITEM_FILTER.asStack()); + VanillaRecipeHelper.addShapelessRecipe(provider, "composite_fluid_filter_nbt", COMPOSITE_FLUID_FILTER.asStack(), + COMPOSITE_FLUID_FILTER.asStack()); } private static void registerHatchConversion(Consumer provider) { From 2868452a6ec1c0dc7726e1a87ef880c052778003 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Fri, 19 Jun 2026 14:09:23 +1000 Subject: [PATCH 06/12] more filter work --- .../api/cover/filter/CompositeFilter.java | 60 ++++++++++++++----- .../gtceu/api/cover/filter/Filter.java | 46 ++++++++------ .../gtceu/api/cover/filter/FilterHandler.java | 1 + .../gtceu/api/cover/filter/Filters.java | 3 +- .../api/cover/filter/SimpleFluidFilter.java | 10 ++-- .../api/cover/filter/SimpleItemFilter.java | 16 ++--- .../api/cover/filter/SmartItemFilter.java | 17 +++--- .../gtceu/api/cover/filter/TagFilter.java | 13 +--- .../gtceu/common/data/GTItems.java | 6 +- .../common/item/behavior/FilterBehaviour.java | 18 +++--- .../common/pipelike/item/ItemNetHandler.java | 3 +- .../data/recipe/misc/CustomToolRecipes.java | 4 +- .../common/cover/ItemFilterCoverTest.java | 2 +- 13 files changed, 120 insertions(+), 79 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/CompositeFilter.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/CompositeFilter.java index f6e5a217023..faeb92187ef 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/CompositeFilter.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/CompositeFilter.java @@ -1,38 +1,63 @@ package com.gregtechceu.gtceu.api.cover.filter; +import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.item.ItemStack; + import brachy.modularui.factory.GuiData; import brachy.modularui.screen.UISettings; import brachy.modularui.value.sync.PanelSyncManager; +import brachy.modularui.value.sync.SyncHandlers; import brachy.modularui.widgets.layout.Flow; +import brachy.modularui.widgets.layout.Grid; +import brachy.modularui.widgets.slot.ItemSlot; import lombok.Getter; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.world.item.ItemStack; import org.jetbrains.annotations.Nullable; +import java.util.Arrays; + public class CompositeFilter extends Filter { - private Class filterableType; + private final Class filterableType; - @Getter - protected ItemStack[] itemStacks = new ItemStack[9]; + private final CustomItemStackHandler itemStacks = new CustomItemStackHandler(9) { + + @Override + public void onContentsChanged(int slot) { + onFilterItemChanged(slot); + } + }; @Getter @SuppressWarnings("unchecked") - protected Filter[] filters = (Filter[])new Filter[9]; + protected @Nullable Filter[] filters = (Filter[]) new Filter[9]; public CompositeFilter(ItemStack stack, Class filterableType) { super(stack); + + var tag = stack.getOrCreateTag(); this.filterableType = filterableType; + this.itemStacks.setFilter(s -> Filters.isValidFilter(filterableType, s.getItem())); + + if (tag.isEmpty()) return; + itemStacks.deserializeNBT(tag.getCompound("filters")); } @Override - public Flow getFilterUI(GuiData data, PanelSyncManager syncManager, UISettings settings) { - return null; + protected @Nullable CompoundTag writeFilterNBT() { + if (itemStacks.toList().stream().allMatch(i -> i == ItemStack.EMPTY)) return null; + + var tag = new CompoundTag(); + tag.put("filters", itemStacks.serializeNBT()); + return tag; } - @Override - protected @Nullable CompoundTag saveFilter() { - return null; + private void onFilterItemChanged(int slot) { + var newItem = itemStacks.getStackInSlot(slot); + filters[slot] = null; + if (!newItem.isEmpty()) filters[slot] = Filters.loadFilter(filterableType, newItem); + updateAndSaveFilter(); } @Override @@ -42,11 +67,18 @@ public boolean supportsAmounts() { @Override public boolean test(T t) { - return false; + return Arrays.stream(filters).anyMatch(f -> f != null && f.test(t)); } @Override - public int testAmount(T stack) { - return 0; + public Flow getFilterUI(GuiData data, PanelSyncManager syncManager, UISettings settings) { + Grid filterGrid = new Grid() + .coverChildren() + .gridOfSizeWidth(9, 3, (x, y, i) -> new ItemSlot() + .slot(SyncHandlers.itemSlot(itemStacks, i).slotGroup("filters"))); + + return Flow.row() + .coverChildrenHeight() + .child(filterGrid.horizontalCenter()); } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/Filter.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/Filter.java index 36f85ac3fc0..f2954ae1dc9 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/Filter.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/Filter.java @@ -1,9 +1,8 @@ package com.gregtechceu.gtceu.api.cover.filter; -import brachy.modularui.widgets.Dialog; -import brachy.modularui.widgets.SlotGroupWidget; import com.gregtechceu.gtceu.common.mui.GTGuiTextures; import com.gregtechceu.gtceu.common.mui.GTMuiWidgets; + import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.item.ItemStack; @@ -12,10 +11,14 @@ import brachy.modularui.screen.ModularPanel; import brachy.modularui.screen.UISettings; import brachy.modularui.value.sync.PanelSyncManager; +import brachy.modularui.widgets.Dialog; +import brachy.modularui.widgets.SlotGroupWidget; import brachy.modularui.widgets.layout.Flow; import lombok.Getter; import lombok.Setter; +import org.apache.commons.lang3.NotImplementedException; import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.Range; import java.util.function.Consumer; import java.util.function.Predicate; @@ -23,29 +26,21 @@ public abstract class Filter implements Predicate { @Setter - protected Consumer> itemWriter; - protected Consumer> onUpdated = filter -> itemWriter.accept(filter); + private Consumer> onUpdated = $ -> {}; @Getter protected final ItemStack filterItemStack; public Filter(ItemStack stack) { this.filterItemStack = stack; - itemWriter = filter -> stack.setTag(filter.saveFilter()); - } - - public void setOnUpdated(Consumer> onUpdated) { - this.onUpdated = filter -> { - this.itemWriter.accept(filter); - onUpdated.accept(filter); - }; } /** * @return Filter panel when opened by itself (including the player inventory) */ @SuppressWarnings("deprecation") - public ModularPanel getPanel(GuiData data, PanelSyncManager syncManager, UISettings settings, boolean displayPlayerInventory) { + public ModularPanel getPanel(GuiData data, PanelSyncManager syncManager, UISettings settings, + boolean displayPlayerInventory) { return new Dialog<>(BuiltInRegistries.ITEM.getKey(filterItemStack.getItem()).toString()) .disablePanelsBelow(false) .draggable(true) @@ -55,13 +50,26 @@ public ModularPanel getPanel(GuiData data, PanelSyncManager syncManager, UISe .childIf(displayPlayerInventory, () -> SlotGroupWidget.playerInventory(false).left(7).bottom(7)); } + /** + * Writes this filter to the filter item's NBT and calls the {@link #onUpdated} listener. + */ + public void updateAndSaveFilter() { + filterItemStack.setTag(writeFilterNBT()); + onUpdated.accept(this); + } + /** * @return The filter UI. */ public abstract Flow getFilterUI(GuiData data, PanelSyncManager syncManager, UISettings settings); + /** + * Writes this filter's data to a tag + * + * @return The data tag. + */ @Nullable - protected abstract CompoundTag saveFilter(); + protected abstract CompoundTag writeFilterNBT(); /** * @return Whether this filter supports querying for exact content amounts. @@ -77,10 +85,14 @@ public ModularPanel getPanel(GuiData data, PanelSyncManager syncManager, UISe public abstract boolean test(T t); /** - * Retrieves the configured count for the stack. + * Retrieves the given amount that matches the filter for the stack. {@link #supportsAmounts()} should be checked + * before calling this. * - * @return The amount configured for the stack.
+ * @return The exact amount that matches the filter.
* If the stack is not matched by this filter, 0 is returned instead. */ - public abstract int testAmount(T stack); + @Range(from = 0, to = Integer.MAX_VALUE) + public int testAmount(T stack) { + throw new NotImplementedException("This filter does not support testing amounts."); + } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandler.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandler.java index 11bc6174a8d..08593ae4d6d 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandler.java @@ -22,6 +22,7 @@ /** * A filter handler represents a slot that can hold filters for a specific type of stack/object. + * * @param The stack/object type this filter handler holds filters for. */ @ParametersAreNonnullByDefault diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/Filters.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/Filters.java index 00d306fde2b..a60439b3e0d 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/Filters.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/Filters.java @@ -6,7 +6,6 @@ import net.minecraftforge.fluids.FluidStack; import brachy.modularui.factory.GuiData; -import brachy.modularui.screen.ModularPanel; import brachy.modularui.screen.UISettings; import brachy.modularui.value.sync.PanelSyncManager; import brachy.modularui.widgets.layout.Flow; @@ -55,7 +54,7 @@ public Flow getFilterUI(GuiData data, PanelSyncManager syncManager, UISettings s } @Override - protected @Nullable CompoundTag saveFilter() { + protected @Nullable CompoundTag writeFilterNBT() { throw new NotImplementedException("Cannot save empty filter"); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SimpleFluidFilter.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SimpleFluidFilter.java index 1fe9aa2fd8b..5523fb45af8 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SimpleFluidFilter.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SimpleFluidFilter.java @@ -21,6 +21,7 @@ import brachy.modularui.widgets.slot.FluidSlot; import lombok.Getter; import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.Range; import java.util.Arrays; @@ -51,7 +52,7 @@ public SimpleFluidFilter(ItemStack stack) { fluidStorageSlots[i] = new CustomFluidTank(64000); fluidStorageSlots[i].setOnContentsChanged(() -> { matches[finalI] = fluidStorageSlots[finalI].getFluid(); - onUpdated.accept(this); + updateAndSaveFilter(); }); } Arrays.fill(matches, FluidStack.EMPTY); @@ -67,7 +68,7 @@ public SimpleFluidFilter(ItemStack stack) { } } - public @Nullable CompoundTag saveFilter() { + public @Nullable CompoundTag writeFilterNBT() { if (!isBlackList && !ignoreNbt && Arrays.stream(matches).allMatch(FluidStack::isEmpty)) { return null; } @@ -89,12 +90,12 @@ public boolean supportsAmounts() { public void setBlackList(boolean blackList) { isBlackList = blackList; - onUpdated.accept(this); + updateAndSaveFilter(); } public void setIgnoreNbt(boolean ingoreNbt) { this.ignoreNbt = ingoreNbt; - onUpdated.accept(this); + updateAndSaveFilter(); } public Flow getFilterUI(GuiData data, PanelSyncManager syncManager, UISettings settings) { @@ -129,6 +130,7 @@ public boolean test(FluidStack other) { } @Override + @Range(from = 0, to = Integer.MAX_VALUE) public int testAmount(FluidStack fluidStack) { int totalFluidAmount = getTotalConfiguredFluidAmount(fluidStack); diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SimpleItemFilter.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SimpleItemFilter.java index 1795b55d9f7..1da8969f942 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SimpleItemFilter.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SimpleItemFilter.java @@ -1,9 +1,7 @@ package com.gregtechceu.gtceu.api.cover.filter; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; -import com.gregtechceu.gtceu.common.data.GTItems; import com.gregtechceu.gtceu.common.mui.GTGuiTextures; -import com.gregtechceu.gtceu.common.mui.GTMuiWidgets; import com.gregtechceu.gtceu.utils.GTUtil; import net.minecraft.MethodsReturnNonnullByDefault; @@ -13,13 +11,10 @@ import net.minecraft.world.item.ItemStack; import brachy.modularui.factory.GuiData; -import brachy.modularui.screen.ModularPanel; import brachy.modularui.screen.UISettings; import brachy.modularui.value.sync.BooleanSyncValue; import brachy.modularui.value.sync.PanelSyncManager; import brachy.modularui.value.sync.PhantomItemSlotSyncHandler; -import brachy.modularui.widgets.Dialog; -import brachy.modularui.widgets.SlotGroupWidget; import brachy.modularui.widgets.ToggleButton; import brachy.modularui.widgets.layout.Flow; import brachy.modularui.widgets.layout.Grid; @@ -27,6 +22,7 @@ import brachy.modularui.widgets.slot.PhantomItemSlot; import lombok.Getter; import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.Range; import java.util.Arrays; @@ -69,7 +65,7 @@ public boolean supportsAmounts() { return !isBlackList(); } - public @Nullable CompoundTag saveFilter() { + public @Nullable CompoundTag writeFilterNBT() { if (!isBlackList && !ignoreNbt && Arrays.stream(matches).allMatch(ItemStack::isEmpty)) { return null; } @@ -86,18 +82,17 @@ public boolean supportsAmounts() { public void setBlackList(boolean blackList) { isBlackList = blackList; - onUpdated.accept(this); + updateAndSaveFilter(); } public void setIgnoreNbt(boolean ingoreNbt) { this.ignoreNbt = ingoreNbt; - onUpdated.accept(this); + updateAndSaveFilter(); } @Override public Flow getFilterUI(GuiData data, PanelSyncManager syncManager, UISettings settings) { FilterItemStackHandler handler = new FilterItemStackHandler(matches, this); - Grid filterGrid = new Grid() .coverChildren() .gridOfSizeWidth(9, 3, (x, y, i) -> new PhantomItemSlot() @@ -165,7 +160,7 @@ public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) { public void setStackInSlot(int slot, ItemStack stack) { super.setStackInSlot(slot, stack); matches[slot] = stack.copyWithCount(1); - filter.onUpdated.accept(filter); + filter.updateAndSaveFilter(); } } @@ -175,6 +170,7 @@ public boolean test(ItemStack itemStack) { } @Override + @Range(from = 0, to = Integer.MAX_VALUE) public int testAmount(ItemStack itemStack) { int totalItemCount = getTotalConfiguredItemCount(itemStack); diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SmartItemFilter.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SmartItemFilter.java index 2a1642b9b91..e41a3e02ef6 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SmartItemFilter.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SmartItemFilter.java @@ -4,10 +4,7 @@ import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; import com.gregtechceu.gtceu.api.recipe.content.Content; -import com.gregtechceu.gtceu.common.data.GTItems; import com.gregtechceu.gtceu.common.data.GTRecipeTypes; -import com.gregtechceu.gtceu.common.mui.GTGuiTextures; -import com.gregtechceu.gtceu.common.mui.GTMuiWidgets; import com.gregtechceu.gtceu.utils.ItemStackHashStrategy; import net.minecraft.MethodsReturnNonnullByDefault; @@ -22,14 +19,11 @@ import brachy.modularui.drawable.GuiTextures; import brachy.modularui.drawable.UITexture; import brachy.modularui.factory.GuiData; -import brachy.modularui.screen.ModularPanel; import brachy.modularui.screen.UISettings; import brachy.modularui.value.BoolValue; import brachy.modularui.value.sync.EnumSyncValue; import brachy.modularui.value.sync.PanelSyncManager; -import brachy.modularui.widgets.Dialog; import brachy.modularui.widgets.ListWidget; -import brachy.modularui.widgets.SlotGroupWidget; import brachy.modularui.widgets.ToggleButton; import brachy.modularui.widgets.layout.Flow; import brachy.modularui.widgets.menu.ContextMenuButton; @@ -37,6 +31,7 @@ import it.unimi.dsi.fastutil.objects.Object2IntOpenCustomHashMap; import lombok.Getter; import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.Range; import java.util.Arrays; import java.util.Collections; @@ -55,7 +50,7 @@ public SmartItemFilter(ItemStack stack) { } @Override - public @Nullable CompoundTag saveFilter() { + public @Nullable CompoundTag writeFilterNBT() { if (filterMode.ordinal() == 0) { return null; } @@ -66,7 +61,7 @@ public SmartItemFilter(ItemStack stack) { private void setFilterMode(SmartFilteringMode filterMode) { this.filterMode = filterMode; - onUpdated.accept(this); + updateAndSaveFilter(); } @Override @@ -105,12 +100,18 @@ public Flow getFilterUI(GuiData data, PanelSyncManager syncManager, UISettings s .child(Text.str("Recipe Type").asWidget().verticalCenter().rightRel(0.f)); } + @Override + public boolean supportsAmounts() { + return true; + } + @Override public boolean test(ItemStack itemStack) { return testAmount(itemStack) > 0; } @Override + @Range(from = 0, to = Integer.MAX_VALUE) public int testAmount(ItemStack itemStack) { return filterMode.cache.computeIfAbsent(itemStack, this::lookup); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagFilter.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagFilter.java index 3eb9e1b3a5b..2aa0b9aca69 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagFilter.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagFilter.java @@ -1,7 +1,6 @@ package com.gregtechceu.gtceu.api.cover.filter; import com.gregtechceu.gtceu.common.mui.GTGuiTextures; -import com.gregtechceu.gtceu.common.mui.GTMuiWidgets; import com.gregtechceu.gtceu.utils.TagExprFilter; import net.minecraft.nbt.CompoundTag; @@ -10,13 +9,10 @@ import net.minecraft.world.item.ItemStack; import brachy.modularui.factory.GuiData; -import brachy.modularui.screen.ModularPanel; import brachy.modularui.screen.RichTooltip; import brachy.modularui.screen.UISettings; import brachy.modularui.value.sync.PanelSyncManager; import brachy.modularui.value.sync.StringSyncValue; -import brachy.modularui.widgets.Dialog; -import brachy.modularui.widgets.SlotGroupWidget; import brachy.modularui.widgets.layout.Flow; import brachy.modularui.widgets.textfield.TextFieldWidget; import it.unimi.dsi.fastutil.objects.Object2BooleanMap; @@ -52,7 +48,7 @@ public TagFilter(ItemStack stack, Function tagHolderObjectSupplier, matchExpr = TagExprFilter.parseExpression(filterString); } - public @Nullable CompoundTag saveFilter() { + public @Nullable CompoundTag writeFilterNBT() { if (filterString.isBlank()) { return null; } @@ -65,7 +61,7 @@ public void setFilterString(String filterString) { matchResultCache.clear(); this.filterString = filterString; matchExpr = TagExprFilter.parseExpression(filterString); - onUpdated.accept(this); + updateAndSaveFilter(); } @Override @@ -104,9 +100,4 @@ public boolean test(T t) { matchResultCache.put(tagHolder, result); return result; } - - @Override - public int testAmount(T stack) { - return test(stack) ? Integer.MAX_VALUE : 0; - } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java index ee747bda183..3e37eb6170c 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java @@ -1826,12 +1826,14 @@ public static ItemEntry createFluidCell(Material mat, int capacit .onRegister(materialInfo(new ItemMaterialInfo(new MaterialStack(GTMaterials.Zinc, GTValues.M * 3 / 2)))) .register(); - public static ItemEntry COMPOSITE_ITEM_FILTER = REGISTRATE.item("composite_item_filter", ComponentItem::create) + public static ItemEntry COMPOSITE_ITEM_FILTER = REGISTRATE + .item("composite_item_filter", ComponentItem::create) .lang("Composite Item Filter") .onRegister(attach(new ItemFilterBehaviour(stack -> new CompositeFilter<>(stack, ItemStack.class)))) .register(); - public static ItemEntry COMPOSITE_FLUID_FILTER = REGISTRATE.item("composite_fluid_filter", ComponentItem::create) + public static ItemEntry COMPOSITE_FLUID_FILTER = REGISTRATE + .item("composite_fluid_filter", ComponentItem::create) .lang("Composite Fluid Filter") .onRegister(attach(new FluidFilterBehaviour(stack -> new CompositeFilter<>(stack, FluidStack.class)))) .register(); diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/behavior/FilterBehaviour.java b/src/main/java/com/gregtechceu/gtceu/common/item/behavior/FilterBehaviour.java index 062b8f7c904..77861eb49d7 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/behavior/FilterBehaviour.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/behavior/FilterBehaviour.java @@ -1,13 +1,9 @@ package com.gregtechceu.gtceu.common.item.behavior; -import brachy.modularui.factory.PlayerInventoryGuiData; -import brachy.modularui.factory.UIFactories; -import brachy.modularui.screen.ModularPanel; -import brachy.modularui.screen.UISettings; -import brachy.modularui.value.sync.PanelSyncManager; import com.gregtechceu.gtceu.api.cover.filter.Filter; import com.gregtechceu.gtceu.api.cover.filter.Filters; import com.gregtechceu.gtceu.api.mui.IItemUIHolder; + import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResultHolder; import net.minecraft.world.entity.player.Player; @@ -15,9 +11,16 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; +import brachy.modularui.factory.PlayerInventoryGuiData; +import brachy.modularui.factory.UIFactories; +import brachy.modularui.screen.ModularPanel; +import brachy.modularui.screen.UISettings; +import brachy.modularui.value.sync.PanelSyncManager; + import java.util.function.Function; -public record FilterBehaviour(Class filterableObjectType, Function> filterCreator) implements IItemUIHolder { +public record FilterBehaviour(Class filterableObjectType, Function> filterCreator) + implements IItemUIHolder { @Override public void onAttached(Item item) { @@ -37,6 +40,7 @@ public InteractionResultHolder use(Item item, Level level, Player pla @Override public ModularPanel buildUI(PlayerInventoryGuiData data, PanelSyncManager syncManager, UISettings settings) { - return Filters.loadFilter(filterableObjectType, data.getUsedItemStack()).getPanel(data, syncManager, settings, true); + return Filters.loadFilter(filterableObjectType, data.getUsedItemStack()).getPanel(data, syncManager, settings, + true); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/pipelike/item/ItemNetHandler.java b/src/main/java/com/gregtechceu/gtceu/common/pipelike/item/ItemNetHandler.java index 5a16fba8e09..0bffbeed9df 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/pipelike/item/ItemNetHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/common/pipelike/item/ItemNetHandler.java @@ -314,7 +314,8 @@ private ItemStack insertIntoDestination(IItemHandler handler, ItemStack stack, b /// Insert into a destination through a robot arm private ItemStack insertOverRobotArm(IItemHandler handler, RobotArmCover arm, ItemStack stack, boolean simulate, int allowed, boolean ignoreLimit) { - int rate = arm.getFilterHandler().getFilter().testAmount(stack); + int rate = arm.getFilterHandler().getFilter().supportsAmounts() ? + arm.getFilterHandler().getFilter().testAmount(stack) : Integer.MAX_VALUE; int count; switch (arm.getTransferMode()) { case TRANSFER_ANY: diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/CustomToolRecipes.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/CustomToolRecipes.java index 58724ffebc8..488b604eb58 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/CustomToolRecipes.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/CustomToolRecipes.java @@ -225,7 +225,7 @@ private static void registerElectricRecipes(@NotNull Consumer pr var filter = (SimpleItemFilter) Filters .loadItemFilter(ItemMagnetBehavior.FilterMode.SIMPLE.getFilter(magnetStack)); filter.setBlackList(true); - tag.put(ItemMagnetBehavior.FILTER_TAG, filter.saveFilter()); + tag.put(ItemMagnetBehavior.FILTER_TAG, filter.writeFilterNBT()); VanillaRecipeHelper.addShapedEnergyTransferRecipe(provider, true, false, true, "lv_magnet_" + batteryItem.getId().getPath(), Ingredient.of(batteryItem), magnetStack, @@ -268,7 +268,7 @@ private static void registerElectricRecipes(@NotNull Consumer pr var filter = (SimpleItemFilter) Filters .loadItemFilter(ItemMagnetBehavior.FilterMode.SIMPLE.getFilter(magnetStack)); filter.setBlackList(true); - tag.put(ItemMagnetBehavior.FILTER_TAG, filter.saveFilter()); + tag.put(ItemMagnetBehavior.FILTER_TAG, filter.writeFilterNBT()); VanillaRecipeHelper.addShapedEnergyTransferRecipe(provider, true, false, true, "hv_magnet_" + batteryItem.getId().getPath(), Ingredient.of(batteryItem), magnetStack, diff --git a/src/test/java/com/gregtechceu/gtceu/common/cover/ItemFilterCoverTest.java b/src/test/java/com/gregtechceu/gtceu/common/cover/ItemFilterCoverTest.java index 50981825c07..cba593eb1cb 100644 --- a/src/test/java/com/gregtechceu/gtceu/common/cover/ItemFilterCoverTest.java +++ b/src/test/java/com/gregtechceu/gtceu/common/cover/ItemFilterCoverTest.java @@ -29,7 +29,7 @@ private static ItemStack makeDiamondFilter() { ItemStack stack = GTItems.ITEM_FILTER.asStack(); SimpleItemFilter filter = new SimpleItemFilter(stack); filter.getMatches()[0] = Items.DIAMOND.getDefaultInstance(); - stack.setTag(filter.saveFilter()); + stack.setTag(filter.writeFilterNBT()); return stack; } From 670eeceddd43f0d69397cea667450759925ae8b7 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Fri, 19 Jun 2026 14:35:25 +1000 Subject: [PATCH 07/12] basic composite filter impl --- .../api/cover/filter/CompositeFilter.java | 26 ++++++++++- .../gtceu/common/data/GTItems.java | 15 +++--- .../item/behavior/FluidFilterBehaviour.java | 45 ------------------ .../item/behavior/ItemFilterBehaviour.java | 46 ------------------- 4 files changed, 32 insertions(+), 100 deletions(-) delete mode 100644 src/main/java/com/gregtechceu/gtceu/common/item/behavior/FluidFilterBehaviour.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/common/item/behavior/ItemFilterBehaviour.java diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/CompositeFilter.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/CompositeFilter.java index faeb92187ef..b5fca89fdfc 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/CompositeFilter.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/CompositeFilter.java @@ -1,5 +1,6 @@ package com.gregtechceu.gtceu.api.cover.filter; +import brachy.modularui.widgets.slot.SlotGroup; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; import net.minecraft.nbt.CompoundTag; @@ -16,6 +17,7 @@ import org.jetbrains.annotations.Nullable; import java.util.Arrays; +import java.util.Objects; public class CompositeFilter extends Filter { @@ -27,6 +29,11 @@ public class CompositeFilter extends Filter { public void onContentsChanged(int slot) { onFilterItemChanged(slot); } + + @Override + public int getSlotLimit(int slot) { + return 1; + } }; @Getter @@ -42,6 +49,14 @@ public CompositeFilter(ItemStack stack, Class filterableType) { if (tag.isEmpty()) return; itemStacks.deserializeNBT(tag.getCompound("filters")); + + for (int i=0; i<9; i++) { + var item = itemStacks.getStackInSlot(i); + if (item.isEmpty()) continue; + filters[i] = Filters.loadFilter(filterableType, item); + Objects.requireNonNull(filters[i]).setOnUpdated($ -> updateAndSaveFilter()); + } + } @Override @@ -56,7 +71,11 @@ public CompositeFilter(ItemStack stack, Class filterableType) { private void onFilterItemChanged(int slot) { var newItem = itemStacks.getStackInSlot(slot); filters[slot] = null; - if (!newItem.isEmpty()) filters[slot] = Filters.loadFilter(filterableType, newItem); + if (!newItem.isEmpty()) { + filters[slot] = Filters.loadFilter(filterableType, newItem); + Objects.requireNonNull(filters[slot]).setOnUpdated($ -> updateAndSaveFilter()); + }; + updateAndSaveFilter(); } @@ -72,10 +91,13 @@ public boolean test(T t) { @Override public Flow getFilterUI(GuiData data, PanelSyncManager syncManager, UISettings settings) { + + SlotGroup slotGroup = new SlotGroup("filters", 9); + Grid filterGrid = new Grid() .coverChildren() .gridOfSizeWidth(9, 3, (x, y, i) -> new ItemSlot() - .slot(SyncHandlers.itemSlot(itemStacks, i).slotGroup("filters"))); + .slot(SyncHandlers.itemSlot(itemStacks, i).slotGroup(slotGroup))); return Flow.row() .coverChildrenHeight() diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java index 3e37eb6170c..2a6360b16bc 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java @@ -22,6 +22,7 @@ import com.gregtechceu.gtceu.api.item.component.*; import com.gregtechceu.gtceu.api.item.component.prospector.ProspectorMode; import com.gregtechceu.gtceu.api.item.tool.MaterialToolTier; +import com.gregtechceu.gtceu.api.recipe.ingredient.EnergyStack; import com.gregtechceu.gtceu.common.data.materials.GTFoods; import com.gregtechceu.gtceu.common.entity.GTBoat; import com.gregtechceu.gtceu.common.item.*; @@ -1792,7 +1793,7 @@ public static ItemEntry createFluidCell(Material mat, int capacit ///////////////////////////////////////// public static ItemEntry ITEM_FILTER = REGISTRATE.item("item_filter", ComponentItem::create) - .onRegister(attach(new ItemFilterBehaviour(SimpleItemFilter::new), + .onRegister(attach(new FilterBehaviour<>(ItemStack.class,SimpleItemFilter::new), new CoverPlaceBehavior(GTCovers.ITEM_FILTER))) .onRegister(materialInfo(new ItemMaterialInfo(new MaterialStack(GTMaterials.Zinc, GTValues.M * 2), new MaterialStack(GTMaterials.Steel, GTValues.M)))) @@ -1801,26 +1802,26 @@ public static ItemEntry createFluidCell(Material mat, int capacit .item("item_tag_filter", ComponentItem::create) .lang("Item Tag Filter") .onRegister(attach( - new ItemFilterBehaviour(stack -> new TagFilter<>(stack, ItemStack::getItem, ItemStack::getTags)), + new FilterBehaviour<>(ItemStack.class,stack -> new TagFilter<>(stack, ItemStack::getItem, ItemStack::getTags)), new CoverPlaceBehavior(GTCovers.ITEM_FILTER))) .onRegister(materialInfo(new ItemMaterialInfo(new MaterialStack(GTMaterials.Zinc, GTValues.M * 2)))) .register(); public static ItemEntry SMART_ITEM_FILTER = REGISTRATE .item("item_smart_filter", ComponentItem::create) .lang("Smart Item Filter") - .onRegister(attach(new ItemFilterBehaviour(SmartItemFilter::new), + .onRegister(attach(new FilterBehaviour<>(ItemStack.class,SmartItemFilter::new), new CoverPlaceBehavior(GTCovers.ITEM_FILTER))) .onRegister(materialInfo(new ItemMaterialInfo(new MaterialStack(GTMaterials.Zinc, GTValues.M * 3 / 2)))) .register(); public static ItemEntry FLUID_FILTER = REGISTRATE.item("fluid_filter", ComponentItem::create) - .onRegister(attach(new FluidFilterBehaviour(SimpleFluidFilter::new), + .onRegister(attach(new FilterBehaviour<>(FluidStack.class, SimpleFluidFilter::new), new CoverPlaceBehavior(GTCovers.FLUID_FILTER))) .onRegister(materialInfo(new ItemMaterialInfo(new MaterialStack(GTMaterials.Zinc, GTValues.M * 2)))) .register(); public static ItemEntry TAG_FLUID_FILTER = REGISTRATE.item("fluid_tag_filter", ComponentItem::create) .lang("Fluid Tag Filter") .onRegister(attach( - new FluidFilterBehaviour(stack -> new TagFilter<>(stack, FluidStack::getFluid, + new FilterBehaviour<>(FluidStack.class, stack -> new TagFilter<>(stack, FluidStack::getFluid, f -> f.getFluid().defaultFluidState().getTags())), new CoverPlaceBehavior(GTCovers.FLUID_FILTER))) .onRegister(materialInfo(new ItemMaterialInfo(new MaterialStack(GTMaterials.Zinc, GTValues.M * 3 / 2)))) @@ -1829,13 +1830,13 @@ public static ItemEntry createFluidCell(Material mat, int capacit public static ItemEntry COMPOSITE_ITEM_FILTER = REGISTRATE .item("composite_item_filter", ComponentItem::create) .lang("Composite Item Filter") - .onRegister(attach(new ItemFilterBehaviour(stack -> new CompositeFilter<>(stack, ItemStack.class)))) + .onRegister(attach(new FilterBehaviour<>(ItemStack.class, stack -> new CompositeFilter<>(stack, ItemStack.class)), new CoverPlaceBehavior(GTCovers.ITEM_FILTER))) .register(); public static ItemEntry COMPOSITE_FLUID_FILTER = REGISTRATE .item("composite_fluid_filter", ComponentItem::create) .lang("Composite Fluid Filter") - .onRegister(attach(new FluidFilterBehaviour(stack -> new CompositeFilter<>(stack, FluidStack.class)))) + .onRegister(attach(new FilterBehaviour<>(FluidStack.class, stack -> new CompositeFilter<>(stack, FluidStack.class)), new CoverPlaceBehavior(GTCovers.ITEM_FILTER))) .register(); public static ItemEntry COVER_WIRELESS_TRANSMITTER = REGISTRATE diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/behavior/FluidFilterBehaviour.java b/src/main/java/com/gregtechceu/gtceu/common/item/behavior/FluidFilterBehaviour.java deleted file mode 100644 index e05cbdbc0dd..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/common/item/behavior/FluidFilterBehaviour.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.gregtechceu.gtceu.common.item.behavior; - -import com.gregtechceu.gtceu.api.cover.filter.Filter; -import com.gregtechceu.gtceu.api.cover.filter.Filters; -import com.gregtechceu.gtceu.api.mui.IItemUIHolder; - -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResultHolder; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.Level; -import net.minecraftforge.fluids.FluidStack; - -import brachy.modularui.factory.PlayerInventoryGuiData; -import brachy.modularui.factory.UIFactories; -import brachy.modularui.screen.ModularPanel; -import brachy.modularui.screen.UISettings; -import brachy.modularui.value.sync.PanelSyncManager; - -import java.util.function.Function; - -public record FluidFilterBehaviour(Function> filterCreator) implements IItemUIHolder { - - @Override - public void onAttached(Item item) { - Filters.registerFilter(FluidStack.class, item, filterCreator); - } - - @Override - public InteractionResultHolder use(Item item, Level level, Player player, InteractionHand usedHand) { - if (!level.isClientSide) { - if (player.isCrouching()) { - UIFactories.playerInventory().openFromHand(player, usedHand); - return InteractionResultHolder.success(player.getItemInHand(usedHand)); - } - } - return InteractionResultHolder.fail(player.getItemInHand(usedHand)); - } - - @Override - public ModularPanel buildUI(PlayerInventoryGuiData data, PanelSyncManager syncManager, UISettings settings) { - return Filters.loadFluidFilter(data.getUsedItemStack()).getPanel(data, syncManager, settings, true); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/behavior/ItemFilterBehaviour.java b/src/main/java/com/gregtechceu/gtceu/common/item/behavior/ItemFilterBehaviour.java deleted file mode 100644 index 52ea984afe5..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/common/item/behavior/ItemFilterBehaviour.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.gregtechceu.gtceu.common.item.behavior; - -import com.gregtechceu.gtceu.api.cover.filter.Filter; -import com.gregtechceu.gtceu.api.cover.filter.Filters; -import com.gregtechceu.gtceu.api.item.component.IInteractionItem; -import com.gregtechceu.gtceu.api.mui.IItemUIHolder; - -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResultHolder; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.Level; - -import brachy.modularui.factory.PlayerInventoryGuiData; -import brachy.modularui.factory.UIFactories; -import brachy.modularui.screen.ModularPanel; -import brachy.modularui.screen.UISettings; -import brachy.modularui.value.sync.PanelSyncManager; - -import java.util.function.Function; - -public record ItemFilterBehaviour(Function> filterCreator) - implements IInteractionItem, IItemUIHolder { - - @Override - public void onAttached(Item item) { - Filters.registerFilter(ItemStack.class, item, filterCreator); - } - - @Override - public InteractionResultHolder use(Item item, Level level, Player player, InteractionHand usedHand) { - if (!level.isClientSide) { - if (player.isCrouching()) { - UIFactories.playerInventory().openFromHand(player, usedHand); - return InteractionResultHolder.success(player.getItemInHand(usedHand)); - } - } - return InteractionResultHolder.fail(player.getItemInHand(usedHand)); - } - - @Override - public ModularPanel buildUI(PlayerInventoryGuiData data, PanelSyncManager syncManager, UISettings settings) { - return Filters.loadItemFilter(data.getUsedItemStack()).getPanel(data, syncManager, settings, true); - } -} From 309fc7bdf84d494b606bfa577e40d27d80796aa1 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Fri, 19 Jun 2026 14:55:46 +1000 Subject: [PATCH 08/12] clean up filter handler --- .../api/cover/filter/CompositeFilter.java | 8 +-- .../gtceu/api/cover/filter/Filter.java | 7 ++ .../gtceu/api/cover/filter/FilterHandler.java | 66 +++++-------------- .../api/cover/filter/SmartItemFilter.java | 14 ++++ .../gtceu/common/data/GTItems.java | 16 +++-- .../gtceu/common/mui/GTMuiWidgets.java | 6 +- 6 files changed, 56 insertions(+), 61 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/CompositeFilter.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/CompositeFilter.java index b5fca89fdfc..00b9ef74972 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/CompositeFilter.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/CompositeFilter.java @@ -1,6 +1,5 @@ package com.gregtechceu.gtceu.api.cover.filter; -import brachy.modularui.widgets.slot.SlotGroup; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; import net.minecraft.nbt.CompoundTag; @@ -13,6 +12,7 @@ import brachy.modularui.widgets.layout.Flow; import brachy.modularui.widgets.layout.Grid; import brachy.modularui.widgets.slot.ItemSlot; +import brachy.modularui.widgets.slot.SlotGroup; import lombok.Getter; import org.jetbrains.annotations.Nullable; @@ -50,13 +50,12 @@ public CompositeFilter(ItemStack stack, Class filterableType) { if (tag.isEmpty()) return; itemStacks.deserializeNBT(tag.getCompound("filters")); - for (int i=0; i<9; i++) { + for (int i = 0; i < 9; i++) { var item = itemStacks.getStackInSlot(i); if (item.isEmpty()) continue; filters[i] = Filters.loadFilter(filterableType, item); Objects.requireNonNull(filters[i]).setOnUpdated($ -> updateAndSaveFilter()); } - } @Override @@ -74,7 +73,7 @@ private void onFilterItemChanged(int slot) { if (!newItem.isEmpty()) { filters[slot] = Filters.loadFilter(filterableType, newItem); Objects.requireNonNull(filters[slot]).setOnUpdated($ -> updateAndSaveFilter()); - }; + } ; updateAndSaveFilter(); } @@ -91,7 +90,6 @@ public boolean test(T t) { @Override public Flow getFilterUI(GuiData data, PanelSyncManager syncManager, UISettings settings) { - SlotGroup slotGroup = new SlotGroup("filters", 9); Grid filterGrid = new Grid() diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/Filter.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/Filter.java index f2954ae1dc9..225f59f8096 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/Filter.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/Filter.java @@ -58,6 +58,13 @@ public void updateAndSaveFilter() { onUpdated.accept(this); } + /** + * Called when a filter is loaded by a filter handler. + * + * @param handler The filter handler + */ + public void onFilterLoaded(FilterHandler handler) {} + /** * @return The filter UI. */ diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandler.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandler.java index 08593ae4d6d..36f0469af8e 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandler.java @@ -1,9 +1,6 @@ package com.gregtechceu.gtceu.api.cover.filter; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.cover.CoverBehavior; -import com.gregtechceu.gtceu.api.machine.MachineCoverContainer; -import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.sync_system.SyncDataHolder; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; @@ -33,6 +30,7 @@ public class FilterHandler implements ISyncManaged { private final SyncDataHolder syncDataHolder = new SyncDataHolder(this); private final ISyncManaged container; + @Getter private final Class filterableType; @SaveField @@ -41,24 +39,31 @@ public class FilterHandler implements ISyncManaged { private ItemStack filterItem = ItemStack.EMPTY; private @Nullable Filter filter; - private @Nullable CustomItemStackHandler filterSlot; + @Getter + private CustomItemStackHandler filterSlot; private Consumer> onFilterLoaded = (filter) -> {}; private Runnable onFilterRemoved = () -> {}; private Consumer> onFilterUpdated = (filter) -> {}; /** - * * @param container The machine/pipe/cover/etc this filter handler is attached to. * @param filterableType The stack/object type which this filter handler should hold filters for. */ public FilterHandler(ISyncManaged container, Class filterableType) { this.container = container; this.filterableType = filterableType; - } - public Filter loadFilter(ItemStack filterItem) { - return Filters.loadFilter(filterableType, filterItem); + this.filterSlot = new CustomItemStackHandler(this.filterItem) { + + @Override + public int getSlotLimit(int slot) { + return 1; + } + }; + + this.filterSlot.setOnContentsChanged(this::updateFilter); + this.filterSlot.setFilter(this::canInsertFilterItem); } ////////////////////////////////// @@ -70,18 +75,11 @@ public boolean canInsertFilterItem(ItemStack itemStack) { } public boolean isFilterPresent() { - return filter != null || !filterItem.isEmpty(); + return filter != null; } public Filter getFilter() { - if (this.filter == null) { - if (this.filterItem.isEmpty()) { - return Filters.getEmptyFilter(); - } else { - loadFilterFromItem(); - } - } - + if (this.filter == null) return Filters.getEmptyFilter(); return this.filter; } @@ -108,25 +106,8 @@ public FilterHandler onFilterUpdated(Consumer> onFilterUpdated) { // ***** FILTER HANDLING ******// /////////////////////////////////////// - public CustomItemStackHandler getFilterSlot() { - if (this.filterSlot == null) { - this.filterSlot = new CustomItemStackHandler(this.filterItem) { - - @Override - public int getSlotLimit(int slot) { - return 1; - } - }; - - this.filterSlot.setFilter(this::canInsertFilterItem); - } - - return this.filterSlot; - } - public void setFilterItem(ItemStack item) { - getFilterSlot().setStackInSlot(0, item); - updateFilter(); + filterSlot.setStackInSlot(0, item); } private void updateFilter() { @@ -146,21 +127,10 @@ private void updateFilter() { this.onFilterRemoved.run(); } - loadFilterFromItem(); - } - - private void loadFilterFromItem() { if (!this.filterItem.isEmpty()) { - this.filter = loadFilter(this.filterItem); + this.filter = Filters.loadFilter(filterableType, filterItem); + filter.onFilterLoaded(this); filter.setOnUpdated(this.onFilterUpdated); - if (filter instanceof SmartItemFilter smart && - container instanceof CoverBehavior cover && - cover.coverHolder instanceof MachineCoverContainer mcc) { - var machine = MetaMachine.getMachine(mcc.getLevel(), mcc.getBlockPos()); - if (machine != null) { - smart.setModeFromMachine(machine.getDefinition().getName()); - } - } this.onFilterLoaded.accept(this.filter); } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SmartItemFilter.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SmartItemFilter.java index e41a3e02ef6..cc497a8aeaa 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SmartItemFilter.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SmartItemFilter.java @@ -2,6 +2,9 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; +import com.gregtechceu.gtceu.api.cover.CoverBehavior; +import com.gregtechceu.gtceu.api.machine.MachineCoverContainer; +import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; import com.gregtechceu.gtceu.api.recipe.content.Content; import com.gregtechceu.gtceu.common.data.GTRecipeTypes; @@ -64,6 +67,17 @@ private void setFilterMode(SmartFilteringMode filterMode) { updateAndSaveFilter(); } + @Override + public void onFilterLoaded(FilterHandler handler) { + if (handler.getParentSyncObject() instanceof CoverBehavior cover && + cover.coverHolder instanceof MachineCoverContainer mcc) { + var machine = MetaMachine.getMachine(mcc.getLevel(), mcc.getBlockPos()); + if (machine != null) { + setModeFromMachine(machine.getDefinition().getName()); + } + } + } + @Override public Flow getFilterUI(GuiData data, PanelSyncManager syncManager, UISettings settings) { EnumSyncValue mode = new EnumSyncValue<>(SmartFilteringMode.class, diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java index 2a6360b16bc..84389c1c280 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java @@ -22,7 +22,6 @@ import com.gregtechceu.gtceu.api.item.component.*; import com.gregtechceu.gtceu.api.item.component.prospector.ProspectorMode; import com.gregtechceu.gtceu.api.item.tool.MaterialToolTier; -import com.gregtechceu.gtceu.api.recipe.ingredient.EnergyStack; import com.gregtechceu.gtceu.common.data.materials.GTFoods; import com.gregtechceu.gtceu.common.entity.GTBoat; import com.gregtechceu.gtceu.common.item.*; @@ -1793,7 +1792,7 @@ public static ItemEntry createFluidCell(Material mat, int capacit ///////////////////////////////////////// public static ItemEntry ITEM_FILTER = REGISTRATE.item("item_filter", ComponentItem::create) - .onRegister(attach(new FilterBehaviour<>(ItemStack.class,SimpleItemFilter::new), + .onRegister(attach(new FilterBehaviour<>(ItemStack.class, SimpleItemFilter::new), new CoverPlaceBehavior(GTCovers.ITEM_FILTER))) .onRegister(materialInfo(new ItemMaterialInfo(new MaterialStack(GTMaterials.Zinc, GTValues.M * 2), new MaterialStack(GTMaterials.Steel, GTValues.M)))) @@ -1802,14 +1801,15 @@ public static ItemEntry createFluidCell(Material mat, int capacit .item("item_tag_filter", ComponentItem::create) .lang("Item Tag Filter") .onRegister(attach( - new FilterBehaviour<>(ItemStack.class,stack -> new TagFilter<>(stack, ItemStack::getItem, ItemStack::getTags)), + new FilterBehaviour<>(ItemStack.class, + stack -> new TagFilter<>(stack, ItemStack::getItem, ItemStack::getTags)), new CoverPlaceBehavior(GTCovers.ITEM_FILTER))) .onRegister(materialInfo(new ItemMaterialInfo(new MaterialStack(GTMaterials.Zinc, GTValues.M * 2)))) .register(); public static ItemEntry SMART_ITEM_FILTER = REGISTRATE .item("item_smart_filter", ComponentItem::create) .lang("Smart Item Filter") - .onRegister(attach(new FilterBehaviour<>(ItemStack.class,SmartItemFilter::new), + .onRegister(attach(new FilterBehaviour<>(ItemStack.class, SmartItemFilter::new), new CoverPlaceBehavior(GTCovers.ITEM_FILTER))) .onRegister(materialInfo(new ItemMaterialInfo(new MaterialStack(GTMaterials.Zinc, GTValues.M * 3 / 2)))) .register(); @@ -1830,13 +1830,17 @@ public static ItemEntry createFluidCell(Material mat, int capacit public static ItemEntry COMPOSITE_ITEM_FILTER = REGISTRATE .item("composite_item_filter", ComponentItem::create) .lang("Composite Item Filter") - .onRegister(attach(new FilterBehaviour<>(ItemStack.class, stack -> new CompositeFilter<>(stack, ItemStack.class)), new CoverPlaceBehavior(GTCovers.ITEM_FILTER))) + .onRegister(attach( + new FilterBehaviour<>(ItemStack.class, stack -> new CompositeFilter<>(stack, ItemStack.class)), + new CoverPlaceBehavior(GTCovers.ITEM_FILTER))) .register(); public static ItemEntry COMPOSITE_FLUID_FILTER = REGISTRATE .item("composite_fluid_filter", ComponentItem::create) .lang("Composite Fluid Filter") - .onRegister(attach(new FilterBehaviour<>(FluidStack.class, stack -> new CompositeFilter<>(stack, FluidStack.class)), new CoverPlaceBehavior(GTCovers.ITEM_FILTER))) + .onRegister(attach( + new FilterBehaviour<>(FluidStack.class, stack -> new CompositeFilter<>(stack, FluidStack.class)), + new CoverPlaceBehavior(GTCovers.ITEM_FILTER))) .register(); public static ItemEntry COVER_WIRELESS_TRANSMITTER = REGISTRATE diff --git a/src/main/java/com/gregtechceu/gtceu/common/mui/GTMuiWidgets.java b/src/main/java/com/gregtechceu/gtceu/common/mui/GTMuiWidgets.java index dbb03d2f102..cecb9074848 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/mui/GTMuiWidgets.java +++ b/src/main/java/com/gregtechceu/gtceu/common/mui/GTMuiWidgets.java @@ -4,6 +4,7 @@ import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.cover.filter.Filter; import com.gregtechceu.gtceu.api.cover.filter.FilterHandler; +import com.gregtechceu.gtceu.api.cover.filter.Filters; import com.gregtechceu.gtceu.api.machine.MachineDefinition; import com.gregtechceu.gtceu.api.machine.feature.IHasBatterySlot; import com.gregtechceu.gtceu.api.machine.feature.IHasCircuitSlot; @@ -378,8 +379,9 @@ public static > ParentWidget createFilterRow(Flow exis syncManager.syncValue("filterSlotHandler", filterSlotHandler); IPanelHandler panelHandler = syncManager.syncedPanel("filterPanel", true, - (sm, sh) -> filterHandler.loadFilter(filterSlotHandler.getSlot().getItem()).getPanel(data, sm, - settings, false)); + (sm, sh) -> Filters.loadFilter(filterHandler.getFilterableType(), filterSlotHandler.getSlot().getItem()) + .getPanel(data, sm, + settings, false)); return existingRow .child(new ItemSlot().syncHandler(filterSlotHandler)) From 3f476a2356e3a00e2382220204cd1f5fd8d4d5ec Mon Sep 17 00:00:00 2001 From: Gustavo Date: Sat, 20 Jun 2026 11:41:48 +1000 Subject: [PATCH 09/12] update test code --- .../gtceu/api/cover/filter/CompositeFilter.java | 9 ++++++--- .../gregtechceu/gtceu/common/cover/ItemFilterCover.java | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/CompositeFilter.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/CompositeFilter.java index 00b9ef74972..0cfdbbe71a9 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/CompositeFilter.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/CompositeFilter.java @@ -16,7 +16,6 @@ import lombok.Getter; import org.jetbrains.annotations.Nullable; -import java.util.Arrays; import java.util.Objects; public class CompositeFilter extends Filter { @@ -73,7 +72,7 @@ private void onFilterItemChanged(int slot) { if (!newItem.isEmpty()) { filters[slot] = Filters.loadFilter(filterableType, newItem); Objects.requireNonNull(filters[slot]).setOnUpdated($ -> updateAndSaveFilter()); - } ; + } updateAndSaveFilter(); } @@ -85,7 +84,11 @@ public boolean supportsAmounts() { @Override public boolean test(T t) { - return Arrays.stream(filters).anyMatch(f -> f != null && f.test(t)); + for (int i=0; i<9; i++) { + Filter filter = filters[i]; + if (filter != null && filter.test(t)) return true; + } + return false; } @Override 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 6fa6c3e04d1..8c172f8b8ec 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/ItemFilterCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ItemFilterCover.java @@ -42,7 +42,7 @@ public class ItemFilterCover extends CoverBehavior implements IMuiCover { @SaveField @Getter protected FilterMode filterMode = FilterMode.FILTER_INSERT; - private FilteredItemHandlerWrapper itemFilterWrapper; + private @Nullable FilteredItemHandlerWrapper itemFilterWrapper; @Setter @SaveField @Getter From 59d6a5f6458c308c8ed1703f614b87e5d4eecc6a Mon Sep 17 00:00:00 2001 From: Gustavo Date: Fri, 3 Jul 2026 12:09:12 +1000 Subject: [PATCH 10/12] small changes and fixes --- .../api/cover/filter/CompositeFilter.java | 14 ++++---------- .../gtceu/api/cover/filter/Filter.java | 11 +++++++---- .../gtceu/api/cover/filter/Filters.java | 8 ++++---- .../api/cover/filter/SimpleFluidFilter.java | 2 +- .../api/cover/filter/SmartItemFilter.java | 4 ++-- .../gtceu/api/cover/filter/TagFilter.java | 10 +++------- .../gtceu/common/data/GTItems.java | 5 +++-- .../gtceu/common/data/GTPlaceholders.java | 9 ++++++--- .../gtceu/common/mui/GTMuiWidgets.java | 19 +++++++++---------- .../gtceu/data/lang/LangHandler.java | 1 + 10 files changed, 40 insertions(+), 43 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/CompositeFilter.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/CompositeFilter.java index 0cfdbbe71a9..1c7ba796c65 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/CompositeFilter.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/CompositeFilter.java @@ -42,7 +42,7 @@ public int getSlotLimit(int slot) { public CompositeFilter(ItemStack stack, Class filterableType) { super(stack); - var tag = stack.getOrCreateTag(); + CompoundTag tag = stack.getOrCreateTag(); this.filterableType = filterableType; this.itemStacks.setFilter(s -> Filters.isValidFilter(filterableType, s.getItem())); @@ -50,7 +50,7 @@ public CompositeFilter(ItemStack stack, Class filterableType) { itemStacks.deserializeNBT(tag.getCompound("filters")); for (int i = 0; i < 9; i++) { - var item = itemStacks.getStackInSlot(i); + ItemStack item = itemStacks.getStackInSlot(i); if (item.isEmpty()) continue; filters[i] = Filters.loadFilter(filterableType, item); Objects.requireNonNull(filters[i]).setOnUpdated($ -> updateAndSaveFilter()); @@ -59,15 +59,14 @@ public CompositeFilter(ItemStack stack, Class filterableType) { @Override protected @Nullable CompoundTag writeFilterNBT() { - if (itemStacks.toList().stream().allMatch(i -> i == ItemStack.EMPTY)) return null; - + if (itemStacks.toList().stream().allMatch(ItemStack::isEmpty)) return null; var tag = new CompoundTag(); tag.put("filters", itemStacks.serializeNBT()); return tag; } private void onFilterItemChanged(int slot) { - var newItem = itemStacks.getStackInSlot(slot); + ItemStack newItem = itemStacks.getStackInSlot(slot); filters[slot] = null; if (!newItem.isEmpty()) { filters[slot] = Filters.loadFilter(filterableType, newItem); @@ -77,11 +76,6 @@ private void onFilterItemChanged(int slot) { updateAndSaveFilter(); } - @Override - public boolean supportsAmounts() { - return false; - } - @Override public boolean test(T t) { for (int i=0; i<9; i++) { diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/Filter.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/Filter.java index 225f59f8096..b36d91a9606 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/Filter.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/Filter.java @@ -3,7 +3,7 @@ import com.gregtechceu.gtceu.common.mui.GTGuiTextures; import com.gregtechceu.gtceu.common.mui.GTMuiWidgets; -import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.core.registries.Registries; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.item.ItemStack; @@ -20,6 +20,7 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Range; +import java.util.Objects; import java.util.function.Consumer; import java.util.function.Predicate; @@ -38,10 +39,10 @@ public Filter(ItemStack stack) { /** * @return Filter panel when opened by itself (including the player inventory) */ - @SuppressWarnings("deprecation") public ModularPanel getPanel(GuiData data, PanelSyncManager syncManager, UISettings settings, boolean displayPlayerInventory) { - return new Dialog<>(BuiltInRegistries.ITEM.getKey(filterItemStack.getItem()).toString()) + return new Dialog<>(Objects.requireNonNull(data.getLevel().registryAccess().registryOrThrow(Registries.ITEM) + .getKey(filterItemStack.getItem())).toString()) .disablePanelsBelow(false) .draggable(true) .closeOnOutOfBoundsClick(false) @@ -81,7 +82,9 @@ public void onFilterLoaded(FilterHandler handler) {} /** * @return Whether this filter supports querying for exact content amounts. */ - public abstract boolean supportsAmounts(); + public boolean supportsAmounts() { + return false; + } /** * Tests if the given stack matches this filter. diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/Filters.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/Filters.java index a60439b3e0d..f1a7eef3b24 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/Filters.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/Filters.java @@ -28,7 +28,7 @@ public static void registerFilter(Class filterable, Item item, @SuppressWarnings({ "unchecked", "DataFlowIssue" }) public static Filter loadFilter(Class filterableType, ItemStack stack) { var entry = FILTERS.get(stack.getItem()); - if (entry.filterable != filterableType) return null; + if (entry.filterableType != filterableType) return null; return (Filter) entry.filterFactory.apply(stack); } @@ -42,7 +42,7 @@ public static Filter loadFluidFilter(ItemStack stack) { public static boolean isValidFilter(Class filterableType, Item item) { if (!FILTERS.containsKey(item)) return false; - return FILTERS.get(item).filterable == filterableType; + return FILTERS.get(item).filterableType == filterableType; } public static Filter getEmptyFilter() { @@ -76,7 +76,7 @@ public int testAmount(T stack) { } /** - * @param filterable The object/stack type that this filter supports. + * @param filterableType The object/stack type that this filter supports. */ - private record FilterEntry(Class filterable, Function> filterFactory) {} + private record FilterEntry(Class filterableType, Function> filterFactory) {} } diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SimpleFluidFilter.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SimpleFluidFilter.java index 5523fb45af8..28c79849eef 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SimpleFluidFilter.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SimpleFluidFilter.java @@ -126,7 +126,7 @@ public Flow getFilterUI(GuiData data, PanelSyncManager syncManager, UISettings s @Override public boolean test(FluidStack other) { - return testAmount(other) > 0L; + return testAmount(other) > 0; } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SmartItemFilter.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SmartItemFilter.java index cc497a8aeaa..fea506de0ae 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SmartItemFilter.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/SmartItemFilter.java @@ -89,7 +89,7 @@ public Flow getFilterUI(GuiData data, PanelSyncManager syncManager, UISettings s .child(new ContextMenuButton<>("smart_filter") .size(18) .requiresClick() - .tooltip(r -> r.add(Text.str("Set Machine Recipe Type"))) + .tooltip(r -> r.add(Text.lang("cover.item_smart_filter.filtering_mode.description"))) .openRightDown() .overlay(new DynamicDrawable(() -> SmartFilteringMode.getTextures()[mode.getIntValue()])) .menu(new Menu<>() @@ -111,7 +111,7 @@ public Flow getFilterUI(GuiData data, PanelSyncManager syncManager, UISettings s .tooltip(r -> r.add(Text.comp(Component .translatable(SmartFilteringMode.VALUES[w].getTooltip())))); })))) - .child(Text.str("Recipe Type").asWidget().verticalCenter().rightRel(0.f)); + .child(Text.lang("cover.item_smart_filter.recipe_type").asWidget().verticalCenter().rightRel(0.f)); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagFilter.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagFilter.java index 2aa0b9aca69..143c35cabfe 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagFilter.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/TagFilter.java @@ -44,7 +44,8 @@ public TagFilter(ItemStack stack, Function tagHolderObjectSupplier, var tag = stack.getOrCreateTag(); - filterString = tag.getString("oreDict"); + // oreDict is backwards compat + filterString = tag.contains("filter_string") ? tag.getString("filter_string") : tag.getString("oreDict"); matchExpr = TagExprFilter.parseExpression(filterString); } @@ -53,7 +54,7 @@ public TagFilter(ItemStack stack, Function tagHolderObjectSupplier, return null; } var tag = new CompoundTag(); - tag.putString("oreDict", filterString); + tag.putString("filter_string", filterString); return tag; } @@ -75,11 +76,6 @@ public Flow getFilterUI(GuiData data, PanelSyncManager syncManager, UISettings s .child(GTGuiTextures.INFO.asWidget().tooltip(infoTooltip)); } - @Override - public boolean supportsAmounts() { - return false; - } - private boolean testTagExpr(T t) { Set tags = tagsSupplier.apply(t) .map(TagKey::location) diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java index 84389c1c280..cd3af3d76b5 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java @@ -2670,10 +2670,11 @@ public static NonNullConsumer modelPredicate(ResourceLocatio }; } + @SuppressWarnings("RedundantCast") public static void registerToolTier(MaterialToolTier tier, ResourceLocation id, Collection before, Collection after) { - TierSortingRegistry.registerTier(tier, id, Arrays.asList(before.toArray(ResourceLocation[]::new)), - Arrays.asList(after.toArray(ResourceLocation[]::new))); + TierSortingRegistry.registerTier(tier, id, Arrays.asList((Object[]) before.toArray(ResourceLocation[]::new)), + Arrays.asList((Object[]) after.toArray(ResourceLocation[]::new))); } public static ResourceLocation getTierName(Tier tier) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTPlaceholders.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTPlaceholders.java index 9f53fad533f..782a4652ce7 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTPlaceholders.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTPlaceholders.java @@ -156,10 +156,13 @@ public MultiLineComponent apply(PlaceholderContext ctx, List args) throws PlaceholderException { if (ctx.pos() == null) throw new NoTargetException(); IItemHandler itemHandler = GTCapabilityHelper.getItemHandler(ctx.level(), ctx.pos(), ctx.side()); - if (args.isEmpty()) + if (args.isEmpty()) { return MultiLineComponent.literal(countItems((Filter) null, itemHandler)); - if (args.size() == 1) return MultiLineComponent - .literal(countItems(GTStringUtils.componentsToString(args.get(0)), itemHandler)); + } + if (args.size() == 1) { + return MultiLineComponent + .literal(countItems(GTStringUtils.componentsToString(args.get(0)), itemHandler)); + } if (GTStringUtils.equals(args.get(0), "filter")) { int slot = PlaceholderUtils.toInt(args.get(1)); if (ctx.itemStackHandler() == null) diff --git a/src/main/java/com/gregtechceu/gtceu/common/mui/GTMuiWidgets.java b/src/main/java/com/gregtechceu/gtceu/common/mui/GTMuiWidgets.java index cecb9074848..7be85e1048b 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/mui/GTMuiWidgets.java +++ b/src/main/java/com/gregtechceu/gtceu/common/mui/GTMuiWidgets.java @@ -2,7 +2,6 @@ import com.gregtechceu.gtceu.api.capability.IControllable; import com.gregtechceu.gtceu.api.capability.recipe.IO; -import com.gregtechceu.gtceu.api.cover.filter.Filter; import com.gregtechceu.gtceu.api.cover.filter.FilterHandler; import com.gregtechceu.gtceu.api.cover.filter.Filters; import com.gregtechceu.gtceu.api.machine.MachineDefinition; @@ -365,11 +364,11 @@ public static CycleButtonWidget createIOCycleButton(EnumSyncValue syncValue, return cycleButton; } - public static > ParentWidget createFilterRow(Flow existingRow, - FilterHandler filterHandler, - SidedPosGuiData data, - PanelSyncManager syncManager, - UISettings settings) { + public static ParentWidget createFilterRow(Flow existingRow, + FilterHandler filterHandler, + SidedPosGuiData data, + PanelSyncManager syncManager, + UISettings settings) { var filterSlot = filterHandler.getFilterSlot(); ModularSlot modSlot = new ModularSlot(filterSlot, 0) @@ -395,10 +394,10 @@ public static > ParentWidget createFilterRow(Flow exis .setEnabledIf((w) -> !filterSlotHandler.getSlot().getItem().isEmpty())); } - public static > ParentWidget createFilterRow(FilterHandler filterHandler, - SidedPosGuiData data, - PanelSyncManager syncManager, - UISettings settings) { + public static ParentWidget createFilterRow(FilterHandler filterHandler, + SidedPosGuiData data, + PanelSyncManager syncManager, + UISettings settings) { Flow row = Flow.row().coverChildrenHeight().childPadding(2); return createFilterRow(row, filterHandler, data, syncManager, settings); } diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java index 1bf77349ca5..c10f0536c58 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/LangHandler.java @@ -465,6 +465,7 @@ public static void init(RegistrateLangProvider provider) { provider.add("cover.voiding.message.disabled", "Voiding Cover Disabled"); provider.add("cover.voiding.message.enabled", "Voiding Cover Enabled"); provider.add("cover.item_smart_filter.title", "Smart Item Filter"); + provider.add("cover.item_smart_filter.recipe_type", "Recipe Type"); provider.add("cover.item_smart_filter.filtering_mode.electrolyzer", "Electrolyzer"); provider.add("cover.item_smart_filter.filtering_mode.centrifuge", "Centrifuge"); provider.add("cover.item_smart_filter.filtering_mode.sifter", "Sifter"); From 6e1b46da08fea460723f21507d6aaa1d89021384 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Fri, 3 Jul 2026 12:39:55 +1000 Subject: [PATCH 11/12] recipes --- .../gtceu/data/recipe/misc/CraftingRecipeLoader.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/CraftingRecipeLoader.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/CraftingRecipeLoader.java index 1d2936362ba..5f74234f1cd 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/CraftingRecipeLoader.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/CraftingRecipeLoader.java @@ -76,6 +76,17 @@ public static void init(Consumer provider) { "XCX", "XEX", 'X', new MaterialEntry(foil, Zinc), 'C', CustomTags.LV_CIRCUITS, 'E', new MaterialEntry(plate, Ruby)); + VanillaRecipeHelper.addShapedRecipe(provider, "item_composite_filter", COMPOSITE_ITEM_FILTER.asStack(), "XFX", + "SCS", "XFX", 'X', new MaterialEntry(foil, Zinc), 'F', ITEM_FILTER.asStack(), 'C', CustomTags.LV_CIRCUITS, 'S', new MaterialEntry(plate, Steel)); + + VanillaRecipeHelper.addShapedRecipe(provider, "fluid_composite_filter_lapis", COMPOSITE_FLUID_FILTER.asStack(), "XFX", + "SCS", "XFX", 'X', new MaterialEntry(foil, Zinc), 'F', FLUID_FILTER.asStack(), 'C', CustomTags.LV_CIRCUITS, 'S', new MaterialEntry(plate, Lapis)); + VanillaRecipeHelper.addShapedRecipe(provider, "fluid_composite_filter_lazurite", COMPOSITE_FLUID_FILTER.asStack(), "XFX", + "SCS", "XFX", 'X', new MaterialEntry(foil, Zinc), 'F', FLUID_FILTER.asStack(), 'C', CustomTags.LV_CIRCUITS, 'S', new MaterialEntry(plate, Lazurite)); + VanillaRecipeHelper.addShapedRecipe(provider, "fluid_composite_filter_sodalite", COMPOSITE_FLUID_FILTER.asStack(), "XFX", + "SCS", "XFX", 'X', new MaterialEntry(foil, Zinc), 'F', FLUID_FILTER.asStack(), 'C', CustomTags.LV_CIRCUITS, 'S', new MaterialEntry(plate, Sodalite)); + + VanillaRecipeHelper.addShapedRecipe(provider, "plank_to_wooden_shape", WOODEN_FORM_EMPTY.asStack(), " ", " X ", "s ", 'X', ItemTags.PLANKS); VanillaRecipeHelper.addShapedRecipe(provider, "wooden_shape_brick", WOODEN_FORM_BRICK.asStack(), "k ", " X", From ac1417f96a0a7425a0dd2afb4c12bf9718e46894 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Sun, 5 Jul 2026 12:29:22 +1000 Subject: [PATCH 12/12] update mui version --- gradle/forge.versions.toml | 2 +- .../recipe/misc/CraftingRecipeLoader.java | 24 ++++++++++++------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/gradle/forge.versions.toml b/gradle/forge.versions.toml index 8cc8154749d..d8bfd3195de 100644 --- a/gradle/forge.versions.toml +++ b/gradle/forge.versions.toml @@ -7,7 +7,7 @@ jei = "15.20.0.115" rei = "12.1.785" emi = "1.1.22+1.20.1" ae2 = "15.0.18" -mui = "3.3.0-SNAPSHOT" +mui = "3.3.1-20260704.213117-6" kubejs = "2001.6.5-build.16" rhino = "2001.2.3-build.10" architectury = "9.2.14" diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/CraftingRecipeLoader.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/CraftingRecipeLoader.java index 5f74234f1cd..7cd939105df 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/CraftingRecipeLoader.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/CraftingRecipeLoader.java @@ -77,15 +77,21 @@ public static void init(Consumer provider) { new MaterialEntry(plate, Ruby)); VanillaRecipeHelper.addShapedRecipe(provider, "item_composite_filter", COMPOSITE_ITEM_FILTER.asStack(), "XFX", - "SCS", "XFX", 'X', new MaterialEntry(foil, Zinc), 'F', ITEM_FILTER.asStack(), 'C', CustomTags.LV_CIRCUITS, 'S', new MaterialEntry(plate, Steel)); - - VanillaRecipeHelper.addShapedRecipe(provider, "fluid_composite_filter_lapis", COMPOSITE_FLUID_FILTER.asStack(), "XFX", - "SCS", "XFX", 'X', new MaterialEntry(foil, Zinc), 'F', FLUID_FILTER.asStack(), 'C', CustomTags.LV_CIRCUITS, 'S', new MaterialEntry(plate, Lapis)); - VanillaRecipeHelper.addShapedRecipe(provider, "fluid_composite_filter_lazurite", COMPOSITE_FLUID_FILTER.asStack(), "XFX", - "SCS", "XFX", 'X', new MaterialEntry(foil, Zinc), 'F', FLUID_FILTER.asStack(), 'C', CustomTags.LV_CIRCUITS, 'S', new MaterialEntry(plate, Lazurite)); - VanillaRecipeHelper.addShapedRecipe(provider, "fluid_composite_filter_sodalite", COMPOSITE_FLUID_FILTER.asStack(), "XFX", - "SCS", "XFX", 'X', new MaterialEntry(foil, Zinc), 'F', FLUID_FILTER.asStack(), 'C', CustomTags.LV_CIRCUITS, 'S', new MaterialEntry(plate, Sodalite)); - + "SCS", "XFX", 'X', new MaterialEntry(foil, Zinc), 'F', ITEM_FILTER.asStack(), 'C', + CustomTags.LV_CIRCUITS, 'S', new MaterialEntry(plate, Steel)); + + VanillaRecipeHelper.addShapedRecipe(provider, "fluid_composite_filter_lapis", COMPOSITE_FLUID_FILTER.asStack(), + "XFX", + "SCS", "XFX", 'X', new MaterialEntry(foil, Zinc), 'F', FLUID_FILTER.asStack(), 'C', + CustomTags.LV_CIRCUITS, 'S', new MaterialEntry(plate, Lapis)); + VanillaRecipeHelper.addShapedRecipe(provider, "fluid_composite_filter_lazurite", + COMPOSITE_FLUID_FILTER.asStack(), "XFX", + "SCS", "XFX", 'X', new MaterialEntry(foil, Zinc), 'F', FLUID_FILTER.asStack(), 'C', + CustomTags.LV_CIRCUITS, 'S', new MaterialEntry(plate, Lazurite)); + VanillaRecipeHelper.addShapedRecipe(provider, "fluid_composite_filter_sodalite", + COMPOSITE_FLUID_FILTER.asStack(), "XFX", + "SCS", "XFX", 'X', new MaterialEntry(foil, Zinc), 'F', FLUID_FILTER.asStack(), 'C', + CustomTags.LV_CIRCUITS, 'S', new MaterialEntry(plate, Sodalite)); VanillaRecipeHelper.addShapedRecipe(provider, "plank_to_wooden_shape", WOODEN_FORM_EMPTY.asStack(), " ", " X ", "s ", 'X', ItemTags.PLANKS);