Add crafting monitor filtering

This commit is contained in:
raoulvdberge
2017-01-29 15:48:47 +01:00
parent 9477fa3b63
commit 4282657340
11 changed files with 145 additions and 9 deletions

View File

@@ -1,18 +1,29 @@
package com.raoulvdberge.refinedstorage.apiimpl.network.node; package com.raoulvdberge.refinedstorage.apiimpl.network.node;
import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.RS;
import com.raoulvdberge.refinedstorage.RSUtils;
import com.raoulvdberge.refinedstorage.inventory.ItemHandlerFilter;
import com.raoulvdberge.refinedstorage.inventory.ItemHandlerListenerNetworkNode;
import com.raoulvdberge.refinedstorage.item.filter.Filter;
import com.raoulvdberge.refinedstorage.tile.craftingmonitor.ICraftingMonitor; import com.raoulvdberge.refinedstorage.tile.craftingmonitor.ICraftingMonitor;
import com.raoulvdberge.refinedstorage.tile.craftingmonitor.TileCraftingMonitor; import com.raoulvdberge.refinedstorage.tile.craftingmonitor.TileCraftingMonitor;
import com.raoulvdberge.refinedstorage.tile.data.TileDataParameter; import com.raoulvdberge.refinedstorage.tile.data.TileDataParameter;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraftforge.items.IItemHandler;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;
public class NetworkNodeCraftingMonitor extends NetworkNode implements ICraftingMonitor { public class NetworkNodeCraftingMonitor extends NetworkNode implements ICraftingMonitor {
public static final String ID = "crafting_monitor"; public static final String ID = "crafting_monitor";
private List<Filter> filters = new ArrayList<>();
private ItemHandlerFilter filter = new ItemHandlerFilter(filters, new ArrayList<>(), new ItemHandlerListenerNetworkNode(this));
public NetworkNodeCraftingMonitor(INetworkNodeHolder holder) { public NetworkNodeCraftingMonitor(INetworkNodeHolder holder) {
super(holder); super(holder);
} }
@@ -55,9 +66,39 @@ public class NetworkNodeCraftingMonitor extends NetworkNode implements ICrafting
return network != null ? network.getPosition() : null; return network != null ? network.getPosition() : null;
} }
@Override
public List<Filter> getFilters() {
return filters;
}
public void onOpened(EntityPlayer player) { public void onOpened(EntityPlayer player) {
if (network != null) { if (network != null) {
network.sendCraftingMonitorUpdate((EntityPlayerMP) player); network.sendCraftingMonitorUpdate((EntityPlayerMP) player);
} }
} }
@Override
public NBTTagCompound write(NBTTagCompound tag) {
super.write(tag);
RSUtils.writeItems(filter, 0, tag);
return tag;
}
@Override
public void read(NBTTagCompound tag) {
super.read(tag);
RSUtils.readItems(filter, 0, tag);
}
public ItemHandlerFilter getFilter() {
return filter;
}
@Override
public IItemHandler getDrops() {
return filter;
}
} }

View File

@@ -83,7 +83,7 @@ public class NetworkNodeGrid extends NetworkNode implements IGrid {
private ItemHandlerBasic patterns = new ItemHandlerBasic(2, new ItemHandlerListenerNetworkNode(this), new ItemValidatorBasic(RSItems.PATTERN)); private ItemHandlerBasic patterns = new ItemHandlerBasic(2, new ItemHandlerListenerNetworkNode(this), new ItemValidatorBasic(RSItems.PATTERN));
private List<Filter> filters = new ArrayList<>(); private List<Filter> filters = new ArrayList<>();
private List<FilterTab> tabs = new ArrayList<>(); private List<FilterTab> tabs = new ArrayList<>();
private ItemHandlerFilter filter = new ItemHandlerFilter(filters, tabs); private ItemHandlerFilter filter = new ItemHandlerFilter(filters, tabs, new ItemHandlerListenerNetworkNode(this));
private EnumGridType type; private EnumGridType type;

View File

@@ -3,6 +3,7 @@ package com.raoulvdberge.refinedstorage.container;
import com.raoulvdberge.refinedstorage.tile.craftingmonitor.ICraftingMonitor; import com.raoulvdberge.refinedstorage.tile.craftingmonitor.ICraftingMonitor;
import com.raoulvdberge.refinedstorage.tile.craftingmonitor.TileCraftingMonitor; import com.raoulvdberge.refinedstorage.tile.craftingmonitor.TileCraftingMonitor;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import net.minecraftforge.items.SlotItemHandler;
public class ContainerCraftingMonitor extends ContainerBase { public class ContainerCraftingMonitor extends ContainerBase {
private ICraftingMonitor craftingMonitor; private ICraftingMonitor craftingMonitor;
@@ -13,6 +14,10 @@ public class ContainerCraftingMonitor extends ContainerBase {
this.craftingMonitor = craftingMonitor; this.craftingMonitor = craftingMonitor;
addPlayerInventory(8, 148); addPlayerInventory(8, 148);
for (int i = 0; i < 4; ++i) {
addSlotToContainer(new SlotItemHandler(craftingMonitor.getFilter(), i, 187, 6 + (18 * i)));
}
} }
public ICraftingMonitor getCraftingMonitor() { public ICraftingMonitor getCraftingMonitor() {

View File

@@ -5,6 +5,7 @@ import com.raoulvdberge.refinedstorage.api.autocrafting.craftingmonitor.ICraftin
import com.raoulvdberge.refinedstorage.api.render.IElementDrawer; import com.raoulvdberge.refinedstorage.api.render.IElementDrawer;
import com.raoulvdberge.refinedstorage.api.render.IElementDrawers; import com.raoulvdberge.refinedstorage.api.render.IElementDrawers;
import com.raoulvdberge.refinedstorage.container.ContainerCraftingMonitor; import com.raoulvdberge.refinedstorage.container.ContainerCraftingMonitor;
import com.raoulvdberge.refinedstorage.gui.grid.filtering.GridFilterFilter;
import com.raoulvdberge.refinedstorage.gui.sidebutton.SideButtonRedstoneMode; import com.raoulvdberge.refinedstorage.gui.sidebutton.SideButtonRedstoneMode;
import com.raoulvdberge.refinedstorage.network.MessageCraftingMonitorCancel; import com.raoulvdberge.refinedstorage.network.MessageCraftingMonitorCancel;
import com.raoulvdberge.refinedstorage.tile.craftingmonitor.ICraftingMonitor; import com.raoulvdberge.refinedstorage.tile.craftingmonitor.ICraftingMonitor;
@@ -12,8 +13,11 @@ import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.RenderHelper; import net.minecraft.client.renderer.RenderHelper;
import net.minecraft.client.resources.I18n; import net.minecraft.client.resources.I18n;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
@@ -38,6 +42,8 @@ public class GuiCraftingMonitor extends GuiBase {
private static final int ITEM_WIDTH = 143; private static final int ITEM_WIDTH = 143;
private static final int ITEM_HEIGHT = 18; private static final int ITEM_HEIGHT = 18;
private static boolean markedForSorting;
private GuiButton cancelButton; private GuiButton cancelButton;
private GuiButton cancelAllButton; private GuiButton cancelAllButton;
@@ -45,20 +51,26 @@ public class GuiCraftingMonitor extends GuiBase {
private IElementDrawers drawers = new CraftingMonitorElementDrawers(); private IElementDrawers drawers = new CraftingMonitorElementDrawers();
private List<ICraftingMonitorElement> elements = new ArrayList<>();
private int itemSelected = -1; private int itemSelected = -1;
private int itemSelectedX = -1; private int itemSelectedX = -1;
private int itemSelectedY = -1; private int itemSelectedY = -1;
public GuiCraftingMonitor(ContainerCraftingMonitor container, ICraftingMonitor craftingMonitor) { public GuiCraftingMonitor(ContainerCraftingMonitor container, ICraftingMonitor craftingMonitor) {
super(container, 176, 230); super(container, 210, 230);
this.craftingMonitor = craftingMonitor; this.craftingMonitor = craftingMonitor;
this.scrollbar = new Scrollbar(157, 20, 12, 89); this.scrollbar = new Scrollbar(157, 20, 12, 89);
} }
private List<ICraftingMonitorElement> getElements() { private List<ICraftingMonitorElement> getElements() {
return craftingMonitor.isActive() ? ELEMENTS : Collections.emptyList(); return craftingMonitor.isActive() ? elements : Collections.emptyList();
}
public static void markForSorting() {
markedForSorting = true;
} }
@Override @Override
@@ -79,6 +91,23 @@ public class GuiCraftingMonitor extends GuiBase {
@Override @Override
public void update(int x, int y) { public void update(int x, int y) {
if (markedForSorting) {
markedForSorting = false;
List<ICraftingMonitorElement> newElements = new ArrayList<>();
for (ICraftingMonitorElement element : ELEMENTS) {
// @TODO: We need the top level element here!
ItemStack stack = null;
if (stack == null || GridFilterFilter.accepts(craftingMonitor.getFilters(), stack, Item.REGISTRY.getNameForObject(stack.getItem()).getResourceDomain())) {
newElements.add(element);
}
}
this.elements = newElements;
}
scrollbar.setEnabled(getRows() > VISIBLE_ROWS); scrollbar.setEnabled(getRows() > VISIBLE_ROWS);
scrollbar.setMaxOffset(getRows() - VISIBLE_ROWS); scrollbar.setMaxOffset(getRows() - VISIBLE_ROWS);

View File

@@ -5,6 +5,7 @@ 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 com.raoulvdberge.refinedstorage.item.filter.Filter; import com.raoulvdberge.refinedstorage.item.filter.Filter;
import com.raoulvdberge.refinedstorage.item.filter.ItemFilter; import com.raoulvdberge.refinedstorage.item.filter.ItemFilter;
import net.minecraft.item.ItemStack;
import java.util.List; import java.util.List;
import java.util.function.Predicate; import java.util.function.Predicate;
@@ -18,16 +19,24 @@ 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<Filter> filters, ItemStack stack, String stackModId) {
if (filters.isEmpty()) {
return true;
}
int lastMode = ItemFilter.MODE_WHITELIST; int lastMode = ItemFilter.MODE_WHITELIST;
for (Filter filter : filters) { for (Filter filter : filters) {
lastMode = filter.getMode(); lastMode = filter.getMode();
if (filter.isModFilter()) { if (filter.isModFilter()) {
if (filter.getStack().getItem().getRegistryName().getResourceDomain().equalsIgnoreCase(stack.getModId())) { if (filter.getStack().getItem().getRegistryName().getResourceDomain().equalsIgnoreCase(stackModId)) {
return filter.getMode() == ItemFilter.MODE_WHITELIST; return filter.getMode() == ItemFilter.MODE_WHITELIST;
} }
} else if (API.instance().getComparer().isEqual(((GridStackItem) stack).getStack(), filter.getStack(), filter.getCompare())) { } else if (API.instance().getComparer().isEqual(stack, filter.getStack(), filter.getCompare())) {
return filter.getMode() == ItemFilter.MODE_WHITELIST; return filter.getMode() == ItemFilter.MODE_WHITELIST;
} }
} }

View File

@@ -4,13 +4,14 @@ import net.minecraft.item.ItemStack;
import net.minecraftforge.items.ItemStackHandler; import net.minecraftforge.items.ItemStackHandler;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable;
public class ItemHandlerBasic extends ItemStackHandler { public class ItemHandlerBasic extends ItemStackHandler {
private IItemHandlerListener listener; private IItemHandlerListener listener;
protected IItemValidator[] validators; protected IItemValidator[] validators;
public ItemHandlerBasic(int size, IItemHandlerListener listener, IItemValidator... validators) { public ItemHandlerBasic(int size, @Nullable IItemHandlerListener listener, IItemValidator... validators) {
super(size); super(size);
this.listener = listener; this.listener = listener;

View File

@@ -1,6 +1,7 @@
package com.raoulvdberge.refinedstorage.inventory; package com.raoulvdberge.refinedstorage.inventory;
import com.raoulvdberge.refinedstorage.RSItems; import com.raoulvdberge.refinedstorage.RSItems;
import com.raoulvdberge.refinedstorage.gui.GuiCraftingMonitor;
import com.raoulvdberge.refinedstorage.gui.grid.GuiGrid; import com.raoulvdberge.refinedstorage.gui.grid.GuiGrid;
import com.raoulvdberge.refinedstorage.item.filter.Filter; import com.raoulvdberge.refinedstorage.item.filter.Filter;
import com.raoulvdberge.refinedstorage.item.filter.FilterTab; import com.raoulvdberge.refinedstorage.item.filter.FilterTab;
@@ -9,6 +10,7 @@ import net.minecraft.item.ItemStack;
import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.common.FMLCommonHandler;
import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.Side;
import javax.annotation.Nullable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -16,8 +18,8 @@ public class ItemHandlerFilter extends ItemHandlerBasic {
private List<Filter> filters; private List<Filter> filters;
private List<FilterTab> tabs; private List<FilterTab> tabs;
public ItemHandlerFilter(List<Filter> filters, List<FilterTab> tabs) { public ItemHandlerFilter(List<Filter> filters, List<FilterTab> tabs, @Nullable IItemHandlerListener listener) {
super(4, new ItemValidatorBasic(RSItems.FILTER)); super(4, listener, new ItemValidatorBasic(RSItems.FILTER));
this.filters = filters; this.filters = filters;
this.tabs = tabs; this.tabs = tabs;
@@ -60,6 +62,7 @@ public class ItemHandlerFilter extends ItemHandlerBasic {
if (FMLCommonHandler.instance().getSide() == Side.CLIENT) { if (FMLCommonHandler.instance().getSide() == Side.CLIENT) {
GuiGrid.markForSorting(); GuiGrid.markForSorting();
GuiCraftingMonitor.markForSorting();
} }
} }
} }

View File

@@ -50,6 +50,7 @@ public class MessageCraftingMonitorElements implements IMessage, IMessageHandler
@Override @Override
public IMessage onMessage(MessageCraftingMonitorElements message, MessageContext ctx) { public IMessage onMessage(MessageCraftingMonitorElements message, MessageContext ctx) {
GuiCraftingMonitor.ELEMENTS = message.elements; GuiCraftingMonitor.ELEMENTS = message.elements;
GuiCraftingMonitor.markForSorting();
return null; return null;
} }

View File

@@ -1,10 +1,13 @@
package com.raoulvdberge.refinedstorage.tile.craftingmonitor; package com.raoulvdberge.refinedstorage.tile.craftingmonitor;
import com.raoulvdberge.refinedstorage.inventory.ItemHandlerBasic;
import com.raoulvdberge.refinedstorage.item.filter.Filter;
import com.raoulvdberge.refinedstorage.tile.data.TileDataParameter; import com.raoulvdberge.refinedstorage.tile.data.TileDataParameter;
import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.List;
public interface ICraftingMonitor { public interface ICraftingMonitor {
String getGuiTitle(); String getGuiTitle();
@@ -16,5 +19,9 @@ public interface ICraftingMonitor {
@Nullable @Nullable
BlockPos getNetworkPosition(); BlockPos getNetworkPosition();
List<Filter> getFilters();
ItemHandlerBasic getFilter();
boolean isActive(); boolean isActive();
} }

View File

@@ -1,22 +1,52 @@
package com.raoulvdberge.refinedstorage.tile.craftingmonitor; package com.raoulvdberge.refinedstorage.tile.craftingmonitor;
import com.raoulvdberge.refinedstorage.RSUtils;
import com.raoulvdberge.refinedstorage.inventory.ItemHandlerBasic;
import com.raoulvdberge.refinedstorage.inventory.ItemHandlerFilter;
import com.raoulvdberge.refinedstorage.item.ItemWirelessCraftingMonitor; import com.raoulvdberge.refinedstorage.item.ItemWirelessCraftingMonitor;
import com.raoulvdberge.refinedstorage.item.filter.Filter;
import com.raoulvdberge.refinedstorage.tile.TileController; import com.raoulvdberge.refinedstorage.tile.TileController;
import com.raoulvdberge.refinedstorage.tile.data.TileDataParameter; import com.raoulvdberge.refinedstorage.tile.data.TileDataParameter;
import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.common.DimensionManager; import net.minecraftforge.common.DimensionManager;
import java.util.ArrayList;
import java.util.List;
public class WirelessCraftingMonitor implements ICraftingMonitor { public class WirelessCraftingMonitor implements ICraftingMonitor {
private ItemStack stack;
private int controllerDimension; private int controllerDimension;
private BlockPos controller; private BlockPos controller;
private List<Filter> filters = new ArrayList<>();
private ItemHandlerFilter filter = new ItemHandlerFilter(filters, new ArrayList<>(), null) {
@Override
protected void onContentsChanged(int slot) {
super.onContentsChanged(slot);
if (!stack.hasTagCompound()) {
stack.setTagCompound(new NBTTagCompound());
}
RSUtils.writeItems(this, slot, stack.getTagCompound());
}
};
public WirelessCraftingMonitor(int controllerDimension, ItemStack stack) { public WirelessCraftingMonitor(int controllerDimension, ItemStack stack) {
this.stack = stack;
this.controllerDimension = controllerDimension; this.controllerDimension = controllerDimension;
this.controller = new BlockPos(ItemWirelessCraftingMonitor.getX(stack), ItemWirelessCraftingMonitor.getY(stack), ItemWirelessCraftingMonitor.getZ(stack)); this.controller = new BlockPos(ItemWirelessCraftingMonitor.getX(stack), ItemWirelessCraftingMonitor.getY(stack), ItemWirelessCraftingMonitor.getZ(stack));
if (stack.hasTagCompound()) {
for (int i = 0; i < 4; ++i) {
RSUtils.readItems(filter, i, stack.getTagCompound());
}
}
} }
@Override @Override
@@ -43,6 +73,16 @@ public class WirelessCraftingMonitor implements ICraftingMonitor {
return controller; return controller;
} }
@Override
public List<Filter> getFilters() {
return filters;
}
@Override
public ItemHandlerBasic getFilter() {
return filter;
}
private TileController getController() { private TileController getController() {
World world = DimensionManager.getWorld(controllerDimension); World world = DimensionManager.getWorld(controllerDimension);

View File

@@ -42,7 +42,7 @@ public class WirelessGrid implements IGrid {
private List<Filter> filters = new ArrayList<>(); private List<Filter> filters = new ArrayList<>();
private List<FilterTab> tabs = new ArrayList<>(); private List<FilterTab> tabs = new ArrayList<>();
private ItemHandlerFilter filter = new ItemHandlerFilter(filters, tabs) { private ItemHandlerFilter filter = new ItemHandlerFilter(filters, tabs, null) {
@Override @Override
protected void onContentsChanged(int slot) { protected void onContentsChanged(int slot) {
super.onContentsChanged(slot); super.onContentsChanged(slot);