package com.sijobe.spc.hooks;
import com.sijobe.spc.core.ICUIEventHandler;
import com.sijobe.spc.util.ReflectionHelper;
import com.sijobe.spc.util.WorldEditCUIHelper;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import net.minecraft.src.BaseMod;
public class WorldEditCUI implements ICUIEventHandler {
private static final boolean hasLiteLoader;
private static final boolean hasWorldEditCUILL;
private static final boolean hasModLoader;
private static final boolean hasWorldEditCUIML;
private static boolean loadedWorldEditCUI = false;
private static Object WorldEditCUIMod = null;
private static boolean handleEvents = true;
private static final Class<?> llClass;
private static final Class<?> mlClass;
/**
* @return By default true is returned
* @see com.sijobe.spc.core.IHook#isEnabled()
*/
@Override
public boolean isEnabled() {
return handleEvents;
}
/**
* @see com.sijobe.spc.core.IHook#init(java.lang.Object[])
*/
@Override
public void init(Object... params) {
}
/**
* @see com.sijobe.spc.core.ICUIEventHandler#handleCUIEvent(java.lang.String, java.lang.String[])
*/
@Override
public void handleCUIEvent(String type, String[] params) {
if(!hasWorldEditCUILL && !hasWorldEditCUIML) {
// neither version of mod was installed
handleEvents = false;
return;
}
if(!hasModLoader && !hasLiteLoader) {
// mod was installed but no LiteLoader or ModLoader
handleEvents = false;
return;
}
if(!loadedWorldEditCUI) {
if(!setWorldEditCUIMod()) {
System.out.println("SPC/WECUI: WorldEditCUI incorrectly loaded.");
handleEvents = false;
return;
}
}
try {
WorldEditCUIHelper.handleCUIEvent(WorldEditCUIMod, type, params);
} catch (Throwable t) {
System.out.println("SPC/WECUI: WorldEditCUI not initialized.");
handleEvents = false;
t.printStackTrace();
}
}
@SuppressWarnings("unchecked")
private Object getWorldEditCUIMod() {
if(hasLiteLoader) {
try {
Field field = llClass.getDeclaredField("mods");
field.setAccessible(true);
Method method = llClass.getMethod("getInstance");
Object instance = method.invoke(null);
List<?> liteMods = (List<?>)field.get(instance);
Class<?> lmClass = Class.forName("com.mumfrey.liteloader.LiteMod");
Method getName = lmClass.getMethod("getName");
for(Object liteMod : liteMods) {
String name = getName.invoke(liteMod).toString();
if(name.startsWith("WorldEditCUI by yetanotherx")) {
loadedWorldEditCUI = true;
return liteMod;
}
}
} catch (Throwable t) {
t.printStackTrace();
}
}
if(WorldEditCUIMod == null && hasModLoader) {
try {
Method method = mlClass.getMethod("getLoadedMods");
List<BaseMod> mods = (List<BaseMod>)method.invoke(null);
for(BaseMod mod : mods) {
if(mod.getName().equals("mod_WorldEditCUI")) {
loadedWorldEditCUI = true;
return mod;
}
}
} catch (Throwable t) {
t.printStackTrace();
}
}
loadedWorldEditCUI = false;
return null;
}
@SuppressWarnings("unchecked")
private boolean setWorldEditCUIMod() {
WorldEditCUIMod = getWorldEditCUIMod();
return (WorldEditCUIMod != null);
}
static {
mlClass = ReflectionHelper.getClass("net.minecraft.src.ModLoader", "ModLoader");
if(mlClass != null) {
hasModLoader = true;
System.out.println("SPC/WECUI: ModLoader is installed.");
} else {
hasModLoader = false;
System.out.println("SPC/WECUI: ModLoader not installed.");
}
Class<?> modClass = ReflectionHelper.getClass("net.minecraft.src.mod_WorldEditCUI", "mod_WorldEditCUI");
if(modClass != null) {
hasWorldEditCUIML = true;
System.out.println("SPC/WECUI: WorldEditCUI ML is installed.");
} else {
hasWorldEditCUIML = false;
System.out.println("SPC/WECUI: WorldEditCUI ML not installed.");
}
llClass = ReflectionHelper.getClass("com.mumfrey.liteloader.core.LiteLoader");
if(llClass != null) {
hasLiteLoader = true;
System.out.println("SPC/WECUI: LiteLoader is installed.");
} else {
hasLiteLoader = false;
System.out.println("SPC/WECUI: LiteLoader not installed.");
}
Class<?> liteModClass = ReflectionHelper.getClass("wecui.LiteModWorldEditCUI");
if(liteModClass != null) {
hasWorldEditCUILL = true;
System.out.println("SPC/WECUI: WorldEditCUI LiteMod is installed.");
} else {
hasWorldEditCUILL = false;
System.out.println("SPC/WECUI: WorldEditCUI LiteMod not installed.");
}
}
}