diff --git a/CHANGELOG.md b/CHANGELOG.md index 7a29f95af..bb7bd235e 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ - Changed stack quantity of craftable items from 1 to 0 to fix Quantity Sorting (ineternet) - Changed fluid stack amount to not display "0" anymore (ineternet) - Fixed NBT/metadata check on exporting in an Interface (ineternet) +- Fixed Disk Manipulator being stuck on unemptiable, non-empty disks (ineternet) ### 1.5.31 - Improved the "cannot craft! loop in processing..." error message (raoulvdberge) 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 174305e3f..e82cb3038 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 @@ -131,7 +131,7 @@ public class NetworkNodeDiskManipulator extends NetworkNode implements IComparab int slot = 0; if (type == IType.ITEMS) { - while (slot < 3 && itemStorages[slot] == null) { + while (slot < 3 && (itemStorages[slot] == null || checkItemDiskDone(itemStorages[slot], slot))) { slot++; } @@ -147,7 +147,7 @@ public class NetworkNodeDiskManipulator extends NetworkNode implements IComparab extractItemFromNetwork(storage, slot); } } else if (type == IType.FLUIDS) { - while (slot < 3 && fluidStorages[slot] == null) { + while (slot < 3 && (fluidStorages[slot] == null || checkFluidDiskDone(fluidStorages[slot], slot))) { slot++; } @@ -166,11 +166,6 @@ public class NetworkNodeDiskManipulator extends NetworkNode implements IComparab } private void insertItemIntoNetwork(IStorageDisk storage, int slot) { - if (storage.getStored() == 0) { - moveDriveToOutput(slot); - return; - } - List stacks = new ArrayList<>(storage.getStacks()); for (int i = 0; i < stacks.size(); ++i) { ItemStack stack = stacks.get(i); @@ -194,6 +189,30 @@ public class NetworkNodeDiskManipulator extends NetworkNode implements IComparab } } + //Iterate through disk stacks, if none can be inserted, return that it is done processing and can be output. + private boolean checkItemDiskDone(IStorageDisk storage, int slot) { + if (storage.getStored() == 0) { + moveDriveToOutput(slot); + return true; + } + + List stacks = new ArrayList<>(storage.getStacks()); + for (int i = 0; i < stacks.size(); ++i) { + ItemStack stack = stacks.get(i); + + ItemStack extracted = storage.extract(stack, upgrades.getItemInteractCount(), compare, true); + if (extracted == null) { + continue; + } + + ItemStack remainder = network.insertItem(extracted, extracted.getCount(), true); + if (remainder == null) { //An item could be inserted (no remainders when trying to). This disk isn't done. + return false; + } + } + return true; + } + private void extractItemFromNetwork(IStorageDisk storage, int slot) { if (storage.getStored() == storage.getCapacity()) { moveDriveToOutput(slot); @@ -243,11 +262,6 @@ public class NetworkNodeDiskManipulator extends NetworkNode implements IComparab } private void insertFluidIntoNetwork(IStorageDisk storage, int slot) { - if (storage.getStored() == 0) { - moveDriveToOutput(slot); - return; - } - List stacks = new ArrayList<>(storage.getStacks()); FluidStack extracted = null; @@ -271,6 +285,29 @@ public class NetworkNodeDiskManipulator extends NetworkNode implements IComparab } } + private boolean checkFluidDiskDone(IStorageDisk storage, int slot) { + if (storage.getStored() == 0) { + moveDriveToOutput(slot); + return true; + } + + List stacks = new ArrayList<>(storage.getStacks()); + for (int i = 0; i < stacks.size(); ++i) { + FluidStack stack = stacks.get(i); + + FluidStack extracted = storage.extract(stack, upgrades.getItemInteractCount(), compare, true); + if (extracted == null) { + continue; + } + + FluidStack remainder = network.insertFluid(extracted, extracted.amount, true); + if (remainder == null) { //A fluid could be inserted (no remainders when trying to). This disk isn't done. + return false; + } + } + return true; + } + private void extractFluidFromNetwork(IStorageDisk storage, int slot) { if (storage.getStored() == storage.getCapacity()) { moveDriveToOutput(slot);