diff --git a/src/main/java/com/simibubi/create/AllItems.java b/src/main/java/com/simibubi/create/AllItems.java index 2b86d93f13..af20155f76 100644 --- a/src/main/java/com/simibubi/create/AllItems.java +++ b/src/main/java/com/simibubi/create/AllItems.java @@ -48,7 +48,10 @@ import com.simibubi.create.content.logistics.box.PackageItem; import com.simibubi.create.content.logistics.box.PackageStyles; import com.simibubi.create.content.logistics.box.PackageStyles.PackageStyle; +import com.simibubi.create.content.logistics.filter.AttributeFilterItem; import com.simibubi.create.content.logistics.filter.FilterItem; +import com.simibubi.create.content.logistics.filter.ListFilterItem; +import com.simibubi.create.content.logistics.filter.PackageFilterItem; import com.simibubi.create.content.logistics.tableCloth.ShoppingListItem; import com.simibubi.create.content.materials.ExperienceNuggetItem; import com.simibubi.create.content.processing.burner.BlazeBurnerBlockItem; @@ -440,14 +443,14 @@ public class AllItems { } } - public static final ItemEntry FILTER = REGISTRATE.item("filter", FilterItem::regular) + public static final ItemEntry FILTER = REGISTRATE.item("filter", FilterItem::regular) .lang("List Filter") - .register(), + .register(); - ATTRIBUTE_FILTER = REGISTRATE.item("attribute_filter", FilterItem::attribute) - .register(), + public static final ItemEntry ATTRIBUTE_FILTER = REGISTRATE.item("attribute_filter", FilterItem::attribute) + .register(); - PACKAGE_FILTER = REGISTRATE.item("package_filter", FilterItem::address) + public static final ItemEntry PACKAGE_FILTER = REGISTRATE.item("package_filter", FilterItem::address) .register(); public static final ItemEntry SCHEDULE = REGISTRATE.item("schedule", ScheduleItem::new) diff --git a/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintItem.java b/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintItem.java index f6c6eb7abe..9329262d92 100644 --- a/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintItem.java +++ b/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintItem.java @@ -4,7 +4,6 @@ import com.simibubi.create.AllItems; import com.simibubi.create.content.logistics.filter.AttributeFilterMenu.WhitelistMode; -import com.simibubi.create.content.logistics.filter.FilterItem; import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttribute; import com.simibubi.create.content.logistics.item.filter.attribute.attributes.InTagAttribute; @@ -93,7 +92,7 @@ public static void assignCompleteRecipe(Level level, ItemStackHandler inv, Recip } private static ItemStack convertIngredientToFilter(Ingredient ingredient) { - Ingredient.Value[] acceptedItems = ingredient.values; + Value[] acceptedItems = ingredient.values; if (acceptedItems == null || acceptedItems.length > 18) return ItemStack.EMPTY; if (acceptedItems.length == 0) @@ -102,7 +101,7 @@ private static ItemStack convertIngredientToFilter(Ingredient ingredient) { return convertIItemListToFilter(acceptedItems[0]); ItemStack result = AllItems.FILTER.asStack(); - ItemStackHandler filterItems = FilterItem.getFilterItems(result); + ItemStackHandler filterItems = AllItems.FILTER.get().getFilterItemHandler(result); for (int i = 0; i < acceptedItems.length; i++) filterItems.setStackInSlot(i, convertIItemListToFilter(acceptedItems[i])); result.getOrCreateTag() @@ -133,7 +132,7 @@ private static ItemStack convertIItemListToFilter(Value itemList) { if (itemList instanceof MultiItemValue) { ItemStack result = AllItems.FILTER.asStack(); - ItemStackHandler filterItems = FilterItem.getFilterItems(result); + ItemStackHandler filterItems = AllItems.FILTER.get().getFilterItemHandler(result); int i = 0; for (ItemStack itemStack : stacks) { if (i >= 18) diff --git a/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintOverlayRenderer.java b/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintOverlayRenderer.java index 09f6680f65..0fab791934 100644 --- a/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintOverlayRenderer.java +++ b/src/main/java/com/simibubi/create/content/equipment/blueprint/BlueprintOverlayRenderer.java @@ -12,18 +12,14 @@ import com.simibubi.create.content.equipment.blueprint.BlueprintEntity.BlueprintCraftingInventory; import com.simibubi.create.content.equipment.blueprint.BlueprintEntity.BlueprintSection; import com.simibubi.create.content.logistics.BigItemStack; -import com.simibubi.create.content.logistics.filter.AttributeFilterMenu.WhitelistMode; import com.simibubi.create.content.logistics.filter.FilterItem; import com.simibubi.create.content.logistics.filter.FilterItemStack; -import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttribute; -import com.simibubi.create.content.logistics.item.filter.attribute.attributes.InTagAttribute; import com.simibubi.create.content.logistics.packager.InventorySummary; import com.simibubi.create.content.logistics.tableCloth.BlueprintOverlayShopContext; import com.simibubi.create.content.logistics.tableCloth.ShoppingListItem.ShoppingList; import com.simibubi.create.content.logistics.tableCloth.TableClothBlockEntity; import com.simibubi.create.content.trains.track.TrackPlacement.PlacementInfo; import com.simibubi.create.foundation.gui.AllGuiTextures; -import com.simibubi.create.foundation.item.ItemHelper; import net.createmod.catnip.animation.AnimationTickHolder; import net.createmod.catnip.data.Couple; @@ -35,7 +31,6 @@ import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.screens.inventory.tooltip.TooltipRenderUtil; import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.ListTag; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.CraftingContainer; @@ -54,9 +49,6 @@ import net.minecraftforge.client.gui.overlay.IGuiOverlay; import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.items.ItemStackHandler; -import net.minecraftforge.registries.ForgeRegistries; -import net.minecraftforge.registries.tags.ITag; -import net.minecraftforge.registries.tags.ITagManager; public class BlueprintOverlayRenderer { @@ -438,34 +430,8 @@ public static void drawItemStack(GuiGraphics graphics, Minecraft mc, int x, int private static ItemStack[] getItemsMatchingFilter(ItemStack filter) { return cachedRenderedFilters.computeIfAbsent(filter, itemStack -> { - CompoundTag tag = itemStack.getOrCreateTag(); - - if (AllItems.FILTER.isIn(itemStack) && !tag.getBoolean("Blacklist")) { - ItemStackHandler filterItems = FilterItem.getFilterItems(itemStack); - return ItemHelper.getNonEmptyStacks(filterItems).toArray(ItemStack[]::new); - } - - if (AllItems.ATTRIBUTE_FILTER.isIn(itemStack)) { - WhitelistMode whitelistMode = WhitelistMode.values()[tag.getInt("WhitelistMode")]; - ListTag attributes = tag.getList("MatchedAttributes", net.minecraft.nbt.Tag.TAG_COMPOUND); - if (whitelistMode == WhitelistMode.WHITELIST_DISJ && attributes.size() == 1) { - ItemAttribute fromNBT = ItemAttribute.loadStatic((CompoundTag) attributes.get(0)); - if (fromNBT instanceof InTagAttribute inTag) { - ITagManager tagManager = ForgeRegistries.ITEMS.tags(); - if (tagManager.isKnownTagName(inTag.tag)) { - ITag taggedItems = tagManager.getTag(inTag.tag); - if (!taggedItems.isEmpty()) { - ItemStack[] stacks = new ItemStack[taggedItems.size()]; - int i = 0; - for (Item item : taggedItems) { - stacks[i] = new ItemStack(item); - i++; - } - return stacks; - } - } - } - } + if (itemStack.getItem() instanceof FilterItem filterItem) { + return filterItem.getFilterItems(itemStack); } return new ItemStack[0]; diff --git a/src/main/java/com/simibubi/create/content/logistics/filter/AbstractFilterScreen.java b/src/main/java/com/simibubi/create/content/logistics/filter/AbstractFilterScreen.java index 4919324c48..3335fa47bc 100644 --- a/src/main/java/com/simibubi/create/content/logistics/filter/AbstractFilterScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/filter/AbstractFilterScreen.java @@ -6,7 +6,6 @@ import java.util.List; import com.google.common.collect.ImmutableList; -import com.simibubi.create.AllItems; import com.simibubi.create.AllPackets; import com.simibubi.create.content.logistics.filter.FilterScreenPacket.Option; import com.simibubi.create.foundation.gui.AllGuiTextures; @@ -73,9 +72,7 @@ protected void renderBg(GuiGraphics graphics, float partialTicks, int mouseX, in background.render(graphics, x, y); graphics.drawString(font, title, x + (background.getWidth() - 8) / 2 - font.width(title) / 2, y + 4, - AllItems.PACKAGE_FILTER.isIn(menu.contentHolder) ? 0x3D3C48 - : AllItems.FILTER.isIn(menu.contentHolder) ? 0x303030 : 0x592424, - false); + getTitleColor(), false); GuiGameElement.of(menu.contentHolder).at(x + background.getWidth() + 8, y + background.getHeight() - 52, -200) @@ -83,6 +80,10 @@ protected void renderBg(GuiGraphics graphics, float partialTicks, int mouseX, in .render(graphics); } + protected int getTitleColor() { + return 0x592424; + } + @Override protected void containerTick() { if (!menu.player.getMainHandItem() diff --git a/src/main/java/com/simibubi/create/content/logistics/filter/AttributeFilterItem.java b/src/main/java/com/simibubi/create/content/logistics/filter/AttributeFilterItem.java new file mode 100644 index 0000000000..0835c4f62b --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/filter/AttributeFilterItem.java @@ -0,0 +1,109 @@ +package com.simibubi.create.content.logistics.filter; + +import com.simibubi.create.content.logistics.filter.AttributeFilterMenu.WhitelistMode; +import com.simibubi.create.content.logistics.filter.FilterItemStack.AttributeFilterItemStack; +import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttribute; +import com.simibubi.create.content.logistics.item.filter.attribute.attributes.InTagAttribute; +import com.simibubi.create.foundation.utility.CreateLang; + +import net.minecraft.ChatFormatting; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; + +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.tags.ITag; +import net.minecraftforge.registries.tags.ITagManager; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class AttributeFilterItem extends FilterItem { + protected AttributeFilterItem(Properties properties) { + super(properties); + } + + @Override + public List makeSummary(ItemStack filter) { + if (!filter.hasTag()) return Collections.emptyList(); + + List list = new ArrayList<>(); + + WhitelistMode whitelistMode = WhitelistMode.values()[filter.getOrCreateTag() + .getInt("WhitelistMode")]; + list.add((whitelistMode == WhitelistMode.WHITELIST_CONJ + ? CreateLang.translateDirect("gui.attribute_filter.allow_list_conjunctive") + : whitelistMode == WhitelistMode.WHITELIST_DISJ + ? CreateLang.translateDirect("gui.attribute_filter.allow_list_disjunctive") + : CreateLang.translateDirect("gui.attribute_filter.deny_list")).withStyle(ChatFormatting.GOLD)); + + int count = 0; + ListTag attributes = filter.getOrCreateTag() + .getList("MatchedAttributes", Tag.TAG_COMPOUND); + for (Tag inbt : attributes) { + CompoundTag compound = (CompoundTag) inbt; + ItemAttribute attribute = ItemAttribute.loadStatic(compound); + if (attribute == null) + continue; + boolean inverted = compound.getBoolean("Inverted"); + if (count > 3) { + list.add(Component.literal("- ...") + .withStyle(ChatFormatting.DARK_GRAY)); + break; + } + list.add(Component.literal("- ") + .append(attribute.format(inverted))); + count++; + } + + if (count == 0) + return Collections.emptyList(); + + return list; + } + + @Override + public AbstractContainerMenu createMenu(int id, Inventory inv, Player player) { + return AttributeFilterMenu.create(id, inv, player.getMainHandItem()); + } + + @Override + public FilterItemStack makeStackWrapper(ItemStack filter) { + return new AttributeFilterItemStack(filter); + } + + @Override + public ItemStack[] getFilterItems(ItemStack itemStack) { + CompoundTag tag = itemStack.getOrCreateTag(); + + WhitelistMode whitelistMode = WhitelistMode.values()[tag.getInt("WhitelistMode")]; + ListTag attributes = tag.getList("MatchedAttributes", net.minecraft.nbt.Tag.TAG_COMPOUND); + + if (whitelistMode == WhitelistMode.WHITELIST_DISJ && attributes.size() == 1) { + ItemAttribute fromNBT = ItemAttribute.loadStatic((CompoundTag) attributes.get(0)); + if (fromNBT instanceof InTagAttribute inTag) { + ITagManager tagManager = ForgeRegistries.ITEMS.tags(); + if (tagManager.isKnownTagName(inTag.tag)) { + ITag taggedItems = tagManager.getTag(inTag.tag); + if (!taggedItems.isEmpty()) { + ItemStack[] stacks = new ItemStack[taggedItems.size()]; + int i = 0; + for (Item item : taggedItems) { + stacks[i] = new ItemStack(item); + i++; + } + return stacks; + } + } + } + } + return new ItemStack[0]; + } +} diff --git a/src/main/java/com/simibubi/create/content/logistics/filter/FilterItem.java b/src/main/java/com/simibubi/create/content/logistics/filter/FilterItem.java index eefe7dd387..53c0ab8fcc 100644 --- a/src/main/java/com/simibubi/create/content/logistics/filter/FilterItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/filter/FilterItem.java @@ -1,7 +1,5 @@ package com.simibubi.create.content.logistics.filter; -import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.Objects; @@ -9,19 +7,11 @@ import org.jetbrains.annotations.NotNull; -import com.simibubi.create.AllItems; import com.simibubi.create.AllKeys; import com.simibubi.create.content.logistics.box.PackageItem; -import com.simibubi.create.content.logistics.filter.AttributeFilterMenu.WhitelistMode; -import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttribute; import com.simibubi.create.foundation.item.ItemHelper; import com.simibubi.create.foundation.recipe.ItemCopyingRecipe.SupportsItemCopying; -import com.simibubi.create.foundation.utility.CreateLang; -import net.minecraft.ChatFormatting; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.ListTag; -import net.minecraft.nbt.Tag; import net.minecraft.network.chat.CommonComponents; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; @@ -41,32 +31,24 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.items.ItemHandlerHelper; -import net.minecraftforge.items.ItemStackHandler; import net.minecraftforge.network.NetworkHooks; -public class FilterItem extends Item implements MenuProvider, SupportsItemCopying { +public abstract class FilterItem extends Item implements MenuProvider, SupportsItemCopying { - private FilterType type; - - private enum FilterType { - REGULAR, ATTRIBUTE, PACKAGE; - } - - public static FilterItem regular(Properties properties) { - return new FilterItem(FilterType.REGULAR, properties); + public static ListFilterItem regular(Properties properties) { + return new ListFilterItem(properties); } - public static FilterItem attribute(Properties properties) { - return new FilterItem(FilterType.ATTRIBUTE, properties); + public static AttributeFilterItem attribute(Properties properties) { + return new AttributeFilterItem(properties); } - public static FilterItem address(Properties properties) { - return new FilterItem(FilterType.PACKAGE, properties); + public static PackageFilterItem address(Properties properties) { + return new PackageFilterItem(properties); } - private FilterItem(FilterType type, Properties properties) { + protected FilterItem(Properties properties) { super(properties); - this.type = type; } @Nonnull @@ -89,84 +71,7 @@ public void appendHoverText(ItemStack stack, Level worldIn, List tool tooltip.addAll(makeSummary); } - private List makeSummary(ItemStack filter) { - List list = new ArrayList<>(); - if (!filter.hasTag()) - return list; - - if (type == FilterType.REGULAR) { - ItemStackHandler filterItems = getFilterItems(filter); - boolean blacklist = filter.getOrCreateTag() - .getBoolean("Blacklist"); - - list.add((blacklist ? CreateLang.translateDirect("gui.filter.deny_list") - : CreateLang.translateDirect("gui.filter.allow_list")).withStyle(ChatFormatting.GOLD)); - int count = 0; - for (int i = 0; i < filterItems.getSlots(); i++) { - if (count > 3) { - list.add(Component.literal("- ...") - .withStyle(ChatFormatting.DARK_GRAY)); - break; - } - - ItemStack filterStack = filterItems.getStackInSlot(i); - if (filterStack.isEmpty()) - continue; - list.add(Component.literal("- ") - .append(filterStack.getHoverName()) - .withStyle(ChatFormatting.GRAY)); - count++; - } - - if (count == 0) - return Collections.emptyList(); - } - - if (type == FilterType.ATTRIBUTE) { - WhitelistMode whitelistMode = WhitelistMode.values()[filter.getOrCreateTag() - .getInt("WhitelistMode")]; - list.add((whitelistMode == WhitelistMode.WHITELIST_CONJ - ? CreateLang.translateDirect("gui.attribute_filter.allow_list_conjunctive") - : whitelistMode == WhitelistMode.WHITELIST_DISJ - ? CreateLang.translateDirect("gui.attribute_filter.allow_list_disjunctive") - : CreateLang.translateDirect("gui.attribute_filter.deny_list")).withStyle(ChatFormatting.GOLD)); - - int count = 0; - ListTag attributes = filter.getOrCreateTag() - .getList("MatchedAttributes", Tag.TAG_COMPOUND); - for (Tag inbt : attributes) { - CompoundTag compound = (CompoundTag) inbt; - ItemAttribute attribute = ItemAttribute.loadStatic(compound); - if (attribute == null) - continue; - boolean inverted = compound.getBoolean("Inverted"); - if (count > 3) { - list.add(Component.literal("- ...") - .withStyle(ChatFormatting.DARK_GRAY)); - break; - } - list.add(Component.literal("- ") - .append(attribute.format(inverted))); - count++; - } - - if (count == 0) - return Collections.emptyList(); - } - - if (type == FilterType.PACKAGE) { - String address = filter.getOrCreateTag() - .getString("Address"); - if (!address.isBlank()) - list.add(CreateLang.text("-> ") - .style(ChatFormatting.GRAY) - .add(CreateLang.text(address) - .style(ChatFormatting.GOLD)) - .component()); - } - - return list; - } + public abstract List makeSummary(ItemStack filter); @Override public InteractionResultHolder use(Level world, Player player, InteractionHand hand) { @@ -183,34 +88,13 @@ public InteractionResultHolder use(Level world, Player player, Intera } @Override - public AbstractContainerMenu createMenu(int id, Inventory inv, Player player) { - ItemStack heldItem = player.getMainHandItem(); - if (type == FilterType.REGULAR) - return FilterMenu.create(id, inv, heldItem); - if (type == FilterType.ATTRIBUTE) - return AttributeFilterMenu.create(id, inv, heldItem); - if (type == FilterType.PACKAGE) - return PackageFilterMenu.create(id, inv, heldItem); - return null; - } + public abstract AbstractContainerMenu createMenu(int id, Inventory inv, Player player); @Override public Component getDisplayName() { return getDescription(); } - public static ItemStackHandler getFilterItems(ItemStack stack) { - ItemStackHandler newInv = new ItemStackHandler(18); - if (AllItems.FILTER.get() != stack.getItem()) - throw new IllegalArgumentException("Cannot get filter items from non-filter: " + stack); - if (!stack.hasTag()) - return newInv; - CompoundTag invNBT = stack.getOrCreateTagElement("Items"); - if (!invNBT.isEmpty()) - newInv.deserializeNBT(invNBT); - return newInv; - } - public static boolean testDirect(ItemStack filter, ItemStack stack, boolean matchNBT) { if (matchNBT) { if (PackageItem.isPackage(filter) && PackageItem.isPackage(stack)) @@ -245,4 +129,7 @@ public static boolean doPackagesHaveSameData(@NotNull ItemStack a, @NotNull Item return true; } + public abstract FilterItemStack makeStackWrapper(ItemStack filter); + + public abstract ItemStack[] getFilterItems(ItemStack itemStack); } diff --git a/src/main/java/com/simibubi/create/content/logistics/filter/FilterItemStack.java b/src/main/java/com/simibubi/create/content/logistics/filter/FilterItemStack.java index 0555e093b8..3dee499ebf 100644 --- a/src/main/java/com/simibubi/create/content/logistics/filter/FilterItemStack.java +++ b/src/main/java/com/simibubi/create/content/logistics/filter/FilterItemStack.java @@ -3,7 +3,6 @@ import java.util.ArrayList; import java.util.List; -import com.simibubi.create.AllItems; import com.simibubi.create.content.fluids.transfer.GenericItemEmptying; import com.simibubi.create.content.logistics.box.PackageItem; import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttribute; @@ -25,19 +24,9 @@ public class FilterItemStack { private FluidStack filterFluidStack; public static FilterItemStack of(ItemStack filter) { - if (filter.hasTag()) { - if (AllItems.FILTER.isIn(filter)) { - trimFilterTag(filter); - return new ListFilterItemStack(filter); - } - if (AllItems.ATTRIBUTE_FILTER.isIn(filter)) { - trimFilterTag(filter); - return new AttributeFilterItemStack(filter); - } - if (AllItems.PACKAGE_FILTER.isIn(filter)) { - trimFilterTag(filter); - return new PackageFilterItemStack(filter); - } + if (filter.hasTag() && filter.getItem() instanceof FilterItem item) { + trimFilterTag(filter); + return item.makeStackWrapper(filter); } return new FilterItemStack(filter); @@ -133,12 +122,12 @@ public static class ListFilterItemStack extends FilterItemStack { public boolean shouldRespectNBT; public boolean isBlacklist; - protected ListFilterItemStack(ItemStack filter) { + public ListFilterItemStack(ItemStack filter) { super(filter); boolean defaults = !filter.hasTag(); containedItems = new ArrayList<>(); - ItemStackHandler items = FilterItem.getFilterItems(filter); + ItemStackHandler items = ((ListFilterItem) filter.getItem()).getFilterItemHandler(filter); for (int i = 0; i < items.getSlots(); i++) { ItemStack stackInSlot = items.getStackInSlot(i); if (!stackInSlot.isEmpty()) @@ -182,7 +171,7 @@ public enum WhitelistMode { public WhitelistMode whitelistMode; public List> attributeTests; - protected AttributeFilterItemStack(ItemStack filter) { + public AttributeFilterItemStack(ItemStack filter) { super(filter); boolean defaults = !filter.hasTag(); @@ -253,7 +242,7 @@ public static class PackageFilterItemStack extends FilterItemStack { public String filterString; - protected PackageFilterItemStack(ItemStack filter) { + public PackageFilterItemStack(ItemStack filter) { super(filter); filterString = filter.getOrCreateTag() .getString("Address"); diff --git a/src/main/java/com/simibubi/create/content/logistics/filter/FilterMenu.java b/src/main/java/com/simibubi/create/content/logistics/filter/FilterMenu.java index af1ddd622a..3e62aacba5 100644 --- a/src/main/java/com/simibubi/create/content/logistics/filter/FilterMenu.java +++ b/src/main/java/com/simibubi/create/content/logistics/filter/FilterMenu.java @@ -1,5 +1,6 @@ package com.simibubi.create.content.logistics.filter; +import com.simibubi.create.AllItems; import com.simibubi.create.AllMenuTypes; import net.minecraft.nbt.CompoundTag; @@ -48,7 +49,7 @@ protected void addFilterSlots() { @Override protected ItemStackHandler createGhostInventory() { - return FilterItem.getFilterItems(contentHolder); + return AllItems.FILTER.get().getFilterItemHandler(contentHolder); } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/filter/FilterScreen.java b/src/main/java/com/simibubi/create/content/logistics/filter/FilterScreen.java index 8909187c2b..a9e3aeaa44 100644 --- a/src/main/java/com/simibubi/create/content/logistics/filter/FilterScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/filter/FilterScreen.java @@ -96,4 +96,8 @@ protected boolean isButtonEnabled(IconButton button) { return true; } + @Override + protected int getTitleColor() { + return 0x303030; + } } diff --git a/src/main/java/com/simibubi/create/content/logistics/filter/ListFilterItem.java b/src/main/java/com/simibubi/create/content/logistics/filter/ListFilterItem.java new file mode 100644 index 0000000000..0084cedd58 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/filter/ListFilterItem.java @@ -0,0 +1,85 @@ +package com.simibubi.create.content.logistics.filter; + +import com.simibubi.create.content.logistics.filter.FilterItemStack.ListFilterItemStack; +import com.simibubi.create.foundation.item.ItemHelper; +import com.simibubi.create.foundation.utility.CreateLang; + +import net.minecraft.ChatFormatting; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.item.ItemStack; + +import net.minecraftforge.items.ItemStackHandler; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class ListFilterItem extends FilterItem { + protected ListFilterItem(Properties properties) { + super(properties); + } + + @Override + public List makeSummary(ItemStack filter) { + if (!filter.hasTag()) return Collections.emptyList(); + + List list = new ArrayList<>(); + + ItemStackHandler filterItems = getFilterItemHandler(filter); + boolean blacklist = filter.getOrCreateTag() + .getBoolean("Blacklist"); + + list.add((blacklist ? CreateLang.translateDirect("gui.filter.deny_list") + : CreateLang.translateDirect("gui.filter.allow_list")).withStyle(ChatFormatting.GOLD)); + int count = 0; + for (int i = 0; i < filterItems.getSlots(); i++) { + if (count > 3) { + list.add(Component.literal("- ...") + .withStyle(ChatFormatting.DARK_GRAY)); + break; + } + + ItemStack filterStack = filterItems.getStackInSlot(i); + if (filterStack.isEmpty()) + continue; + list.add(Component.literal("- ") + .append(filterStack.getHoverName()) + .withStyle(ChatFormatting.GRAY)); + count++; + } + + if (count == 0) + return Collections.emptyList(); + + return list; + } + + @Override + public AbstractContainerMenu createMenu(int id, Inventory inv, Player player) { + return FilterMenu.create(id, inv, player.getMainHandItem()); + } + + @Override + public FilterItemStack makeStackWrapper(ItemStack filter) { + return new ListFilterItemStack(filter); + } + + public ItemStackHandler getFilterItemHandler(ItemStack stack) { + ItemStackHandler newInv = new ItemStackHandler(18); + CompoundTag invNBT = stack.getOrCreateTagElement("Items"); + if (!invNBT.isEmpty()) + newInv.deserializeNBT(invNBT); + return newInv; + } + + @Override + public ItemStack[] getFilterItems(ItemStack itemStack) { + if (itemStack.hasTag() && itemStack.getOrCreateTag().getBoolean("Blacklist")) + return new ItemStack[0]; + return ItemHelper.getNonEmptyStacks(getFilterItemHandler(itemStack)).toArray(ItemStack[]::new); + } +} diff --git a/src/main/java/com/simibubi/create/content/logistics/filter/PackageFilterItem.java b/src/main/java/com/simibubi/create/content/logistics/filter/PackageFilterItem.java new file mode 100644 index 0000000000..895138f7ea --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/filter/PackageFilterItem.java @@ -0,0 +1,50 @@ +package com.simibubi.create.content.logistics.filter; + +import com.simibubi.create.content.logistics.filter.FilterItemStack.PackageFilterItemStack; +import com.simibubi.create.foundation.utility.CreateLang; + +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.item.ItemStack; + +import java.util.Collections; +import java.util.List; + +public class PackageFilterItem extends FilterItem{ + protected PackageFilterItem(Properties properties) { + super(properties); + } + + @Override + public List makeSummary(ItemStack filter) { + if (!filter.hasTag()) return Collections.emptyList(); + + String address = filter.getOrCreateTag() + .getString("Address"); + if (address.isBlank()) return Collections.emptyList(); + + return List.of(CreateLang.text("-> ") + .style(ChatFormatting.GRAY) + .add(CreateLang.text(address) + .style(ChatFormatting.GOLD)) + .component()); + } + + @Override + public AbstractContainerMenu createMenu(int id, Inventory inv, Player player) { + return PackageFilterMenu.create(id, inv, player.getMainHandItem()); + } + + @Override + public FilterItemStack makeStackWrapper(ItemStack filter) { + return new PackageFilterItemStack(filter); + } + + @Override + public ItemStack[] getFilterItems(ItemStack itemStack) { + return new ItemStack[0]; + } +} diff --git a/src/main/java/com/simibubi/create/content/logistics/filter/PackageFilterScreen.java b/src/main/java/com/simibubi/create/content/logistics/filter/PackageFilterScreen.java index f03e8503b6..8a2916e998 100644 --- a/src/main/java/com/simibubi/create/content/logistics/filter/PackageFilterScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/filter/PackageFilterScreen.java @@ -77,7 +77,7 @@ public void onAddressEdited(String s) { public boolean mouseClicked(double pMouseX, double pMouseY, int pButton) { return super.mouseClicked(pMouseX, pMouseY, pButton); } - + @Override public boolean mouseScrolled(double mouseX, double mouseY, double delta) { if (addressBox.mouseScrolled(mouseX, mouseY, delta)) @@ -108,4 +108,8 @@ protected boolean isButtonEnabled(IconButton button) { return false; } + @Override + protected int getTitleColor() { + return 0x3D3C48; + } }