package net.glowstone.entity; import com.google.common.collect.ImmutableBiMap; import net.glowstone.entity.monster.*; import net.glowstone.entity.objects.*; import net.glowstone.entity.passive.*; import net.glowstone.io.entity.EntityStorage; import org.bukkit.entity.*; import java.util.*; public class EntityRegistry { private static final Map<String, CustomEntityDescriptor> CUSTOM_ENTITIES = new HashMap<>(); private static final ImmutableBiMap<Class<? extends Entity>, Class<? extends GlowEntity>> ENTITIES = ImmutableBiMap.<Class<? extends Entity>, Class<? extends GlowEntity>>builder() .put(AbstractHorse.class, GlowAbstractHorse.class) .put(ArmorStand.class, GlowArmorStand.class) //TODO: Arrow .put(Bat.class, GlowBat.class) .put(Blaze.class, GlowBlaze.class) //TODO: Boat .put(CaveSpider.class, GlowCaveSpider.class) .put(ChestedHorse.class, GlowChestedHorse.class) .put(Chicken.class, GlowChicken.class) .put(Cow.class, GlowCow.class) .put(Creeper.class, GlowCreeper.class) .put(Donkey.class, GlowDonkey.class) //TODO: Egg .put(ElderGuardian.class, GlowElderGuardian.class) //TODO: Ender Crystal //TODO: Ender Dragon //TODO: Ender PEarl //TODO: Ender Signal .put(Enderman.class, GlowEnderman.class) .put(Endermite.class, GlowEndermite.class) //TODO: Experience orb .put(Evoker.class, GlowEvoker.class) .put(EvokerFangs.class, GlowEvokerFangs.class) .put(FallingBlock.class, GlowFallingBlock.class) //TODO: Fireball //TODO: Firework //TODO: Fishing hook .put(Ghast.class, GlowGhast.class) .put(Giant.class, GlowGiant.class) .put(Guardian.class, GlowGuardian.class) .put(Horse.class, GlowHorse.class) .put(Husk.class, GlowHusk.class) .put(IronGolem.class, GlowIronGolem.class) .put(Item.class, GlowItem.class) .put(ItemFrame.class, GlowItemFrame.class) //TODO: Leash hitch //TODO: Lightning .put(Llama.class, GlowLlama.class) .put(MagmaCube.class, GlowMagmaCube.class) .put(GlowMinecart.MinecartType.RIDEABLE.getEntityClass(), GlowMinecart.MinecartType.RIDEABLE.getMinecartClass()) .put(GlowMinecart.MinecartType.CHEST.getEntityClass(), GlowMinecart.MinecartType.CHEST.getMinecartClass()) .put(GlowMinecart.MinecartType.FURNACE.getEntityClass(), GlowMinecart.MinecartType.FURNACE.getMinecartClass()) .put(GlowMinecart.MinecartType.TNT.getEntityClass(), GlowMinecart.MinecartType.TNT.getMinecartClass()) .put(GlowMinecart.MinecartType.HOPPER.getEntityClass(), GlowMinecart.MinecartType.HOPPER.getMinecartClass()) .put(GlowMinecart.MinecartType.SPAWNER.getEntityClass(), GlowMinecart.MinecartType.SPAWNER.getMinecartClass()) //TODO: Command Block minecart .put(Mule.class, GlowMule.class) .put(MushroomCow.class, GlowMooshroom.class) .put(Ocelot.class, GlowOcelot.class) //TODO: Painting .put(Pig.class, GlowPig.class) .put(PigZombie.class, GlowPigZombie.class) .put(Player.class, GlowPlayer.class) .put(PolarBear.class, GlowPolarBear.class) .put(TNTPrimed.class, GlowTNTPrimed.class) .put(Rabbit.class, GlowRabbit.class) .put(Sheep.class, GlowSheep.class) .put(Shulker.class, GlowShulker.class) .put(Silverfish.class, GlowSilverfish.class) .put(Skeleton.class, GlowSkeleton.class) .put(SkeletonHorse.class, GlowSkeletonHorse.class) .put(Slime.class, GlowSlime.class) //TODO: Fireball //TODO: Snowball .put(Snowman.class, GlowSnowman.class) .put(Spider.class, GlowSpider.class) //TODO: Splash potion .put(Squid.class, GlowSquid.class) .put(Stray.class, GlowStray.class) //TODO: Experience bottle .put(Vex.class, GlowVex.class) .put(Villager.class, GlowVillager.class) .put(Vindicator.class, GlowVindicator.class) .put(Weather.class, GlowWeather.class) .put(Witch.class, GlowWitch.class) .put(Wither.class, GlowWither.class) .put(WitherSkeleton.class, GlowWitherSkeleton.class) //TODO: Wither Skull .put(Wolf.class, GlowWolf.class) .put(Zombie.class, GlowZombie.class) .put(ZombieHorse.class, GlowZombieHorse.class) .put(ZombieVillager.class, GlowZombieVillager.class) .build(); public static Class<? extends GlowEntity> getEntity(EntityType type) { return ENTITIES.get(type.getEntityClass()); } public static Class<? extends GlowEntity> getEntity(Class<? extends Entity> clazz) { return ENTITIES.get(clazz); } public static void registerCustomEntity(CustomEntityDescriptor<? extends GlowEntity> descriptor) { if (descriptor == null || descriptor.getEntityClass() == null || descriptor.getId() == null || descriptor.getPlugin() == null) return; if (descriptor.getPlugin().isEnabled()) { descriptor.getPlugin().getServer().getLogger().warning("Cannot register custom entity '" + descriptor.getId() + "' for plugin '" + descriptor.getPlugin() + "', worlds are already loaded."); return; } if (CUSTOM_ENTITIES.containsKey(descriptor.getId().toLowerCase())) return; CUSTOM_ENTITIES.put(descriptor.getId(), descriptor); if (descriptor.getStorage() != null) { EntityStorage.bind(descriptor.getStorage()); } } public static CustomEntityDescriptor getCustomEntityDescriptor(String id) { return CUSTOM_ENTITIES.get(id.toLowerCase()); } public static boolean isCustomEntityRegistered(String id) { return CUSTOM_ENTITIES.containsKey(id.toLowerCase()); } public static List<CustomEntityDescriptor> getRegisteredCustomEntities() { List<CustomEntityDescriptor> entities = new ArrayList<>(); CUSTOM_ENTITIES.values().forEach(entities::add); return Collections.unmodifiableList(entities); } }