[Bleeding] Add new MaterialData classes for new blocks and update existing blocks with new data

By: Mike Primm <mike@primmhome.com>
This commit is contained in:
Bukkit/Spigot 2012-08-04 21:23:59 -05:00
parent 64ad50197f
commit 5154864bbc
12 changed files with 640 additions and 21 deletions

View File

@ -72,7 +72,7 @@ public enum Material {
FIRE(51),
MOB_SPAWNER(52),
WOOD_STAIRS(53, Stairs.class),
CHEST(54),
CHEST(54, Chest.class),
REDSTONE_WIRE(55, RedstoneWire.class),
DIAMOND_ORE(56),
DIAMOND_BLOCK(57),
@ -291,18 +291,18 @@ public enum Material {
RECORD_9(2264, 1),
RECORD_10(2265, 1),
RECORD_11(2266, 1),
WOOD_DOUBLE_STEP(125, Step.class),
WOOD_STEP(126, Step.class),
COCOA(127),
WOOD_DOUBLE_STEP(125, WoodenStep.class),
WOOD_STEP(126, WoodenStep.class),
COCOA(127, CocoaPlant.class),
SANDSTONE_STAIRS(128, Stairs.class),
EMERALD_ORE(129),
ENDER_CHEST(130),
TRIPWIRE_HOOK(131, Button.class),
TRIPWIRE(132),
ENDER_CHEST(130, EnderChest.class),
TRIPWIRE_HOOK(131, TripwireHook.class),
TRIPWIRE(132, Tripwire.class),
EMERALD_BLOCK(133),
SPRUCE_WOOD_STAIRS(134),
BIRCH_WOOD_STAIRS(135),
JUNGLE_WOOD_STAIRS(136),
SPRUCE_WOOD_STAIRS(134, Stairs.class),
BIRCH_WOOD_STAIRS(135, Stairs.class),
JUNGLE_WOOD_STAIRS(136, Stairs.class),
BOOK_AND_QUILL(386, 1),
WRITTEN_BOOK(387, 1),
EMERALD(388, 64);

View File

@ -0,0 +1,45 @@
package org.bukkit.material;
import org.bukkit.Material;
import org.bukkit.block.BlockFace;
/**
* Represents a chest
*/
public class Chest extends FurnaceAndDispenser {
public Chest() {
super(Material.CHEST);
}
/**
* Instantiate a chest facing in a particular direction.
*
* @param direction the direction the chest's lit opens towards
*/
public Chest(BlockFace direction) {
this();
setFacingDirection(direction);
}
public Chest(final int type) {
super(type);
}
public Chest(final Material type) {
super(type);
}
public Chest(final int type, final byte data) {
super(type, data);
}
public Chest(final Material type, final byte data) {
super(type, data);
}
@Override
public Chest clone() {
return (Chest) super.clone();
}
}

View File

@ -0,0 +1,117 @@
package org.bukkit.material;
import org.bukkit.Material;
import org.bukkit.block.BlockFace;
/**
* Represents the cocoa plant
*/
public class CocoaPlant extends MaterialData implements Directional {
public enum CocoaPlantSize {
SMALL,
MEDIUM,
LARGE
}
public CocoaPlant() {
super(Material.COCOA);
}
public CocoaPlant(final int type) {
super(type);
}
public CocoaPlant(final int type, final byte data) {
super(type, data);
}
public CocoaPlant(CocoaPlantSize sz) {
this();
setSize(sz);
}
public CocoaPlant(CocoaPlantSize sz, BlockFace dir) {
this();
setSize(sz);
setFacingDirection(dir);
}
/**
* Get size of plant
* @return size
*/
public CocoaPlantSize getSize() {
switch (getData() & 0xC) {
case 0:
return CocoaPlantSize.SMALL;
case 4:
return CocoaPlantSize.MEDIUM;
default:
return CocoaPlantSize.LARGE;
}
}
/**
* Set size of plant
* @param sz - size of plant
*/
public void setSize(CocoaPlantSize sz) {
int dat = getData() & 0x3;
switch (sz) {
case SMALL:
break;
case MEDIUM:
dat |= 0x4;
break;
case LARGE:
dat |= 0x8;
break;
}
setData((byte) dat);
}
public void setFacingDirection(BlockFace face) {
int dat = getData() & 0xC;
switch (face) {
case WEST:
break;
case NORTH:
dat |= 0x1;
break;
case EAST:
dat |= 0x2;
break;
case SOUTH:
dat |= 0x3;
break;
default:
break;
}
setData((byte) dat);
}
public BlockFace getFacing() {
switch (getData() & 0x3) {
case 0:
return BlockFace.WEST;
case 1:
return BlockFace.NORTH;
case 2:
return BlockFace.EAST;
case 3:
return BlockFace.SOUTH;
}
return null;
}
@Override
public CocoaPlant clone() {
return (CocoaPlant) super.clone();
}
@Override
public String toString() {
return super.toString() + " facing " + getFacing() + " " + getSize();
}
}

View File

@ -0,0 +1,45 @@
package org.bukkit.material;
import org.bukkit.Material;
import org.bukkit.block.BlockFace;
/**
* Represents an ender chest
*/
public class EnderChest extends FurnaceAndDispenser {
public EnderChest() {
super(Material.ENDER_CHEST);
}
/**
* Instantiate an ender chest facing in a particular direction.
*
* @param direction the direction the ender chest's lid opens towards
*/
public EnderChest(BlockFace direction) {
this();
setFacingDirection(direction);
}
public EnderChest(final int type) {
super(type);
}
public EnderChest(final Material type) {
super(type);
}
public EnderChest(final int type, final byte data) {
super(type, data);
}
public EnderChest(final Material type, final byte data) {
super(type, data);
}
@Override
public EnderChest clone() {
return (EnderChest) super.clone();
}
}

View File

@ -70,6 +70,11 @@ public class Lever extends SimpleAttachableMaterialData implements Redstone {
case 0x5:
case 0x6:
return BlockFace.DOWN;
case 0x0:
case 0x7:
return BlockFace.UP;
}
return null;
@ -80,8 +85,9 @@ public class Lever extends SimpleAttachableMaterialData implements Redstone {
*/
public void setFacingDirection(BlockFace face) {
byte data = (byte) (getData() & 0x8);
if (getAttachedFace() == BlockFace.DOWN) {
BlockFace attach = getAttachedFace();
if (attach == BlockFace.DOWN) {
switch (face) {
case WEST:
case EAST:
@ -93,6 +99,18 @@ public class Lever extends SimpleAttachableMaterialData implements Redstone {
data |= 0x6;
break;
}
} else if (attach == BlockFace.UP) {
switch (face) {
case WEST:
case EAST:
data |= 0x7;
break;
case SOUTH:
case NORTH:
data |= 0x0;
break;
}
} else {
switch (face) {
case SOUTH:

View File

@ -30,7 +30,7 @@ public class Stairs extends MaterialData implements Directional {
public BlockFace getAscendingDirection() {
byte data = getData();
switch (data) {
switch (data & 0x3) {
case 0x0:
default:
return BlockFace.SOUTH;
@ -78,7 +78,7 @@ public class Stairs extends MaterialData implements Directional {
break;
}
setData(data);
setData((byte) ((getData() & 0xC) | data));
}
/**
@ -88,9 +88,29 @@ public class Stairs extends MaterialData implements Directional {
return getDescendingDirection();
}
/**
* Test if step is inverted
* @return true if inverted (top half), false if normal (bottom half)
*/
public boolean isInverted() {
return ((getData() & 0x4) != 0);
}
/**
* Set step inverted state
* @param inv - true if step is inverted (top half), false if step is normal (bottom half)
*/
public void setInverted(boolean inv) {
int dat = getData() & 0x3;
if (inv) {
dat |= 0x4;
}
setData((byte) dat);
}
@Override
public String toString() {
return super.toString() + " facing " + getFacing();
return super.toString() + " facing " + getFacing() + (isInverted()?" inverted":"");
}
@Override

View File

@ -47,8 +47,43 @@ public class Step extends TexturedMaterial {
return textures;
}
/**
* Test if step is inverted
* @return true if inverted (top half), false if normal (bottom half)
*/
public boolean isInverted() {
return ((getData() & 0x8) != 0);
}
/**
* Set step inverted state
* @param inv - true if step is inverted (top half), false if step is normal (bottom half)
*/
public void setInverted(boolean inv) {
int dat = getData() & 0x7;
if (inv) {
dat |= 0x8;
}
setData((byte) dat);
}
@Override
protected int getTextureIndex() {
return getData() & 0x7;
}
@Override
protected void setTextureIndex(int idx) {
setData((byte) ((getData() & 0x8) | idx));
}
@Override
public Step clone() {
return (Step) super.clone();
}
@Override
public String toString() {
return super.toString() + (isInverted()?"inverted":"");
}
}

View File

@ -38,7 +38,7 @@ public abstract class TexturedMaterial extends MaterialData {
* @return Material of this block
*/
public Material getMaterial() {
int n = (int) getData();
int n = getTextureIndex();
if (n > getTextures().size() - 1) {
n = 0;
}
@ -54,12 +54,28 @@ public abstract class TexturedMaterial extends MaterialData {
*/
public void setMaterial(Material material) {
if (getTextures().contains(material)) {
setData((byte) getTextures().indexOf(material));
setTextureIndex(getTextures().indexOf(material));
} else {
setData((byte) 0x0);
setTextureIndex(0x0);
}
}
/**
* Get material index from data
* @return index of data in textures list
*/
protected int getTextureIndex() {
return getData(); // Default to using all bits - override for other mappings
}
/**
* Set material index
* @param idx - index of data in textures list
*/
protected void setTextureIndex(int idx) {
setData((byte) idx); // Defult to using all bits - override for other mappings
}
@Override
public String toString() {
return getMaterial() + " " + super.toString();

View File

@ -2,6 +2,7 @@ package org.bukkit.material;
import org.bukkit.Material;
import org.bukkit.TreeSpecies;
import org.bukkit.block.BlockFace;
/**
* Represents the different types of Trees.
@ -16,6 +17,12 @@ public class Tree extends MaterialData {
setSpecies(species);
}
public Tree(TreeSpecies species, BlockFace dir) {
this();
setSpecies(species);
setDirection(dir);
}
public Tree(final int type) {
super(type);
}
@ -38,7 +45,7 @@ public class Tree extends MaterialData {
* @return TreeSpecies of this tree
*/
public TreeSpecies getSpecies() {
return TreeSpecies.getByData(getData());
return TreeSpecies.getByData((byte) (getData() & 0x3));
}
/**
@ -47,12 +54,57 @@ public class Tree extends MaterialData {
* @param species New species of this tree
*/
public void setSpecies(TreeSpecies species) {
setData(species.getData());
setData((byte) ((getData() & 0xC) | species.getData()));
}
/**
* Get direction of the log
*
* @return BlockFace.TOP for upright (default), BlockFace.EAST (east-west), BlockFace.NORTH (north-sout), BlockFace.SELF (directionless)
*/
public BlockFace getDirection() {
switch ((getData() >> 2) & 0x3) {
case 0: // Up-down
default:
return BlockFace.UP;
case 1: // North-south
return BlockFace.NORTH;
case 2: // East-west
return BlockFace.EAST;
case 3: // Directionless (bark on all sides)
return BlockFace.SELF;
}
}
/**
* Set direction of the log
* @param dir - direction of end of log (BlockFace.SELF for no direction)
*/
public void setDirection(BlockFace dir) {
int dat;
switch (dir) {
case UP:
case DOWN:
default:
dat = 0;
break;
case NORTH:
case SOUTH:
dat = 1;
break;
case EAST:
case WEST:
dat = 2;
break;
case SELF:
dat = 3;
break;
}
setData((byte) ((getData() & 0x3) | (dat << 2)));
}
@Override
public String toString() {
return getSpecies() + " " + super.toString();
return getSpecies() + " " + getDirection() + " " + super.toString();
}
@Override

View File

@ -0,0 +1,71 @@
package org.bukkit.material;
import org.bukkit.Material;
/**
* Represents the tripwire
*/
public class Tripwire extends MaterialData {
public Tripwire() {
super(Material.TRIPWIRE);
}
public Tripwire(final int type) {
super(type);
}
public Tripwire(final int type, final byte data) {
super(type, data);
}
/**
* Test if tripwire is currently activated
* @return true if activated, false if not
*/
public boolean isActivated() {
return (getData() & 0x4) != 0;
}
/**
* Set tripwire activated state
* @param act - true if activated, false if not
*/
public void setActivated(boolean act) {
int dat = getData() & (0x8 | 0x3);
if (act) {
dat |= 0x4;
}
setData((byte) dat);
}
/**
* Test if object triggering this tripwire directly
* @return true if object activating tripwire, false if not
*/
public boolean isObjectTriggering() {
return (getData() & 0x1) != 0;
}
/**
* Set object triggering state for this tripwire
* @param trig - true if object activating tripwire, false if not
*/
public void setObjectTriggering(boolean trig) {
int dat = getData() & 0xE;
if (trig) {
dat |= 0x1;
}
setData((byte) dat);
}
@Override
public Tripwire clone() {
return (Tripwire) super.clone();
}
@Override
public String toString() {
return super.toString() + (isActivated()?" Activated":"") + (isObjectTriggering()?" Triggered":"");
}
}

View File

@ -0,0 +1,115 @@
package org.bukkit.material;
import org.bukkit.Material;
import org.bukkit.block.BlockFace;
/**
* Represents the tripwire hook
*/
public class TripwireHook extends MaterialData implements Directional, Redstone {
public TripwireHook() {
super(Material.TRIPWIRE_HOOK);
}
public TripwireHook(final int type) {
super(type);
}
public TripwireHook(final int type, final byte data) {
super(type, data);
}
public TripwireHook(BlockFace dir) {
this();
setFacingDirection(dir);
}
/**
* Test if tripwire is connected
* @return true if connected, false if not
*/
public boolean isConnected() {
return (getData() & 0x4) != 0;
}
/**
* Set tripwire connection state
* @param connected - true if connected, false if not
*/
public void setConnected(boolean connected) {
int dat = getData() & (0x8 | 0x3);
if (connected) {
dat |= 0x4;
}
setData((byte) dat);
}
/**
* Test if hook is currently activated
* @return true if activated, false if not
*/
public boolean isActivated() {
return (getData() & 0x8) != 0;
}
/**
* Set hook activated state
* @param act - true if activated, false if not
*/
public void setActivated(boolean act) {
int dat = getData() & (0x4 | 0x3);
if (act) {
dat |= 0x8;
}
setData((byte) dat);
}
public void setFacingDirection(BlockFace face) {
int dat = getData() & 0xC;
switch (face) {
case EAST:
break;
case SOUTH:
dat |= 0x1;
break;
case WEST:
dat |= 0x2;
break;
case NORTH:
dat |= 0x3;
break;
default:
break;
}
setData((byte) dat);
}
public BlockFace getFacing() {
switch (getData() & 0x3) {
case 0:
return BlockFace.EAST;
case 1:
return BlockFace.SOUTH;
case 2:
return BlockFace.WEST;
case 3:
return BlockFace.NORTH;
}
return null;
}
public boolean isPowered() {
return isActivated();
}
@Override
public TripwireHook clone() {
return (TripwireHook) super.clone();
}
@Override
public String toString() {
return super.toString() + " facing " + getFacing() + (isActivated()?" Activated":"") + (isConnected()?" Connected":"");
}
}

View File

@ -0,0 +1,85 @@
package org.bukkit.material;
import org.bukkit.Material;
import org.bukkit.TreeSpecies;
/**
* Represents the different types of wooden steps.
*/
public class WoodenStep extends MaterialData {
public WoodenStep() {
super(Material.WOOD_STEP);
}
public WoodenStep(final int type) {
super(type);
}
public WoodenStep(TreeSpecies species) {
this();
setSpecies(species);
}
public WoodenStep(TreeSpecies species, boolean inv) {
this();
setSpecies(species);
setInverted(inv);
}
public WoodenStep(final int type, final byte data) {
super(type, data);
}
public WoodenStep(final Material type, final byte data) {
super(type, data);
}
/**
* Gets the current species of this tree
*
* @return TreeSpecies of this tree
*/
public TreeSpecies getSpecies() {
return TreeSpecies.getByData((byte) (getData() & 0x3));
}
/**
* Sets the species of this tree
*
* @param species New species of this tree
*/
public void setSpecies(TreeSpecies species) {
setData((byte) ((getData() & 0xC) | species.getData()));
}
/**
* Test if step is inverted
* @return true if inverted (top half), false if normal (bottom half)
*/
public boolean isInverted() {
return ((getData() & 0x8) != 0);
}
/**
* Set step inverted state
* @param inv - true if step is inverted (top half), false if step is normal (bottom half)
*/
public void setInverted(boolean inv) {
int dat = getData() & 0x7;
if (inv) {
dat |= 0x8;
}
setData((byte) dat);
}
@Override
public WoodenStep clone() {
return (WoodenStep) super.clone();
}
@Override
public String toString() {
return super.toString() + " " + getSpecies() + (isInverted()?" inverted":"");
}
}