diff --git a/CHANGELOG.md b/CHANGELOG.md index 96ed1e354..434d152de 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,10 +5,6 @@ - Added Crafting Upgrade support for fluids on the Exporter, Constructor and Fluid Interface (raoulvdberge) - Added support for JEI ghost slot dragging (raoulvdberge) - Added config option to hide covers in the creative mode tabs and JEI (raoulvdberge) -- Added the ability to connect the External Storage to (Fluid) Interfaces of other networks, allowing subnetting (raoulvdberge) -- The External Storage no longer lets a network connection through through its front face, to allow for subnetting (raoulvdberge) -- An empty Interface now exposes the entire item storage again (raoulvdberge) -- An empty Fluid Interface now exposes the entire fluid storage (raoulvdberge) - Removed "emit signal when item is being autocrafted" option in the Detector (raoulvdberge) - The Crafting Card no longer schedules requests when there are items or fluids missing (raoulvdberge) - You can now keep fluids in stock by attaching a External Storage in fluid mode to a Fluid Interface with a Crafting Upgrade (raoulvdberge) diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/storage/IStorageCache.java b/src/main/java/com/raoulvdberge/refinedstorage/api/storage/IStorageCache.java index 394973a16..c9d568f94 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/storage/IStorageCache.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/storage/IStorageCache.java @@ -25,7 +25,7 @@ public interface IStorageCache { * Adds a stack to the cache. *

* Note that this doesn't modify any of the connected storages, but just modifies the cache. - * Use {@link IStorage#insert(T, int, com.raoulvdberge.refinedstorage.api.util.Action)} to add a stack to an actual storage. + * Use {@link IStorage#insert(T, int, boolean)} to add a stack to an actual storage. *

* Will merge it with another stack if it already exists. * @@ -40,7 +40,7 @@ public interface IStorageCache { * Removes a stack from the cache. *

* Note that this doesn't modify any of the connected storages, but just modifies the cache. - * Use {@link IStorage#extract(T, int, int, com.raoulvdberge.refinedstorage.api.util.Action)} to remove a stack from an actual storage. + * Use {@link IStorage#extract(T, int, int, boolean)} to remove a stack from an actual storage. * * @param stack the stack to remove, do NOT modify * @param size the size to remove diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/util/IStackList.java b/src/main/java/com/raoulvdberge/refinedstorage/api/util/IStackList.java index 7fe8f25ef..15071d0a9 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/util/IStackList.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/util/IStackList.java @@ -2,7 +2,7 @@ package com.raoulvdberge.refinedstorage.api.util; import javax.annotation.Nonnull; import javax.annotation.Nullable; -import java.util.List; +import java.util.Collection; /** * A stack list. @@ -21,7 +21,9 @@ public interface IStackList { * * @param stack the stack */ - void add(@Nonnull T stack); + default void add(@Nonnull T stack) { + add(stack, getSizeFromStack(stack)); + } /** * Decrements the count of that stack in the list. @@ -38,7 +40,9 @@ public interface IStackList { * @param stack the stack * @return true if the remove was successful for the full amount, false otherwise */ - boolean remove(@Nonnull T stack); + default boolean remove(@Nonnull T stack) { + return remove(stack, getSizeFromStack(stack)); + } /** * Returns a stack. @@ -81,10 +85,16 @@ public interface IStackList { boolean isEmpty(); /** - * @return a list of stacks in this list + * @param stack the stack + * @return the size of the stack + */ + int getSizeFromStack(T stack); + + /** + * @return a collection of stacks in this list */ @Nonnull - List getStacks(); + Collection getStacks(); /** * @return a new copy of this list, with the stacks in it copied as well diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNode.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNode.java index 694562a2c..b8ae342b0 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNode.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNode.java @@ -214,20 +214,7 @@ public abstract class NetworkNode implements INetworkNode, INetworkNodeVisitor { return world; } - public boolean canConductThroughFace() { - return true; - } - public boolean canConduct(@Nullable EnumFacing direction) { - if (direction == getDirection() && !canConductThroughFace()) { - return false; - } - - INetworkNode faceNode = API.instance().getNetworkNodeManager(world).getNode(pos.offset(direction)); - if (faceNode instanceof NetworkNode && !((NetworkNode) faceNode).canConductThroughFace() && direction == ((NetworkNode) faceNode).getDirection().getOpposite()) { - return false; - } - return true; } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeCable.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeCable.java index 703614064..5ed76f2a0 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeCable.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeCable.java @@ -39,7 +39,7 @@ public class NetworkNodeCable extends NetworkNode implements ICoverable { @Override public boolean canConduct(@Nullable EnumFacing direction) { - return coverManager.canConduct(direction) && super.canConduct(direction); + return coverManager.canConduct(direction); } @Override diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeConstructor.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeConstructor.java index 0d1359da4..95b1ff00d 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeConstructor.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeConstructor.java @@ -354,7 +354,7 @@ public class NetworkNodeConstructor extends NetworkNode implements IComparable, @Override public boolean canConduct(@Nullable EnumFacing direction) { - return coverManager.canConduct(direction) && super.canConduct(direction); + return coverManager.canConduct(direction); } @Override diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeDestructor.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeDestructor.java index e5501f36f..0b1a27fe7 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeDestructor.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeDestructor.java @@ -330,7 +330,7 @@ public class NetworkNodeDestructor extends NetworkNode implements IComparable, I @Override public boolean canConduct(@Nullable EnumFacing direction) { - return coverManager.canConduct(direction) && super.canConduct(direction); + return coverManager.canConduct(direction); } public boolean isPickupItem() { 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 35ba6a4ed..1836b1acc 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 @@ -258,7 +258,7 @@ public class NetworkNodeExporter extends NetworkNode implements IComparable, ITy @Override public boolean canConduct(@Nullable EnumFacing direction) { - return coverManager.canConduct(direction) && super.canConduct(direction); + return coverManager.canConduct(direction); } @Override diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeExternalStorage.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeExternalStorage.java index 6d1461ad4..91b3252c0 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeExternalStorage.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeExternalStorage.java @@ -366,12 +366,7 @@ public class NetworkNodeExternalStorage extends NetworkNode implements IStorageP @Override public boolean canConduct(@Nullable EnumFacing direction) { - return coverManager.canConduct(direction) && super.canConduct(direction); - } - - @Override - public boolean canConductThroughFace() { - return false; + return coverManager.canConduct(direction); } @Nullable diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeFluidInterface.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeFluidInterface.java index e4a6a14d7..f37f9582d 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeFluidInterface.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeFluidInterface.java @@ -7,7 +7,6 @@ import com.raoulvdberge.refinedstorage.api.util.IComparer; import com.raoulvdberge.refinedstorage.apiimpl.API; import com.raoulvdberge.refinedstorage.apiimpl.storage.externalstorage.StorageExternalFluid; import com.raoulvdberge.refinedstorage.inventory.fluid.FluidHandlerFluidInterface; -import com.raoulvdberge.refinedstorage.inventory.fluid.FluidHandlerProxy; import com.raoulvdberge.refinedstorage.inventory.fluid.FluidInventory; import com.raoulvdberge.refinedstorage.inventory.item.ItemHandlerBase; import com.raoulvdberge.refinedstorage.inventory.item.ItemHandlerUpgrade; @@ -24,7 +23,6 @@ import net.minecraft.world.World; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidTank; -import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.wrapper.CombinedInvWrapper; import org.apache.commons.lang3.tuple.Pair; @@ -52,8 +50,7 @@ public class NetworkNodeFluidInterface extends NetworkNode { }; private FluidTank tankOut = new FluidTank(TANK_CAPACITY); - private FluidHandlerProxy tank = new FluidHandlerProxy(tankIn, tankOut); - private FluidHandlerFluidInterface fluids = new FluidHandlerFluidInterface(this); + private FluidHandlerFluidInterface tank = new FluidHandlerFluidInterface(tankIn, tankOut); private ItemHandlerBase in = new ItemHandlerBase(1, new ListenerNetworkNode(this), stack -> StackUtils.getFluid(stack, true).getRight() != null); private FluidInventory out = new FluidInventory(1, TANK_CAPACITY, new ListenerNetworkNode(this)); @@ -248,8 +245,8 @@ public class NetworkNodeFluidInterface extends NetworkNode { return out; } - public IFluidHandler getTank() { - return out.getFluid(0) == null ? fluids : tank; + public FluidHandlerFluidInterface getTank() { + return tank; } public FluidTank getTankIn() { diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeImporter.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeImporter.java index 19149de7f..8ce19d8e6 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeImporter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeImporter.java @@ -231,7 +231,7 @@ public class NetworkNodeImporter extends NetworkNode implements IComparable, IFi @Override public boolean canConduct(@Nullable EnumFacing direction) { - return coverManager.canConduct(direction) && super.canConduct(direction); + return coverManager.canConduct(direction); } @Override diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeInterface.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeInterface.java index f4088486d..1472d162b 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeInterface.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeInterface.java @@ -7,7 +7,6 @@ import com.raoulvdberge.refinedstorage.api.util.IComparer; import com.raoulvdberge.refinedstorage.apiimpl.API; import com.raoulvdberge.refinedstorage.apiimpl.storage.externalstorage.StorageExternalItem; import com.raoulvdberge.refinedstorage.inventory.item.ItemHandlerBase; -import com.raoulvdberge.refinedstorage.inventory.item.ItemHandlerInterface; import com.raoulvdberge.refinedstorage.inventory.item.ItemHandlerProxy; import com.raoulvdberge.refinedstorage.inventory.item.ItemHandlerUpgrade; import com.raoulvdberge.refinedstorage.inventory.listener.ListenerNetworkNode; @@ -35,8 +34,6 @@ public class NetworkNodeInterface extends NetworkNode implements IComparable { private IItemHandler items = new ItemHandlerProxy(importItems, exportItems); - private ItemHandlerInterface networkItems = new ItemHandlerInterface(this); - private ItemHandlerUpgrade upgrades = new ItemHandlerUpgrade(4, new ListenerNetworkNode(this), ItemUpgrade.TYPE_SPEED, ItemUpgrade.TYPE_STACK, ItemUpgrade.TYPE_CRAFTING); private int compare = IComparer.COMPARE_NBT | IComparer.COMPARE_DAMAGE; @@ -224,7 +221,7 @@ public class NetworkNodeInterface extends NetworkNode implements IComparable { } public IItemHandler getItems() { - return exportFilterItems.isEmpty() ? networkItems : items; + return items; } public IItemHandler getUpgrades() { diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeReader.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeReader.java index 2a142f891..83cd3928a 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeReader.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeReader.java @@ -98,7 +98,7 @@ public class NetworkNodeReader extends NetworkNode implements IReader, IGuiReade @Override public boolean canConduct(@Nullable EnumFacing direction) { - return coverManager.canConduct(direction) && super.canConduct(direction); + return coverManager.canConduct(direction); } @Override diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeRelay.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeRelay.java index fcd82aba8..0d1fe302b 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeRelay.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeRelay.java @@ -39,7 +39,7 @@ public class NetworkNodeRelay extends NetworkNode { @Override public boolean canConduct(@Nullable EnumFacing direction) { - return canUpdate() && super.canConduct(direction); + return canUpdate(); } @Override diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeWriter.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeWriter.java index 8d3ce652c..691dc5372 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeWriter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeWriter.java @@ -130,7 +130,7 @@ public class NetworkNodeWriter extends NetworkNode implements IWriter, IGuiReade @Override public boolean canConduct(@Nullable EnumFacing direction) { - return coverManager.canConduct(direction) && super.canConduct(direction); + return coverManager.canConduct(direction); } @Override diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskmanipulator/NetworkNodeDiskManipulator.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskmanipulator/NetworkNodeDiskManipulator.java index 327670f4d..e889d1761 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskmanipulator/NetworkNodeDiskManipulator.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskmanipulator/NetworkNodeDiskManipulator.java @@ -232,7 +232,7 @@ public class NetworkNodeDiskManipulator extends NetworkNode implements IComparab ItemStack extracted = null; int i = 0; - if (itemFilters.isEmpty()) { + if (IFilterable.isEmpty(itemFilters)) { ItemStack toExtract = null; ArrayList networkItems = new ArrayList<>(network.getItemStorageCache().getList().getStacks()); @@ -331,7 +331,7 @@ public class NetworkNodeDiskManipulator extends NetworkNode implements IComparab FluidStack extracted = null; int i = 0; - if (fluidFilters.isEmpty()) { + if (IFilterable.isEmpty(itemFilters)) { FluidStack toExtract = null; ArrayList networkFluids = new ArrayList<>(network.getFluidStorageCache().getList().getStacks()); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/util/OneSixMigrationHelper.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/util/OneSixMigrationHelper.java index a4bda085c..6e736151b 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/util/OneSixMigrationHelper.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/util/OneSixMigrationHelper.java @@ -10,7 +10,6 @@ import com.raoulvdberge.refinedstorage.apiimpl.network.node.storage.NetworkNodeF import com.raoulvdberge.refinedstorage.apiimpl.network.node.storage.NetworkNodeStorage; import com.raoulvdberge.refinedstorage.block.enums.FluidStorageType; import com.raoulvdberge.refinedstorage.block.enums.ItemStorageType; -import com.raoulvdberge.refinedstorage.inventory.item.ItemHandlerBase; import com.raoulvdberge.refinedstorage.item.ItemPattern; import com.raoulvdberge.refinedstorage.tile.config.IFilterable; import net.minecraft.item.Item; @@ -206,10 +205,10 @@ public class OneSixMigrationHelper implements IOneSixMigrationHelper { public static void removalHook() { } - public static void migrateEmptyWhitelistToEmptyBlacklist(String version, IFilterable filterable, @Nullable ItemHandlerBase itemFilterInv) { + public static void migrateEmptyWhitelistToEmptyBlacklist(String version, IFilterable filterable, @Nullable IItemHandler itemFilterInv) { // Only migrate if we come from a version where the RS version tag stuff in NetworkNode wasn't added yet. // Otherwise, we would constantly migrate empty whitelists to empty blacklists... - if (version == null && filterable.getMode() == IFilterable.WHITELIST && (itemFilterInv == null || itemFilterInv.isEmpty())) { + if (version == null && filterable.getMode() == IFilterable.WHITELIST && IFilterable.isEmpty(itemFilterInv)) { filterable.setMode(IFilter.MODE_BLACKLIST); } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/util/StackListFluid.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/util/StackListFluid.java index 94e1b529e..ddd5bc9a9 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/util/StackListFluid.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/util/StackListFluid.java @@ -1,24 +1,24 @@ package com.raoulvdberge.refinedstorage.apiimpl.util; +import com.google.common.collect.ArrayListMultimap; import com.raoulvdberge.refinedstorage.api.util.IStackList; import com.raoulvdberge.refinedstorage.apiimpl.API; -import com.raoulvdberge.refinedstorage.util.MultiMap; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidStack; import javax.annotation.Nonnull; import javax.annotation.Nullable; -import java.util.List; +import java.util.Collection; public class StackListFluid implements IStackList { - private MultiMap stacks = new MultiMap<>(); + private ArrayListMultimap stacks = ArrayListMultimap.create(); @Override public void add(@Nonnull FluidStack stack, int size) { if (stack == null || size < 0) { throw new IllegalArgumentException("Cannot accept empty stack"); } - + for (FluidStack otherStack : stacks.get(stack.getFluid())) { if (stack.isFluidEqual(otherStack)) { if ((long) otherStack.amount + (long) size > Integer.MAX_VALUE) { @@ -36,11 +36,6 @@ public class StackListFluid implements IStackList { stacks.put(stack.getFluid(), newStack); } - @Override - public void add(@Nonnull FluidStack stack) { - add(stack, stack.amount); - } - @Override public boolean remove(@Nonnull FluidStack stack, int size) { for (FluidStack otherStack : stacks.get(stack.getFluid())) { @@ -60,11 +55,6 @@ public class StackListFluid implements IStackList { return false; } - @Override - public boolean remove(@Nonnull FluidStack stack) { - return remove(stack, stack.amount); - } - @Override @Nullable public FluidStack get(@Nonnull FluidStack stack, int flags) { @@ -99,9 +89,14 @@ public class StackListFluid implements IStackList { return stacks.isEmpty(); } + @Override + public int getSizeFromStack(FluidStack stack) { + return stack.amount; + } + @Nonnull @Override - public List getStacks() { + public Collection getStacks() { return stacks.values(); } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/util/StackListItem.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/util/StackListItem.java index d7a075298..f5733004b 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/util/StackListItem.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/util/StackListItem.java @@ -1,18 +1,18 @@ package com.raoulvdberge.refinedstorage.apiimpl.util; +import com.google.common.collect.ArrayListMultimap; import com.raoulvdberge.refinedstorage.api.util.IStackList; import com.raoulvdberge.refinedstorage.apiimpl.API; -import com.raoulvdberge.refinedstorage.util.MultiMap; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraftforge.items.ItemHandlerHelper; import javax.annotation.Nonnull; import javax.annotation.Nullable; -import java.util.List; +import java.util.Collection; public class StackListItem implements IStackList { - private MultiMap stacks = new MultiMap<>(); + private ArrayListMultimap stacks = ArrayListMultimap.create(); @Override public void add(@Nonnull ItemStack stack, int size) { @@ -35,11 +35,6 @@ public class StackListItem implements IStackList { stacks.put(stack.getItem(), ItemHandlerHelper.copyStackWithSize(stack, size)); } - @Override - public void add(@Nonnull ItemStack stack) { - add(stack, stack.getCount()); - } - @Override public boolean remove(@Nonnull ItemStack stack, int size) { for (ItemStack otherStack : stacks.get(stack.getItem())) { @@ -59,11 +54,6 @@ public class StackListItem implements IStackList { return false; } - @Override - public boolean remove(@Nonnull ItemStack stack) { - return remove(stack, stack.getCount()); - } - @Override @Nullable public ItemStack get(@Nonnull ItemStack stack, int flags) { @@ -98,9 +88,14 @@ public class StackListItem implements IStackList { return stacks.isEmpty(); } + @Override + public int getSizeFromStack(ItemStack stack) { + return stack.getCount(); + } + @Nonnull @Override - public List getStacks() { + public Collection getStacks() { return stacks.values(); } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/inventory/fluid/FluidHandlerFluidInterface.java b/src/main/java/com/raoulvdberge/refinedstorage/inventory/fluid/FluidHandlerFluidInterface.java index e22126be7..4b9451c81 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/inventory/fluid/FluidHandlerFluidInterface.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/inventory/fluid/FluidHandlerFluidInterface.java @@ -1,131 +1,46 @@ package com.raoulvdberge.refinedstorage.inventory.fluid; -import com.raoulvdberge.refinedstorage.api.network.INetwork; -import com.raoulvdberge.refinedstorage.api.network.node.INetworkNode; -import com.raoulvdberge.refinedstorage.api.util.Action; import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidTank; +import net.minecraftforge.fluids.capability.FluidTankPropertiesWrapper; import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.fluids.capability.IFluidTankProperties; import javax.annotation.Nullable; -import java.util.List; public class FluidHandlerFluidInterface implements IFluidHandler { - private static final IFluidTankProperties[] NO_PROPS = new IFluidTankProperties[0]; + private FluidTank input; + private FluidTank output; + private IFluidTankProperties[] properties; - private INetworkNode node; - - public FluidHandlerFluidInterface(INetworkNode node) { - this.node = node; - } - - @Nullable - private INetwork getNetwork() { - if (node.getNetwork() != null && node.canUpdate()) { - return node.getNetwork(); - } - - return null; + public FluidHandlerFluidInterface(FluidTank input, FluidTank output) { + this.input = input; + this.output = output; + this.properties = new IFluidTankProperties[]{ + new FluidTankPropertiesWrapper(input), + new FluidTankPropertiesWrapper(output) + }; } @Override public IFluidTankProperties[] getTankProperties() { - INetwork network = getNetwork(); - - if (network == null) { - return NO_PROPS; - } - - List stacks = network.getFluidStorageCache().getList().getStacks(); - - if (stacks.isEmpty()) { - return NO_PROPS; - } - - IFluidTankProperties[] props = new IFluidTankProperties[stacks.size()]; - - for (int i = 0; i < stacks.size(); ++i) { - FluidStack stack = stacks.get(i); - - props[i] = new IFluidTankProperties() { - @Nullable - @Override - public FluidStack getContents() { - return stack; - } - - @Override - public int getCapacity() { - return -1; - } - - @Override - public boolean canFill() { - return false; - } - - @Override - public boolean canDrain() { - return false; - } - - @Override - public boolean canFillFluidType(FluidStack fluidStack) { - return false; - } - - @Override - public boolean canDrainFluidType(FluidStack fluidStack) { - return false; - } - }; - } - - return props; + return properties; } @Override public int fill(FluidStack resource, boolean doFill) { - INetwork network = getNetwork(); - - if (network != null) { - FluidStack remainder = network.insertFluid(resource, resource.amount, doFill ? Action.PERFORM : Action.SIMULATE); - - return remainder == null ? resource.amount : resource.amount - remainder.amount; - } - - return 0; + return input.fill(resource, doFill); } @Nullable @Override public FluidStack drain(FluidStack resource, boolean doDrain) { - INetwork network = getNetwork(); - - if (network != null) { - return network.extractFluid(resource, resource.amount, doDrain ? Action.PERFORM : Action.SIMULATE); - } - - return null; + return output.drain(resource, doDrain); } @Nullable @Override public FluidStack drain(int maxDrain, boolean doDrain) { - INetwork network = getNetwork(); - - if (network != null) { - List fluids = network.getFluidStorageCache().getList().getStacks(); - - if (fluids.isEmpty()) { - return null; - } - - FluidStack firstFluid = fluids.get(0); - - return network.extractFluid(firstFluid, Math.min(firstFluid.amount, maxDrain), doDrain ? Action.PERFORM : Action.SIMULATE); - } - - return null; + return output.drain(maxDrain, doDrain); } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/inventory/fluid/FluidHandlerProxy.java b/src/main/java/com/raoulvdberge/refinedstorage/inventory/fluid/FluidHandlerProxy.java deleted file mode 100644 index ece085c74..000000000 --- a/src/main/java/com/raoulvdberge/refinedstorage/inventory/fluid/FluidHandlerProxy.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.raoulvdberge.refinedstorage.inventory.fluid; - -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.FluidTank; -import net.minecraftforge.fluids.capability.FluidTankPropertiesWrapper; -import net.minecraftforge.fluids.capability.IFluidHandler; -import net.minecraftforge.fluids.capability.IFluidTankProperties; - -import javax.annotation.Nullable; - -public class FluidHandlerProxy implements IFluidHandler { - private FluidTank insertHandler; - private FluidTank extractHandler; - private IFluidTankProperties[] properties; - - public FluidHandlerProxy(FluidTank insertHandler, FluidTank extractHandler) { - this.insertHandler = insertHandler; - this.extractHandler = extractHandler; - this.properties = new IFluidTankProperties[]{ - new FluidTankPropertiesWrapper(insertHandler), - new FluidTankPropertiesWrapper(extractHandler) - }; - } - - @Override - public IFluidTankProperties[] getTankProperties() { - return properties; - } - - @Override - public int fill(FluidStack resource, boolean doFill) { - return insertHandler.fill(resource, doFill); - } - - @Nullable - @Override - public FluidStack drain(FluidStack resource, boolean doDrain) { - return extractHandler.drain(resource, doDrain); - } - - @Nullable - @Override - public FluidStack drain(int maxDrain, boolean doDrain) { - return extractHandler.drain(maxDrain, doDrain); - } -} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/inventory/fluid/FluidInventory.java b/src/main/java/com/raoulvdberge/refinedstorage/inventory/fluid/FluidInventory.java index a70314c25..3e0133071 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/inventory/fluid/FluidInventory.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/inventory/fluid/FluidInventory.java @@ -11,7 +11,6 @@ public class FluidInventory { private FluidStack[] fluids; private int maxAmount; - private boolean empty = true; @Nullable private Consumer listener; @@ -57,24 +56,6 @@ public class FluidInventory { if (listener != null) { listener.accept(slot); } - - updateEmptyState(); - } - - private void updateEmptyState() { - this.empty = true; - - for (FluidStack fluid : fluids) { - if (fluid != null) { - this.empty = false; - - return; - } - } - } - - public boolean isEmpty() { - return empty; } public NBTTagCompound writeToNbt() { @@ -99,7 +80,5 @@ public class FluidInventory { fluids[i] = FluidStack.loadFluidStackFromNBT(tag.getCompoundTag(key)); } } - - updateEmptyState(); } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/inventory/item/ItemHandlerBase.java b/src/main/java/com/raoulvdberge/refinedstorage/inventory/item/ItemHandlerBase.java index 1d69bf8d9..8c9c193ba 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/inventory/item/ItemHandlerBase.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/inventory/item/ItemHandlerBase.java @@ -1,7 +1,6 @@ package com.raoulvdberge.refinedstorage.inventory.item; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.items.ItemStackHandler; import javax.annotation.Nonnull; @@ -28,6 +27,15 @@ public class ItemHandlerBase extends ItemStackHandler { this(size, null, validators); } + @Override + public void setStackInSlot(int slot, @Nonnull ItemStack stack) { + validateSlotIndex(slot); + + stacks.set(slot, stack); + + onContentsChanged(slot); + } + @Override @Nonnull public ItemStack insertItem(int slot, @Nonnull ItemStack stack, boolean simulate) { @@ -55,13 +63,6 @@ public class ItemHandlerBase extends ItemStackHandler { this.empty = stacks.stream().allMatch(ItemStack::isEmpty); } - @Override - public void deserializeNBT(NBTTagCompound tag) { - super.deserializeNBT(tag); - - this.empty = stacks.stream().allMatch(ItemStack::isEmpty); - } - public boolean isEmpty() { return empty; } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/inventory/item/ItemHandlerInterface.java b/src/main/java/com/raoulvdberge/refinedstorage/inventory/item/ItemHandlerInterface.java deleted file mode 100644 index 620f7a881..000000000 --- a/src/main/java/com/raoulvdberge/refinedstorage/inventory/item/ItemHandlerInterface.java +++ /dev/null @@ -1,88 +0,0 @@ -package com.raoulvdberge.refinedstorage.inventory.item; - -import com.raoulvdberge.refinedstorage.api.network.INetwork; -import com.raoulvdberge.refinedstorage.api.network.node.INetworkNode; -import com.raoulvdberge.refinedstorage.api.util.Action; -import com.raoulvdberge.refinedstorage.util.StackUtils; -import net.minecraft.item.ItemStack; -import net.minecraftforge.items.IItemHandler; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import java.util.List; - -public class ItemHandlerInterface implements IItemHandler { - private INetworkNode node; - - public ItemHandlerInterface(INetworkNode node) { - this.node = node; - } - - @Nullable - private INetwork getNetwork() { - if (node.getNetwork() != null && node.canUpdate()) { - return node.getNetwork(); - } - - return null; - } - - @Override - public int getSlots() { - INetwork network = getNetwork(); - - if (network != null) { - // One additional slot for possible input. - return network.getItemStorageCache().getList().getStacks().size() + 1; - } - - return 0; - } - - @Nonnull - @Override - public ItemStack getStackInSlot(int slot) { - INetwork network = getNetwork(); - - if (network != null) { - List stacks = network.getItemStorageCache().getList().getStacks(); - - if (slot < stacks.size()) { - return stacks.get(slot); - } - } - - return ItemStack.EMPTY; - } - - @Nonnull - @Override - public ItemStack insertItem(int slot, @Nonnull ItemStack stack, boolean simulate) { - INetwork network = getNetwork(); - - if (network != null) { - return StackUtils.nullToEmpty(network.insertItem(stack, stack.getCount(), simulate ? Action.SIMULATE : Action.PERFORM)); - } - - return stack; - } - - @Nonnull - @Override - public ItemStack extractItem(int slot, int amount, boolean simulate) { - INetwork network = getNetwork(); - - if (network != null) { - ItemStack stack = getStackInSlot(slot); - - return StackUtils.nullToEmpty(network.extractItem(stack, Math.min(amount, 64), simulate ? Action.SIMULATE : Action.PERFORM)); - } - - return ItemStack.EMPTY; - } - - @Override - public int getSlotLimit(int slot) { - return Integer.MAX_VALUE; - } -} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/inventory/item/ItemHandlerPortableGrid.java b/src/main/java/com/raoulvdberge/refinedstorage/inventory/item/ItemHandlerPortableGrid.java deleted file mode 100644 index 96bb519a9..000000000 --- a/src/main/java/com/raoulvdberge/refinedstorage/inventory/item/ItemHandlerPortableGrid.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.raoulvdberge.refinedstorage.inventory.item; - -import com.raoulvdberge.refinedstorage.api.util.Action; -import com.raoulvdberge.refinedstorage.api.util.IComparer; -import com.raoulvdberge.refinedstorage.tile.grid.portable.TilePortableGrid; -import com.raoulvdberge.refinedstorage.util.StackUtils; -import net.minecraft.item.ItemStack; -import net.minecraftforge.items.IItemHandler; - -import javax.annotation.Nonnull; -import java.util.List; - -public class ItemHandlerPortableGrid implements IItemHandler { - private TilePortableGrid portableGrid; - - public ItemHandlerPortableGrid(TilePortableGrid portableGrid) { - this.portableGrid = portableGrid; - } - - @Override - public int getSlots() { - if (portableGrid.getStorageCache() != null) { - // One additional slot for possible input. - return portableGrid.getStorageCache().getList().getStacks().size() + 1; - } - - return 0; - } - - @Nonnull - @Override - public ItemStack getStackInSlot(int slot) { - if (portableGrid.getStorageCache() != null) { - List stacks = portableGrid.getStorageCache().getList().getStacks(); - - if (slot < stacks.size()) { - return stacks.get(slot); - } - } - - return ItemStack.EMPTY; - } - - @Nonnull - @Override - public ItemStack insertItem(int slot, @Nonnull ItemStack stack, boolean simulate) { - if (portableGrid.getStorage() != null) { - return StackUtils.nullToEmpty(portableGrid.getStorage().insert(stack, stack.getCount(), simulate ? Action.SIMULATE : Action.PERFORM)); - } - - return stack; - } - - @Nonnull - @Override - public ItemStack extractItem(int slot, int amount, boolean simulate) { - if (portableGrid.getStorage() != null) { - ItemStack stack = getStackInSlot(slot); - - return StackUtils.nullToEmpty(portableGrid.getStorage().extract(stack, stack.getCount(), IComparer.COMPARE_NBT | IComparer.COMPARE_DAMAGE, simulate ? Action.SIMULATE : Action.PERFORM)); - } - - return ItemStack.EMPTY; - } - - @Override - public int getSlotLimit(int slot) { - return Integer.MAX_VALUE; - } -} 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 6beb6aae8..d3789cd30 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/config/IFilterable.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/config/IFilterable.java @@ -10,6 +10,8 @@ import net.minecraft.tileentity.TileEntity; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.items.IItemHandler; +import javax.annotation.Nullable; + public interface IFilterable { int WHITELIST = 0; int BLACKLIST = 1; @@ -74,6 +76,20 @@ public interface IFilterable { return false; } + static boolean isEmpty(@Nullable IItemHandler filter) { + if (filter == null) { + return true; + } + + for (int i = 0; i < filter.getSlots(); i++) { + if (!filter.getStackInSlot(i).isEmpty()) { + return false; + } + } + + return true; + } + void setMode(int mode); int getMode(); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/portable/TilePortableGrid.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/portable/TilePortableGrid.java index af2c6c20c..69d53c69d 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/portable/TilePortableGrid.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/portable/TilePortableGrid.java @@ -30,7 +30,6 @@ import com.raoulvdberge.refinedstorage.gui.GuiBase; import com.raoulvdberge.refinedstorage.gui.grid.GuiGrid; import com.raoulvdberge.refinedstorage.inventory.item.ItemHandlerBase; import com.raoulvdberge.refinedstorage.inventory.item.ItemHandlerFilter; -import com.raoulvdberge.refinedstorage.inventory.item.ItemHandlerPortableGrid; import com.raoulvdberge.refinedstorage.inventory.listener.ListenerTile; import com.raoulvdberge.refinedstorage.item.ItemWirelessGrid; import com.raoulvdberge.refinedstorage.item.itemblock.ItemBlockPortableGrid; @@ -56,7 +55,6 @@ import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.Constants; import net.minecraftforge.energy.CapabilityEnergy; import net.minecraftforge.energy.EnergyStorage; -import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandlerModifiable; import javax.annotation.Nonnull; @@ -144,7 +142,6 @@ public class TilePortableGrid extends TileBase implements IGrid, IPortableGrid, private ItemGridHandlerPortable handler = new ItemGridHandlerPortable(this, this); private PortableGridDiskState diskState = PortableGridDiskState.NONE; private boolean connected; - private ItemHandlerPortableGrid items = new ItemHandlerPortableGrid(this); private StorageTrackerItem storageTracker = new StorageTrackerItem(this::markDirty); @@ -629,19 +626,13 @@ public class TilePortableGrid extends TileBase implements IGrid, IPortableGrid, @Override public boolean hasCapability(@Nonnull Capability capability, @Nullable EnumFacing facing) { - return capability == CapabilityEnergy.ENERGY || capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY || super.hasCapability(capability, facing); + return capability == CapabilityEnergy.ENERGY || super.hasCapability(capability, facing); } @Nullable @Override public T getCapability(@Nonnull Capability capability, @Nullable EnumFacing facing) { - if (capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) { - return CapabilityItemHandler.ITEM_HANDLER_CAPABILITY.cast(items); - } else if (capability == CapabilityEnergy.ENERGY) { - return CapabilityEnergy.ENERGY.cast(energyStorage); - } - - return super.getCapability(capability, facing); + return capability == CapabilityEnergy.ENERGY ? CapabilityEnergy.ENERGY.cast(energyStorage) : super.getCapability(capability, facing); } public void onOpened() { diff --git a/src/main/java/com/raoulvdberge/refinedstorage/util/MultiMap.java b/src/main/java/com/raoulvdberge/refinedstorage/util/MultiMap.java deleted file mode 100644 index 749f46538..000000000 --- a/src/main/java/com/raoulvdberge/refinedstorage/util/MultiMap.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.raoulvdberge.refinedstorage.util; - -import java.util.*; - -public class MultiMap { - private Map> map = new HashMap<>(); - private List allValues = new ArrayList<>(); - - public List get(K key) { - List values = map.get(key); - - if (values == null) { - return Collections.emptyList(); - } - - return values; - } - - public void put(K key, V value) { - List values = map.computeIfAbsent(key, k -> new ArrayList<>()); - - allValues.add(value); - - values.add(value); - } - - public void remove(K key, V value) { - List values = map.get(key); - - if (values != null) { - values.remove(value); - - if (values.isEmpty()) { - map.remove(key); - } - - allValues.remove(value); - } - } - - public void clear() { - map.clear(); - - allValues.clear(); - } - - public boolean isEmpty() { - return map.isEmpty(); - } - - public List values() { - return allValues; - } -}