001    package org.bukkit.material;
002    
003    import org.bukkit.Material;
004    import org.bukkit.block.BlockFace;
005    
006    /**
007     * Material data for the piston extension block
008     */
009    public class PistonExtensionMaterial extends MaterialData implements Attachable {
010        /**
011         *
012         * @deprecated Magic value
013         */
014        @Deprecated
015        public PistonExtensionMaterial(final int type) {
016            super(type);
017        }
018    
019        public PistonExtensionMaterial(final Material type) {
020            super(type);
021        }
022    
023        /**
024         *
025         * @deprecated Magic value
026         */
027        @Deprecated
028        public PistonExtensionMaterial(final int type, final byte data) {
029            super(type, data);
030        }
031    
032        /**
033         *
034         * @deprecated Magic value
035         */
036        @Deprecated
037        public PistonExtensionMaterial(final Material type, final byte data) {
038            super(type, data);
039        }
040    
041        public void setFacingDirection(BlockFace face) {
042            byte data = (byte) (getData() & 0x8);
043    
044            switch (face) {
045            case UP:
046                data |= 1;
047                break;
048            case NORTH:
049                data |= 2;
050                break;
051            case SOUTH:
052                data |= 3;
053                break;
054            case WEST:
055                data |= 4;
056                break;
057            case EAST:
058                data |= 5;
059                break;
060            }
061            setData(data);
062        }
063    
064        public BlockFace getFacing() {
065            byte dir = (byte) (getData() & 7);
066    
067            switch (dir) {
068            case 0:
069                return BlockFace.DOWN;
070            case 1:
071                return BlockFace.UP;
072            case 2:
073                return BlockFace.NORTH;
074            case 3:
075                return BlockFace.SOUTH;
076            case 4:
077                return BlockFace.WEST;
078            case 5:
079                return BlockFace.EAST;
080            default:
081                return BlockFace.SELF;
082            }
083        }
084    
085        /**
086         * Checks if this piston extension is sticky, and returns true if so
087         *
088         * @return true if this piston is "sticky", or false
089         */
090        public boolean isSticky() {
091            return (getData() & 8) == 8;
092        }
093    
094        /**
095         * Sets whether or not this extension is sticky
096         *
097         * @param sticky true if sticky, otherwise false
098         */
099        public void setSticky(boolean sticky) {
100            setData((byte) (sticky ? (getData() | 0x8) : (getData() & ~0x8)));
101        }
102    
103        public BlockFace getAttachedFace() {
104            return getFacing().getOppositeFace();
105        }
106    
107        @Override
108        public PistonExtensionMaterial clone() {
109            return (PistonExtensionMaterial) super.clone();
110        }
111    }