001 package org.bukkit.material;
002
003 import org.bukkit.Material;
004 import org.bukkit.block.BlockFace;
005
006 /**
007 * Represents a fence gate
008 */
009 public class Gate extends MaterialData implements Directional, Openable {
010 private static final byte OPEN_BIT = 0x4;
011 private static final byte DIR_BIT = 0x3;
012 private static final byte GATE_SOUTH = 0x0;
013 private static final byte GATE_WEST = 0x1;
014 private static final byte GATE_NORTH = 0x2;
015 private static final byte GATE_EAST = 0x3;
016
017 public Gate() {
018 super(Material.FENCE_GATE);
019 }
020
021 public Gate(int type, byte data){
022 super(type, data);
023 }
024
025 public Gate(byte data) {
026 super(Material.FENCE_GATE, data);
027 }
028
029 public void setFacingDirection(BlockFace face) {
030 byte data = (byte) (getData() &~ DIR_BIT);
031
032 switch (face) {
033 default:
034 case EAST:
035 data |= GATE_SOUTH;
036 break;
037 case SOUTH:
038 data |= GATE_WEST;
039 break;
040 case WEST:
041 data |= GATE_NORTH;
042 break;
043 case NORTH:
044 data |= GATE_EAST;
045 break;
046 }
047
048 setData(data);
049 }
050
051 public BlockFace getFacing() {
052 switch (getData() & DIR_BIT) {
053 case GATE_SOUTH:
054 return BlockFace.EAST;
055 case GATE_WEST:
056 return BlockFace.SOUTH;
057 case GATE_NORTH:
058 return BlockFace.WEST;
059 case GATE_EAST:
060 return BlockFace.NORTH;
061 }
062
063 return BlockFace.EAST;
064 }
065
066 public boolean isOpen() {
067 return (getData() & OPEN_BIT) > 0;
068 }
069
070 public void setOpen(boolean isOpen) {
071 byte data = getData();
072
073 if (isOpen) {
074 data |= OPEN_BIT;
075 } else {
076 data &= ~OPEN_BIT;
077 }
078
079 setData(data);
080 }
081
082 @Override
083 public String toString() {
084 return (isOpen() ? "OPEN " : "CLOSED ") + " facing and opening " + getFacing();
085 }
086
087 @Override
088 public Gate clone() {
089 return (Gate) super.clone();
090 }
091 }