From 4f511920570d057d9bed2726ffe796d824bbbe06 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 20 Mar 2024 12:30:11 -0700 Subject: [PATCH] try to make failing to get a filter less aggressive --- .../common/covers/CoverFluidFilter.java | 5 +- .../common/covers/CoverItemFilter.java | 7 ++- .../covers/filter/BaseFilterContainer.java | 6 +-- .../covers/filter/FilterTypeRegistry.java | 47 ++++++++++++++++++- .../common/covers/filter/IFilter.java | 2 +- 5 files changed, 58 insertions(+), 9 deletions(-) diff --git a/src/main/java/gregtech/common/covers/CoverFluidFilter.java b/src/main/java/gregtech/common/covers/CoverFluidFilter.java index 0a7c1b2b58a..42929a14eaa 100644 --- a/src/main/java/gregtech/common/covers/CoverFluidFilter.java +++ b/src/main/java/gregtech/common/covers/CoverFluidFilter.java @@ -11,6 +11,7 @@ import gregtech.client.renderer.texture.cube.SimpleOverlayRenderer; import gregtech.client.utils.TooltipHelper; import gregtech.common.covers.filter.BaseFilter; +import gregtech.common.covers.filter.FilterTypeRegistry; import gregtech.common.covers.filter.FluidFilterContainer; import net.minecraft.entity.player.EntityPlayer; @@ -109,7 +110,9 @@ public FluidFilterMode getFilterMode() { @SuppressWarnings("DataFlowIssue") // this cover always has a filter public @NotNull BaseFilter getFilter() { - return this.fluidFilterContainer.getFilter(); + return this.fluidFilterContainer.hasFilter() ? + this.fluidFilterContainer.getFilter() : + FilterTypeRegistry.ERROR_FILTER; } @Override diff --git a/src/main/java/gregtech/common/covers/CoverItemFilter.java b/src/main/java/gregtech/common/covers/CoverItemFilter.java index 2567ee6872e..636888903c6 100644 --- a/src/main/java/gregtech/common/covers/CoverItemFilter.java +++ b/src/main/java/gregtech/common/covers/CoverItemFilter.java @@ -11,6 +11,7 @@ import gregtech.client.renderer.texture.cube.SimpleOverlayRenderer; import gregtech.client.utils.TooltipHelper; import gregtech.common.covers.filter.BaseFilter; +import gregtech.common.covers.filter.FilterTypeRegistry; import gregtech.common.covers.filter.ItemFilterContainer; import net.minecraft.entity.player.EntityPlayer; @@ -105,9 +106,11 @@ public ItemFilterMode getFilterMode() { return filterMode; } - @SuppressWarnings("DataFlowIssue") // this cover always has a filter + @SuppressWarnings("DataFlowIssue") // this cover should always have a filter public @NotNull BaseFilter getFilter() { - return this.itemFilterContainer.getFilter(); + return this.itemFilterContainer.hasFilter() ? + this.itemFilterContainer.getFilter() : + FilterTypeRegistry.ERROR_FILTER; } @Override diff --git a/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java b/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java index f88805621cb..6477f2d0052 100644 --- a/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java +++ b/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java @@ -206,11 +206,11 @@ public IWidget initUI(ModularPanel main, GuiSyncManager manager) { var panel = new PanelSyncHandler(main) { // the panel can't be opened if there's no filter, so `getFilter()` will never be null - @SuppressWarnings("DataFlowIssue") @Override public ModularPanel createUI(ModularPanel mainPanel, GuiSyncManager syncManager) { - getFilter().setMaxTransferSize(getMaxTransferSize()); - return getFilter().createPopupPanel(syncManager); + var filter = hasFilter() ? getFilter() : FilterTypeRegistry.ERROR_FILTER; + filter.setMaxTransferSize(getMaxTransferSize()); + return filter.createPopupPanel(syncManager); } }; manager.syncValue("filter_panel", panel); diff --git a/src/main/java/gregtech/common/covers/filter/FilterTypeRegistry.java b/src/main/java/gregtech/common/covers/filter/FilterTypeRegistry.java index aefc50f0912..795d70db8fc 100644 --- a/src/main/java/gregtech/common/covers/filter/FilterTypeRegistry.java +++ b/src/main/java/gregtech/common/covers/filter/FilterTypeRegistry.java @@ -1,10 +1,18 @@ package gregtech.common.covers.filter; +import gregtech.api.mui.GTGuis; +import gregtech.api.util.GTLog; import gregtech.api.util.ItemStackHashStrategy; +import gregtech.common.covers.filter.readers.BaseFilterReader; import gregtech.common.items.MetaItems; import net.minecraft.item.ItemStack; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.utils.Alignment; +import com.cleanroommc.modularui.value.sync.GuiSyncManager; +import com.cleanroommc.modularui.widget.Widget; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import it.unimi.dsi.fastutil.objects.Object2IntOpenCustomHashMap; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenCustomHashMap; @@ -40,6 +48,36 @@ public class FilterTypeRegistry { private static final Map itemFilterById = new Int2ObjectOpenHashMap<>(); private static final Map fluidFilterById = new Int2ObjectOpenHashMap<>(); + public static final BaseFilter ERROR_FILTER; + + static { + ERROR_FILTER = new BaseFilter() { + + @Override + public @NotNull ModularPanel createPopupPanel(GuiSyncManager syncManager) { + return GTGuis.createPopupPanel("error", 100, 100) + .child(createWidgets(syncManager)); + } + + @Override + public @NotNull ModularPanel createPanel(GuiSyncManager syncManager) { + return GTGuis.createPanel("error", 100, 100) + .child(createWidgets(syncManager)); + } + + @Override + public @NotNull Widget createWidgets(GuiSyncManager syncManager) { + return IKey.lang("INVALID FILTER").alignment(Alignment.Center).asWidget(); + } + + @Override + public FilterType getType() { + return FilterType.ITEM; + } + }; + ERROR_FILTER.setFilterReader(new BaseFilterReader(ItemStack.EMPTY, 0) {}); + } + public static void init() { // todo call this in MetaItems as a component or something registerFilter(SimpleFluidFilter::new, MetaItems.FLUID_FILTER.getStackForm()); @@ -109,6 +147,8 @@ public static int getIdForFluidFilter(BaseFilter fluidFilter) { @Deprecated @ApiStatus.ScheduledForRemoval(inVersion = "2.10") public static BaseFilter createItemFilterById(int filterId) { + if (!itemFilterById.containsKey(filterId)) + return ERROR_FILTER; var factory = itemFilterById.get(filterId); return createNewFilterInstance(factory); } @@ -119,14 +159,17 @@ public static BaseFilter createItemFilterById(int filterId) { @Deprecated @ApiStatus.ScheduledForRemoval(inVersion = "2.10") public static BaseFilter createFluidFilterById(int filterId) { + if (!fluidFilterById.containsKey(filterId)) + return ERROR_FILTER; var factory = fluidFilterById.get(filterId); return createNewFilterInstance(factory); } public static @NotNull BaseFilter getFilterForStack(ItemStack stack) { if (!filterByStack.containsKey(stack)) { - throw new IllegalArgumentException( - String.format("Failed to create filter instance for stack %s", stack)); + GTLog.logger.warn(new IllegalArgumentException( + String.format("Failed to create filter instance for stack %s", stack))); + return ERROR_FILTER; } return filterByStack.get(stack).create(stack); } diff --git a/src/main/java/gregtech/common/covers/filter/IFilter.java b/src/main/java/gregtech/common/covers/filter/IFilter.java index ab9f7998312..3e6c44f713b 100644 --- a/src/main/java/gregtech/common/covers/filter/IFilter.java +++ b/src/main/java/gregtech/common/covers/filter/IFilter.java @@ -16,7 +16,7 @@ public interface IFilter { @Deprecated - void initUI(Consumer widgetGroup); + default void initUI(Consumer widgetGroup) {} /** Uses Cleanroom MUI */ @NotNull