Add specialized item storage for drawer groups, #591

This commit is contained in:
Raoul Van den Berge
2016-11-10 21:30:52 +01:00
parent 71e11909b9
commit da21752c40
6 changed files with 158 additions and 47 deletions

View File

@@ -161,7 +161,7 @@ public final class RSConfig {
wirelessGridExtractUsage = config.getInt("extract", WIRELESS_GRID, 3, 0, Integer.MAX_VALUE, "The energy used by the Wireless Grid to extract items"); wirelessGridExtractUsage = config.getInt("extract", WIRELESS_GRID, 3, 0, Integer.MAX_VALUE, "The energy used by the Wireless Grid to extract items");
//endregion //endregion
//region Wireless Grid //region Wireless Crafting Monitor
wirelessCraftingMonitorUsesEnergy = config.getBoolean("usesEnergy", WIRELESS_CRAFTING_MONITOR, true, "Whether the Wireless Crafting Monitor uses energy"); wirelessCraftingMonitorUsesEnergy = config.getBoolean("usesEnergy", WIRELESS_CRAFTING_MONITOR, true, "Whether the Wireless Crafting Monitor uses energy");
wirelessCraftingMonitorOpenUsage = config.getInt("open", WIRELESS_CRAFTING_MONITOR, 35, 0, Integer.MAX_VALUE, "The energy used by the Wireless Crafting Monitor to open"); wirelessCraftingMonitorOpenUsage = config.getInt("open", WIRELESS_CRAFTING_MONITOR, 35, 0, Integer.MAX_VALUE, "The energy used by the Wireless Crafting Monitor to open");
wirelessCraftingMonitorCancelUsage = config.getInt("cancel", WIRELESS_CRAFTING_MONITOR, 4, 0, Integer.MAX_VALUE, "The energy used by the Wireless Crafting Monitor to cancel a task"); wirelessCraftingMonitorCancelUsage = config.getInt("cancel", WIRELESS_CRAFTING_MONITOR, 4, 0, Integer.MAX_VALUE, "The energy used by the Wireless Crafting Monitor to cancel a task");

View File

@@ -571,7 +571,7 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
remainder = storage.insertItem(remainder, size, simulate); remainder = storage.insertItem(remainder, size, simulate);
} }
if (remainder == null || remainder.stackSize < 0) { if (remainder == null || remainder.stackSize <= 0) {
if (storage instanceof ItemStorageExternal && !simulate) { if (storage instanceof ItemStorageExternal && !simulate) {
((ItemStorageExternal) storage).updateForced(); ((ItemStorageExternal) storage).updateForced();
} }
@@ -600,6 +600,7 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
if (!simulate && inserted > 0 && accessType != AccessType.INSERT) { if (!simulate && inserted > 0 && accessType != AccessType.INSERT) {
itemStorage.add(stack, inserted, false); itemStorage.add(stack, inserted, false);
ItemStack checkSteps = ItemHandlerHelper.copyStackWithSize(stack, inserted); ItemStack checkSteps = ItemHandlerHelper.copyStackWithSize(stack, inserted);
for (ICraftingTask task : craftingTasks) { for (ICraftingTask task : craftingTasks) {

View File

@@ -27,6 +27,35 @@ public class ItemStorageDrawer extends ItemStorageExternal {
@Override @Override
public List<ItemStack> getStacks() { public List<ItemStack> getStacks() {
return getStacks(drawer);
}
@Override
public ItemStack insertItem(ItemStack stack, int size, boolean simulate) {
return insertItem(externalStorage, drawer, stack, size, simulate);
}
@Override
public ItemStack extractItem(ItemStack stack, int size, int flags, boolean simulate) {
return extractItem(drawer, stack, size, flags, simulate);
}
@Override
public int getStored() {
return drawer.getStoredItemCount();
}
@Override
public int getPriority() {
return externalStorage.getPriority();
}
@Override
public AccessType getAccessType() {
return externalStorage.getAccessType();
}
public static List<ItemStack> getStacks(IDrawer drawer) {
if (!drawer.isEmpty() && drawer.getStoredItemCount() > 0) { if (!drawer.isEmpty() && drawer.getStoredItemCount() > 0) {
return Collections.singletonList(drawer.getStoredItemCopy()); return Collections.singletonList(drawer.getStoredItemCopy());
} }
@@ -34,12 +63,11 @@ public class ItemStorageDrawer extends ItemStorageExternal {
return Collections.emptyList(); return Collections.emptyList();
} }
private boolean isVoidable() { public static boolean isVoidable(IDrawer drawer) {
return drawer instanceof IVoidable && ((IVoidable) drawer).isVoid(); return drawer instanceof IVoidable & ((IVoidable) drawer).isVoid();
} }
@Override public static ItemStack insertItem(TileExternalStorage externalStorage, IDrawer drawer, ItemStack stack, int size, boolean simulate) {
public ItemStack insertItem(ItemStack stack, int size, boolean simulate) {
if (IFilterable.canTake(externalStorage.getItemFilters(), externalStorage.getMode(), externalStorage.getCompare(), stack) && drawer.canItemBeStored(stack)) { if (IFilterable.canTake(externalStorage.getItemFilters(), externalStorage.getMode(), externalStorage.getCompare(), stack) && drawer.canItemBeStored(stack)) {
int stored = drawer.getStoredItemCount(); int stored = drawer.getStoredItemCount();
int remainingSpace = drawer.getMaxCapacity(stack) - stored; int remainingSpace = drawer.getMaxCapacity(stack) - stored;
@@ -60,7 +88,7 @@ public class ItemStorageDrawer extends ItemStorageExternal {
int returnSize = size - inserted; int returnSize = size - inserted;
if (isVoidable()) { if (isVoidable(drawer)) {
returnSize = -returnSize; returnSize = -returnSize;
} }
@@ -70,8 +98,7 @@ public class ItemStorageDrawer extends ItemStorageExternal {
return ItemHandlerHelper.copyStackWithSize(stack, size); return ItemHandlerHelper.copyStackWithSize(stack, size);
} }
@Override public static ItemStack extractItem(IDrawer drawer, ItemStack stack, int size, int flags, boolean simulate) {
public ItemStack extractItem(ItemStack stack, int size, int flags, boolean simulate) {
if (API.instance().getComparer().isEqual(stack, drawer.getStoredItemPrototype(), flags) && drawer.canItemBeExtracted(stack)) { if (API.instance().getComparer().isEqual(stack, drawer.getStoredItemPrototype(), flags) && drawer.canItemBeExtracted(stack)) {
if (size > drawer.getStoredItemCount()) { if (size > drawer.getStoredItemCount()) {
size = drawer.getStoredItemCount(); size = drawer.getStoredItemCount();
@@ -82,25 +109,10 @@ public class ItemStorageDrawer extends ItemStorageExternal {
if (!simulate) { if (!simulate) {
drawer.setStoredItemCount(drawer.getStoredItemCount() - size); drawer.setStoredItemCount(drawer.getStoredItemCount() - size);
} }
return ItemHandlerHelper.copyStackWithSize(stored, size); return ItemHandlerHelper.copyStackWithSize(stored, size);
} }
return null; return null;
} }
@Override
public int getStored() {
return drawer.getStoredItemCount();
}
@Override
public int getPriority() {
return externalStorage.getPriority();
}
@Override
public AccessType getAccessType() {
return externalStorage.getAccessType();
}
} }

View File

@@ -0,0 +1,113 @@
package com.raoulvdberge.refinedstorage.tile.externalstorage;
import com.jaquadro.minecraft.storagedrawers.api.storage.IDrawerGroup;
import net.minecraft.item.ItemStack;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;
public class ItemStorageDrawerGroup extends ItemStorageExternal {
private TileExternalStorage externalStorage;
private IDrawerGroup drawers;
public ItemStorageDrawerGroup(TileExternalStorage externalStorage, IDrawerGroup drawers) {
this.externalStorage = externalStorage;
this.drawers = drawers;
}
@Override
public List<ItemStack> getStacks() {
List<ItemStack> stacks = new ArrayList<>();
for (int i = 0; i < drawers.getDrawerCount(); ++i) {
if (drawers.isDrawerEnabled(i)) {
stacks.addAll(ItemStorageDrawer.getStacks(drawers.getDrawer(i)));
}
}
return stacks;
}
@Override
public int getStored() {
int stored = 0;
for (int i = 0; i < drawers.getDrawerCount(); ++i) {
if (drawers.isDrawerEnabled(i)) {
stored += drawers.getDrawer(i).getStoredItemCount();
}
}
return stored;
}
@Override
public int getPriority() {
return externalStorage.getPriority();
}
@Override
public int getCapacity() {
int capacity = 0;
for (int i = 0; i < drawers.getDrawerCount(); ++i) {
if (drawers.isDrawerEnabled(i)) {
capacity += drawers.getDrawer(i).getMaxCapacity();
}
}
return capacity;
}
@Nullable
@Override
public ItemStack insertItem(@Nonnull ItemStack stack, int size, boolean simulate) {
ItemStack remainder = stack;
for (int i = 0; i < drawers.getDrawerCount(); ++i) {
if (drawers.isDrawerEnabled(i)) {
remainder = ItemStorageDrawer.insertItem(externalStorage, drawers.getDrawer(i), stack, size, simulate);
if (remainder == null || remainder.stackSize <= 0) {
break;
} else {
size = remainder.stackSize;
}
}
}
return remainder;
}
@Nullable
@Override
public ItemStack extractItem(@Nonnull ItemStack stack, int size, int flags, boolean simulate) {
int toExtract = size;
ItemStack result = null;
for (int i = 0; i < drawers.getDrawerCount(); ++i) {
if (drawers.isDrawerEnabled(i)) {
ItemStack extracted = ItemStorageDrawer.extractItem(drawers.getDrawer(i), stack, toExtract, flags, simulate);
if (extracted != null) {
if (result == null) {
result = extracted;
} else {
result.stackSize += extracted.stackSize;
}
toExtract -= extracted.stackSize;
}
if (toExtract == 0) {
break;
}
}
}
return result;
}
}

View File

@@ -33,7 +33,7 @@ public abstract class ItemStorageExternal implements IItemStorage {
ItemStack cached = cache.get(i); ItemStack cached = cache.get(i);
if (cached != null && actual == null) { if (cached != null && actual == null) {
// If the cached is not null but the actual is, we removed this item // If the cached is not null but the actual is, we remove this item
network.getItemStorageCache().remove(cached, cached.stackSize); network.getItemStorageCache().remove(cached, cached.stackSize);
} else if (cached == null && actual != null) { } else if (cached == null && actual != null) {
// If the cached is null and the actual isn't, we added this item // If the cached is null and the actual isn't, we added this item
@@ -45,13 +45,12 @@ public abstract class ItemStorageExternal implements IItemStorage {
network.getItemStorageCache().remove(cached, cached.stackSize); network.getItemStorageCache().remove(cached, cached.stackSize);
network.getItemStorageCache().add(actual, actual.stackSize, false); network.getItemStorageCache().add(actual, actual.stackSize, false);
} else if (cached.stackSize != actual.stackSize) { } else if (cached.stackSize != actual.stackSize) {
// If both items mismatch on item count, apply the change
int delta = actual.stackSize - cached.stackSize; int delta = actual.stackSize - cached.stackSize;
if (delta > 0) { if (delta > 0) {
network.getItemStorageCache().add(cached, delta, false); network.getItemStorageCache().add(actual, delta, false);
} else { } else {
network.getItemStorageCache().remove(cached, delta); network.getItemStorageCache().remove(actual, Math.abs(delta));
} }
} }
} }

View File

@@ -88,8 +88,6 @@ public class TileExternalStorage extends TileMultipartNode implements IItemStora
private List<ItemStorageExternal> itemStorages = new ArrayList<>(); private List<ItemStorageExternal> itemStorages = new ArrayList<>();
private List<FluidStorageExternal> fluidStorages = new ArrayList<>(); private List<FluidStorageExternal> fluidStorages = new ArrayList<>();
private int lastDrawerCount;
public TileExternalStorage() { public TileExternalStorage() {
dataManager.addWatchedParameter(PRIORITY); dataManager.addWatchedParameter(PRIORITY);
dataManager.addWatchedParameter(COMPARE); dataManager.addWatchedParameter(COMPARE);
@@ -129,11 +127,11 @@ public class TileExternalStorage extends TileMultipartNode implements IItemStora
@Override @Override
public void update() { public void update() {
if (!worldObj.isRemote && network != null) { if (!worldObj.isRemote && network != null) {
if (networkTicks == 0) { if (networkTicks++ == 0) {
updateStorage(network); updateStorage(network);
}
networkTicks++; return;
}
for (ItemStorageExternal storage : itemStorages) { for (ItemStorageExternal storage : itemStorages) {
storage.detectChanges(network); storage.detectChanges(network);
@@ -150,12 +148,6 @@ public class TileExternalStorage extends TileMultipartNode implements IItemStora
if (fluidChangeDetected) { if (fluidChangeDetected) {
network.getFluidStorageCache().invalidate(); network.getFluidStorageCache().invalidate();
} }
if (getFacingTile() instanceof IDrawerGroup && lastDrawerCount != ((IDrawerGroup) getFacingTile()).getDrawerCount()) {
lastDrawerCount = ((IDrawerGroup) getFacingTile()).getDrawerCount();
updateStorage(network);
}
} }
super.update(); super.update();
@@ -248,13 +240,7 @@ public class TileExternalStorage extends TileMultipartNode implements IItemStora
if (type == IType.ITEMS) { if (type == IType.ITEMS) {
if (facing instanceof IDrawerGroup) { if (facing instanceof IDrawerGroup) {
IDrawerGroup group = (IDrawerGroup) facing; itemStorages.add(new ItemStorageDrawerGroup(this, (IDrawerGroup) facing));
for (int i = 0; i < group.getDrawerCount(); ++i) {
if (group.isDrawerEnabled(i)) {
itemStorages.add(new ItemStorageDrawer(this, group.getDrawer(i)));
}
}
} else if (facing instanceof IDrawer) { } else if (facing instanceof IDrawer) {
itemStorages.add(new ItemStorageDrawer(this, (IDrawer) facing)); itemStorages.add(new ItemStorageDrawer(this, (IDrawer) facing));
} else if (facing instanceof IDeepStorageUnit) { } else if (facing instanceof IDeepStorageUnit) {