    001package net.minecraft.entity;
    002
    003import java.util.HashMap;
    004import java.util.LinkedHashMap;
    005import java.util.Map;
    006import java.util.logging.Level;
    007
    008import cpw.mods.fml.common.FMLLog;
    009import net.minecraft.entity.ai.EntityMinecartMobSpawner;
    010import net.minecraft.entity.boss.EntityDragon;
    011import net.minecraft.entity.boss.EntityWither;
    012import net.minecraft.entity.item.EntityBoat;
    013import net.minecraft.entity.item.EntityEnderCrystal;
    014import net.minecraft.entity.item.EntityEnderEye;
    015import net.minecraft.entity.item.EntityEnderPearl;
    016import net.minecraft.entity.item.EntityExpBottle;
    017import net.minecraft.entity.item.EntityFallingSand;
    018import net.minecraft.entity.item.EntityFireworkRocket;
    019import net.minecraft.entity.item.EntityItem;
    020import net.minecraft.entity.item.EntityItemFrame;
    021import net.minecraft.entity.item.EntityMinecartChest;
    022import net.minecraft.entity.item.EntityMinecartEmpty;
    023import net.minecraft.entity.item.EntityMinecartFurnace;
    024import net.minecraft.entity.item.EntityMinecartHopper;
    025import net.minecraft.entity.item.EntityMinecartTNT;
    026import net.minecraft.entity.item.EntityPainting;
    027import net.minecraft.entity.item.EntityTNTPrimed;
    028import net.minecraft.entity.item.EntityXPOrb;
    029import net.minecraft.entity.monster.EntityBlaze;
    030import net.minecraft.entity.monster.EntityCaveSpider;
    031import net.minecraft.entity.monster.EntityCreeper;
    032import net.minecraft.entity.monster.EntityEnderman;
    033import net.minecraft.entity.monster.EntityGhast;
    034import net.minecraft.entity.monster.EntityGiantZombie;
    035import net.minecraft.entity.monster.EntityIronGolem;
    036import net.minecraft.entity.monster.EntityMagmaCube;
    037import net.minecraft.entity.monster.EntityMob;
    038import net.minecraft.entity.monster.EntityPigZombie;
    039import net.minecraft.entity.monster.EntitySilverfish;
    040import net.minecraft.entity.monster.EntitySkeleton;
    041import net.minecraft.entity.monster.EntitySlime;
    042import net.minecraft.entity.monster.EntitySnowman;
    043import net.minecraft.entity.monster.EntitySpider;
    044import net.minecraft.entity.monster.EntityWitch;
    045import net.minecraft.entity.monster.EntityZombie;
    046import net.minecraft.entity.passive.EntityBat;
    047import net.minecraft.entity.passive.EntityChicken;
    048import net.minecraft.entity.passive.EntityCow;
    049import net.minecraft.entity.passive.EntityMooshroom;
    050import net.minecraft.entity.passive.EntityOcelot;
    051import net.minecraft.entity.passive.EntityPig;
    052import net.minecraft.entity.passive.EntitySheep;
    053import net.minecraft.entity.passive.EntitySquid;
    054import net.minecraft.entity.passive.EntityVillager;
    055import net.minecraft.entity.passive.EntityWolf;
    056import net.minecraft.entity.projectile.EntityArrow;
    057import net.minecraft.entity.projectile.EntityLargeFireball;
    058import net.minecraft.entity.projectile.EntityPotion;
    059import net.minecraft.entity.projectile.EntitySmallFireball;
    060import net.minecraft.entity.projectile.EntitySnowball;
    061import net.minecraft.entity.projectile.EntityWitherSkull;
    062import net.minecraft.nbt.NBTTagCompound;
    063import net.minecraft.world.World;
    064
    065public class EntityList
    066{
    067    /** Provides a mapping between entity classes and a string */
    068    public static Map stringToClassMapping = new HashMap();
    069
    070    /** Provides a mapping between a string and an entity classes */
    071    public static Map classToStringMapping = new HashMap();
    072
    073    /** provides a mapping between an entityID and an Entity Class */
    074    public static Map IDtoClassMapping = new HashMap();
    075
    076    /** provides a mapping between an Entity Class and an entity ID */
    077    private static Map classToIDMapping = new HashMap();
    078
    079    /** Maps entity names to their numeric identifiers */
    080    private static Map stringToIDMapping = new HashMap();
    081
    082    /** This is a HashMap of the Creative Entity Eggs/Spawners. */
    083    public static HashMap entityEggs = new LinkedHashMap();
    084
    085    /**
    086     * adds a mapping between Entity classes and both a string representation and an ID
    087     */
    088    public static void addMapping(Class par0Class, String par1Str, int par2)
    089    {
    090        stringToClassMapping.put(par1Str, par0Class);
    091        classToStringMapping.put(par0Class, par1Str);
    092        IDtoClassMapping.put(Integer.valueOf(par2), par0Class);
    093        classToIDMapping.put(par0Class, Integer.valueOf(par2));
    094        stringToIDMapping.put(par1Str, Integer.valueOf(par2));
    095    }
    096
    097    /**
    098     * Adds a entity mapping with egg info.
    099     */
    100    public static void addMapping(Class par0Class, String par1Str, int par2, int par3, int par4)
    101    {
    102        addMapping(par0Class, par1Str, par2);
    103        entityEggs.put(Integer.valueOf(par2), new EntityEggInfo(par2, par3, par4));
    104    }
    105
    106    /**
    107     * Create a new instance of an entity in the world by using the entity name.
    108     */
    109    public static Entity createEntityByName(String par0Str, World par1World)
    110    {
    111        Entity entity = null;
    112
    113        try
    114        {
    115            Class oclass = (Class)stringToClassMapping.get(par0Str);
    116
    117            if (oclass != null)
    118            {
    119                entity = (Entity)oclass.getConstructor(new Class[] {World.class}).newInstance(new Object[] {par1World});
    120            }
    121        }
    122        catch (Exception exception)
    123        {
    124            exception.printStackTrace();
    125        }
    126
    127        return entity;
    128    }
    129
    130    /**
    131     * create a new instance of an entity from NBT store
    132     */
    133    public static Entity createEntityFromNBT(NBTTagCompound par0NBTTagCompound, World par1World)
    134    {
    135        Entity entity = null;
    136
    137        if ("Minecart".equals(par0NBTTagCompound.getString("id")))
    138        {
    139            switch (par0NBTTagCompound.getInteger("Type"))
    140            {
    141                case 0:
    142                    par0NBTTagCompound.setString("id", "MinecartRideable");
    143                    break;
    144                case 1:
    145                    par0NBTTagCompound.setString("id", "MinecartChest");
    146                    break;
    147                case 2:
    148                    par0NBTTagCompound.setString("id", "MinecartFurnace");
    149            }
    150
    151            par0NBTTagCompound.removeTag("Type");
    152        }
    153
    154        Class oclass = null;
    155        try
    156        {
    157            oclass = (Class)stringToClassMapping.get(par0NBTTagCompound.getString("id"));
    158
    159            if (oclass != null)
    160            {
    161                entity = (Entity)oclass.getConstructor(new Class[] {World.class}).newInstance(new Object[] {par1World});
    162            }
    163        }
    164        catch (Exception exception)
    165        {
    166            exception.printStackTrace();
    167        }
    168
    169        if (entity != null)
    170        {
    171            try
    172            {
    173                entity.readFromNBT(par0NBTTagCompound);
    174            }
    175            catch (Exception e)
    176            {
    177                FMLLog.log(Level.SEVERE, e,
    178                        "An Entity %s(%s) has thrown an exception during loading, its state cannot be restored. Report this to the mod author",
    179                        par0NBTTagCompound.getString("id"), oclass.getName());
    180                entity = null;
    181            }
    182        }
    183        else
    184        {
    185            par1World.getWorldLogAgent().logWarning("Skipping Entity with id " + par0NBTTagCompound.getString("id"));
    186        }
    187
    188        return entity;
    189    }
    190
    191    /**
    192     * Create a new instance of an entity in the world by using an entity ID.
    193     */
    194    public static Entity createEntityByID(int par0, World par1World)
    195    {
    196        Entity entity = null;
    197
    198        try
    199        {
    200            Class oclass = getClassFromID(par0);
    201
    202            if (oclass != null)
    203            {
    204                entity = (Entity)oclass.getConstructor(new Class[] {World.class}).newInstance(new Object[] {par1World});
    205            }
    206        }
    207        catch (Exception exception)
    208        {
    209            exception.printStackTrace();
    210        }
    211
    212        if (entity == null)
    213        {
    214            par1World.getWorldLogAgent().logWarning("Skipping Entity with id " + par0);
    215        }
    216
    217        return entity;
    218    }
    219
    220    /**
    221     * gets the entityID of a specific entity
    222     */
    223    public static int getEntityID(Entity par0Entity)
    224    {
    225        Class oclass = par0Entity.getClass();
    226        return classToIDMapping.containsKey(oclass) ? ((Integer)classToIDMapping.get(oclass)).intValue() : 0;
    227    }
    228
    229    /**
    230     * Return the class assigned to this entity ID.
    231     */
    232    public static Class getClassFromID(int par0)
    233    {
    234        return (Class)IDtoClassMapping.get(Integer.valueOf(par0));
    235    }
    236
    237    /**
    238     * Gets the string representation of a specific entity.
    239     */
    240    public static String getEntityString(Entity par0Entity)
    241    {
    242        return (String)classToStringMapping.get(par0Entity.getClass());
    243    }
    244
    245    /**
    246     * Finds the class using IDtoClassMapping and classToStringMapping
    247     */
    248    public static String getStringFromID(int par0)
    249    {
    250        Class oclass = getClassFromID(par0);
    251        return oclass != null ? (String)classToStringMapping.get(oclass) : null;
    252    }
    253
    254    static
    255    {
    256        addMapping(EntityItem.class, "Item", 1);
    257        addMapping(EntityXPOrb.class, "XPOrb", 2);
    258        addMapping(EntityPainting.class, "Painting", 9);
    259        addMapping(EntityArrow.class, "Arrow", 10);
    260        addMapping(EntitySnowball.class, "Snowball", 11);
    261        addMapping(EntityLargeFireball.class, "Fireball", 12);
    262        addMapping(EntitySmallFireball.class, "SmallFireball", 13);
    263        addMapping(EntityEnderPearl.class, "ThrownEnderpearl", 14);
    264        addMapping(EntityEnderEye.class, "EyeOfEnderSignal", 15);
    265        addMapping(EntityPotion.class, "ThrownPotion", 16);
    266        addMapping(EntityExpBottle.class, "ThrownExpBottle", 17);
    267        addMapping(EntityItemFrame.class, "ItemFrame", 18);
    268        addMapping(EntityWitherSkull.class, "WitherSkull", 19);
    269        addMapping(EntityTNTPrimed.class, "PrimedTnt", 20);
    270        addMapping(EntityFallingSand.class, "FallingSand", 21);
    271        addMapping(EntityFireworkRocket.class, "FireworksRocketEntity", 22);
    272        addMapping(EntityBoat.class, "Boat", 41);
    273        addMapping(EntityMinecartEmpty.class, "MinecartRideable", 42);
    274        addMapping(EntityMinecartChest.class, "MinecartChest", 43);
    275        addMapping(EntityMinecartFurnace.class, "MinecartFurnace", 44);
    276        addMapping(EntityMinecartTNT.class, "MinecartTNT", 45);
    277        addMapping(EntityMinecartHopper.class, "MinecartHopper", 46);
    278        addMapping(EntityMinecartMobSpawner.class, "MinecartSpawner", 47);
    279        addMapping(EntityLiving.class, "Mob", 48);
    280        addMapping(EntityMob.class, "Monster", 49);
    281        addMapping(EntityCreeper.class, "Creeper", 50, 894731, 0);
    282        addMapping(EntitySkeleton.class, "Skeleton", 51, 12698049, 4802889);
    283        addMapping(EntitySpider.class, "Spider", 52, 3419431, 11013646);
    284        addMapping(EntityGiantZombie.class, "Giant", 53);
    285        addMapping(EntityZombie.class, "Zombie", 54, 44975, 7969893);
    286        addMapping(EntitySlime.class, "Slime", 55, 5349438, 8306542);
    287        addMapping(EntityGhast.class, "Ghast", 56, 16382457, 12369084);
    288        addMapping(EntityPigZombie.class, "PigZombie", 57, 15373203, 5009705);
    289        addMapping(EntityEnderman.class, "Enderman", 58, 1447446, 0);
    290        addMapping(EntityCaveSpider.class, "CaveSpider", 59, 803406, 11013646);
    291        addMapping(EntitySilverfish.class, "Silverfish", 60, 7237230, 3158064);
    292        addMapping(EntityBlaze.class, "Blaze", 61, 16167425, 16775294);
    293        addMapping(EntityMagmaCube.class, "LavaSlime", 62, 3407872, 16579584);
    294        addMapping(EntityDragon.class, "EnderDragon", 63);
    295        addMapping(EntityWither.class, "WitherBoss", 64);
    296        addMapping(EntityBat.class, "Bat", 65, 4996656, 986895);
    297        addMapping(EntityWitch.class, "Witch", 66, 3407872, 5349438);
    298        addMapping(EntityPig.class, "Pig", 90, 15771042, 14377823);
    299        addMapping(EntitySheep.class, "Sheep", 91, 15198183, 16758197);
    300        addMapping(EntityCow.class, "Cow", 92, 4470310, 10592673);
    301        addMapping(EntityChicken.class, "Chicken", 93, 10592673, 16711680);
    302        addMapping(EntitySquid.class, "Squid", 94, 2243405, 7375001);
    303        addMapping(EntityWolf.class, "Wolf", 95, 14144467, 13545366);
    304        addMapping(EntityMooshroom.class, "MushroomCow", 96, 10489616, 12040119);
    305        addMapping(EntitySnowman.class, "SnowMan", 97);
    306        addMapping(EntityOcelot.class, "Ozelot", 98, 15720061, 5653556);
    307        addMapping(EntityIronGolem.class, "VillagerGolem", 99);
    308        addMapping(EntityVillager.class, "Villager", 120, 5651507, 12422002);
    309        addMapping(EntityEnderCrystal.class, "EnderCrystal", 200);
    310    }
    311}