diff --git a/CHANGELOG.md b/CHANGELOG.md index 651e09c71..b8fe2c86d 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ### 1.4.2 - Implemented support for the Forge update JSON system (raoulvdberge) - Added integration for MCMultiPart, this is an optional dependency (raoulvdberge) +- You can now specify more items to export, import, filter, etc by inserting the Filter item (raoulvdberge) - Fixed a crash with the Constructor (raoulvdberge) - Fixed Crafting Pattern model (pauljoda) - Fixed Quartz Enriched Iron and the block form of it not having an oredictionary entry (raoulvdberge) diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeExporter.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeExporter.java index 625295ff7..fa75c88fa 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeExporter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeExporter.java @@ -1,6 +1,7 @@ package com.raoulvdberge.refinedstorage.apiimpl.network.node; import com.raoulvdberge.refinedstorage.RS; +import com.raoulvdberge.refinedstorage.RSItems; import com.raoulvdberge.refinedstorage.RSUtils; import com.raoulvdberge.refinedstorage.api.autocrafting.task.ICraftingTask; import com.raoulvdberge.refinedstorage.api.util.IComparer; @@ -12,6 +13,7 @@ import com.raoulvdberge.refinedstorage.inventory.ItemHandlerFluid; import com.raoulvdberge.refinedstorage.inventory.ItemHandlerListenerNetworkNode; import com.raoulvdberge.refinedstorage.inventory.ItemHandlerUpgrade; import com.raoulvdberge.refinedstorage.item.ItemUpgrade; +import com.raoulvdberge.refinedstorage.item.filter.ItemFilter; import com.raoulvdberge.refinedstorage.tile.TileExporter; import com.raoulvdberge.refinedstorage.tile.config.IComparable; import com.raoulvdberge.refinedstorage.tile.config.IType; @@ -65,77 +67,15 @@ public class NetworkNodeExporter extends NetworkNode implements IComparable, ITy for (int i = 0; i < itemFilters.getSlots(); ++i) { ItemStack slot = itemFilters.getStackInSlot(i); - if (slot.isEmpty()) { - continue; - } - - if (craftOnly) { - if (craftOnlyTask[i] == null) { - craftOnlyTask[i] = network.getCraftingManager().schedule(slot, 1, compare); - - if (craftOnlyTask[i] != null) { - craftOnlyToExtract[i] = craftOnlyTask[i].getPattern().getQuantityPerRequest(slot, compare); - } - } else if (craftOnlyTask[i].isFinished() && craftOnlyTask[i].getMissing().isEmpty()) { - ItemStack took = network.extractItem(slot, 1, compare, true); - - if (took != null && ItemHandlerHelper.insertItem(handler, took, true).isEmpty()) { - took = network.extractItem(slot, 1, compare, false); - - ItemHandlerHelper.insertItem(handler, took, false); - - craftOnlyToExtract[i]--; - - if (craftOnlyToExtract[i] <= 0) { - craftOnlyToExtract[i] = null; - craftOnlyTask[i] = null; + if (!slot.isEmpty()) { + if (slot.getItem() == RSItems.FILTER) { + for (ItemStack slotInFilter : ItemFilter.getFilterItemsFromCache(slot)) { + if (!slotInFilter.isEmpty()) { + doExport(handler, -1, slotInFilter); } } - } else if (!network.getCraftingManager().getTasks().contains(craftOnlyTask[i])) { - craftOnlyTask[i] = null; - } - } else { - int stackSize = upgrades.getItemInteractCount(); - - boolean skipSlot = false; - - if (regulator) { - for (int index = 0; index < handler.getSlots(); index++) { - ItemStack exporterStack = handler.getStackInSlot(index); - - if (API.instance().getComparer().isEqual(slot, exporterStack, compare)) { - if (exporterStack.getCount() >= slot.getCount()) { - skipSlot = true; - break; - } else { - stackSize = upgrades.hasUpgrade(ItemUpgrade.TYPE_STACK) ? slot.getCount() - exporterStack.getCount() : 1; - } - } - } - } - - if (skipSlot) { - continue; - } - - ItemStack took = network.extractItem(slot, Math.min(slot.getMaxStackSize(), stackSize), compare, true); - - if (took == null) { - if (upgrades.hasUpgrade(ItemUpgrade.TYPE_CRAFTING)) { - network.getCraftingManager().schedule(slot, 1, compare); - } } else { - if (IntegrationCyclopsCore.isLoaded() - && SlotlessItemHandlerHelper.isSlotless(getFacingTile(), holder.getDirection().getOpposite()) - && SlotlessItemHandlerHelper.insertItem(getFacingTile(), holder.getDirection().getOpposite(), took, true).isEmpty()) { - took = network.extractItem(slot, upgrades.getItemInteractCount(), compare, false); - - SlotlessItemHandlerHelper.insertItem(getFacingTile(), holder.getDirection().getOpposite(), took, false); - } else if (ItemHandlerHelper.insertItem(handler, took, true).isEmpty()) { - took = network.extractItem(slot, upgrades.getItemInteractCount(), compare, false); - - ItemHandlerHelper.insertItem(handler, took, false); - } + doExport(handler, i, slot); } } } @@ -195,6 +135,71 @@ public class NetworkNodeExporter extends NetworkNode implements IComparable, ITy } } + private void doExport(IItemHandler handler, int i, ItemStack slot) { + if (craftOnly && i >= 0) { + if (craftOnlyTask[i] == null) { + craftOnlyTask[i] = network.getCraftingManager().schedule(slot, 1, compare); + + if (craftOnlyTask[i] != null) { + craftOnlyToExtract[i] = craftOnlyTask[i].getPattern().getQuantityPerRequest(slot, compare); + } + } else if (craftOnlyTask[i].isFinished() && craftOnlyTask[i].getMissing().isEmpty()) { + ItemStack took = network.extractItem(slot, 1, compare, true); + + if (took != null && ItemHandlerHelper.insertItem(handler, took, true).isEmpty()) { + took = network.extractItem(slot, 1, compare, false); + + ItemHandlerHelper.insertItem(handler, took, false); + + craftOnlyToExtract[i]--; + + if (craftOnlyToExtract[i] <= 0) { + craftOnlyToExtract[i] = null; + craftOnlyTask[i] = null; + } + } + } else if (!network.getCraftingManager().getTasks().contains(craftOnlyTask[i])) { + craftOnlyTask[i] = null; + } + } else { + int stackSize = upgrades.getItemInteractCount(); + + if (regulator) { + for (int index = 0; index < handler.getSlots(); index++) { + ItemStack exporterStack = handler.getStackInSlot(index); + + if (API.instance().getComparer().isEqual(slot, exporterStack, compare)) { + if (exporterStack.getCount() >= slot.getCount()) { + return; + } else { + stackSize = upgrades.hasUpgrade(ItemUpgrade.TYPE_STACK) ? slot.getCount() - exporterStack.getCount() : 1; + } + } + } + } + + ItemStack took = network.extractItem(slot, Math.min(slot.getMaxStackSize(), stackSize), compare, true); + + if (took == null) { + if (upgrades.hasUpgrade(ItemUpgrade.TYPE_CRAFTING)) { + network.getCraftingManager().schedule(slot, 1, compare); + } + } else { + if (IntegrationCyclopsCore.isLoaded() + && SlotlessItemHandlerHelper.isSlotless(getFacingTile(), holder.getDirection().getOpposite()) + && SlotlessItemHandlerHelper.insertItem(getFacingTile(), holder.getDirection().getOpposite(), took, true).isEmpty()) { + took = network.extractItem(slot, upgrades.getItemInteractCount(), compare, false); + + SlotlessItemHandlerHelper.insertItem(getFacingTile(), holder.getDirection().getOpposite(), took, false); + } else if (ItemHandlerHelper.insertItem(handler, took, true).isEmpty()) { + took = network.extractItem(slot, upgrades.getItemInteractCount(), compare, false); + + ItemHandlerHelper.insertItem(handler, took, false); + } + } + } + } + @Override public int getCompare() { return compare; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/item/filter/ItemFilter.java b/src/main/java/com/raoulvdberge/refinedstorage/item/filter/ItemFilter.java index c4428890c..12e75c0f9 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/item/filter/ItemFilter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/item/filter/ItemFilter.java @@ -14,10 +14,13 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.ActionResult; import net.minecraft.util.EnumActionResult; import net.minecraft.util.EnumHand; +import net.minecraft.util.NonNullList; import net.minecraft.util.text.TextFormatting; import net.minecraft.world.World; +import java.util.HashMap; import java.util.List; +import java.util.Map; public class ItemFilter extends ItemBase { public static final int MODE_WHITELIST = 0; @@ -29,12 +32,24 @@ public class ItemFilter extends ItemBase { private static final String NBT_NAME = "Name"; private static final String NBT_ICON = "Icon"; + private static Map> FILTER_CACHE = new HashMap<>(); + public ItemFilter() { super("filter"); setMaxStackSize(1); } + public static NonNullList getFilterItemsFromCache(ItemStack stack) { + if (!FILTER_CACHE.containsKey(stack)) { + ItemHandlerFilterItems items = new ItemHandlerFilterItems(stack); + + FILTER_CACHE.put(stack, items.getFilteredItems()); + } + + return FILTER_CACHE.get(stack); + } + @Override public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand) { ItemStack stack = player.getHeldItem(hand); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/config/IFilterable.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/config/IFilterable.java index 606d18225..70349b8aa 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/config/IFilterable.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/config/IFilterable.java @@ -1,8 +1,10 @@ package com.raoulvdberge.refinedstorage.tile.config; +import com.raoulvdberge.refinedstorage.RSItems; import com.raoulvdberge.refinedstorage.api.network.node.INetworkNodeProxy; import com.raoulvdberge.refinedstorage.apiimpl.API; import com.raoulvdberge.refinedstorage.inventory.ItemHandlerFluid; +import com.raoulvdberge.refinedstorage.item.filter.ItemFilter; import com.raoulvdberge.refinedstorage.tile.data.ITileDataConsumer; import com.raoulvdberge.refinedstorage.tile.data.ITileDataProducer; import com.raoulvdberge.refinedstorage.tile.data.TileDataParameter; @@ -42,7 +44,13 @@ public interface IFilterable { if (!slot.isEmpty()) { slots++; - if (API.instance().getComparer().isEqual(slot, stack, compare)) { + if (slot.getItem() == RSItems.FILTER) { + for (ItemStack slotInFilter : ItemFilter.getFilterItemsFromCache(slot)) { + if (!slotInFilter.isEmpty() && API.instance().getComparer().isEqual(slotInFilter, stack, compare)) { + return true; + } + } + } else if (API.instance().getComparer().isEqual(slot, stack, compare)) { return true; } } @@ -53,8 +61,16 @@ public interface IFilterable { for (int i = 0; i < filters.getSlots(); ++i) { ItemStack slot = filters.getStackInSlot(i); - if (!slot.isEmpty() && API.instance().getComparer().isEqual(slot, stack, compare)) { - return false; + if (!slot.isEmpty()) { + if (slot.getItem() == RSItems.FILTER) { + for (ItemStack slotInFilter : ItemFilter.getFilterItemsFromCache(slot)) { + if (!slotInFilter.isEmpty() && API.instance().getComparer().isEqual(slotInFilter, stack, compare)) { + return false; + } + } + } else if (API.instance().getComparer().isEqual(slot, stack, compare)) { + return false; + } } }