diff --git a/build.gradle b/build.gradle index 021084c19..8bd1910cc 100755 --- a/build.gradle +++ b/build.gradle @@ -44,6 +44,9 @@ repositories { maven { url "http://maven.cil.li" } + maven { + url "https://dl.bintray.com/jaquadro/dev" + } } dependencies { @@ -51,6 +54,9 @@ dependencies { runtime "mezz.jei:jei_1.12:4.7.1.71" deobfCompile "MCMultiPart2:MCMultiPart:2.2.2" // deobfCompile "li.cil.oc:OpenComputers:MC1.11.2-1.7.0.28:api" + deobfCompile "com.jaquadro.minecraft.storagedrawers:StorageDrawers:1.12-5.2.2:api" + // runtime "com.jaquadro.minecraft.storagedrawers:StorageDrawers:1.12-5.2.2" + // runtime "com.jaquadro.minecraft.chameleon:Chameleon:1.12-4.1.0" } processResources { @@ -70,7 +76,6 @@ processResources { jar { include "com/raoulvdberge/refinedstorage/**" - include "com/jaquadro/minecraft/storagedrawers/api/**" include "assets/**" include "mcmod.info" include "pack.mcmeta" 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 deleted file mode 100644 index c1e4a7502..000000000 --- a/src/main/java/com/jaquadro/minecraft/storagedrawers/api/capabilities/IItemRepository.java +++ /dev/null @@ -1,141 +0,0 @@ -package com.jaquadro.minecraft.storagedrawers.api.capabilities; - -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 (); - - /** - * 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 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, 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 - * @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, 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. - */ - class ItemRecord { - @Nonnull - public final ItemStack itemPrototype; - public final int count; - - public ItemRecord(@Nonnull ItemStack itemPrototype, int count) { - this.itemPrototype = itemPrototype; - 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/raoulvdberge/refinedstorage/RS.java b/src/main/java/com/raoulvdberge/refinedstorage/RS.java index e2caf2f34..b52f77648 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,);after:storagedrawers@[1.12-5.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.2,);"; 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 88d099aba..fac3dfc69 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,6 +1,7 @@ package com.raoulvdberge.refinedstorage.apiimpl.network.node.externalstorage; import com.jaquadro.minecraft.storagedrawers.api.capabilities.IItemRepository; +import com.jaquadro.minecraft.storagedrawers.api.storage.IDrawerGroup; import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.RSUtils; import com.raoulvdberge.refinedstorage.api.network.INetwork; @@ -33,8 +34,8 @@ import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; public class NetworkNodeExternalStorage extends NetworkNode implements IStorageProvider, IGuiStorage, IComparable, IFilterable, IPrioritizable, IType, IAccessType { - @CapabilityInject(IItemRepository.class) - private static final Capability ITEM_REPOSITORY_CAPABILITY = null; + @CapabilityInject(IDrawerGroup.class) + private static final Capability DRAWER_GROUP_CAPABILITY = null; public static final String ID = "external_storage"; @@ -201,11 +202,11 @@ public class NetworkNodeExternalStorage extends NetworkNode implements IStorageP } if (type == IType.ITEMS) { - if (facing.hasCapability(ITEM_REPOSITORY_CAPABILITY, getDirection().getOpposite())) { + if (facing.hasCapability(DRAWER_GROUP_CAPABILITY, getDirection().getOpposite())) { itemStorages.add(new StorageItemItemRepository(this, () -> { TileEntity f = getFacingTile(); - return (f != null && f.hasCapability(ITEM_REPOSITORY_CAPABILITY, getDirection().getOpposite())) ? f.getCapability(ITEM_REPOSITORY_CAPABILITY, getDirection().getOpposite()) : null; + return (f != null && f.hasCapability(DRAWER_GROUP_CAPABILITY, getDirection().getOpposite())) ? f.getCapability(DRAWER_GROUP_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/integration/storagedrawers/StorageItemItemRepository.java b/src/main/java/com/raoulvdberge/refinedstorage/integration/storagedrawers/StorageItemItemRepository.java index 9c1f19fbc..9ec16c197 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/integration/storagedrawers/StorageItemItemRepository.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/integration/storagedrawers/StorageItemItemRepository.java @@ -1,12 +1,16 @@ package com.raoulvdberge.refinedstorage.integration.storagedrawers; import com.jaquadro.minecraft.storagedrawers.api.capabilities.IItemRepository; +import com.jaquadro.minecraft.storagedrawers.api.storage.IDrawer; +import com.jaquadro.minecraft.storagedrawers.api.storage.IDrawerGroup; 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.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.CapabilityInject; import net.minecraftforge.items.ItemHandlerHelper; import javax.annotation.Nonnull; @@ -17,17 +21,20 @@ import java.util.function.Supplier; import java.util.stream.Collectors; public class StorageItemItemRepository extends StorageItemExternal { - private NetworkNodeExternalStorage externalStorage; - private Supplier repositorySupplier; + @CapabilityInject(IItemRepository.class) + private static final Capability ITEM_REPOSITORY_CAPABILITY = null; - public StorageItemItemRepository(NetworkNodeExternalStorage externalStorage, Supplier repositorySupplier) { + private NetworkNodeExternalStorage externalStorage; + private Supplier groupSupplier; + + public StorageItemItemRepository(NetworkNodeExternalStorage externalStorage, Supplier repositorySupplier) { this.externalStorage = externalStorage; - this.repositorySupplier = repositorySupplier; + this.groupSupplier = repositorySupplier; } @Override public Collection getStacks() { - IItemRepository repository = repositorySupplier.get(); + IItemRepository repository = getRepositoryFromSupplier(); if (repository == null) { return Collections.emptyList(); @@ -39,7 +46,7 @@ public class StorageItemItemRepository extends StorageItemExternal { @Nullable @Override public ItemStack insert(@Nonnull ItemStack stack, int size, boolean simulate) { - IItemRepository repository = repositorySupplier.get(); + IItemRepository repository = getRepositoryFromSupplier(); if (repository == null) { return stack; @@ -51,24 +58,18 @@ public class StorageItemItemRepository extends StorageItemExternal { @Nullable @Override public ItemStack extract(@Nonnull ItemStack stack, int size, int flags, boolean simulate) { - IItemRepository repository = repositorySupplier.get(); + IItemRepository repository = getRepositoryFromSupplier(); 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)); + return repository.extractItem(stack, size, simulate, s -> API.instance().getComparer().isEqual(stack, s, flags)); } @Override public int getStored() { - IItemRepository repository = repositorySupplier.get(); + IItemRepository repository = getRepositoryFromSupplier(); if (repository == null) { return 0; @@ -89,18 +90,34 @@ public class StorageItemItemRepository extends StorageItemExternal { @Override public int getCapacity() { - IItemRepository repository = repositorySupplier.get(); + IDrawerGroup group = groupSupplier.get(); - if (repository == null) { + if (group == null) { return 0; } - int capacity = 0; + long capacity = 0; - for (IItemRepository.ItemRecord record : repository.getAllItems()) { - capacity += repository.getItemCapacity(record.itemPrototype); + for (int slot : group.getAccessibleDrawerSlots()) { + IDrawer drawer = group.getDrawer(slot); + if (drawer.isEnabled()) { + capacity += drawer.getMaxCapacity(); + } } - return capacity; + if (capacity >= Integer.MAX_VALUE) { + return Integer.MAX_VALUE; + } + + return (int)capacity; + } + + private IItemRepository getRepositoryFromSupplier() { + IDrawerGroup group = groupSupplier.get(); + if (group == null) { + return null; + } + + return group.getCapability(ITEM_REPOSITORY_CAPABILITY, null); } }