001    package org.bukkit.material;
002    
003    import org.bukkit.Material;
004    import org.bukkit.block.BlockFace;
005    
006    /**
007     * Represents the tripwire hook
008     */
009    public class TripwireHook extends SimpleAttachableMaterialData implements Redstone {
010    
011        public TripwireHook() {
012            super(Material.TRIPWIRE_HOOK);
013        }
014    
015        /**
016         *
017         * @deprecated Magic value
018         */
019        @Deprecated
020        public TripwireHook(final int type) {
021            super(type);
022        }
023    
024        /**
025         *
026         * @deprecated Magic value
027         */
028        @Deprecated
029        public TripwireHook(final int type, final byte data) {
030            super(type, data);
031        }
032    
033        public TripwireHook(BlockFace dir) {
034            this();
035            setFacingDirection(dir);
036        }
037    
038        /**
039         * Test if tripwire is connected
040         *
041         * @return true if connected, false if not
042         */
043        public boolean isConnected() {
044            return (getData() & 0x4) != 0;
045        }
046    
047        /**
048         * Set tripwire connection state
049         *
050         * @param connected - true if connected, false if not
051         */
052        public void setConnected(boolean connected) {
053            int dat = getData() & (0x8 | 0x3);
054            if (connected) {
055                dat |= 0x4;
056            }
057            setData((byte) dat);
058        }
059    
060        /**
061         * Test if hook is currently activated
062         *
063         * @return true if activated, false if not
064         */
065        public boolean isActivated() {
066            return (getData() & 0x8) != 0;
067        }
068    
069        /**
070         * Set hook activated state
071         *
072         * @param act - true if activated, false if not
073         */
074        public void setActivated(boolean act) {
075            int dat = getData() & (0x4 | 0x3);
076            if (act) {
077                dat |= 0x8;
078            }
079            setData((byte) dat);
080        }
081    
082        public void setFacingDirection(BlockFace face) {
083            int dat = getData() & 0xC;
084            switch (face) {
085            case WEST:
086                dat |= 0x1;
087                break;
088            case NORTH:
089                dat |= 0x2;
090                break;
091            case EAST:
092                dat |= 0x3;
093                break;
094            case SOUTH:
095            default:
096                break;
097            }
098            setData((byte) dat);
099        }
100    
101        public BlockFace getAttachedFace() {
102            switch (getData() & 0x3) {
103            case 0:
104                return BlockFace.NORTH;
105            case 1:
106                return BlockFace.EAST;
107            case 2:
108                return BlockFace.SOUTH;
109            case 3:
110                return BlockFace.WEST;
111            }
112            return null;
113        }
114    
115        public boolean isPowered() {
116            return isActivated();
117        }
118    
119        @Override
120        public TripwireHook clone() {
121            return (TripwireHook) super.clone();
122        }
123    
124        @Override
125        public String toString() {
126            return super.toString() + " facing " + getFacing() + (isActivated()?" Activated":"") + (isConnected()?" Connected":"");
127        }
128    }