Skip to content

Commit 7cdaf89

Browse files
authored
Apify filters (#8132)
1 parent 83f9910 commit 7cdaf89

File tree

12 files changed

+293
-195
lines changed

12 files changed

+293
-195
lines changed

src/main/java/com/simibubi/create/AllItems.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,10 @@
4747
import com.simibubi.create.content.logistics.box.PackageItem;
4848
import com.simibubi.create.content.logistics.box.PackageStyles;
4949
import com.simibubi.create.content.logistics.box.PackageStyles.PackageStyle;
50+
import com.simibubi.create.content.logistics.filter.AttributeFilterItem;
5051
import com.simibubi.create.content.logistics.filter.FilterItem;
52+
import com.simibubi.create.content.logistics.filter.ListFilterItem;
53+
import com.simibubi.create.content.logistics.filter.PackageFilterItem;
5154
import com.simibubi.create.content.logistics.tableCloth.ShoppingListItem;
5255
import com.simibubi.create.content.materials.ExperienceNuggetItem;
5356
import com.simibubi.create.content.processing.burner.BlazeBurnerBlockItem;
@@ -439,14 +442,14 @@ public class AllItems {
439442
}
440443
}
441444

442-
public static final ItemEntry<FilterItem> FILTER = REGISTRATE.item("filter", FilterItem::regular)
445+
public static final ItemEntry<ListFilterItem> FILTER = REGISTRATE.item("filter", FilterItem::regular)
443446
.lang("List Filter")
444-
.register(),
447+
.register();
445448

446-
ATTRIBUTE_FILTER = REGISTRATE.item("attribute_filter", FilterItem::attribute)
447-
.register(),
449+
public static final ItemEntry<AttributeFilterItem> ATTRIBUTE_FILTER = REGISTRATE.item("attribute_filter", FilterItem::attribute)
450+
.register();
448451

449-
PACKAGE_FILTER = REGISTRATE.item("package_filter", FilterItem::address)
452+
public static final ItemEntry<PackageFilterItem> PACKAGE_FILTER = REGISTRATE.item("package_filter", FilterItem::address)
450453
.register();
451454

452455
public static final ItemEntry<ScheduleItem> SCHEDULE = REGISTRATE.item("schedule", ScheduleItem::new)

src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintItem.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
import com.simibubi.create.AllItems;
66
import com.simibubi.create.content.logistics.filter.AttributeFilterMenu.WhitelistMode;
7-
import com.simibubi.create.content.logistics.filter.FilterItem;
87
import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttribute;
98
import com.simibubi.create.content.logistics.item.filter.attribute.attributes.InTagAttribute;
109

@@ -93,7 +92,7 @@ public static void assignCompleteRecipe(Level level, ItemStackHandler inv, Recip
9392
}
9493

9594
private static ItemStack convertIngredientToFilter(Ingredient ingredient) {
96-
Ingredient.Value[] acceptedItems = ingredient.values;
95+
Value[] acceptedItems = ingredient.values;
9796
if (acceptedItems == null || acceptedItems.length > 18)
9897
return ItemStack.EMPTY;
9998
if (acceptedItems.length == 0)
@@ -102,7 +101,7 @@ private static ItemStack convertIngredientToFilter(Ingredient ingredient) {
102101
return convertIItemListToFilter(acceptedItems[0]);
103102

104103
ItemStack result = AllItems.FILTER.asStack();
105-
ItemStackHandler filterItems = FilterItem.getFilterItems(result);
104+
ItemStackHandler filterItems = AllItems.FILTER.get().getFilterItemHandler(result);
106105
for (int i = 0; i < acceptedItems.length; i++)
107106
filterItems.setStackInSlot(i, convertIItemListToFilter(acceptedItems[i]));
108107
result.getOrCreateTag()
@@ -133,7 +132,7 @@ private static ItemStack convertIItemListToFilter(Value itemList) {
133132

134133
if (itemList instanceof MultiItemValue) {
135134
ItemStack result = AllItems.FILTER.asStack();
136-
ItemStackHandler filterItems = FilterItem.getFilterItems(result);
135+
ItemStackHandler filterItems = AllItems.FILTER.get().getFilterItemHandler(result);
137136
int i = 0;
138137
for (ItemStack itemStack : stacks) {
139138
if (i >= 18)

src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintOverlayRenderer.java

Lines changed: 2 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,14 @@
1212
import com.simibubi.create.content.equipment.blueprint.BlueprintEntity.BlueprintCraftingInventory;
1313
import com.simibubi.create.content.equipment.blueprint.BlueprintEntity.BlueprintSection;
1414
import com.simibubi.create.content.logistics.BigItemStack;
15-
import com.simibubi.create.content.logistics.filter.AttributeFilterMenu.WhitelistMode;
1615
import com.simibubi.create.content.logistics.filter.FilterItem;
1716
import com.simibubi.create.content.logistics.filter.FilterItemStack;
18-
import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttribute;
19-
import com.simibubi.create.content.logistics.item.filter.attribute.attributes.InTagAttribute;
2017
import com.simibubi.create.content.logistics.packager.InventorySummary;
2118
import com.simibubi.create.content.logistics.tableCloth.BlueprintOverlayShopContext;
2219
import com.simibubi.create.content.logistics.tableCloth.ShoppingListItem.ShoppingList;
2320
import com.simibubi.create.content.logistics.tableCloth.TableClothBlockEntity;
2421
import com.simibubi.create.content.trains.track.TrackPlacement.PlacementInfo;
2522
import com.simibubi.create.foundation.gui.AllGuiTextures;
26-
import com.simibubi.create.foundation.item.ItemHelper;
2723

2824
import net.createmod.catnip.animation.AnimationTickHolder;
2925
import net.createmod.catnip.data.Couple;
@@ -35,7 +31,6 @@
3531
import net.minecraft.client.gui.GuiGraphics;
3632
import net.minecraft.client.gui.screens.inventory.tooltip.TooltipRenderUtil;
3733
import net.minecraft.nbt.CompoundTag;
38-
import net.minecraft.nbt.ListTag;
3934
import net.minecraft.network.chat.Component;
4035
import net.minecraft.world.entity.player.Player;
4136
import net.minecraft.world.inventory.CraftingContainer;
@@ -54,9 +49,6 @@
5449
import net.minecraftforge.client.gui.overlay.IGuiOverlay;
5550
import net.minecraftforge.items.ItemHandlerHelper;
5651
import net.minecraftforge.items.ItemStackHandler;
57-
import net.minecraftforge.registries.ForgeRegistries;
58-
import net.minecraftforge.registries.tags.ITag;
59-
import net.minecraftforge.registries.tags.ITagManager;
6052

6153
// TODO - Split up into specific overlays
6254
public class BlueprintOverlayRenderer {
@@ -439,34 +431,8 @@ public static void drawItemStack(GuiGraphics graphics, Minecraft mc, int x, int
439431

440432
private static ItemStack[] getItemsMatchingFilter(ItemStack filter) {
441433
return cachedRenderedFilters.computeIfAbsent(filter, itemStack -> {
442-
CompoundTag tag = itemStack.getOrCreateTag();
443-
444-
if (AllItems.FILTER.isIn(itemStack) && !tag.getBoolean("Blacklist")) {
445-
ItemStackHandler filterItems = FilterItem.getFilterItems(itemStack);
446-
return ItemHelper.getNonEmptyStacks(filterItems).toArray(ItemStack[]::new);
447-
}
448-
449-
if (AllItems.ATTRIBUTE_FILTER.isIn(itemStack)) {
450-
WhitelistMode whitelistMode = WhitelistMode.values()[tag.getInt("WhitelistMode")];
451-
ListTag attributes = tag.getList("MatchedAttributes", net.minecraft.nbt.Tag.TAG_COMPOUND);
452-
if (whitelistMode == WhitelistMode.WHITELIST_DISJ && attributes.size() == 1) {
453-
ItemAttribute fromNBT = ItemAttribute.loadStatic((CompoundTag) attributes.get(0));
454-
if (fromNBT instanceof InTagAttribute inTag) {
455-
ITagManager<Item> tagManager = ForgeRegistries.ITEMS.tags();
456-
if (tagManager.isKnownTagName(inTag.tag)) {
457-
ITag<Item> taggedItems = tagManager.getTag(inTag.tag);
458-
if (!taggedItems.isEmpty()) {
459-
ItemStack[] stacks = new ItemStack[taggedItems.size()];
460-
int i = 0;
461-
for (Item item : taggedItems) {
462-
stacks[i] = new ItemStack(item);
463-
i++;
464-
}
465-
return stacks;
466-
}
467-
}
468-
}
469-
}
434+
if (itemStack.getItem() instanceof FilterItem filterItem) {
435+
return filterItem.getFilterItems(itemStack);
470436
}
471437

472438
return new ItemStack[0];

src/main/java/com/simibubi/create/content/logistics/filter/AbstractFilterScreen.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import java.util.List;
77

88
import com.google.common.collect.ImmutableList;
9-
import com.simibubi.create.AllItems;
109
import com.simibubi.create.AllPackets;
1110
import com.simibubi.create.content.logistics.filter.FilterScreenPacket.Option;
1211
import com.simibubi.create.foundation.gui.AllGuiTextures;
@@ -73,16 +72,18 @@ protected void renderBg(GuiGraphics graphics, float partialTicks, int mouseX, in
7372

7473
background.render(graphics, x, y);
7574
graphics.drawString(font, title, x + (background.getWidth() - 8) / 2 - font.width(title) / 2, y + 4,
76-
AllItems.PACKAGE_FILTER.isIn(menu.contentHolder) ? 0x3D3C48
77-
: AllItems.FILTER.isIn(menu.contentHolder) ? 0x303030 : 0x592424,
78-
false);
75+
getTitleColor(), false);
7976

8077
GuiGameElement.of(menu.contentHolder).<GuiGameElement
8178
.GuiRenderBuilder>at(x + background.getWidth() + 8, y + background.getHeight() - 52, -200)
8279
.scale(4)
8380
.render(graphics);
8481
}
8582

83+
protected int getTitleColor() {
84+
return 0x592424;
85+
}
86+
8687
@Override
8788
protected void containerTick() {
8889
if (!menu.player.getMainHandItem()
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
package com.simibubi.create.content.logistics.filter;
2+
3+
import com.simibubi.create.content.logistics.filter.AttributeFilterMenu.WhitelistMode;
4+
import com.simibubi.create.content.logistics.filter.FilterItemStack.AttributeFilterItemStack;
5+
import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttribute;
6+
import com.simibubi.create.content.logistics.item.filter.attribute.attributes.InTagAttribute;
7+
import com.simibubi.create.foundation.utility.CreateLang;
8+
9+
import net.minecraft.ChatFormatting;
10+
import net.minecraft.nbt.CompoundTag;
11+
import net.minecraft.nbt.ListTag;
12+
import net.minecraft.nbt.Tag;
13+
import net.minecraft.network.chat.Component;
14+
import net.minecraft.world.entity.player.Inventory;
15+
import net.minecraft.world.entity.player.Player;
16+
import net.minecraft.world.inventory.AbstractContainerMenu;
17+
import net.minecraft.world.item.Item;
18+
import net.minecraft.world.item.ItemStack;
19+
20+
import net.minecraftforge.registries.ForgeRegistries;
21+
import net.minecraftforge.registries.tags.ITag;
22+
import net.minecraftforge.registries.tags.ITagManager;
23+
24+
import java.util.ArrayList;
25+
import java.util.Collections;
26+
import java.util.List;
27+
28+
public class AttributeFilterItem extends FilterItem {
29+
protected AttributeFilterItem(Properties properties) {
30+
super(properties);
31+
}
32+
33+
@Override
34+
public List<Component> makeSummary(ItemStack filter) {
35+
if (!filter.hasTag()) return Collections.emptyList();
36+
37+
List<Component> list = new ArrayList<>();
38+
39+
WhitelistMode whitelistMode = WhitelistMode.values()[filter.getOrCreateTag()
40+
.getInt("WhitelistMode")];
41+
list.add((whitelistMode == WhitelistMode.WHITELIST_CONJ
42+
? CreateLang.translateDirect("gui.attribute_filter.allow_list_conjunctive")
43+
: whitelistMode == WhitelistMode.WHITELIST_DISJ
44+
? CreateLang.translateDirect("gui.attribute_filter.allow_list_disjunctive")
45+
: CreateLang.translateDirect("gui.attribute_filter.deny_list")).withStyle(ChatFormatting.GOLD));
46+
47+
int count = 0;
48+
ListTag attributes = filter.getOrCreateTag()
49+
.getList("MatchedAttributes", Tag.TAG_COMPOUND);
50+
for (Tag inbt : attributes) {
51+
CompoundTag compound = (CompoundTag) inbt;
52+
ItemAttribute attribute = ItemAttribute.loadStatic(compound);
53+
if (attribute == null)
54+
continue;
55+
boolean inverted = compound.getBoolean("Inverted");
56+
if (count > 3) {
57+
list.add(Component.literal("- ...")
58+
.withStyle(ChatFormatting.DARK_GRAY));
59+
break;
60+
}
61+
list.add(Component.literal("- ")
62+
.append(attribute.format(inverted)));
63+
count++;
64+
}
65+
66+
if (count == 0)
67+
return Collections.emptyList();
68+
69+
return list;
70+
}
71+
72+
@Override
73+
public AbstractContainerMenu createMenu(int id, Inventory inv, Player player) {
74+
return AttributeFilterMenu.create(id, inv, player.getMainHandItem());
75+
}
76+
77+
@Override
78+
public FilterItemStack makeStackWrapper(ItemStack filter) {
79+
return new AttributeFilterItemStack(filter);
80+
}
81+
82+
@Override
83+
public ItemStack[] getFilterItems(ItemStack itemStack) {
84+
CompoundTag tag = itemStack.getOrCreateTag();
85+
86+
WhitelistMode whitelistMode = WhitelistMode.values()[tag.getInt("WhitelistMode")];
87+
ListTag attributes = tag.getList("MatchedAttributes", net.minecraft.nbt.Tag.TAG_COMPOUND);
88+
89+
if (whitelistMode == WhitelistMode.WHITELIST_DISJ && attributes.size() == 1) {
90+
ItemAttribute fromNBT = ItemAttribute.loadStatic((CompoundTag) attributes.get(0));
91+
if (fromNBT instanceof InTagAttribute inTag) {
92+
ITagManager<Item> tagManager = ForgeRegistries.ITEMS.tags();
93+
if (tagManager.isKnownTagName(inTag.tag)) {
94+
ITag<Item> taggedItems = tagManager.getTag(inTag.tag);
95+
if (!taggedItems.isEmpty()) {
96+
ItemStack[] stacks = new ItemStack[taggedItems.size()];
97+
int i = 0;
98+
for (Item item : taggedItems) {
99+
stacks[i] = new ItemStack(item);
100+
i++;
101+
}
102+
return stacks;
103+
}
104+
}
105+
}
106+
}
107+
return new ItemStack[0];
108+
}
109+
}

0 commit comments

Comments
 (0)