public void reloadConfig(ConfigManager.RestartRequirement restartType) {
    if (restartType == ConfigManager.RestartRequirement.GAME) {
      modifyWorld = mainConfigManager.get("worldgen.enable").getBoolean();
      updateFactor = mainConfigManager.get("network.updateFactor").getInt();
      longUpdateFactor = mainConfigManager.get("network.longUpdateFactor").getInt();
      colorBlindMode = mainConfigManager.get("display.colorBlindMode").getBoolean();

      reloadConfig(ConfigManager.RestartRequirement.WORLD);
    } else if (restartType == ConfigManager.RestartRequirement.WORLD) {
      reloadConfig(ConfigManager.RestartRequirement.NONE);
    } else {
      hideFluidNumbers = mainConfigManager.get("display.hideFluidValues").getBoolean();
      hidePowerNumbers = mainConfigManager.get("display.hidePowerValues").getBoolean();
      itemLifespan = mainConfigManager.get("general.itemLifespan").getInt();
      canEnginesExplode = mainConfigManager.get("general.canEnginesExplode").getBoolean();
      consumeWaterSources = mainConfigManager.get("general.pumpsConsumeWater").getBoolean();
      miningMultiplier = (float) mainConfigManager.get("power.miningUsageMultiplier").getDouble();

      if (mainConfigManager.get("general.updateCheck").getBoolean(true)) {
        Version.check();
      }

      if (mainConfiguration.hasChanged()) {
        mainConfiguration.save();
      }
    }
  }
  @EventHandler
  public void loadConfiguration(FMLPreInitializationEvent evt) {

    BCLog.initLog();

    mainConfiguration =
        new BuildCraftConfiguration(
            new File(evt.getModConfigurationDirectory(), "buildcraft/main.conf"));
    try {
      mainConfiguration.load();

      Property updateCheck =
          BuildCraftCore.mainConfiguration.get(
              Configuration.CATEGORY_GENERAL, "update.check", true);
      updateCheck.comment = "set to true for version check on startup";
      if (updateCheck.getBoolean(true)) {
        Version.check();
      }

      Property continuousCurrent =
          BuildCraftCore.mainConfiguration.get(
              Configuration.CATEGORY_GENERAL,
              "current.continuous",
              DefaultProps.CURRENT_CONTINUOUS);
      continuousCurrent.comment =
          "set to true for allowing machines to be driven by continuous current";
      continuousCurrentModel = continuousCurrent.getBoolean(DefaultProps.CURRENT_CONTINUOUS);

      Property trackNetwork =
          BuildCraftCore.mainConfiguration.get(
              Configuration.CATEGORY_GENERAL, "trackNetworkUsage", false);
      trackNetworkUsage = trackNetwork.getBoolean(false);

      Property dropBlock =
          BuildCraftCore.mainConfiguration.get(
              Configuration.CATEGORY_GENERAL, "dropBrokenBlocks", true);
      dropBlock.comment = "set to false to prevent fillers from dropping blocks.";
      dropBrokenBlocks = dropBlock.getBoolean(true);

      Property lifespan =
          BuildCraftCore.mainConfiguration.get(
              Configuration.CATEGORY_GENERAL, "itemLifespan", itemLifespan);
      lifespan.comment =
          "the lifespan in ticks of items dropped on the ground by pipes and machines, vanilla = 6000, default = 1200";
      itemLifespan = lifespan.getInt(itemLifespan);
      if (itemLifespan < 100) {
        itemLifespan = 100;
      }

      Property powerFrameworkClass =
          BuildCraftCore.mainConfiguration.get(
              Configuration.CATEGORY_GENERAL,
              "power.framework",
              "buildcraft.energy.PneumaticPowerFramework");

      Property factor =
          BuildCraftCore.mainConfiguration.get(
              Configuration.CATEGORY_GENERAL, "network.updateFactor", 10);
      factor.comment =
          "increasing this number will decrease network update frequency, useful for overloaded servers";
      updateFactor = factor.getInt(10);

      Property longFactor =
          BuildCraftCore.mainConfiguration.get(
              Configuration.CATEGORY_GENERAL, "network.stateRefreshPeriod", 40);
      longFactor.comment =
          "delay between full client sync packets, increasing it saves bandwidth, decreasing makes for better client syncronization.";
      longUpdateFactor = longFactor.getInt(40);

      Property wrenchId =
          BuildCraftCore.mainConfiguration.getItem("wrench.id", DefaultProps.WRENCH_ID);

      wrenchItem =
          (new ItemWrench(wrenchId.getInt(DefaultProps.WRENCH_ID)))
              .setUnlocalizedName("wrenchItem");
      LanguageRegistry.addName(wrenchItem, "Wrench");
      CoreProxy.proxy.registerItem(wrenchItem);

      Property springId =
          BuildCraftCore.mainConfiguration.getBlock("springBlock.id", DefaultProps.SPRING_ID);

      Property woodenGearId =
          BuildCraftCore.mainConfiguration.getItem(
              "woodenGearItem.id", DefaultProps.WOODEN_GEAR_ID);
      Property stoneGearId =
          BuildCraftCore.mainConfiguration.getItem("stoneGearItem.id", DefaultProps.STONE_GEAR_ID);
      Property ironGearId =
          BuildCraftCore.mainConfiguration.getItem("ironGearItem.id", DefaultProps.IRON_GEAR_ID);
      Property goldenGearId =
          BuildCraftCore.mainConfiguration.getItem(
              "goldenGearItem.id", DefaultProps.GOLDEN_GEAR_ID);
      Property diamondGearId =
          BuildCraftCore.mainConfiguration.getItem(
              "diamondGearItem.id", DefaultProps.DIAMOND_GEAR_ID);
      Property modifyWorldProp =
          BuildCraftCore.mainConfiguration.get(Configuration.CATEGORY_GENERAL, "modifyWorld", true);
      modifyWorldProp.comment =
          "set to false if BuildCraft should not generate custom blocks (e.g. oil)";
      modifyWorld = modifyWorldProp.getBoolean(true);

      Property consumeWater =
          BuildCraftCore.mainConfiguration.get(
              Configuration.CATEGORY_GENERAL, "consumeWater", consumeWaterSources);
      consumeWaterSources = consumeWater.getBoolean(consumeWaterSources);
      consumeWater.comment = "set to true if the Pump should consume water";

      if (BuildCraftCore.modifyWorld) {
        springBlock = new BlockSpring(springId.getInt()).setUnlocalizedName("eternalSpring");
        CoreProxy.proxy.registerBlock(springBlock, ItemSpring.class);
      }

      woodenGearItem =
          (new ItemBuildCraft(woodenGearId.getInt())).setUnlocalizedName("woodenGearItem");
      LanguageRegistry.addName(woodenGearItem, "Wooden Gear");
      CoreProxy.proxy.registerItem(woodenGearItem);
      OreDictionary.registerOre("gearWood", new ItemStack(woodenGearItem));

      stoneGearItem =
          (new ItemBuildCraft(stoneGearId.getInt())).setUnlocalizedName("stoneGearItem");
      LanguageRegistry.addName(stoneGearItem, "Stone Gear");
      CoreProxy.proxy.registerItem(stoneGearItem);
      OreDictionary.registerOre("gearStone", new ItemStack(stoneGearItem));

      ironGearItem = (new ItemBuildCraft(ironGearId.getInt())).setUnlocalizedName("ironGearItem");
      LanguageRegistry.addName(ironGearItem, "Iron Gear");
      CoreProxy.proxy.registerItem(ironGearItem);
      OreDictionary.registerOre("gearIron", new ItemStack(ironGearItem));

      goldGearItem = (new ItemBuildCraft(goldenGearId.getInt())).setUnlocalizedName("goldGearItem");
      LanguageRegistry.addName(goldGearItem, "Gold Gear");
      CoreProxy.proxy.registerItem(goldGearItem);
      OreDictionary.registerOre("gearGold", new ItemStack(goldGearItem));

      diamondGearItem =
          (new ItemBuildCraft(diamondGearId.getInt())).setUnlocalizedName("diamondGearItem");
      LanguageRegistry.addName(diamondGearItem, "Diamond Gear");
      CoreProxy.proxy.registerItem(diamondGearItem);
      OreDictionary.registerOre("gearDiamond", new ItemStack(diamondGearItem));

      Property colorBlindProp =
          BuildCraftCore.mainConfiguration.get(
              Configuration.CATEGORY_GENERAL, "client.colorblindmode", false);
      colorBlindProp.comment = "Set to true to enable alternate textures";
      colorBlindMode = colorBlindProp.getBoolean(false);

      MinecraftForge.EVENT_BUS.register(this);

    } finally {
      if (mainConfiguration.hasChanged()) {
        mainConfiguration.save();
      }
    }
  }