3 import java.lang.reflect.Constructor;
6 import org.apache.commons.lang.Validate;
7 import org.bukkit.map.MapView;
8 import org.bukkit.material.Bed;
9 import org.bukkit.material.Button;
10 import org.bukkit.material.Cake;
11 import org.bukkit.material.Cauldron;
12 import org.bukkit.material.Chest;
13 import org.bukkit.material.Coal;
14 import org.bukkit.material.CocoaPlant;
15 import org.bukkit.material.Command;
16 import org.bukkit.material.Crops;
17 import org.bukkit.material.DetectorRail;
18 import org.bukkit.material.Diode;
19 import org.bukkit.material.Dispenser;
20 import org.bukkit.material.Door;
21 import org.bukkit.material.Dye;
22 import org.bukkit.material.EnderChest;
23 import org.bukkit.material.FlowerPot;
24 import org.bukkit.material.Furnace;
25 import org.bukkit.material.Gate;
26 import org.bukkit.material.Ladder;
27 import org.bukkit.material.Lever;
28 import org.bukkit.material.LongGrass;
29 import org.bukkit.material.MaterialData;
30 import org.bukkit.material.MonsterEggs;
31 import org.bukkit.material.Mushroom;
32 import org.bukkit.material.PistonBaseMaterial;
33 import org.bukkit.material.PistonExtensionMaterial;
34 import org.bukkit.material.PoweredRail;
35 import org.bukkit.material.PressurePlate;
36 import org.bukkit.material.Pumpkin;
37 import org.bukkit.material.Rails;
38 import org.bukkit.material.RedstoneTorch;
39 import org.bukkit.material.RedstoneWire;
40 import org.bukkit.material.Sandstone;
41 import org.bukkit.material.Sign;
42 import org.bukkit.material.Skull;
43 import org.bukkit.material.SmoothBrick;
44 import org.bukkit.material.SpawnEgg;
45 import org.bukkit.material.Stairs;
46 import org.bukkit.material.Step;
47 import org.bukkit.material.Torch;
48 import org.bukkit.material.TrapDoor;
49 import org.bukkit.material.Tree;
50 import org.bukkit.material.Tripwire;
51 import org.bukkit.material.TripwireHook;
52 import org.bukkit.material.Vine;
53 import org.bukkit.material.WoodenStep;
54 import org.bukkit.material.Wool;
55 import org.bukkit.potion.Potion;
56 import org.bukkit.util.Java15Compat;
58 import com.google.common.collect.Maps;
379 private final int id;
380 private final Constructor<? extends MaterialData> ctor;
382 private final static Map<String, Material> BY_NAME = Maps.newHashMap();
383 private final int maxStack;
384 private final short durability;
390 private Material(
final int id,
final int stack) {
394 private Material(
final int id,
final int stack,
final int durability) {
395 this(id, stack, durability, MaterialData.class);
398 private Material(
final int id,
final Class<? extends MaterialData> data) {
402 private Material(
final int id,
final int stack,
final Class<? extends MaterialData> data) {
403 this(id, stack, 0, data);
406 private Material(
final int id,
final int stack,
final int durability,
final Class<? extends MaterialData> data) {
408 this.durability = (short) durability;
409 this.maxStack = stack;
412 this.ctor = data.getConstructor(
int.
class, byte.class);
413 }
catch (NoSuchMethodException ex) {
414 throw new AssertionError(ex);
415 }
catch (SecurityException ex) {
416 throw new AssertionError(ex);
452 public Class<? extends MaterialData>
getData() {
453 return ctor.getDeclaringClass();
465 return ctor.newInstance(
id, raw);
466 }
catch (InstantiationException ex) {
467 final Throwable t = ex.getCause();
468 if (t instanceof RuntimeException) {
469 throw (RuntimeException) t;
471 if (t instanceof Error) {
474 throw new AssertionError(t);
475 }
catch (Throwable t) {
476 throw new AssertionError(t);
500 case POISONOUS_POTATO:
531 if (byId.length >
id &&
id >= 0) {
547 return BY_NAME.get(name);
559 Validate.notNull(name,
"Name cannot be null");
564 result = getMaterial(Integer.parseInt(name));
565 }
catch (NumberFormatException ex) {}
567 if (result == null) {
568 String filtered = name.toUpperCase();
570 filtered = filtered.replaceAll(
"\\s+",
"_").replaceAll(
"\\W",
"");
571 result = BY_NAME.get(filtered);
578 for (
Material material : values()) {
579 if (byId.length > material.id) {
580 byId[material.id] = material;
582 byId = Java15Compat.Arrays_copyOfRange(byId, 0, material.id + 2);
583 byId[material.id] = material;
585 BY_NAME.put(material.name(), material);
593 return id >= GOLD_RECORD.id &&
id <= RECORD_12.id;
602 if (!isBlock() ||
id == 0) {
627 case PISTON_STICKY_BASE:
629 case PISTON_EXTENSION:
631 case PISTON_MOVING_PIECE:
639 case MOSSY_COBBLESTONE:
649 case BURNING_FURNACE:
652 case COBBLESTONE_STAIRS:
655 case IRON_DOOR_BLOCK:
658 case GLOWING_REDSTONE_ORE:
675 case HUGE_MUSHROOM_1:
676 case HUGE_MUSHROOM_2:
686 case NETHER_BRICK_STAIRS:
687 case ENCHANTMENT_TABLE:
690 case ENDER_PORTAL_FRAME:
693 case REDSTONE_LAMP_OFF:
694 case REDSTONE_LAMP_ON:
695 case WOOD_DOUBLE_STEP:
697 case SANDSTONE_STAIRS:
701 case SPRUCE_WOOD_STAIRS:
702 case BIRCH_WOOD_STAIRS:
703 case JUNGLE_WOOD_STAIRS:
741 case REDSTONE_TORCH_OFF:
742 case REDSTONE_TORCH_ON:
745 case SUGAR_CANE_BLOCK:
747 case DIODE_BLOCK_OFF:
800 case HUGE_MUSHROOM_1:
801 case HUGE_MUSHROOM_2:
804 case WOOD_DOUBLE_STEP:
806 case SPRUCE_WOOD_STAIRS:
807 case BIRCH_WOOD_STAIRS:
808 case JUNGLE_WOOD_STAIRS:
835 case WOOD_DOUBLE_STEP:
837 case SPRUCE_WOOD_STAIRS:
838 case BIRCH_WOOD_STAIRS:
839 case JUNGLE_WOOD_STAIRS:
880 case MOSSY_COBBLESTONE:
887 case BURNING_FURNACE:
889 case GLOWING_REDSTONE_ORE:
900 case HUGE_MUSHROOM_1:
901 case HUGE_MUSHROOM_2:
905 case ENDER_PORTAL_FRAME:
907 case REDSTONE_LAMP_OFF:
908 case REDSTONE_LAMP_ON:
909 case WOOD_DOUBLE_STEP: