You can now specify more items to export, import, filter, etc by inserting the Filter item, fixes #973

This commit is contained in:
raoulvdberge
2017-03-11 22:23:44 +01:00
parent 156dab9bd3
commit 08a79b1198
4 changed files with 108 additions and 71 deletions

View File

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

View File

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

View File

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

View File

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