You can now specify more items to export, import, filter, etc by inserting the Filter item, fixes #973
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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<ItemStack, NonNullList<ItemStack>> FILTER_CACHE = new HashMap<>();
|
||||
|
||||
public ItemFilter() {
|
||||
super("filter");
|
||||
|
||||
setMaxStackSize(1);
|
||||
}
|
||||
|
||||
public static NonNullList<ItemStack> 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<ItemStack> onItemRightClick(World world, EntityPlayer player, EnumHand hand) {
|
||||
ItemStack stack = player.getHeldItem(hand);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user