diff --git a/CHANGELOG.md b/CHANGELOG.md index 891fdf779..93bf7087e 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ - Added Crafting Upgrade support for fluids on the Exporter, Constructor and Fluid Interface (raoulvdberge) - Added config option to hide covers in the creative mode tabs and JEI (raoulvdberge) - The Portable Grid now supports fluid disks (raoulvdberge) +- Filters now support fluids and can be inserted in the Fluid Grid (raoulvdberge) - Removed "emit signal when item is being autocrafted" option in the Detector (raoulvdberge) - The Crafting Card no longer schedules requests when there are items or fluids missing (raoulvdberge) - You can now keep fluids in stock by attaching a External Storage in fluid mode to a Fluid Interface with a Crafting Upgrade (raoulvdberge) diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/util/IFilter.java b/src/main/java/com/raoulvdberge/refinedstorage/api/util/IFilter.java index 2fc855f6c..bf9a5cdf9 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/util/IFilter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/util/IFilter.java @@ -1,18 +1,16 @@ package com.raoulvdberge.refinedstorage.api.util; -import net.minecraft.item.ItemStack; - /** * A filter. */ -public interface IFilter { +public interface IFilter { int MODE_WHITELIST = 0; int MODE_BLACKLIST = 1; /** * @return the stack being filtered */ - ItemStack getStack(); + T getStack(); /** * @return the compare flags, see {@link IComparer} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/GridTab.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/GridTab.java index 7b2446f36..76b264724 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/GridTab.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/GridTab.java @@ -4,23 +4,30 @@ import com.raoulvdberge.refinedstorage.api.network.grid.IGridTab; import com.raoulvdberge.refinedstorage.api.render.IElementDrawer; import com.raoulvdberge.refinedstorage.api.util.IFilter; import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.RenderHelper; import net.minecraft.item.ItemStack; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fml.client.config.GuiUtils; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.util.Collections; import java.util.List; public class GridTab implements IGridTab { private List filters; private String name; + @Nonnull private ItemStack icon; + @Nullable + private FluidStack fluidIcon; - public GridTab(List filters, String name, ItemStack icon) { + public GridTab(List filters, String name, @Nonnull ItemStack icon, @Nullable FluidStack fluidIcon) { this.filters = filters; this.name = name; this.icon = icon; + this.fluidIcon = fluidIcon; } @Override @@ -37,8 +44,14 @@ public class GridTab implements IGridTab { @Override public void drawIcon(int x, int y, IElementDrawer itemDrawer, IElementDrawer fluidDrawer) { - RenderHelper.enableGUIStandardItemLighting(); + if (!icon.isEmpty()) { + RenderHelper.enableGUIStandardItemLighting(); - itemDrawer.draw(x, y, icon); + itemDrawer.draw(x, y, icon); + } else { + fluidDrawer.draw(x, y, fluidIcon); + + GlStateManager.enableAlpha(); + } } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/util/FilterFluid.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/util/FilterFluid.java new file mode 100644 index 000000000..80edffcdd --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/util/FilterFluid.java @@ -0,0 +1,38 @@ +package com.raoulvdberge.refinedstorage.apiimpl.util; + +import com.raoulvdberge.refinedstorage.api.util.IFilter; +import net.minecraftforge.fluids.FluidStack; + +public class FilterFluid implements IFilter { + private FluidStack stack; + private int compare; + private int mode; + private boolean modFilter; + + public FilterFluid(FluidStack stack, int compare, int mode, boolean modFilter) { + this.stack = stack; + this.compare = compare; + this.mode = mode; + this.modFilter = modFilter; + } + + @Override + public FluidStack getStack() { + return stack; + } + + @Override + public int getCompare() { + return compare; + } + + @Override + public int getMode() { + return mode; + } + + @Override + public boolean isModFilter() { + return modFilter; + } +} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/util/Filter.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/util/FilterItem.java similarity index 83% rename from src/main/java/com/raoulvdberge/refinedstorage/apiimpl/util/Filter.java rename to src/main/java/com/raoulvdberge/refinedstorage/apiimpl/util/FilterItem.java index cdebe4ddf..684fc8de2 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/util/Filter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/util/FilterItem.java @@ -3,13 +3,13 @@ package com.raoulvdberge.refinedstorage.apiimpl.util; import com.raoulvdberge.refinedstorage.api.util.IFilter; import net.minecraft.item.ItemStack; -public class Filter implements IFilter { +public class FilterItem implements IFilter { private ItemStack stack; private int compare; private int mode; private boolean modFilter; - public Filter(ItemStack stack, int compare, int mode, boolean modFilter) { + public FilterItem(ItemStack stack, int compare, int mode, boolean modFilter) { this.stack = stack; this.compare = compare; this.mode = mode; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerFilter.java b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerFilter.java index ee9498934..71c3fa724 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerFilter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerFilter.java @@ -1,8 +1,14 @@ package com.raoulvdberge.refinedstorage.container; import com.raoulvdberge.refinedstorage.container.slot.filter.SlotFilter; +import com.raoulvdberge.refinedstorage.container.slot.filter.SlotFilterFluid; +import com.raoulvdberge.refinedstorage.inventory.fluid.FluidInventory; +import com.raoulvdberge.refinedstorage.inventory.fluid.FluidInventoryFilter; +import com.raoulvdberge.refinedstorage.inventory.fluid.FluidInventoryFilterIcon; import com.raoulvdberge.refinedstorage.inventory.item.ItemHandlerFilterIcon; import com.raoulvdberge.refinedstorage.inventory.item.ItemHandlerFilterItems; +import com.raoulvdberge.refinedstorage.item.ItemFilter; +import com.raoulvdberge.refinedstorage.tile.config.IType; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -19,8 +25,12 @@ public class ContainerFilter extends ContainerBase { ItemHandlerFilterItems filter = new ItemHandlerFilterItems(stack); + FluidInventoryFilterIcon fluidIcon = new FluidInventoryFilterIcon(stack); + FluidInventory fluidFilter = new FluidInventoryFilter(stack); + for (int i = 0; i < 27; ++i) { - addSlotToContainer(new SlotFilter(filter, i, x, y)); + addSlotToContainer(new SlotFilter(filter, i, x, y).setEnableHandler(() -> ItemFilter.getType(stack) == IType.ITEMS)); + addSlotToContainer(new SlotFilterFluid(fluidFilter, i, x, y).setEnableHandler(() -> ItemFilter.getType(stack) == IType.FLUIDS)); if ((i + 1) % 9 == 0) { x = 8; @@ -30,11 +40,12 @@ public class ContainerFilter extends ContainerBase { } } - addSlotToContainer(new SlotFilter(new ItemHandlerFilterIcon(stack), 0, 8, 117)); + addSlotToContainer(new SlotFilter(new ItemHandlerFilterIcon(stack), 0, 8, 117).setEnableHandler(() -> ItemFilter.getType(stack) == IType.ITEMS)); + addSlotToContainer(new SlotFilterFluid(fluidIcon, 0, 8, 117).setEnableHandler(() -> ItemFilter.getType(stack) == IType.FLUIDS)); addPlayerInventory(8, 149); - transferManager.addItemFilterTransfer(player.inventory, filter); + transferManager.addFilterTransfer(player.inventory, filter, fluidFilter, () -> ItemFilter.getType(stack)); } public ItemStack getStack() { diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerGrid.java b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerGrid.java index c4c3575d4..9c2226b1c 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerGrid.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerGrid.java @@ -54,9 +54,7 @@ public class ContainerGrid extends ContainerBase { this.transferManager.clearTransfers(); - if (grid.getGridType() != GridType.FLUID || grid instanceof IPortableGrid) { - addFilterSlots(); - } + addFilterSlots(); if (grid instanceof IPortableGrid) { addPortableGridSlots(); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiFilter.java b/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiFilter.java index a3363ef3c..c5cb18c2d 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiFilter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiFilter.java @@ -4,22 +4,28 @@ import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.api.util.IComparer; import com.raoulvdberge.refinedstorage.api.util.IFilter; import com.raoulvdberge.refinedstorage.container.ContainerFilter; +import com.raoulvdberge.refinedstorage.gui.control.SideButtonFilterType; import com.raoulvdberge.refinedstorage.item.ItemFilter; import com.raoulvdberge.refinedstorage.network.MessageFilterUpdate; +import com.raoulvdberge.refinedstorage.tile.config.IType; import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.GuiTextField; +import net.minecraft.item.ItemStack; import net.minecraftforge.fml.client.config.GuiCheckBox; import java.io.IOException; public class GuiFilter extends GuiBase { + private ItemStack stack; + private int compare; private int mode; private boolean modFilter; private String name; + private int type; private GuiCheckBox compareDamage; - private GuiCheckBox compareNBT; + private GuiCheckBox compareNbt; private GuiCheckBox toggleModFilter; private GuiButton toggleMode; private GuiTextField nameField; @@ -27,19 +33,26 @@ public class GuiFilter extends GuiBase { public GuiFilter(ContainerFilter container) { super(container, 176, 231); + this.stack = container.getStack(); + this.compare = ItemFilter.getCompare(container.getStack()); this.mode = ItemFilter.getMode(container.getStack()); this.modFilter = ItemFilter.isModFilter(container.getStack()); this.name = ItemFilter.getName(container.getStack()); + this.type = ItemFilter.getType(container.getStack()); } @Override public void init(int x, int y) { - compareDamage = addCheckBox(x + 7, y + 77, t("gui.refinedstorage:filter.compare_damage"), (compare & IComparer.COMPARE_DAMAGE) == IComparer.COMPARE_DAMAGE); - compareNBT = addCheckBox(x + 7 + compareDamage.getButtonWidth() + 4, y + 77, t("gui.refinedstorage:filter.compare_nbt"), (compare & IComparer.COMPARE_NBT) == IComparer.COMPARE_NBT); + compareNbt = addCheckBox(x + 7, y + 77, t("gui.refinedstorage:filter.compare_nbt"), (compare & IComparer.COMPARE_NBT) == IComparer.COMPARE_NBT); + compareDamage = addCheckBox(x + 7 + compareNbt.getButtonWidth() + 4, y + 77, t("gui.refinedstorage:filter.compare_damage"), (compare & IComparer.COMPARE_DAMAGE) == IComparer.COMPARE_DAMAGE); + compareDamage.visible = type == IType.ITEMS; + toggleModFilter = addCheckBox(0, y + 71 + 25, t("gui.refinedstorage:filter.mod_filter"), modFilter); toggleMode = addButton(x + 7, y + 71 + 21, 0, 20, ""); + updateModeButton(mode); + nameField = new GuiTextField(0, fontRenderer, x + 34, y + 121, 137 - 6, fontRenderer.FONT_HEIGHT); nameField.setText(name); nameField.setEnableBackgroundDrawing(false); @@ -47,6 +60,8 @@ public class GuiFilter extends GuiBase { nameField.setCanLoseFocus(true); nameField.setFocused(false); nameField.setTextColor(16777215); + + addSideButton(new SideButtonFilterType(this)); } private void updateModeButton(int mode) { @@ -98,7 +113,7 @@ public class GuiFilter extends GuiBase { if (button == compareDamage) { compare ^= IComparer.COMPARE_DAMAGE; - } else if (button == compareNBT) { + } else if (button == compareNbt) { compare ^= IComparer.COMPARE_NBT; } else if (button == toggleMode) { mode = mode == IFilter.MODE_WHITELIST ? IFilter.MODE_BLACKLIST : IFilter.MODE_WHITELIST; @@ -111,7 +126,19 @@ public class GuiFilter extends GuiBase { sendUpdate(); } - private void sendUpdate() { - RS.INSTANCE.network.sendToServer(new MessageFilterUpdate(compare, mode, modFilter, nameField.getText())); + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + + ItemFilter.setType(stack, type); + + compareDamage.visible = type == IType.ITEMS; + } + + public void sendUpdate() { + RS.INSTANCE.network.sendToServer(new MessageFilterUpdate(compare, mode, modFilter, nameField.getText(), type)); } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/gui/control/SideButtonFilterType.java b/src/main/java/com/raoulvdberge/refinedstorage/gui/control/SideButtonFilterType.java new file mode 100644 index 000000000..4edc73c46 --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/gui/control/SideButtonFilterType.java @@ -0,0 +1,32 @@ +package com.raoulvdberge.refinedstorage.gui.control; + +import com.raoulvdberge.refinedstorage.gui.GuiBase; +import com.raoulvdberge.refinedstorage.gui.GuiFilter; +import com.raoulvdberge.refinedstorage.tile.config.IType; +import net.minecraft.util.text.TextFormatting; + +public class SideButtonFilterType extends SideButton { + private GuiFilter gui; + + public SideButtonFilterType(GuiFilter gui) { + super(gui); + + this.gui = gui; + } + + @Override + public String getTooltip() { + return GuiBase.t("sidebutton.refinedstorage:type") + "\n" + TextFormatting.GRAY + GuiBase.t("sidebutton.refinedstorage:type." + gui.getType()); + } + + @Override + protected void drawButtonIcon(int x, int y) { + gui.drawTexture(x, y, 16 * gui.getType(), 128, 16, 16); + } + + @Override + public void actionPerformed() { + gui.setType(gui.getType() == IType.ITEMS ? IType.FLUIDS : IType.ITEMS); + gui.sendUpdate(); + } +} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/GuiGrid.java b/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/GuiGrid.java index 2b323ec8e..b69ab5a62 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/GuiGrid.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/GuiGrid.java @@ -57,7 +57,7 @@ public class GuiGrid extends GuiBase implements IResizableDisplay { private int slotNumber; public GuiGrid(ContainerGrid container, IGrid grid) { - super(container, (grid.getGridType() == GridType.FLUID && !(grid instanceof IPortableGrid)) ? 193 : 227, 0); + super(container, 227, 0); this.grid = grid; this.view = grid.getGridType() == GridType.FLUID ? new GridViewFluid(this, getDefaultSorter(), getSorters()) : new GridViewItem(this, getDefaultSorter(), getSorters()); @@ -278,24 +278,22 @@ public class GuiGrid extends GuiBase implements IResizableDisplay { int yy = y + tabs.getHeight(); - drawTexture(x, yy, 0, 0, screenWidth - (grid.getGridType() != GridType.FLUID ? 34 : 0), getTopHeight()); + drawTexture(x, yy, 0, 0, screenWidth - 34, getTopHeight()); - // Filters and portable grid disk - if (grid.getGridType() != GridType.FLUID || grid instanceof IPortableGrid) { - drawTexture(x + screenWidth - 34 + 4, y + tabs.getHeight(), 197, 0, 30, grid instanceof IPortableGrid ? 114 : 82); - } + // Filters and/or portable grid disk + drawTexture(x + screenWidth - 34 + 4, y + tabs.getHeight(), 197, 0, 30, grid instanceof IPortableGrid ? 114 : 82); int rows = getVisibleRows(); for (int i = 0; i < rows; ++i) { yy += 18; - drawTexture(x, yy, 0, getTopHeight() + (i > 0 ? (i == rows - 1 ? 18 * 2 : 18) : 0), screenWidth - ((grid.getGridType() != GridType.FLUID || grid instanceof IPortableGrid) ? 34 : 0), 18); + drawTexture(x, yy, 0, getTopHeight() + (i > 0 ? (i == rows - 1 ? 18 * 2 : 18) : 0), screenWidth - 34, 18); } yy += 18; - drawTexture(x, yy, 0, getTopHeight() + (18 * 3), screenWidth - ((grid.getGridType() != GridType.FLUID || grid instanceof IPortableGrid) ? 34 : 0), getBottomHeight()); + drawTexture(x, yy, 0, getTopHeight() + (18 * 3), screenWidth - 34, getBottomHeight()); if (grid.getGridType() == GridType.PATTERN) { int ty = 0; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/filtering/GridFilterCraftable.java b/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/filtering/GridFilterCraftable.java index 69966cb26..72d3888a8 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/filtering/GridFilterCraftable.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/filtering/GridFilterCraftable.java @@ -14,6 +14,6 @@ public class GridFilterCraftable implements Predicate { @Override public boolean test(IGridStack stack) { - return stack instanceof GridStackItem && ((GridStackItem) stack).isCraftable() == craftable; + return stack instanceof GridStackItem && stack.isCraftable() == craftable; } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/filtering/GridFilterFilter.java b/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/filtering/GridFilterFilter.java index 385674241..24ceb7c29 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/filtering/GridFilterFilter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/filtering/GridFilterFilter.java @@ -2,9 +2,12 @@ package com.raoulvdberge.refinedstorage.gui.grid.filtering; import com.raoulvdberge.refinedstorage.api.util.IFilter; import com.raoulvdberge.refinedstorage.apiimpl.API; +import com.raoulvdberge.refinedstorage.gui.grid.stack.GridStackFluid; import com.raoulvdberge.refinedstorage.gui.grid.stack.GridStackItem; import com.raoulvdberge.refinedstorage.gui.grid.stack.IGridStack; import net.minecraft.item.ItemStack; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.FluidStack; import java.util.List; import java.util.function.Predicate; @@ -18,10 +21,6 @@ public class GridFilterFilter implements Predicate { @Override public boolean test(IGridStack stack) { - return accepts(filters, ((GridStackItem) stack).getStack(), stack.getModId()); - } - - public static boolean accepts(List filters, ItemStack stack, String stackModId) { if (filters.isEmpty()) { return true; } @@ -31,12 +30,28 @@ public class GridFilterFilter implements Predicate { for (IFilter filter : filters) { lastMode = filter.getMode(); - if (filter.isModFilter()) { - if (filter.getStack().getItem().getRegistryName().getNamespace().equalsIgnoreCase(stackModId)) { + if (stack instanceof GridStackItem && filter.getStack() instanceof ItemStack) { + ItemStack stackInFilter = (ItemStack) filter.getStack(); + + if (filter.isModFilter()) { + if (stackInFilter.getItem().getRegistryName().getNamespace().equalsIgnoreCase(stack.getModId())) { + return filter.getMode() == IFilter.MODE_WHITELIST; + } + } else if (API.instance().getComparer().isEqual(((GridStackItem) stack).getStack(), stackInFilter, filter.getCompare())) { + return filter.getMode() == IFilter.MODE_WHITELIST; + } + } else if (stack instanceof GridStackFluid && filter.getStack() instanceof FluidStack) { + FluidStack stackInFilter = (FluidStack) filter.getStack(); + + if (filter.isModFilter()) { + String stackInFilterModId = FluidRegistry.getModId(stackInFilter); + + if (stackInFilterModId != null && stackInFilterModId.equalsIgnoreCase(stack.getModId())) { + return filter.getMode() == IFilter.MODE_WHITELIST; + } + } else if (API.instance().getComparer().isEqual(((GridStackFluid) stack).getStack(), stackInFilter, filter.getCompare())) { return filter.getMode() == IFilter.MODE_WHITELIST; } - } else if (API.instance().getComparer().isEqual(stack, filter.getStack(), filter.getCompare())) { - return filter.getMode() == IFilter.MODE_WHITELIST; } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/inventory/fluid/FluidInventory.java b/src/main/java/com/raoulvdberge/refinedstorage/inventory/fluid/FluidInventory.java index 58c3d5f76..00b33d22a 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/inventory/fluid/FluidInventory.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/inventory/fluid/FluidInventory.java @@ -14,7 +14,7 @@ public class FluidInventory { private boolean empty = true; @Nullable - private Consumer listener; + protected Consumer listener; public FluidInventory(int size, int maxAmount, @Nullable Consumer listener) { this.fluids = new FluidStack[size]; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/inventory/fluid/FluidInventoryFilter.java b/src/main/java/com/raoulvdberge/refinedstorage/inventory/fluid/FluidInventoryFilter.java new file mode 100644 index 000000000..2de1f6264 --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/inventory/fluid/FluidInventoryFilter.java @@ -0,0 +1,37 @@ +package com.raoulvdberge.refinedstorage.inventory.fluid; + +import com.raoulvdberge.refinedstorage.item.ItemFilter; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.NonNullList; +import net.minecraftforge.fluids.FluidStack; + +public class FluidInventoryFilter extends FluidInventory { + public FluidInventoryFilter(ItemStack stack) { + super(27, Integer.MAX_VALUE, null); + + this.listener = slot -> { + if (!stack.hasTagCompound()) { + stack.setTagCompound(new NBTTagCompound()); + } + + stack.getTagCompound().setTag(ItemFilter.NBT_FLUID_FILTERS, writeToNbt()); + }; + + if (stack.hasTagCompound() && stack.getTagCompound().hasKey(ItemFilter.NBT_FLUID_FILTERS)) { + readFromNbt(stack.getTagCompound().getCompoundTag(ItemFilter.NBT_FLUID_FILTERS)); + } + } + + public NonNullList getFilteredFluids() { + NonNullList list = NonNullList.create(); + + for (FluidStack fluid : this.getFluids()) { + if (fluid != null) { + list.add(fluid); + } + } + + return list; + } +} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/inventory/fluid/FluidInventoryFilterIcon.java b/src/main/java/com/raoulvdberge/refinedstorage/inventory/fluid/FluidInventoryFilterIcon.java new file mode 100644 index 000000000..75c2653fc --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/inventory/fluid/FluidInventoryFilterIcon.java @@ -0,0 +1,25 @@ +package com.raoulvdberge.refinedstorage.inventory.fluid; + +import com.raoulvdberge.refinedstorage.item.ItemFilter; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.fluids.FluidStack; + +public class FluidInventoryFilterIcon extends FluidInventory { + public FluidInventoryFilterIcon(ItemStack stack) { + super(1, Integer.MAX_VALUE, null); + + this.listener = slot -> { + if (!stack.hasTagCompound()) { + stack.setTagCompound(new NBTTagCompound()); + } + + ItemFilter.setFluidIcon(stack, getFluid(slot)); + }; + + FluidStack icon = ItemFilter.getFluidIcon(stack); + if (icon != null) { + setFluid(0, icon); + } + } +} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/inventory/item/ItemHandlerFilter.java b/src/main/java/com/raoulvdberge/refinedstorage/inventory/item/ItemHandlerFilter.java index f0aea09cf..61157ea98 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/inventory/item/ItemHandlerFilter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/inventory/item/ItemHandlerFilter.java @@ -4,12 +4,15 @@ import com.raoulvdberge.refinedstorage.RSItems; import com.raoulvdberge.refinedstorage.api.network.grid.IGridTab; import com.raoulvdberge.refinedstorage.api.util.IFilter; import com.raoulvdberge.refinedstorage.apiimpl.network.grid.GridTab; -import com.raoulvdberge.refinedstorage.apiimpl.util.Filter; +import com.raoulvdberge.refinedstorage.apiimpl.util.FilterFluid; +import com.raoulvdberge.refinedstorage.apiimpl.util.FilterItem; import com.raoulvdberge.refinedstorage.gui.GuiBase; import com.raoulvdberge.refinedstorage.gui.grid.GuiGrid; +import com.raoulvdberge.refinedstorage.inventory.fluid.FluidInventoryFilter; import com.raoulvdberge.refinedstorage.inventory.item.validator.ItemValidatorBasic; import com.raoulvdberge.refinedstorage.item.ItemFilter; import net.minecraft.item.ItemStack; +import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.relauncher.Side; @@ -54,24 +57,31 @@ public class ItemHandlerFilter extends ItemHandlerBase { int mode = ItemFilter.getMode(filter); boolean modFilter = ItemFilter.isModFilter(filter); - ItemHandlerFilterItems items = new ItemHandlerFilterItems(filter); - List filters = new ArrayList<>(); + ItemHandlerFilterItems items = new ItemHandlerFilterItems(filter); + for (ItemStack stack : items.getFilteredItems()) { if (stack.getItem() == RSItems.FILTER) { addFilter(stack); } else if (!stack.isEmpty()) { - filters.add(new Filter(stack, compare, mode, modFilter)); + filters.add(new FilterItem(stack, compare, mode, modFilter)); } } - ItemStack icon = ItemFilter.getIcon(filter); + FluidInventoryFilter fluids = new FluidInventoryFilter(filter); - if (icon.isEmpty()) { + for (FluidStack stack : fluids.getFilteredFluids()) { + filters.add(new FilterFluid(stack, compare, mode, modFilter)); + } + + ItemStack icon = ItemFilter.getIcon(filter); + FluidStack fluidIcon = ItemFilter.getFluidIcon(filter); + + if (icon.isEmpty() && fluidIcon == null) { this.filters.addAll(filters); } else { - tabs.add(new GridTab(filters, ItemFilter.getName(filter), icon)); + tabs.add(new GridTab(filters, ItemFilter.getName(filter), icon, fluidIcon)); } } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/item/ItemFilter.java b/src/main/java/com/raoulvdberge/refinedstorage/item/ItemFilter.java index b50ada453..d91e23419 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/item/ItemFilter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/item/ItemFilter.java @@ -5,9 +5,11 @@ import com.raoulvdberge.refinedstorage.RSGui; import com.raoulvdberge.refinedstorage.RSItems; import com.raoulvdberge.refinedstorage.api.util.IComparer; import com.raoulvdberge.refinedstorage.api.util.IFilter; +import com.raoulvdberge.refinedstorage.inventory.fluid.FluidInventoryFilter; import com.raoulvdberge.refinedstorage.inventory.item.ItemHandlerFilterItems; import com.raoulvdberge.refinedstorage.item.info.ItemInfo; import com.raoulvdberge.refinedstorage.render.IModelRegistration; +import com.raoulvdberge.refinedstorage.tile.config.IType; import com.raoulvdberge.refinedstorage.util.RenderUtils; import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.client.resources.I18n; @@ -20,9 +22,11 @@ import net.minecraft.util.EnumActionResult; import net.minecraft.util.EnumHand; import net.minecraft.util.text.TextFormatting; import net.minecraft.world.World; +import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; +import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.util.List; @@ -32,6 +36,9 @@ public class ItemFilter extends ItemBase { private static final String NBT_MOD_FILTER = "ModFilter"; private static final String NBT_NAME = "Name"; private static final String NBT_ICON = "Icon"; + private static final String NBT_FLUID_ICON = "FluidIcon"; + private static final String NBT_TYPE = "Type"; + public static final String NBT_FLUID_FILTERS = "FluidFilters"; public ItemFilter() { super(new ItemInfo(RS.ID, "filter")); @@ -62,17 +69,6 @@ public class ItemFilter extends ItemBase { return new ActionResult<>(EnumActionResult.PASS, stack); } - @Override - public String getItemStackDisplayName(ItemStack stack) { - String name = getName(stack); - - if (!name.trim().equals("")) { - return name; - } - - return super.getItemStackDisplayName(stack); - } - @Override public void addInformation(ItemStack stack, @Nullable World world, List tooltip, ITooltipFlag flag) { super.addInformation(stack, world, tooltip, flag); @@ -86,6 +82,10 @@ public class ItemFilter extends ItemBase { ItemHandlerFilterItems items = new ItemHandlerFilterItems(stack); RenderUtils.addCombinedItemsToTooltip(tooltip, false, items.getFilteredItems()); + + FluidInventoryFilter fluids = new FluidInventoryFilter(stack); + + RenderUtils.addCombinedFluidsToTooltip(tooltip, false, fluids.getFilteredFluids()); } public static int getCompare(ItemStack stack) { @@ -136,6 +136,7 @@ public class ItemFilter extends ItemBase { stack.getTagCompound().setString(NBT_NAME, name); } + @Nonnull public static ItemStack getIcon(ItemStack stack) { return stack.hasTagCompound() && stack.getTagCompound().hasKey(NBT_ICON) ? new ItemStack(stack.getTagCompound().getCompoundTag(NBT_ICON)) : ItemStack.EMPTY; } @@ -147,4 +148,33 @@ public class ItemFilter extends ItemBase { stack.getTagCompound().setTag(NBT_ICON, icon.serializeNBT()); } + + public static void setFluidIcon(ItemStack stack, @Nullable FluidStack icon) { + if (!stack.hasTagCompound()) { + stack.setTagCompound(new NBTTagCompound()); + } + + if (icon == null) { + stack.getTagCompound().removeTag(NBT_FLUID_ICON); + } else { + stack.getTagCompound().setTag(NBT_FLUID_ICON, icon.writeToNBT(new NBTTagCompound())); + } + } + + @Nullable + public static FluidStack getFluidIcon(ItemStack stack) { + return stack.hasTagCompound() && stack.getTagCompound().hasKey(NBT_FLUID_ICON) ? FluidStack.loadFluidStackFromNBT(stack.getTagCompound().getCompoundTag(NBT_FLUID_ICON)) : null; + } + + public static int getType(ItemStack stack) { + return stack.hasTagCompound() && stack.getTagCompound().hasKey(NBT_TYPE) ? stack.getTagCompound().getInteger(NBT_TYPE) : IType.ITEMS; + } + + public static void setType(ItemStack stack, int type) { + if (!stack.hasTagCompound()) { + stack.setTagCompound(new NBTTagCompound()); + } + + stack.getTagCompound().setInteger(NBT_TYPE, type); + } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/item/ItemPattern.java b/src/main/java/com/raoulvdberge/refinedstorage/item/ItemPattern.java index e3512273a..a64dd4550 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/item/ItemPattern.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/item/ItemPattern.java @@ -84,13 +84,13 @@ public class ItemPattern extends ItemBase implements ICraftingPatternProvider { tooltip.add(TextFormatting.YELLOW + I18n.format("misc.refinedstorage:pattern.inputs") + TextFormatting.RESET); RenderUtils.addCombinedItemsToTooltip(tooltip, true, pattern.getInputs().stream().map(i -> i.size() > 0 ? i.get(0) : ItemStack.EMPTY).collect(Collectors.toList())); - RenderUtils.addCombinedFluidsToTooltip(tooltip, pattern.getFluidInputs()); + RenderUtils.addCombinedFluidsToTooltip(tooltip, true, pattern.getFluidInputs()); tooltip.add(TextFormatting.YELLOW + I18n.format("misc.refinedstorage:pattern.outputs") + TextFormatting.RESET); } RenderUtils.addCombinedItemsToTooltip(tooltip, true, pattern.getOutputs()); - RenderUtils.addCombinedFluidsToTooltip(tooltip, pattern.getFluidOutputs()); + RenderUtils.addCombinedFluidsToTooltip(tooltip, true, pattern.getFluidOutputs()); if (isOredict(stack)) { tooltip.add(TextFormatting.BLUE + I18n.format("misc.refinedstorage:pattern.oredict") + TextFormatting.RESET); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/network/MessageFilterUpdate.java b/src/main/java/com/raoulvdberge/refinedstorage/network/MessageFilterUpdate.java index 2f7407158..0278a2d7d 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/network/MessageFilterUpdate.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/network/MessageFilterUpdate.java @@ -12,15 +12,17 @@ public class MessageFilterUpdate extends MessageHandlerPlayerToServer { public static final TileDataParameter TAB_SELECTED = new TileDataParameter<>(DataSerializers.VARINT, 0, t -> t.getNode().getTabSelected(), (t, v) -> { t.getNode().setTabSelected(v == t.getNode().getTabSelected() ? -1 : v); t.getNode().markDirty(); - }, (initial, p) -> { - if (p != -1) { - GuiBase.executeLater(GuiGrid.class, grid -> grid.getView().sort()); - } - }); + }, (initial, p) -> GuiBase.executeLater(GuiGrid.class, grid -> grid.getView().sort())); public static final TileDataParameter TAB_PAGE = new TileDataParameter<>(DataSerializers.VARINT, 0, t -> t.getNode().getTabPage(), (t, v) -> { if (v >= 0 && v <= t.getNode().getTotalTabPages()) { t.getNode().setTabPage(v); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/portable/TilePortableGrid.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/portable/TilePortableGrid.java index 7dbc94b96..7002d1713 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/portable/TilePortableGrid.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/portable/TilePortableGrid.java @@ -90,11 +90,7 @@ public class TilePortableGrid extends TileBase implements IGrid, IPortableGrid, private static final TileDataParameter TAB_SELECTED = new TileDataParameter<>(DataSerializers.VARINT, 0, TilePortableGrid::getTabSelected, (t, v) -> { t.setTabSelected(v == t.getTabSelected() ? -1 : v); t.markDirty(); - }, (initial, p) -> { - if (p != -1) { - GuiBase.executeLater(GuiGrid.class, grid -> grid.getView().sort()); - } - }); + }, (initial, p) -> GuiBase.executeLater(GuiGrid.class, grid -> grid.getView().sort())); private static final TileDataParameter TAB_PAGE = new TileDataParameter<>(DataSerializers.VARINT, 0, TilePortableGrid::getTabPage, (t, v) -> { if (v >= 0 && v <= t.getTotalTabPages()) { t.setTabPage(v); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/util/RenderUtils.java b/src/main/java/com/raoulvdberge/refinedstorage/util/RenderUtils.java index 083464dcc..77d657099 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/util/RenderUtils.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/util/RenderUtils.java @@ -260,7 +260,7 @@ public final class RenderUtils { } } - public static void addCombinedFluidsToTooltip(List tooltip, NonNullList stacks) { + public static void addCombinedFluidsToTooltip(List tooltip, boolean showMb, NonNullList stacks) { Set combinedIndices = new HashSet<>(); for (int i = 0; i < stacks.size(); ++i) { @@ -279,7 +279,7 @@ public final class RenderUtils { } } - tooltip.add(API.instance().getQuantityFormatter().formatInBucketForm(amount) + " " + data); + tooltip.add((showMb ? (API.instance().getQuantityFormatter().formatInBucketForm(amount) + " ") : "") + data); } } }