diff --git a/src/main/java/org/bukkit/GrassSpecies.java b/src/main/java/org/bukkit/GrassSpecies.java new file mode 100644 index 00000000..d7387513 --- /dev/null +++ b/src/main/java/org/bukkit/GrassSpecies.java @@ -0,0 +1,57 @@ +package org.bukkit; + +import java.util.HashMap; +import java.util.Map; + +/** + * Represents the different types of grass. + */ +public enum GrassSpecies { + + /** + * Represents the dead looking grass. + */ + DEAD((byte) 0x0), + /** + * Represents the normal grass species. + */ + NORMAL((byte) 0x1), + /** + * Represents the fern-looking grass species. + */ + FERN_LIKE((byte) 0x2); + + private final byte data; + private final static Map species = new HashMap(); + + private GrassSpecies(final byte data) { + this.data = data; + } + + /** + * Gets the associated data value representing this species + * + * @return A byte containing the data value of this grass species + */ + public byte getData() { + return data; + } + + /** + * Gets the GrassSpecies with the given data value + * + * @param data + * Data value to fetch + * @return The {@link GrassSpecies} representing the given value, or null if + * it doesn't exist + */ + public static GrassSpecies getByData(final byte data) { + return species.get(data); + } + + static { + for (GrassSpecies s : GrassSpecies.values()) { + species.put(s.getData(), s); + } + } +} diff --git a/src/main/java/org/bukkit/Material.java b/src/main/java/org/bukkit/Material.java index 6e42e7ee..715c6c6f 100644 --- a/src/main/java/org/bukkit/Material.java +++ b/src/main/java/org/bukkit/Material.java @@ -42,7 +42,7 @@ public enum Material { POWERED_RAIL(27, PoweredRail.class), DETECTOR_RAIL(28, DetectorRail.class), WEB(30), - LONG_GRASS(31), + LONG_GRASS(31, LongGrass.class), DEAD_BUSH(32), WOOL(35, Wool.class), YELLOW_FLOWER(37), diff --git a/src/main/java/org/bukkit/material/LongGrass.java b/src/main/java/org/bukkit/material/LongGrass.java new file mode 100644 index 00000000..8413519e --- /dev/null +++ b/src/main/java/org/bukkit/material/LongGrass.java @@ -0,0 +1,57 @@ +package org.bukkit.material; + +import org.bukkit.GrassSpecies; +import org.bukkit.Material; + +/** + * Represents the different types of long grasses. + */ +public class LongGrass extends MaterialData { + public LongGrass() { + super(Material.LOG); + } + + public LongGrass(GrassSpecies species) { + this(); + setSpecies(species); + } + + public LongGrass(final int type) { + super(type); + } + + public LongGrass(final Material type) { + super(type); + } + + public LongGrass(final int type, final byte data) { + super(type, data); + } + + public LongGrass(final Material type, final byte data) { + super(type, data); + } + + /** + * Gets the current species of this grass + * + * @return GrassSpecies of this grass + */ + public GrassSpecies getSpecies() { + return GrassSpecies.getByData(getData()); + } + + /** + * Sets the species of this grass + * + * @param species New species of this grass + */ + public void setSpecies(GrassSpecies species) { + setData(species.getData()); + } + + @Override + public String toString() { + return getSpecies() + " " + super.toString(); + } +} diff --git a/src/main/java/org/bukkit/material/TrapDoor.java b/src/main/java/org/bukkit/material/TrapDoor.java index ad231bb0..b16835db 100644 --- a/src/main/java/org/bukkit/material/TrapDoor.java +++ b/src/main/java/org/bukkit/material/TrapDoor.java @@ -1,12 +1,12 @@ - package org.bukkit.material; import org.bukkit.Material; +import org.bukkit.block.BlockFace; /** * Represents a trap door */ -public class TrapDoor extends MaterialData implements Redstone { +public class TrapDoor extends SimpleAttachableMaterialData { public TrapDoor() { super(Material.TRAP_DOOR); } @@ -28,17 +28,56 @@ public class TrapDoor extends MaterialData implements Redstone { } /** - * Gets the current state of this Material, indicating if it's powered or - * unpowered + * Check to see if the trap door is open. * - * @return true if powered, otherwise false + * @return true if the trap door is open. */ - public boolean isPowered() { - return (getData() & 0x8) == 0x8; + public boolean isOpen() { + return ((getData() & 0x4) == 0x4); + } + + public BlockFace getAttachedFace() { + byte data = (byte) (getData() & 0x3); + + switch (data) { + case 0x0: + return BlockFace.WEST; + + case 0x1: + return BlockFace.EAST; + + case 0x2: + return BlockFace.SOUTH; + + case 0x3: + return BlockFace.NORTH; + } + + return null; + + } + + public void setFacingDirection(BlockFace face) { + byte data = (byte) (getData() & 0x4); + + switch (face) { + case WEST: + data |= 0x1; + break; + case NORTH: + data |= 0x2; + break; + case SOUTH: + data |= 0x3; + break; + } + + setData(data); } @Override public String toString() { - return super.toString() + "[powered=" + isPowered() + "]"; + return (isOpen() ? "OPEN " : "CLOSED ") + super.toString() + " with hinges set " + getAttachedFace(); } + } \ No newline at end of file