Changed related to storage

- Removed support for the Deep Storage Unit API
- Performance improvements related to storage inserting and extracting, fixes #871
- Fixed crash with External Storage, fixes #1115
This commit is contained in:
raoulvdberge
2017-04-01 18:15:02 +02:00
parent fd700912f5
commit 69d92c4164
21 changed files with 92 additions and 309 deletions

View File

@@ -17,6 +17,9 @@
- Fixed controller model warning during launch (raoulvdberge) - Fixed controller model warning during launch (raoulvdberge)
- Improved memory usage of some models (raoulvdberge) - Improved memory usage of some models (raoulvdberge)
- Fixed not rendering some tooltips correctly (raoulvdberge) - Fixed not rendering some tooltips correctly (raoulvdberge)
- Removed support for the Deep Storage Unit API (raoulvdberge)
- Performance improvements related to storage inserting and extracting (raoulvdberge)
- Fixed crash with External Storage (raoulvdberge)
### 1.4.1 ### 1.4.1
- Added Storage Monitor (raoulvdberge) - Added Storage Monitor (raoulvdberge)

View File

@@ -6,9 +6,9 @@ import net.minecraftforge.fml.client.registry.ClientRegistry;
import org.lwjgl.input.Keyboard; import org.lwjgl.input.Keyboard;
public final class RSKeyBindings { public final class RSKeyBindings {
public static final KeyBinding focusSearchBar = new KeyBinding("key.refinedstorage.focusSearchBar", KeyConflictContext.GUI, Keyboard.KEY_TAB, "Refined Storage"); public static final KeyBinding FOCUS_SEARCH_BAR = new KeyBinding("key.refinedstorage.focusSearchBar", KeyConflictContext.GUI, Keyboard.KEY_TAB, "Refined Storage");
public static void init() { public static void init() {
ClientRegistry.registerKeyBinding(focusSearchBar); ClientRegistry.registerKeyBinding(FOCUS_SEARCH_BAR);
} }
} }

View File

@@ -55,22 +55,12 @@ import javax.annotation.Nullable;
import java.math.RoundingMode; import java.math.RoundingMode;
import java.text.DecimalFormat; import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols; import java.text.DecimalFormatSymbols;
import java.util.*; import java.util.Collection;
import java.util.function.BiConsumer; import java.util.List;
import java.util.function.BinaryOperator; import java.util.Locale;
import java.util.function.Function; import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Collector;
public final class RSUtils { public final class RSUtils {
private static final NonNullList EMPTY_NON_NULL_LIST = new NonNullList<Object>(Collections.emptyList(), null) {
};
@SuppressWarnings("unchecked")
public static <T> NonNullList<T> emptyNonNullList() {
return (NonNullList<T>) EMPTY_NON_NULL_LIST;
}
public static final ItemStack EMPTY_BUCKET = new ItemStack(Items.BUCKET); public static final ItemStack EMPTY_BUCKET = new ItemStack(Items.BUCKET);
public static final DecimalFormat QUANTITY_FORMATTER = new DecimalFormat("####0.#", DecimalFormatSymbols.getInstance(Locale.US)); public static final DecimalFormat QUANTITY_FORMATTER = new DecimalFormat("####0.#", DecimalFormatSymbols.getInstance(Locale.US));
@@ -549,42 +539,4 @@ public final class RSUtils {
vertexBuffer.pos(xCoord, yCoord + maskTop, zLevel).tex(uMin, vMin).endVertex(); vertexBuffer.pos(xCoord, yCoord + maskTop, zLevel).tex(uMin, vMin).endVertex();
tessellator.draw(); tessellator.draw();
} }
public static <T> Collector<T, ?, NonNullList<T>> toNonNullList() {
return new Collector<T, NonNullList<T>, NonNullList<T>>() {
@Override
public Supplier<NonNullList<T>> supplier() {
return NonNullList::create;
}
@Override
public BiConsumer<NonNullList<T>, T> accumulator() {
return (list, item) -> {
if (item != null) {
list.add(item);
}
};
}
@Override
public BinaryOperator<NonNullList<T>> combiner() {
return (a, b) -> {
NonNullList<T> list = NonNullList.create();
a.forEach(list::add);
b.forEach(list::add);
return list;
};
}
@Override
public Function<NonNullList<T>, NonNullList<T>> finisher() {
return (list) -> list;
}
@Override
public Set<Characteristics> characteristics() {
return EnumSet.of(Characteristics.IDENTITY_FINISH);
}
};
}
} }

View File

@@ -1,16 +1,16 @@
package com.raoulvdberge.refinedstorage.api.storage; package com.raoulvdberge.refinedstorage.api.storage;
import com.raoulvdberge.refinedstorage.api.util.IComparer; import com.raoulvdberge.refinedstorage.api.util.IComparer;
import net.minecraft.util.NonNullList;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.Collection;
public interface IStorage<T> { public interface IStorage<T> {
/** /**
* @return stacks stored in this storage * @return stacks stored in this storage
*/ */
NonNullList<T> getStacks(); Collection<T> getStacks();
/** /**
* Inserts a stack to this storage. * Inserts a stack to this storage.

View File

@@ -7,11 +7,11 @@ import com.raoulvdberge.refinedstorage.api.storage.StorageDiskType;
import com.raoulvdberge.refinedstorage.tile.TileDiskDrive; import com.raoulvdberge.refinedstorage.tile.TileDiskDrive;
import com.raoulvdberge.refinedstorage.tile.config.IFilterable; import com.raoulvdberge.refinedstorage.tile.config.IFilterable;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.util.NonNullList;
import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidStack;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.Collection;
public class StorageFluidDiskDrive implements IStorageDisk<FluidStack> { public class StorageFluidDiskDrive implements IStorageDisk<FluidStack> {
private NetworkNodeDiskDrive diskDrive; private NetworkNodeDiskDrive diskDrive;
@@ -41,7 +41,7 @@ public class StorageFluidDiskDrive implements IStorageDisk<FluidStack> {
} }
@Override @Override
public NonNullList<FluidStack> getStacks() { public Collection<FluidStack> getStacks() {
return parent.getStacks(); return parent.getStacks();
} }

View File

@@ -7,11 +7,11 @@ import com.raoulvdberge.refinedstorage.api.storage.StorageDiskType;
import com.raoulvdberge.refinedstorage.tile.TileDiskDrive; import com.raoulvdberge.refinedstorage.tile.TileDiskDrive;
import com.raoulvdberge.refinedstorage.tile.config.IFilterable; import com.raoulvdberge.refinedstorage.tile.config.IFilterable;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.util.NonNullList;
import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.items.ItemHandlerHelper;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.Collection;
public class StorageItemDiskDrive implements IStorageDisk<ItemStack> { public class StorageItemDiskDrive implements IStorageDisk<ItemStack> {
private NetworkNodeDiskDrive diskDrive; private NetworkNodeDiskDrive diskDrive;
@@ -41,7 +41,7 @@ public class StorageItemDiskDrive implements IStorageDisk<ItemStack> {
} }
@Override @Override
public NonNullList<ItemStack> getStacks() { public Collection<ItemStack> getStacks() {
return parent.getStacks(); return parent.getStacks();
} }

View File

@@ -168,9 +168,7 @@ public class NetworkNodeDiskManipulator extends NetworkNode implements IComparab
return; return;
} }
for (int i = 0; i < storage.getStacks().size(); i++) { for (ItemStack stack : storage.getStacks()) {
ItemStack stack = storage.getStacks().get(i);
ItemStack extracted = storage.extract(stack, upgrades.getItemInteractCount(), compare, false); ItemStack extracted = storage.extract(stack, upgrades.getItemInteractCount(), compare, false);
if (extracted == null) { if (extracted == null) {
continue; continue;
@@ -245,11 +243,13 @@ public class NetworkNodeDiskManipulator extends NetworkNode implements IComparab
} }
FluidStack extracted = null; FluidStack extracted = null;
int i = 0;
while (extracted == null && storage.getStacks().size() > i) { for (FluidStack stack : storage.getStacks()) {
FluidStack stack = storage.getStacks().get(i++);
extracted = storage.extract(stack, upgrades.getItemInteractCount(), compare, false); extracted = storage.extract(stack, upgrades.getItemInteractCount(), compare, false);
if (extracted != null) {
break;
}
} }
if (extracted == null) { if (extracted == null) {

View File

@@ -6,11 +6,11 @@ import com.raoulvdberge.refinedstorage.api.storage.StorageDiskType;
import com.raoulvdberge.refinedstorage.tile.TileDiskDrive; import com.raoulvdberge.refinedstorage.tile.TileDiskDrive;
import com.raoulvdberge.refinedstorage.tile.config.IFilterable; import com.raoulvdberge.refinedstorage.tile.config.IFilterable;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.util.NonNullList;
import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidStack;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.Collection;
public class StorageFluidDiskManipulator implements IStorageDisk<FluidStack> { public class StorageFluidDiskManipulator implements IStorageDisk<FluidStack> {
private NetworkNodeDiskManipulator diskManipulator; private NetworkNodeDiskManipulator diskManipulator;
@@ -70,7 +70,7 @@ public class StorageFluidDiskManipulator implements IStorageDisk<FluidStack> {
} }
@Override @Override
public NonNullList<FluidStack> getStacks() { public Collection<FluidStack> getStacks() {
return parent.getStacks(); return parent.getStacks();
} }

View File

@@ -6,11 +6,11 @@ import com.raoulvdberge.refinedstorage.api.storage.StorageDiskType;
import com.raoulvdberge.refinedstorage.tile.TileDiskDrive; import com.raoulvdberge.refinedstorage.tile.TileDiskDrive;
import com.raoulvdberge.refinedstorage.tile.config.IFilterable; import com.raoulvdberge.refinedstorage.tile.config.IFilterable;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.util.NonNullList;
import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.items.ItemHandlerHelper;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.Collection;
public class StorageItemDiskManipulator implements IStorageDisk<ItemStack> { public class StorageItemDiskManipulator implements IStorageDisk<ItemStack> {
private NetworkNodeDiskManipulator diskManipulator; private NetworkNodeDiskManipulator diskManipulator;
@@ -70,7 +70,7 @@ public class StorageItemDiskManipulator implements IStorageDisk<ItemStack> {
} }
@Override @Override
public NonNullList<ItemStack> getStacks() { public Collection<ItemStack> getStacks() {
return parent.getStacks(); return parent.getStacks();
} }

View File

@@ -26,7 +26,6 @@ import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.fluids.capability.IFluidHandler;
import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandler;
import powercrystals.minefactoryreloaded.api.IDeepStorageUnit;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -203,12 +202,6 @@ public class NetworkNodeExternalStorage extends NetworkNode implements IStorageP
return f instanceof IDrawer ? (IDrawer) f : null; return f instanceof IDrawer ? (IDrawer) f : null;
})); }));
} else if (facing instanceof IDeepStorageUnit) {
itemStorages.add(new StorageItemDSU(this, () -> {
TileEntity f = getFacingTile();
return f instanceof IDeepStorageUnit ? (IDeepStorageUnit) f : null;
}));
} else if (IntegrationCyclopsCore.isLoaded() && StorageItemCyclops.isValid(facing, holder.getDirection().getOpposite())) { } else if (IntegrationCyclopsCore.isLoaded() && StorageItemCyclops.isValid(facing, holder.getDirection().getOpposite())) {
itemStorages.add(new StorageItemCyclops(this)); itemStorages.add(new StorageItemCyclops(this));
} else if (!(facing instanceof TileNode)) { } else if (!(facing instanceof TileNode)) {

View File

@@ -6,13 +6,14 @@ import com.raoulvdberge.refinedstorage.api.storage.IStorage;
import com.raoulvdberge.refinedstorage.api.util.IComparer; import com.raoulvdberge.refinedstorage.api.util.IComparer;
import com.raoulvdberge.refinedstorage.apiimpl.API; import com.raoulvdberge.refinedstorage.apiimpl.API;
import com.raoulvdberge.refinedstorage.tile.config.IFilterable; import com.raoulvdberge.refinedstorage.tile.config.IFilterable;
import net.minecraft.util.NonNullList;
import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.fluids.capability.IFluidHandler;
import net.minecraftforge.fluids.capability.IFluidTankProperties; import net.minecraftforge.fluids.capability.IFluidTankProperties;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.Collection;
import java.util.Collections;
import java.util.function.Supplier; import java.util.function.Supplier;
public class StorageFluidExternal implements IStorage<FluidStack> { public class StorageFluidExternal implements IStorage<FluidStack> {
@@ -37,8 +38,8 @@ public class StorageFluidExternal implements IStorage<FluidStack> {
} }
@Override @Override
public NonNullList<FluidStack> getStacks() { public Collection<FluidStack> getStacks() {
return getContents() == null ? RSUtils.emptyNonNullList() : NonNullList.withSize(1, getContents().copy()); return getContents() == null ? Collections.emptyList() : Collections.singletonList(getContents().copy());
} }
@Override @Override

View File

@@ -7,7 +7,6 @@ import com.raoulvdberge.refinedstorage.tile.config.IFilterable;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumFacing;
import net.minecraft.util.NonNullList;
import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.items.ItemHandlerHelper;
import org.cyclops.cyclopscore.inventory.IndexedSlotlessItemHandlerWrapper; import org.cyclops.cyclopscore.inventory.IndexedSlotlessItemHandlerWrapper;
import org.cyclops.cyclopscore.inventory.SimpleInventory; import org.cyclops.cyclopscore.inventory.SimpleInventory;
@@ -16,7 +15,10 @@ import org.cyclops.cyclopscore.tileentity.InventoryTileEntityBase;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.function.Supplier; import java.util.function.Supplier;
import java.util.stream.Collectors;
public class StorageItemCyclops extends StorageItemExternal { public class StorageItemCyclops extends StorageItemExternal {
private NetworkNodeExternalStorage externalStorage; private NetworkNodeExternalStorage externalStorage;
@@ -49,7 +51,7 @@ public class StorageItemCyclops extends StorageItemExternal {
} }
@Override @Override
public NonNullList<ItemStack> getStacks() { public Collection<ItemStack> getStacks() {
return getStacks(cyclopsInv.get()); return getStacks(cyclopsInv.get());
} }
@@ -90,7 +92,7 @@ public class StorageItemCyclops extends StorageItemExternal {
return inv != null ? RSUtils.transformEmptyToNull(SlotlessItemHandlerHelper.extractItem(inv, opposite, stack, size, flags, simulate)) : null; return inv != null ? RSUtils.transformEmptyToNull(SlotlessItemHandlerHelper.extractItem(inv, opposite, stack, size, flags, simulate)) : null;
} }
private NonNullList<ItemStack> getStacks(@Nullable InventoryTileEntityBase inv) { private Collection<ItemStack> getStacks(@Nullable InventoryTileEntityBase inv) {
if (inv != null) { if (inv != null) {
if (inv.getInventory() instanceof IndexedSlotlessItemHandlerWrapper.IInventoryIndexReference) { if (inv.getInventory() instanceof IndexedSlotlessItemHandlerWrapper.IInventoryIndexReference) {
return ((IndexedSlotlessItemHandlerWrapper.IInventoryIndexReference) inv.getInventory()) return ((IndexedSlotlessItemHandlerWrapper.IInventoryIndexReference) inv.getInventory())
@@ -99,14 +101,14 @@ public class StorageItemCyclops extends StorageItemExternal {
.stream() .stream()
.flatMap(m -> m.valueCollection().stream()) .flatMap(m -> m.valueCollection().stream())
.map(ItemStack::copy) .map(ItemStack::copy)
.collect(RSUtils.toNonNullList()); .collect(Collectors.toList());
} else { } else {
return Arrays.stream(((SimpleInventory) inv.getInventory()).getItemStacks()) return Arrays.stream(((SimpleInventory) inv.getInventory()).getItemStacks())
.map(ItemStack::copy) .map(ItemStack::copy)
.collect(RSUtils.toNonNullList()); .collect(Collectors.toList());
} }
} else { } else {
return RSUtils.emptyNonNullList(); return Collections.emptyList();
} }
} }

View File

@@ -1,144 +0,0 @@
package com.raoulvdberge.refinedstorage.apiimpl.network.node.externalstorage;
import com.raoulvdberge.refinedstorage.RSUtils;
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.minecraft.util.NonNullList;
import net.minecraftforge.items.ItemHandlerHelper;
import powercrystals.minefactoryreloaded.api.IDeepStorageUnit;
import javax.annotation.Nonnull;
import java.util.function.Supplier;
public class StorageItemDSU extends StorageItemExternal {
private NetworkNodeExternalStorage externalStorage;
private Supplier<IDeepStorageUnit> dsuSupplier;
public StorageItemDSU(NetworkNodeExternalStorage externalStorage, Supplier<IDeepStorageUnit> dsuSupplier) {
this.externalStorage = externalStorage;
this.dsuSupplier = dsuSupplier;
}
@Override
public int getCapacity() {
IDeepStorageUnit dsu = dsuSupplier.get();
return dsu != null ? dsu.getMaxStoredCount() : 0;
}
@Override
public NonNullList<ItemStack> getStacks() {
IDeepStorageUnit dsu = dsuSupplier.get();
if (dsu != null) {
ItemStack stored = dsu.getStoredItemType();
if (stored != null && stored.getCount() > 0) {
return NonNullList.withSize(1, stored.copy());
}
}
return RSUtils.emptyNonNullList();
}
@Override
public ItemStack insert(@Nonnull ItemStack stack, int size, boolean simulate) {
IDeepStorageUnit dsu = dsuSupplier.get();
if (dsu != null && IFilterable.canTake(externalStorage.getItemFilters(), externalStorage.getMode(), externalStorage.getCompare(), stack)) {
if (dsu.getStoredItemType() != null) {
if (API.instance().getComparer().isEqualNoQuantity(dsu.getStoredItemType(), stack)) {
if (getStored() + size > dsu.getMaxStoredCount()) {
int remainingSpace = getCapacity() - getStored();
if (remainingSpace <= 0) {
return ItemHandlerHelper.copyStackWithSize(stack, size);
}
if (!simulate) {
dsu.setStoredItemCount(dsu.getStoredItemType().getCount() + remainingSpace);
}
return ItemHandlerHelper.copyStackWithSize(stack, size - remainingSpace);
} else {
if (!simulate) {
dsu.setStoredItemCount(dsu.getStoredItemType().getCount() + size);
}
return null;
}
}
} else {
if (getStored() + size > dsu.getMaxStoredCount()) {
int remainingSpace = getCapacity() - getStored();
if (remainingSpace <= 0) {
return ItemHandlerHelper.copyStackWithSize(stack, size);
}
if (!simulate) {
dsu.setStoredItemType(stack.copy(), remainingSpace);
}
return ItemHandlerHelper.copyStackWithSize(stack, size - remainingSpace);
} else {
if (!simulate) {
dsu.setStoredItemType(stack.copy(), size);
}
return null;
}
}
}
return ItemHandlerHelper.copyStackWithSize(stack, size);
}
@Override
public ItemStack extract(@Nonnull ItemStack stack, int size, int flags, boolean simulate) {
IDeepStorageUnit dsu = dsuSupplier.get();
if (dsu != null && API.instance().getComparer().isEqual(stack, dsu.getStoredItemType(), flags)) {
ItemStack stored = dsu.getStoredItemType();
if (size > stored.getCount()) {
size = stored.getCount();
}
if (!simulate) {
dsu.setStoredItemCount(stored.getCount() - size);
}
return ItemHandlerHelper.copyStackWithSize(stored, size);
}
return null;
}
@Override
public int getStored() {
IDeepStorageUnit dsu = dsuSupplier.get();
if (dsu != null) {
ItemStack stored = dsu.getStoredItemType();
if (stored != null) {
return stored.getCount();
}
}
return 0;
}
@Override
public int getPriority() {
return externalStorage.getPriority();
}
@Override
public AccessType getAccessType() {
return externalStorage.getAccessType();
}
}

View File

@@ -2,16 +2,16 @@ package com.raoulvdberge.refinedstorage.apiimpl.network.node.externalstorage;
import com.jaquadro.minecraft.storagedrawers.api.storage.IDrawer; import com.jaquadro.minecraft.storagedrawers.api.storage.IDrawer;
import com.jaquadro.minecraft.storagedrawers.api.storage.attribute.IVoidable; import com.jaquadro.minecraft.storagedrawers.api.storage.attribute.IVoidable;
import com.raoulvdberge.refinedstorage.RSUtils;
import com.raoulvdberge.refinedstorage.api.storage.AccessType; import com.raoulvdberge.refinedstorage.api.storage.AccessType;
import com.raoulvdberge.refinedstorage.apiimpl.API; import com.raoulvdberge.refinedstorage.apiimpl.API;
import com.raoulvdberge.refinedstorage.tile.config.IFilterable; import com.raoulvdberge.refinedstorage.tile.config.IFilterable;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.util.NonNullList;
import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.items.ItemHandlerHelper;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.Collection;
import java.util.Collections;
import java.util.function.Supplier; import java.util.function.Supplier;
public class StorageItemDrawer extends StorageItemExternal { public class StorageItemDrawer extends StorageItemExternal {
@@ -31,8 +31,8 @@ public class StorageItemDrawer extends StorageItemExternal {
} }
@Override @Override
public NonNullList<ItemStack> getStacks() { public Collection<ItemStack> getStacks() {
return getStacks(drawerSupplier.get()); return Collections.singletonList(getStack(drawerSupplier.get()));
} }
@Override @Override
@@ -62,12 +62,12 @@ public class StorageItemDrawer extends StorageItemExternal {
return externalStorage.getAccessType(); return externalStorage.getAccessType();
} }
public static NonNullList<ItemStack> getStacks(@Nullable IDrawer drawer) { public static ItemStack getStack(@Nullable IDrawer drawer) {
if (drawer != null && !drawer.isEmpty() && drawer.getStoredItemCount() > 0) { if (drawer != null && !drawer.isEmpty() && drawer.getStoredItemCount() > 0) {
return NonNullList.withSize(1, ItemHandlerHelper.copyStackWithSize(drawer.getStoredItemPrototype(), drawer.getStoredItemCount())); return ItemHandlerHelper.copyStackWithSize(drawer.getStoredItemPrototype(), drawer.getStoredItemCount());
} }
return RSUtils.emptyNonNullList(); return ItemStack.EMPTY;
} }
public static ItemStack insert(NetworkNodeExternalStorage externalStorage, @Nullable IDrawer drawer, @Nonnull ItemStack stack, int size, boolean simulate) { public static ItemStack insert(NetworkNodeExternalStorage externalStorage, @Nullable IDrawer drawer, @Nonnull ItemStack stack, int size, boolean simulate) {

View File

@@ -2,13 +2,15 @@ package com.raoulvdberge.refinedstorage.apiimpl.network.node.externalstorage;
import com.jaquadro.minecraft.storagedrawers.api.storage.IDrawer; import com.jaquadro.minecraft.storagedrawers.api.storage.IDrawer;
import com.jaquadro.minecraft.storagedrawers.api.storage.IDrawerGroup; import com.jaquadro.minecraft.storagedrawers.api.storage.IDrawerGroup;
import com.raoulvdberge.refinedstorage.RSUtils;
import com.raoulvdberge.refinedstorage.api.storage.AccessType; import com.raoulvdberge.refinedstorage.api.storage.AccessType;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.util.NonNullList;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; 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; import java.util.function.Supplier;
public class StorageItemDrawerGroup extends StorageItemExternal { public class StorageItemDrawerGroup extends StorageItemExternal {
@@ -21,20 +23,20 @@ public class StorageItemDrawerGroup extends StorageItemExternal {
} }
@Override @Override
public NonNullList<ItemStack> getStacks() { public Collection<ItemStack> getStacks() {
IDrawerGroup group = groupSupplier.get(); IDrawerGroup group = groupSupplier.get();
if (group == null) { if (group == null) {
return RSUtils.emptyNonNullList(); return Collections.emptyList();
} }
NonNullList<ItemStack> stacks = NonNullList.create(); List<ItemStack> stacks = new ArrayList<>();
for (int i = 0; i < group.getDrawerCount(); ++i) { for (int i = 0; i < group.getDrawerCount(); ++i) {
IDrawer drawer = group.getDrawer(i); IDrawer drawer = group.getDrawer(i);
if (group.isDrawerEnabled(i)) { if (group.isDrawerEnabled(i)) {
stacks.addAll(StorageItemDrawer.getStacks(drawer)); stacks.add(StorageItemDrawer.getStack(drawer));
} }
} }

View File

@@ -7,6 +7,7 @@ import com.raoulvdberge.refinedstorage.apiimpl.API;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.List; import java.util.List;
public abstract class StorageItemExternal implements IStorage<ItemStack> { public abstract class StorageItemExternal implements IStorage<ItemStack> {
@@ -21,12 +22,12 @@ public abstract class StorageItemExternal implements IStorage<ItemStack> {
} }
if (cache == null) { if (cache == null) {
cache = getStacks(); cache = new ArrayList<>(getStacks());
return; return;
} }
List<ItemStack> newStacks = getStacks(); List<ItemStack> newStacks = new ArrayList<>(getStacks());
for (int i = 0; i < newStacks.size(); ++i) { for (int i = 0; i < newStacks.size(); ++i) {
ItemStack actual = newStacks.get(i); ItemStack actual = newStacks.get(i);

View File

@@ -5,11 +5,14 @@ import com.raoulvdberge.refinedstorage.api.storage.AccessType;
import com.raoulvdberge.refinedstorage.apiimpl.API; import com.raoulvdberge.refinedstorage.apiimpl.API;
import com.raoulvdberge.refinedstorage.tile.config.IFilterable; import com.raoulvdberge.refinedstorage.tile.config.IFilterable;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.util.NonNullList;
import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.items.ItemHandlerHelper;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.function.Supplier; import java.util.function.Supplier;
public class StorageItemItemHandler extends StorageItemExternal { public class StorageItemItemHandler extends StorageItemExternal {
@@ -34,17 +37,17 @@ public class StorageItemItemHandler extends StorageItemExternal {
} }
@Override @Override
public NonNullList<ItemStack> getStacks() { public Collection<ItemStack> getStacks() {
IItemHandler handler = handlerSupplier.get(); IItemHandler handler = handlerSupplier.get();
if (handler == null) { if (handler == null) {
return RSUtils.emptyNonNullList(); return Collections.emptyList();
} }
NonNullList<ItemStack> stacks = NonNullList.withSize(handler.getSlots(), ItemStack.EMPTY); List<ItemStack> stacks = new ArrayList<>();
for (int i = 0; i < handler.getSlots(); ++i) { for (int i = 0; i < handler.getSlots(); ++i) {
stacks.set(i, handler.getStackInSlot(i).copy()); stacks.add(handler.getStackInSlot(i).copy());
} }
return stacks; return stacks;

View File

@@ -1,5 +1,7 @@
package com.raoulvdberge.refinedstorage.apiimpl.storage; package com.raoulvdberge.refinedstorage.apiimpl.storage;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap;
import com.raoulvdberge.refinedstorage.RSUtils; import com.raoulvdberge.refinedstorage.RSUtils;
import com.raoulvdberge.refinedstorage.api.storage.AccessType; import com.raoulvdberge.refinedstorage.api.storage.AccessType;
import com.raoulvdberge.refinedstorage.api.storage.IStorageDisk; import com.raoulvdberge.refinedstorage.api.storage.IStorageDisk;
@@ -8,11 +10,12 @@ import com.raoulvdberge.refinedstorage.apiimpl.API;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList; import net.minecraft.nbt.NBTTagList;
import net.minecraft.util.NonNullList; import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidStack;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.Collection;
public class StorageDiskFluid implements IStorageDisk<FluidStack> { public class StorageDiskFluid implements IStorageDisk<FluidStack> {
private static final int PROTOCOL = 1; private static final int PROTOCOL = 1;
@@ -25,7 +28,7 @@ public class StorageDiskFluid implements IStorageDisk<FluidStack> {
private NBTTagCompound tag; private NBTTagCompound tag;
private int capacity; private int capacity;
private NonNullList<FluidStack> stacks = NonNullList.create(); private Multimap<Fluid, FluidStack> stacks = ArrayListMultimap.create();
private Runnable listener = () -> { private Runnable listener = () -> {
}; };
@@ -47,7 +50,7 @@ public class StorageDiskFluid implements IStorageDisk<FluidStack> {
FluidStack stack = FluidStack.loadFluidStackFromNBT(list.getCompoundTagAt(i)); FluidStack stack = FluidStack.loadFluidStackFromNBT(list.getCompoundTagAt(i));
if (stack != null) { if (stack != null) {
stacks.add(stack); stacks.put(stack.getFluid(), stack);
} }
} }
} }
@@ -56,7 +59,7 @@ public class StorageDiskFluid implements IStorageDisk<FluidStack> {
public void writeToNBT() { public void writeToNBT() {
NBTTagList list = new NBTTagList(); NBTTagList list = new NBTTagList();
for (FluidStack stack : stacks) { for (FluidStack stack : stacks.values()) {
list.appendTag(stack.writeToNBT(new NBTTagCompound())); list.appendTag(stack.writeToNBT(new NBTTagCompound()));
} }
@@ -70,14 +73,14 @@ public class StorageDiskFluid implements IStorageDisk<FluidStack> {
} }
@Override @Override
public NonNullList<FluidStack> getStacks() { public Collection<FluidStack> getStacks() {
return stacks; return stacks.values();
} }
@Override @Override
@Nullable @Nullable
public synchronized FluidStack insert(@Nonnull FluidStack stack, int size, boolean simulate) { public synchronized FluidStack insert(@Nonnull FluidStack stack, int size, boolean simulate) {
for (FluidStack otherStack : stacks) { for (FluidStack otherStack : stacks.get(stack.getFluid())) {
if (otherStack.isFluidEqual(stack)) { if (otherStack.isFluidEqual(stack)) {
if (getCapacity() != -1 && getStored() + size > getCapacity()) { if (getCapacity() != -1 && getStored() + size > getCapacity()) {
int remainingSpace = getCapacity() - getStored(); int remainingSpace = getCapacity() - getStored();
@@ -127,7 +130,7 @@ public class StorageDiskFluid implements IStorageDisk<FluidStack> {
if (!simulate) { if (!simulate) {
tag.setInteger(NBT_STORED, getStored() + remainingSpace); tag.setInteger(NBT_STORED, getStored() + remainingSpace);
stacks.add(RSUtils.copyStackWithSize(stack, remainingSpace)); stacks.put(stack.getFluid(), RSUtils.copyStackWithSize(stack, remainingSpace));
listener.run(); listener.run();
} }
@@ -137,7 +140,7 @@ public class StorageDiskFluid implements IStorageDisk<FluidStack> {
if (!simulate) { if (!simulate) {
tag.setInteger(NBT_STORED, getStored() + size); tag.setInteger(NBT_STORED, getStored() + size);
stacks.add(RSUtils.copyStackWithSize(stack, size)); stacks.put(stack.getFluid(), RSUtils.copyStackWithSize(stack, size));
listener.run(); listener.run();
} }
@@ -149,7 +152,7 @@ public class StorageDiskFluid implements IStorageDisk<FluidStack> {
@Override @Override
@Nullable @Nullable
public synchronized FluidStack extract(@Nonnull FluidStack stack, int size, int flags, boolean simulate) { public synchronized FluidStack extract(@Nonnull FluidStack stack, int size, int flags, boolean simulate) {
for (FluidStack otherStack : stacks) { for (FluidStack otherStack : stacks.get(stack.getFluid())) {
if (API.instance().getComparer().isEqual(otherStack, stack, flags)) { if (API.instance().getComparer().isEqual(otherStack, stack, flags)) {
if (size > otherStack.amount) { if (size > otherStack.amount) {
size = otherStack.amount; size = otherStack.amount;
@@ -157,7 +160,7 @@ public class StorageDiskFluid implements IStorageDisk<FluidStack> {
if (!simulate) { if (!simulate) {
if (otherStack.amount - size == 0) { if (otherStack.amount - size == 0) {
stacks.remove(otherStack); stacks.remove(otherStack.getFluid(), otherStack);
} else { } else {
otherStack.amount -= size; otherStack.amount -= size;
} }
@@ -223,7 +226,7 @@ public class StorageDiskFluid implements IStorageDisk<FluidStack> {
NBTTagCompound otherTag = new NBTTagCompound(); NBTTagCompound otherTag = new NBTTagCompound();
otherTag.setInteger(NBT_STORED, getStored(tag)); otherTag.setInteger(NBT_STORED, getStored(tag));
otherTag.setTag(NBT_FLUIDS, new NBTTagList()); // To circumvent not being able to insert disks in Disk Drives (see FluidStorageNBT#isValid(ItemStack)). otherTag.setTag(NBT_FLUIDS, new NBTTagList());
otherTag.setInteger(NBT_PROTOCOL, PROTOCOL); otherTag.setInteger(NBT_PROTOCOL, PROTOCOL);
return otherTag; return otherTag;

View File

@@ -1,5 +1,7 @@
package com.raoulvdberge.refinedstorage.apiimpl.storage; 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.AccessType;
import com.raoulvdberge.refinedstorage.api.storage.IStorage; import com.raoulvdberge.refinedstorage.api.storage.IStorage;
import com.raoulvdberge.refinedstorage.api.storage.IStorageDisk; import com.raoulvdberge.refinedstorage.api.storage.IStorageDisk;
@@ -9,11 +11,11 @@ import net.minecraft.item.Item;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList; import net.minecraft.nbt.NBTTagList;
import net.minecraft.util.NonNullList;
import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.items.ItemHandlerHelper;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.Collection;
/** /**
* A implementation of {@link IStorage<ItemStack>} that stores storage items in NBT. * A implementation of {@link IStorage<ItemStack>} that stores storage items in NBT.
@@ -38,7 +40,7 @@ public class StorageDiskItem implements IStorageDisk<ItemStack> {
private Runnable listener = () -> { private Runnable listener = () -> {
}; };
private NonNullList<ItemStack> stacks = NonNullList.create(); private Multimap<Item, ItemStack> 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 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
@@ -70,7 +72,7 @@ public class StorageDiskItem implements IStorageDisk<ItemStack> {
stack.setTagCompound(tag.hasKey(NBT_ITEM_NBT) ? tag.getCompoundTag(NBT_ITEM_NBT) : null); stack.setTagCompound(tag.hasKey(NBT_ITEM_NBT) ? tag.getCompoundTag(NBT_ITEM_NBT) : null);
if (!stack.isEmpty()) { if (!stack.isEmpty()) {
stacks.add(stack); stacks.put(stack.getItem(), stack);
} }
} }
} }
@@ -82,7 +84,7 @@ public class StorageDiskItem implements IStorageDisk<ItemStack> {
// Dummy value for extracting ForgeCaps // Dummy value for extracting ForgeCaps
NBTTagCompound dummy = new NBTTagCompound(); NBTTagCompound dummy = new NBTTagCompound();
for (ItemStack stack : stacks) { for (ItemStack stack : stacks.values()) {
NBTTagCompound itemTag = new NBTTagCompound(); NBTTagCompound itemTag = new NBTTagCompound();
itemTag.setInteger(NBT_ITEM_TYPE, Item.getIdFromItem(stack.getItem())); itemTag.setInteger(NBT_ITEM_TYPE, Item.getIdFromItem(stack.getItem()));
@@ -114,14 +116,14 @@ public class StorageDiskItem implements IStorageDisk<ItemStack> {
} }
@Override @Override
public NonNullList<ItemStack> getStacks() { public Collection<ItemStack> getStacks() {
return stacks; return stacks.values();
} }
@Override @Override
@Nullable @Nullable
public synchronized ItemStack insert(@Nonnull ItemStack stack, int size, boolean simulate) { public synchronized ItemStack insert(@Nonnull ItemStack stack, int size, boolean simulate) {
for (ItemStack otherStack : stacks) { for (ItemStack otherStack : stacks.get(stack.getItem())) {
if (API.instance().getComparer().isEqualNoQuantity(otherStack, stack)) { if (API.instance().getComparer().isEqualNoQuantity(otherStack, stack)) {
if (getCapacity() != -1 && getStored() + size > getCapacity()) { if (getCapacity() != -1 && getStored() + size > getCapacity()) {
int remainingSpace = getCapacity() - getStored(); int remainingSpace = getCapacity() - getStored();
@@ -171,7 +173,7 @@ public class StorageDiskItem implements IStorageDisk<ItemStack> {
if (!simulate) { if (!simulate) {
tag.setInteger(NBT_STORED, getStored() + remainingSpace); tag.setInteger(NBT_STORED, getStored() + remainingSpace);
stacks.add(ItemHandlerHelper.copyStackWithSize(stack, remainingSpace)); stacks.put(stack.getItem(), ItemHandlerHelper.copyStackWithSize(stack, remainingSpace));
listener.run(); listener.run();
} }
@@ -181,7 +183,7 @@ public class StorageDiskItem implements IStorageDisk<ItemStack> {
if (!simulate) { if (!simulate) {
tag.setInteger(NBT_STORED, getStored() + size); tag.setInteger(NBT_STORED, getStored() + size);
stacks.add(ItemHandlerHelper.copyStackWithSize(stack, size)); stacks.put(stack.getItem(), ItemHandlerHelper.copyStackWithSize(stack, size));
listener.run(); listener.run();
} }
@@ -193,7 +195,7 @@ public class StorageDiskItem implements IStorageDisk<ItemStack> {
@Override @Override
@Nullable @Nullable
public synchronized ItemStack extract(@Nonnull ItemStack stack, int size, int flags, boolean simulate) { public synchronized ItemStack extract(@Nonnull ItemStack stack, int size, int flags, boolean simulate) {
for (ItemStack otherStack : stacks) { for (ItemStack otherStack : stacks.get(stack.getItem())) {
if (API.instance().getComparer().isEqual(otherStack, stack, flags)) { if (API.instance().getComparer().isEqual(otherStack, stack, flags)) {
if (size > otherStack.getCount()) { if (size > otherStack.getCount()) {
size = otherStack.getCount(); size = otherStack.getCount();
@@ -201,7 +203,7 @@ public class StorageDiskItem implements IStorageDisk<ItemStack> {
if (!simulate) { if (!simulate) {
if (otherStack.getCount() - size == 0) { if (otherStack.getCount() - size == 0) {
stacks.remove(otherStack); stacks.remove(otherStack.getItem(), otherStack);
} else { } else {
otherStack.shrink(size); otherStack.shrink(size);
} }
@@ -267,7 +269,7 @@ public class StorageDiskItem implements IStorageDisk<ItemStack> {
NBTTagCompound otherTag = new NBTTagCompound(); NBTTagCompound otherTag = new NBTTagCompound();
otherTag.setInteger(NBT_STORED, getStored(tag)); otherTag.setInteger(NBT_STORED, getStored(tag));
otherTag.setTag(NBT_ITEMS, new NBTTagList()); // To circumvent not being able to insert disks in Disk Drives (see ItemStorageNBT#isValid(ItemStack)). otherTag.setTag(NBT_ITEMS, new NBTTagList());
otherTag.setInteger(NBT_PROTOCOL, PROTOCOL); otherTag.setInteger(NBT_PROTOCOL, PROTOCOL);
return otherTag; return otherTag;

View File

@@ -581,7 +581,7 @@ public class GuiGrid extends GuiBase implements IGridDisplay {
updateJEI(); updateJEI();
sortItems(); sortItems();
} else if (keyCode == RSKeyBindings.focusSearchBar.getKeyCode() && (grid.getSearchBoxMode() == NetworkNodeGrid.SEARCH_BOX_MODE_NORMAL || grid.getSearchBoxMode() == NetworkNodeGrid.SEARCH_BOX_MODE_JEI_SYNCHRONIZED)) { } else if (keyCode == RSKeyBindings.FOCUS_SEARCH_BAR.getKeyCode() && (grid.getSearchBoxMode() == NetworkNodeGrid.SEARCH_BOX_MODE_NORMAL || grid.getSearchBoxMode() == NetworkNodeGrid.SEARCH_BOX_MODE_JEI_SYNCHRONIZED)) {
searchField.setFocused(!searchField.isFocused()); searchField.setFocused(!searchField.isFocused());
} else { } else {
super.keyTyped(character, keyCode); super.keyTyped(character, keyCode);

View File

@@ -1,35 +0,0 @@
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. <br>
* 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.
* <p>
* Will overwrite any existing stored items.
*/
void setStoredItemType(ItemStack type, int amount);
/**
* @return The maximum number of items the DSU can hold. <br>
* May change based on the current type stored.
*/
int getMaxStoredCount();
}