001 package org.bukkit.entity; 002 003 import java.util.HashMap; 004 import java.util.Map; 005 006 import org.bukkit.entity.minecart.CommandMinecart; 007 import org.bukkit.entity.minecart.HopperMinecart; 008 import org.bukkit.entity.minecart.SpawnerMinecart; 009 import org.bukkit.entity.minecart.RideableMinecart; 010 import org.bukkit.entity.minecart.ExplosiveMinecart; 011 import org.bukkit.entity.minecart.PoweredMinecart; 012 import org.bukkit.entity.minecart.StorageMinecart; 013 import org.bukkit.inventory.ItemStack; 014 import org.bukkit.Location; 015 import org.bukkit.World; 016 017 public enum EntityType { 018 019 // These strings MUST match the strings in nms.EntityTypes and are case sensitive. 020 /** 021 * An item resting on the ground. 022 * <p> 023 * Spawn with {@link World#dropItem(Location, ItemStack)} or {@link 024 * World#dropItemNaturally(Location, ItemStack)} 025 */ 026 DROPPED_ITEM("Item", Item.class, 1, false), 027 /** 028 * An experience orb. 029 */ 030 EXPERIENCE_ORB("XPOrb", ExperienceOrb.class, 2), 031 /** 032 * A leash attached to a fencepost. 033 */ 034 LEASH_HITCH("LeashKnot", LeashHitch.class, 8), 035 /** 036 * A painting on a wall. 037 */ 038 PAINTING("Painting", Painting.class, 9), 039 /** 040 * An arrow projectile; may get stuck in the ground. 041 */ 042 ARROW("Arrow", Arrow.class, 10), 043 /** 044 * A flying snowball. 045 */ 046 SNOWBALL("Snowball", Snowball.class, 11), 047 /** 048 * A flying large fireball, as thrown by a Ghast for example. 049 */ 050 FIREBALL("Fireball", LargeFireball.class, 12), 051 /** 052 * A flying small fireball, such as thrown by a Blaze or player. 053 */ 054 SMALL_FIREBALL("SmallFireball", SmallFireball.class, 13), 055 /** 056 * A flying ender pearl. 057 */ 058 ENDER_PEARL("ThrownEnderpearl", EnderPearl.class, 14), 059 /** 060 * An ender eye signal. 061 */ 062 ENDER_SIGNAL("EyeOfEnderSignal", EnderSignal.class, 15), 063 /** 064 * A flying experience bottle. 065 */ 066 THROWN_EXP_BOTTLE("ThrownExpBottle", ThrownExpBottle.class, 17), 067 /** 068 * An item frame on a wall. 069 */ 070 ITEM_FRAME("ItemFrame", ItemFrame.class, 18), 071 /** 072 * A flying wither skull projectile. 073 */ 074 WITHER_SKULL("WitherSkull", WitherSkull.class, 19), 075 /** 076 * Primed TNT that is about to explode. 077 */ 078 PRIMED_TNT("PrimedTnt", TNTPrimed.class, 20), 079 /** 080 * A block that is going to or is about to fall. 081 */ 082 FALLING_BLOCK("FallingSand", FallingBlock.class, 21, false), 083 FIREWORK("FireworksRocketEntity", Firework.class, 22, false), 084 /** 085 * @see CommandMinecart 086 */ 087 MINECART_COMMAND("MinecartCommandBlock", CommandMinecart.class, 40), 088 /** 089 * A placed boat. 090 */ 091 BOAT("Boat", Boat.class, 41), 092 /** 093 * @see RideableMinecart 094 */ 095 MINECART("MinecartRideable", RideableMinecart.class, 42), 096 /** 097 * @see StorageMinecart 098 */ 099 MINECART_CHEST("MinecartChest", StorageMinecart.class, 43), 100 /** 101 * @see PoweredMinecart 102 */ 103 MINECART_FURNACE("MinecartFurnace", PoweredMinecart.class, 44), 104 /** 105 * @see ExplosiveMinecart 106 */ 107 MINECART_TNT("MinecartTNT", ExplosiveMinecart.class, 45), 108 /** 109 * @see HopperMinecart 110 */ 111 MINECART_HOPPER("MinecartHopper", HopperMinecart.class, 46), 112 /** 113 * @see SpawnerMinecart 114 */ 115 MINECART_MOB_SPAWNER("MinecartMobSpawner", SpawnerMinecart.class, 47), 116 CREEPER("Creeper", Creeper.class, 50), 117 SKELETON("Skeleton", Skeleton.class, 51), 118 SPIDER("Spider", Spider.class, 52), 119 GIANT("Giant", Giant.class, 53), 120 ZOMBIE("Zombie", Zombie.class, 54), 121 SLIME("Slime", Slime.class, 55), 122 GHAST("Ghast", Ghast.class, 56), 123 PIG_ZOMBIE("PigZombie", PigZombie.class, 57), 124 ENDERMAN("Enderman", Enderman.class, 58), 125 CAVE_SPIDER("CaveSpider", CaveSpider.class, 59), 126 SILVERFISH("Silverfish", Silverfish.class, 60), 127 BLAZE("Blaze", Blaze.class, 61), 128 MAGMA_CUBE("LavaSlime", MagmaCube.class, 62), 129 ENDER_DRAGON("EnderDragon", EnderDragon.class, 63), 130 WITHER("WitherBoss", Wither.class, 64), 131 BAT("Bat", Bat.class, 65), 132 WITCH("Witch", Witch.class, 66), 133 PIG("Pig", Pig.class, 90), 134 SHEEP("Sheep", Sheep.class, 91), 135 COW("Cow", Cow.class, 92), 136 CHICKEN("Chicken", Chicken.class, 93), 137 SQUID("Squid", Squid.class, 94), 138 WOLF("Wolf", Wolf.class, 95), 139 MUSHROOM_COW("MushroomCow", MushroomCow.class, 96), 140 SNOWMAN("SnowMan", Snowman.class, 97), 141 OCELOT("Ozelot", Ocelot.class, 98), 142 IRON_GOLEM("VillagerGolem", IronGolem.class, 99), 143 HORSE("EntityHorse", Horse.class, 100), 144 VILLAGER("Villager", Villager.class, 120), 145 ENDER_CRYSTAL("EnderCrystal", EnderCrystal.class, 200), 146 // These don't have an entity ID in nms.EntityTypes. 147 /** 148 * A flying splash potion. 149 */ 150 SPLASH_POTION(null, ThrownPotion.class, -1, false), 151 /** 152 * A flying chicken egg. 153 */ 154 EGG(null, Egg.class, -1, false), 155 /** 156 * A fishing line and bobber. 157 */ 158 FISHING_HOOK(null, Fish.class, -1, false), 159 /** 160 * A bolt of lightning. 161 * <p> 162 * Spawn with {@link World#strikeLightning(Location)}. 163 */ 164 LIGHTNING(null, LightningStrike.class, -1, false), 165 WEATHER(null, Weather.class, -1, false), 166 PLAYER(null, Player.class, -1, false), 167 COMPLEX_PART(null, ComplexEntityPart.class, -1, false), 168 /** 169 * An unknown entity without an Entity Class 170 */ 171 UNKNOWN(null, null, -1, false); 172 173 private String name; 174 private Class<? extends Entity> clazz; 175 private short typeId; 176 private boolean independent, living; 177 178 private static final Map<String, EntityType> NAME_MAP = new HashMap<String, EntityType>(); 179 private static final Map<Short, EntityType> ID_MAP = new HashMap<Short, EntityType>(); 180 181 static { 182 for (EntityType type : values()) { 183 if (type.name != null) { 184 NAME_MAP.put(type.name.toLowerCase(), type); 185 } 186 if (type.typeId > 0) { 187 ID_MAP.put(type.typeId, type); 188 } 189 } 190 } 191 192 private EntityType(String name, Class<? extends Entity> clazz, int typeId) { 193 this(name, clazz, typeId, true); 194 } 195 196 private EntityType(String name, Class<? extends Entity> clazz, int typeId, boolean independent) { 197 this.name = name; 198 this.clazz = clazz; 199 this.typeId = (short) typeId; 200 this.independent = independent; 201 if (clazz != null) { 202 this.living = LivingEntity.class.isAssignableFrom(clazz); 203 } 204 } 205 206 /** 207 * 208 * @deprecated Magic value 209 */ 210 @Deprecated 211 public String getName() { 212 return name; 213 } 214 215 public Class<? extends Entity> getEntityClass() { 216 return clazz; 217 } 218 219 /** 220 * 221 * @deprecated Magic value 222 */ 223 @Deprecated 224 public short getTypeId() { 225 return typeId; 226 } 227 228 /** 229 * 230 * @deprecated Magic value 231 */ 232 @Deprecated 233 public static EntityType fromName(String name) { 234 if (name == null) { 235 return null; 236 } 237 return NAME_MAP.get(name.toLowerCase()); 238 } 239 240 /** 241 * 242 * @deprecated Magic value 243 */ 244 @Deprecated 245 public static EntityType fromId(int id) { 246 if (id > Short.MAX_VALUE) { 247 return null; 248 } 249 return ID_MAP.get((short) id); 250 } 251 252 /** 253 * Some entities cannot be spawned using {@link 254 * World#spawnEntity(Location, EntityType)} or {@link 255 * World#spawn(Location, Class)}, usually because they require additional 256 * information in order to spawn. 257 * 258 * @return False if the entity type cannot be spawned 259 */ 260 public boolean isSpawnable() { 261 return independent; 262 } 263 264 public boolean isAlive() { 265 return living; 266 } 267 }