diff --git a/src/main/java/refinedstorage/gui/GuiStorage.java b/src/main/java/refinedstorage/gui/GuiStorage.java index de75a20eb..f4864dc6a 100755 --- a/src/main/java/refinedstorage/gui/GuiStorage.java +++ b/src/main/java/refinedstorage/gui/GuiStorage.java @@ -8,6 +8,7 @@ import refinedstorage.gui.sidebutton.SideButtonCompare; import refinedstorage.gui.sidebutton.SideButtonMode; import refinedstorage.gui.sidebutton.SideButtonRedstoneMode; import refinedstorage.gui.sidebutton.SideButtonType; +import refinedstorage.gui.sidebutton.SideButtonVoidExcess; import refinedstorage.tile.IStorageGui; import refinedstorage.tile.data.TileDataManager; @@ -54,6 +55,10 @@ public class GuiStorage extends GuiBase { addSideButton(new SideButtonCompare(this, gui.getCompareParameter(), IComparer.COMPARE_NBT)); } + if (gui.getVoidExcessParameter() != null) { + addSideButton(new SideButtonVoidExcess(this, gui.getVoidExcessParameter())); + } + priorityField = new GuiTextField(0, fontRendererObj, x + 98 + 1, y + 54 + 1, 29, fontRendererObj.FONT_HEIGHT); priorityField.setEnableBackgroundDrawing(false); priorityField.setVisible(true); diff --git a/src/main/java/refinedstorage/gui/sidebutton/SideButtonVoidExcess.java b/src/main/java/refinedstorage/gui/sidebutton/SideButtonVoidExcess.java new file mode 100644 index 000000000..3de71ef34 --- /dev/null +++ b/src/main/java/refinedstorage/gui/sidebutton/SideButtonVoidExcess.java @@ -0,0 +1,31 @@ +package refinedstorage.gui.sidebutton; + +import net.minecraft.util.text.TextFormatting; +import refinedstorage.gui.GuiBase; +import refinedstorage.tile.data.TileDataManager; +import refinedstorage.tile.data.TileDataParameter; + +public class SideButtonVoidExcess extends SideButton { + private TileDataParameter parameter; + + public SideButtonVoidExcess(GuiBase gui, TileDataParameter parameter) { + super(gui); + + this.parameter = parameter; + } + + @Override + public String getTooltip() { + return TextFormatting.LIGHT_PURPLE + gui.t("sidebutton.refinedstorage:void_excess.mode") + TextFormatting.RESET + "\n" + gui.t(parameter.getValue() ? "gui.yes" : "gui.no"); + } + + @Override + protected void drawButtonIcon(int x, int y) { + gui.drawTexture(x, y, parameter.getValue() ? 16 : 0, 192, 16, 16); + } + + @Override + public void actionPerformed() { + TileDataManager.setParameter(parameter, !parameter.getValue()); + } +} diff --git a/src/main/java/refinedstorage/tile/IStorageGui.java b/src/main/java/refinedstorage/tile/IStorageGui.java index 62b962f7c..90cea3e0a 100755 --- a/src/main/java/refinedstorage/tile/IStorageGui.java +++ b/src/main/java/refinedstorage/tile/IStorageGui.java @@ -15,6 +15,8 @@ public interface IStorageGui { TileDataParameter getPriorityParameter(); + TileDataParameter getVoidExcessParameter(); + int getStored(); int getCapacity(); diff --git a/src/main/java/refinedstorage/tile/TileController.java b/src/main/java/refinedstorage/tile/TileController.java index 05ae1eae0..3d03c4199 100755 --- a/src/main/java/refinedstorage/tile/TileController.java +++ b/src/main/java/refinedstorage/tile/TileController.java @@ -528,14 +528,23 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR ((ItemStorageExternal) storage).updateCacheForcefully(); } - if (remainder == null) { + if (remainder == null || remainder.stackSize < 0) { break; } else { size = remainder.stackSize; } } - int inserted = remainder != null ? (orginalSize - remainder.stackSize) : orginalSize; + //If the stack size of the remainder is negative, it means of the original size abs(remainder.stackSize) items have been voided + int inserted; + if (remainder == null) { + inserted = orginalSize; + } else if (remainder.stackSize < 0) { + inserted = orginalSize + remainder.stackSize; + remainder = null; + } else { + inserted = orginalSize - remainder.stackSize; + } if (!simulate && inserted > 0) { itemStorage.add(ItemHandlerHelper.copyStackWithSize(stack, inserted), false); diff --git a/src/main/java/refinedstorage/tile/TileDiskDrive.java b/src/main/java/refinedstorage/tile/TileDiskDrive.java index ff8e4afa1..7cefed1ca 100755 --- a/src/main/java/refinedstorage/tile/TileDiskDrive.java +++ b/src/main/java/refinedstorage/tile/TileDiskDrive.java @@ -375,6 +375,11 @@ public class TileDiskDrive extends TileNode implements IItemStorageProvider, IFl return PRIORITY; } + @Override + public TileDataParameter getVoidExcessParameter() { + return null; + } + @Override public int getPriority() { return priority; diff --git a/src/main/java/refinedstorage/tile/TileFluidStorage.java b/src/main/java/refinedstorage/tile/TileFluidStorage.java index 537eb52da..b05b5d8ed 100755 --- a/src/main/java/refinedstorage/tile/TileFluidStorage.java +++ b/src/main/java/refinedstorage/tile/TileFluidStorage.java @@ -224,6 +224,11 @@ public class TileFluidStorage extends TileNode implements IFluidStorageProvider, return PRIORITY; } + @Override + public TileDataParameter getVoidExcessParameter() { + return null; + } + public NBTTagCompound getStorageTag() { return storageTag; } diff --git a/src/main/java/refinedstorage/tile/TileStorage.java b/src/main/java/refinedstorage/tile/TileStorage.java index 908bae3d6..440cad57e 100755 --- a/src/main/java/refinedstorage/tile/TileStorage.java +++ b/src/main/java/refinedstorage/tile/TileStorage.java @@ -15,6 +15,7 @@ import refinedstorage.block.BlockStorage; import refinedstorage.block.EnumItemStorageType; import refinedstorage.inventory.ItemHandlerBasic; import refinedstorage.tile.config.IComparable; +import refinedstorage.tile.config.IExcessVoidable; import refinedstorage.tile.config.IFilterable; import refinedstorage.tile.config.IPrioritizable; import refinedstorage.tile.data.ITileDataProducer; @@ -22,7 +23,7 @@ import refinedstorage.tile.data.TileDataParameter; import java.util.List; -public class TileStorage extends TileNode implements IItemStorageProvider, IStorageGui, IComparable, IFilterable, IPrioritizable { +public class TileStorage extends TileNode implements IItemStorageProvider, IStorageGui, IComparable, IFilterable, IPrioritizable, IExcessVoidable { public static final TileDataParameter PRIORITY = IPrioritizable.createParameter(); public static final TileDataParameter COMPARE = IComparable.createParameter(); public static final TileDataParameter MODE = IFilterable.createParameter(); @@ -32,6 +33,7 @@ public class TileStorage extends TileNode implements IItemStorageProvider, IStor return ItemStorageNBT.getStoredFromNBT(tile.storageTag); } }); + public static final TileDataParameter VOID_EXCESS = IExcessVoidable.createParameter(); class ItemStorage extends ItemStorageNBT { public ItemStorage() { @@ -49,7 +51,14 @@ public class TileStorage extends TileNode implements IItemStorageProvider, IStor return ItemHandlerHelper.copyStackWithSize(stack, size); } - return super.insertItem(stack, size, simulate); + ItemStack result = super.insertItem(stack, size, simulate); + + if (voidExcess && result != null) { + //Simulate should not matter as the items are voided anyway + result.stackSize = -result.stackSize; + } + + return result; } } @@ -58,6 +67,7 @@ public class TileStorage extends TileNode implements IItemStorageProvider, IStor private static final String NBT_PRIORITY = "Priority"; private static final String NBT_COMPARE = "Compare"; private static final String NBT_MODE = "Mode"; + private static final String NBT_VOID_EXCESS = "VoidExcess"; private ItemHandlerBasic filters = new ItemHandlerBasic(9, this); @@ -70,12 +80,14 @@ public class TileStorage extends TileNode implements IItemStorageProvider, IStor private int priority = 0; private int compare = IComparer.COMPARE_NBT | IComparer.COMPARE_DAMAGE; private int mode = IFilterable.WHITELIST; + private boolean voidExcess = false; public TileStorage() { dataManager.addWatchedParameter(PRIORITY); dataManager.addWatchedParameter(COMPARE); dataManager.addWatchedParameter(MODE); dataManager.addWatchedParameter(STORED); + dataManager.addWatchedParameter(VOID_EXCESS); } @Override @@ -141,6 +153,10 @@ public class TileStorage extends TileNode implements IItemStorageProvider, IStor if (tag.hasKey(NBT_MODE)) { mode = tag.getInteger(NBT_MODE); } + + if(tag.hasKey(NBT_VOID_EXCESS)) { + voidExcess = tag.getBoolean(NBT_VOID_EXCESS); + } } @Override @@ -158,6 +174,7 @@ public class TileStorage extends TileNode implements IItemStorageProvider, IStor tag.setTag(NBT_STORAGE, storageTag); tag.setInteger(NBT_COMPARE, compare); tag.setInteger(NBT_MODE, mode); + tag.setBoolean(NBT_VOID_EXCESS, voidExcess); return tag; } @@ -194,6 +211,18 @@ public class TileStorage extends TileNode implements IItemStorageProvider, IStor markDirty(); } + @Override + public boolean getVoidExcess() { + return voidExcess; + } + + @Override + public void setVoidExcess(boolean voidExcess) { + this.voidExcess = voidExcess; + + markDirty(); + } + @Override public String getGuiTitle() { return "block.refinedstorage:storage." + getType().getId() + ".name"; @@ -224,6 +253,11 @@ public class TileStorage extends TileNode implements IItemStorageProvider, IStor return PRIORITY; } + @Override + public TileDataParameter getVoidExcessParameter() { + return VOID_EXCESS; + } + public NBTTagCompound getStorageTag() { return storageTag; } diff --git a/src/main/java/refinedstorage/tile/config/IExcessVoidable.java b/src/main/java/refinedstorage/tile/config/IExcessVoidable.java new file mode 100644 index 000000000..df9350eb7 --- /dev/null +++ b/src/main/java/refinedstorage/tile/config/IExcessVoidable.java @@ -0,0 +1,27 @@ +package refinedstorage.tile.config; + +import net.minecraft.network.datasync.DataSerializers; +import net.minecraft.tileentity.TileEntity; +import refinedstorage.tile.data.ITileDataConsumer; +import refinedstorage.tile.data.ITileDataProducer; +import refinedstorage.tile.data.TileDataParameter; + +public interface IExcessVoidable { + static TileDataParameter createParameter() { + return new TileDataParameter<>(DataSerializers.BOOLEAN, false, new ITileDataProducer() { + @Override + public Boolean getValue(T tile) { + return ((IExcessVoidable) tile).getVoidExcess(); + } + }, new ITileDataConsumer() { + @Override + public void setValue(T tile, Boolean value) { + ((IExcessVoidable) tile).setVoidExcess(value); + } + }); + } + + boolean getVoidExcess(); + + void setVoidExcess(boolean voidExcess); +} diff --git a/src/main/java/refinedstorage/tile/externalstorage/TileExternalStorage.java b/src/main/java/refinedstorage/tile/externalstorage/TileExternalStorage.java index e2646bd56..69f51d4c8 100755 --- a/src/main/java/refinedstorage/tile/externalstorage/TileExternalStorage.java +++ b/src/main/java/refinedstorage/tile/externalstorage/TileExternalStorage.java @@ -305,6 +305,11 @@ public class TileExternalStorage extends TileMultipartNode implements IItemStora return PRIORITY; } + @Override + public TileDataParameter getVoidExcessParameter() { + return null; + } + @Override public int getStored() { return STORED.getValue(); diff --git a/src/main/resources/assets/refinedstorage/lang/en_US.lang b/src/main/resources/assets/refinedstorage/lang/en_US.lang index bc3e396c5..eef4c9054 100755 --- a/src/main/resources/assets/refinedstorage/lang/en_US.lang +++ b/src/main/resources/assets/refinedstorage/lang/en_US.lang @@ -117,6 +117,8 @@ sidebutton.refinedstorage:detector.mode.3=Emit signal when item is being autocra sidebutton.refinedstorage:crafter.triggered_autocrafting=Trigger autocrafting with redstone signal +sidebutton.refinedstorage:void_excess.mode=Void excess items + block.refinedstorage:controller.0.name=Controller block.refinedstorage:controller.1.name=Creative Controller block.refinedstorage:cable.name=Cable diff --git a/src/main/resources/assets/refinedstorage/textures/icons.png b/src/main/resources/assets/refinedstorage/textures/icons.png index d9399097e..30fc92a27 100755 Binary files a/src/main/resources/assets/refinedstorage/textures/icons.png and b/src/main/resources/assets/refinedstorage/textures/icons.png differ