package net.minecraftforkage.instsetup.launcher_stub; import java.io.File; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; import java.util.Arrays; import net.minecraftforkage.instsetup.InstallationArguments; import net.minecraftforkage.instsetup.SetupEntryPoint; class EntryPointFromLauncher { public static void main(String[] args) throws Exception { File gameDir = null; for(int k = 0; k < args.length - 1; k++) if(args[k].equals("--gameDir")) gameDir = new File(args[k+1]); if(gameDir == null) throw new RuntimeException("No --gameDir argument found! Arguments from launcher: " + printableLauncherArgs(args)); System.out.println("Arguments from launcher: " + printableLauncherArgs(args)); // Minecraft launcher has no way to specify additional program arguments, but we can specify JVM arguments, including -D if(!Boolean.getBoolean("minecraftforkage.launcherstub.noInstanceSetup")) { InstallationArguments instArgs = new InstallationArguments(); instArgs.instanceBaseDir = gameDir; instArgs.isInstallerRunningFromLauncher = true; instArgs.coreLocation = findCoreLocation(); SetupEntryPoint.setupInstance(instArgs); } SetupEntryPoint.runInstance(gameDir, args, SetupEntryPoint.findLibrariesFromClasspath()); } private static String printableLauncherArgs(String[] args) { String[] copy = Arrays.copyOf(args, args.length); for(int k = 0; k < args.length - 1; k++) { // Note: we check args, and edit copy. // That means that e.g. [--someflag, --accessToken, --accessToken, 1234567] // will become [--someflag, --accessToken, REDACTED, REDACTED] // and not [--someflag, --accessToken, REDACTED, 1234567] // which could allow someone to leak the access token by passing crafted arguments before it. if(args[k].equals("--accessToken") || args[k].equals("--gameDir")) copy[k+1] = "REDACTED"; } return Arrays.toString(copy); } private static URL findCoreLocation() { URL launcherStubURL = null; for(URL url : ((URLClassLoader)EntryPointFromLauncher.class.getClassLoader()).getURLs()) { if(!url.getProtocol().equals("file")) { continue; } String[] path = url.getPath().split("/"); if(path.length == 0) { continue; } String lastSegment = path[path.length - 1]; if(lastSegment.startsWith("MCForkage-")) launcherStubURL = url; } System.out.println("Launcher stub was loaded from: " + launcherStubURL); String s = launcherStubURL.toString(); if(s.contains(".")) s = s.substring(0, s.lastIndexOf('.'))+"-core"+s.substring(s.lastIndexOf('.')); else s = s + "-core"; try { return new URL(s); } catch(MalformedURLException e) { throw new RuntimeException(e); } } }