SPIGOT-1682: Fixed block data for Beetroot

By: ryanbennitt <ryanbennitt@googlemail.com>
This commit is contained in:
Bukkit/Spigot
2016-03-26 09:26:20 +11:00
parent 3e1845033a
commit c432218993
3 changed files with 142 additions and 8 deletions

View File

@@ -208,8 +208,8 @@ public enum Material {
BEACON(138),
COBBLE_WALL(139),
FLOWER_POT(140, FlowerPot.class),
CARROT(141),
POTATO(142),
CARROT(141, Crops.class),
POTATO(142, Crops.class),
WOOD_BUTTON(143, Button.class),
SKULL(144, Skull.class),
ANVIL(145),

View File

@@ -4,15 +4,43 @@ import org.bukkit.CropState;
import org.bukkit.Material;
/**
* Represents the different types of crops.
* Represents the different types of crops in different states of growth.
*
* @see Material#CROPS
* @see Material#CARROT
* @see Material#POTATO
* @see Material#BEETROOT_BLOCK
* @see Material#NETHER_WARTS
*/
public class Crops extends MaterialData {
protected static final Material DEFAULT_TYPE = Material.CROPS;
protected static final CropState DEFAULT_STATE = CropState.SEEDED;
/**
* Constructs a wheat crop block in the seeded state.
*/
public Crops() {
super(Material.CROPS);
this(DEFAULT_TYPE, DEFAULT_STATE);
}
/**
* Constructs a wheat crop block in the given growth state
*
* @param state The growth state of the crops
*/
public Crops(CropState state) {
this();
this(DEFAULT_TYPE, state);
setState(state);
}
/**
* Constructs a crop block of the given type and in the given growth state
*
* @param type The type of crops
* @param state The growth state of the crops
*/
public Crops(final Material type, final CropState state) {
super(type);
setState(state);
}
@@ -25,8 +53,13 @@ public class Crops extends MaterialData {
super(type);
}
/**
* Constructs a crop block of the given type and in the seeded state
*
* @param type The type of crops
*/
public Crops(final Material type) {
super(type);
this(type, DEFAULT_STATE);
}
/**
@@ -52,19 +85,58 @@ public class Crops extends MaterialData {
/**
* Gets the current growth state of this crop
*
* For crops with only four growth states such as beetroot, only the values SEEDED, SMALL, TALL and RIPE will be
* returned.
*
* @return CropState of this crop
*/
public CropState getState() {
return CropState.getByData(getData());
switch (getItemType()) {
case CROPS:
case CARROT:
case POTATO:
// Mask the data just in case top bit set
return CropState.getByData((byte)(getData() & 0x7));
case BEETROOT_BLOCK:
case NETHER_WARTS:
// Mask the data just in case top bits are set
// Will return SEEDED, SMALL, TALL, RIPE for the three growth data values
return CropState.getByData((byte)(((getData() & 0x3)*7+2)/3)) ;
default:
throw new IllegalArgumentException("Block type is not a crop");
}
}
/**
* Sets the growth state of this crop
*
* For crops with only four growth states such as beetroot, the 8 CropStates are mapped into four states:
*
* SEEDED, SMALL, TALL and RIPE
*
* GERMINATED will change to SEEDED
* VERY_SMALL will change to SMALL
* MEDIUM will change to TALL
* VERY_TALL will change to RIPE
*
* @param state New growth state of this crop
*/
public void setState(CropState state) {
setData(state.getData());
switch (getItemType()) {
case CROPS:
case CARROT:
case POTATO:
// Preserve the top bit in case it is set
setData((byte)((getData() & 0x8)|state.getData()));
break;
case NETHER_WARTS:
case BEETROOT_BLOCK:
// Preserve the top bits in case they are set
setData((byte)((getData() & 0xC)|(state.getData() >> 1)));
break;
default:
throw new IllegalArgumentException("Block type is not a crop");
}
}
@Override