Fork of Poseidon providing Bukkit #1060 to older Beta versions (b1.0-b1.7.3)
at develop 230 lines 5.3 kB view raw
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}