@EventHandler
  public void preInit(FMLPreInitializationEvent evt) {
    Property fillerDestroyProp =
        BuildCraftCore.mainConfiguration.get(
            Configuration.CATEGORY_GENERAL, "filler.destroy", DefaultProps.FILLER_DESTROY);
    fillerDestroyProp.comment = "If true, Filler will destroy blocks instead of breaking them.";
    fillerDestroy = fillerDestroyProp.getBoolean(DefaultProps.FILLER_DESTROY);

    Property fillerLifespanToughProp =
        BuildCraftCore.mainConfiguration.get(
            Configuration.CATEGORY_GENERAL,
            "filler.lifespan.tough",
            DefaultProps.FILLER_LIFESPAN_TOUGH);
    fillerLifespanToughProp.comment =
        "Lifespan in ticks of items dropped by the filler from 'tough' blocks (those that can't be broken by hand)";
    fillerLifespanTough = fillerLifespanToughProp.getInt(DefaultProps.FILLER_LIFESPAN_TOUGH);

    Property fillerLifespanNormalProp =
        BuildCraftCore.mainConfiguration.get(
            Configuration.CATEGORY_GENERAL,
            "filler.lifespan.other",
            DefaultProps.FILLER_LIFESPAN_NORMAL);
    fillerLifespanNormalProp.comment =
        "Lifespan in ticks of items dropped by the filler from non-tough blocks (those that can be broken by hand)";
    fillerLifespanNormal = fillerLifespanNormalProp.getInt(DefaultProps.FILLER_LIFESPAN_NORMAL);

    templateItem = new ItemBptTemplate();
    templateItem.setUnlocalizedName("templateItem");
    LanguageRegistry.addName(templateItem, "Template");
    CoreProxy.proxy.registerItem(templateItem);

    blueprintItem = new ItemBptBluePrint();
    blueprintItem.setUnlocalizedName("blueprintItem");
    LanguageRegistry.addName(blueprintItem, "Blueprint");
    CoreProxy.proxy.registerItem(blueprintItem);

    markerBlock = new BlockMarker();
    CoreProxy.proxy.registerBlock(markerBlock.setBlockName("markerBlock"));

    pathMarkerBlock = new BlockPathMarker();
    CoreProxy.proxy.registerBlock(pathMarkerBlock.setBlockName("pathMarkerBlock"));

    fillerBlock = new BlockFiller();
    CoreProxy.proxy.registerBlock(fillerBlock.setBlockName("fillerBlock"));

    builderBlock = new BlockBuilder();
    CoreProxy.proxy.registerBlock(builderBlock.setBlockName("builderBlock"));

    architectBlock = new BlockArchitect();
    CoreProxy.proxy.registerBlock(architectBlock.setBlockName("architectBlock"));

    libraryBlock = new BlockBlueprintLibrary();
    CoreProxy.proxy.registerBlock(libraryBlock.setBlockName("libraryBlock"));

    GameRegistry.registerTileEntity(TileMarker.class, "Marker");
    GameRegistry.registerTileEntity(TileFiller.class, "Filler");
    GameRegistry.registerTileEntity(TileBuilder.class, "net.minecraft.src.builders.TileBuilder");
    GameRegistry.registerTileEntity(TileArchitect.class, "net.minecraft.src.builders.TileTemplate");
    GameRegistry.registerTileEntity(
        TilePathMarker.class, "net.minecraft.src.builders.TilePathMarker");
    GameRegistry.registerTileEntity(
        TileBlueprintLibrary.class, "net.minecraft.src.builders.TileBlueprintLibrary");

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

    MinecraftForge.EVENT_BUS.register(this);

    // Create filler registry
    try {
      FillerManager.registry = new FillerRegistry();

      // INIT FILLER PATTERNS
      FillerManager.registry.addPattern(PatternFill.INSTANCE);
      FillerManager.registry.addPattern(new PatternFlatten());
      FillerManager.registry.addPattern(new PatternHorizon());
      FillerManager.registry.addPattern(new PatternClear());
      FillerManager.registry.addPattern(new PatternBox());
      FillerManager.registry.addPattern(new PatternPyramid());
      FillerManager.registry.addPattern(new PatternStairs());
      FillerManager.registry.addPattern(new PatternCylinder());
    } catch (Error error) {
      BCLog.logErrorAPI("Buildcraft", error, IFillerPattern.class);
      throw error;
    }

    ActionManager.registerActionProvider(new BuildersActionProvider());
  }
  @PreInit
  public void initialize(FMLPreInitializationEvent evt) {
    Property templateItemId =
        BuildCraftCore.mainConfiguration.getItem("templateItem.id", DefaultProps.TEMPLATE_ITEM_ID);
    Property blueprintItemId =
        BuildCraftCore.mainConfiguration.getItem(
            "blueprintItem.id", DefaultProps.BLUEPRINT_ITEM_ID);
    Property markerId =
        BuildCraftCore.mainConfiguration.getBlock("marker.id", DefaultProps.MARKER_ID);
    Property pathMarkerId =
        BuildCraftCore.mainConfiguration.getBlock("pathMarker.id", DefaultProps.PATH_MARKER_ID);
    Property fillerId =
        BuildCraftCore.mainConfiguration.getBlock("filler.id", DefaultProps.FILLER_ID);
    Property builderId =
        BuildCraftCore.mainConfiguration.getBlock("builder.id", DefaultProps.BUILDER_ID);
    Property architectId =
        BuildCraftCore.mainConfiguration.getBlock("architect.id", DefaultProps.ARCHITECT_ID);
    Property libraryId =
        BuildCraftCore.mainConfiguration.getBlock(
            "blueprintLibrary.id", DefaultProps.BLUEPRINT_LIBRARY_ID);

    Property fillerDestroyProp =
        BuildCraftCore.mainConfiguration.get(
            Configuration.CATEGORY_GENERAL, "filler.destroy", DefaultProps.FILLER_DESTROY);
    fillerDestroyProp.comment = "If true, Filler will destroy blocks instead of breaking them.";
    fillerDestroy = fillerDestroyProp.getBoolean(DefaultProps.FILLER_DESTROY);

    Property fillerLifespanToughProp =
        BuildCraftCore.mainConfiguration.get(
            Configuration.CATEGORY_GENERAL,
            "filler.lifespan.tough",
            DefaultProps.FILLER_LIFESPAN_TOUGH);
    fillerLifespanToughProp.comment =
        "Lifespan in ticks of items dropped by the filler from 'tough' blocks (those that can't be broken by hand)";
    fillerLifespanTough = fillerLifespanToughProp.getInt(DefaultProps.FILLER_LIFESPAN_TOUGH);

    Property fillerLifespanNormalProp =
        BuildCraftCore.mainConfiguration.get(
            Configuration.CATEGORY_GENERAL,
            "filler.lifespan.other",
            DefaultProps.FILLER_LIFESPAN_NORMAL);
    fillerLifespanNormalProp.comment =
        "Lifespan in ticks of items dropped by the filler from non-tough blocks (those that can be broken by hand)";
    fillerLifespanNormal = fillerLifespanNormalProp.getInt(DefaultProps.FILLER_LIFESPAN_NORMAL);

    templateItem = new ItemBptTemplate(templateItemId.getInt());
    templateItem.setUnlocalizedName("templateItem");
    LanguageRegistry.addName(templateItem, "Template");

    blueprintItem = new ItemBptBluePrint(blueprintItemId.getInt());
    blueprintItem.setUnlocalizedName("blueprintItem");
    LanguageRegistry.addName(blueprintItem, "Blueprint");

    markerBlock = new BlockMarker(markerId.getInt());
    CoreProxy.proxy.registerBlock(markerBlock.setUnlocalizedName("markerBlock"));
    CoreProxy.proxy.addName(markerBlock, "Land Mark");

    pathMarkerBlock = new BlockPathMarker(pathMarkerId.getInt());
    CoreProxy.proxy.registerBlock(pathMarkerBlock.setUnlocalizedName("pathMarkerBlock"));
    CoreProxy.proxy.addName(pathMarkerBlock, "Path Mark");

    fillerBlock = new BlockFiller(fillerId.getInt());
    CoreProxy.proxy.registerBlock(fillerBlock.setUnlocalizedName("fillerBlock"));
    CoreProxy.proxy.addName(fillerBlock, "Filler");

    builderBlock = new BlockBuilder(builderId.getInt());
    CoreProxy.proxy.registerBlock(builderBlock.setUnlocalizedName("builderBlock"));
    CoreProxy.proxy.addName(builderBlock, "Builder");

    architectBlock = new BlockArchitect(architectId.getInt());
    CoreProxy.proxy.registerBlock(architectBlock.setUnlocalizedName("architectBlock"));
    CoreProxy.proxy.addName(architectBlock, "Architect Table");

    libraryBlock = new BlockBlueprintLibrary(libraryId.getInt());
    CoreProxy.proxy.registerBlock(libraryBlock.setUnlocalizedName("libraryBlock"));
    CoreProxy.proxy.addName(libraryBlock, "Blueprint Library");

    GameRegistry.registerTileEntity(TileMarker.class, "Marker");
    GameRegistry.registerTileEntity(TileFiller.class, "Filler");
    GameRegistry.registerTileEntity(TileBuilder.class, "net.minecraft.src.builders.TileBuilder");
    GameRegistry.registerTileEntity(TileArchitect.class, "net.minecraft.src.builders.TileTemplate");
    GameRegistry.registerTileEntity(
        TilePathMarker.class, "net.minecraft.src.builders.TilePathMarker");
    GameRegistry.registerTileEntity(
        TileBlueprintLibrary.class, "net.minecraft.src.builders.TileBlueprintLibrary");

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

    MinecraftForge.EVENT_BUS.register(this);

    // public static final Block music;
    // public static final Block cloth;
    // public static final Block tilledField;
    // public static final BlockPortal portal;
    // public static final Block trapdoor;

    // STANDARD BLOCKS
  }
  @PreInit
  public void initialize(FMLPreInitializationEvent evt) {
    Property templateItemId =
        BuildCraftCore.mainConfiguration.get(
            Configuration.CATEGORY_ITEM, "templateItem.id", DefaultProps.TEMPLATE_ITEM_ID);
    Property blueprintItemId =
        BuildCraftCore.mainConfiguration.get(
            Configuration.CATEGORY_ITEM, "blueprintItem.id", DefaultProps.BLUEPRINT_ITEM_ID);
    Property markerId =
        BuildCraftCore.mainConfiguration.get(
            Configuration.CATEGORY_BLOCK, "marker.id", DefaultProps.MARKER_ID);
    Property pathMarkerId =
        BuildCraftCore.mainConfiguration.get(
            Configuration.CATEGORY_BLOCK, "pathMarker.id", DefaultProps.PATH_MARKER_ID);
    Property fillerId =
        BuildCraftCore.mainConfiguration.get(
            Configuration.CATEGORY_BLOCK, "filler.id", DefaultProps.FILLER_ID);
    Property builderId =
        BuildCraftCore.mainConfiguration.get(
            Configuration.CATEGORY_BLOCK, "builder.id", DefaultProps.BUILDER_ID);
    Property architectId =
        BuildCraftCore.mainConfiguration.get(
            Configuration.CATEGORY_BLOCK, "architect.id", DefaultProps.ARCHITECT_ID);
    Property libraryId =
        BuildCraftCore.mainConfiguration.get(
            Configuration.CATEGORY_BLOCK, "blueprintLibrary.id", DefaultProps.BLUEPRINT_LIBRARY_ID);

    Property fillerDestroyProp =
        BuildCraftCore.mainConfiguration.get(
            Configuration.CATEGORY_GENERAL, "filler.destroy", DefaultProps.FILLER_DESTROY);
    fillerDestroyProp.comment = "If true, Filler will destroy blocks instead of breaking them.";
    fillerDestroy = fillerDestroyProp.getBoolean(DefaultProps.FILLER_DESTROY);

    templateItem = new ItemBptTemplate(Integer.parseInt(templateItemId.value));
    templateItem.setItemName("templateItem");
    LanguageRegistry.addName(templateItem, "Template");

    blueprintItem = new ItemBptBluePrint(Integer.parseInt(blueprintItemId.value));
    blueprintItem.setItemName("blueprintItem");
    LanguageRegistry.addName(blueprintItem, "Blueprint");

    markerBlock = new BlockMarker(Integer.parseInt(markerId.value));
    CoreProxy.proxy.registerBlock(markerBlock.setBlockName("markerBlock"));
    CoreProxy.proxy.addName(markerBlock, "Land Mark");

    pathMarkerBlock = new BlockPathMarker(Integer.parseInt(pathMarkerId.value));
    CoreProxy.proxy.registerBlock(pathMarkerBlock.setBlockName("pathMarkerBlock"));
    CoreProxy.proxy.addName(pathMarkerBlock, "Path Mark");

    fillerBlock = new BlockFiller(Integer.parseInt(fillerId.value));
    CoreProxy.proxy.registerBlock(fillerBlock.setBlockName("fillerBlock"));
    CoreProxy.proxy.addName(fillerBlock, "Filler");

    builderBlock = new BlockBuilder(Integer.parseInt(builderId.value));
    CoreProxy.proxy.registerBlock(builderBlock.setBlockName("builderBlock"));
    CoreProxy.proxy.addName(builderBlock, "Builder");

    architectBlock = new BlockArchitect(Integer.parseInt(architectId.value));
    CoreProxy.proxy.registerBlock(architectBlock.setBlockName("architectBlock"));
    CoreProxy.proxy.addName(architectBlock, "Architect Table");

    libraryBlock = new BlockBlueprintLibrary(Integer.parseInt(libraryId.value));
    CoreProxy.proxy.registerBlock(libraryBlock.setBlockName("libraryBlock"));
    CoreProxy.proxy.addName(libraryBlock, "Blueprint Library");

    GameRegistry.registerTileEntity(TileMarker.class, "Marker");
    GameRegistry.registerTileEntity(TileFiller.class, "Filler");
    GameRegistry.registerTileEntity(TileBuilder.class, "net.minecraft.src.builders.TileBuilder");
    GameRegistry.registerTileEntity(TileArchitect.class, "net.minecraft.src.builders.TileTemplate");
    GameRegistry.registerTileEntity(
        TilePathMarker.class, "net.minecraft.src.builders.TilePathMarker");
    GameRegistry.registerTileEntity(
        TileBlueprintLibrary.class, "net.minecraft.src.builders.TileBlueprintLibrary");

    BuildCraftCore.mainConfiguration.save();

    // public static final Block music;
    // public static final Block cloth;
    // public static final Block tilledField;
    // public static final BlockPortal portal;
    // public static final Block trapdoor;

    // STANDARD BLOCKS
  }