diff --git a/src/main/java/codechicken/nei/ClientHandler.java b/src/main/java/codechicken/nei/ClientHandler.java index 48908260..761ba888 100644 --- a/src/main/java/codechicken/nei/ClientHandler.java +++ b/src/main/java/codechicken/nei/ClientHandler.java @@ -19,7 +19,6 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.entity.EntityPlayerSP; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.GuiErrorScreen; -import net.minecraft.client.gui.GuiMainMenu; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.gui.GuiSelectWorld; import net.minecraft.client.multiplayer.WorldClient; @@ -27,6 +26,7 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.item.EntityItem; import net.minecraft.launchwrapper.Launch; import net.minecraft.world.World; +import net.minecraftforge.client.event.GuiOpenEvent; import net.minecraftforge.client.event.RenderWorldLastEvent; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.world.WorldEvent; @@ -61,7 +61,6 @@ public class ClientHandler { private static ClientHandler instance; private final ArrayList SMPmagneticItems = new ArrayList<>(); private World lastworld; - private GuiScreen lastGui; public void addSMPMagneticItem(int i, World world) { WorldClient cworld = (WorldClient) world; @@ -308,18 +307,19 @@ public class ClientHandler { if (mc.currentScreen == null) NEIController.processCreativeCycling(mc.thePlayer.inventory); updateMagnetMode(mc.theWorld, mc.thePlayer); + } else { + lastworld = null; } + } - GuiScreen gui = mc.currentScreen; - if (gui != lastGui) { - if (gui instanceof GuiMainMenu) lastworld = null; - else if (gui instanceof GuiSelectWorld) NEIClientConfig.reloadSaves(); - else if (gui == null) { - /* prevent WorldClient reference being held in the Gui */ - NEIController.manager = null; - } + @SubscribeEvent + public void onGuiScreen(GuiOpenEvent event) { + if (event.gui instanceof GuiSelectWorld) { + NEIClientConfig.reloadSaves(); + } else if (event.gui == null) { + /* prevent WorldClient reference being held in the Gui */ + NEIController.manager = null; } - lastGui = gui; } @SubscribeEvent @@ -338,6 +338,7 @@ public class ClientHandler { Minecraft mc = Minecraft.getMinecraft(); if (event.world == mc.theWorld) { NEIClientConfig.unloadWorld(); + ItemMobSpawner.clearEntityReferences(); } } @@ -354,8 +355,6 @@ public class ClientHandler { if (!Minecraft.getMinecraft().isSingleplayer()) // wait for server to initiate in singleplayer NEIClientConfig.loadWorld("remote/" + ClientUtils.getServerIP().replace(':', '~')); } - ItemMobSpawner.clearEntityReferences(world); - lastworld = world; } } diff --git a/src/main/java/codechicken/nei/ItemMobSpawner.java b/src/main/java/codechicken/nei/ItemMobSpawner.java index f8ebfb93..4b5433c3 100644 --- a/src/main/java/codechicken/nei/ItemMobSpawner.java +++ b/src/main/java/codechicken/nei/ItemMobSpawner.java @@ -16,10 +16,14 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntityMobSpawner; +import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.IIcon; import net.minecraft.world.World; import net.minecraftforge.client.MinecraftForgeClient; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + public class ItemMobSpawner extends ItemBlock { private static final Map entityHashMap = new HashMap<>(); @@ -29,7 +33,6 @@ public class ItemMobSpawner extends ItemBlock { public ItemMobSpawner() { super(Blocks.mob_spawner); - hasSubtypes = true; MinecraftForgeClient.registerItemRenderer(this, new SpawnerRenderer()); } @@ -38,7 +41,6 @@ public class ItemMobSpawner extends ItemBlock { * These are ASM translated from BlockMobSpawner */ public static int placedX; - public static int placedY; public static int placedZ; @@ -65,6 +67,7 @@ public class ItemMobSpawner extends ItemBlock { return false; } + @SideOnly(Side.CLIENT) @Override public void addInformation(ItemStack itemstack, EntityPlayer par2EntityPlayer, List list, boolean par4) { setDefaultTag(itemstack); @@ -73,15 +76,17 @@ public class ItemMobSpawner extends ItemBlock { meta = idPig; } Entity e = getEntity(meta); - list.add("\u00A7" + (e instanceof IMob ? "4" : "3") + IDtoNameMap.get(meta)); + list.add( + (e instanceof IMob ? EnumChatFormatting.DARK_RED : EnumChatFormatting.DARK_AQUA) + + IDtoNameMap.get(meta)); } public static EntityLiving getEntity(int ID) { EntityLiving e = entityHashMap.get(ID); if (e == null) { + loadSpawners(); + Class clazz = EntityList.IDtoClassMapping.get(ID); World world = NEIClientUtils.mc().theWorld; - loadSpawners(world); - Class clazz = (Class) EntityList.IDtoClassMapping.get(ID); try { e = (EntityLiving) clazz.getConstructor(new Class[] { World.class }).newInstance(world); } catch (Throwable t) { @@ -95,40 +100,31 @@ public class ItemMobSpawner extends ItemBlock { return e; } - public static void clearEntityReferences(World newWorld) { - entityHashMap.values().removeIf(e -> e.worldObj != newWorld); + public static void clearEntityReferences() { + entityHashMap.clear(); } private void setDefaultTag(ItemStack itemstack) { if (!IDtoNameMap.containsKey(itemstack.getItemDamage())) itemstack.setItemDamage(idPig); } - public static void loadSpawners(World world) { + public static void loadSpawners() { if (loaded) return; loaded = true; - Map, String> classToStringMapping = EntityList.classToStringMapping; - @SuppressWarnings("unchecked") - Map, Integer> classToIDMapping = (Map, Integer>) EntityList.classToIDMapping; - for (Class 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); - + for (Map.Entry, String> entry : EntityList.classToStringMapping.entrySet()) { + final Class clazz = entry.getKey(); + if (EntityLiving.class.isAssignableFrom(clazz)) { + Integer id = (Integer) EntityList.classToIDMapping.get(clazz); + if (id == null) continue; + String name = entry.getValue(); + if (name == null) continue; if (name.equals("EnderDragon")) continue; - - IDtoNameMap.put(id, name); - if (name.equals("Pig")) idPig = id; - } catch (Throwable ignored) {} + if (clazz != EntityPig.class || name.equals("Pig")) { + IDtoNameMap.put(id, name); + } + } } - - IDtoNameMap.entrySet() - .removeIf(e -> getEntity(e.getKey()).getClass() == EntityPig.class && !e.getValue().equals("Pig")); } @Override diff --git a/src/main/java/codechicken/nei/NEIClientConfig.java b/src/main/java/codechicken/nei/NEIClientConfig.java index 1e16efd1..c927d64f 100644 --- a/src/main/java/codechicken/nei/NEIClientConfig.java +++ b/src/main/java/codechicken/nei/NEIClientConfig.java @@ -17,7 +17,6 @@ import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumChatFormatting; -import net.minecraft.world.World; import net.minecraft.world.storage.SaveFormatComparator; import net.minecraftforge.common.MinecraftForge; @@ -790,7 +789,7 @@ public class NEIClientConfig { } world = new ConfigSet(new File(specificDir, "NEI.dat"), new ConfigFile(new File(specificDir, "NEI.cfg"))); - bootNEI(ClientUtils.getWorld()); + bootNEI(); onWorldLoad(newWorld); } } @@ -885,11 +884,11 @@ public class NEIClientConfig { return NEIKeyboardUtils.getKeyName(hash + meta); } - public static void bootNEI(World world) { + public static void bootNEI() { if (!mainNEIConfigLoaded) { // main NEI config loading - ItemInfo.load(world); + ItemInfo.load(); GuiInfo.load(); RecipeInfo.load(); HeldItemHandler.load(); diff --git a/src/main/java/codechicken/nei/SpawnerRenderer.java b/src/main/java/codechicken/nei/SpawnerRenderer.java index 7f68341b..59f065f2 100644 --- a/src/main/java/codechicken/nei/SpawnerRenderer.java +++ b/src/main/java/codechicken/nei/SpawnerRenderer.java @@ -9,7 +9,6 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.boss.BossStatus; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; -import net.minecraft.world.World; import net.minecraftforge.client.IItemRenderer; import org.lwjgl.opengl.GL11; @@ -27,21 +26,16 @@ public class SpawnerRenderer implements IItemRenderer { public void renderInventoryItem(RenderBlocks render, ItemStack item) { int meta = item.getItemDamage(); - if (meta == 0) meta = ItemMobSpawner.idPig; - String bossName = BossStatus.bossName; int bossTimeout = BossStatus.statusBarTime; boolean bossHasColorModifier = BossStatus.hasColorModifier; + Entity entity = ItemMobSpawner.getEntity(meta); try { - World world = NEIClientUtils.mc().theWorld; - ItemMobSpawner.loadSpawners(world); CCRenderState.changeTexture(TextureMap.locationBlocksTexture); render.renderBlockAsItem(Blocks.mob_spawner, 0, 1F); + entity.setWorld(render.minecraftRB.theWorld); GL11.glPushMatrix(); - - Entity entity = ItemMobSpawner.getEntity(meta); - entity.setWorld(world); float f1 = 0.4375F; if (entity.getShadowSize() > 1.5) f1 = 0.1F; GL11.glRotatef((float) (ClientUtils.getRenderTime() * 10), 0.0F, 1.0F, 0.0F); @@ -51,7 +45,6 @@ public class SpawnerRenderer implements IItemRenderer { entity.setLocationAndAngles(0, 0, 0, 0.0F, 0.0F); RenderManager.instance.renderEntityWithPosYaw(entity, 0.0D, 0.0D, 0.0D, 0.0F, 0); GL11.glPopMatrix(); - GL11.glEnable(GL12.GL_RESCALE_NORMAL); OpenGlHelper.setActiveTexture(OpenGlHelper.lightmapTexUnit); GL11.glDisable(GL11.GL_TEXTURE_2D); diff --git a/src/main/java/codechicken/nei/api/ItemInfo.java b/src/main/java/codechicken/nei/api/ItemInfo.java index 5ccae709..023493b9 100644 --- a/src/main/java/codechicken/nei/api/ItemInfo.java +++ b/src/main/java/codechicken/nei/api/ItemInfo.java @@ -124,12 +124,12 @@ public class ItemInfo { addMobSpawnerItem(); } - public static void load(World world) { + public static void load() { addVanillaBlockProperties(); addDefaultDropDowns(); searchItems(); parseModItems(); - ItemMobSpawner.loadSpawners(world); + ItemMobSpawner.loadSpawners(); addSpawnEggs(); addInfiniteHandlers(); addInputHandlers();