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