From da5f97ff614c13447d17776c2c5030ab9a4cbd08 Mon Sep 17 00:00:00 2001 From: InusualZ Date: Mon, 12 Dec 2016 13:01:24 -0900 Subject: [PATCH] Regulator Functionality for Exporter (#744) * Regulator functionality for the export * !Fix * !fixup - comments * Lets not forget about Fluids * Don't use the API to compare the fluids * Don't return it may not be the only item filtered. * It shouldn't break the loop --- .../container/ContainerExporter.java | 3 +- .../refinedstorage/gui/GuiExporter.java | 3 + .../gui/sidebutton/SideButtonRegulator.java | 27 +++++++ .../refinedstorage/tile/TileExporter.java | 70 ++++++++++++++++++- .../assets/refinedstorage/lang/en_US.lang | 2 + 5 files changed, 103 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/raoulvdberge/refinedstorage/gui/sidebutton/SideButtonRegulator.java diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerExporter.java b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerExporter.java index 2128ba318..5e9d9f26c 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerExporter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerExporter.java @@ -1,5 +1,6 @@ package com.raoulvdberge.refinedstorage.container; +import com.raoulvdberge.refinedstorage.container.slot.SlotFilter; import com.raoulvdberge.refinedstorage.container.slot.SlotFilterType; import com.raoulvdberge.refinedstorage.tile.TileExporter; import net.minecraft.entity.player.EntityPlayer; @@ -16,7 +17,7 @@ public class ContainerExporter extends ContainerBase { } for (int i = 0; i < 9; ++i) { - addSlotToContainer(new SlotFilterType(exporter, i, 8 + (18 * i), 20)); + addSlotToContainer(new SlotFilterType(exporter, i, 8 + (18 * i), 20, TileExporter.REGULATOR.getValue() ? SlotFilter.FILTER_ALLOW_SIZE : 0)); } addPlayerInventory(8, 55); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiExporter.java b/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiExporter.java index c41dd29d6..5998f0630 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiExporter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiExporter.java @@ -4,6 +4,7 @@ import com.raoulvdberge.refinedstorage.api.util.IComparer; import com.raoulvdberge.refinedstorage.container.ContainerExporter; import com.raoulvdberge.refinedstorage.gui.sidebutton.SideButtonCompare; import com.raoulvdberge.refinedstorage.gui.sidebutton.SideButtonRedstoneMode; +import com.raoulvdberge.refinedstorage.gui.sidebutton.SideButtonRegulator; import com.raoulvdberge.refinedstorage.gui.sidebutton.SideButtonType; import com.raoulvdberge.refinedstorage.tile.TileExporter; @@ -21,6 +22,8 @@ public class GuiExporter extends GuiBase { addSideButton(new SideButtonCompare(this, TileExporter.COMPARE, IComparer.COMPARE_DAMAGE)); addSideButton(new SideButtonCompare(this, TileExporter.COMPARE, IComparer.COMPARE_NBT)); addSideButton(new SideButtonCompare(this, TileExporter.COMPARE, IComparer.COMPARE_OREDICT)); + + addSideButton(new SideButtonRegulator(this)); } @Override diff --git a/src/main/java/com/raoulvdberge/refinedstorage/gui/sidebutton/SideButtonRegulator.java b/src/main/java/com/raoulvdberge/refinedstorage/gui/sidebutton/SideButtonRegulator.java new file mode 100644 index 000000000..3e5e8ee6e --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/gui/sidebutton/SideButtonRegulator.java @@ -0,0 +1,27 @@ +package com.raoulvdberge.refinedstorage.gui.sidebutton; + +import com.raoulvdberge.refinedstorage.gui.GuiBase; +import com.raoulvdberge.refinedstorage.tile.TileExporter; +import com.raoulvdberge.refinedstorage.tile.data.TileDataManager; +import net.minecraft.util.text.TextFormatting; + +public class SideButtonRegulator extends SideButton { + public SideButtonRegulator(GuiBase gui) { + super(gui); + } + + @Override + protected void drawButtonIcon(int x, int y) { + + } + + @Override + public String getTooltip() { + return TextFormatting.GREEN + GuiBase.t("sidebutton.refinedstorage:exporter.regulator") + TextFormatting.RESET + "\n" + GuiBase.t(TileExporter.REGULATOR.getValue() ? "gui.yes" : "gui.no"); + } + + @Override + public void actionPerformed() { + TileDataManager.setParameter(TileExporter.REGULATOR, !TileExporter.REGULATOR.getValue()); + } +} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileExporter.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileExporter.java index a582644ab..70e47fc3e 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileExporter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileExporter.java @@ -3,20 +3,25 @@ package com.raoulvdberge.refinedstorage.tile; import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.RSUtils; import com.raoulvdberge.refinedstorage.api.util.IComparer; +import com.raoulvdberge.refinedstorage.apiimpl.API; import com.raoulvdberge.refinedstorage.inventory.ItemHandlerBasic; import com.raoulvdberge.refinedstorage.inventory.ItemHandlerFluid; import com.raoulvdberge.refinedstorage.inventory.ItemHandlerUpgrade; import com.raoulvdberge.refinedstorage.item.ItemUpgrade; import com.raoulvdberge.refinedstorage.tile.config.IComparable; import com.raoulvdberge.refinedstorage.tile.config.IType; +import com.raoulvdberge.refinedstorage.tile.data.ITileDataConsumer; +import com.raoulvdberge.refinedstorage.tile.data.ITileDataProducer; import com.raoulvdberge.refinedstorage.tile.data.TileDataParameter; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.datasync.DataSerializers; import net.minecraft.util.EnumFacing; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.IFluidHandler; +import net.minecraftforge.fluids.capability.IFluidTankProperties; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.ItemHandlerHelper; @@ -26,9 +31,23 @@ import javax.annotation.Nullable; public class TileExporter extends TileNode implements IComparable, IType { public static final TileDataParameter COMPARE = IComparable.createParameter(); public static final TileDataParameter TYPE = IType.createParameter(); + public static final TileDataParameter REGULATOR = new TileDataParameter<>(DataSerializers.BOOLEAN, false, new ITileDataProducer() { + @Override + public Boolean getValue(TileExporter tile) { + return tile.regulator; + } + }, new ITileDataConsumer() { + @Override + public void setValue(TileExporter tile, Boolean value) { + tile.regulator = value; + + tile.markDirty(); + } + }); private static final String NBT_COMPARE = "Compare"; private static final String NBT_TYPE = "Type"; + private static final String NBT_REGULATOR = "Regulator"; private ItemHandlerBasic itemFilters = new ItemHandlerBasic(9, this); private ItemHandlerFluid fluidFilters = new ItemHandlerFluid(9, this); @@ -37,10 +56,12 @@ public class TileExporter extends TileNode implements IComparable, IType { private int compare = IComparer.COMPARE_NBT | IComparer.COMPARE_DAMAGE; private int type = IType.ITEMS; + private boolean regulator = false; public TileExporter() { dataManager.addWatchedParameter(COMPARE); dataManager.addWatchedParameter(TYPE); + dataManager.addWatchedParameter(REGULATOR); } @Override @@ -59,7 +80,26 @@ public class TileExporter extends TileNode implements IComparable, IType { ItemStack slot = itemFilters.getStackInSlot(i); if (!slot.isEmpty()) { - ItemStack took = network.extractItem(slot, upgrades.getItemInteractCount(), compare, true); + int stackSize = upgrades.getItemInteractCount(); + boolean skipSlot = false; + if (regulator) { + for (int index = 0; i < handler.getSlots() && !skipSlot; i++) { + ItemStack handlerStack = handler.getStackInSlot(index); + if (API.instance().getComparer().isEqual(slot, handlerStack, compare)) { + if (handlerStack.getCount() >= slot.getCount()) { + skipSlot = true; + } else { + stackSize = upgrades.hasUpgrade(ItemUpgrade.TYPE_STACK) ? slot.getCount() - handlerStack.getCount() : 1; + } + } + } + } + + if (skipSlot) { + continue; + } + + ItemStack took = network.extractItem(slot, stackSize, compare, true); if (took == null) { if (upgrades.hasUpgrade(ItemUpgrade.TYPE_CRAFTING)) { @@ -83,6 +123,25 @@ public class TileExporter extends TileNode implements IComparable, IType { if (stackInStorage != null) { int toExtract = Math.min(Fluid.BUCKET_VOLUME * upgrades.getItemInteractCount(), stackInStorage.amount); + boolean skipSlot = false; + if (regulator) { + for (IFluidTankProperties tankProperty : handler.getTankProperties()) { + FluidStack fluidStack = tankProperty.getContents(); + if (API.instance().getComparer().isEqual(stackInStorage, fluidStack, compare)) { + if (fluidStack.amount >= stack.amount * Fluid.BUCKET_VOLUME) { + skipSlot = true; + break; + } else { + toExtract = upgrades.hasUpgrade(ItemUpgrade.TYPE_STACK) ? stack.amount * Fluid.BUCKET_VOLUME - fluidStack.amount : Fluid.BUCKET_VOLUME; + toExtract = Math.min(toExtract, stackInStorage.amount); + } + } + } + } + + if (skipSlot) { + continue; + } FluidStack took = network.extractFluid(stack, toExtract, compare, true); @@ -139,6 +198,7 @@ public class TileExporter extends TileNode implements IComparable, IType { tag.setInteger(NBT_COMPARE, compare); tag.setInteger(NBT_TYPE, type); + tag.setBoolean(NBT_REGULATOR, regulator); RSUtils.writeItems(itemFilters, 0, tag); RSUtils.writeItems(fluidFilters, 2, tag); @@ -158,6 +218,10 @@ public class TileExporter extends TileNode implements IComparable, IType { type = tag.getInteger(NBT_TYPE); } + if (tag.hasKey(NBT_REGULATOR)) { + regulator = tag.getBoolean(NBT_REGULATOR); + } + RSUtils.readItems(itemFilters, 0, tag); RSUtils.readItems(fluidFilters, 2, tag); } @@ -183,6 +247,10 @@ public class TileExporter extends TileNode implements IComparable, IType { markDirty(); } + public boolean isRegulated() { + return this.regulator; + } + @Override public IItemHandler getFilterInventory() { return getType() == IType.ITEMS ? itemFilters : fluidFilters; diff --git a/src/main/resources/assets/refinedstorage/lang/en_US.lang b/src/main/resources/assets/refinedstorage/lang/en_US.lang index 1f080712a..7116a9f5f 100755 --- a/src/main/resources/assets/refinedstorage/lang/en_US.lang +++ b/src/main/resources/assets/refinedstorage/lang/en_US.lang @@ -143,6 +143,8 @@ sidebutton.refinedstorage:access_type.0=Insert and extract sidebutton.refinedstorage:access_type.1=Insert only sidebutton.refinedstorage:access_type.2=Extract only +sidebutton.refinedstorage:exporter.regulator=Regulator Mode + block.refinedstorage:controller.0.name=Controller block.refinedstorage:controller.1.name=Creative Controller block.refinedstorage:cable.name=Cable