From 39fc45c6b5aaa6d83e5a6a3057a1284c1bb4bd17 Mon Sep 17 00:00:00 2001 From: Raoul Van den Berge Date: Mon, 28 Nov 2016 19:46:15 +0100 Subject: [PATCH] Fix item voiding --- .../refinedstorage/api/storage/IStorage.java | 5 ++ .../item/ItemFluidStorageDisk.java | 5 ++ .../refinedstorage/item/ItemStorageDisk.java | 5 ++ .../refinedstorage/tile/TileController.java | 47 +++++++++---------- .../refinedstorage/tile/TileDiskDrive.java | 28 +++++------ .../tile/TileDiskManipulator.java | 10 ++++ .../refinedstorage/tile/TileFluidStorage.java | 14 +++--- .../refinedstorage/tile/TileStorage.java | 14 +++--- .../externalstorage/FluidStorageExternal.java | 5 ++ .../externalstorage/ItemStorageExternal.java | 5 ++ 10 files changed, 81 insertions(+), 57 deletions(-) diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/storage/IStorage.java b/src/main/java/com/raoulvdberge/refinedstorage/api/storage/IStorage.java index 79cbfaebf..0e67a8348 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/storage/IStorage.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/storage/IStorage.java @@ -24,4 +24,9 @@ public interface IStorage { default AccessType getAccessType() { return AccessType.INSERT_EXTRACT; } + + /** + * @return true if this storage voids incoming items or fluids + */ + boolean isVoiding(); } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/item/ItemFluidStorageDisk.java b/src/main/java/com/raoulvdberge/refinedstorage/item/ItemFluidStorageDisk.java index 43c419333..fefe15509 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/item/ItemFluidStorageDisk.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/item/ItemFluidStorageDisk.java @@ -56,6 +56,11 @@ public class ItemFluidStorageDisk extends ItemBase { public int getPriority() { return 0; } + + @Override + public boolean isVoiding() { + return false; + } }; for (Fluid fluid : FluidRegistry.getRegisteredFluids().values()) { diff --git a/src/main/java/com/raoulvdberge/refinedstorage/item/ItemStorageDisk.java b/src/main/java/com/raoulvdberge/refinedstorage/item/ItemStorageDisk.java index 43bac6d47..d6dbcc555 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/item/ItemStorageDisk.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/item/ItemStorageDisk.java @@ -67,6 +67,11 @@ public class ItemStorageDisk extends ItemBase { public int getPriority() { return 0; } + + @Override + public boolean isVoiding() { + return false; + } }; Iterator it = REGISTRY.iterator(); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java index 9df0184c6..f8e9a8c9a 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java @@ -580,26 +580,33 @@ public class TileController extends TileBase implements INetworkMaster, IRedston return ItemHandlerHelper.copyStackWithSize(stack, size); } - int orginalSize = size; + int originalSize = size; + ItemStack remainder = stack; - int externalStorageInserted = 0; - int insertOnlyInserted = 0; + + int insertedExternally = 0; + int insertedToIgnore = 0; for (IItemStorage storage : this.itemStorage.getStorages()) { if (storage.getAccessType() != AccessType.EXTRACT) { remainder = storage.insertItem(remainder, size, simulate); - // if this storage is in insert-only mode, we can disregard this item from the cache - if (storage.getAccessType() == AccessType.INSERT && !simulate) { - insertOnlyInserted += size - (remainder != null ? remainder.getCount() : 0); + if (!simulate) { + if (remainder != null && storage.isVoiding()) { + insertedToIgnore += remainder.getCount(); + + remainder = null; + } else if (storage.getAccessType() == AccessType.INSERT) { + insertedToIgnore += size - (remainder != null ? remainder.getCount() : 0); + } } } - if (remainder == null || remainder.getCount() <= 0) { + if (remainder == null) { if (storage instanceof ItemStorageExternal && !simulate) { ((ItemStorageExternal) storage).detectChanges(this); // the external storage will send the change, we don't need to anymore - externalStorageInserted += size; + insertedExternally += size; } break; @@ -607,32 +614,22 @@ public class TileController extends TileBase implements INetworkMaster, IRedston if (size != remainder.getCount() && storage instanceof ItemStorageExternal && !simulate) { ((ItemStorageExternal) storage).detectChanges(this); // the external storage will send the change, we don't need to anymore - externalStorageInserted += size - remainder.getCount(); + insertedExternally += size - remainder.getCount(); } size = remainder.getCount(); } } - // If the stack size of the remainder is negative, it means of the original size abs(remainder.getCount()) items have been voided - int inserted; - - if (remainder == null) { - inserted = orginalSize; - } else if (remainder.getCount() < 0) { - inserted = orginalSize + remainder.getCount(); - remainder = null; - } else { - inserted = orginalSize - remainder.getCount(); - } - if (!simulate) { - if (inserted - externalStorageInserted - insertOnlyInserted > 0) { - itemStorage.add(stack, inserted - externalStorageInserted - insertOnlyInserted, false); + int inserted = remainder == null ? originalSize : (originalSize - remainder.getCount()); + + if (inserted - insertedExternally - insertedToIgnore > 0) { + itemStorage.add(stack, inserted - insertedExternally - insertedToIgnore, false); } - if (inserted - insertOnlyInserted > 0) { - ItemStack checkSteps = ItemHandlerHelper.copyStackWithSize(stack, inserted - insertOnlyInserted); + if (inserted - insertedToIgnore > 0) { + ItemStack checkSteps = ItemHandlerHelper.copyStackWithSize(stack, inserted - insertedToIgnore); for (ICraftingTask task : craftingTasks) { for (ICraftingStep processable : task.getSteps()) { diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileDiskDrive.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileDiskDrive.java index 8cf305ee8..96a1b29cc 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileDiskDrive.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileDiskDrive.java @@ -60,14 +60,7 @@ public class TileDiskDrive extends TileNode implements IItemStorageProvider, IFl return ItemHandlerHelper.copyStackWithSize(stack, size); } - ItemStack result = super.insertItem(stack, size, simulate); - - if (voidExcess && result != null) { - // Simulate should not matter as the items are voided anyway - result.setCount(-result.getCount()); - } - - return result; + return super.insertItem(stack, size, simulate); } @Override @@ -75,6 +68,11 @@ public class TileDiskDrive extends TileNode implements IItemStorageProvider, IFl return accessType; } + @Override + public boolean isVoiding() { + return voidExcess; + } + @Override public void onStorageChanged() { super.onStorageChanged(); @@ -109,14 +107,7 @@ public class TileDiskDrive extends TileNode implements IItemStorageProvider, IFl return RSUtils.copyStackWithSize(stack, size); } - FluidStack result = super.insertFluid(stack, size, simulate); - - if (voidExcess && result != null) { - // Simulate should not matter as the fluids are voided anyway - result.amount = -result.amount; - } - - return result; + return super.insertFluid(stack, size, simulate); } @Override @@ -124,6 +115,11 @@ public class TileDiskDrive extends TileNode implements IItemStorageProvider, IFl return accessType; } + @Override + public boolean isVoiding() { + return voidExcess; + } + @Override public void onStorageChanged() { super.onStorageChanged(); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileDiskManipulator.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileDiskManipulator.java index beea949ed..fd6a49a5d 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileDiskManipulator.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileDiskManipulator.java @@ -126,6 +126,11 @@ public class TileDiskManipulator extends TileNode implements IComparable, IFilte return 0; } + @Override + public boolean isVoiding() { + return false; + } + @Override public ItemStack insertItem(ItemStack stack, int size, boolean simulate) { if (!IFilterable.canTake(itemFilters, mode, getCompare(), stack)) { @@ -172,6 +177,11 @@ public class TileDiskManipulator extends TileNode implements IComparable, IFilte return 0; } + @Override + public boolean isVoiding() { + return false; + } + @Override public FluidStack insertFluid(FluidStack stack, int size, boolean simulate) { if (!IFilterable.canTakeFluids(fluidFilters, mode, getCompare(), stack)) { diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileFluidStorage.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileFluidStorage.java index 72e5df9d2..6480be63c 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileFluidStorage.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileFluidStorage.java @@ -50,20 +50,18 @@ public class TileFluidStorage extends TileNode implements IFluidStorageProvider, return RSUtils.copyStackWithSize(stack, size); } - FluidStack result = super.insertFluid(stack, size, simulate); - - if (voidExcess && result != null) { - // Simulate should not matter as the fluids are voided anyway - result.amount = -result.amount; - } - - return result; + return super.insertFluid(stack, size, simulate); } @Override public AccessType getAccessType() { return accessType; } + + @Override + public boolean isVoiding() { + return voidExcess; + } } public static final String NBT_STORAGE = "Storage"; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileStorage.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileStorage.java index 758463560..47a28f9d8 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileStorage.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileStorage.java @@ -51,20 +51,18 @@ public class TileStorage extends TileNode implements IItemStorageProvider, IStor return ItemHandlerHelper.copyStackWithSize(stack, size); } - ItemStack result = super.insertItem(stack, size, simulate); - - if (voidExcess && result != null) { - // Simulate should not matter as the items are voided anyway - result.setCount(-result.getCount()); - } - - return result; + return super.insertItem(stack, size, simulate); } @Override public AccessType getAccessType() { return accessType; } + + @Override + public boolean isVoiding() { + return voidExcess; + } } public static final String NBT_STORAGE = "Storage"; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/externalstorage/FluidStorageExternal.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/externalstorage/FluidStorageExternal.java index 1fcabacf1..e19da38e6 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/externalstorage/FluidStorageExternal.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/externalstorage/FluidStorageExternal.java @@ -84,6 +84,11 @@ public class FluidStorageExternal implements IFluidStorage { return externalStorage.getAccessType(); } + @Override + public boolean isVoiding() { + return false; + } + public boolean updateCache() { FluidStack stack = getContents(); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/externalstorage/ItemStorageExternal.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/externalstorage/ItemStorageExternal.java index 1581e7724..2248630b6 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/externalstorage/ItemStorageExternal.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/externalstorage/ItemStorageExternal.java @@ -76,4 +76,9 @@ public abstract class ItemStorageExternal implements IItemStorage { this.cache = newStacks; } + + @Override + public boolean isVoiding() { + return false; + } }