001 package org.bukkit.material;
002
003 import org.bukkit.block.BlockFace;
004 import org.bukkit.Material;
005
006 /**
007 * MaterialData for signs
008 */
009 public class Sign extends MaterialData implements Attachable {
010 public Sign() {
011 super(Material.SIGN_POST);
012 }
013
014 /**
015 *
016 * @deprecated Magic value
017 */
018 @Deprecated
019 public Sign(final int type) {
020 super(type);
021 }
022
023 public Sign(final Material type) {
024 super(type);
025 }
026
027 /**
028 *
029 * @deprecated Magic value
030 */
031 @Deprecated
032 public Sign(final int type, final byte data) {
033 super(type, data);
034 }
035
036 /**
037 *
038 * @deprecated Magic value
039 */
040 @Deprecated
041 public Sign(final Material type, final byte data) {
042 super(type, data);
043 }
044
045 /**
046 * Check if this sign is attached to a wall
047 *
048 * @return true if this sign is attached to a wall, false if set on top of
049 * a block
050 */
051 public boolean isWallSign() {
052 return getItemType() == Material.WALL_SIGN;
053 }
054
055 /**
056 * Gets the face that this block is attached on
057 *
058 * @return BlockFace attached to
059 */
060 public BlockFace getAttachedFace() {
061 if (isWallSign()) {
062 byte data = getData();
063
064 switch (data) {
065 case 0x2:
066 return BlockFace.SOUTH;
067
068 case 0x3:
069 return BlockFace.NORTH;
070
071 case 0x4:
072 return BlockFace.EAST;
073
074 case 0x5:
075 return BlockFace.WEST;
076 }
077
078 return null;
079 } else {
080 return BlockFace.DOWN;
081 }
082 }
083
084 /**
085 * Gets the direction that this sign is currently facing
086 *
087 * @return BlockFace indicating where this sign is facing
088 */
089 public BlockFace getFacing() {
090 byte data = getData();
091
092 if (!isWallSign()) {
093 switch (data) {
094 case 0x0:
095 return BlockFace.SOUTH;
096
097 case 0x1:
098 return BlockFace.SOUTH_SOUTH_WEST;
099
100 case 0x2:
101 return BlockFace.SOUTH_WEST;
102
103 case 0x3:
104 return BlockFace.WEST_SOUTH_WEST;
105
106 case 0x4:
107 return BlockFace.WEST;
108
109 case 0x5:
110 return BlockFace.WEST_NORTH_WEST;
111
112 case 0x6:
113 return BlockFace.NORTH_WEST;
114
115 case 0x7:
116 return BlockFace.NORTH_NORTH_WEST;
117
118 case 0x8:
119 return BlockFace.NORTH;
120
121 case 0x9:
122 return BlockFace.NORTH_NORTH_EAST;
123
124 case 0xA:
125 return BlockFace.NORTH_EAST;
126
127 case 0xB:
128 return BlockFace.EAST_NORTH_EAST;
129
130 case 0xC:
131 return BlockFace.EAST;
132
133 case 0xD:
134 return BlockFace.EAST_SOUTH_EAST;
135
136 case 0xE:
137 return BlockFace.SOUTH_EAST;
138
139 case 0xF:
140 return BlockFace.SOUTH_SOUTH_EAST;
141 }
142
143 return null;
144 } else {
145 return getAttachedFace().getOppositeFace();
146 }
147 }
148
149 public void setFacingDirection(BlockFace face) {
150 byte data;
151
152 if (isWallSign()) {
153 switch (face) {
154 case NORTH:
155 data = 0x2;
156 break;
157
158 case SOUTH:
159 data = 0x3;
160 break;
161
162 case WEST:
163 data = 0x4;
164 break;
165
166 case EAST:
167 default:
168 data = 0x5;
169 }
170 } else {
171 switch (face) {
172 case SOUTH:
173 data = 0x0;
174 break;
175
176 case SOUTH_SOUTH_WEST:
177 data = 0x1;
178 break;
179
180 case SOUTH_WEST:
181 data = 0x2;
182 break;
183
184 case WEST_SOUTH_WEST:
185 data = 0x3;
186 break;
187
188 case WEST:
189 data = 0x4;
190 break;
191
192 case WEST_NORTH_WEST:
193 data = 0x5;
194 break;
195
196 case NORTH_WEST:
197 data = 0x6;
198 break;
199
200 case NORTH_NORTH_WEST:
201 data = 0x7;
202 break;
203
204 case NORTH:
205 data = 0x8;
206 break;
207
208 case NORTH_NORTH_EAST:
209 data = 0x9;
210 break;
211
212 case NORTH_EAST:
213 data = 0xA;
214 break;
215
216 case EAST_NORTH_EAST:
217 data = 0xB;
218 break;
219
220 case EAST:
221 data = 0xC;
222 break;
223
224 case EAST_SOUTH_EAST:
225 data = 0xD;
226 break;
227
228 case SOUTH_SOUTH_EAST:
229 data = 0xF;
230 break;
231
232 case SOUTH_EAST:
233 default:
234 data = 0xE;
235 }
236 }
237
238 setData(data);
239 }
240
241 @Override
242 public String toString() {
243 return super.toString() + " facing " + getFacing();
244 }
245
246 @Override
247 public Sign clone() {
248 return (Sign) super.clone();
249 }
250 }