diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeCraftingMonitor.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeCraftingMonitor.java index 56a5f9048..cd267da28 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeCraftingMonitor.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeCraftingMonitor.java @@ -1,18 +1,29 @@ package com.raoulvdberge.refinedstorage.apiimpl.network.node; 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.TileCraftingMonitor; import com.raoulvdberge.refinedstorage.tile.data.TileDataParameter; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.math.BlockPos; +import net.minecraftforge.items.IItemHandler; import javax.annotation.Nullable; +import java.util.ArrayList; +import java.util.List; public class NetworkNodeCraftingMonitor extends NetworkNode implements ICraftingMonitor { public static final String ID = "crafting_monitor"; + private List filters = new ArrayList<>(); + private ItemHandlerFilter filter = new ItemHandlerFilter(filters, new ArrayList<>(), new ItemHandlerListenerNetworkNode(this)); + public NetworkNodeCraftingMonitor(INetworkNodeHolder holder) { super(holder); } @@ -55,9 +66,39 @@ public class NetworkNodeCraftingMonitor extends NetworkNode implements ICrafting return network != null ? network.getPosition() : null; } + @Override + public List getFilters() { + return filters; + } + public void onOpened(EntityPlayer player) { if (network != null) { 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; + } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeGrid.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeGrid.java index b8c73fdcf..085d2d800 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeGrid.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeGrid.java @@ -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 List filters = new ArrayList<>(); private List tabs = new ArrayList<>(); - private ItemHandlerFilter filter = new ItemHandlerFilter(filters, tabs); + private ItemHandlerFilter filter = new ItemHandlerFilter(filters, tabs, new ItemHandlerListenerNetworkNode(this)); private EnumGridType type; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerCraftingMonitor.java b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerCraftingMonitor.java index 453184815..690bfb2a4 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerCraftingMonitor.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerCraftingMonitor.java @@ -3,6 +3,7 @@ package com.raoulvdberge.refinedstorage.container; import com.raoulvdberge.refinedstorage.tile.craftingmonitor.ICraftingMonitor; import com.raoulvdberge.refinedstorage.tile.craftingmonitor.TileCraftingMonitor; import net.minecraft.entity.player.EntityPlayer; +import net.minecraftforge.items.SlotItemHandler; public class ContainerCraftingMonitor extends ContainerBase { private ICraftingMonitor craftingMonitor; @@ -13,6 +14,10 @@ public class ContainerCraftingMonitor extends ContainerBase { this.craftingMonitor = craftingMonitor; addPlayerInventory(8, 148); + + for (int i = 0; i < 4; ++i) { + addSlotToContainer(new SlotItemHandler(craftingMonitor.getFilter(), i, 187, 6 + (18 * i))); + } } public ICraftingMonitor getCraftingMonitor() { diff --git a/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiCraftingMonitor.java b/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiCraftingMonitor.java index dc2e70473..1c6e03104 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiCraftingMonitor.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiCraftingMonitor.java @@ -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.IElementDrawers; 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.network.MessageCraftingMonitorCancel; 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.RenderHelper; import net.minecraft.client.resources.I18n; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; import java.io.IOException; +import java.util.ArrayList; import java.util.Collections; 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_HEIGHT = 18; + private static boolean markedForSorting; + private GuiButton cancelButton; private GuiButton cancelAllButton; @@ -45,20 +51,26 @@ public class GuiCraftingMonitor extends GuiBase { private IElementDrawers drawers = new CraftingMonitorElementDrawers(); + private List elements = new ArrayList<>(); + private int itemSelected = -1; private int itemSelectedX = -1; private int itemSelectedY = -1; public GuiCraftingMonitor(ContainerCraftingMonitor container, ICraftingMonitor craftingMonitor) { - super(container, 176, 230); + super(container, 210, 230); this.craftingMonitor = craftingMonitor; this.scrollbar = new Scrollbar(157, 20, 12, 89); } private List getElements() { - return craftingMonitor.isActive() ? ELEMENTS : Collections.emptyList(); + return craftingMonitor.isActive() ? elements : Collections.emptyList(); + } + + public static void markForSorting() { + markedForSorting = true; } @Override @@ -79,6 +91,23 @@ public class GuiCraftingMonitor extends GuiBase { @Override public void update(int x, int y) { + if (markedForSorting) { + markedForSorting = false; + + List 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.setMaxOffset(getRows() - VISIBLE_ROWS); 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 8d9d48908..1a1370e96 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 @@ -5,6 +5,7 @@ import com.raoulvdberge.refinedstorage.gui.grid.stack.GridStackItem; import com.raoulvdberge.refinedstorage.gui.grid.stack.IGridStack; import com.raoulvdberge.refinedstorage.item.filter.Filter; import com.raoulvdberge.refinedstorage.item.filter.ItemFilter; +import net.minecraft.item.ItemStack; import java.util.List; import java.util.function.Predicate; @@ -18,16 +19,24 @@ 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; + } + int lastMode = ItemFilter.MODE_WHITELIST; for (Filter filter : filters) { lastMode = filter.getMode(); 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; } - } 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; } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/inventory/ItemHandlerBasic.java b/src/main/java/com/raoulvdberge/refinedstorage/inventory/ItemHandlerBasic.java index 9d178ddda..9415aab7c 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/inventory/ItemHandlerBasic.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/inventory/ItemHandlerBasic.java @@ -4,13 +4,14 @@ import net.minecraft.item.ItemStack; import net.minecraftforge.items.ItemStackHandler; import javax.annotation.Nonnull; +import javax.annotation.Nullable; public class ItemHandlerBasic extends ItemStackHandler { private IItemHandlerListener listener; protected IItemValidator[] validators; - public ItemHandlerBasic(int size, IItemHandlerListener listener, IItemValidator... validators) { + public ItemHandlerBasic(int size, @Nullable IItemHandlerListener listener, IItemValidator... validators) { super(size); this.listener = listener; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/inventory/ItemHandlerFilter.java b/src/main/java/com/raoulvdberge/refinedstorage/inventory/ItemHandlerFilter.java index 1dd5da3f1..8bc511c37 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/inventory/ItemHandlerFilter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/inventory/ItemHandlerFilter.java @@ -1,6 +1,7 @@ package com.raoulvdberge.refinedstorage.inventory; import com.raoulvdberge.refinedstorage.RSItems; +import com.raoulvdberge.refinedstorage.gui.GuiCraftingMonitor; import com.raoulvdberge.refinedstorage.gui.grid.GuiGrid; import com.raoulvdberge.refinedstorage.item.filter.Filter; 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.relauncher.Side; +import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; @@ -16,8 +18,8 @@ public class ItemHandlerFilter extends ItemHandlerBasic { private List filters; private List tabs; - public ItemHandlerFilter(List filters, List tabs) { - super(4, new ItemValidatorBasic(RSItems.FILTER)); + public ItemHandlerFilter(List filters, List tabs, @Nullable IItemHandlerListener listener) { + super(4, listener, new ItemValidatorBasic(RSItems.FILTER)); this.filters = filters; this.tabs = tabs; @@ -60,6 +62,7 @@ public class ItemHandlerFilter extends ItemHandlerBasic { if (FMLCommonHandler.instance().getSide() == Side.CLIENT) { GuiGrid.markForSorting(); + GuiCraftingMonitor.markForSorting(); } } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/network/MessageCraftingMonitorElements.java b/src/main/java/com/raoulvdberge/refinedstorage/network/MessageCraftingMonitorElements.java index e6559e8f4..ebfcac29c 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/network/MessageCraftingMonitorElements.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/network/MessageCraftingMonitorElements.java @@ -50,6 +50,7 @@ public class MessageCraftingMonitorElements implements IMessage, IMessageHandler @Override public IMessage onMessage(MessageCraftingMonitorElements message, MessageContext ctx) { GuiCraftingMonitor.ELEMENTS = message.elements; + GuiCraftingMonitor.markForSorting(); return null; } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/craftingmonitor/ICraftingMonitor.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/craftingmonitor/ICraftingMonitor.java index bbcc69513..91becb6ea 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/craftingmonitor/ICraftingMonitor.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/craftingmonitor/ICraftingMonitor.java @@ -1,10 +1,13 @@ 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 net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.util.math.BlockPos; import javax.annotation.Nullable; +import java.util.List; public interface ICraftingMonitor { String getGuiTitle(); @@ -16,5 +19,9 @@ public interface ICraftingMonitor { @Nullable BlockPos getNetworkPosition(); + List getFilters(); + + ItemHandlerBasic getFilter(); + boolean isActive(); } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/craftingmonitor/WirelessCraftingMonitor.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/craftingmonitor/WirelessCraftingMonitor.java index 0d87bfbf0..bd765f9e3 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/craftingmonitor/WirelessCraftingMonitor.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/craftingmonitor/WirelessCraftingMonitor.java @@ -1,22 +1,52 @@ 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.filter.Filter; import com.raoulvdberge.refinedstorage.tile.TileController; import com.raoulvdberge.refinedstorage.tile.data.TileDataParameter; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.common.DimensionManager; +import java.util.ArrayList; +import java.util.List; + public class WirelessCraftingMonitor implements ICraftingMonitor { + private ItemStack stack; private int controllerDimension; private BlockPos controller; + private List 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) { + this.stack = stack; this.controllerDimension = controllerDimension; 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 @@ -43,6 +73,16 @@ public class WirelessCraftingMonitor implements ICraftingMonitor { return controller; } + @Override + public List getFilters() { + return filters; + } + + @Override + public ItemHandlerBasic getFilter() { + return filter; + } + private TileController getController() { World world = DimensionManager.getWorld(controllerDimension); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/WirelessGrid.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/WirelessGrid.java index 4327b032b..3e039dc45 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/WirelessGrid.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/WirelessGrid.java @@ -42,7 +42,7 @@ public class WirelessGrid implements IGrid { private List filters = new ArrayList<>(); private List tabs = new ArrayList<>(); - private ItemHandlerFilter filter = new ItemHandlerFilter(filters, tabs) { + private ItemHandlerFilter filter = new ItemHandlerFilter(filters, tabs, null) { @Override protected void onContentsChanged(int slot) { super.onContentsChanged(slot);