package com.amadornes.framez.compat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.minecraft.item.ItemStack;
import com.amadornes.framez.api.IFramezWrench.WrenchAction;
import com.amadornes.framez.compat.ae2.CompatModuleAE2;
import com.amadornes.framez.compat.cc.CompatModuleCC;
import com.amadornes.framez.compat.ic2.CompatModuleIC2;
import com.amadornes.framez.compat.oc.CompatModuleOC;
import com.amadornes.framez.compat.rf.CompatModuleRF;
import com.amadornes.framez.ref.Dependencies;
import cpw.mods.fml.common.Loader;
import cpw.mods.fml.common.ModAPIManager;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
/*
* This file was originally created by me for use in BluePower but I thought it'd be quite useful to just copy it here instead of having
* to rewrite it all over again, as it works perfectly as it is
*/
public class CompatibilityUtils {
private static Map<String, CompatModule> modules = new HashMap<String, CompatModule>();
private CompatibilityUtils() {
}
public static void registerModule(String modid, Class<? extends CompatModule> module, Class<? extends CompatModule> alternate) {
registerModule(modid, module.getName(), alternate == null ? null : alternate.getName());
}
public static void registerModule(String modid, String module, String alternate) {
if (modid == null || modid.trim().isEmpty())
return;
if (module == null)
return;
if (modules.containsKey(module))
return;
if ((modid.startsWith("api:") && ModAPIManager.INSTANCE.hasAPI(modid.substring(4))) || Loader.isModLoaded(modid)) {
try {
Class<?> c = Class.forName(module);
if (!CompatModule.class.isAssignableFrom(c))
return;
modules.put(modid, (CompatModule) c.newInstance());
return;
} catch (Exception e) {
e.printStackTrace();
}
}
if (alternate == null || alternate.trim().isEmpty())
return;
try {
Class<?> c2 = Class.forName(alternate);
if (!CompatModule.class.isAssignableFrom(c2))
return;
modules.put(modid, (CompatModule) c2.newInstance());
} catch (Exception e) {
e.printStackTrace();
}
}
public static List<CompatModule> getLoadedModules() {
return Collections.unmodifiableList(new ArrayList<CompatModule>(modules.values()));
}
public static CompatModule getModule(String modid) {
try {
return modules.get(modid);
} catch (Exception ex) {
}
return null;
}
public static void preInit(FMLPreInitializationEvent ev) {
for (CompatModule m : getLoadedModules())
m.preInit(ev);
}
public static void init(FMLInitializationEvent ev) {
for (CompatModule m : getLoadedModules())
m.init(ev);
}
public static void postInit(FMLPostInitializationEvent ev) {
for (CompatModule m : getLoadedModules())
m.postInit(ev);
}
@SideOnly(Side.CLIENT)
public static void registerRenders() {
for (CompatModule m : getLoadedModules())
m.registerRenders();
}
public static void registerBlocksAndItems() {
for (CompatModule m : getLoadedModules()) {
m.registerBlocks();
m.registerItems();
}
}
public static WrenchAction getWrenchAction(ItemStack stack) {
for (CompatModule m : getLoadedModules()) {
WrenchAction a = m.getWrenchAction(stack);
if (a != null)
return a;
}
return null;
}
/**
* Register modules here
*/
static {
registerModule(Dependencies.CC, CompatModuleCC.class, null);
registerModule(Dependencies.OC, CompatModuleOC.class, null);
registerModule("api:" + Dependencies.API_RF, CompatModuleRF.class, null);
registerModule(Dependencies.IC2, CompatModuleIC2.class, null);
registerModule(Dependencies.AE2, CompatModuleAE2.class, null);
}
}