001    package org.bukkit.material;
002    
003    import org.bukkit.Material;
004    import org.bukkit.block.BlockFace;
005    
006    /**
007     * Represents a trap door
008     */
009    public class TrapDoor extends SimpleAttachableMaterialData implements Openable {
010        public TrapDoor() {
011            super(Material.TRAP_DOOR);
012        }
013    
014        /**
015         *
016         * @deprecated Magic value
017         */
018        @Deprecated
019        public TrapDoor(final int type) {
020            super(type);
021        }
022    
023        public TrapDoor(final Material type) {
024            super(type);
025        }
026    
027        /**
028         *
029         * @deprecated Magic value
030         */
031        @Deprecated
032        public TrapDoor(final int type, final byte data) {
033            super(type, data);
034        }
035    
036        /**
037         *
038         * @deprecated Magic value
039         */
040        @Deprecated
041        public TrapDoor(final Material type, final byte data) {
042            super(type, data);
043        }
044    
045        public boolean isOpen() {
046            return ((getData() & 0x4) == 0x4);
047        }
048    
049        public void setOpen(boolean isOpen) {
050            byte data = getData();
051    
052            if (isOpen) {
053                data |= 0x4;
054            } else {
055                data &= ~0x4;
056            }
057    
058            setData(data);
059        }
060    
061        /**
062         * Test if trapdoor is inverted
063         *
064         * @return true if inverted (top half), false if normal (bottom half)
065         */
066        public boolean isInverted() {
067            return ((getData() & 0x8) != 0);
068        }
069    
070        /**
071         * Set trapdoor inverted state
072         *
073         * @param inv - true if inverted (top half), false if normal (bottom half)
074         */
075        public void setInverted(boolean inv) {
076            int dat = getData() & 0x7;
077            if (inv) {
078                dat |= 0x8;
079            }
080            setData((byte) dat);
081        }
082    
083        public BlockFace getAttachedFace() {
084            byte data = (byte) (getData() & 0x3);
085    
086            switch (data) {
087                case 0x0:
088                    return BlockFace.SOUTH;
089    
090                case 0x1:
091                    return BlockFace.NORTH;
092    
093                case 0x2:
094                    return BlockFace.EAST;
095    
096                case 0x3:
097                    return BlockFace.WEST;
098            }
099    
100            return null;
101    
102        }
103    
104        public void setFacingDirection(BlockFace face) {
105            byte data = (byte) (getData() & 0xC);
106    
107            switch (face) {
108                case SOUTH:
109                    data |= 0x1;
110                    break;
111                case WEST:
112                    data |= 0x2;
113                    break;
114                case EAST:
115                    data |= 0x3;
116                    break;
117            }
118    
119            setData(data);
120        }
121    
122        @Override
123        public String toString() {
124            return (isOpen() ? "OPEN " : "CLOSED ") + super.toString() + " with hinges set " + getAttachedFace() + (isInverted() ? " inverted" : "");
125        }
126    
127        @Override
128        public TrapDoor clone() {
129            return (TrapDoor) super.clone();
130        }
131    }