From c502e3758f7b1cedd5a4730ce59f98b28ac3d07c Mon Sep 17 00:00:00 2001 From: Geldorn Date: Thu, 6 Oct 2016 21:52:09 +0200 Subject: [PATCH] Added void excess items functionality to storage blocks (counts not working correctly). --- .../java/refinedstorage/gui/GuiStorage.java | 5 +++ .../gui/sidebutton/SideButtonVoidExcess.java | 31 +++++++++++++++ .../java/refinedstorage/tile/IStorageGui.java | 2 + .../refinedstorage/tile/TileDiskDrive.java | 3 ++ .../refinedstorage/tile/TileFluidStorage.java | 3 ++ .../java/refinedstorage/tile/TileStorage.java | 36 +++++++++++++++++- .../tile/config/IExcessVoidable.java | 30 +++++++++++++++ .../externalstorage/TileExternalStorage.java | 3 ++ .../assets/refinedstorage/textures/icons.png | Bin 4116 -> 4276 bytes 9 files changed, 111 insertions(+), 2 deletions(-) create mode 100644 src/main/java/refinedstorage/gui/sidebutton/SideButtonVoidExcess.java create mode 100644 src/main/java/refinedstorage/tile/config/IExcessVoidable.java diff --git a/src/main/java/refinedstorage/gui/GuiStorage.java b/src/main/java/refinedstorage/gui/GuiStorage.java index b263ee3fe..a92993a57 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(), CompareUtils.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..859522ef0 --- /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 + "Void Excess Item Mode" + "\n" + (parameter.getValue() ? "On" : "Off"); + } + + @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/TileDiskDrive.java b/src/main/java/refinedstorage/tile/TileDiskDrive.java index 519022bd5..bd202ad14 100755 --- a/src/main/java/refinedstorage/tile/TileDiskDrive.java +++ b/src/main/java/refinedstorage/tile/TileDiskDrive.java @@ -375,6 +375,9 @@ 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 eb17c6d59..b19f9c9bd 100755 --- a/src/main/java/refinedstorage/tile/TileFluidStorage.java +++ b/src/main/java/refinedstorage/tile/TileFluidStorage.java @@ -224,6 +224,9 @@ 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 92992b998..77cd18ae4 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) { + //Simulate should not matter as the items are voided anyway + return null; + } + + 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 = CompareUtils.COMPARE_NBT | CompareUtils.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,9 @@ 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..386fc1dc2 --- /dev/null +++ b/src/main/java/refinedstorage/tile/config/IExcessVoidable.java @@ -0,0 +1,30 @@ +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 { + public static final boolean VOID_EXCESS_OFF = false; + public static final boolean VOID_EXCESS_ON = true; + + static TileDataParameter createParameter() { + return new TileDataParameter<>(DataSerializers.BOOLEAN, VOID_EXCESS_OFF, 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 c145aaf7d..8a1083890 100755 --- a/src/main/java/refinedstorage/tile/externalstorage/TileExternalStorage.java +++ b/src/main/java/refinedstorage/tile/externalstorage/TileExternalStorage.java @@ -305,6 +305,9 @@ 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/textures/icons.png b/src/main/resources/assets/refinedstorage/textures/icons.png index d9399097e3db39f1dbdf32ea4a7c6581e48ca39e..30fc92a27a565f28c635baef990a093ab8742c20 100755 GIT binary patch literal 4276 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 BNX`HN literal 4116 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 Lr*nm4So(hefR6Cx