diff --git a/CHANGELOG.md b/CHANGELOG.md index b71a118ca..6b9a0a57b 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,8 @@ ### 1.4.3 - Storage Monitors don't render any quantity text when no item is specified to monitor anymore (raoulvdberge) -- The Solderer isn't sided anymore (raoulvdberge) +- Fixed bug where disks in Disk Drive didn't respect access type or void excess stacks option (raoulvdberge) +- The Solderer inventory isn't sided anymore (raoulvdberge) ### 1.4.2 - Updated Forge to 2261 (raoulvdberge) diff --git a/src/main/java/com/raoulvdberge/refinedstorage/RSUtils.java b/src/main/java/com/raoulvdberge/refinedstorage/RSUtils.java index 8ea16315e..1468ebf35 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/RSUtils.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/RSUtils.java @@ -117,7 +117,7 @@ public final class RSUtils { } @SuppressWarnings("unchecked") - public static void createStorages(ItemStack disk, int slot, IStorageDisk[] itemStorages, IStorageDisk[] fluidStorages, Function itemStorageWrapper, Function fluidStorageWrapper) { + public static void createStorages(ItemStack disk, int slot, IStorageDisk[] itemStorages, IStorageDisk[] fluidStorages, Function, IStorageDisk> itemStorageWrapper, Function, IStorageDisk> fluidStorageWrapper) { if (disk.isEmpty()) { itemStorages[slot] = null; fluidStorages[slot] = null; 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 e8c072db4..c3e31512d 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/storage/IStorage.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/storage/IStorage.java @@ -50,9 +50,7 @@ public interface IStorage { /** * @return the access type of this storage */ - default AccessType getAccessType() { - return AccessType.INSERT_EXTRACT; - } + AccessType getAccessType(); /** * Returns the delta that needs to be added to the item or fluid storage cache AFTER insertion of the stack. diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/storage/IStorageDisk.java b/src/main/java/com/raoulvdberge/refinedstorage/api/storage/IStorageDisk.java index 64874562e..f85f19df3 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/storage/IStorageDisk.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/storage/IStorageDisk.java @@ -2,6 +2,8 @@ package com.raoulvdberge.refinedstorage.api.storage; import net.minecraft.item.ItemStack; +import java.util.function.Supplier; + /** * Represents a storage disk. * @@ -13,11 +15,6 @@ public interface IStorageDisk extends IStorage { */ int getCapacity(); - /** - * @return whether this storage voids excess stacks - */ - boolean isVoiding(); - /** * Returns whether the storage disk is valid. * Determines if it can be inserted in a disk drive. @@ -28,11 +25,14 @@ public interface IStorageDisk extends IStorage { boolean isValid(ItemStack stack); /** - * Sets a listener that is called when the storage changes. + * When this storage disk is inserted into a storage disk container, it has to adjust to the container's settings + * and use the following parameters instead. * - * @param listener the listener + * @param listener the listener to be called when the storage changes + * @param voidExcess a supplier whether this storage should void excess stacks + * @param accessType the access type of the container */ - void setListener(Runnable listener); + void onPassContainerContext(Runnable listener, Supplier voidExcess, Supplier accessType); /** * Reads the storage from NBT. diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeFluidStorage.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeFluidStorage.java index 8d21cd81d..e48da5b6e 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeFluidStorage.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeFluidStorage.java @@ -28,10 +28,14 @@ public class NetworkNodeFluidStorage extends NetworkNode implements IGuiStorage, public static final String ID = "fluid_storage"; class StorageFluid extends StorageDiskFluid { - public StorageFluid(NBTTagCompound tag) { + StorageFluid(NBTTagCompound tag) { super(tag, NetworkNodeFluidStorage.this.getCapacity()); - this.setListener(NetworkNodeFluidStorage.this::markDirty); + this.onPassContainerContext( + NetworkNodeFluidStorage.this::markDirty, + NetworkNodeFluidStorage.this::getVoidExcess, + NetworkNodeFluidStorage.this::getAccessType + ); } @Override @@ -48,16 +52,6 @@ public class NetworkNodeFluidStorage extends NetworkNode implements IGuiStorage, return super.insert(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/apiimpl/network/node/NetworkNodeStorage.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeStorage.java index 65a778c7c..50184442a 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeStorage.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeStorage.java @@ -28,10 +28,14 @@ public class NetworkNodeStorage extends NetworkNode implements IGuiStorage, ISto public static final String ID = "storage"; class StorageItem extends StorageDiskItem { - public StorageItem(NBTTagCompound tag) { + StorageItem(NBTTagCompound tag) { super(tag, NetworkNodeStorage.this.getCapacity()); - this.setListener(NetworkNodeStorage.this::markDirty); + this.onPassContainerContext( + NetworkNodeStorage.this::markDirty, + NetworkNodeStorage.this::getVoidExcess, + NetworkNodeStorage.this::getAccessType + ); } @Override @@ -47,16 +51,6 @@ public class NetworkNodeStorage extends NetworkNode implements IGuiStorage, ISto return super.insert(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/apiimpl/network/node/diskdrive/StorageFluidDiskDrive.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskdrive/StorageFluidDiskDrive.java index fca806db6..888fafea9 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskdrive/StorageFluidDiskDrive.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskdrive/StorageFluidDiskDrive.java @@ -12,6 +12,7 @@ import net.minecraftforge.fluids.FluidStack; import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.util.Collection; +import java.util.function.Supplier; public class StorageFluidDiskDrive implements IStorageDisk { private NetworkNodeDiskDrive diskDrive; @@ -21,17 +22,21 @@ public class StorageFluidDiskDrive implements IStorageDisk { public StorageFluidDiskDrive(NetworkNodeDiskDrive diskDrive, IStorageDisk parent) { this.diskDrive = diskDrive; this.parent = parent; - this.parent.setListener(() -> { - diskDrive.markDirty(); + this.onPassContainerContext( + () -> { + diskDrive.markDirty(); - int currentState = TileDiskDrive.getDiskState(getStored(), getCapacity()); + int currentState = TileDiskDrive.getDiskState(getStored(), getCapacity()); - if (lastState != currentState) { - lastState = currentState; + if (lastState != currentState) { + lastState = currentState; - RSUtils.updateBlock(diskDrive.getHolder().world(), diskDrive.getHolder().pos()); - } - }); + RSUtils.updateBlock(diskDrive.getHolder().world(), diskDrive.getHolder().pos()); + } + }, + diskDrive::getVoidExcess, + diskDrive::getAccessType + ); this.lastState = TileDiskDrive.getDiskState(getStored(), getCapacity()); } @@ -40,6 +45,11 @@ public class StorageFluidDiskDrive implements IStorageDisk { return diskDrive.getPriority(); } + @Override + public AccessType getAccessType() { + return parent.getAccessType(); + } + @Override public Collection getStacks() { return parent.getStacks(); @@ -66,11 +76,6 @@ public class StorageFluidDiskDrive implements IStorageDisk { return parent.getStored(); } - @Override - public AccessType getAccessType() { - return diskDrive.getAccessType(); - } - @Override public int getCacheDelta(int storedPreInsertion, int size, @Nullable FluidStack remainder) { return parent.getCacheDelta(storedPreInsertion, size, remainder); @@ -81,19 +86,14 @@ public class StorageFluidDiskDrive implements IStorageDisk { return parent.getCapacity(); } - @Override - public boolean isVoiding() { - return diskDrive.getVoidExcess(); - } - @Override public boolean isValid(ItemStack stack) { return parent.isValid(stack); } @Override - public void setListener(Runnable listener) { - // NO OP + public void onPassContainerContext(Runnable listener, Supplier voidExcess, Supplier accessType) { + parent.onPassContainerContext(listener, voidExcess, accessType); } @Override diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskdrive/StorageItemDiskDrive.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskdrive/StorageItemDiskDrive.java index 1ffcc5de5..06bf76cd5 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskdrive/StorageItemDiskDrive.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskdrive/StorageItemDiskDrive.java @@ -12,6 +12,7 @@ import net.minecraftforge.items.ItemHandlerHelper; import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.util.Collection; +import java.util.function.Supplier; public class StorageItemDiskDrive implements IStorageDisk { private NetworkNodeDiskDrive diskDrive; @@ -21,17 +22,21 @@ public class StorageItemDiskDrive implements IStorageDisk { public StorageItemDiskDrive(NetworkNodeDiskDrive diskDrive, IStorageDisk parent) { this.diskDrive = diskDrive; this.parent = parent; - this.parent.setListener(() -> { - diskDrive.markDirty(); + this.onPassContainerContext( + () -> { + diskDrive.markDirty(); - int currentState = TileDiskDrive.getDiskState(getStored(), getCapacity()); + int currentState = TileDiskDrive.getDiskState(getStored(), getCapacity()); - if (lastState != currentState) { - lastState = currentState; + if (lastState != currentState) { + lastState = currentState; - RSUtils.updateBlock(diskDrive.getHolder().world(), diskDrive.getHolder().pos()); - } - }); + RSUtils.updateBlock(diskDrive.getHolder().world(), diskDrive.getHolder().pos()); + } + }, + diskDrive::getVoidExcess, + diskDrive::getAccessType + ); this.lastState = TileDiskDrive.getDiskState(getStored(), getCapacity()); } @@ -40,6 +45,11 @@ public class StorageItemDiskDrive implements IStorageDisk { return diskDrive.getPriority(); } + @Override + public AccessType getAccessType() { + return parent.getAccessType(); + } + @Override public Collection getStacks() { return parent.getStacks(); @@ -66,11 +76,6 @@ public class StorageItemDiskDrive implements IStorageDisk { return parent.getStored(); } - @Override - public AccessType getAccessType() { - return diskDrive.getAccessType(); - } - @Override public int getCacheDelta(int storedPreInsertion, int size, @Nullable ItemStack remainder) { return parent.getCacheDelta(storedPreInsertion, size, remainder); @@ -81,19 +86,14 @@ public class StorageItemDiskDrive implements IStorageDisk { return parent.getCapacity(); } - @Override - public boolean isVoiding() { - return diskDrive.getVoidExcess(); - } - @Override public boolean isValid(ItemStack stack) { return parent.isValid(stack); } @Override - public void setListener(Runnable listener) { - // NO OP + public void onPassContainerContext(Runnable listener, Supplier voidExcess, Supplier accessType) { + parent.onPassContainerContext(listener, voidExcess, accessType); } @Override diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskmanipulator/StorageFluidDiskManipulator.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskmanipulator/StorageFluidDiskManipulator.java index 7cca1e8c4..4f7a3dea0 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskmanipulator/StorageFluidDiskManipulator.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskmanipulator/StorageFluidDiskManipulator.java @@ -1,6 +1,7 @@ package com.raoulvdberge.refinedstorage.apiimpl.network.node.diskmanipulator; import com.raoulvdberge.refinedstorage.RSUtils; +import com.raoulvdberge.refinedstorage.api.storage.AccessType; import com.raoulvdberge.refinedstorage.api.storage.IStorageDisk; import com.raoulvdberge.refinedstorage.api.storage.StorageDiskType; import com.raoulvdberge.refinedstorage.tile.TileDiskDrive; @@ -11,6 +12,7 @@ import net.minecraftforge.fluids.FluidStack; import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.util.Collection; +import java.util.function.Supplier; public class StorageFluidDiskManipulator implements IStorageDisk { private NetworkNodeDiskManipulator diskManipulator; @@ -20,17 +22,21 @@ public class StorageFluidDiskManipulator implements IStorageDisk { public StorageFluidDiskManipulator(NetworkNodeDiskManipulator diskManipulator, IStorageDisk parent) { this.diskManipulator = diskManipulator; this.parent = parent; - this.parent.setListener(() -> { - diskManipulator.markDirty(); + this.onPassContainerContext( + () -> { + diskManipulator.markDirty(); - int currentState = TileDiskDrive.getDiskState(getStored(), getCapacity()); + int currentState = TileDiskDrive.getDiskState(getStored(), getCapacity()); - if (lastState != currentState) { - lastState = currentState; + if (lastState != currentState) { + lastState = currentState; - RSUtils.updateBlock(diskManipulator.getHolder().world(), diskManipulator.getHolder().pos()); - } - }); + RSUtils.updateBlock(diskManipulator.getHolder().world(), diskManipulator.getHolder().pos()); + } + }, + () -> false, + () -> AccessType.INSERT_EXTRACT + ); this.lastState = TileDiskDrive.getDiskState(getStored(), getCapacity()); } @@ -39,19 +45,14 @@ public class StorageFluidDiskManipulator implements IStorageDisk { return parent.getCapacity(); } - @Override - public boolean isVoiding() { - return parent.isVoiding(); - } - @Override public boolean isValid(ItemStack stack) { return parent.isValid(stack); } @Override - public void setListener(Runnable listener) { - // NO OP + public void onPassContainerContext(Runnable listener, Supplier voidExcess, Supplier accessType) { + parent.onPassContainerContext(listener, voidExcess, accessType); } @Override @@ -104,6 +105,11 @@ public class StorageFluidDiskManipulator implements IStorageDisk { return parent.getPriority(); } + @Override + public AccessType getAccessType() { + return parent.getAccessType(); + } + @Override public int getCacheDelta(int storedPreInsertion, int size, @Nullable FluidStack remainder) { return parent.getCacheDelta(storedPreInsertion, size, remainder); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskmanipulator/StorageItemDiskManipulator.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskmanipulator/StorageItemDiskManipulator.java index e060358ba..6c16eef80 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskmanipulator/StorageItemDiskManipulator.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskmanipulator/StorageItemDiskManipulator.java @@ -1,6 +1,7 @@ package com.raoulvdberge.refinedstorage.apiimpl.network.node.diskmanipulator; import com.raoulvdberge.refinedstorage.RSUtils; +import com.raoulvdberge.refinedstorage.api.storage.AccessType; import com.raoulvdberge.refinedstorage.api.storage.IStorageDisk; import com.raoulvdberge.refinedstorage.api.storage.StorageDiskType; import com.raoulvdberge.refinedstorage.tile.TileDiskDrive; @@ -11,6 +12,7 @@ import net.minecraftforge.items.ItemHandlerHelper; import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.util.Collection; +import java.util.function.Supplier; public class StorageItemDiskManipulator implements IStorageDisk { private NetworkNodeDiskManipulator diskManipulator; @@ -20,17 +22,21 @@ public class StorageItemDiskManipulator implements IStorageDisk { public StorageItemDiskManipulator(NetworkNodeDiskManipulator diskManipulator, IStorageDisk parent) { this.diskManipulator = diskManipulator; this.parent = parent; - this.parent.setListener(() -> { - diskManipulator.markDirty(); + this.onPassContainerContext( + () -> { + diskManipulator.markDirty(); - int currentState = TileDiskDrive.getDiskState(getStored(), getCapacity()); + int currentState = TileDiskDrive.getDiskState(getStored(), getCapacity()); - if (lastState != currentState) { - lastState = currentState; + if (lastState != currentState) { + lastState = currentState; - RSUtils.updateBlock(diskManipulator.getHolder().world(), diskManipulator.getHolder().pos()); - } - }); + RSUtils.updateBlock(diskManipulator.getHolder().world(), diskManipulator.getHolder().pos()); + } + }, + () -> false, + () -> AccessType.INSERT_EXTRACT + ); this.lastState = TileDiskDrive.getDiskState(getStored(), getCapacity()); } @@ -39,19 +45,14 @@ public class StorageItemDiskManipulator implements IStorageDisk { return parent.getCapacity(); } - @Override - public boolean isVoiding() { - return parent.isVoiding(); - } - @Override public boolean isValid(ItemStack stack) { return parent.isValid(stack); } @Override - public void setListener(Runnable listener) { - // NO OP + public void onPassContainerContext(Runnable listener, Supplier voidExcess, Supplier accessType) { + parent.onPassContainerContext(listener, voidExcess, accessType); } @Override @@ -104,6 +105,11 @@ public class StorageItemDiskManipulator implements IStorageDisk { return parent.getPriority(); } + @Override + public AccessType getAccessType() { + return parent.getAccessType(); + } + @Override public int getCacheDelta(int storedPreInsertion, int size, @Nullable ItemStack remainder) { return parent.getCacheDelta(storedPreInsertion, size, remainder); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/externalstorage/StorageItemCyclops.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/externalstorage/StorageItemCyclops.java index 51d8e0384..76888d1e5 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/externalstorage/StorageItemCyclops.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/externalstorage/StorageItemCyclops.java @@ -2,6 +2,7 @@ package com.raoulvdberge.refinedstorage.apiimpl.network.node.externalstorage; import com.raoulvdberge.refinedstorage.RSUtils; import com.raoulvdberge.refinedstorage.api.network.INetworkMaster; +import com.raoulvdberge.refinedstorage.api.storage.AccessType; import com.raoulvdberge.refinedstorage.integration.cyclopscore.SlotlessItemHandlerHelper; import com.raoulvdberge.refinedstorage.tile.config.IFilterable; import net.minecraft.item.ItemStack; @@ -65,6 +66,11 @@ public class StorageItemCyclops extends StorageItemExternal { return this.externalStorage.getPriority(); } + @Override + public AccessType getAccessType() { + return this.externalStorage.getAccessType(); + } + @Override public int getCapacity() { InventoryTileEntityBase inv = cyclopsInv.get(); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/StorageDiskFluid.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/StorageDiskFluid.java index d14c4255b..36d5b3301 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/StorageDiskFluid.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/StorageDiskFluid.java @@ -16,6 +16,7 @@ import net.minecraftforge.fluids.FluidStack; import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.util.Collection; +import java.util.function.Supplier; public class StorageDiskFluid implements IStorageDisk { private static final int PROTOCOL = 1; @@ -32,6 +33,8 @@ public class StorageDiskFluid implements IStorageDisk { private Runnable listener = () -> { }; + private Supplier voidExcess; + private Supplier accessType; public StorageDiskFluid(NBTTagCompound tag, int capacity) { this.tag = tag; @@ -86,7 +89,7 @@ public class StorageDiskFluid implements IStorageDisk { int remainingSpace = getCapacity() - getStored(); if (remainingSpace <= 0) { - if (isVoiding()) { + if (voidExcess.get()) { return null; } @@ -101,7 +104,7 @@ public class StorageDiskFluid implements IStorageDisk { listener.run(); } - return isVoiding() ? null : RSUtils.copyStackWithSize(otherStack, size - remainingSpace); + return voidExcess.get() ? null : RSUtils.copyStackWithSize(otherStack, size - remainingSpace); } else { if (!simulate) { tag.setInteger(NBT_STORED, getStored() + size); @@ -120,7 +123,7 @@ public class StorageDiskFluid implements IStorageDisk { int remainingSpace = getCapacity() - getStored(); if (remainingSpace <= 0) { - if (isVoiding()) { + if (voidExcess.get()) { return null; } @@ -135,7 +138,7 @@ public class StorageDiskFluid implements IStorageDisk { listener.run(); } - return isVoiding() ? null : RSUtils.copyStackWithSize(stack, size - remainingSpace); + return voidExcess.get() ? null : RSUtils.copyStackWithSize(stack, size - remainingSpace); } else { if (!simulate) { tag.setInteger(NBT_STORED, getStored() + size); @@ -188,13 +191,13 @@ public class StorageDiskFluid implements IStorageDisk { } @Override - public int getCapacity() { - return capacity; + public AccessType getAccessType() { + return accessType.get(); } @Override - public boolean isVoiding() { - return false; + public int getCapacity() { + return capacity; } @Override @@ -205,7 +208,7 @@ public class StorageDiskFluid implements IStorageDisk { int inserted = remainder == null ? size : (size - remainder.amount); - if (isVoiding() && storedPreInsertion + inserted > getCapacity()) { + if (voidExcess.get() && storedPreInsertion + inserted > getCapacity()) { inserted = getCapacity() - storedPreInsertion; } @@ -218,8 +221,10 @@ public class StorageDiskFluid implements IStorageDisk { } @Override - public void setListener(Runnable listener) { + public void onPassContainerContext(Runnable listener, Supplier voidExcess, Supplier accessType) { this.listener = listener; + this.voidExcess = voidExcess; + this.accessType = accessType; } public static NBTTagCompound getShareTag(NBTTagCompound tag) { diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/StorageDiskItem.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/StorageDiskItem.java index 25e7c3adc..c861183dc 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/StorageDiskItem.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/StorageDiskItem.java @@ -3,7 +3,6 @@ package com.raoulvdberge.refinedstorage.apiimpl.storage; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Multimap; import com.raoulvdberge.refinedstorage.api.storage.AccessType; -import com.raoulvdberge.refinedstorage.api.storage.IStorage; import com.raoulvdberge.refinedstorage.api.storage.IStorageDisk; import com.raoulvdberge.refinedstorage.api.storage.StorageDiskType; import com.raoulvdberge.refinedstorage.apiimpl.API; @@ -16,10 +15,8 @@ import net.minecraftforge.items.ItemHandlerHelper; import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.util.Collection; +import java.util.function.Supplier; -/** - * A implementation of {@link IStorage} that stores storage items in NBT. - */ public class StorageDiskItem implements IStorageDisk { private static final int PROTOCOL = 1; @@ -39,13 +36,11 @@ public class StorageDiskItem implements IStorageDisk { private Runnable listener = () -> { }; + private Supplier voidExcess; + private Supplier accessType; private Multimap stacks = ArrayListMultimap.create(); - /** - * @param tag The NBT tag we are reading from and writing the amount stored to, has to be initialized with {@link StorageDiskItem#getTag()} if it doesn't exist yet - * @param capacity The capacity of this storage, -1 for infinite capacity - */ public StorageDiskItem(NBTTagCompound tag, int capacity) { this.tag = tag; this.capacity = capacity; @@ -129,7 +124,7 @@ public class StorageDiskItem implements IStorageDisk { int remainingSpace = getCapacity() - getStored(); if (remainingSpace <= 0) { - if (isVoiding()) { + if (voidExcess.get()) { return null; } @@ -144,7 +139,7 @@ public class StorageDiskItem implements IStorageDisk { listener.run(); } - return isVoiding() ? null : ItemHandlerHelper.copyStackWithSize(otherStack, size - remainingSpace); + return voidExcess.get() ? null : ItemHandlerHelper.copyStackWithSize(otherStack, size - remainingSpace); } else { if (!simulate) { tag.setInteger(NBT_STORED, getStored() + size); @@ -163,7 +158,7 @@ public class StorageDiskItem implements IStorageDisk { int remainingSpace = getCapacity() - getStored(); if (remainingSpace <= 0) { - if (isVoiding()) { + if (voidExcess.get()) { return null; } @@ -178,7 +173,7 @@ public class StorageDiskItem implements IStorageDisk { listener.run(); } - return isVoiding() ? null : ItemHandlerHelper.copyStackWithSize(stack, size - remainingSpace); + return voidExcess.get() ? null : ItemHandlerHelper.copyStackWithSize(stack, size - remainingSpace); } else { if (!simulate) { tag.setInteger(NBT_STORED, getStored() + size); @@ -231,13 +226,13 @@ public class StorageDiskItem implements IStorageDisk { } @Override - public int getCapacity() { - return capacity; + public AccessType getAccessType() { + return accessType.get(); } @Override - public boolean isVoiding() { - return false; + public int getCapacity() { + return capacity; } @Override @@ -246,8 +241,10 @@ public class StorageDiskItem implements IStorageDisk { } @Override - public void setListener(Runnable listener) { + public void onPassContainerContext(Runnable listener, Supplier voidExcess, Supplier accessType) { this.listener = listener; + this.voidExcess = voidExcess; + this.accessType = accessType; } @Override @@ -258,7 +255,7 @@ public class StorageDiskItem implements IStorageDisk { int inserted = remainder == null ? size : (size - remainder.getCount()); - if (isVoiding() && storedPreInsertion + inserted > getCapacity()) { + if (voidExcess.get() && storedPreInsertion + inserted > getCapacity()) { inserted = getCapacity() - storedPreInsertion; }