package net.minecraftforge.fml.common.launcher;
import java.io.File;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import net.minecraft.launchwrapper.ITweaker;
import net.minecraft.launchwrapper.Launch;
import net.minecraft.launchwrapper.LaunchClassLoader;
import net.minecraftforge.fml.relauncher.FMLLaunchHandler;
import net.minecraftforge.fml.relauncher.FMLSecurityManager;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import com.google.common.base.Throwables;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
public class FMLTweaker implements ITweaker {
private File gameDir;
private Map<String, String> launchArgs;
private List<String> standaloneArgs;
private static URI jarLocation;
public FMLTweaker()
{
System.setProperty("java.net.preferIPv4Stack", "true"); //Lets do this as early as possible. Vanilla does it in Main.main
try
{
System.setSecurityManager(new FMLSecurityManager());
}
catch (SecurityException se)
{
throw new RuntimeException("FML was unable to install the security manager. The game will not start", se);
}
}
@SuppressWarnings("unchecked")
@Override
public void acceptOptions(List<String> args, File gameDir, File assetsDir, String profile)
{
this.gameDir = (gameDir == null ? new File(".") : gameDir);
this.launchArgs = (Map<String, String>)Launch.blackboard.get("launchArgs");
this.standaloneArgs = Lists.newArrayList();
if (this.launchArgs == null)
{
this.launchArgs = Maps.newHashMap();
Launch.blackboard.put("launchArgs", this.launchArgs);
}
String classifier = null;
for (String arg : args)
{
if (arg.startsWith("-"))
{
if (classifier != null)
{
classifier = launchArgs.put(classifier, "");
}
else if (arg.contains("="))
{
classifier = launchArgs.put(arg.substring(0, arg.indexOf('=')), arg.substring(arg.indexOf('=') + 1));
}
else
{
classifier = arg;
}
}
else
{
if (classifier != null)
{
classifier = launchArgs.put(classifier, arg);
}
else
{
this.standaloneArgs.add(arg);
}
}
}
if (!this.launchArgs.containsKey("--version"))
{
launchArgs.put("--version", profile != null ? profile : "UnknownFMLProfile");
}
if (!this.launchArgs.containsKey("--gameDir") && gameDir != null)
{
launchArgs.put("--gameDir", gameDir.getAbsolutePath());
}
if (!this.launchArgs.containsKey("--assetsDir") && assetsDir != null)
{
launchArgs.put("--assetsDir", assetsDir.getAbsolutePath());
}
Yggdrasil.login(launchArgs);
try
{
jarLocation = getClass().getProtectionDomain().getCodeSource().getLocation().toURI();
}
catch (URISyntaxException e)
{
LogManager.getLogger("FMLTWEAK").log(Level.ERROR, "Missing URI information for FML tweak");
throw Throwables.propagate(e);
}
}
@Override
public void injectIntoClassLoader(LaunchClassLoader classLoader)
{
classLoader.addClassLoaderExclusion("org.apache.");
classLoader.addClassLoaderExclusion("com.google.common.");
classLoader.addClassLoaderExclusion("org.objectweb.asm.");
classLoader.addTransformerExclusion("net.minecraftforge.fml.repackage.");
classLoader.addTransformerExclusion("net.minecraftforge.fml.relauncher.");
classLoader.addTransformerExclusion("net.minecraftforge.fml.common.asm.transformers.");
classLoader.addClassLoaderExclusion("LZMA.");
FMLLaunchHandler.configureForClientLaunch(classLoader, this);
FMLLaunchHandler.appendCoreMods();
}
@Override
public String getLaunchTarget()
{
// Remove the extraneous mods and modListFile args
@SuppressWarnings("unchecked")
Map<String,String> args = (Map<String, String>) Launch.blackboard.get("launchArgs");
args.remove("--modListFile");
args.remove("--mods");
return "net.minecraft.client.main.Main";
}
@Override
public String[] getLaunchArguments()
{
List<String> args = Lists.newArrayList();
args.addAll(standaloneArgs);
for (Entry<String, String> arg : launchArgs.entrySet())
{
args.add(arg.getKey());
args.add(arg.getValue());
}
launchArgs.clear();
return args.toArray(new String[args.size()]);
}
public File getGameDir()
{
return gameDir;
}
public static URI getJarLocation()
{
return jarLocation;
}
public void injectCascadingTweak(String tweakClassName)
{
@SuppressWarnings("unchecked")
List<String> tweakClasses = (List<String>) Launch.blackboard.get("TweakClasses");
tweakClasses.add(tweakClassName);
}
}