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