Bukkit  1.4.7-R1.0
 All Classes Namespaces Files Functions Variables Enumerator Pages
Mushroom.java
Go to the documentation of this file.
1 package org.bukkit.material;
2 
3 import java.util.EnumSet;
4 import java.util.Set;
5 
6 import org.apache.commons.lang.Validate;
7 import org.bukkit.Material;
8 import org.bukkit.block.BlockFace;
9 
13 public class Mushroom extends MaterialData {
14  private static final byte SHROOM_NONE = 0;
15  private static final byte SHROOM_STEM = 10;
16  private static final byte NORTH_LIMIT = 4;
17  private static final byte SOUTH_LIMIT = 6;
18  private static final byte EAST_WEST_LIMIT = 3;
19  private static final byte EAST_REMAINDER = 0;
20  private static final byte WEST_REMAINDER = 1;
21  private static final byte NORTH_SOUTH_MOD = 3;
22  private static final byte EAST_WEST_MOD = 1;
23 
24  public Mushroom(Material shroom) {
25  super(shroom);
26  Validate.isTrue(shroom == Material.HUGE_MUSHROOM_1 || shroom == Material.HUGE_MUSHROOM_2, "Not a mushroom!");
27  }
28 
29  public Mushroom(Material shroom, byte data) {
30  super(shroom, data);
31  Validate.isTrue(shroom == Material.HUGE_MUSHROOM_1 || shroom == Material.HUGE_MUSHROOM_2, "Not a mushroom!");
32  }
33 
34  public Mushroom(int type, byte data){
35  super(type, data);
36  Validate.isTrue(type == Material.HUGE_MUSHROOM_1.getId() || type == Material.HUGE_MUSHROOM_2.getId(), "Not a mushroom!");
37  }
38 
42  public boolean isStem() {
43  return getData() == SHROOM_STEM;
44  }
45 
49  public void setStem() {
50  setData((byte) 10);
51  }
52 
58  public boolean isFacePainted(BlockFace face) {
59  byte data = getData();
60 
61  if (data == SHROOM_NONE || data == SHROOM_STEM) {
62  return false;
63  }
64 
65  switch (face) {
66  case WEST:
67  return data < NORTH_LIMIT;
68  case EAST:
69  return data > SOUTH_LIMIT;
70  case NORTH:
71  return data % EAST_WEST_LIMIT == EAST_REMAINDER;
72  case SOUTH:
73  return data % EAST_WEST_LIMIT == WEST_REMAINDER;
74  case UP:
75  return true;
76  default:
77  return false;
78  }
79  }
80 
87  public void setFacePainted(BlockFace face, boolean painted) {
88  if (painted == isFacePainted(face)) {
89  return;
90  }
91 
92  byte data = getData();
93 
94  if (data == SHROOM_STEM) {
95  data = 5;
96  }
97 
98  switch (face) {
99  case WEST:
100  if (painted) {
101  data -= NORTH_SOUTH_MOD;
102  } else {
103  data += NORTH_SOUTH_MOD;
104  }
105 
106  break;
107  case EAST:
108  if (painted) {
109  data += NORTH_SOUTH_MOD;
110  } else {
111  data -= NORTH_SOUTH_MOD;
112  }
113 
114  break;
115  case NORTH:
116  if (painted) {
117  data += EAST_WEST_MOD;
118  } else {
119  data -= EAST_WEST_MOD;
120  }
121 
122  break;
123  case SOUTH:
124  if (painted) {
125  data -= EAST_WEST_MOD;
126  } else {
127  data += EAST_WEST_MOD;
128  }
129 
130  break;
131  case UP:
132  if (!painted) {
133  data = 0;
134  }
135 
136  break;
137  default:
138  throw new IllegalArgumentException("Can't paint that face of a mushroom!");
139  }
140 
141  setData(data);
142  }
143 
147  public Set<BlockFace> getPaintedFaces() {
148  EnumSet<BlockFace> faces = EnumSet.noneOf(BlockFace.class);
149 
151  faces.add(BlockFace.WEST);
152  }
153 
155  faces.add(BlockFace.NORTH);
156  }
157 
159  faces.add(BlockFace.SOUTH);
160  }
161 
163  faces.add(BlockFace.EAST);
164  }
165 
166  if (isFacePainted(BlockFace.UP)) {
167  faces.add(BlockFace.UP);
168  }
169 
170  return faces;
171  }
172 
173  @Override
174  public String toString() {
175  return Material.getMaterial(getItemTypeId()).toString() + (isStem() ? "{STEM}" : getPaintedFaces());
176  }
177 
178  @Override
179  public Mushroom clone() {
180  return (Mushroom) super.clone();
181  }
182 }