aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gregtech/GT_Mod.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/gregtech/GT_Mod.java')
-rw-r--r--src/main/java/gregtech/GT_Mod.java846
1 files changed, 846 insertions, 0 deletions
diff --git a/src/main/java/gregtech/GT_Mod.java b/src/main/java/gregtech/GT_Mod.java
new file mode 100644
index 0000000000..2569ff3b53
--- /dev/null
+++ b/src/main/java/gregtech/GT_Mod.java
@@ -0,0 +1,846 @@
+package gregtech;
+
+import static gregtech.GT_Version.VERSION_MAJOR;
+import static gregtech.GT_Version.VERSION_MINOR;
+import static gregtech.GT_Version.VERSION_PATCH;
+import static gregtech.api.GregTech_API.registerCircuitProgrammer;
+import static gregtech.api.enums.Mods.Forestry;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Locale;
+import java.util.Map;
+import java.util.function.Predicate;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+import net.minecraft.item.crafting.CraftingManager;
+import net.minecraft.item.crafting.FurnaceRecipes;
+import net.minecraft.item.crafting.IRecipe;
+import net.minecraft.util.WeightedRandomChestContent;
+import net.minecraft.world.World;
+import net.minecraftforge.common.ChestGenHooks;
+import net.minecraftforge.common.config.Configuration;
+import net.minecraftforge.oredict.OreDictionary;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import com.google.common.base.Stopwatch;
+import com.google.common.collect.SetMultimap;
+
+import appeng.api.AEApi;
+import cpw.mods.fml.common.FMLCommonHandler;
+import cpw.mods.fml.common.Mod;
+import cpw.mods.fml.common.SidedProxy;
+import cpw.mods.fml.common.event.FMLInitializationEvent;
+import cpw.mods.fml.common.event.FMLLoadCompleteEvent;
+import cpw.mods.fml.common.event.FMLModIdMappingEvent;
+import cpw.mods.fml.common.event.FMLPostInitializationEvent;
+import cpw.mods.fml.common.event.FMLPreInitializationEvent;
+import cpw.mods.fml.common.event.FMLServerAboutToStartEvent;
+import cpw.mods.fml.common.event.FMLServerStartedEvent;
+import cpw.mods.fml.common.event.FMLServerStartingEvent;
+import cpw.mods.fml.common.event.FMLServerStoppingEvent;
+import cpw.mods.fml.common.registry.EntityRegistry;
+import gregtech.api.GregTech_API;
+import gregtech.api.enchants.Enchantment_EnderDamage;
+import gregtech.api.enchants.Enchantment_Hazmat;
+import gregtech.api.enchants.Enchantment_Radioactivity;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.Mods;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.Textures;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.interfaces.internal.IGT_Mod;
+import gregtech.api.metatileentity.BaseMetaPipeEntity;
+import gregtech.api.objects.ItemData;
+import gregtech.api.objects.XSTR;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.threads.GT_Runnable_MachineBlockUpdate;
+import gregtech.api.util.GT_Assemblyline_Server;
+import gregtech.api.util.GT_Forestry_Compat;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_Log;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.GT_RecipeRegistrator;
+import gregtech.api.util.GT_SpawnEventHandler;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.item.ItemHolder;
+import gregtech.common.GT_DummyWorld;
+import gregtech.common.GT_Network;
+import gregtech.common.GT_Proxy;
+import gregtech.common.GT_RecipeAdder;
+import gregtech.common.covers.GT_Cover_FacadeAE;
+import gregtech.common.entities.GT_Entity_Arrow;
+import gregtech.common.entities.GT_Entity_Arrow_Potion;
+import gregtech.common.misc.GT_Command;
+import gregtech.common.misc.spaceprojects.commands.SPM_Command;
+import gregtech.common.misc.spaceprojects.commands.SP_Command;
+import gregtech.common.tileentities.machines.GT_MetaTileEntity_Hatch_CraftingInput_ME;
+import gregtech.common.tileentities.storage.GT_MetaTileEntity_DigitalChestBase;
+import gregtech.crossmod.holoinventory.HoloInventory;
+import gregtech.crossmod.waila.Waila;
+import gregtech.loaders.load.GT_CoverBehaviorLoader;
+import gregtech.loaders.load.GT_FuelLoader;
+import gregtech.loaders.load.GT_ItemIterator;
+import gregtech.loaders.load.GT_Loader_MetaTileEntities_Recipes;
+import gregtech.loaders.load.GT_SonictronLoader;
+import gregtech.loaders.misc.GT_Achievements;
+import gregtech.loaders.misc.GT_Bees;
+import gregtech.loaders.misc.GT_CoverLoader;
+import gregtech.loaders.postload.GT_BlockResistanceLoader;
+import gregtech.loaders.postload.GT_BookAndLootLoader;
+import gregtech.loaders.postload.GT_CraftingRecipeLoader;
+import gregtech.loaders.postload.GT_CropLoader;
+import gregtech.loaders.postload.GT_FakeRecipeLoader;
+import gregtech.loaders.postload.GT_ItemMaxStacksizeLoader;
+import gregtech.loaders.postload.GT_MachineRecipeLoader;
+import gregtech.loaders.postload.GT_MachineTooltipsLoader;
+import gregtech.loaders.postload.GT_MinableRegistrator;
+import gregtech.loaders.postload.GT_PostLoad;
+import gregtech.loaders.postload.GT_RecyclerBlacklistLoader;
+import gregtech.loaders.postload.GT_ScrapboxDropLoader;
+import gregtech.loaders.postload.GT_Worldgenloader;
+import gregtech.loaders.preload.GT_Loader_CircuitBehaviors;
+import gregtech.loaders.preload.GT_Loader_ItemData;
+import gregtech.loaders.preload.GT_Loader_Item_Block_And_Fluid;
+import gregtech.loaders.preload.GT_Loader_MetaTileEntities;
+import gregtech.loaders.preload.GT_Loader_MultiTileEntities;
+import gregtech.loaders.preload.GT_Loader_OreDictionary;
+import gregtech.loaders.preload.GT_Loader_OreProcessing;
+import gregtech.loaders.preload.GT_PreLoad;
+import ic2.api.recipe.IRecipeInput;
+import ic2.api.recipe.RecipeOutput;
+
+@Mod(
+ modid = Mods.Names.GREG_TECH,
+ name = "GregTech",
+ version = "MC1710",
+ guiFactory = "gregtech.client.GT_GuiFactory",
+ dependencies = " required-after:IC2;" + " required-after:structurelib;"
+ + " required-after:gtnhlib@[0.2.1,);"
+ + " required-after:modularui@[1.1.12,);"
+ + " required-after:appliedenergistics2@[rv3-beta-258,);"
+ + " after:dreamcraft;"
+ + " after:Forestry;"
+ + " after:PFAAGeologica;"
+ + " after:Thaumcraft;"
+ + " after:Railcraft;"
+ + " after:ThermalExpansion;"
+ + " after:TwilightForest;"
+ + " after:harvestcraft;"
+ + " after:magicalcrops;"
+ + " after:Botania;"
+ + " after:BuildCraft|Transport;"
+ + " after:BuildCraft|Silicon;"
+ + " after:BuildCraft|Factory;"
+ + " after:BuildCraft|Energy;"
+ + " after:BuildCraft|Core;"
+ + " after:BuildCraft|Builders;"
+ + " after:GalacticraftCore;"
+ + " after:GalacticraftMars;"
+ + " after:GalacticraftPlanets;"
+ + " after:ThermalExpansion|Transport;"
+ + " after:ThermalExpansion|Energy;"
+ + " after:ThermalExpansion|Factory;"
+ + " after:RedPowerCore;"
+ + " after:RedPowerBase;"
+ + " after:RedPowerMachine;"
+ + " after:RedPowerCompat;"
+ + " after:RedPowerWiring;"
+ + " after:RedPowerLogic;"
+ + " after:RedPowerLighting;"
+ + " after:RedPowerWorld;"
+ + " after:RedPowerControl;"
+ + " after:UndergroundBiomes;"
+ + " after:TConstruct;"
+ + " after:Translocator;"
+ + " after:gendustry;")
+public class GT_Mod implements IGT_Mod {
+
+ @Deprecated // Keep for use in BaseMetaTileEntity
+ public static final int VERSION = VERSION_MAJOR, SUBVERSION = VERSION_MINOR;
+
+ @Deprecated
+ public static final int TOTAL_VERSION = calculateTotalGTVersion(VERSION, SUBVERSION);
+ public static final int NBT_VERSION = calculateTotalGTVersion(VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH);
+
+ @Deprecated
+ public static final int REQUIRED_IC2 = 624;
+
+ @Mod.Instance(Mods.Names.GREG_TECH)
+ public static GT_Mod instance;
+
+ @SidedProxy(
+ modId = Mods.Names.GREG_TECH,
+ clientSide = "gregtech.common.GT_Client",
+ serverSide = "gregtech.common.GT_Server")
+ public static GT_Proxy gregtechproxy;
+
+ public static int MAX_IC2 = 2147483647;
+ public static GT_Achievements achievements;
+ public static final String aTextGeneral = "general";
+ public static final String aTextIC2 = "ic2_";
+ public static final Logger GT_FML_LOGGER = LogManager.getLogger("GregTech GTNH");
+
+ @SuppressWarnings("deprecation")
+ public GT_Mod() {
+ GT_Values.GT = this;
+ GT_Values.DW = new GT_DummyWorld();
+ GT_Values.NW = new GT_Network();
+ GT_Values.RA = new GT_RecipeAdder();
+
+ for (int i = 0; i < 4; i++) {
+ GregTech_API.registerTileEntityConstructor(i, i2 -> GregTech_API.constructBaseMetaTileEntity());
+ }
+ for (int i = 4; i < 12; i++) {
+ GregTech_API.registerTileEntityConstructor(i, i2 -> new BaseMetaPipeEntity());
+ }
+
+ // noinspection deprecation// Need run-time initialization
+ GregTech_API.sRecipeAdder = GT_Values.RA;
+
+ // noinspection ResultOfMethodCallIgnored// Suspicious likely pointless
+ Textures.BlockIcons.VOID.name();
+ // noinspection ResultOfMethodCallIgnored// Suspicious likely pointless
+ Textures.ItemIcons.VOID.name();
+ }
+
+ @SuppressWarnings("unused") // TODO: Delete this method
+ public static int calculateTotalGTVersion(int minorVersion) {
+ return calculateTotalGTVersion(VERSION, minorVersion);
+ }
+
+ public static int calculateTotalGTVersion(int majorVersion, int minorVersion) {
+ return calculateTotalGTVersion(majorVersion, minorVersion, 0);
+ }
+
+ public static int calculateTotalGTVersion(int majorVersion, int minorVersion, int patchVersion) {
+ return majorVersion * 1000000 + minorVersion * 1000 + patchVersion;
+ }
+
+ @Mod.EventHandler
+ public void onPreLoad(FMLPreInitializationEvent aEvent) {
+ Locale.setDefault(Locale.ENGLISH);
+ if (GregTech_API.sPreloadStarted) {
+ return;
+ }
+
+ for (Runnable tRunnable : GregTech_API.sBeforeGTPreload) {
+ try {
+ tRunnable.run();
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+
+ Configuration tMainConfig = GT_PreLoad.getConfiguration(aEvent.getModConfigurationDirectory());
+ GT_PreLoad.initCompat();
+ GT_PreLoad.createLogFiles(
+ aEvent.getModConfigurationDirectory()
+ .getParentFile(),
+ tMainConfig);
+
+ gregtechproxy.onPreLoad();
+
+ GT_Log.out.println("GT_Mod: Setting Configs");
+
+ GT_PreLoad.loadConfig(tMainConfig);
+
+ new Enchantment_Hazmat();
+ new Enchantment_EnderDamage();
+ new Enchantment_Radioactivity();
+
+ Materials.init();
+
+ GT_Log.out.println("GT_Mod: Saving Main Config");
+ tMainConfig.save();
+
+ GT_PreLoad.initLocalization(
+ aEvent.getModConfigurationDirectory()
+ .getParentFile());
+ GT_PreLoad.adjustScrap();
+
+ EntityRegistry.registerModEntity(GT_Entity_Arrow.class, "GT_Entity_Arrow", 1, GT_Values.GT, 160, 1, true);
+ EntityRegistry
+ .registerModEntity(GT_Entity_Arrow_Potion.class, "GT_Entity_Arrow_Potion", 2, GT_Values.GT, 160, 1, true);
+ AEApi.instance()
+ .registries()
+ .interfaceTerminal()
+ .register(GT_MetaTileEntity_Hatch_CraftingInput_ME.class);
+
+ GT_PreLoad.runMineTweakerCompat();
+
+ new GT_Loader_OreProcessing().run();
+ new GT_Loader_OreDictionary().run();
+ new GT_Loader_ItemData().run();
+ new GT_Loader_Item_Block_And_Fluid().run();
+ new GT_Loader_MetaTileEntities().run();
+ if (GT_Values.enableMultiTileEntities) {
+ new GT_Loader_MultiTileEntities().run();
+ }
+
+ new GT_Loader_CircuitBehaviors().run();
+ new GT_CoverBehaviorLoader().run();
+ new GT_SonictronLoader().run();
+ new GT_SpawnEventHandler();
+
+ GT_PreLoad.sortToTheEnd();
+ GregTech_API.sPreloadFinished = true;
+ GT_Log.out.println("GT_Mod: Preload-Phase finished!");
+ GT_Log.ore.println("GT_Mod: Preload-Phase finished!");
+
+ GT_UIInfos.init();
+
+ for (Runnable tRunnable : GregTech_API.sAfterGTPreload) {
+ try {
+ tRunnable.run();
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+
+ if (FMLCommonHandler.instance()
+ .getEffectiveSide()
+ .isServer()) GT_Assemblyline_Server.fillMap(aEvent);
+ }
+
+ @Mod.EventHandler
+ public void onLoad(FMLInitializationEvent aEvent) {
+ if (GregTech_API.sLoadStarted) {
+ return;
+ }
+
+ for (Runnable tRunnable : GregTech_API.sBeforeGTLoad) {
+ try {
+ tRunnable.run();
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+
+ if (Forestry.isModLoaded())
+ // noinspection InstantiationOfUtilityClass//TODO: Refactor GT_Bees with proper state handling
+ new GT_Bees();
+
+ // Disable Low Grav regardless of config if Cleanroom is disabled.
+ if (!gregtechproxy.mEnableCleanroom) {
+ gregtechproxy.mLowGravProcessing = false;
+ }
+
+ gregtechproxy.onLoad();
+
+ registerCircuitProgrammer(new Predicate<>() {
+
+ private final int screwdriverOreId = OreDictionary.getOreID("craftingToolScrewdriver");
+
+ @Override
+ public boolean test(ItemStack stack) {
+ for (int i : OreDictionary.getOreIDs(stack)) if (i == screwdriverOreId) return true;
+ return false;
+ }
+ }, true);
+
+ new GT_Loader_MetaTileEntities_Recipes().run();
+
+ if (gregtechproxy.mSortToTheEnd) {
+ new GT_ItemIterator().run();
+ gregtechproxy.registerUnificationEntries();
+ new GT_FuelLoader().run();
+ }
+ if (Mods.Waila.isModLoaded()) {
+ Waila.init();
+ }
+ if (Mods.HoloInventory.isModLoaded()) {
+ HoloInventory.init();
+ }
+ GregTech_API.sLoadFinished = true;
+ GT_Log.out.println("GT_Mod: Load-Phase finished!");
+ GT_Log.ore.println("GT_Mod: Load-Phase finished!");
+
+ for (Runnable tRunnable : GregTech_API.sAfterGTLoad) {
+ try {
+ tRunnable.run();
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+ }
+
+ @Mod.EventHandler
+ public void onPostLoad(FMLPostInitializationEvent aEvent) {
+ if (GregTech_API.sPostloadStarted) {
+ return;
+ }
+
+ for (Runnable tRunnable : GregTech_API.sBeforeGTPostload) {
+ try {
+ tRunnable.run();
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+
+ gregtechproxy.onPostLoad();
+
+ final int bound = GregTech_API.METATILEENTITIES.length;
+ for (int i1 = 1; i1 < bound; i1++) {
+ if (GregTech_API.METATILEENTITIES[i1] != null) {
+ GT_Log.out.printf("META %d %s\n", i1, GregTech_API.METATILEENTITIES[i1].getMetaName());
+ }
+ }
+
+ if (gregtechproxy.mSortToTheEnd) {
+ gregtechproxy.registerUnificationEntries();
+ } else {
+ new GT_ItemIterator().run();
+ gregtechproxy.registerUnificationEntries();
+ new GT_FuelLoader().run();
+ }
+ new GT_BookAndLootLoader().run();
+ new GT_ItemMaxStacksizeLoader().run();
+ new GT_BlockResistanceLoader().run();
+ new GT_RecyclerBlacklistLoader().run();
+ new GT_MinableRegistrator().run();
+ new GT_FakeRecipeLoader().run();
+ new GT_MachineRecipeLoader().run();
+ new GT_ScrapboxDropLoader().run();
+ new GT_CropLoader().run();
+ new GT_Worldgenloader().run();
+ new GT_CoverLoader().run();
+
+ GT_RecipeRegistrator.registerUsagesForMaterials(
+ null,
+ false,
+ new ItemStack(Blocks.planks, 1),
+ new ItemStack(Blocks.cobblestone, 1),
+ new ItemStack(Blocks.stone, 1),
+ new ItemStack(Items.leather, 1));
+
+ GT_OreDictUnificator.addItemData(
+ GT_ModHandler.getRecipeOutput(
+ null,
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Tin, 1L),
+ null,
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Tin, 1L),
+ null,
+ GT_OreDictUnificator.get(OrePrefixes.ingot, Materials.Tin, 1L),
+ null,
+ null,
+ null),
+ new ItemData(Materials.Tin, 10886400L));
+ GT_ModHandler.removeRecipe(
+ new ItemStack(Items.glowstone_dust, 1),
+ new ItemStack(Items.glowstone_dust, 1),
+ null,
+ new ItemStack(Items.glowstone_dust, 1),
+ new ItemStack(Items.glowstone_dust, 1));
+ GT_ModHandler.removeRecipeDelayed(
+ new ItemStack(Blocks.wooden_slab, 1, 0),
+ new ItemStack(Blocks.wooden_slab, 1, 1),
+ new ItemStack(Blocks.wooden_slab, 1, 2));
+ GT_ModHandler.addCraftingRecipe(
+ new ItemStack(Blocks.wooden_slab, 6, 0),
+ GT_ModHandler.RecipeBits.NOT_REMOVABLE | GT_ModHandler.RecipeBits.BUFFERED,
+ new Object[] { "WWW", 'W', new ItemStack(Blocks.planks, 1, 0) });
+
+ // Save a copy of these list before activateOreDictHandler(), then loop over them.
+ Map<IRecipeInput, RecipeOutput> aMaceratorRecipeList = GT_ModHandler.getMaceratorRecipeList();
+ Map<IRecipeInput, RecipeOutput> aCompressorRecipeList = GT_ModHandler.getCompressorRecipeList();
+ Map<IRecipeInput, RecipeOutput> aExtractorRecipeList = GT_ModHandler.getExtractorRecipeList();
+ Map<IRecipeInput, RecipeOutput> aOreWashingRecipeList = GT_ModHandler.getOreWashingRecipeList();
+ Map<IRecipeInput, RecipeOutput> aThermalCentrifugeRecipeList = GT_ModHandler.getThermalCentrifugeRecipeList();
+
+ GT_Log.out.println(
+ "GT_Mod: Activating OreDictionary Handler, this can take some time, as it scans the whole OreDictionary");
+ GT_FML_LOGGER.info(
+ "If your Log stops here, you were too impatient. Wait a bit more next time, before killing Minecraft with the Task Manager.");
+
+ GT_PostLoad.activateOreDictHandler();
+ GT_PostLoad.replaceVanillaMaterials();
+ GT_PostLoad.removeIc2Recipes(
+ aMaceratorRecipeList,
+ aCompressorRecipeList,
+ aExtractorRecipeList,
+ aOreWashingRecipeList,
+ aThermalCentrifugeRecipeList);
+
+ if (GT_Values.D1) {
+ GT_ModHandler.sSingleNonBlockDamagableRecipeList.forEach(
+ iRecipe -> GT_Log.out.println(
+ "=> " + iRecipe.getRecipeOutput()
+ .getDisplayName()));
+ }
+ new GT_CraftingRecipeLoader().run();
+ GT_ModHandler.removeRecipeByOutput(ItemList.IC2_ForgeHammer.getWildcard(1L));
+ GT_ModHandler.removeRecipeByOutput(GT_ModHandler.getIC2Item("machine", 1L));
+ GT_ModHandler.addCraftingRecipe(
+ GT_ModHandler.getIC2Item("machine", 1L),
+ GT_ModHandler.RecipeBits.BUFFERED | GT_ModHandler.RecipeBits.NOT_REMOVABLE
+ | GT_ModHandler.RecipeBits.REVERSIBLE,
+ new Object[] { "RRR", "RwR", "RRR", 'R', OrePrefixes.plate.get(Materials.Iron) });
+
+ GT_PostLoad.registerFluidCannerRecipes();
+
+ if (Forestry.isModLoaded()) {
+ GT_Forestry_Compat.transferCentrifugeRecipes();
+ GT_Forestry_Compat.transferSqueezerRecipes();
+ }
+ GT_MetaTileEntity_DigitalChestBase.registerAEIntegration();
+ ItemStack facade = AEApi.instance()
+ .definitions()
+ .items()
+ .facade()
+ .maybeItem()
+ .transform(i -> new ItemStack(i, 1, GT_Values.W))
+ .orNull();
+ if (facade != null) {
+ GregTech_API.registerCover(facade, null, new GT_Cover_FacadeAE());
+ }
+
+ Arrays
+ .stream(
+ new String[] { "blastfurnace", "blockcutter", "inductionFurnace", "generator", "windMill", "waterMill",
+ "solarPanel", "centrifuge", "electrolyzer", "compressor", "electroFurnace", "extractor",
+ "macerator", "recycler", "metalformer", "orewashingplant", "massFabricator", "replicator", })
+ .map(tName -> GT_ModHandler.getIC2Item(tName, 1L))
+ .forEach(GT_ModHandler::removeRecipeByOutputDelayed);
+
+ GT_PostLoad.nerfVanillaTools();
+
+ /*
+ * Until this point most crafting recipe additions, and removals, have been buffered. Go through, execute the
+ * removals in bulk, and then any deferred additions. The bulk removals in particular significantly speed up the
+ * recipe list modifications.
+ */
+
+ @SuppressWarnings("UnstableApiUsage") // Stable enough for this project
+ Stopwatch stopwatch = Stopwatch.createStarted();
+ GT_Log.out.println("GT_Mod: Adding buffered Recipes.");
+ GT_ModHandler.stopBufferingCraftingRecipes();
+ // noinspection UnstableApiUsage// Stable enough for this project
+ GT_FML_LOGGER.info("Executed delayed Crafting Recipes (" + stopwatch.stop() + "). Have a Cake.");
+
+ GT_Log.out.println("GT_Mod: Saving Lang File.");
+ new GT_MachineTooltipsLoader().run();
+ GT_LanguageManager.sEnglishFile.save();
+ GregTech_API.sPostloadFinished = true;
+ GT_Log.out.println("GT_Mod: PostLoad-Phase finished!");
+ GT_Log.ore.println("GT_Mod: PostLoad-Phase finished!");
+ for (Runnable tRunnable : GregTech_API.sAfterGTPostload) {
+ try {
+ tRunnable.run();
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+ GT_PostLoad.addFakeRecipes();
+
+ if (GregTech_API.mOutputRF || GregTech_API.mInputRF) {
+ GT_Utility.checkAvailabilities();
+ if (!GT_Utility.RF_CHECK) {
+ GregTech_API.mOutputRF = false;
+ GregTech_API.mInputRF = false;
+ }
+ }
+
+ GT_PostLoad.addSolidFakeLargeBoilerFuels();
+ GT_PostLoad.identifyAnySteam();
+
+ achievements = new GT_Achievements();
+
+ GT_Recipe.GTppRecipeHelper = true;
+ GT_Log.out.println("GT_Mod: Loading finished, de-allocating temporary Init Variables.");
+ GregTech_API.sBeforeGTPreload = null;
+ GregTech_API.sAfterGTPreload = null;
+ GregTech_API.sBeforeGTLoad = null;
+ GregTech_API.sAfterGTLoad = null;
+ GregTech_API.sBeforeGTPostload = null;
+ GregTech_API.sAfterGTPostload = null;
+
+ GT_PostLoad.createGTtoolsCreativeTab();
+ }
+
+ @Mod.EventHandler
+ public void onLoadComplete(FMLLoadCompleteEvent aEvent) {
+ gregtechproxy.onLoadComplete();
+ for (Runnable tRunnable : GregTech_API.sGTCompleteLoad) {
+ try {
+ tRunnable.run();
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+ GregTech_API.sGTCompleteLoad = null;
+ }
+
+ @Mod.EventHandler
+ public void onServerStarted(FMLServerStartedEvent aEvent) {
+ gregtechproxy.onServerStarted();
+ }
+
+ @Mod.EventHandler
+ public void onServerAboutToStart(FMLServerAboutToStartEvent aEvent) {
+ gregtechproxy.onServerAboutToStart();
+ }
+
+ @Mod.EventHandler
+ public void onServerStarting(FMLServerStartingEvent aEvent) {
+
+ for (Runnable tRunnable : GregTech_API.sBeforeGTServerstart) {
+ try {
+ tRunnable.run();
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+
+ gregtechproxy.onServerStarting();
+ // Check for more IC2 recipes on ServerStart to also catch MineTweaker additions
+ GT_ModHandler
+ .addIC2RecipesToGT(GT_ModHandler.getMaceratorRecipeList(), RecipeMaps.maceratorRecipes, true, true, true);
+ GT_ModHandler
+ .addIC2RecipesToGT(GT_ModHandler.getCompressorRecipeList(), RecipeMaps.compressorRecipes, true, true, true);
+ GT_ModHandler
+ .addIC2RecipesToGT(GT_ModHandler.getExtractorRecipeList(), RecipeMaps.extractorRecipes, true, true, true);
+ GT_ModHandler
+ .addIC2RecipesToGT(GT_ModHandler.getOreWashingRecipeList(), RecipeMaps.oreWasherRecipes, false, true, true);
+ GT_ModHandler.addIC2RecipesToGT(
+ GT_ModHandler.getThermalCentrifugeRecipeList(),
+ RecipeMaps.thermalCentrifugeRecipes,
+ true,
+ true,
+ true);
+ GT_Log.out.println("GT_Mod: Unificating outputs of all known Recipe Types.");
+ ArrayList<ItemStack> tStacks = new ArrayList<>(10000);
+ GT_Log.out.println("GT_Mod: IC2 Machines");
+
+ ic2.api.recipe.Recipes.cannerBottle.getRecipes()
+ .values()
+ .stream()
+ .map(t -> t.items)
+ .forEach(tStacks::addAll);
+ ic2.api.recipe.Recipes.centrifuge.getRecipes()
+ .values()
+ .stream()
+ .map(t -> t.items)
+ .forEach(tStacks::addAll);
+ ic2.api.recipe.Recipes.compressor.getRecipes()
+ .values()
+ .stream()
+ .map(t -> t.items)
+ .forEach(tStacks::addAll);
+ ic2.api.recipe.Recipes.extractor.getRecipes()
+ .values()
+ .stream()
+ .map(t -> t.items)
+ .forEach(tStacks::addAll);
+ ic2.api.recipe.Recipes.macerator.getRecipes()
+ .values()
+ .stream()
+ .map(t -> t.items)
+ .forEach(tStacks::addAll);
+ ic2.api.recipe.Recipes.metalformerCutting.getRecipes()
+ .values()
+ .stream()
+ .map(t -> t.items)
+ .forEach(tStacks::addAll);
+ ic2.api.recipe.Recipes.metalformerExtruding.getRecipes()
+ .values()
+ .stream()
+ .map(t -> t.items)
+ .forEach(tStacks::addAll);
+ ic2.api.recipe.Recipes.metalformerRolling.getRecipes()
+ .values()
+ .stream()
+ .map(t -> t.items)
+ .forEach(tStacks::addAll);
+ ic2.api.recipe.Recipes.matterAmplifier.getRecipes()
+ .values()
+ .stream()
+ .map(t -> t.items)
+ .forEach(tStacks::addAll);
+ ic2.api.recipe.Recipes.oreWashing.getRecipes()
+ .values()
+ .stream()
+ .map(t -> t.items)
+ .forEach(tStacks::addAll);
+
+ GT_Log.out.println("GT_Mod: Dungeon Loot");
+ for (WeightedRandomChestContent tContent : ChestGenHooks.getInfo("dungeonChest")
+ .getItems(new XSTR())) {
+ tStacks.add(tContent.theItemId);
+ }
+ for (WeightedRandomChestContent tContent : ChestGenHooks.getInfo("bonusChest")
+ .getItems(new XSTR())) {
+ tStacks.add(tContent.theItemId);
+ }
+ for (WeightedRandomChestContent tContent : ChestGenHooks.getInfo("villageBlacksmith")
+ .getItems(new XSTR())) {
+ tStacks.add(tContent.theItemId);
+ }
+ for (WeightedRandomChestContent tContent : ChestGenHooks.getInfo("strongholdCrossing")
+ .getItems(new XSTR())) {
+ tStacks.add(tContent.theItemId);
+ }
+ for (WeightedRandomChestContent tContent : ChestGenHooks.getInfo("strongholdLibrary")
+ .getItems(new XSTR())) {
+ tStacks.add(tContent.theItemId);
+ }
+ for (WeightedRandomChestContent tContent : ChestGenHooks.getInfo("strongholdCorridor")
+ .getItems(new XSTR())) {
+ tStacks.add(tContent.theItemId);
+ }
+ for (WeightedRandomChestContent tContent : ChestGenHooks.getInfo("pyramidJungleDispenser")
+ .getItems(new XSTR())) {
+ tStacks.add(tContent.theItemId);
+ }
+ for (WeightedRandomChestContent tContent : ChestGenHooks.getInfo("pyramidJungleChest")
+ .getItems(new XSTR())) {
+ tStacks.add(tContent.theItemId);
+ }
+ for (WeightedRandomChestContent tContent : ChestGenHooks.getInfo("pyramidDesertyChest")
+ .getItems(new XSTR())) {
+ tStacks.add(tContent.theItemId);
+ }
+ for (WeightedRandomChestContent tContent : ChestGenHooks.getInfo("mineshaftCorridor")
+ .getItems(new XSTR())) {
+ tStacks.add(tContent.theItemId);
+ }
+ GT_Log.out.println("GT_Mod: Smelting");
+
+ // Deal with legacy Minecraft raw types
+ tStacks.addAll(
+ FurnaceRecipes.smelting()
+ .getSmeltingList()
+ .values());
+
+ if (gregtechproxy.mCraftingUnification) {
+ GT_Log.out.println("GT_Mod: Crafting Recipes");
+ for (IRecipe tRecipe : CraftingManager.getInstance()
+ .getRecipeList()) {
+ if ((tRecipe instanceof IRecipe)) {
+ tStacks.add(tRecipe.getRecipeOutput());
+ }
+ }
+ }
+ for (ItemStack tOutput : tStacks) {
+ if (!gregtechproxy.mRegisteredOres.contains(tOutput)) {
+ GT_OreDictUnificator.setStack(tOutput);
+ } else {
+ logMultilineError(GT_FML_LOGGER, generateGTErr01Message(tOutput));
+ tOutput.setStackDisplayName("ERROR! PLEASE CHECK YOUR LOG FOR 'GT-ERR-01'!");
+ }
+ }
+ GregTech_API.mServerStarted = true;
+ GT_Log.out.println("GT_Mod: ServerStarting-Phase finished!");
+ GT_Log.ore.println("GT_Mod: ServerStarting-Phase finished!");
+
+ for (Runnable tRunnable : GregTech_API.sAfterGTServerstart) {
+ try {
+ tRunnable.run();
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+
+ aEvent.registerServerCommand(new GT_Command());
+ aEvent.registerServerCommand(new SP_Command());
+ aEvent.registerServerCommand(new SPM_Command());
+ // Sets a new Machine Block Update Thread everytime a world is loaded
+ GT_Runnable_MachineBlockUpdate.initExecutorService();
+ }
+
+ public boolean isServerSide() {
+ return gregtechproxy.isServerSide();
+ }
+
+ public boolean isClientSide() {
+ return gregtechproxy.isClientSide();
+ }
+
+ public boolean isBukkitSide() {
+ return gregtechproxy.isBukkitSide();
+ }
+
+ public EntityPlayer getThePlayer() {
+ return gregtechproxy.getThePlayer();
+ }
+
+ public int addArmor(String aArmorPrefix) {
+ return gregtechproxy.addArmor(aArmorPrefix);
+ }
+
+ public void doSonictronSound(ItemStack aStack, World aWorld, double aX, double aY, double aZ) {
+ gregtechproxy.doSonictronSound(aStack, aWorld, aX, aY, aZ);
+ }
+
+ @Mod.EventHandler
+ public void onIDChangingEvent(FMLModIdMappingEvent aEvent) {
+ GT_Utility.reInit();
+ GT_Recipe.reInit();
+ try {
+ for (Map<?, ?> gt_itemStackMap : GregTech_API.sItemStackMappings) {
+ GT_Utility.reMap(gt_itemStackMap);
+ }
+ for (SetMultimap<? extends ItemHolder, ?> gt_itemStackMap : GregTech_API.itemStackMultiMaps) {
+ GT_Utility.reMap(gt_itemStackMap);
+ }
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+
+ @Mod.EventHandler
+ public void onServerStopping(FMLServerStoppingEvent aEvent) {
+ for (Runnable tRunnable : GregTech_API.sBeforeGTServerstop) {
+ try {
+ tRunnable.run();
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+
+ gregtechproxy.onServerStopping();
+
+ for (Runnable tRunnable : GregTech_API.sAfterGTServerstop) {
+ try {
+ tRunnable.run();
+ } catch (Throwable e) {
+ e.printStackTrace(GT_Log.err);
+ }
+ }
+ // Interrupt IDLE Threads to close down cleanly
+ GT_Runnable_MachineBlockUpdate.shutdownExecutorService();
+ }
+
+ public static void logStackTrace(Throwable t) {
+ final StringWriter sw = new StringWriter();
+ t.printStackTrace(new PrintWriter(sw));
+ GT_FML_LOGGER.error(sw);
+ }
+
+ private static String[] generateGTErr01Message(ItemStack stack) {
+ // The message is presented on a per-line basis to make possible formatting in the future easier.
+ return new String[] { "GT-ERR-01 at " + stack.getUnlocalizedName() + " " + stack.getDisplayName(),
+ "A recipe used an OreDict item as output directly, without copying the item before that. This is a typical CallByReference/CallByValue error.",
+ "The said item will be renamed to make the invalid recipe visible.",
+ "Please check all recipes that output this item, and report them to the mod that introduced the recipes.", };
+ }
+
+ @SuppressWarnings("SameParameterValue") // The method is used with one logger, but that might change in the future.
+ private static void logMultilineError(Logger logger, String[] errorMessageLines) {
+ for (String errorMessage : errorMessageLines) {
+ logger.error(errorMessage);
+ }
+ }
+}