/*******************************************************************************
* AbyssalCraft
* Copyright (c) 2012 - 2017 Shinoow.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v3
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl-3.0.txt
*
* Contributors:
* Shinoow - implementation
******************************************************************************/
package com.shinoow.abyssalcraft.init;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import net.minecraftforge.fml.common.Loader;
import net.minecraftforge.fml.common.discovery.ASMDataTable;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLLoadCompleteEvent;
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import com.shinoow.abyssalcraft.api.integration.ACPlugin;
import com.shinoow.abyssalcraft.api.integration.IACPlugin;
import com.shinoow.abyssalcraft.common.util.ACLogger;
public class IntegrationHandler implements ILifeCycleHandler {
boolean isInvTweaksLoaded = Loader.isModLoaded("inventorytweaks");
boolean isJEILoaded = Loader.isModLoaded("JEI");
List<String> mods = new ArrayList<String>();
List<IACPlugin> integrations = new ArrayList<IACPlugin>();
List<IACPlugin> temp = new ArrayList<IACPlugin>();
/**
* Attempts to find mod integrations.
*/
private void findIntegrations(ASMDataTable asmDataTable){
ACLogger.info("Starting the Integration Handler.");
fetchModIntegrations(asmDataTable);
if(!temp.isEmpty())
ACLogger.info("Preliminary integration search complete: found %d possible mod integration(s)!", temp.size());
}
private void fetchModIntegrations(ASMDataTable asmDataTable){
List<IACPlugin> plugins = fetchPlugins(asmDataTable, ACPlugin.class, IACPlugin.class);
if(!plugins.isEmpty())
for(IACPlugin plugin : plugins)
temp.add(plugin);
}
private <T> List<T> fetchPlugins(ASMDataTable asmDataTable, Class annotationClass, Class<T> instanceClass){
String annotationClassName = annotationClass.getCanonicalName();
Set<ASMDataTable.ASMData> asmDatas = asmDataTable.getAll(annotationClassName);
List<T> instances = new ArrayList<>();
for (ASMDataTable.ASMData asmData : asmDatas)
try {
Class<?> asmClass = Class.forName(asmData.getClassName());
Class<? extends T> asmInstanceClass = asmClass.asSubclass(instanceClass);
T instance = asmInstanceClass.newInstance();
instances.add(instance);
} catch (ClassNotFoundException | IllegalAccessException | InstantiationException e) {
ACLogger.severe("Failed to load: {}", asmData.getClassName(), e);
}
return instances;
}
/**
* Does the initial search for integrations (eg. go over found plugins and scan ones registered through the API)
*/
private void search(){
if(isInvTweaksLoaded){
ACLogger.info("Inventory Tweaks is present, initializing sorting stuff.");
mods.add("Inventory Tweaks");
}
if(isJEILoaded){
ACLogger.info("Just Enough Items is present, initializing informative stuff.");
mods.add("Just Enough Items");
}
if(!temp.isEmpty()){
for(IACPlugin plugin : temp)
if(plugin.canLoad()){
ACLogger.info("Found a integration for mod %s", plugin.getModName());
integrations.add(plugin);
mods.add(plugin.getModName());
}
temp.clear();
}
if(!mods.isEmpty())
ACLogger.info("Mod integrations found: %s", mods);
}
@Override
public void preInit(FMLPreInitializationEvent event){
findIntegrations(event.getAsmData());
}
@Override
public void init(FMLInitializationEvent event){
search();
if(!integrations.isEmpty()){
ACLogger.info("Initializing integrations!");
for(IACPlugin plugin : integrations)
plugin.init();
}
}
@Override
public void postInit(FMLPostInitializationEvent event){
if(!integrations.isEmpty()){
ACLogger.info("Post-initializing integrations!");
for(IACPlugin plugin : integrations)
plugin.postInit();
}
}
@Override
public void loadComplete(FMLLoadCompleteEvent event) {}
}