package com.carpentersblocks.data; import net.minecraftforge.common.util.ForgeDirection; import com.carpentersblocks.tileentity.TEBase; public class DaylightSensor implements ISided { /** * 16-bit data components: * * [000000] [000] [00] [0] [0000] * Unused Dir Sensitivity Polarity LightLevel */ public static final byte POLARITY_POSITIVE = 0; public static final byte POLARITY_NEGATIVE = 1; public static final byte SENSITIVITY_SLEEP = 0; public static final byte SENSITIVITY_MONSTERS = 1; public static final byte SENSITIVITY_DYNAMIC = 2; /** * Returns direction. */ @Override public ForgeDirection getDirection(TEBase TE) { int side = (TE.getData() & 0x380) >> 7; return ForgeDirection.getOrientation(side); } /** * Sets direction. */ @Override public boolean setDirection(TEBase TE, ForgeDirection dir) { int temp = (TE.getData() & ~0x380) | (dir.ordinal() << 7); return TE.setData(temp); } /** * Returns light level. */ public int getLightLevel(TEBase TE) { return TE.getData() & 0xf; } /** * Sets light level. */ public void setLightLevel(TEBase TE, int lightLevel) { int temp = (TE.getData() & ~0xf) | lightLevel; TE.setData(temp); } /** * Returns polarity. */ public int getPolarity(TEBase TE) { return (TE.getData() & 0x10) >> 4; } /** * Sets polarity. */ public void setPolarity(TEBase TE, int state) { int temp = (TE.getData() & ~0x10) | (state << 4); TE.setData(temp); } /** * Returns sensitivity. */ public int getSensitivity(TEBase TE) { return (TE.getData() & 0x60) >> 5; } /** * Sets sensitivity. */ private void setSensitivity(TEBase TE, int sensitivity) { int temp = (TE.getData() & ~0x60) | (sensitivity << 5); TE.setData(temp); } /** * Sets sensor to next sensitivity level. * Returns new sensitivity. */ public int setNextSensitivity(TEBase TE) { int sensitivity = getSensitivity(TE); if (++sensitivity > 2) { sensitivity = 0; } setSensitivity(TE, sensitivity); return sensitivity; } /** * Returns the operational state of the daylight sensor. * * @param TE the {@link TEBase} * @return true if sensor is outputting redstone current */ public boolean isActive(TEBase TE) { return getRedstoneOutput(TE) > 0; } /** * Gets redstone output based on sensor polarity, sensitivity, and light level. * * @param TE the {@link TEBase} * @return redstone output between 0 and 15 */ public int getRedstoneOutput(TEBase TE) { boolean posPolarity = getPolarity(TE) == POLARITY_POSITIVE; int output = 0; int lightLevel = getLightLevel(TE); int sensitivity = getSensitivity(TE); if (sensitivity == SENSITIVITY_SLEEP) { boolean active = posPolarity ? lightLevel > 11 : lightLevel <= 11; if (active) { output = 15; } } else if (sensitivity == SENSITIVITY_MONSTERS) { boolean active = posPolarity ? lightLevel > 7 : lightLevel <= 7; if (active) { output = 15; } } else { output = posPolarity ? lightLevel : 15 - lightLevel; } return output; } }