Fluid Detector

This commit is contained in:
Raoul Van den Berge
2016-08-14 04:28:34 +02:00
parent 2fafe4930e
commit b6de32a8fb
3 changed files with 83 additions and 33 deletions

View File

@@ -3,14 +3,14 @@ package refinedstorage.container;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;
import refinedstorage.container.slot.SlotSpecimen;
import refinedstorage.container.slot.SlotSpecimenType;
import refinedstorage.tile.TileDetector;
public class ContainerDetector extends ContainerBase {
public ContainerDetector(TileDetector detector, EntityPlayer player) {
super(detector, player);
addSlotToContainer(new SlotSpecimen(detector.getInventory(), 0, 107, 20));
addSlotToContainer(new SlotSpecimenType(detector, 0, 107, 20));
addPlayerInventory(8, 55);
}

View File

@@ -6,6 +6,7 @@ import refinedstorage.api.storage.CompareUtils;
import refinedstorage.container.ContainerDetector;
import refinedstorage.gui.sidebutton.SideButtonCompare;
import refinedstorage.gui.sidebutton.SideButtonDetectorMode;
import refinedstorage.gui.sidebutton.SideButtonType;
import refinedstorage.tile.TileDetector;
import refinedstorage.tile.data.TileDataManager;
@@ -20,11 +21,13 @@ public class GuiDetector extends GuiBase {
@Override
public void init(int x, int y) {
addSideButton(new SideButtonCompare(TileDetector.COMPARE, CompareUtils.COMPARE_DAMAGE));
addSideButton(new SideButtonCompare(TileDetector.COMPARE, CompareUtils.COMPARE_NBT));
addSideButton(new SideButtonType(TileDetector.TYPE));
addSideButton(new SideButtonDetectorMode());
addSideButton(new SideButtonCompare(TileDetector.COMPARE, CompareUtils.COMPARE_DAMAGE));
addSideButton(new SideButtonCompare(TileDetector.COMPARE, CompareUtils.COMPARE_NBT));
AMOUNT = new GuiTextField(0, fontRendererObj, x + 62 + 1, y + 23 + 1, 25, fontRendererObj.FONT_HEIGHT);
AMOUNT.setText(String.valueOf(TileDetector.AMOUNT.getValue()));
AMOUNT.setEnableBackgroundDrawing(false);

View File

@@ -5,6 +5,7 @@ import net.minecraft.client.gui.GuiScreen;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.datasync.DataSerializers;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fml.common.FMLCommonHandler;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.items.IItemHandler;
@@ -13,14 +14,17 @@ import refinedstorage.RefinedStorageBlocks;
import refinedstorage.api.network.INetworkMaster;
import refinedstorage.gui.GuiDetector;
import refinedstorage.inventory.ItemHandlerBasic;
import refinedstorage.inventory.ItemHandlerFluid;
import refinedstorage.tile.config.IComparable;
import refinedstorage.tile.config.IType;
import refinedstorage.tile.config.RedstoneMode;
import refinedstorage.tile.data.ITileDataConsumer;
import refinedstorage.tile.data.ITileDataProducer;
import refinedstorage.tile.data.TileDataParameter;
public class TileDetector extends TileNode implements IComparable {
public class TileDetector 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<Integer> MODE = new TileDataParameter<>(DataSerializers.VARINT, 0, new ITileDataProducer<Integer, TileDetector>() {
@Override
@@ -70,10 +74,13 @@ public class TileDetector extends TileNode implements IComparable {
private static final String NBT_MODE = "Mode";
private static final String NBT_AMOUNT = "Amount";
private static final String NBT_POWERED = "Powered";
private static final String NBT_TYPE = "Type";
private ItemHandlerBasic filter = new ItemHandlerBasic(1, this);
private ItemHandlerBasic itemFilters = new ItemHandlerBasic(1, this);
private ItemHandlerFluid fluidFilters = new ItemHandlerFluid(1, this);
private int compare = 0;
private int type = IType.ITEMS;
private int mode = MODE_EQUAL;
private int amount = 0;
@@ -82,6 +89,7 @@ public class TileDetector extends TileNode implements IComparable {
public TileDetector() {
dataManager.addWatchedParameter(COMPARE);
dataManager.addWatchedParameter(TYPE);
dataManager.addWatchedParameter(MODE);
dataManager.addWatchedParameter(AMOUNT);
}
@@ -94,34 +102,26 @@ public class TileDetector extends TileNode implements IComparable {
@Override
public void updateNode() {
if (ticks % SPEED == 0) {
ItemStack slot = filter.getStackInSlot(0);
if (type == IType.ITEMS) {
ItemStack slot = itemFilters.getStackInSlot(0);
if (slot != null) {
ItemStack stack = network.getItemStorage().get(slot, compare);
if (slot != null) {
ItemStack stack = network.getItemStorage().get(slot, compare);
if (stack != null) {
switch (mode) {
case MODE_UNDER:
powered = stack.stackSize < amount;
break;
case MODE_EQUAL:
powered = stack.stackSize == amount;
break;
case MODE_ABOVE:
powered = stack.stackSize > amount;
break;
}
powered = isPowered(stack == null ? null : stack.stackSize);
} else {
if (mode == MODE_UNDER && amount != 0) {
powered = true;
} else if (mode == MODE_EQUAL && amount == 0) {
powered = true;
} else {
powered = false;
}
powered = false;
}
} else if (type == IType.FLUIDS) {
FluidStack slot = fluidFilters.getFluids()[0];
if (slot != null) {
FluidStack stack = network.getFluidStorage().get(slot, compare);
powered = isPowered(stack == null ? null : stack.amount);
} else {
powered = false;
}
} else {
powered = false;
}
}
}
@@ -152,6 +152,29 @@ public class TileDetector extends TileNode implements IComparable {
return powered;
}
public boolean isPowered(Integer size) {
if (size != null) {
switch (mode) {
case MODE_UNDER:
return size < amount;
case MODE_EQUAL:
return size == amount;
case MODE_ABOVE:
return size > amount;
}
} else {
if (mode == MODE_UNDER && amount != 0) {
return true;
} else if (mode == MODE_EQUAL && amount == 0) {
return true;
} else {
return false;
}
}
return false;
}
@Override
public int getCompare() {
return compare;
@@ -180,7 +203,12 @@ public class TileDetector extends TileNode implements IComparable {
amount = tag.getInteger(NBT_AMOUNT);
}
readItems(filter, 0, tag);
if (tag.hasKey(NBT_TYPE)) {
type = tag.getInteger(NBT_TYPE);
}
readItems(itemFilters, 0, tag);
readItems(fluidFilters, 1, tag);
}
@Override
@@ -190,8 +218,10 @@ public class TileDetector extends TileNode implements IComparable {
tag.setInteger(NBT_COMPARE, compare);
tag.setInteger(NBT_MODE, mode);
tag.setInteger(NBT_AMOUNT, amount);
tag.setInteger(NBT_TYPE, type);
writeItems(filter, 0, tag);
writeItems(itemFilters, 0, tag);
writeItems(fluidFilters, 1, tag);
return tag;
}
@@ -213,11 +243,28 @@ public class TileDetector extends TileNode implements IComparable {
}
public IItemHandler getInventory() {
return filter;
return itemFilters;
}
@Override
public void setRedstoneMode(RedstoneMode mode) {
// NO OP
}
@Override
public int getType() {
return worldObj.isRemote ? TYPE.getValue() : type;
}
@Override
public void setType(int type) {
this.type = type;
markDirty();
}
@Override
public IItemHandler getFilterInventory() {
return getType() == IType.ITEMS ? itemFilters : fluidFilters;
}
}