Skip to content

Commit 3086710

Browse files
committed
When filter slot is empty, display a list of valid filters for the cover
1 parent a27080c commit 3086710

File tree

9 files changed

+121
-26
lines changed

9 files changed

+121
-26
lines changed

src/main/java/gregtech/api/GregTechAPI.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import gregtech.api.block.IHeatingCoilBlockStats;
66
import gregtech.api.block.coil.CoilManager;
77
import gregtech.api.command.ICommandManager;
8-
import gregtech.api.cover.CoverDefinition;
8+
import gregtech.api.cover.registry.CoverRegistry;
99
import gregtech.api.event.HighTierEvent;
1010
import gregtech.api.gui.UIFactory;
1111
import gregtech.api.metatileentity.multiblock.IBatteryData;
@@ -74,8 +74,7 @@ public class GregTechAPI {
7474
@Deprecated
7575
public static final GTControlledRegistry<ResourceLocation, UIFactory> UI_FACTORY_REGISTRY = new GTControlledRegistry<>(
7676
Short.MAX_VALUE);
77-
public static final GTControlledRegistry<ResourceLocation, CoverDefinition> COVER_REGISTRY = new GTControlledRegistry<>(
78-
Integer.MAX_VALUE);
77+
public static final CoverRegistry COVER_REGISTRY = new CoverRegistry(Integer.MAX_VALUE);
7978

8079
public static final Map<Material, Map<StoneType, IBlockOre>> oreBlockTable = new HashMap<>();
8180
public static final Object2ObjectMap<IBlockState, IHeatingCoilBlockStats> HEATING_COILS = new Object2ObjectOpenHashMap<>();
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package gregtech.api.cover.registry;
2+
3+
import gregtech.api.cover.CoverDefinition;
4+
import gregtech.api.items.metaitem.MetaItem;
5+
import gregtech.api.util.GTControlledRegistry;
6+
import gregtech.api.util.GTUtility;
7+
import gregtech.common.covers.filter.BaseFilter;
8+
import gregtech.common.covers.filter.IFilter;
9+
10+
import net.minecraft.item.ItemStack;
11+
import net.minecraft.util.ResourceLocation;
12+
13+
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
14+
import org.jetbrains.annotations.NotNull;
15+
import org.jetbrains.annotations.UnmodifiableView;
16+
17+
import java.util.EnumMap;
18+
import java.util.List;
19+
20+
public final class CoverRegistry extends GTControlledRegistry<ResourceLocation, CoverDefinition> {
21+
22+
private static final EnumMap<IFilter.FilterType, List<ItemStack>> filterCovers = new EnumMap<>(
23+
IFilter.FilterType.class);
24+
25+
public CoverRegistry(int maxId) {
26+
super(maxId);
27+
}
28+
29+
@Override
30+
public void register(int id, @NotNull ResourceLocation key, @NotNull CoverDefinition coverDefinition) {
31+
super.register(id, key, coverDefinition);
32+
33+
ItemStack coverStack = coverDefinition.getDropItemStack();
34+
if (coverStack.getItem() instanceof MetaItem<?>metaItem) {
35+
MetaItem<?>.MetaValueItem metaValueItem = metaItem.getItem(coverStack);
36+
if (metaValueItem == null) return;
37+
38+
IFilter.Factory factory = metaValueItem.getFilterFactory();
39+
if (factory == null) return;
40+
41+
BaseFilter filter = factory.create(coverStack);
42+
IFilter.FilterType filterType = filter.getType();
43+
if (filterType.isError()) return;
44+
45+
List<ItemStack> filterList = filterCovers.computeIfAbsent(filterType, $ -> new ObjectArrayList<>());
46+
filterList.add(coverStack);
47+
}
48+
}
49+
50+
@UnmodifiableView
51+
public static @NotNull List<ItemStack> getFilterItems(@NotNull IFilter.FilterType filterType) {
52+
return GTUtility.unmodifiableOrEmpty(filterCovers.get(filterType));
53+
}
54+
}

src/main/java/gregtech/api/util/GTUtility.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@
6767

6868
import java.util.AbstractList;
6969
import java.util.ArrayList;
70+
import java.util.Collections;
7071
import java.util.List;
7172
import java.util.Map;
7273
import java.util.Map.Entry;
@@ -1024,9 +1025,14 @@ public static int combineRGB(@Range(from = 0, to = 255) int r, @Range(from = 0,
10241025
return map.get(key.toWildcard());
10251026
}
10261027

1028+
@SuppressWarnings("BooleanMethodIsAlwaysInverted")
10271029
public static boolean areFluidStacksEqual(@Nullable FluidStack a, @Nullable FluidStack b) {
10281030
if (a == b) return true;
10291031
if (a == null) return false;
10301032
return a.isFluidEqual(b);
10311033
}
1034+
1035+
public static <T> @NotNull List<T> unmodifiableOrEmpty(@Nullable List<T> sourceList) {
1036+
return sourceList == null ? Collections.emptyList() : Collections.unmodifiableList(sourceList);
1037+
}
10321038
}

src/main/java/gregtech/common/covers/filter/BaseFilter.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public BaseFilterReader getFilterReader() {
5252

5353
@Override
5454
public FilterType getType() {
55-
return FilterType.ITEM;
55+
return FilterType.ERROR;
5656
}
5757
};
5858
protected IDirtyNotifiable dirtyNotifiable;
@@ -65,11 +65,13 @@ public final ItemStack getContainerStack() {
6565

6666
public static @NotNull BaseFilter getFilterFromStack(ItemStack stack) {
6767
if (stack.getItem() instanceof MetaItem<?>metaItem) {
68-
var metaValueItem = metaItem.getItem(stack);
69-
var factory = metaValueItem == null ? null : metaValueItem.getFilterFactory();
70-
if (factory != null)
68+
MetaItem<?>.MetaValueItem metaValueItem = metaItem.getItem(stack);
69+
Factory factory = metaValueItem == null ? null : metaValueItem.getFilterFactory();
70+
if (factory != null) {
7171
return factory.create(stack);
72+
}
7273
}
74+
7375
return ERROR_FILTER;
7476
}
7577

src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package gregtech.common.covers.filter;
22

33
import gregtech.api.cover.CoverWithUI;
4+
import gregtech.api.cover.registry.CoverRegistry;
45
import gregtech.api.mui.GTGuiTextures;
56
import gregtech.api.util.IDirtyNotifiable;
67
import gregtech.api.util.ItemStackHashStrategy;
@@ -15,6 +16,7 @@
1516
import com.cleanroommc.modularui.api.drawable.IKey;
1617
import com.cleanroommc.modularui.api.widget.IWidget;
1718
import com.cleanroommc.modularui.drawable.GuiTextures;
19+
import com.cleanroommc.modularui.drawable.ItemDrawable;
1820
import com.cleanroommc.modularui.factory.GuiData;
1921
import com.cleanroommc.modularui.network.NetworkUtils;
2022
import com.cleanroommc.modularui.utils.Alignment;
@@ -96,21 +98,26 @@ public boolean isItemValid(int slot, @NotNull ItemStack stack) {
9698
return isItemValid(stack);
9799
}
98100

99-
protected abstract boolean isItemValid(ItemStack stack);
101+
protected boolean isItemValid(ItemStack stack) {
102+
BaseFilter filter = BaseFilter.getFilterFromStack(stack);
103+
return filter.getType() == getFilterType();
104+
}
100105

101106
protected abstract @NotNull IKey getFilterKey();
102107

108+
protected abstract @NotNull IFilter.FilterType getFilterType();
109+
103110
@Override
104111
public @NotNull ItemStack insertItem(int slot, @NotNull ItemStack stack, boolean simulate) {
105112
if (!isItemValid(stack)) return stack;
106-
var remainder = super.insertItem(slot, stack, simulate);
113+
ItemStack remainder = super.insertItem(slot, stack, simulate);
107114
if (!simulate) setFilter(BaseFilter.getFilterFromStack(stack));
108115
return remainder;
109116
}
110117

111118
@Override
112119
public @NotNull ItemStack extractItem(int slot, int amount, boolean simulate) {
113-
var extracted = super.extractItem(slot, amount, simulate);
120+
ItemStack extracted = super.extractItem(slot, amount, simulate);
114121
if (!extracted.isEmpty()) {
115122
setFilter(null);
116123
}
@@ -234,6 +241,8 @@ public IWidget initUI(GuiData data, PanelSyncManager manager) {
234241
.widthRel(1f)
235242
.marginBottom(2)
236243
.child(new ItemSlot()
244+
.marginRight(2)
245+
.size(18)
237246
.slot(SyncHandlers.itemSlot(this, 0)
238247
.filter(this::isItemValid)
239248
.singletonSlotGroup(101)
@@ -249,8 +258,19 @@ public IWidget initUI(GuiData data, PanelSyncManager manager) {
249258
manager.callSyncedAction("update_filter_panel", packetBuffer -> {});
250259
}
251260
}))
252-
.marginRight(2)
253-
.size(18)
261+
.tooltipBuilder(tooltip -> {
262+
ItemStack filterStack = getFilterStack();
263+
if (filterStack.isEmpty()) {
264+
tooltip.addLine(IKey.lang("cover.universal.filter_slot.tooltip_header"));
265+
for (ItemStack filterItem : CoverRegistry.getFilterItems(getFilterType())) {
266+
tooltip.add(new ItemDrawable(filterItem));
267+
tooltip.add(IKey.str(" - "));
268+
tooltip.addLine(IKey.str(filterItem.getDisplayName()));
269+
}
270+
}
271+
// We don't need to .addFromItem because RichTooltip#tooltipBuilder creates compound
272+
// builders if the widget already has one.
273+
})
254274
.background(GTGuiTextures.SLOT, GTGuiTextures.FILTER_SLOT_OVERLAY.asIcon()
255275
.size(16)))
256276
.child(new ButtonWidget<>()

src/main/java/gregtech/common/covers/filter/FluidFilterContainer.java

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import gregtech.api.util.IDirtyNotifiable;
44

5-
import net.minecraft.item.ItemStack;
65
import net.minecraftforge.fluids.FluidStack;
76

87
import com.cleanroommc.modularui.api.drawable.IKey;
@@ -14,16 +13,15 @@ public FluidFilterContainer(IDirtyNotifiable dirtyNotifiable) {
1413
super(dirtyNotifiable);
1514
}
1615

17-
@Override
18-
protected boolean isItemValid(ItemStack stack) {
19-
var filter = BaseFilter.getFilterFromStack(stack);
20-
return filter != BaseFilter.ERROR_FILTER && filter.getType() == IFilter.FilterType.FLUID;
21-
}
22-
2316
@Override
2417
protected @NotNull IKey getFilterKey() {
2518
return IKey.lang(() -> hasFilter() ?
2619
getFilterStack().getTranslationKey() + ".name" :
2720
"metaitem.fluid_filter.name");
2821
}
22+
23+
@Override
24+
protected IFilter.@NotNull FilterType getFilterType() {
25+
return IFilter.FilterType.FLUID;
26+
}
2927
}

src/main/java/gregtech/common/covers/filter/IFilter.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,24 @@ default int getTransferLimit(int slot, int transferSize) {
6464
FilterType getType();
6565

6666
enum FilterType {
67+
6768
ITEM,
68-
FLUID
69+
FLUID,
70+
ERROR;
71+
72+
public static final FilterType[] VALUES = values();
73+
74+
public boolean isItemFilter() {
75+
return this == ITEM;
76+
}
77+
78+
public boolean isFluidFilter() {
79+
return this == FLUID;
80+
}
81+
82+
public boolean isError() {
83+
return this == ERROR;
84+
}
6985
}
7086

7187
// this only exists so i can pass in the constructor reference as a metaitem componant

src/main/java/gregtech/common/covers/filter/ItemFilterContainer.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,15 @@ public ItemFilterContainer(IDirtyNotifiable dirtyNotifiable) {
1313
super(dirtyNotifiable);
1414
}
1515

16-
@Override
17-
protected boolean isItemValid(ItemStack stack) {
18-
var filter = BaseFilter.getFilterFromStack(stack);
19-
return filter != BaseFilter.ERROR_FILTER && filter.getType() == IFilter.FilterType.ITEM;
20-
}
21-
2216
@Override
2317
protected @NotNull IKey getFilterKey() {
2418
return IKey.lang(() -> hasFilter() ?
2519
getFilterStack().getTranslationKey() + ".name" :
2620
"metaitem.item_filter.name");
2721
}
22+
23+
@Override
24+
protected IFilter.@NotNull FilterType getFilterType() {
25+
return IFilter.FilterType.ITEM;
26+
}
2827
}

src/main/resources/assets/gregtech/lang/en_us.lang

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1356,6 +1356,7 @@ cover.generic.io=IO Mode
13561356
cover.universal.mode.export=Mode: Export
13571357
cover.universal.mode.import=Mode: Import
13581358

1359+
cover.universal.filter_slot.tooltip_header=Valid filters:
13591360
cover.conveyor.title=Conveyor Cover Settings (%s)
13601361
cover.conveyor.transfer_rate=§7items/sec
13611362
cover.conveyor.mode.export=Mode: Export

0 commit comments

Comments
 (0)