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:
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user