Bukkit  1.4.7-R1.0
 All Classes Namespaces Files Functions Variables Enumerator Pages
Material.java
Go to the documentation of this file.
1 package org.bukkit;
2 
3 import java.lang.reflect.Constructor;
4 import java.util.Map;
5 
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;
57 
58 import com.google.common.collect.Maps;
59 
63 public enum Material {
64  AIR(0, 0),
65  STONE(1),
66  GRASS(2),
67  DIRT(3),
69  WOOD(5, Tree.class),
70  SAPLING(6, Tree.class),
71  BEDROCK(7),
72  WATER(8, MaterialData.class),
74  LAVA(10, MaterialData.class),
76  SAND(12),
77  GRAVEL(13),
78  GOLD_ORE(14),
79  IRON_ORE(15),
80  COAL_ORE(16),
81  LOG(17, Tree.class),
82  LEAVES(18, Tree.class),
83  SPONGE(19),
84  GLASS(20),
85  LAPIS_ORE(21),
87  DISPENSER(23, Dispenser.class),
88  SANDSTONE(24, Sandstone.class),
90  BED_BLOCK(26, Bed.class),
94  WEB(30),
95  LONG_GRASS(31, LongGrass.class),
96  DEAD_BUSH(32),
99  WOOL(35, Wool.class),
102  RED_ROSE(38),
107  DOUBLE_STEP(43, Step.class),
108  STEP(44, Step.class),
109  BRICK(45),
110  TNT(46),
113  OBSIDIAN(49),
114  TORCH(50, Torch.class),
115  FIRE(51),
117  WOOD_STAIRS(53, Stairs.class),
118  CHEST(54, Chest.class),
123  CROPS(59, Crops.class),
124  SOIL(60, MaterialData.class),
125  FURNACE(61, Furnace.class),
127  SIGN_POST(63, 64, Sign.class),
128  WOODEN_DOOR(64, Door.class),
129  LADDER(65, Ladder.class),
130  RAILS(66, Rails.class),
132  WALL_SIGN(68, 64, Sign.class),
133  LEVER(69, Lever.class),
135  IRON_DOOR_BLOCK(71, Door.class),
141  STONE_BUTTON(77, Button.class),
142  SNOW(78),
143  ICE(79),
145  CACTUS(81, MaterialData.class),
146  CLAY(82),
148  JUKEBOX(84),
149  FENCE(85),
150  PUMPKIN(86, Pumpkin.class),
154  PORTAL(90),
156  CAKE_BLOCK(92, 64, Cake.class),
157  DIODE_BLOCK_OFF(93, Diode.class),
158  DIODE_BLOCK_ON(94, Diode.class),
160  TRAP_DOOR(96, TrapDoor.class),
170  VINE(106, Vine.class),
171  FENCE_GATE(107, Gate.class),
172  BRICK_STAIRS(108, Stairs.class),
173  SMOOTH_STAIRS(109, Stairs.class),
174  MYCEL(110),
182  CAULDRON(118, Cauldron.class),
190  WOOD_STEP(126, WoodenStep.class),
191  COCOA(127, CocoaPlant.class),
194  ENDER_CHEST(130, EnderChest.class),
196  TRIPWIRE(132, Tripwire.class),
201  COMMAND(137, Command.class),
202  BEACON(138),
204  FLOWER_POT(140, FlowerPot.class),
205  CARROT(141),
206  POTATO(142),
207  WOOD_BUTTON(143, Button.class),
208  SKULL(144, Skull.class),
209  ANVIL(145),
210  // ----- Item Separator -----
211  IRON_SPADE(256, 1, 250),
212  IRON_PICKAXE(257, 1, 250),
213  IRON_AXE(258, 1, 250),
214  FLINT_AND_STEEL(259, 1, 64),
215  APPLE(260),
216  BOW(261, 1, 384),
217  ARROW(262),
218  COAL(263, Coal.class),
219  DIAMOND(264),
222  IRON_SWORD(267, 1, 250),
223  WOOD_SWORD(268, 1, 59),
224  WOOD_SPADE(269, 1, 59),
225  WOOD_PICKAXE(270, 1, 59),
226  WOOD_AXE(271, 1, 59),
227  STONE_SWORD(272, 1, 131),
228  STONE_SPADE(273, 1, 131),
229  STONE_PICKAXE(274, 1, 131),
230  STONE_AXE(275, 1, 131),
231  DIAMOND_SWORD(276, 1, 1561),
232  DIAMOND_SPADE(277, 1, 1561),
233  DIAMOND_PICKAXE(278, 1, 1561),
234  DIAMOND_AXE(279, 1, 1561),
235  STICK(280),
236  BOWL(281),
237  MUSHROOM_SOUP(282, 1),
238  GOLD_SWORD(283, 1, 32),
239  GOLD_SPADE(284, 1, 32),
240  GOLD_PICKAXE(285, 1, 32),
241  GOLD_AXE(286, 1, 32),
242  STRING(287),
243  FEATHER(288),
244  SULPHUR(289),
245  WOOD_HOE(290, 1, 59),
246  STONE_HOE(291, 1, 131),
247  IRON_HOE(292, 1, 250),
248  DIAMOND_HOE(293, 1, 1561),
249  GOLD_HOE(294, 1, 32),
250  SEEDS(295),
251  WHEAT(296),
252  BREAD(297),
253  LEATHER_HELMET(298, 1, 55),
254  LEATHER_CHESTPLATE(299, 1, 80),
255  LEATHER_LEGGINGS(300, 1, 75),
256  LEATHER_BOOTS(301, 1, 65),
257  CHAINMAIL_HELMET(302, 1, 165),
258  CHAINMAIL_CHESTPLATE(303, 1, 240),
259  CHAINMAIL_LEGGINGS(304, 1, 225),
260  CHAINMAIL_BOOTS(305, 1, 195),
261  IRON_HELMET(306, 1, 165),
262  IRON_CHESTPLATE(307, 1, 240),
263  IRON_LEGGINGS(308, 1, 225),
264  IRON_BOOTS(309, 1, 195),
265  DIAMOND_HELMET(310, 1, 363),
266  DIAMOND_CHESTPLATE(311, 1, 528),
267  DIAMOND_LEGGINGS(312, 1, 495),
268  DIAMOND_BOOTS(313, 1, 429),
269  GOLD_HELMET(314, 1, 77),
270  GOLD_CHESTPLATE(315, 1, 112),
271  GOLD_LEGGINGS(316, 1, 105),
272  GOLD_BOOTS(317, 1, 91),
273  FLINT(318),
274  PORK(319),
276  PAINTING(321),
278  SIGN(323, 16),
279  WOOD_DOOR(324, 1),
280  BUCKET(325, 16),
281  WATER_BUCKET(326, 1),
282  LAVA_BUCKET(327, 1),
283  MINECART(328, 1),
284  SADDLE(329, 1),
285  IRON_DOOR(330, 1),
286  REDSTONE(331),
287  SNOW_BALL(332, 16),
288  BOAT(333, 1),
289  LEATHER(334),
290  MILK_BUCKET(335, 1),
292  CLAY_BALL(337),
294  PAPER(339),
295  BOOK(340),
299  EGG(344, 16),
300  COMPASS(345),
301  FISHING_ROD(346, 1, 64),
302  WATCH(347),
304  RAW_FISH(349),
306  INK_SACK(351, Dye.class),
307  BONE(352),
308  SUGAR(353),
309  CAKE(354, 1),
310  BED(355, 1),
311  DIODE(356),
312  COOKIE(357),
316  MAP(358, MaterialData.class),
317  SHEARS(359, 1, 238),
318  MELON(360),
321  RAW_BEEF(363),
326  ENDER_PEARL(368, 16),
327  BLAZE_ROD(369),
334  POTION(373, 1, MaterialData.class),
344  MONSTER_EGG(383, 64, SpawnEgg.class),
345  EXP_BOTTLE(384, 64),
346  FIREBALL(385, 64),
347  BOOK_AND_QUILL(386, 1),
348  WRITTEN_BOOK(387, 1),
349  EMERALD(388, 64),
356  EMPTY_MAP(395),
359  CARROT_STICK(398, 1, 25),
362  FIREWORK(401),
364  ENCHANTED_BOOK(403, 1),
365  GOLD_RECORD(2256, 1),
366  GREEN_RECORD(2257, 1),
367  RECORD_3(2258, 1),
368  RECORD_4(2259, 1),
369  RECORD_5(2260, 1),
370  RECORD_6(2261, 1),
371  RECORD_7(2262, 1),
372  RECORD_8(2263, 1),
373  RECORD_9(2264, 1),
374  RECORD_10(2265, 1),
375  RECORD_11(2266, 1),
376  RECORD_12(2267, 1),
377  ;
378 
379  private final int id;
380  private final Constructor<? extends MaterialData> ctor;
381  private static Material[] byId = new Material[383];
382  private final static Map<String, Material> BY_NAME = Maps.newHashMap();
383  private final int maxStack;
384  private final short durability;
385 
386  private Material(final int id) {
387  this(id, 64);
388  }
389 
390  private Material(final int id, final int stack) {
391  this(id, stack, MaterialData.class);
392  }
393 
394  private Material(final int id, final int stack, final int durability) {
395  this(id, stack, durability, MaterialData.class);
396  }
397 
398  private Material(final int id, final Class<? extends MaterialData> data) {
399  this(id, 64, data);
400  }
401 
402  private Material(final int id, final int stack, final Class<? extends MaterialData> data) {
403  this(id, stack, 0, data);
404  }
405 
406  private Material(final int id, final int stack, final int durability, final Class<? extends MaterialData> data) {
407  this.id = id;
408  this.durability = (short) durability;
409  this.maxStack = stack;
410  // try to cache the constructor for this material
411  try {
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);
417  }
418  }
419 
425  public int getId() {
426  return id;
427  }
428 
434  public int getMaxStackSize() {
435  return maxStack;
436  }
437 
443  public short getMaxDurability() {
444  return durability;
445  }
446 
452  public Class<? extends MaterialData> getData() {
453  return ctor.getDeclaringClass();
454  }
455 
463  public MaterialData getNewData(final byte raw) {
464  try {
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;
470  }
471  if (t instanceof Error) {
472  throw (Error) t;
473  }
474  throw new AssertionError(t);
475  } catch (Throwable t) {
476  throw new AssertionError(t);
477  }
478  }
479 
485  public boolean isBlock() {
486  return id < 256;
487  }
488 
494  public boolean isEdible() {
495  switch (this) {
496  case BREAD:
497  case CARROT_ITEM:
498  case BAKED_POTATO:
499  case POTATO_ITEM:
500  case POISONOUS_POTATO:
501  case GOLDEN_CARROT:
502  case PUMPKIN_PIE:
503  case COOKIE:
504  case MELON:
505  case MUSHROOM_SOUP:
506  case RAW_CHICKEN:
507  case COOKED_CHICKEN:
508  case RAW_BEEF:
509  case COOKED_BEEF:
510  case RAW_FISH:
511  case COOKED_FISH:
512  case PORK:
513  case GRILLED_PORK:
514  case APPLE:
515  case GOLDEN_APPLE:
516  case ROTTEN_FLESH:
517  case SPIDER_EYE:
518  return true;
519  default:
520  return false;
521  }
522  }
523 
530  public static Material getMaterial(final int id) {
531  if (byId.length > id && id >= 0) {
532  return byId[id];
533  } else {
534  return null;
535  }
536  }
537 
546  public static Material getMaterial(final String name) {
547  return BY_NAME.get(name);
548  }
549 
558  public static Material matchMaterial(final String name) {
559  Validate.notNull(name, "Name cannot be null");
560 
561  Material result = null;
562 
563  try {
564  result = getMaterial(Integer.parseInt(name));
565  } catch (NumberFormatException ex) {}
566 
567  if (result == null) {
568  String filtered = name.toUpperCase();
569 
570  filtered = filtered.replaceAll("\\s+", "_").replaceAll("\\W", "");
571  result = BY_NAME.get(filtered);
572  }
573 
574  return result;
575  }
576 
577  static {
578  for (Material material : values()) {
579  if (byId.length > material.id) {
580  byId[material.id] = material;
581  } else {
582  byId = Java15Compat.Arrays_copyOfRange(byId, 0, material.id + 2);
583  byId[material.id] = material;
584  }
585  BY_NAME.put(material.name(), material);
586  }
587  }
588 
592  public boolean isRecord() {
593  return id >= GOLD_RECORD.id && id <= RECORD_12.id;
594  }
595 
601  public boolean isSolid() {
602  if (!isBlock() || id == 0) {
603  return false;
604  }
605  switch (this) {
606  case STONE:
607  case GRASS:
608  case DIRT:
609  case COBBLESTONE:
610  case WOOD:
611  case BEDROCK:
612  case SAND:
613  case GRAVEL:
614  case GOLD_ORE:
615  case IRON_ORE:
616  case COAL_ORE:
617  case LOG:
618  case LEAVES:
619  case SPONGE:
620  case GLASS:
621  case LAPIS_ORE:
622  case LAPIS_BLOCK:
623  case DISPENSER:
624  case SANDSTONE:
625  case NOTE_BLOCK:
626  case BED_BLOCK:
627  case PISTON_STICKY_BASE:
628  case PISTON_BASE:
629  case PISTON_EXTENSION:
630  case WOOL:
631  case PISTON_MOVING_PIECE:
632  case GOLD_BLOCK:
633  case IRON_BLOCK:
634  case DOUBLE_STEP:
635  case STEP:
636  case BRICK:
637  case TNT:
638  case BOOKSHELF:
639  case MOSSY_COBBLESTONE:
640  case OBSIDIAN:
641  case MOB_SPAWNER:
642  case WOOD_STAIRS:
643  case CHEST:
644  case DIAMOND_ORE:
645  case DIAMOND_BLOCK:
646  case WORKBENCH:
647  case SOIL:
648  case FURNACE:
649  case BURNING_FURNACE:
650  case SIGN_POST:
651  case WOODEN_DOOR:
652  case COBBLESTONE_STAIRS:
653  case WALL_SIGN:
654  case STONE_PLATE:
655  case IRON_DOOR_BLOCK:
656  case WOOD_PLATE:
657  case REDSTONE_ORE:
658  case GLOWING_REDSTONE_ORE:
659  case ICE:
660  case SNOW_BLOCK:
661  case CACTUS:
662  case CLAY:
663  case JUKEBOX:
664  case FENCE:
665  case PUMPKIN:
666  case NETHERRACK:
667  case SOUL_SAND:
668  case GLOWSTONE:
669  case JACK_O_LANTERN:
670  case CAKE_BLOCK:
671  case LOCKED_CHEST:
672  case TRAP_DOOR:
673  case MONSTER_EGGS:
674  case SMOOTH_BRICK:
675  case HUGE_MUSHROOM_1:
676  case HUGE_MUSHROOM_2:
677  case IRON_FENCE:
678  case THIN_GLASS:
679  case MELON_BLOCK:
680  case FENCE_GATE:
681  case BRICK_STAIRS:
682  case SMOOTH_STAIRS:
683  case MYCEL:
684  case NETHER_BRICK:
685  case NETHER_FENCE:
686  case NETHER_BRICK_STAIRS:
687  case ENCHANTMENT_TABLE:
688  case BREWING_STAND:
689  case CAULDRON:
690  case ENDER_PORTAL_FRAME:
691  case ENDER_STONE:
692  case DRAGON_EGG:
693  case REDSTONE_LAMP_OFF:
694  case REDSTONE_LAMP_ON:
695  case WOOD_DOUBLE_STEP:
696  case WOOD_STEP:
697  case SANDSTONE_STAIRS:
698  case EMERALD_ORE:
699  case ENDER_CHEST:
700  case EMERALD_BLOCK:
701  case SPRUCE_WOOD_STAIRS:
702  case BIRCH_WOOD_STAIRS:
703  case JUNGLE_WOOD_STAIRS:
704  case COMMAND:
705  case BEACON:
706  case COBBLE_WALL:
707  case ANVIL:
708  return true;
709  default:
710  return false;
711  }
712  }
713 
719  public boolean isTransparent() {
720  if (!isBlock()) {
721  return false;
722  }
723  switch (this) {
724  case AIR:
725  case SAPLING:
726  case POWERED_RAIL:
727  case DETECTOR_RAIL:
728  case LONG_GRASS:
729  case DEAD_BUSH:
730  case YELLOW_FLOWER:
731  case RED_ROSE:
732  case BROWN_MUSHROOM:
733  case RED_MUSHROOM:
734  case TORCH:
735  case FIRE:
736  case REDSTONE_WIRE:
737  case CROPS:
738  case LADDER:
739  case RAILS:
740  case LEVER:
741  case REDSTONE_TORCH_OFF:
742  case REDSTONE_TORCH_ON:
743  case STONE_BUTTON:
744  case SNOW:
745  case SUGAR_CANE_BLOCK:
746  case PORTAL:
747  case DIODE_BLOCK_OFF:
748  case DIODE_BLOCK_ON:
749  case PUMPKIN_STEM:
750  case MELON_STEM:
751  case VINE:
752  case WATER_LILY:
753  case NETHER_WARTS:
754  case ENDER_PORTAL:
755  case COCOA:
756  case TRIPWIRE_HOOK:
757  case TRIPWIRE:
758  case FLOWER_POT:
759  case CARROT:
760  case POTATO:
761  case WOOD_BUTTON:
762  case SKULL:
763  return true;
764  default:
765  return false;
766  }
767  }
768 
774  public boolean isFlammable() {
775  if (!isBlock()) {
776  return false;
777  }
778  switch (this) {
779  case WOOD:
780  case LOG:
781  case LEAVES:
782  case NOTE_BLOCK:
783  case BED_BLOCK:
784  case LONG_GRASS:
785  case DEAD_BUSH:
786  case WOOL:
787  case TNT:
788  case BOOKSHELF:
789  case WOOD_STAIRS:
790  case CHEST:
791  case WORKBENCH:
792  case SIGN_POST:
793  case WOODEN_DOOR:
794  case WALL_SIGN:
795  case WOOD_PLATE:
796  case JUKEBOX:
797  case FENCE:
798  case LOCKED_CHEST:
799  case TRAP_DOOR:
800  case HUGE_MUSHROOM_1:
801  case HUGE_MUSHROOM_2:
802  case VINE:
803  case FENCE_GATE:
804  case WOOD_DOUBLE_STEP:
805  case WOOD_STEP:
806  case SPRUCE_WOOD_STAIRS:
807  case BIRCH_WOOD_STAIRS:
808  case JUNGLE_WOOD_STAIRS:
809  return true;
810  default:
811  return false;
812  }
813  }
814 
820  public boolean isBurnable() {
821  if (!isBlock()) {
822  return false;
823  }
824  switch (this) {
825  case WOOD:
826  case LOG:
827  case LEAVES:
828  case LONG_GRASS:
829  case WOOL:
830  case TNT:
831  case BOOKSHELF:
832  case WOOD_STAIRS:
833  case FENCE:
834  case VINE:
835  case WOOD_DOUBLE_STEP:
836  case WOOD_STEP:
837  case SPRUCE_WOOD_STAIRS:
838  case BIRCH_WOOD_STAIRS:
839  case JUNGLE_WOOD_STAIRS:
840  return true;
841  default:
842  return false;
843  }
844  }
845 
851  public boolean isOccluding() {
852  if (!isBlock()) {
853  return false;
854  }
855  switch (this) {
856  case STONE:
857  case GRASS:
858  case DIRT:
859  case COBBLESTONE:
860  case WOOD:
861  case BEDROCK:
862  case SAND:
863  case GRAVEL:
864  case GOLD_ORE:
865  case IRON_ORE:
866  case COAL_ORE:
867  case LOG:
868  case SPONGE:
869  case LAPIS_ORE:
870  case LAPIS_BLOCK:
871  case DISPENSER:
872  case SANDSTONE:
873  case NOTE_BLOCK:
874  case WOOL:
875  case GOLD_BLOCK:
876  case IRON_BLOCK:
877  case DOUBLE_STEP:
878  case BRICK:
879  case BOOKSHELF:
880  case MOSSY_COBBLESTONE:
881  case OBSIDIAN:
882  case MOB_SPAWNER:
883  case DIAMOND_ORE:
884  case DIAMOND_BLOCK:
885  case WORKBENCH:
886  case FURNACE:
887  case BURNING_FURNACE:
888  case REDSTONE_ORE:
889  case GLOWING_REDSTONE_ORE:
890  case SNOW_BLOCK:
891  case CLAY:
892  case JUKEBOX:
893  case PUMPKIN:
894  case NETHERRACK:
895  case SOUL_SAND:
896  case JACK_O_LANTERN:
897  case LOCKED_CHEST:
898  case MONSTER_EGGS:
899  case SMOOTH_BRICK:
900  case HUGE_MUSHROOM_1:
901  case HUGE_MUSHROOM_2:
902  case MELON_BLOCK:
903  case MYCEL:
904  case NETHER_BRICK:
905  case ENDER_PORTAL_FRAME:
906  case ENDER_STONE:
907  case REDSTONE_LAMP_OFF:
908  case REDSTONE_LAMP_ON:
909  case WOOD_DOUBLE_STEP:
910  case EMERALD_ORE:
911  case EMERALD_BLOCK:
912  case COMMAND:
913  return true;
914  default:
915  return false;
916  }
917  }
918 }