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;
|
||||
|
||||
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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.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<Integer> COMPARE = IComparable.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_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;
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user