package net.glowstone.block.blocktype; import net.glowstone.block.GlowBlock; import net.glowstone.scheduler.PulseTask; import org.bukkit.Material; import org.bukkit.block.BlockFace; import org.bukkit.inventory.ItemStack; public class BlockObserver extends BlockDirectional { private static final int POWERED_MASK = 0x3; public BlockObserver() { super(true); setDrops(new ItemStack(Material.OBSERVER)); } @Override public void onNearBlockChanged(GlowBlock block, BlockFace face, GlowBlock changedBlock, Material oldType, byte oldData, Material newType, byte newData) { byte data = (byte) (block.getData() & ~(1 << POWERED_MASK)); if (data != block.getData()) { return; } BlockFace direction = getFace(data); if (face != direction) { return; } block.setData((byte) (block.getData() | (1 << POWERED_MASK))); block.getWorld().requestPulse(block); new PulseTask(block, true, 4, true).startPulseTask(); } @Override public void receivePulse(GlowBlock block) { byte data = (byte) (block.getData() & ~(1 << POWERED_MASK)); block.setData(data); } public static boolean isPowered(GlowBlock block) { if (block.getType() != Material.OBSERVER) { return false; } return ((block.getData() >> POWERED_MASK) & 1) == 1; } public static BlockFace getFace(GlowBlock block) { if (block.getType() != Material.OBSERVER) { return null; } byte data = (byte) (block.getData() & ~(1 << POWERED_MASK)); return getFace(data); } }