diff --git a/CHANGELOG.md b/CHANGELOG.md
index fa115df54..50d045c5a 100755
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,7 @@
### 1.5.8
- Updated Storage Drawers API (raoulvdberge)
- Fixed bug where disks have to be re-inserted in the Disk Drive in order to work again after rejoining a chunk (raoulvdberge)
+- Fixed bug where items inserted in Storage Drawers through External Storage with a Drawer Controller wouldn't respect drawer priority rules (raoulvdberge)
- Autocrafting can now fill water bottles with water from the fluid storage - regular bottles or pattern for regular bottles are required (raoulvdberge)
### 1.5.7
diff --git a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/IStorageDrawersApi.java b/src/main/java/com/jaquadro/minecraft/storagedrawers/api/IStorageDrawersApi.java
deleted file mode 100755
index c6ee06672..000000000
--- a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/IStorageDrawersApi.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package com.jaquadro.minecraft.storagedrawers.api;
-
-import com.jaquadro.minecraft.storagedrawers.api.registry.IRenderRegistry;
-import com.jaquadro.minecraft.storagedrawers.api.registry.IWailaRegistry;
-
-public interface IStorageDrawersApi {
- IRenderRegistry renderRegistry();
-
- IWailaRegistry wailaRegistry();
-}
diff --git a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/StorageDrawersApi.java b/src/main/java/com/jaquadro/minecraft/storagedrawers/api/StorageDrawersApi.java
deleted file mode 100755
index d770e0e89..000000000
--- a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/StorageDrawersApi.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.jaquadro.minecraft.storagedrawers.api;
-
-/**
- * Entry point for the public API.
- */
-public class StorageDrawersApi {
- private static IStorageDrawersApi instance;
-
- public static final String VERSION = "2.0.0";
-
- /**
- * API entry point.
- *
- * @return The {@link IStorageDrawersApi} instance or null if the API or Storage Drawers is unavailable.
- */
- public static IStorageDrawersApi instance() {
- if (instance == null) {
- try {
- Class classApi = Class.forName("com.jaquadro.minecraft.storagedrawers.core.Api");
- instance = (IStorageDrawersApi) classApi.getField("instance").get(null);
- } catch (Throwable t) {
- return null;
- }
- }
-
- return instance;
- }
-}
diff --git a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/capabilities/IItemRepository.java b/src/main/java/com/jaquadro/minecraft/storagedrawers/api/capabilities/IItemRepository.java
index 629b76c4e..c1e4a7502 100644
--- a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/capabilities/IItemRepository.java
+++ b/src/main/java/com/jaquadro/minecraft/storagedrawers/api/capabilities/IItemRepository.java
@@ -4,43 +4,120 @@ import net.minecraft.item.ItemStack;
import net.minecraft.util.NonNullList;
import javax.annotation.Nonnull;
+import java.util.function.Predicate;
+/**
+ * An interface for treating an inventory as a slotless, central repository of items.
+ *
+ * For all operations that accept a predicate, if a predicate is supplied, a stored ItemStack must pass the predicate
+ * in order to be considered for the given operation.
+ *
+ * An IItemRepository implementation MAY relax or eliminate its own internal tests when a predicate is supplied. If
+ * the predicate is derived from DefaultPredicate, then the implementation MUST apply any tests it would have applied
+ * had no predicate been provided at all, in addition to testing the predicate itself.
+ */
public interface IItemRepository {
/**
* Gets a list of all items in the inventory. The same item may appear multiple times with varying counts.
- *
+
* @return A list of zero or more items in the inventory.
*/
@Nonnull
- NonNullList getAllItems();
+ NonNullList getAllItems ();
/**
* Inserts an ItemStack into the inventory and returns the remainder.
*
- * @param stack ItemStack to insert.
- * @param simulate If true, the insertion is only simulated
+ * @param stack ItemStack to insert.
+ * @param simulate If true, the insertion is only simulated
+ * @param predicate See interface notes about predicates. Passing null specifies default matching.
* @return The remaining ItemStack that was not inserted. If the entire stack was accepted, returns
* ItemStack.EMPTY instead.
*/
@Nonnull
- ItemStack insertItem(@Nonnull ItemStack stack, boolean simulate);
+ ItemStack insertItem(@Nonnull ItemStack stack, boolean simulate, Predicate predicate);
+
+ @Nonnull
+ default ItemStack insertItem(@Nonnull ItemStack stack, boolean simulate) {
+ return insertItem(stack, simulate, null);
+ }
/**
* Tries to extract the given ItemStack from the inventory. The returned value will be a matching ItemStack
* with a stack size equal to or less than amount, or the empty ItemStack if the item could not be found at all.
- * The returned stack size may exceed the itemstack's getMaxStackSize() value.
- *
- * @param stack The item to extract. The stack size is ignored.
- * @param amount Amount to extract (may be greater than the stacks max limit)
- * @param simulate If true, the extraction is only simulated
+ * The returned stack size may exceed the ItemStack's getMaxStackSize() value.
+
+ * @param stack The item to extract. The stack size is ignored.
+ * @param amount Amount to extract (may be greater than the stacks max limit)
+ * @param simulate If true, the extraction is only simulated
+ * @param predicate See interface notes about predicates. Passing null specifies default matching.
* @return ItemStack extracted from the inventory, or ItemStack.EMPTY if nothing could be extracted.
*/
@Nonnull
- ItemStack extractItem(@Nonnull ItemStack stack, int amount, boolean simulate);
+ ItemStack extractItem(@Nonnull ItemStack stack, int amount, boolean simulate, Predicate predicate);
+
+ @Nonnull
+ default ItemStack extractItem(@Nonnull ItemStack stack, int amount, boolean simulate) {
+ return extractItem(stack, amount, simulate, null);
+ }
+
+ /**
+ * Gets the number of items matching the given ItemStack stored by the inventory.
+ *
+ * @param stack ItemStack to query.
+ * @param predicate See interface notes about predicates. Passing null specifies default matching.
+ * @return The number of stored matching items. A value of Integer.MAX_VALUE may indicate an infinite item source.
+ */
+ default int getStoredItemCount(@Nonnull ItemStack stack, Predicate predicate) {
+ ItemStack amount = extractItem(stack, Integer.MAX_VALUE, true, predicate);
+ return amount.getCount();
+ }
+
+ default int getStoredItemCount(@Nonnull ItemStack stack) {
+ return getStoredItemCount(stack, null);
+ }
+
+ /**
+ * Gets the number items matching the given ItemStack that additionally still be stored by the inventory.
+ * Remaining capacity may include space that is internally empty or unassigned to any given item.
+ *
+ * @param stack ItemStack to query.
+ * @param predicate See interface notes about predicates. Passing null specifies default matching.
+ * @return The available remaining space for matching items.
+ */
+ default int getRemainingItemCapacity(@Nonnull ItemStack stack, Predicate predicate) {
+ stack = stack.copy();
+ stack.setCount(Integer.MAX_VALUE);
+ ItemStack remainder = insertItem(stack, true, predicate);
+ return Integer.MAX_VALUE - remainder.getCount();
+ }
+
+ default int getRemainingItemCapacity(@Nonnull ItemStack stack) {
+ return getRemainingItemCapacity(stack, null);
+ }
+
+ /**
+ * Gets the total inventory capacity for items matching the given ItemStack.
+ * Total capacity may include space that is internally empty or unassigned to any given item.
+ *
+ * @param stack ItemStack to query.
+ * @param predicate See interface notes about predicates. Passing null specifies default matching.
+ * @return The total capacity for matching items.
+ */
+ default int getItemCapacity(@Nonnull ItemStack stack, Predicate predicate) {
+ long capacity = getStoredItemCount(stack, predicate) + getRemainingItemCapacity(stack, predicate);
+ if (capacity > Integer.MAX_VALUE)
+ return Integer.MAX_VALUE;
+ return (int) capacity;
+ }
+
+ default int getItemCapacity(@Nonnull ItemStack stack) {
+ return getItemCapacity(stack, null);
+ }
/**
* An item record representing an item and the amount stored.
- *
+ *
* The ItemStack held by itemPrototype always reports a stack size of 1.
* IT IS IMPORTANT THAT YOU NEVER MODIFY itemPrototype.
*/
@@ -54,4 +131,11 @@ public interface IItemRepository {
this.count = count;
}
}
+
+ /**
+ * A variant of the standard Predicate interface that when passed to IItemRepository functions, will ask the
+ * internal default predicate to be tested in addition to the custom predicate. An IItemRepository function
+ * may choose to enforce its own predicate regardless.
+ */
+ interface DefaultPredicate extends Predicate { }
}
diff --git a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/event/DrawerPopulatedEvent.java b/src/main/java/com/jaquadro/minecraft/storagedrawers/api/event/DrawerPopulatedEvent.java
deleted file mode 100755
index f934cea45..000000000
--- a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/event/DrawerPopulatedEvent.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.jaquadro.minecraft.storagedrawers.api.event;
-
-import com.jaquadro.minecraft.storagedrawers.api.storage.IDrawer;
-import net.minecraftforge.fml.common.eventhandler.Event;
-
-/**
- * This event is called when a drawer has been bound to a new item. This is
- * and opportunity for mods to cache extended data with the drawer.
- *
- * This event is also called when the drawer is changed to empty.
- */
-public class DrawerPopulatedEvent extends Event {
- public final IDrawer drawer;
-
- public DrawerPopulatedEvent(IDrawer drawer) {
- this.drawer = drawer;
- }
-}
diff --git a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/event/package-info.java b/src/main/java/com/jaquadro/minecraft/storagedrawers/api/event/package-info.java
deleted file mode 100755
index 517ce1760..000000000
--- a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/event/package-info.java
+++ /dev/null
@@ -1,5 +0,0 @@
-@API(owner = "StorageDrawersAPI", provides = "StorageDrawersAPI|event", apiVersion = StorageDrawersApi.VERSION)
-package com.jaquadro.minecraft.storagedrawers.api.event;
-
-import com.jaquadro.minecraft.storagedrawers.api.StorageDrawersApi;
-import net.minecraftforge.fml.common.API;
\ No newline at end of file
diff --git a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/package-info.java b/src/main/java/com/jaquadro/minecraft/storagedrawers/api/package-info.java
deleted file mode 100755
index 86d7280fa..000000000
--- a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/package-info.java
+++ /dev/null
@@ -1,4 +0,0 @@
-@API(owner = "StorageDrawers", provides = "StorageDrawersAPI", apiVersion = StorageDrawersApi.VERSION)
-package com.jaquadro.minecraft.storagedrawers.api;
-
-import net.minecraftforge.fml.common.API;
\ No newline at end of file
diff --git a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/registry/IRenderRegistry.java b/src/main/java/com/jaquadro/minecraft/storagedrawers/api/registry/IRenderRegistry.java
deleted file mode 100755
index dc605b381..000000000
--- a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/registry/IRenderRegistry.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package com.jaquadro.minecraft.storagedrawers.api.registry;
-
-import com.jaquadro.minecraft.storagedrawers.api.render.IRenderLabel;
-
-public interface IRenderRegistry {
- void registerPreLabelRenderHandler(IRenderLabel renderHandler);
-}
diff --git a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/registry/IWailaRegistry.java b/src/main/java/com/jaquadro/minecraft/storagedrawers/api/registry/IWailaRegistry.java
deleted file mode 100755
index 5cc8909cf..000000000
--- a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/registry/IWailaRegistry.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.jaquadro.minecraft.storagedrawers.api.registry;
-
-public interface IWailaRegistry {
- void registerTooltipHandler(IWailaTooltipHandler handler);
-}
diff --git a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/registry/IWailaTooltipHandler.java b/src/main/java/com/jaquadro/minecraft/storagedrawers/api/registry/IWailaTooltipHandler.java
deleted file mode 100755
index acd724d4f..000000000
--- a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/registry/IWailaTooltipHandler.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package com.jaquadro.minecraft.storagedrawers.api.registry;
-
-import com.jaquadro.minecraft.storagedrawers.api.storage.IDrawer;
-
-public interface IWailaTooltipHandler {
- String transformItemName(IDrawer drawer, String defaultName);
-}
diff --git a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/registry/package-info.java b/src/main/java/com/jaquadro/minecraft/storagedrawers/api/registry/package-info.java
deleted file mode 100755
index 75fe1f250..000000000
--- a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/registry/package-info.java
+++ /dev/null
@@ -1,5 +0,0 @@
-@API(owner = "StorageDrawersAPI", provides = "StorageDrawersAPI|registry", apiVersion = StorageDrawersApi.VERSION)
-package com.jaquadro.minecraft.storagedrawers.api.registry;
-
-import com.jaquadro.minecraft.storagedrawers.api.StorageDrawersApi;
-import net.minecraftforge.fml.common.API;
\ No newline at end of file
diff --git a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/render/IRenderLabel.java b/src/main/java/com/jaquadro/minecraft/storagedrawers/api/render/IRenderLabel.java
deleted file mode 100755
index 23e0c6d39..000000000
--- a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/render/IRenderLabel.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package com.jaquadro.minecraft.storagedrawers.api.render;
-
-import com.jaquadro.minecraft.storagedrawers.api.storage.IDrawerGroup;
-import net.minecraft.tileentity.TileEntity;
-
-public interface IRenderLabel {
- void render(TileEntity tileEntity, IDrawerGroup drawerGroup, int slot, float brightness, float partialTickTime);
-}
diff --git a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/render/package-info.java b/src/main/java/com/jaquadro/minecraft/storagedrawers/api/render/package-info.java
deleted file mode 100755
index 76e937caa..000000000
--- a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/render/package-info.java
+++ /dev/null
@@ -1,5 +0,0 @@
-@API(owner = "StorageDrawersAPI", provides = "StorageDrawersAPI|render", apiVersion = StorageDrawersApi.VERSION)
-package com.jaquadro.minecraft.storagedrawers.api.render;
-
-import com.jaquadro.minecraft.storagedrawers.api.StorageDrawersApi;
-import net.minecraftforge.fml.common.API;
\ No newline at end of file
diff --git a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/security/ISecurityProvider.java b/src/main/java/com/jaquadro/minecraft/storagedrawers/api/security/ISecurityProvider.java
deleted file mode 100755
index 3b8e0869e..000000000
--- a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/security/ISecurityProvider.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.jaquadro.minecraft.storagedrawers.api.security;
-
-import com.jaquadro.minecraft.storagedrawers.api.storage.attribute.IProtectable;
-import com.mojang.authlib.GameProfile;
-
-public interface ISecurityProvider {
- String getProviderID();
-
- boolean hasOwnership(GameProfile profile, IProtectable target);
-
- boolean hasAccess(GameProfile profile, IProtectable target);
-}
diff --git a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/storage/BlockType.java b/src/main/java/com/jaquadro/minecraft/storagedrawers/api/storage/BlockType.java
deleted file mode 100644
index a9e5f0c57..000000000
--- a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/storage/BlockType.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package com.jaquadro.minecraft.storagedrawers.api.storage;
-
-public enum BlockType {
- Drawers,
- Trim
-}
diff --git a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/storage/Drawers.java b/src/main/java/com/jaquadro/minecraft/storagedrawers/api/storage/Drawers.java
deleted file mode 100644
index 5914db3ea..000000000
--- a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/storage/Drawers.java
+++ /dev/null
@@ -1,81 +0,0 @@
-package com.jaquadro.minecraft.storagedrawers.api.storage;
-
-import net.minecraft.item.ItemStack;
-
-import javax.annotation.Nonnull;
-
-public class Drawers {
- public static final IDrawer DISABLED = new DisabledDrawer();
- public static final IFractionalDrawer DISABLED_FRACTIONAL = new DisabledFractionalDrawer();
-
- private static class DisabledDrawer implements IDrawer {
- @Nonnull
- @Override
- public ItemStack getStoredItemPrototype() {
- return ItemStack.EMPTY;
- }
-
- @Nonnull
- @Override
- public IDrawer setStoredItem(@Nonnull ItemStack itemPrototype) {
- return this;
- }
-
- @Override
- public int getStoredItemCount() {
- return 0;
- }
-
- @Override
- public void setStoredItemCount(int amount) {
-
- }
-
- @Override
- public int getMaxCapacity(@Nonnull ItemStack itemPrototype) {
- return 0;
- }
-
- @Override
- public int getRemainingCapacity() {
- return 0;
- }
-
- @Override
- public boolean canItemBeStored(@Nonnull ItemStack itemPrototype) {
- return false;
- }
-
- @Override
- public boolean canItemBeExtracted(@Nonnull ItemStack itemPrototype) {
- return false;
- }
-
- @Override
- public boolean isEmpty() {
- return true;
- }
-
- @Override
- public boolean isEnabled() {
- return false;
- }
- }
-
- private static class DisabledFractionalDrawer extends DisabledDrawer implements IFractionalDrawer {
- @Override
- public int getConversionRate() {
- return 0;
- }
-
- @Override
- public int getStoredItemRemainder() {
- return 0;
- }
-
- @Override
- public boolean isSmallestUnit() {
- return false;
- }
- }
-}
diff --git a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/storage/EmptyDrawerAttributes.java b/src/main/java/com/jaquadro/minecraft/storagedrawers/api/storage/EmptyDrawerAttributes.java
deleted file mode 100644
index ad1f52b37..000000000
--- a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/storage/EmptyDrawerAttributes.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package com.jaquadro.minecraft.storagedrawers.api.storage;
-
-public class EmptyDrawerAttributes implements IDrawerAttributes {
- public EmptyDrawerAttributes() {
- }
-}
diff --git a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/storage/EnumBasicDrawer.java b/src/main/java/com/jaquadro/minecraft/storagedrawers/api/storage/EnumBasicDrawer.java
deleted file mode 100755
index 245872644..000000000
--- a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/storage/EnumBasicDrawer.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package com.jaquadro.minecraft.storagedrawers.api.storage;
-
-import net.minecraft.util.IStringSerializable;
-
-import javax.annotation.Nonnull;
-
-public enum EnumBasicDrawer implements IDrawerGeometry, IStringSerializable {
- FULL1(0, 1, false, "full1", "fulldrawers1"),
- FULL2(1, 2, false, "full2", "fulldrawers2"),
- FULL4(2, 4, false, "full4", "fulldrawers4"),
- HALF2(3, 2, true, "half2", "halfdrawers2"),
- HALF4(4, 4, true, "half4", "halfdrawers4");
-
- private static final EnumBasicDrawer[] META_LOOKUP;
-
- private final int meta;
- private final int drawerCount;
- private final boolean halfDepth;
- private final String name;
- private final String unlocalizedName;
-
- EnumBasicDrawer(int meta, int drawerCount, boolean halfDepth, String name, String unlocalizedName) {
- this.meta = meta;
- this.name = name;
- this.drawerCount = drawerCount;
- this.halfDepth = halfDepth;
- this.unlocalizedName = unlocalizedName;
- }
-
- public int getMetadata() {
- return meta;
- }
-
- @Override
- public int getDrawerCount() {
- return drawerCount;
- }
-
- @Override
- public boolean isHalfDepth() {
- return halfDepth;
- }
-
- public String getUnlocalizedName() {
- return unlocalizedName;
- }
-
- public static EnumBasicDrawer byMetadata(int meta) {
- if (meta < 0 || meta >= META_LOOKUP.length)
- meta = 0;
- return META_LOOKUP[meta];
- }
-
- @Override
- public String toString() {
- return getName();
- }
-
- @Override
- @Nonnull
- public String getName() {
- return name;
- }
-
- static {
- META_LOOKUP = new EnumBasicDrawer[values().length];
- for (EnumBasicDrawer upgrade : values()) {
- META_LOOKUP[upgrade.getMetadata()] = upgrade;
- }
- }
-}
diff --git a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/storage/IDrawer.java b/src/main/java/com/jaquadro/minecraft/storagedrawers/api/storage/IDrawer.java
deleted file mode 100755
index af8c12a16..000000000
--- a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/storage/IDrawer.java
+++ /dev/null
@@ -1,145 +0,0 @@
-package com.jaquadro.minecraft.storagedrawers.api.storage;
-
-import net.minecraft.item.ItemStack;
-
-import javax.annotation.Nonnull;
-
-public interface IDrawer {
- /**
- * Gets an ItemStack of size 1 representing the type, metadata, and tags of the stored items.
- * The returned ItemStack should not be modified for any reason. Make a copy if you need to store or modify it.
- */
- @Nonnull
- ItemStack getStoredItemPrototype();
-
- /**
- * Sets the type of the stored item and initializes it to 0. Any existing item will be replaced.
- *
- * @param itemPrototype An ItemStack representing the type, metadata, and tags of the item to store.
- * @return The IDrawer actually set with the prototype. Some drawer groups can redirect a set operation to another member.
- */
- @Nonnull
- IDrawer setStoredItem(@Nonnull ItemStack itemPrototype);
-
- /**
- * Sets the type of the stored item and initializes it to the given amount. Any existing item will be replaced.
- *
- * @param itemPrototype An ItemStack representing the type, metadata, and tags of the item to store.
- * @param amount The amount of items stored in this drawer.
- * @return The IDrawer actually set with the prototype. Some drawer groups can redirect a set operation to another member.
- */
- @Nonnull
- default IDrawer setStoredItem(@Nonnull ItemStack itemPrototype, int amount) {
- IDrawer drawer = setStoredItem(itemPrototype);
- drawer.setStoredItemCount(amount);
- return drawer;
- }
-
- /**
- * Gets the number of items stored in this drawer.
- */
- int getStoredItemCount();
-
- /**
- * Sets the number of items stored in this drawer. Triggers syncing of inventories and client data.
- * Setting a drawer's count to 0 may also result in the item type being cleared, depending in implementation.
- *
- * @param amount The new amount of items stored in this drawer.
- */
- void setStoredItemCount(int amount);
-
- /**
- * Adds or removes a given amount from the number of items stored in this drawer.
- *
- * @param amount The amount to add (positive) or subtract (negative).
- * @return 0 if the full adjustment was committed, or a positive value representing the remainder if the full
- * amount couldn't be added or subtracted.
- */
- default int adjustStoredItemCount(int amount) {
- if (amount > 0) {
- int insert = Math.min(amount, getRemainingCapacity());
- setStoredItemCount(getStoredItemCount() + insert);
- return amount - insert;
- } else if (amount < 0) {
- int stored = getStoredItemCount();
- int destroy = Math.min(Math.abs(amount), getStoredItemCount());
- setStoredItemCount(stored - destroy);
- return amount + destroy;
- } else {
- return 0;
- }
- }
-
- /**
- * Gets the maximum number of items that can be stored in this drawer.
- * This value will vary depending on the max stack size of the stored item type.
- */
- default int getMaxCapacity() {
- return getMaxCapacity(getStoredItemPrototype());
- }
-
- /**
- * Gets the maximum number of items that could be stored in this drawer if it held the given item.
- *
- * @param itemPrototype The item type to query. Pass the empty stack to get the max capacity for an empty slot.
- */
- int getMaxCapacity(@Nonnull ItemStack itemPrototype);
-
- /**
- * Gets the number of items that could still be added to this drawer before it is full.
- */
- int getRemainingCapacity();
-
- /**
- * Gets the number of additional items that would be accepted by this drawer.
- *
- * Because a drawer may be able to handle items in excess of its full capacity, this value may be larger than
- * the result of getRemainingCapacity().
- */
- default int getAcceptingRemainingCapacity() {
- return getRemainingCapacity();
- }
-
- /**
- * Gets the max stack size of the item type stored in this drawer.
- */
- default int getStoredItemStackSize() {
- @Nonnull ItemStack protoStack = getStoredItemPrototype();
- if (protoStack.isEmpty())
- return 0;
-
- return protoStack.getItem().getItemStackLimit(protoStack);
- }
-
- /**
- * Gets whether or not an item of the given type and data can be stored in this drawer.
- *
- * Stack size and available capacity are not considered. For drawers that are not empty, this
- * method can allow ore-dictionary compatible items to be accepted into the drawer, as defined by what
- * the drawer considers to be an equivalent item.
- * For drawers that are empty, locking status is considered.
- *
- * @param itemPrototype An ItemStack representing the type, metadata, and tags of an item.
- */
- boolean canItemBeStored(@Nonnull ItemStack itemPrototype);
-
- /**
- * Gets whether or not an item of the given type and data can be extracted from this drawer.
- *
- * This is intended to allow outbound ore-dictionary conversions of compatible items, as defined by what
- * the drawer considers to be an equivalent item.
- *
- * @param itemPrototype An ItemStack representing the type, metadata, and tags of an item.
- */
- boolean canItemBeExtracted(@Nonnull ItemStack itemPrototype);
-
- /**
- * Gets whether or not the drawer has items.
- * A drawer set with an item type and 0 count is not considered empty.
- */
- boolean isEmpty();
-
- default boolean isEnabled() {
- return true;
- }
-}
diff --git a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/storage/IDrawerAttributes.java b/src/main/java/com/jaquadro/minecraft/storagedrawers/api/storage/IDrawerAttributes.java
deleted file mode 100644
index b36edc19f..000000000
--- a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/storage/IDrawerAttributes.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package com.jaquadro.minecraft.storagedrawers.api.storage;
-
-import com.jaquadro.minecraft.storagedrawers.api.storage.attribute.LockAttribute;
-
-public interface IDrawerAttributes {
- /**
- * Gets whether or not the lock state can be changed for the given lock attribute.
- * If this method returns false, isItemLocked may still return true.
- */
- default boolean canItemLock(LockAttribute attr) {
- return false;
- }
-
- /**
- * Gets whether or not a drawer or group is locked for the given lock attribute.
- */
- default boolean isItemLocked(LockAttribute attr) {
- return false;
- }
-
- /**
- * Gets whether or not the drawer has the concealed attribute.
- * The shrouded attribute instructs the drawer to not render its item label.
- */
- default boolean isConcealed() {
- return false;
- }
-
- /**
- * Gets whether or not the drawer has the sealed attribute.
- * A sealed drawer cannot be interacted with, and when broken will retain all of its items and upgrades.
- */
- default boolean isSealed() {
- return false;
- }
-
- /**
- * Gets whether or not the drawer has the quantified attribute.
- * The quantified attribute instructs the drawer to render its numerical quantity.
- */
- default boolean isShowingQuantity() {
- return false;
- }
-
- /**
- * Gets whether or not the drawer has a voiding attribute.
- */
- default boolean isVoid() {
- return false;
- }
-
- default boolean isUnlimitedStorage() {
- return false;
- }
-
- default boolean isUnlimitedVending() {
- return false;
- }
-
- default boolean isDictConvertible() {
- return false;
- }
-}
diff --git a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/storage/IDrawerAttributesModifiable.java b/src/main/java/com/jaquadro/minecraft/storagedrawers/api/storage/IDrawerAttributesModifiable.java
deleted file mode 100644
index b96509547..000000000
--- a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/storage/IDrawerAttributesModifiable.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package com.jaquadro.minecraft.storagedrawers.api.storage;
-
-import com.jaquadro.minecraft.storagedrawers.api.storage.attribute.LockAttribute;
-
-public interface IDrawerAttributesModifiable extends IDrawerAttributes {
- /**
- * Sets whether or not the drawer is currently concealed.
- *
- * @return false if the operation is not supported, true otherwise.
- */
- default boolean setIsConcealed(boolean state) {
- return false;
- }
-
- /**
- * Sets the lock state of a drawer or group for the given lock attribute.
- * If canItemLock returns false, this is a no-op.
- *
- * @return false if the operation is not supported, true otherwise.
- */
- default boolean setItemLocked(LockAttribute attr, boolean isLocked) {
- return false;
- }
-
- /**
- * Sets whether or not the drawer is currently quantified.
- *
- * @return false if the operation is not supported, true otherwise.
- */
- default boolean setIsShowingQuantity(boolean state) {
- return false;
- }
-
- /**
- * Sets whether or not the drawer is currently sealed.
- *
- * @return false if the operation is not supported, true otherwise.
- */
- default boolean setIsSealed(boolean state) {
- return false;
- }
-
- default boolean setIsVoid(boolean state) {
- return false;
- }
-
- default boolean setIsUnlimitedStorage(boolean state) {
- return false;
- }
-
- default boolean setIsUnlimitedVending(boolean state) {
- return false;
- }
-
- default boolean setIsDictConvertible(boolean state) {
- return false;
- }
-}
diff --git a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/storage/IDrawerGeometry.java b/src/main/java/com/jaquadro/minecraft/storagedrawers/api/storage/IDrawerGeometry.java
deleted file mode 100755
index 283483328..000000000
--- a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/storage/IDrawerGeometry.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package com.jaquadro.minecraft.storagedrawers.api.storage;
-
-public interface IDrawerGeometry {
- boolean isHalfDepth();
-
- int getDrawerCount();
-}
diff --git a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/storage/IDrawerGroup.java b/src/main/java/com/jaquadro/minecraft/storagedrawers/api/storage/IDrawerGroup.java
deleted file mode 100755
index 80402ab6b..000000000
--- a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/storage/IDrawerGroup.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package com.jaquadro.minecraft.storagedrawers.api.storage;
-
-import net.minecraft.util.EnumFacing;
-import net.minecraftforge.common.capabilities.Capability;
-import net.minecraftforge.common.capabilities.ICapabilityProvider;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-
-public interface IDrawerGroup extends ICapabilityProvider {
- /**
- * Gets the number of drawers contained within this group.
- */
- int getDrawerCount();
-
- /**
- * Gets the drawer at the given slot within this group.
- */
- @Nonnull
- IDrawer getDrawer(int slot);
-
- /**
- * Gets the list of available drawer slots in priority order.
- */
- @Nonnull
- int[] getAccessibleDrawerSlots();
-
- @Override
- default boolean hasCapability(@Nonnull Capability> capability, @Nullable EnumFacing facing) {
- return false;
- }
-
- @Nullable
- @Override
- default T getCapability(@Nonnull Capability capability, @Nullable EnumFacing facing) {
- return null;
- }
-}
diff --git a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/storage/IFractionalDrawer.java b/src/main/java/com/jaquadro/minecraft/storagedrawers/api/storage/IFractionalDrawer.java
deleted file mode 100755
index ba47d9652..000000000
--- a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/storage/IFractionalDrawer.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package com.jaquadro.minecraft.storagedrawers.api.storage;
-
-/**
- * Represents a drawer with items that are a fractional component of another item within the drawer group. Compacting
- * Drawers are a primary example of this drawer type.
- */
-public interface IFractionalDrawer extends IDrawer {
- /**
- * Gets the storage ratio between the held item and the most compressed item within the drawer group.
- *
- * For example, most ingots have a conversion rate of 9 compared to metal blocks, and nuggets a rate of 81.
- * Actual conversion rates are implementation-defined.
- */
- int getConversionRate();
-
- /**
- * Gets the number of items left in the drawer if the maximum number of equivalent compressed items had been removed.
- * The equivalency is determined by the next compression tier, and not necessarily the conversion rate.
- */
- int getStoredItemRemainder();
-
- /**
- * Gets whether or not the stored item represents the smallest granularity of material that can be stored within
- * the drawer group.
- */
- boolean isSmallestUnit();
-}
diff --git a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/storage/INetworked.java b/src/main/java/com/jaquadro/minecraft/storagedrawers/api/storage/INetworked.java
deleted file mode 100755
index ac4524c3c..000000000
--- a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/storage/INetworked.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package com.jaquadro.minecraft.storagedrawers.api.storage;
-
-public interface INetworked {
-}
diff --git a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/storage/attribute/IProtectable.java b/src/main/java/com/jaquadro/minecraft/storagedrawers/api/storage/attribute/IProtectable.java
deleted file mode 100755
index 0bea99d6c..000000000
--- a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/storage/attribute/IProtectable.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package com.jaquadro.minecraft.storagedrawers.api.storage.attribute;
-
-import com.jaquadro.minecraft.storagedrawers.api.security.ISecurityProvider;
-import net.minecraft.world.ILockableContainer;
-
-import java.util.UUID;
-
-public interface IProtectable {
- /**
- * Gets the owner of the drawer, or null if there is no owner.
- */
- UUID getOwner();
-
- /**
- * Sets the owner of the drawer. Set to null to set no owner.
- * @return false if the operation is not supported, true otherwise.
- */
- boolean setOwner(UUID owner);
-
- /**
- * Gets the provider managing security for the target.
- * @return null to use the default provider, which enforces strict owner access.
- */
- ISecurityProvider getSecurityProvider();
-
- /**
- * Gets the lockable interface if it exists on the protected drawer.
- * @return A lockable interface, or null if lockable is not supported.
- */
- ILockableContainer getLockableContainer();
-
- /**
- * Sets the provider managing security for the target. Set to null for default provider.
- * @return false if the operation is not supported, true otherwise.
- */
- boolean setSecurityProvider(ISecurityProvider provder);
-}
diff --git a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/storage/attribute/ISealable.java b/src/main/java/com/jaquadro/minecraft/storagedrawers/api/storage/attribute/ISealable.java
deleted file mode 100755
index eb9a951d8..000000000
--- a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/storage/attribute/ISealable.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.jaquadro.minecraft.storagedrawers.api.storage.attribute;
-
-public interface ISealable {
- /**
- * Gets whether or not the drawer has the sealed attribute.
- * A sealed drawer cannot be interacted with, and when broken will retain all of its items and upgrades.
- */
- boolean isSealed();
-
- /**
- * Sets whether or not the drawer is currently sealed.
- * @return false if the operation is not supported, true otherwise.
- */
- boolean setIsSealed(boolean state);
-}
diff --git a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/storage/attribute/IVoidable.java b/src/main/java/com/jaquadro/minecraft/storagedrawers/api/storage/attribute/IVoidable.java
deleted file mode 100755
index 0d53fd508..000000000
--- a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/storage/attribute/IVoidable.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package com.jaquadro.minecraft.storagedrawers.api.storage.attribute;
-
-@Deprecated
-public interface IVoidable {
- @Deprecated
- boolean isVoid();
-}
diff --git a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/storage/attribute/LockAttribute.java b/src/main/java/com/jaquadro/minecraft/storagedrawers/api/storage/attribute/LockAttribute.java
deleted file mode 100755
index d51e1994d..000000000
--- a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/storage/attribute/LockAttribute.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package com.jaquadro.minecraft.storagedrawers.api.storage.attribute;
-
-import java.util.EnumSet;
-
-public enum LockAttribute {
- LOCK_POPULATED,
- LOCK_EMPTY;
-
- public int getFlagValue() {
- return 1 << ordinal();
- }
-
- public static int getBitfield(EnumSet attributes) {
- int value = 0;
- if (attributes == null)
- return value;
-
- for (LockAttribute attr : attributes)
- value |= attr.getFlagValue();
-
- return value;
- }
-
- public static EnumSet getEnumSet(int bitfield) {
- if (bitfield == 0)
- return null;
-
- EnumSet set = EnumSet.noneOf(LockAttribute.class);
- for (LockAttribute attr : values()) {
- if ((bitfield & attr.getFlagValue()) != 0)
- set.add(attr);
- }
-
- return set;
- }
-}
diff --git a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/storage/attribute/package-info.java b/src/main/java/com/jaquadro/minecraft/storagedrawers/api/storage/attribute/package-info.java
deleted file mode 100755
index cbcb916aa..000000000
--- a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/storage/attribute/package-info.java
+++ /dev/null
@@ -1,5 +0,0 @@
-@API(owner = "StorageDrawersAPI", provides = "StorageDrawersAPI|storage-attribute", apiVersion = StorageDrawersApi.VERSION)
-package com.jaquadro.minecraft.storagedrawers.api.storage.attribute;
-
-import com.jaquadro.minecraft.storagedrawers.api.StorageDrawersApi;
-import net.minecraftforge.fml.common.API;
\ No newline at end of file
diff --git a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/storage/package-info.java b/src/main/java/com/jaquadro/minecraft/storagedrawers/api/storage/package-info.java
deleted file mode 100755
index c9539a2ae..000000000
--- a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/storage/package-info.java
+++ /dev/null
@@ -1,5 +0,0 @@
-@API(owner = "StorageDrawersAPI", provides = "StorageDrawersAPI|storage", apiVersion = StorageDrawersApi.VERSION)
-package com.jaquadro.minecraft.storagedrawers.api.storage;
-
-import com.jaquadro.minecraft.storagedrawers.api.StorageDrawersApi;
-import net.minecraftforge.fml.common.API;
\ No newline at end of file
diff --git a/src/main/java/com/raoulvdberge/refinedstorage/RS.java b/src/main/java/com/raoulvdberge/refinedstorage/RS.java
index ceb7dde26..e2caf2f34 100755
--- a/src/main/java/com/raoulvdberge/refinedstorage/RS.java
+++ b/src/main/java/com/raoulvdberge/refinedstorage/RS.java
@@ -22,7 +22,7 @@ public final class RS {
public static final String ID = "refinedstorage";
public static final String VERSION = "1.5.8";
- public static final String DEPENDENCIES = "required-after:forge@[14.21.0.2363,);after:mcmultipart@[2.2.1,);";
+ public static final String DEPENDENCIES = "required-after:forge@[14.21.0.2363,);after:mcmultipart@[2.2.1,);after:storagedrawers@[1.12-5.2.1,);";
public static final String GUI_FACTORY = "com.raoulvdberge.refinedstorage.gui.config.ModGuiFactory";
public static final String UPDATE_JSON = "https://refinedstorage.raoulvdberge.com/update";
diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/externalstorage/NetworkNodeExternalStorage.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/externalstorage/NetworkNodeExternalStorage.java
index 6b5ee0bcf..88d099aba 100755
--- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/externalstorage/NetworkNodeExternalStorage.java
+++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/externalstorage/NetworkNodeExternalStorage.java
@@ -1,7 +1,6 @@
package com.raoulvdberge.refinedstorage.apiimpl.network.node.externalstorage;
-import com.jaquadro.minecraft.storagedrawers.api.storage.IDrawer;
-import com.jaquadro.minecraft.storagedrawers.api.storage.IDrawerGroup;
+import com.jaquadro.minecraft.storagedrawers.api.capabilities.IItemRepository;
import com.raoulvdberge.refinedstorage.RS;
import com.raoulvdberge.refinedstorage.RSUtils;
import com.raoulvdberge.refinedstorage.api.network.INetwork;
@@ -12,6 +11,7 @@ import com.raoulvdberge.refinedstorage.api.util.IComparer;
import com.raoulvdberge.refinedstorage.apiimpl.network.node.IGuiStorage;
import com.raoulvdberge.refinedstorage.apiimpl.network.node.NetworkNode;
import com.raoulvdberge.refinedstorage.capability.CapabilityNetworkNodeProxy;
+import com.raoulvdberge.refinedstorage.integration.storagedrawers.StorageItemItemRepository;
import com.raoulvdberge.refinedstorage.inventory.ItemHandlerBase;
import com.raoulvdberge.refinedstorage.inventory.ItemHandlerFluid;
import com.raoulvdberge.refinedstorage.inventory.ItemHandlerListenerNetworkNode;
@@ -33,10 +33,8 @@ import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
public class NetworkNodeExternalStorage extends NetworkNode implements IStorageProvider, IGuiStorage, IComparable, IFilterable, IPrioritizable, IType, IAccessType {
- @CapabilityInject(IDrawerGroup.class)
- private static final Capability DRAWER_GROUP_CAPABILITY = null;
- @CapabilityInject(IDrawer.class)
- private static final Capability DRAWER_CAPABILITY = null;
+ @CapabilityInject(IItemRepository.class)
+ private static final Capability ITEM_REPOSITORY_CAPABILITY = null;
public static final String ID = "external_storage";
@@ -203,17 +201,11 @@ public class NetworkNodeExternalStorage extends NetworkNode implements IStorageP
}
if (type == IType.ITEMS) {
- if (facing.hasCapability(DRAWER_GROUP_CAPABILITY, getDirection().getOpposite())) {
- itemStorages.add(new StorageItemDrawerGroup(this, () -> {
+ if (facing.hasCapability(ITEM_REPOSITORY_CAPABILITY, getDirection().getOpposite())) {
+ itemStorages.add(new StorageItemItemRepository(this, () -> {
TileEntity f = getFacingTile();
- return (f != null && f.hasCapability(DRAWER_GROUP_CAPABILITY, getDirection().getOpposite())) ? f.getCapability(DRAWER_GROUP_CAPABILITY, getDirection().getOpposite()) : null;
- }));
- } else if (facing.hasCapability(DRAWER_CAPABILITY, getDirection().getOpposite())) {
- itemStorages.add(new StorageItemDrawer(this, () -> {
- TileEntity f = getFacingTile();
-
- return (f != null && f.hasCapability(DRAWER_CAPABILITY, getDirection().getOpposite())) ? f.getCapability(DRAWER_CAPABILITY, getDirection().getOpposite()) : null;
+ return (f != null && f.hasCapability(ITEM_REPOSITORY_CAPABILITY, getDirection().getOpposite())) ? f.getCapability(ITEM_REPOSITORY_CAPABILITY, getDirection().getOpposite()) : null;
}));
} else if (!(facing.hasCapability(CapabilityNetworkNodeProxy.NETWORK_NODE_PROXY_CAPABILITY, getDirection().getOpposite()) && facing.getCapability(CapabilityNetworkNodeProxy.NETWORK_NODE_PROXY_CAPABILITY, getDirection().getOpposite()).getNode() instanceof IStorageProvider)) {
IItemHandler itemHandler = RSUtils.getItemHandler(facing, getDirection().getOpposite());
diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/externalstorage/StorageItemDrawer.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/externalstorage/StorageItemDrawer.java
deleted file mode 100755
index 3e699edd5..000000000
--- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/externalstorage/StorageItemDrawer.java
+++ /dev/null
@@ -1,109 +0,0 @@
-package com.raoulvdberge.refinedstorage.apiimpl.network.node.externalstorage;
-
-import com.jaquadro.minecraft.storagedrawers.api.storage.IDrawer;
-import com.raoulvdberge.refinedstorage.api.storage.AccessType;
-import com.raoulvdberge.refinedstorage.apiimpl.API;
-import com.raoulvdberge.refinedstorage.tile.config.IFilterable;
-import net.minecraft.item.ItemStack;
-import net.minecraftforge.items.ItemHandlerHelper;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.function.Supplier;
-
-public class StorageItemDrawer extends StorageItemExternal {
- private NetworkNodeExternalStorage externalStorage;
- private Supplier drawerSupplier;
-
- public StorageItemDrawer(NetworkNodeExternalStorage externalStorage, Supplier drawerSupplier) {
- this.externalStorage = externalStorage;
- this.drawerSupplier = drawerSupplier;
- }
-
- @Override
- public int getCapacity() {
- IDrawer drawer = drawerSupplier.get();
-
- return drawer != null ? drawer.getMaxCapacity() : 0;
- }
-
- @Override
- public Collection getStacks() {
- return Collections.singletonList(getStack(drawerSupplier.get()));
- }
-
- @Override
- public ItemStack insert(@Nonnull ItemStack stack, int size, boolean simulate) {
- return insert(externalStorage, drawerSupplier.get(), stack, size, simulate);
- }
-
- @Override
- public ItemStack extract(@Nonnull ItemStack stack, int size, int flags, boolean simulate) {
- return extract(drawerSupplier.get(), stack, size, flags, simulate);
- }
-
- @Override
- public int getStored() {
- IDrawer drawer = drawerSupplier.get();
-
- return drawer != null ? drawer.getStoredItemCount() : 0;
- }
-
- @Override
- public int getPriority() {
- return externalStorage.getPriority();
- }
-
- @Override
- public AccessType getAccessType() {
- return externalStorage.getAccessType();
- }
-
- public static ItemStack getStack(@Nullable IDrawer drawer) {
- if (drawer != null && !drawer.isEmpty() && drawer.getStoredItemCount() > 0) {
- return ItemHandlerHelper.copyStackWithSize(drawer.getStoredItemPrototype(), drawer.getStoredItemCount());
- }
-
- return ItemStack.EMPTY;
- }
-
- public static ItemStack insert(NetworkNodeExternalStorage externalStorage, @Nullable IDrawer drawer, @Nonnull ItemStack stack, int size, boolean simulate) {
- if (drawer != null && IFilterable.canTake(externalStorage.getItemFilters(), externalStorage.getMode(), externalStorage.getCompare(), stack) && drawer.canItemBeStored(stack)) {
- if (drawer.getStoredItemCount() == 0) {
- int toInsert = size > drawer.getMaxCapacity() ? drawer.getMaxCapacity() : size;
-
- if (!simulate) {
- drawer.setStoredItem(stack, toInsert);
- }
-
- return toInsert == size ? null : ItemHandlerHelper.copyStackWithSize(stack, size - toInsert);
- }
-
- int remainder = simulate ? Math.max(size - drawer.getAcceptingRemainingCapacity(), 0) : drawer.adjustStoredItemCount(size);
-
- return remainder == 0 ? null : ItemHandlerHelper.copyStackWithSize(stack, remainder);
- }
-
- return ItemHandlerHelper.copyStackWithSize(stack, size);
- }
-
- public static ItemStack extract(@Nullable IDrawer drawer, @Nonnull ItemStack stack, int size, int flags, boolean simulate) {
- if (drawer != null && API.instance().getComparer().isEqual(stack, drawer.getStoredItemPrototype(), flags)) {
- if (size > drawer.getStoredItemCount()) {
- size = drawer.getStoredItemCount();
- }
-
- ItemStack stored = drawer.getStoredItemPrototype();
-
- if (!simulate) {
- drawer.setStoredItemCount(drawer.getStoredItemCount() - size);
- }
-
- return ItemHandlerHelper.copyStackWithSize(stored, size);
- }
-
- return null;
- }
-}
diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/externalstorage/StorageItemDrawerGroup.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/externalstorage/StorageItemDrawerGroup.java
deleted file mode 100755
index d92e95038..000000000
--- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/externalstorage/StorageItemDrawerGroup.java
+++ /dev/null
@@ -1,163 +0,0 @@
-package com.raoulvdberge.refinedstorage.apiimpl.network.node.externalstorage;
-
-import com.jaquadro.minecraft.storagedrawers.api.storage.IDrawer;
-import com.jaquadro.minecraft.storagedrawers.api.storage.IDrawerGroup;
-import com.raoulvdberge.refinedstorage.api.storage.AccessType;
-import net.minecraft.item.ItemStack;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.function.Supplier;
-
-public class StorageItemDrawerGroup extends StorageItemExternal {
- private NetworkNodeExternalStorage externalStorage;
- private Supplier groupSupplier;
-
- public StorageItemDrawerGroup(NetworkNodeExternalStorage externalStorage, Supplier groupSupplier) {
- this.externalStorage = externalStorage;
- this.groupSupplier = groupSupplier;
- }
-
- @Override
- public Collection getStacks() {
- IDrawerGroup group = groupSupplier.get();
-
- if (group == null) {
- return Collections.emptyList();
- }
-
- List stacks = new ArrayList<>();
-
- for (int i = 0; i < group.getDrawerCount(); ++i) {
- IDrawer drawer = group.getDrawer(i);
-
- if (drawer.isEnabled()) {
- stacks.add(StorageItemDrawer.getStack(drawer));
- }
- }
-
- return stacks;
- }
-
- @Override
- public int getStored() {
- int stored = 0;
-
- IDrawerGroup group = groupSupplier.get();
-
- if (group == null) {
- return 0;
- }
-
- for (int i = 0; i < group.getDrawerCount(); ++i) {
- IDrawer drawer = group.getDrawer(i);
-
- if (drawer.isEnabled()) {
- stored += drawer.getStoredItemCount();
- }
- }
-
- return stored;
- }
-
- @Override
- public int getPriority() {
- return externalStorage.getPriority();
- }
-
- @Override
- public int getCapacity() {
- int capacity = 0;
-
- IDrawerGroup group = groupSupplier.get();
-
- if (group == null) {
- return 0;
- }
-
- for (int i = 0; i < group.getDrawerCount(); ++i) {
- IDrawer drawer = group.getDrawer(i);
-
- if (drawer.isEnabled()) {
- capacity += drawer.getMaxCapacity();
- }
- }
-
- return capacity;
- }
-
- @Nullable
- @Override
- public ItemStack insert(@Nonnull ItemStack stack, int size, boolean simulate) {
- ItemStack remainder = stack;
-
- IDrawerGroup group = groupSupplier.get();
-
- if (group == null) {
- return stack;
- }
-
- for (int i = 0; i < group.getDrawerCount(); ++i) {
- IDrawer drawer = group.getDrawer(i);
-
- if (drawer.isEnabled()) {
- remainder = StorageItemDrawer.insert(externalStorage, drawer, stack, size, simulate);
-
- if (remainder == null || remainder.getCount() <= 0) {
- break;
- } else {
- size = remainder.getCount();
- }
- }
- }
-
- return remainder;
- }
-
- @Nullable
- @Override
- public ItemStack extract(@Nonnull ItemStack stack, int size, int flags, boolean simulate) {
- int toExtract = size;
-
- IDrawerGroup group = groupSupplier.get();
-
- if (group == null) {
- return null;
- }
-
- ItemStack result = null;
-
- for (int i = 0; i < group.getDrawerCount(); ++i) {
- IDrawer drawer = group.getDrawer(i);
-
- if (drawer.isEnabled()) {
- ItemStack extracted = StorageItemDrawer.extract(drawer, stack, toExtract, flags, simulate);
-
- if (extracted != null) {
- if (result == null) {
- result = extracted;
- } else {
- result.grow(extracted.getCount());
- }
-
- toExtract -= extracted.getCount();
- }
-
- if (toExtract == 0) {
- break;
- }
- }
- }
-
- return result;
- }
-
- @Override
- public AccessType getAccessType() {
- return externalStorage.getAccessType();
- }
-}
diff --git a/src/main/java/com/raoulvdberge/refinedstorage/integration/storagedrawers/StorageItemItemRepository.java b/src/main/java/com/raoulvdberge/refinedstorage/integration/storagedrawers/StorageItemItemRepository.java
new file mode 100644
index 000000000..9c1f19fbc
--- /dev/null
+++ b/src/main/java/com/raoulvdberge/refinedstorage/integration/storagedrawers/StorageItemItemRepository.java
@@ -0,0 +1,106 @@
+package com.raoulvdberge.refinedstorage.integration.storagedrawers;
+
+import com.jaquadro.minecraft.storagedrawers.api.capabilities.IItemRepository;
+import com.raoulvdberge.refinedstorage.RSUtils;
+import com.raoulvdberge.refinedstorage.api.storage.AccessType;
+import com.raoulvdberge.refinedstorage.apiimpl.API;
+import com.raoulvdberge.refinedstorage.apiimpl.network.node.externalstorage.NetworkNodeExternalStorage;
+import com.raoulvdberge.refinedstorage.apiimpl.network.node.externalstorage.StorageItemExternal;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.items.ItemHandlerHelper;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.function.Supplier;
+import java.util.stream.Collectors;
+
+public class StorageItemItemRepository extends StorageItemExternal {
+ private NetworkNodeExternalStorage externalStorage;
+ private Supplier repositorySupplier;
+
+ public StorageItemItemRepository(NetworkNodeExternalStorage externalStorage, Supplier repositorySupplier) {
+ this.externalStorage = externalStorage;
+ this.repositorySupplier = repositorySupplier;
+ }
+
+ @Override
+ public Collection getStacks() {
+ IItemRepository repository = repositorySupplier.get();
+
+ if (repository == null) {
+ return Collections.emptyList();
+ }
+
+ return repository.getAllItems().stream().map(r -> ItemHandlerHelper.copyStackWithSize(r.itemPrototype, r.count)).collect(Collectors.toList());
+ }
+
+ @Nullable
+ @Override
+ public ItemStack insert(@Nonnull ItemStack stack, int size, boolean simulate) {
+ IItemRepository repository = repositorySupplier.get();
+
+ if (repository == null) {
+ return stack;
+ }
+
+ return RSUtils.transformEmptyToNull(repository.insertItem(ItemHandlerHelper.copyStackWithSize(stack, size), simulate));
+ }
+
+ @Nullable
+ @Override
+ public ItemStack extract(@Nonnull ItemStack stack, int size, int flags, boolean simulate) {
+ IItemRepository repository = repositorySupplier.get();
+
+ if (repository == null) {
+ return stack;
+ }
+
+ int toExtract = size;
+
+ if (toExtract > repository.getStoredItemCount(stack)) {
+ toExtract = repository.getStoredItemCount(stack);
+ }
+
+ return repository.extractItem(stack, toExtract, simulate, s -> API.instance().getComparer().isEqual(stack, s, flags));
+ }
+
+ @Override
+ public int getStored() {
+ IItemRepository repository = repositorySupplier.get();
+
+ if (repository == null) {
+ return 0;
+ }
+
+ return repository.getAllItems().stream().mapToInt(r -> r.count).sum();
+ }
+
+ @Override
+ public int getPriority() {
+ return externalStorage.getPriority();
+ }
+
+ @Override
+ public AccessType getAccessType() {
+ return externalStorage.getAccessType();
+ }
+
+ @Override
+ public int getCapacity() {
+ IItemRepository repository = repositorySupplier.get();
+
+ if (repository == null) {
+ return 0;
+ }
+
+ int capacity = 0;
+
+ for (IItemRepository.ItemRecord record : repository.getAllItems()) {
+ capacity += repository.getItemCapacity(record.itemPrototype);
+ }
+
+ return capacity;
+ }
+}