Fork of Poseidon providing Bukkit #1060 to older Beta versions (b1.0-b1.7.3)
1package org.bukkit.material;
2
3import org.bukkit.Material;
4import org.bukkit.block.BlockFace;
5
6/**
7 * MaterialData for signs
8 */
9public class Sign extends MaterialData implements Attachable {
10 public Sign() {
11 super(Material.SIGN_POST);
12 }
13
14 public Sign(final int type) {
15 super(type);
16 }
17
18 public Sign(final Material type) {
19 super(type);
20 }
21
22 public Sign(final int type, final byte data) {
23 super(type, data);
24 }
25
26 public Sign(final Material type, final byte data) {
27 super(type, data);
28 }
29
30 /**
31 * Check if this sign is attached to a wall
32 *
33 * @return true if this sign is attached to a wall, false if set on top of a
34 * block
35 */
36 public boolean isWallSign() {
37 return getItemType() == Material.WALL_SIGN;
38 }
39
40 /**
41 * Gets the face that this block is attached on
42 *
43 * @return BlockFace attached to
44 */
45 public BlockFace getAttachedFace() {
46 if (isWallSign()) {
47 byte data = getData();
48
49 switch (data) {
50 case 0x2:
51 return BlockFace.WEST;
52
53 case 0x3:
54 return BlockFace.EAST;
55
56 case 0x4:
57 return BlockFace.SOUTH;
58
59 case 0x5:
60 return BlockFace.NORTH;
61 }
62
63 return null;
64 } else {
65 return BlockFace.DOWN;
66 }
67 }
68
69 /**
70 * Gets the direction that this sign is currently facing
71 *
72 * @return BlockFace indicating where this sign is facing
73 */
74 public BlockFace getFacing() {
75 byte data = getData();
76
77 if (!isWallSign()) {
78 switch (data) {
79 case 0x0:
80 return BlockFace.WEST;
81
82 case 0x1:
83 return BlockFace.WEST_NORTH_WEST;
84
85 case 0x2:
86 return BlockFace.NORTH_WEST;
87
88 case 0x3:
89 return BlockFace.NORTH_NORTH_WEST;
90
91 case 0x4:
92 return BlockFace.NORTH;
93
94 case 0x5:
95 return BlockFace.NORTH_NORTH_EAST;
96
97 case 0x6:
98 return BlockFace.NORTH_EAST;
99
100 case 0x7:
101 return BlockFace.EAST_NORTH_EAST;
102
103 case 0x8:
104 return BlockFace.EAST;
105
106 case 0x9:
107 return BlockFace.EAST_SOUTH_EAST;
108
109 case 0xA:
110 return BlockFace.SOUTH_EAST;
111
112 case 0xB:
113 return BlockFace.SOUTH_SOUTH_EAST;
114
115 case 0xC:
116 return BlockFace.SOUTH;
117
118 case 0xD:
119 return BlockFace.SOUTH_SOUTH_WEST;
120
121 case 0xE:
122 return BlockFace.SOUTH_WEST;
123
124 case 0xF:
125 return BlockFace.WEST_SOUTH_WEST;
126 }
127
128 return null;
129 } else {
130 return getAttachedFace().getOppositeFace();
131 }
132 }
133
134 public void setFacingDirection(BlockFace face) {
135 byte data;
136
137 if (isWallSign()) {
138 switch (face) {
139 case EAST:
140 data = 0x2;
141 break;
142
143 case WEST:
144 data = 0x3;
145 break;
146
147 case NORTH:
148 data = 0x4;
149 break;
150
151 case SOUTH:
152 default:
153 data = 0x5;
154 }
155 } else {
156 switch (face) {
157 case WEST:
158 data = 0x0;
159 break;
160
161 case WEST_NORTH_WEST:
162 data = 0x1;
163 break;
164
165 case NORTH_WEST:
166 data = 0x2;
167 break;
168
169 case NORTH_NORTH_WEST:
170 data = 0x3;
171 break;
172
173 case NORTH:
174 data = 0x4;
175 break;
176
177 case NORTH_NORTH_EAST:
178 data = 0x5;
179 break;
180
181 case NORTH_EAST:
182 data = 0x6;
183 break;
184
185 case EAST_NORTH_EAST:
186 data = 0x7;
187 break;
188
189 case EAST:
190 data = 0x8;
191 break;
192
193 case EAST_SOUTH_EAST:
194 data = 0x9;
195 break;
196
197 case SOUTH_EAST:
198 data = 0xA;
199 break;
200
201 case SOUTH_SOUTH_EAST:
202 data = 0xB;
203 break;
204
205 case SOUTH:
206 data = 0xC;
207 break;
208
209 case SOUTH_SOUTH_WEST:
210 data = 0xD;
211 break;
212
213 case WEST_SOUTH_WEST:
214 data = 0xF;
215 break;
216
217 case SOUTH_WEST:
218 default:
219 data = 0xE;
220 }
221 }
222
223 setData(data);
224 }
225
226 @Override
227 public String toString() {
228 return super.toString() + " facing " + getFacing();
229 }
230}