blob: 88703826a6ac9da2f1919248c78d757d1f21a86d [file] [log] [blame] [raw]
package net.glowstone.block;
import java.util.EnumMap;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
/**
* An enum containing an entry for every block describing that block's physical properties.
*/
public enum BlockProperties {
AIR(passthru()),
STONE(),
GRASS(drops(Material.DIRT)),
DIRT(),
COBBLESTONE(),
WOOD(),
SAPLING(passthru()),
BEDROCK(),
WATER(passthru(), physics(), opaque(2)),
STATIONARY_WATER(passthru(), physics(), opaque(2)),
LAVA(passthru(), physics(), emitsLight(15)),
STATIONARY_LAVA(passthru(), physics(), emitsLight(15)),
SAND(physics()),
GRAVEL(physics()),
GOLD_ORE(),
IRON_ORE(),
COAL_ORE(drops(Material.COAL)),
LOG(),
LEAVES(physics()),
SPONGE(),
GLASS(drops()),
LAPIS_ORE(drops(Material.INK_SACK)), // todo: data drops
LAPIS_BLOCK(),
DISPENSER(interact(), place(), redstone()),
SANDSTONE(),
NOTE_BLOCK(interact(), redstone(), entity(GlowNoteBlock.class)),
BED_BLOCK(interact()), // todo: height
POWERED_RAIL(place(), redstone()),
DETECTOR_RAIL(place(), redstone()),
PISTON_STICKY_BASE(place(), redstone()),
WEB(passthru()),
LONG_GRASS(passthru(), drops()),
DEAD_BUSH(passthru(), drops()),
PISTON_BASE(place(), redstone()),
PISTON_EXTENSION(redstone()),
WOOL(),
PISTON_MOVING_PIECE(redstone()),
YELLOW_FLOWER(place(), passthru()),
RED_ROSE(place(), passthru()),
BROWN_MUSHROOM(place(), passthru()),
RED_MUSHROOM(place(), passthru()),
GOLD_BLOCK(),
IRON_BLOCK(),
DOUBLE_STEP(drops(new ItemStack(Material.STEP, 2))),
STEP(place(), passthru()), // todo: height
BRICK(),
TNT(redstone()),
BOOKSHELF(),
MOSSY_COBBLESTONE(),
OBSIDIAN(),
TORCH(place(), passthru(), emitsLight(14)),
FIRE(passthru(), emitsLight(15)),
MOB_SPAWNER(),
WOOD_STAIRS(place(), passthru()),
CHEST(interact()),
REDSTONE_WIRE(redstone()),
DIAMOND_ORE(drops(Material.DIAMOND)),
DIAMOND_BLOCK(),
WORKBENCH(interact()),
CROPS(passthru()),
SOIL(),
FURNACE(interact(), place()),
BURNING_FURNACE(interact(), place()),
SIGN_POST(passthru()),
WOODEN_DOOR(passthru(), interact(), place()),
LADDER(place(), passthru()),
RAILS(place()),
COBBLESTONE_STAIRS(place(), passthru()),
WALL_SIGN(passthru()),
LEVER(place(), interact(), passthru(), redstone()),
STONE_PLATE(place(), passthru(), redstone()),
IRON_DOOR_BLOCK(place(), passthru()),
WOOD_PLATE(place(), passthru(), redstone()),
REDSTONE_ORE(interact()),
GLOWING_REDSTONE_ORE(interact(), physics()),
REDSTONE_TORCH_OFF(passthru(), redstone()),
REDSTONE_TORCH_ON(passthru(), redstone()),
STONE_BUTTON(passthru(), interact(), redstone()),
SNOW(passthru()),
ICE(opaque(2)),
SNOW_BLOCK(),
CACTUS(place(), physics()),
CLAY(drops(new ItemStack(Material.CLAY_BALL, 4))),
SUGAR_CANE_BLOCK(place(), drops(Material.SUGAR_CANE)),
JUKEBOX(interact()),
FENCE(place(), opaque(0)),
PUMPKIN(place()),
NETHERRACK(),
SOUL_SAND(),
GLOWSTONE(drops(new ItemStack(Material.GLOWSTONE_DUST, 4))),
PORTAL(place(), physics()),
JACK_O_LANTERN(place()),
CAKE_BLOCK(passthru()),
DIODE_BLOCK_OFF(passthru(), redstone(), interact()),
DIODE_BLOCK_ON(passthru(), redstone(), interact()),
LOCKED_CHEST(),
TRAP_DOOR(redstone(), interact());
// -----------------
private static EnumMap<Material, BlockProperties> materialMap = new EnumMap<Material, BlockProperties>(Material.class);
static {
for (BlockProperties prop : values()) {
materialMap.put(prop.material, prop);
}
}
public static BlockProperties get(Material material) {
return materialMap.get(material);
}
public static BlockProperties get(int id) {
return materialMap.get(Material.getMaterial(id));
}
// -----------------
private final Material material;
private ItemStack[] drops;
private Class<? extends GlowBlockState> entity;
private boolean physics = false;
private boolean redstone = false;
private boolean interact = false;
private boolean place = false;
private boolean solid = true;
private int emitsLight = 0;
private int blocksLight = 15;
private BlockProperties(Property... props) {
material = Material.getMaterial(toString());
drops = new ItemStack[] { new ItemStack(material, 1) };
for (Property p : props) {
p.apply(this);
}
}
public ItemStack[] getDrops() {
return drops;
}
public Class<? extends GlowBlockState> getEntityClass() {
return entity;
}
public boolean hasPhysics() {
return physics;
}
public boolean hasRedstone() {
return redstone;
}
public boolean isInteractable() {
return interact;
}
public boolean specialPlaceable() {
return place;
}
public boolean isSolid() {
return solid;
}
public int emittedLightLevel() {
return emitsLight;
}
public int blockedLightLevel() {
return blocksLight;
}
// -----------------
private interface Property {
void apply(BlockProperties prop);
}
private static Property drops(final ItemStack... mats) {
return new Property() { public void apply(BlockProperties p) {
p.drops = mats;
}};
}
private static Property drops(final Material mat) {
return new Property() { public void apply(BlockProperties p) {
p.drops = new ItemStack[] { new ItemStack(mat, 1) };
}};
}
private static Property passthru() {
return new Property() { public void apply(BlockProperties p) {
p.solid = false;
p.blocksLight = 0;
}};
}
private static Property opaque(final int level) {
return new Property() { public void apply(BlockProperties p) {
p.blocksLight = level;
}};
}
private static Property emitsLight(final int level) {
return new Property() { public void apply(BlockProperties p) {
p.emitsLight = level;
}};
}
private static Property physics() {
return new Property() { public void apply(BlockProperties p) {
p.physics = true;
}};
}
private static Property redstone() {
return new Property() { public void apply(BlockProperties p) {
p.redstone = true;
}};
}
private static Property interact() {
return new Property() { public void apply(BlockProperties p) {
p.interact = true;
}};
}
private static Property place() {
return new Property() { public void apply(BlockProperties p) {
p.place = true;
}};
}
private static Property entity(final Class<? extends GlowBlockState> clazz) {
return new Property() { public void apply(BlockProperties p) {
p.entity = clazz;
}};
}
}