diff --git a/CHANGELOG.md b/CHANGELOG.md
index 48911eeaf..79e99b23b 100755
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,7 +1,9 @@
# Refined Storage Changelog
### 0.7.16
+**Features**
- Added support for Storage Drawers void upgrade
+- Added support for Deep Storage Unit API again
### 0.7.15
**Bugfixes**
diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/IDeepStorageUnit.java b/src/main/java/powercrystals/minefactoryreloaded/api/IDeepStorageUnit.java
new file mode 100755
index 000000000..72696674b
--- /dev/null
+++ b/src/main/java/powercrystals/minefactoryreloaded/api/IDeepStorageUnit.java
@@ -0,0 +1,35 @@
+package powercrystals.minefactoryreloaded.api;
+
+import net.minecraft.item.ItemStack;
+
+public interface IDeepStorageUnit {
+
+ /**
+ * @return A populated ItemStack with stackSize for the full amount of
+ * materials in the DSU.
+ * May have a stackSize > getMaxStackSize(). May have a stackSize of
+ * 0 (indicating locked contents).
+ */
+ ItemStack getStoredItemType();
+
+ /**
+ * Sets the total amount of the item currently being stored, or zero if all
+ * items are to be removed.
+ */
+ void setStoredItemCount(int amount);
+
+ /**
+ * Sets the type of the stored item and initializes the number of stored
+ * items to amount.
+ *
+ * Will overwrite any existing stored items.
+ */
+ void setStoredItemType(ItemStack type, int amount);
+
+ /**
+ * @return The maximum number of items the DSU can hold.
+ * May change based on the current type stored.
+ */
+ int getMaxStoredCount();
+
+}
\ No newline at end of file
diff --git a/src/main/java/refinedstorage/tile/externalstorage/DeepStorageUnitStorage.java b/src/main/java/refinedstorage/tile/externalstorage/DeepStorageUnitStorage.java
new file mode 100755
index 000000000..ed5c78499
--- /dev/null
+++ b/src/main/java/refinedstorage/tile/externalstorage/DeepStorageUnitStorage.java
@@ -0,0 +1,110 @@
+package refinedstorage.tile.externalstorage;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.items.ItemHandlerHelper;
+import powercrystals.minefactoryreloaded.api.IDeepStorageUnit;
+import refinedstorage.RefinedStorageUtils;
+import refinedstorage.tile.config.ModeFilter;
+
+import javax.annotation.Nonnull;
+import java.util.List;
+
+public class DeepStorageUnitStorage extends ExternalStorage {
+ private TileExternalStorage externalStorage;
+ private IDeepStorageUnit unit;
+
+ public DeepStorageUnitStorage(TileExternalStorage externalStorage, IDeepStorageUnit unit) {
+ this.externalStorage = externalStorage;
+ this.unit = unit;
+ }
+
+ @Override
+ public int getCapacity() {
+ return unit.getMaxStoredCount();
+ }
+
+ @Override
+ public void addItems(List items) {
+ if (unit.getStoredItemType() != null && unit.getStoredItemType().stackSize > 0) {
+ items.add(unit.getStoredItemType().copy());
+ }
+ }
+
+ @Override
+ public ItemStack push(@Nonnull ItemStack stack, int size, boolean simulate) {
+ if (ModeFilter.respectsMode(externalStorage.getFilters(), externalStorage, externalStorage.getCompare(), stack)) {
+ if (unit.getStoredItemType() != null) {
+ if (RefinedStorageUtils.compareStackNoQuantity(unit.getStoredItemType(), stack)) {
+ if (getStored() + size > unit.getMaxStoredCount()) {
+ int remainingSpace = getCapacity() - getStored();
+
+ if (remainingSpace <= 0) {
+ return ItemHandlerHelper.copyStackWithSize(stack, size);
+ }
+
+ if (!simulate) {
+ unit.setStoredItemCount(unit.getStoredItemType().stackSize + remainingSpace);
+ }
+
+ return ItemHandlerHelper.copyStackWithSize(stack, size - remainingSpace);
+ } else {
+ if (!simulate) {
+ unit.setStoredItemCount(unit.getStoredItemType().stackSize + size);
+ }
+
+ return null;
+ }
+ }
+ } else {
+ if (getStored() + size > unit.getMaxStoredCount()) {
+ int remainingSpace = getCapacity() - getStored();
+
+ if (remainingSpace <= 0) {
+ return ItemHandlerHelper.copyStackWithSize(stack, size);
+ }
+
+ if (!simulate) {
+ unit.setStoredItemType(stack.copy(), remainingSpace);
+ }
+
+ return ItemHandlerHelper.copyStackWithSize(stack, size - remainingSpace);
+ } else {
+ if (!simulate) {
+ unit.setStoredItemType(stack.copy(), size);
+ }
+
+ return null;
+ }
+ }
+ }
+
+ return ItemHandlerHelper.copyStackWithSize(stack, size);
+ }
+
+ @Override
+ public ItemStack take(@Nonnull ItemStack stack, int size, int flags) {
+ if (RefinedStorageUtils.compareStack(stack, unit.getStoredItemType(), flags)) {
+ if (size > unit.getStoredItemType().stackSize) {
+ size = unit.getStoredItemType().stackSize;
+ }
+
+ ItemStack stored = unit.getStoredItemType();
+
+ unit.setStoredItemCount(stored.stackSize - size);
+
+ return ItemHandlerHelper.copyStackWithSize(stored, size);
+ }
+
+ return null;
+ }
+
+ @Override
+ public int getStored() {
+ return unit.getStoredItemType() != null ? unit.getStoredItemType().stackSize : 0;
+ }
+
+ @Override
+ public int getPriority() {
+ return externalStorage.getPriority();
+ }
+}
diff --git a/src/main/java/refinedstorage/tile/externalstorage/TileExternalStorage.java b/src/main/java/refinedstorage/tile/externalstorage/TileExternalStorage.java
index 360c891f5..5fdec1d2f 100755
--- a/src/main/java/refinedstorage/tile/externalstorage/TileExternalStorage.java
+++ b/src/main/java/refinedstorage/tile/externalstorage/TileExternalStorage.java
@@ -5,9 +5,11 @@ import com.jaquadro.minecraft.storagedrawers.api.storage.IDrawerGroup;
import io.netty.buffer.ByteBuf;
import net.minecraft.inventory.Container;
import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumFacing;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.items.IItemHandler;
+import powercrystals.minefactoryreloaded.api.IDeepStorageUnit;
import refinedstorage.RefinedStorage;
import refinedstorage.RefinedStorageUtils;
import refinedstorage.api.RefinedStorageCapabilities;
@@ -145,8 +147,10 @@ public class TileExternalStorage extends TileMachine implements IStorageProvider
@Override
public void provide(List storages) {
- if (getFacingTile() instanceof IDrawerGroup) {
- IDrawerGroup group = (IDrawerGroup) getFacingTile();
+ TileEntity facing = getFacingTile();
+
+ if (facing instanceof IDrawerGroup) {
+ IDrawerGroup group = (IDrawerGroup) facing;
energyUsage = group.getDrawerCount();
stored = 0;
@@ -162,8 +166,16 @@ public class TileExternalStorage extends TileMachine implements IStorageProvider
capacity += storage.getCapacity();
}
}
- } else if (getFacingTile() instanceof IDrawer) {
- DrawerStorage storage = new DrawerStorage(this, (IDrawer) getFacingTile());
+ } else if (facing instanceof IDrawer) {
+ DrawerStorage storage = new DrawerStorage(this, (IDrawer) facing);
+
+ storages.add(storage);
+
+ energyUsage = 1;
+ stored = storage.getStored();
+ capacity = storage.getCapacity();
+ } else if (facing instanceof IDeepStorageUnit) {
+ DeepStorageUnitStorage storage = new DeepStorageUnitStorage(this, (IDeepStorageUnit) facing);
storages.add(storage);
@@ -171,7 +183,7 @@ public class TileExternalStorage extends TileMachine implements IStorageProvider
stored = storage.getStored();
capacity = storage.getCapacity();
} else {
- IItemHandler handler = RefinedStorageUtils.getItemHandler(getFacingTile(), getDirection().getOpposite());
+ IItemHandler handler = RefinedStorageUtils.getItemHandler(facing, getDirection().getOpposite());
if (handler != null) {
ItemHandlerStorage storage = new ItemHandlerStorage(this, handler);
@@ -183,6 +195,8 @@ public class TileExternalStorage extends TileMachine implements IStorageProvider
capacity = storage.getCapacity();
} else {
energyUsage = 0;
+ stored = 0;
+ capacity = 0;
}
}
}