package codechicken.nei; import codechicken.core.featurehack.GameDataManipulator; import net.minecraft.block.Block; import net.minecraft.client.Minecraft; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityList; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.monster.IMob; import net.minecraft.entity.passive.EntityPig; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntityMobSpawner; import net.minecraft.util.BlockPos; import net.minecraft.util.EnumFacing; import net.minecraft.world.World; import net.minecraftforge.client.MinecraftForgeClient; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; public class ItemMobSpawner extends ItemBlock { private static Map<Integer, EntityLiving> entityHashMap = new HashMap<Integer, EntityLiving>(); private static Map<Integer, String> IDtoNameMap = new HashMap<Integer, String>(); public static int idPig; private static boolean loaded; private static ItemMobSpawner instance; public static void register() { GameDataManipulator.replaceItem(Block.getIdFromBlock(Blocks.mob_spawner), instance = new ItemMobSpawner()); } public static void initRender() { SpawnerRenderer.load(instance); } public ItemMobSpawner() { super(Blocks.mob_spawner); setHasSubtypes(true); } /** * Called from BlockMobSpawner on the client via asm generated onBlockPlacedBy */ public static void onBlockPlaced(World world, BlockPos pos, ItemStack stack) { if(!NEIClientConfig.hasSMPCounterPart()) return; TileEntityMobSpawner tileentitymobspawner = (TileEntityMobSpawner) world.getTileEntity(pos); if (tileentitymobspawner != null) { setDefaultTag(stack); String mobtype = IDtoNameMap.get(stack.getItemDamage()); if (mobtype != null) { NEICPH.sendMobSpawnerID(pos.getX(), pos.getY(), pos.getZ(), mobtype); tileentitymobspawner.getSpawnerBaseLogic().setEntityName(mobtype); } } } @Override public void addInformation(ItemStack itemstack, EntityPlayer par2EntityPlayer, List list, boolean par4) { setDefaultTag(itemstack); int meta = itemstack.getItemDamage(); if (meta == 0) { meta = idPig; } Entity e = getEntity(meta); list.add("\u00A7" + (e instanceof IMob ? "4" : "3") + IDtoNameMap.get(meta)); } public static EntityLiving getEntity(int ID) { EntityLiving e = entityHashMap.get(ID); if (e == null) { World world = Minecraft.getMinecraft().theWorld; Class<?> clazz = (Class<?>) EntityList.idToClassMapping.get(ID); try { e = (EntityLiving) clazz.getConstructor(new Class[]{World.class}).newInstance(world); } catch (Throwable t) { if(clazz == null) NEIClientConfig.logger.error("Null class for entity ("+ID+", "+IDtoNameMap.get(ID)); else NEIClientConfig.logger.error("Error creating instance of entity: " + clazz.getName(), t); e = getEntity(idPig); } entityHashMap.put(ID, e); } return e; } private static void setDefaultTag(ItemStack itemstack) { if (!IDtoNameMap.containsKey(itemstack.getItemDamage())) itemstack.setItemDamage(idPig); } public static void loadSpawners(World world) { if (loaded) return; loaded = true; HashMap<Class<Entity>, String> classToStringMapping = (HashMap<Class<Entity>, String>) EntityList.classToStringMapping; HashMap<Class<Entity>, Integer> classToIDMapping = (HashMap<Class<Entity>, Integer>) EntityList.classToIDMapping; for (Class<Entity> eclass : classToStringMapping.keySet()) { if (!EntityLiving.class.isAssignableFrom(eclass)) continue; try { EntityLiving entityliving = (EntityLiving) eclass.getConstructor(new Class[]{World.class}).newInstance(world); entityliving.isChild(); int id = classToIDMapping.get(eclass); String name = classToStringMapping.get(eclass); if (name.equals("EnderDragon")) continue; IDtoNameMap.put(id, name); if (name.equals("Pig")) idPig = id; } catch (Throwable ignored) { } } for(Iterator<Entry<Integer, String>> it = IDtoNameMap.entrySet().iterator(); it.hasNext();) { Entry<Integer, String> e = it.next(); if(getEntity(e.getKey()).getClass() == EntityPig.class && !e.getValue().equals("Pig")) it.remove(); } } @Override public void getSubItems(Item item, CreativeTabs tab, List list) { if(!NEIClientConfig.hasSMPCounterPart()) list.add(new ItemStack(item)); else for(int i : IDtoNameMap.keySet()) list.add(new ItemStack(item, 1, i)); } }