@Override
    public void run() {

      for (String s : imageURLs) {
        LogHelper.info("Checking Image: " + s);
        if (!checkExistence(s)) if (downloadImage(s)) reloadRequired = true;
        if (checkExistence(s)) {
          try {
            URL url = new URL(s);
            String fileName = url.getFile();

            BufferedImage bi = ImageIO.read(new File(getImagesFolder(), fileName));
            downloadedImages.put(
                s,
                new CustomResourceLocation(
                    fileName.substring(fileName.indexOf("/") + 1), bi.getWidth(), bi.getHeight()));
          } catch (MalformedURLException e) {
            LogHelper.error("Image Read Failed");
            e.printStackTrace();
          } catch (IOException e) {
            LogHelper.error("Image Read Failed");
            e.printStackTrace();
          }
        }
      }

      isFinished = true;
    }
  private static void addRSPack(boolean refreash) {
    File rspack = new File(getConfigFolder(), "/resources");
    if (!rspack.exists()) return;

    if (!Arrays.asList(rspack.list()).contains("pack.mcmeta")) {
      try {
        JsonWriter writer = new JsonWriter(new FileWriter(new File(rspack, "pack.mcmeta")));
        writer.beginObject();
        writer.name("pack");
        writer.beginObject();
        writer.name("pack_format").value(1);
        writer.name("description").value("Draconic Evolution GUI Images");
        writer.endObject();
        writer.endObject();
        writer.close();
      } catch (IOException e) {
        LogHelper.error("Error creating pack.mcmeta");
        e.printStackTrace();
      }
    }

    Field f =
        ReflectionHelper.findField(Minecraft.class, "defaultResourcePacks", "field_110449_ao");
    f.setAccessible(true);
    try {
      List defaultResourcePacks = (List) f.get(Minecraft.getMinecraft());
      defaultResourcePacks.add(new FolderResourcePack(rspack));

      f.set(Minecraft.getMinecraft(), defaultResourcePacks);
      LogHelper.info("RS Added");
      if (refreash) Minecraft.getMinecraft().refreshResources();
    } catch (IllegalAccessException e) {
      e.printStackTrace();
    }
  }
 @SubscribeEvent
 public void tick(TickEvent.ClientTickEvent event) {
   if (downloadThread != null && downloadThread.isFinished) {
     if (downloadThread.isReloadRequired()) LogHelper.info("Image Download Finished");
     downloadStatus = downloadThread.wasSuccessful ? 1 : 2;
     FMLCommonHandler.instance().bus().unregister(this);
     addRSPack(event != null);
     downloadThread = null;
   }
 }
 private static boolean checkExistence(String urlS) {
   try {
     URL url = new URL(urlS);
     String fileName = url.getFile();
     return Arrays.asList(getImagesFolder().list())
         .contains(fileName.substring(fileName.indexOf("/") + 1));
   } catch (MalformedURLException e) {
     LogHelper.error("Unable to check files existence. Invalid URL: " + urlS);
     e.printStackTrace();
     return false;
   }
 }
  public void init(FMLInitializationEvent event) {
    CraftingHandler.init();
    registerGuiHandeler();
    registerWorldGen();
    registerEntities();
    DETab.initialize();
    PotionHandler.init();
    CCOCIntegration.init();
    ModHelper.init();
    DragonChunkLoader.init();

    LogHelper.info("Finished Initialization");
  }
    private static boolean downloadImage(String urlString) {
      try {
        URL url = new URL(urlString);
        String fileName = url.getFile();

        LogHelper.info("Downloading Image " + fileName);

        File dll = new File(getImagesFolder(), fileName);

        InputStream is = url.openStream();
        OutputStream os = new FileOutputStream(dll);

        ByteStreams.copy(is, os);

        is.close();
        os.close();

      } catch (IOException e) {
        LogHelper.error("Download Failed");
        e.printStackTrace();
        return false;
      }
      return true;
    }
  public void preInit(FMLPreInitializationEvent event) {
    ConfigHandler.init(event.getSuggestedConfigurationFile());
    registerEventListeners(event.getSide());
    ModBlocks.init();
    ModItems.init();
    ContributorHandler.init();
    registerTileEntities();
    initializeNetwork();
    registerOres();

    DraconicEvolution.reaperEnchant = new EnchantmentReaper(ConfigHandler.reaperEnchantID);
    //
    //		Potion[] potionTypes = null;
    //		LogHelper.info("Expanding Potion array size to 256");
    //
    //		for (Field f : Potion.class.getDeclaredFields()) {
    //			f.setAccessible(true);
    //
    //			try {
    //				if (f.getName().equals("potionTypes") || f.getName().equals("field_76425_a")) {
    //					Field modfield = Field.class.getDeclaredField("modifiers");
    //					modfield.setAccessible(true);
    //					modfield.setInt(f, f.getModifiers() & ~Modifier.FINAL);
    //					potionTypes = (Potion[]) f.get(null);
    //					final Potion[] newPotionTypes = new Potion[256];
    //					System.arraycopy(potionTypes, 0, newPotionTypes, 0, potionTypes.length);
    //					f.set(null, newPotionTypes);
    //				}
    //			}
    //			catch (Exception e) {
    //				LogHelper.error("Severe error, please report this to the mod author:");
    //				e.printStackTrace();
    //			}
    //		}

    Achievements.addModAchievements();
    LogHelper.info("Finished PreInitialization");
  }
 public void postInit(FMLPostInitializationEvent event) {
   OreDoublingRegistry.init();
   Achievements.registerAchievementPane();
   LogHelper.info("Finished PostInitialization");
 }