/** * Copyright (c) Lambda Innovation, 2013-2016 * This file is part of the AcademyCraft mod. * https://github.com/LambdaInnovation/AcademyCraft * Licensed under GPLv3, see project root for more information. */ package cn.academy.core; import cn.academy.core.config.ACConfig; import cn.academy.core.network.NetworkManager; import cn.lambdalib.annoreg.core.Registrant; import cn.lambdalib.annoreg.core.RegistrationManager; import cn.lambdalib.annoreg.core.RegistrationMod; import cn.lambdalib.annoreg.mc.RegItem; import cn.lambdalib.annoreg.mc.RegMessageHandler; import cn.lambdalib.crafting.CustomMappingHelper; import cn.lambdalib.crafting.RecipeRegistry; import cn.lambdalib.util.version.VersionUpdateUrl; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.Mod; import cpw.mods.fml.common.Mod.EventHandler; import cpw.mods.fml.common.Mod.Instance; import cpw.mods.fml.common.event.*; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.network.FMLNetworkEvent.ClientDisconnectionFromServerEvent; import cpw.mods.fml.common.network.NetworkRegistry; import cpw.mods.fml.common.network.simpleimpl.SimpleNetworkWrapper; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; import net.minecraft.util.ResourceLocation; import net.minecraft.util.StatCollector; import net.minecraftforge.common.config.Configuration; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.util.Map.Entry; /** * Academy Craft Mod Main Class * * @author acaly, WeathFolD, KS * */ @Mod(modid = "academy-craft", name = "AcademyCraft", version = AcademyCraft.VERSION, dependencies = "required-after:LambdaLib@@LL_VERSION@") // LambdaLib is currently unstable. Supports only one version. @RegistrationMod(pkg = "cn.academy.", res = "academy", prefix = "ac_") @Registrant @VersionUpdateUrl(repoUrl="github.com/LambdaInnovation/AcademyCraft") public class AcademyCraft { @Instance("academy-craft") public static AcademyCraft INSTANCE; public static final String VERSION = "@VERSION@"; public static final boolean DEBUG_MODE = VERSION.startsWith("@"); public static final Logger log = LogManager.getLogger("AcademyCraft"); static final String[] scripts = { "generic", "ability", "electromaster", "teleporter", "meltdowner", "generic_skills" }; public static Configuration config; public static RecipeRegistry recipes = new RecipeRegistry(); @RegMessageHandler.WrapperInstance public static SimpleNetworkWrapper netHandler = NetworkRegistry.INSTANCE.newSimpleChannel("academy-network"); @RegItem @RegItem.UTName("logo") public static Item logo; public static CreativeTabs cct = new CreativeTabs("AcademyCraft") { @Override public Item getTabIconItem() { return logo; } }; @EventHandler public void preInit(FMLPreInitializationEvent event) { log.info("Starting AcademyCraft"); log.info("Copyright (c) Lambda Innovation, 2013-2016"); log.info("http://ac.li-dev.cn/"); config = new Configuration(event.getSuggestedConfigurationFile()); NetworkManager.init(event); RegistrationManager.INSTANCE.registerAll(this, "PreInit"); } @EventHandler public void init(FMLInitializationEvent event) { RegistrationManager.INSTANCE.registerAll(this, "Init"); FMLCommonHandler.instance().bus().register(this); } @EventHandler public void postInit(FMLPostInitializationEvent event) { // Load recipes names before loading script RegistrationManager.INSTANCE.registerAll(this, "AC_RecipeNames"); // Load script, where names now are available recipes.addRecipeFromResourceLocation(new ResourceLocation("academy:recipes/default.recipe")); // PostInit stage, including tutorial init, depends on registered recipes RegistrationManager.INSTANCE.registerAll(this, "PostInit"); if (DEBUG_MODE && false) { System.out.printf("|-------------------------------------------------------\n"); System.out.printf("| AC Recipe Name Mappings\n"); System.out.printf("|--------------------------|----------------------------\n"); System.out.printf(String.format("| %-25s| Object Name\n", "Recipe Name")); System.out.printf("|--------------------------|----------------------------\n"); for (Entry<String, Object> entry : recipes.nameMapping.entrySet()) { Object obj = entry.getValue(); String str1 = entry.getKey(), str2; if (obj instanceof Item) { str2 = StatCollector.translateToLocal(((Item) obj).getUnlocalizedName() + ".name"); } else if (obj instanceof Block) { str2 = StatCollector.translateToLocal(((Block) obj).getUnlocalizedName() + ".name"); } else { str2 = obj.toString(); } System.out.printf(String.format("| %-25s| %s\n", str1, str2)); } System.out.printf("|-------------------------------------------------------\n"); } recipes = null; // Release and have fun GC config.save(); } @SideOnly(Side.CLIENT) @EventHandler public void postInit2(FMLPostInitializationEvent event) { } @EventHandler public void serverStarting(FMLServerStartingEvent event) { RegistrationManager.INSTANCE.registerAll(this, "StartServer"); ACConfig.updateConfig(null); } @EventHandler public void serverStopping(FMLServerStoppingEvent event) { config.save(); } @SubscribeEvent public void onClientDisconnectionFromServer( ClientDisconnectionFromServerEvent e) { config.save(); } public static void addToRecipe(Class klass) { CustomMappingHelper.addMapping(recipes, klass); } /** * Simply a fast route to print debug message. */ public static void debug(Object msg) { if (DEBUG_MODE) { log.info(msg); } } }