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
This commit is contained in:
InusualZ
2016-12-12 13:01:24 -09:00
committed by Raoul
parent 70ad713049
commit da5f97ff61
5 changed files with 103 additions and 2 deletions

View File

@@ -1,5 +1,6 @@
package com.raoulvdberge.refinedstorage.container; package com.raoulvdberge.refinedstorage.container;
import com.raoulvdberge.refinedstorage.container.slot.SlotFilter;
import com.raoulvdberge.refinedstorage.container.slot.SlotFilterType; import com.raoulvdberge.refinedstorage.container.slot.SlotFilterType;
import com.raoulvdberge.refinedstorage.tile.TileExporter; import com.raoulvdberge.refinedstorage.tile.TileExporter;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
@@ -16,7 +17,7 @@ public class ContainerExporter extends ContainerBase {
} }
for (int i = 0; i < 9; ++i) { 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); addPlayerInventory(8, 55);

View File

@@ -4,6 +4,7 @@ import com.raoulvdberge.refinedstorage.api.util.IComparer;
import com.raoulvdberge.refinedstorage.container.ContainerExporter; import com.raoulvdberge.refinedstorage.container.ContainerExporter;
import com.raoulvdberge.refinedstorage.gui.sidebutton.SideButtonCompare; import com.raoulvdberge.refinedstorage.gui.sidebutton.SideButtonCompare;
import com.raoulvdberge.refinedstorage.gui.sidebutton.SideButtonRedstoneMode; 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.gui.sidebutton.SideButtonType;
import com.raoulvdberge.refinedstorage.tile.TileExporter; 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_DAMAGE));
addSideButton(new SideButtonCompare(this, TileExporter.COMPARE, IComparer.COMPARE_NBT)); addSideButton(new SideButtonCompare(this, TileExporter.COMPARE, IComparer.COMPARE_NBT));
addSideButton(new SideButtonCompare(this, TileExporter.COMPARE, IComparer.COMPARE_OREDICT)); addSideButton(new SideButtonCompare(this, TileExporter.COMPARE, IComparer.COMPARE_OREDICT));
addSideButton(new SideButtonRegulator(this));
} }
@Override @Override

View File

@@ -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());
}
}

View File

@@ -3,20 +3,25 @@ package com.raoulvdberge.refinedstorage.tile;
import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.RS;
import com.raoulvdberge.refinedstorage.RSUtils; import com.raoulvdberge.refinedstorage.RSUtils;
import com.raoulvdberge.refinedstorage.api.util.IComparer; import com.raoulvdberge.refinedstorage.api.util.IComparer;
import com.raoulvdberge.refinedstorage.apiimpl.API;
import com.raoulvdberge.refinedstorage.inventory.ItemHandlerBasic; import com.raoulvdberge.refinedstorage.inventory.ItemHandlerBasic;
import com.raoulvdberge.refinedstorage.inventory.ItemHandlerFluid; import com.raoulvdberge.refinedstorage.inventory.ItemHandlerFluid;
import com.raoulvdberge.refinedstorage.inventory.ItemHandlerUpgrade; import com.raoulvdberge.refinedstorage.inventory.ItemHandlerUpgrade;
import com.raoulvdberge.refinedstorage.item.ItemUpgrade; import com.raoulvdberge.refinedstorage.item.ItemUpgrade;
import com.raoulvdberge.refinedstorage.tile.config.IComparable; import com.raoulvdberge.refinedstorage.tile.config.IComparable;
import com.raoulvdberge.refinedstorage.tile.config.IType; 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 com.raoulvdberge.refinedstorage.tile.data.TileDataParameter;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.datasync.DataSerializers;
import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumFacing;
import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.fluids.capability.IFluidHandler;
import net.minecraftforge.fluids.capability.IFluidTankProperties;
import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.CapabilityItemHandler;
import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.items.ItemHandlerHelper;
@@ -26,9 +31,23 @@ import javax.annotation.Nullable;
public class TileExporter extends TileNode implements IComparable, IType { public class TileExporter extends TileNode implements IComparable, IType {
public static final TileDataParameter<Integer> COMPARE = IComparable.createParameter(); public static final TileDataParameter<Integer> COMPARE = IComparable.createParameter();
public static final TileDataParameter<Integer> TYPE = IType.createParameter(); public static final TileDataParameter<Integer> TYPE = IType.createParameter();
public static final TileDataParameter<Boolean> REGULATOR = new TileDataParameter<>(DataSerializers.BOOLEAN, false, new ITileDataProducer<Boolean, TileExporter>() {
@Override
public Boolean getValue(TileExporter tile) {
return tile.regulator;
}
}, new ITileDataConsumer<Boolean, TileExporter>() {
@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_COMPARE = "Compare";
private static final String NBT_TYPE = "Type"; private static final String NBT_TYPE = "Type";
private static final String NBT_REGULATOR = "Regulator";
private ItemHandlerBasic itemFilters = new ItemHandlerBasic(9, this); private ItemHandlerBasic itemFilters = new ItemHandlerBasic(9, this);
private ItemHandlerFluid fluidFilters = new ItemHandlerFluid(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 compare = IComparer.COMPARE_NBT | IComparer.COMPARE_DAMAGE;
private int type = IType.ITEMS; private int type = IType.ITEMS;
private boolean regulator = false;
public TileExporter() { public TileExporter() {
dataManager.addWatchedParameter(COMPARE); dataManager.addWatchedParameter(COMPARE);
dataManager.addWatchedParameter(TYPE); dataManager.addWatchedParameter(TYPE);
dataManager.addWatchedParameter(REGULATOR);
} }
@Override @Override
@@ -59,7 +80,26 @@ public class TileExporter extends TileNode implements IComparable, IType {
ItemStack slot = itemFilters.getStackInSlot(i); ItemStack slot = itemFilters.getStackInSlot(i);
if (!slot.isEmpty()) { 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 (took == null) {
if (upgrades.hasUpgrade(ItemUpgrade.TYPE_CRAFTING)) { if (upgrades.hasUpgrade(ItemUpgrade.TYPE_CRAFTING)) {
@@ -83,6 +123,25 @@ public class TileExporter extends TileNode implements IComparable, IType {
if (stackInStorage != null) { if (stackInStorage != null) {
int toExtract = Math.min(Fluid.BUCKET_VOLUME * upgrades.getItemInteractCount(), stackInStorage.amount); 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); 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_COMPARE, compare);
tag.setInteger(NBT_TYPE, type); tag.setInteger(NBT_TYPE, type);
tag.setBoolean(NBT_REGULATOR, regulator);
RSUtils.writeItems(itemFilters, 0, tag); RSUtils.writeItems(itemFilters, 0, tag);
RSUtils.writeItems(fluidFilters, 2, tag); RSUtils.writeItems(fluidFilters, 2, tag);
@@ -158,6 +218,10 @@ public class TileExporter extends TileNode implements IComparable, IType {
type = tag.getInteger(NBT_TYPE); type = tag.getInteger(NBT_TYPE);
} }
if (tag.hasKey(NBT_REGULATOR)) {
regulator = tag.getBoolean(NBT_REGULATOR);
}
RSUtils.readItems(itemFilters, 0, tag); RSUtils.readItems(itemFilters, 0, tag);
RSUtils.readItems(fluidFilters, 2, tag); RSUtils.readItems(fluidFilters, 2, tag);
} }
@@ -183,6 +247,10 @@ public class TileExporter extends TileNode implements IComparable, IType {
markDirty(); markDirty();
} }
public boolean isRegulated() {
return this.regulator;
}
@Override @Override
public IItemHandler getFilterInventory() { public IItemHandler getFilterInventory() {
return getType() == IType.ITEMS ? itemFilters : fluidFilters; return getType() == IType.ITEMS ? itemFilters : fluidFilters;

View File

@@ -143,6 +143,8 @@ sidebutton.refinedstorage:access_type.0=Insert and extract
sidebutton.refinedstorage:access_type.1=Insert only sidebutton.refinedstorage:access_type.1=Insert only
sidebutton.refinedstorage:access_type.2=Extract only sidebutton.refinedstorage:access_type.2=Extract only
sidebutton.refinedstorage:exporter.regulator=Regulator Mode
block.refinedstorage:controller.0.name=Controller block.refinedstorage:controller.0.name=Controller
block.refinedstorage:controller.1.name=Creative Controller block.refinedstorage:controller.1.name=Creative Controller
block.refinedstorage:cable.name=Cable block.refinedstorage:cable.name=Cable