diff --git a/src/main/java/refinedstorage/container/ContainerDetector.java b/src/main/java/refinedstorage/container/ContainerDetector.java index a8059bd2c..555131202 100755 --- a/src/main/java/refinedstorage/container/ContainerDetector.java +++ b/src/main/java/refinedstorage/container/ContainerDetector.java @@ -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); } diff --git a/src/main/java/refinedstorage/gui/GuiDetector.java b/src/main/java/refinedstorage/gui/GuiDetector.java index 230fa761c..5bc5048dd 100755 --- a/src/main/java/refinedstorage/gui/GuiDetector.java +++ b/src/main/java/refinedstorage/gui/GuiDetector.java @@ -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); diff --git a/src/main/java/refinedstorage/tile/TileDetector.java b/src/main/java/refinedstorage/tile/TileDetector.java index b60234436..b7b903b5c 100755 --- a/src/main/java/refinedstorage/tile/TileDetector.java +++ b/src/main/java/refinedstorage/tile/TileDetector.java @@ -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 COMPARE = IComparable.createParameter(); + public static final TileDataParameter TYPE = IType.createParameter(); public static final TileDataParameter MODE = new TileDataParameter<>(DataSerializers.VARINT, 0, new ITileDataProducer() { @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; + } }