Filters now support fluids and can be inserted in the Fluid Grid. Fixes #1920

This commit is contained in:
raoulvdberge
2018-07-29 21:42:59 +02:00
parent 218c756d5b
commit 0788d6b7d0
22 changed files with 302 additions and 72 deletions

View File

@@ -5,6 +5,7 @@
- Added Crafting Upgrade support for fluids on the Exporter, Constructor and Fluid Interface (raoulvdberge) - 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) - Added config option to hide covers in the creative mode tabs and JEI (raoulvdberge)
- The Portable Grid now supports fluid disks (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) - 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) - 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) - You can now keep fluids in stock by attaching a External Storage in fluid mode to a Fluid Interface with a Crafting Upgrade (raoulvdberge)

View File

@@ -1,18 +1,16 @@
package com.raoulvdberge.refinedstorage.api.util; package com.raoulvdberge.refinedstorage.api.util;
import net.minecraft.item.ItemStack;
/** /**
* A filter. * A filter.
*/ */
public interface IFilter { public interface IFilter<T> {
int MODE_WHITELIST = 0; int MODE_WHITELIST = 0;
int MODE_BLACKLIST = 1; int MODE_BLACKLIST = 1;
/** /**
* @return the stack being filtered * @return the stack being filtered
*/ */
ItemStack getStack(); T getStack();
/** /**
* @return the compare flags, see {@link IComparer} * @return the compare flags, see {@link IComparer}

View File

@@ -4,23 +4,30 @@ import com.raoulvdberge.refinedstorage.api.network.grid.IGridTab;
import com.raoulvdberge.refinedstorage.api.render.IElementDrawer; import com.raoulvdberge.refinedstorage.api.render.IElementDrawer;
import com.raoulvdberge.refinedstorage.api.util.IFilter; import com.raoulvdberge.refinedstorage.api.util.IFilter;
import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.RenderHelper; import net.minecraft.client.renderer.RenderHelper;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fml.client.config.GuiUtils; import net.minecraftforge.fml.client.config.GuiUtils;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
public class GridTab implements IGridTab { public class GridTab implements IGridTab {
private List<IFilter> filters; private List<IFilter> filters;
private String name; private String name;
@Nonnull
private ItemStack icon; private ItemStack icon;
@Nullable
private FluidStack fluidIcon;
public GridTab(List<IFilter> filters, String name, ItemStack icon) { public GridTab(List<IFilter> filters, String name, @Nonnull ItemStack icon, @Nullable FluidStack fluidIcon) {
this.filters = filters; this.filters = filters;
this.name = name; this.name = name;
this.icon = icon; this.icon = icon;
this.fluidIcon = fluidIcon;
} }
@Override @Override
@@ -37,8 +44,14 @@ public class GridTab implements IGridTab {
@Override @Override
public void drawIcon(int x, int y, IElementDrawer<ItemStack> itemDrawer, IElementDrawer<FluidStack> fluidDrawer) { public void drawIcon(int x, int y, IElementDrawer<ItemStack> itemDrawer, IElementDrawer<FluidStack> 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();
}
} }
} }

View File

@@ -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<FluidStack> {
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;
}
}

View File

@@ -3,13 +3,13 @@ package com.raoulvdberge.refinedstorage.apiimpl.util;
import com.raoulvdberge.refinedstorage.api.util.IFilter; import com.raoulvdberge.refinedstorage.api.util.IFilter;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
public class Filter implements IFilter { public class FilterItem implements IFilter<ItemStack> {
private ItemStack stack; private ItemStack stack;
private int compare; private int compare;
private int mode; private int mode;
private boolean modFilter; 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.stack = stack;
this.compare = compare; this.compare = compare;
this.mode = mode; this.mode = mode;

View File

@@ -1,8 +1,14 @@
package com.raoulvdberge.refinedstorage.container; package com.raoulvdberge.refinedstorage.container;
import com.raoulvdberge.refinedstorage.container.slot.filter.SlotFilter; 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.ItemHandlerFilterIcon;
import com.raoulvdberge.refinedstorage.inventory.item.ItemHandlerFilterItems; 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.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
@@ -19,8 +25,12 @@ public class ContainerFilter extends ContainerBase {
ItemHandlerFilterItems filter = new ItemHandlerFilterItems(stack); ItemHandlerFilterItems filter = new ItemHandlerFilterItems(stack);
FluidInventoryFilterIcon fluidIcon = new FluidInventoryFilterIcon(stack);
FluidInventory fluidFilter = new FluidInventoryFilter(stack);
for (int i = 0; i < 27; ++i) { 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) { if ((i + 1) % 9 == 0) {
x = 8; 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); addPlayerInventory(8, 149);
transferManager.addItemFilterTransfer(player.inventory, filter); transferManager.addFilterTransfer(player.inventory, filter, fluidFilter, () -> ItemFilter.getType(stack));
} }
public ItemStack getStack() { public ItemStack getStack() {

View File

@@ -54,9 +54,7 @@ public class ContainerGrid extends ContainerBase {
this.transferManager.clearTransfers(); this.transferManager.clearTransfers();
if (grid.getGridType() != GridType.FLUID || grid instanceof IPortableGrid) { addFilterSlots();
addFilterSlots();
}
if (grid instanceof IPortableGrid) { if (grid instanceof IPortableGrid) {
addPortableGridSlots(); addPortableGridSlots();

View File

@@ -4,22 +4,28 @@ import com.raoulvdberge.refinedstorage.RS;
import com.raoulvdberge.refinedstorage.api.util.IComparer; import com.raoulvdberge.refinedstorage.api.util.IComparer;
import com.raoulvdberge.refinedstorage.api.util.IFilter; import com.raoulvdberge.refinedstorage.api.util.IFilter;
import com.raoulvdberge.refinedstorage.container.ContainerFilter; import com.raoulvdberge.refinedstorage.container.ContainerFilter;
import com.raoulvdberge.refinedstorage.gui.control.SideButtonFilterType;
import com.raoulvdberge.refinedstorage.item.ItemFilter; import com.raoulvdberge.refinedstorage.item.ItemFilter;
import com.raoulvdberge.refinedstorage.network.MessageFilterUpdate; import com.raoulvdberge.refinedstorage.network.MessageFilterUpdate;
import com.raoulvdberge.refinedstorage.tile.config.IType;
import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiTextField; import net.minecraft.client.gui.GuiTextField;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fml.client.config.GuiCheckBox; import net.minecraftforge.fml.client.config.GuiCheckBox;
import java.io.IOException; import java.io.IOException;
public class GuiFilter extends GuiBase { public class GuiFilter extends GuiBase {
private ItemStack stack;
private int compare; private int compare;
private int mode; private int mode;
private boolean modFilter; private boolean modFilter;
private String name; private String name;
private int type;
private GuiCheckBox compareDamage; private GuiCheckBox compareDamage;
private GuiCheckBox compareNBT; private GuiCheckBox compareNbt;
private GuiCheckBox toggleModFilter; private GuiCheckBox toggleModFilter;
private GuiButton toggleMode; private GuiButton toggleMode;
private GuiTextField nameField; private GuiTextField nameField;
@@ -27,19 +33,26 @@ public class GuiFilter extends GuiBase {
public GuiFilter(ContainerFilter container) { public GuiFilter(ContainerFilter container) {
super(container, 176, 231); super(container, 176, 231);
this.stack = container.getStack();
this.compare = ItemFilter.getCompare(container.getStack()); this.compare = ItemFilter.getCompare(container.getStack());
this.mode = ItemFilter.getMode(container.getStack()); this.mode = ItemFilter.getMode(container.getStack());
this.modFilter = ItemFilter.isModFilter(container.getStack()); this.modFilter = ItemFilter.isModFilter(container.getStack());
this.name = ItemFilter.getName(container.getStack()); this.name = ItemFilter.getName(container.getStack());
this.type = ItemFilter.getType(container.getStack());
} }
@Override @Override
public void init(int x, int y) { 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, y + 77, t("gui.refinedstorage:filter.compare_nbt"), (compare & IComparer.COMPARE_NBT) == IComparer.COMPARE_NBT);
compareNBT = addCheckBox(x + 7 + compareDamage.getButtonWidth() + 4, 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); toggleModFilter = addCheckBox(0, y + 71 + 25, t("gui.refinedstorage:filter.mod_filter"), modFilter);
toggleMode = addButton(x + 7, y + 71 + 21, 0, 20, ""); toggleMode = addButton(x + 7, y + 71 + 21, 0, 20, "");
updateModeButton(mode); updateModeButton(mode);
nameField = new GuiTextField(0, fontRenderer, x + 34, y + 121, 137 - 6, fontRenderer.FONT_HEIGHT); nameField = new GuiTextField(0, fontRenderer, x + 34, y + 121, 137 - 6, fontRenderer.FONT_HEIGHT);
nameField.setText(name); nameField.setText(name);
nameField.setEnableBackgroundDrawing(false); nameField.setEnableBackgroundDrawing(false);
@@ -47,6 +60,8 @@ public class GuiFilter extends GuiBase {
nameField.setCanLoseFocus(true); nameField.setCanLoseFocus(true);
nameField.setFocused(false); nameField.setFocused(false);
nameField.setTextColor(16777215); nameField.setTextColor(16777215);
addSideButton(new SideButtonFilterType(this));
} }
private void updateModeButton(int mode) { private void updateModeButton(int mode) {
@@ -98,7 +113,7 @@ public class GuiFilter extends GuiBase {
if (button == compareDamage) { if (button == compareDamage) {
compare ^= IComparer.COMPARE_DAMAGE; compare ^= IComparer.COMPARE_DAMAGE;
} else if (button == compareNBT) { } else if (button == compareNbt) {
compare ^= IComparer.COMPARE_NBT; compare ^= IComparer.COMPARE_NBT;
} else if (button == toggleMode) { } else if (button == toggleMode) {
mode = mode == IFilter.MODE_WHITELIST ? IFilter.MODE_BLACKLIST : IFilter.MODE_WHITELIST; mode = mode == IFilter.MODE_WHITELIST ? IFilter.MODE_BLACKLIST : IFilter.MODE_WHITELIST;
@@ -111,7 +126,19 @@ public class GuiFilter extends GuiBase {
sendUpdate(); sendUpdate();
} }
private void sendUpdate() { public int getType() {
RS.INSTANCE.network.sendToServer(new MessageFilterUpdate(compare, mode, modFilter, nameField.getText())); 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));
} }
} }

View File

@@ -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();
}
}

View File

@@ -57,7 +57,7 @@ public class GuiGrid extends GuiBase implements IResizableDisplay {
private int slotNumber; private int slotNumber;
public GuiGrid(ContainerGrid container, IGrid grid) { 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.grid = grid;
this.view = grid.getGridType() == GridType.FLUID ? new GridViewFluid(this, getDefaultSorter(), getSorters()) : new GridViewItem(this, getDefaultSorter(), getSorters()); 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(); 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 // Filters and/or 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);
drawTexture(x + screenWidth - 34 + 4, y + tabs.getHeight(), 197, 0, 30, grid instanceof IPortableGrid ? 114 : 82);
}
int rows = getVisibleRows(); int rows = getVisibleRows();
for (int i = 0; i < rows; ++i) { for (int i = 0; i < rows; ++i) {
yy += 18; 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; 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) { if (grid.getGridType() == GridType.PATTERN) {
int ty = 0; int ty = 0;

View File

@@ -14,6 +14,6 @@ public class GridFilterCraftable implements Predicate<IGridStack> {
@Override @Override
public boolean test(IGridStack stack) { public boolean test(IGridStack stack) {
return stack instanceof GridStackItem && ((GridStackItem) stack).isCraftable() == craftable; return stack instanceof GridStackItem && stack.isCraftable() == craftable;
} }
} }

View File

@@ -2,9 +2,12 @@ package com.raoulvdberge.refinedstorage.gui.grid.filtering;
import com.raoulvdberge.refinedstorage.api.util.IFilter; import com.raoulvdberge.refinedstorage.api.util.IFilter;
import com.raoulvdberge.refinedstorage.apiimpl.API; 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.GridStackItem;
import com.raoulvdberge.refinedstorage.gui.grid.stack.IGridStack; import com.raoulvdberge.refinedstorage.gui.grid.stack.IGridStack;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraftforge.fluids.FluidRegistry;
import net.minecraftforge.fluids.FluidStack;
import java.util.List; import java.util.List;
import java.util.function.Predicate; import java.util.function.Predicate;
@@ -18,10 +21,6 @@ public class GridFilterFilter implements Predicate<IGridStack> {
@Override @Override
public boolean test(IGridStack stack) { public boolean test(IGridStack stack) {
return accepts(filters, ((GridStackItem) stack).getStack(), stack.getModId());
}
public static boolean accepts(List<IFilter> filters, ItemStack stack, String stackModId) {
if (filters.isEmpty()) { if (filters.isEmpty()) {
return true; return true;
} }
@@ -31,12 +30,28 @@ public class GridFilterFilter implements Predicate<IGridStack> {
for (IFilter filter : filters) { for (IFilter filter : filters) {
lastMode = filter.getMode(); lastMode = filter.getMode();
if (filter.isModFilter()) { if (stack instanceof GridStackItem && filter.getStack() instanceof ItemStack) {
if (filter.getStack().getItem().getRegistryName().getNamespace().equalsIgnoreCase(stackModId)) { 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; return filter.getMode() == IFilter.MODE_WHITELIST;
} }
} else if (API.instance().getComparer().isEqual(stack, filter.getStack(), filter.getCompare())) {
return filter.getMode() == IFilter.MODE_WHITELIST;
} }
} }

View File

@@ -14,7 +14,7 @@ public class FluidInventory {
private boolean empty = true; private boolean empty = true;
@Nullable @Nullable
private Consumer<Integer> listener; protected Consumer<Integer> listener;
public FluidInventory(int size, int maxAmount, @Nullable Consumer<Integer> listener) { public FluidInventory(int size, int maxAmount, @Nullable Consumer<Integer> listener) {
this.fluids = new FluidStack[size]; this.fluids = new FluidStack[size];

View File

@@ -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<FluidStack> getFilteredFluids() {
NonNullList<FluidStack> list = NonNullList.create();
for (FluidStack fluid : this.getFluids()) {
if (fluid != null) {
list.add(fluid);
}
}
return list;
}
}

View File

@@ -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);
}
}
}

View File

@@ -4,12 +4,15 @@ import com.raoulvdberge.refinedstorage.RSItems;
import com.raoulvdberge.refinedstorage.api.network.grid.IGridTab; import com.raoulvdberge.refinedstorage.api.network.grid.IGridTab;
import com.raoulvdberge.refinedstorage.api.util.IFilter; import com.raoulvdberge.refinedstorage.api.util.IFilter;
import com.raoulvdberge.refinedstorage.apiimpl.network.grid.GridTab; 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.GuiBase;
import com.raoulvdberge.refinedstorage.gui.grid.GuiGrid; 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.inventory.item.validator.ItemValidatorBasic;
import com.raoulvdberge.refinedstorage.item.ItemFilter; import com.raoulvdberge.refinedstorage.item.ItemFilter;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.common.FMLCommonHandler;
import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.Side;
@@ -54,24 +57,31 @@ public class ItemHandlerFilter extends ItemHandlerBase {
int mode = ItemFilter.getMode(filter); int mode = ItemFilter.getMode(filter);
boolean modFilter = ItemFilter.isModFilter(filter); boolean modFilter = ItemFilter.isModFilter(filter);
ItemHandlerFilterItems items = new ItemHandlerFilterItems(filter);
List<IFilter> filters = new ArrayList<>(); List<IFilter> filters = new ArrayList<>();
ItemHandlerFilterItems items = new ItemHandlerFilterItems(filter);
for (ItemStack stack : items.getFilteredItems()) { for (ItemStack stack : items.getFilteredItems()) {
if (stack.getItem() == RSItems.FILTER) { if (stack.getItem() == RSItems.FILTER) {
addFilter(stack); addFilter(stack);
} else if (!stack.isEmpty()) { } 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); this.filters.addAll(filters);
} else { } else {
tabs.add(new GridTab(filters, ItemFilter.getName(filter), icon)); tabs.add(new GridTab(filters, ItemFilter.getName(filter), icon, fluidIcon));
} }
} }
} }

View File

@@ -5,9 +5,11 @@ import com.raoulvdberge.refinedstorage.RSGui;
import com.raoulvdberge.refinedstorage.RSItems; import com.raoulvdberge.refinedstorage.RSItems;
import com.raoulvdberge.refinedstorage.api.util.IComparer; import com.raoulvdberge.refinedstorage.api.util.IComparer;
import com.raoulvdberge.refinedstorage.api.util.IFilter; 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.inventory.item.ItemHandlerFilterItems;
import com.raoulvdberge.refinedstorage.item.info.ItemInfo; import com.raoulvdberge.refinedstorage.item.info.ItemInfo;
import com.raoulvdberge.refinedstorage.render.IModelRegistration; import com.raoulvdberge.refinedstorage.render.IModelRegistration;
import com.raoulvdberge.refinedstorage.tile.config.IType;
import com.raoulvdberge.refinedstorage.util.RenderUtils; import com.raoulvdberge.refinedstorage.util.RenderUtils;
import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.client.resources.I18n; import net.minecraft.client.resources.I18n;
@@ -20,9 +22,11 @@ import net.minecraft.util.EnumActionResult;
import net.minecraft.util.EnumHand; import net.minecraft.util.EnumHand;
import net.minecraft.util.text.TextFormatting; import net.minecraft.util.text.TextFormatting;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.fml.relauncher.SideOnly;
import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.List; 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_MOD_FILTER = "ModFilter";
private static final String NBT_NAME = "Name"; private static final String NBT_NAME = "Name";
private static final String NBT_ICON = "Icon"; 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() { public ItemFilter() {
super(new ItemInfo(RS.ID, "filter")); super(new ItemInfo(RS.ID, "filter"));
@@ -62,17 +69,6 @@ public class ItemFilter extends ItemBase {
return new ActionResult<>(EnumActionResult.PASS, stack); 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 @Override
public void addInformation(ItemStack stack, @Nullable World world, List<String> tooltip, ITooltipFlag flag) { public void addInformation(ItemStack stack, @Nullable World world, List<String> tooltip, ITooltipFlag flag) {
super.addInformation(stack, world, tooltip, flag); super.addInformation(stack, world, tooltip, flag);
@@ -86,6 +82,10 @@ public class ItemFilter extends ItemBase {
ItemHandlerFilterItems items = new ItemHandlerFilterItems(stack); ItemHandlerFilterItems items = new ItemHandlerFilterItems(stack);
RenderUtils.addCombinedItemsToTooltip(tooltip, false, items.getFilteredItems()); RenderUtils.addCombinedItemsToTooltip(tooltip, false, items.getFilteredItems());
FluidInventoryFilter fluids = new FluidInventoryFilter(stack);
RenderUtils.addCombinedFluidsToTooltip(tooltip, false, fluids.getFilteredFluids());
} }
public static int getCompare(ItemStack stack) { public static int getCompare(ItemStack stack) {
@@ -136,6 +136,7 @@ public class ItemFilter extends ItemBase {
stack.getTagCompound().setString(NBT_NAME, name); stack.getTagCompound().setString(NBT_NAME, name);
} }
@Nonnull
public static ItemStack getIcon(ItemStack stack) { public static ItemStack getIcon(ItemStack stack) {
return stack.hasTagCompound() && stack.getTagCompound().hasKey(NBT_ICON) ? new ItemStack(stack.getTagCompound().getCompoundTag(NBT_ICON)) : ItemStack.EMPTY; 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()); 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);
}
} }

View File

@@ -84,13 +84,13 @@ public class ItemPattern extends ItemBase implements ICraftingPatternProvider {
tooltip.add(TextFormatting.YELLOW + I18n.format("misc.refinedstorage:pattern.inputs") + TextFormatting.RESET); 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.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); tooltip.add(TextFormatting.YELLOW + I18n.format("misc.refinedstorage:pattern.outputs") + TextFormatting.RESET);
} }
RenderUtils.addCombinedItemsToTooltip(tooltip, true, pattern.getOutputs()); RenderUtils.addCombinedItemsToTooltip(tooltip, true, pattern.getOutputs());
RenderUtils.addCombinedFluidsToTooltip(tooltip, pattern.getFluidOutputs()); RenderUtils.addCombinedFluidsToTooltip(tooltip, true, pattern.getFluidOutputs());
if (isOredict(stack)) { if (isOredict(stack)) {
tooltip.add(TextFormatting.BLUE + I18n.format("misc.refinedstorage:pattern.oredict") + TextFormatting.RESET); tooltip.add(TextFormatting.BLUE + I18n.format("misc.refinedstorage:pattern.oredict") + TextFormatting.RESET);

View File

@@ -12,15 +12,17 @@ public class MessageFilterUpdate extends MessageHandlerPlayerToServer<MessageFil
private int mode; private int mode;
private boolean modFilter; private boolean modFilter;
private String name; private String name;
private int type;
public MessageFilterUpdate() { public MessageFilterUpdate() {
} }
public MessageFilterUpdate(int compare, int mode, boolean modFilter, String name) { public MessageFilterUpdate(int compare, int mode, boolean modFilter, String name, int type) {
this.compare = compare; this.compare = compare;
this.mode = mode; this.mode = mode;
this.modFilter = modFilter; this.modFilter = modFilter;
this.name = name; this.name = name;
this.type = type;
} }
@Override @Override
@@ -29,6 +31,7 @@ public class MessageFilterUpdate extends MessageHandlerPlayerToServer<MessageFil
mode = buf.readInt(); mode = buf.readInt();
modFilter = buf.readBoolean(); modFilter = buf.readBoolean();
name = ByteBufUtils.readUTF8String(buf); name = ByteBufUtils.readUTF8String(buf);
type = buf.readInt();
} }
@Override @Override
@@ -37,6 +40,7 @@ public class MessageFilterUpdate extends MessageHandlerPlayerToServer<MessageFil
buf.writeInt(mode); buf.writeInt(mode);
buf.writeBoolean(modFilter); buf.writeBoolean(modFilter);
ByteBufUtils.writeUTF8String(buf, name); ByteBufUtils.writeUTF8String(buf, name);
buf.writeInt(type);
} }
@Override @Override
@@ -46,6 +50,7 @@ public class MessageFilterUpdate extends MessageHandlerPlayerToServer<MessageFil
ItemFilter.setMode(((ContainerFilter) player.openContainer).getStack(), message.mode); ItemFilter.setMode(((ContainerFilter) player.openContainer).getStack(), message.mode);
ItemFilter.setModFilter(((ContainerFilter) player.openContainer).getStack(), message.modFilter); ItemFilter.setModFilter(((ContainerFilter) player.openContainer).getStack(), message.modFilter);
ItemFilter.setName(((ContainerFilter) player.openContainer).getStack(), message.name); ItemFilter.setName(((ContainerFilter) player.openContainer).getStack(), message.name);
ItemFilter.setType(((ContainerFilter) player.openContainer).getStack(), message.type);
} }
} }
} }

View File

@@ -52,11 +52,7 @@ public class TileGrid extends TileNode<NetworkNodeGrid> {
public static final TileDataParameter<Integer, TileGrid> TAB_SELECTED = new TileDataParameter<>(DataSerializers.VARINT, 0, t -> t.getNode().getTabSelected(), (t, v) -> { public static final TileDataParameter<Integer, TileGrid> TAB_SELECTED = new TileDataParameter<>(DataSerializers.VARINT, 0, t -> t.getNode().getTabSelected(), (t, v) -> {
t.getNode().setTabSelected(v == t.getNode().getTabSelected() ? -1 : v); t.getNode().setTabSelected(v == t.getNode().getTabSelected() ? -1 : v);
t.getNode().markDirty(); t.getNode().markDirty();
}, (initial, p) -> { }, (initial, p) -> GuiBase.executeLater(GuiGrid.class, grid -> grid.getView().sort()));
if (p != -1) {
GuiBase.executeLater(GuiGrid.class, grid -> grid.getView().sort());
}
});
public static final TileDataParameter<Integer, TileGrid> TAB_PAGE = new TileDataParameter<>(DataSerializers.VARINT, 0, t -> t.getNode().getTabPage(), (t, v) -> { public static final TileDataParameter<Integer, TileGrid> TAB_PAGE = new TileDataParameter<>(DataSerializers.VARINT, 0, t -> t.getNode().getTabPage(), (t, v) -> {
if (v >= 0 && v <= t.getNode().getTotalTabPages()) { if (v >= 0 && v <= t.getNode().getTotalTabPages()) {
t.getNode().setTabPage(v); t.getNode().setTabPage(v);

View File

@@ -90,11 +90,7 @@ public class TilePortableGrid extends TileBase implements IGrid, IPortableGrid,
private static final TileDataParameter<Integer, TilePortableGrid> TAB_SELECTED = new TileDataParameter<>(DataSerializers.VARINT, 0, TilePortableGrid::getTabSelected, (t, v) -> { private static final TileDataParameter<Integer, TilePortableGrid> TAB_SELECTED = new TileDataParameter<>(DataSerializers.VARINT, 0, TilePortableGrid::getTabSelected, (t, v) -> {
t.setTabSelected(v == t.getTabSelected() ? -1 : v); t.setTabSelected(v == t.getTabSelected() ? -1 : v);
t.markDirty(); t.markDirty();
}, (initial, p) -> { }, (initial, p) -> GuiBase.executeLater(GuiGrid.class, grid -> grid.getView().sort()));
if (p != -1) {
GuiBase.executeLater(GuiGrid.class, grid -> grid.getView().sort());
}
});
private static final TileDataParameter<Integer, TilePortableGrid> TAB_PAGE = new TileDataParameter<>(DataSerializers.VARINT, 0, TilePortableGrid::getTabPage, (t, v) -> { private static final TileDataParameter<Integer, TilePortableGrid> TAB_PAGE = new TileDataParameter<>(DataSerializers.VARINT, 0, TilePortableGrid::getTabPage, (t, v) -> {
if (v >= 0 && v <= t.getTotalTabPages()) { if (v >= 0 && v <= t.getTotalTabPages()) {
t.setTabPage(v); t.setTabPage(v);

View File

@@ -260,7 +260,7 @@ public final class RenderUtils {
} }
} }
public static void addCombinedFluidsToTooltip(List<String> tooltip, NonNullList<FluidStack> stacks) { public static void addCombinedFluidsToTooltip(List<String> tooltip, boolean showMb, NonNullList<FluidStack> stacks) {
Set<Integer> combinedIndices = new HashSet<>(); Set<Integer> combinedIndices = new HashSet<>();
for (int i = 0; i < stacks.size(); ++i) { 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);
} }
} }
} }