Add specialized item storage for drawer groups, #591
This commit is contained in:
@@ -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");
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user