mirror of
https://github.com/SKCraft/Launcher.git
synced 2025-02-02 23:31:21 +01:00
Refactor loader processing into subclasses for greater flexibility
This commit is contained in:
parent
8b6f3abaf9
commit
aeedf09f8c
@ -7,8 +7,10 @@
|
|||||||
package com.skcraft.launcher.builder;
|
package com.skcraft.launcher.builder;
|
||||||
|
|
||||||
import com.beust.jcommander.internal.Lists;
|
import com.beust.jcommander.internal.Lists;
|
||||||
|
import com.google.common.io.CharStreams;
|
||||||
import org.apache.commons.compress.compressors.CompressorStreamFactory;
|
import org.apache.commons.compress.compressors.CompressorStreamFactory;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
import java.text.DateFormat;
|
import java.text.DateFormat;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
@ -41,6 +43,13 @@ public final class BuilderUtils {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static String readStringFromStream(Readable r) throws IOException {
|
||||||
|
String data = CharStreams.toString(r);
|
||||||
|
data = data.replaceAll(",\\s*\\}", "}"); // Fix issues with trailing commas
|
||||||
|
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
public static List<Compressor> getCompressors(String repoUrl) {
|
public static List<Compressor> getCompressors(String repoUrl) {
|
||||||
if (repoUrl.matches("^https?://files.minecraftforge.net/maven/?")) {
|
if (repoUrl.matches("^https?://files.minecraftforge.net/maven/?")) {
|
||||||
return Lists.newArrayList(
|
return Lists.newArrayList(
|
||||||
|
@ -15,20 +15,21 @@ import com.fasterxml.jackson.databind.ObjectWriter;
|
|||||||
import com.google.common.collect.Iterables;
|
import com.google.common.collect.Iterables;
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import com.google.common.io.ByteStreams;
|
import com.google.common.io.ByteStreams;
|
||||||
import com.google.common.io.CharStreams;
|
|
||||||
import com.google.common.io.Closer;
|
import com.google.common.io.Closer;
|
||||||
import com.google.common.io.Files;
|
import com.google.common.io.Files;
|
||||||
import com.skcraft.launcher.Launcher;
|
import com.skcraft.launcher.Launcher;
|
||||||
import com.skcraft.launcher.LauncherUtils;
|
import com.skcraft.launcher.LauncherUtils;
|
||||||
import com.skcraft.launcher.model.loader.InstallProfile;
|
import com.skcraft.launcher.builder.loaders.ILoaderProcessor;
|
||||||
import com.skcraft.launcher.model.loader.LoaderManifest;
|
import com.skcraft.launcher.builder.loaders.LoaderResult;
|
||||||
import com.skcraft.launcher.model.loader.SidedData;
|
import com.skcraft.launcher.builder.loaders.ModernForgeLoaderProcessor;
|
||||||
import com.skcraft.launcher.model.loader.VersionInfo;
|
import com.skcraft.launcher.builder.loaders.OldForgeLoaderProcessor;
|
||||||
import com.skcraft.launcher.model.minecraft.*;
|
import com.skcraft.launcher.model.loader.BasicInstallProfile;
|
||||||
import com.skcraft.launcher.model.modpack.DownloadableFile;
|
import com.skcraft.launcher.model.minecraft.Library;
|
||||||
|
import com.skcraft.launcher.model.minecraft.ReleaseList;
|
||||||
|
import com.skcraft.launcher.model.minecraft.Version;
|
||||||
|
import com.skcraft.launcher.model.minecraft.VersionManifest;
|
||||||
import com.skcraft.launcher.model.modpack.Manifest;
|
import com.skcraft.launcher.model.modpack.Manifest;
|
||||||
import com.skcraft.launcher.util.Environment;
|
import com.skcraft.launcher.util.Environment;
|
||||||
import com.skcraft.launcher.util.FileUtils;
|
|
||||||
import com.skcraft.launcher.util.HttpRequest;
|
import com.skcraft.launcher.util.HttpRequest;
|
||||||
import com.skcraft.launcher.util.SimpleLogFormatter;
|
import com.skcraft.launcher.util.SimpleLogFormatter;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
@ -153,107 +154,39 @@ public class PackageBuilder {
|
|||||||
|
|
||||||
JarFile jarFile = new JarFile(file);
|
JarFile jarFile = new JarFile(file);
|
||||||
Closer closer = Closer.create();
|
Closer closer = Closer.create();
|
||||||
|
ILoaderProcessor processor = null;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
ZipEntry manifestEntry = BuilderUtils.getZipEntry(jarFile, "version.json");
|
|
||||||
String loaderName = file.getName();
|
|
||||||
|
|
||||||
if (manifestEntry != null) {
|
|
||||||
InputStream stream = jarFile.getInputStream(manifestEntry);
|
|
||||||
|
|
||||||
// Read file
|
|
||||||
String data = CharStreams.toString(closer.register(new InputStreamReader(stream)));
|
|
||||||
data = data.replaceAll(",\\s*\\}", "}"); // Fix issues with trailing commas
|
|
||||||
|
|
||||||
VersionInfo info = mapper.readValue(data, VersionInfo.class);
|
|
||||||
VersionManifest version = manifest.getVersionManifest();
|
|
||||||
|
|
||||||
if (version.getId() != null) {
|
|
||||||
loaderName = version.getId();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Copy tweak class arguments
|
|
||||||
List<GameArgument> gameArguments = info.getMinecraftArguments().getGameArguments();
|
|
||||||
if (gameArguments != null) {
|
|
||||||
version.getArguments().getGameArguments().addAll(gameArguments);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add libraries
|
|
||||||
List<Library> libraries = info.getLibraries();
|
|
||||||
if (libraries != null) {
|
|
||||||
for (Library library : libraries) {
|
|
||||||
loaderLibraries.add(library);
|
|
||||||
log.info("Adding loader library " + library.getName());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Copy main class
|
|
||||||
String mainClass = info.getMainClass();
|
|
||||||
if (mainClass != null) {
|
|
||||||
version.setMainClass(mainClass);
|
|
||||||
log.info("Using " + mainClass + " as the main class");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
log.warning("The file at " + file.getAbsolutePath() + " did not appear to have an " +
|
|
||||||
"version.json file inside -- is it actually an installer for a mod loader?");
|
|
||||||
}
|
|
||||||
|
|
||||||
ZipEntry profileEntry = BuilderUtils.getZipEntry(jarFile, "install_profile.json");
|
ZipEntry profileEntry = BuilderUtils.getZipEntry(jarFile, "install_profile.json");
|
||||||
|
|
||||||
if (profileEntry != null) {
|
if (profileEntry != null) {
|
||||||
InputStream stream = jarFile.getInputStream(profileEntry);
|
InputStream stream = jarFile.getInputStream(profileEntry);
|
||||||
String data = CharStreams.toString(closer.register(new InputStreamReader(stream)));
|
InputStreamReader reader = closer.register(new InputStreamReader(stream));
|
||||||
data = data.replace(",\\s*\\}", "}");
|
|
||||||
|
|
||||||
InstallProfile profile = mapper.readValue(data, InstallProfile.class);
|
BasicInstallProfile basicProfile = mapper.readValue(BuilderUtils.readStringFromStream(reader),
|
||||||
|
BasicInstallProfile.class);
|
||||||
|
String profileName = basicProfile.resolveProfileName();
|
||||||
|
|
||||||
// Import the libraries for the installer
|
if (profileName.equalsIgnoreCase("forge")) {
|
||||||
installerLibraries.addAll(profile.getLibraries());
|
if (basicProfile.isLegacy()) {
|
||||||
|
processor = new OldForgeLoaderProcessor();
|
||||||
// Extract the data files
|
} else {
|
||||||
List<DownloadableFile> extraFiles = Lists.newArrayList();
|
processor = new ModernForgeLoaderProcessor();
|
||||||
ZipEntry clientBinpatch = BuilderUtils.getZipEntry(jarFile, "data/client.lzma");
|
|
||||||
if (clientBinpatch != null) {
|
|
||||||
DownloadableFile entry = FileUtils.saveStreamToObjectsDir(
|
|
||||||
closer.register(jarFile.getInputStream(clientBinpatch)),
|
|
||||||
new File(baseDir, manifest.getObjectsLocation()));
|
|
||||||
|
|
||||||
entry.setName("client.lzma");
|
|
||||||
entry.setSide(Side.CLIENT);
|
|
||||||
extraFiles.add(entry);
|
|
||||||
profile.getData().get("BINPATCH").setClient("&" + entry.getName() + "&");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ZipEntry serverBinpatch = BuilderUtils.getZipEntry(jarFile, "data/server.lzma");
|
|
||||||
if (serverBinpatch != null) {
|
|
||||||
DownloadableFile entry = FileUtils.saveStreamToObjectsDir(
|
|
||||||
closer.register(jarFile.getInputStream(serverBinpatch)),
|
|
||||||
new File(baseDir, manifest.getObjectsLocation()));
|
|
||||||
|
|
||||||
entry.setName("server.lzma");
|
|
||||||
entry.setSide(Side.SERVER);
|
|
||||||
extraFiles.add(entry);
|
|
||||||
profile.getData().get("BINPATCH").setServer("&" + entry.getName() + "&");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add extra sided data
|
|
||||||
profile.getData().put("SIDE", SidedData.create("client", "server"));
|
|
||||||
|
|
||||||
// Add loader manifest to the map
|
|
||||||
manifest.getLoaders().put(loaderName, new LoaderManifest(profile.getLibraries(), profile.getData(), extraFiles));
|
|
||||||
|
|
||||||
// Add processors
|
|
||||||
manifest.getTasks().addAll(profile.toProcessorEntries(loaderName));
|
|
||||||
}
|
|
||||||
|
|
||||||
ZipEntry mavenEntry = BuilderUtils.getZipEntry(jarFile, "maven/");
|
|
||||||
if (mavenEntry != null) {
|
|
||||||
URL jarUrl = new URL("jar:file:" + file.getAbsolutePath() + "!/");
|
|
||||||
jarMavens.add(new URL(jarUrl, "/maven/"));
|
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
closer.close();
|
closer.close();
|
||||||
jarFile.close();
|
jarFile.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (processor != null) {
|
||||||
|
LoaderResult result = processor.process(file, manifest, mapper, baseDir);
|
||||||
|
|
||||||
|
loaderLibraries.addAll(result.getLoaderLibraries());
|
||||||
|
installerLibraries.addAll(result.getProcessorLibraries());
|
||||||
|
jarMavens.addAll(result.getJarMavens());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void downloadLibraries(File librariesDir) throws IOException, InterruptedException {
|
public void downloadLibraries(File librariesDir) throws IOException, InterruptedException {
|
||||||
|
@ -0,0 +1,11 @@
|
|||||||
|
package com.skcraft.launcher.builder.loaders;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
import com.skcraft.launcher.model.modpack.Manifest;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
public interface ILoaderProcessor {
|
||||||
|
LoaderResult process(File loaderJar, Manifest manifest, ObjectMapper mapper, File baseDir) throws IOException;
|
||||||
|
}
|
@ -0,0 +1,15 @@
|
|||||||
|
package com.skcraft.launcher.builder.loaders;
|
||||||
|
|
||||||
|
import com.google.common.collect.Lists;
|
||||||
|
import com.skcraft.launcher.model.minecraft.Library;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.net.URL;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class LoaderResult {
|
||||||
|
private final List<Library> loaderLibraries = Lists.newArrayList();
|
||||||
|
private final List<Library> processorLibraries = Lists.newArrayList();
|
||||||
|
private final List<URL> jarMavens = Lists.newArrayList();
|
||||||
|
}
|
@ -0,0 +1,139 @@
|
|||||||
|
package com.skcraft.launcher.builder.loaders;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
import com.google.common.collect.Lists;
|
||||||
|
import com.google.common.io.CharStreams;
|
||||||
|
import com.google.common.io.Closer;
|
||||||
|
import com.skcraft.launcher.builder.BuilderUtils;
|
||||||
|
import com.skcraft.launcher.model.loader.LoaderManifest;
|
||||||
|
import com.skcraft.launcher.model.loader.SidedData;
|
||||||
|
import com.skcraft.launcher.model.loader.VersionInfo;
|
||||||
|
import com.skcraft.launcher.model.loader.profiles.ModernForgeInstallProfile;
|
||||||
|
import com.skcraft.launcher.model.minecraft.GameArgument;
|
||||||
|
import com.skcraft.launcher.model.minecraft.Library;
|
||||||
|
import com.skcraft.launcher.model.minecraft.Side;
|
||||||
|
import com.skcraft.launcher.model.minecraft.VersionManifest;
|
||||||
|
import com.skcraft.launcher.model.modpack.DownloadableFile;
|
||||||
|
import com.skcraft.launcher.model.modpack.Manifest;
|
||||||
|
import com.skcraft.launcher.util.FileUtils;
|
||||||
|
import lombok.extern.java.Log;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.jar.JarFile;
|
||||||
|
import java.util.zip.ZipEntry;
|
||||||
|
|
||||||
|
@Log
|
||||||
|
public class ModernForgeLoaderProcessor implements ILoaderProcessor {
|
||||||
|
@Override
|
||||||
|
public LoaderResult process(File loaderJar, Manifest manifest, ObjectMapper mapper, File baseDir) throws IOException {
|
||||||
|
JarFile jarFile = new JarFile(loaderJar);
|
||||||
|
Closer closer = Closer.create();
|
||||||
|
LoaderResult result = new LoaderResult();
|
||||||
|
|
||||||
|
try {
|
||||||
|
ZipEntry versionEntry = BuilderUtils.getZipEntry(jarFile, "version.json");
|
||||||
|
String loaderName = jarFile.getName();
|
||||||
|
|
||||||
|
if (versionEntry != null) {
|
||||||
|
InputStream stream = jarFile.getInputStream(versionEntry);
|
||||||
|
|
||||||
|
VersionInfo info = mapper.readValue(
|
||||||
|
BuilderUtils.readStringFromStream(closer.register(new InputStreamReader(stream))),
|
||||||
|
VersionInfo.class);
|
||||||
|
VersionManifest version = manifest.getVersionManifest();
|
||||||
|
|
||||||
|
if (version.getId() != null) {
|
||||||
|
loaderName = version.getId();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy tweak class arguments
|
||||||
|
List<GameArgument> gameArguments = info.getMinecraftArguments().getGameArguments();
|
||||||
|
if (gameArguments != null) {
|
||||||
|
version.getArguments().getGameArguments().addAll(gameArguments);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add libraries
|
||||||
|
List<Library> libraries = info.getLibraries();
|
||||||
|
if (libraries != null) {
|
||||||
|
for (Library library : libraries) {
|
||||||
|
result.getLoaderLibraries().add(library);
|
||||||
|
log.info("Adding loader library " + library.getName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy main class
|
||||||
|
String mainClass = info.getMainClass();
|
||||||
|
if (mainClass != null) {
|
||||||
|
version.setMainClass(mainClass);
|
||||||
|
log.info("Using " + mainClass + " as the main class");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
log.warning("The loader " + loaderJar.getAbsolutePath() + " does not appear to have a " +
|
||||||
|
"version.json file inside -- is it actually an installer for Forge?");
|
||||||
|
}
|
||||||
|
|
||||||
|
ZipEntry profileEntry = BuilderUtils.getZipEntry(jarFile, "install_profile.json");
|
||||||
|
if (profileEntry != null) {
|
||||||
|
InputStream stream = jarFile.getInputStream(profileEntry);
|
||||||
|
String data = CharStreams.toString(closer.register(new InputStreamReader(stream)));
|
||||||
|
data = data.replace(",\\s*\\}", "}");
|
||||||
|
|
||||||
|
ModernForgeInstallProfile profile = mapper.readValue(data, ModernForgeInstallProfile.class);
|
||||||
|
|
||||||
|
// Import the libraries for the installer
|
||||||
|
result.getProcessorLibraries().addAll(profile.getLibraries());
|
||||||
|
|
||||||
|
// Extract the data files
|
||||||
|
List<DownloadableFile> extraFiles = Lists.newArrayList();
|
||||||
|
ZipEntry clientBinpatch = BuilderUtils.getZipEntry(jarFile, "data/client.lzma");
|
||||||
|
if (clientBinpatch != null) {
|
||||||
|
DownloadableFile entry = FileUtils.saveStreamToObjectsDir(
|
||||||
|
closer.register(jarFile.getInputStream(clientBinpatch)),
|
||||||
|
new File(baseDir, manifest.getObjectsLocation()));
|
||||||
|
|
||||||
|
entry.setName("client.lzma");
|
||||||
|
entry.setSide(Side.CLIENT);
|
||||||
|
extraFiles.add(entry);
|
||||||
|
profile.getData().get("BINPATCH").setClient("&" + entry.getName() + "&");
|
||||||
|
}
|
||||||
|
|
||||||
|
ZipEntry serverBinpatch = BuilderUtils.getZipEntry(jarFile, "data/server.lzma");
|
||||||
|
if (serverBinpatch != null) {
|
||||||
|
DownloadableFile entry = FileUtils.saveStreamToObjectsDir(
|
||||||
|
closer.register(jarFile.getInputStream(serverBinpatch)),
|
||||||
|
new File(baseDir, manifest.getObjectsLocation()));
|
||||||
|
|
||||||
|
entry.setName("server.lzma");
|
||||||
|
entry.setSide(Side.SERVER);
|
||||||
|
extraFiles.add(entry);
|
||||||
|
profile.getData().get("BINPATCH").setServer("&" + entry.getName() + "&");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add extra sided data
|
||||||
|
profile.getData().put("SIDE", SidedData.create("client", "server"));
|
||||||
|
|
||||||
|
// Add loader manifest to the map
|
||||||
|
manifest.getLoaders().put(loaderName, new LoaderManifest(profile.getLibraries(), profile.getData(), extraFiles));
|
||||||
|
|
||||||
|
// Add processors
|
||||||
|
manifest.getTasks().addAll(profile.toProcessorEntries(loaderName));
|
||||||
|
}
|
||||||
|
|
||||||
|
ZipEntry mavenEntry = BuilderUtils.getZipEntry(jarFile, "maven/");
|
||||||
|
if (mavenEntry != null) {
|
||||||
|
URL jarUrl = new URL("jar:file:" + loaderJar.getAbsolutePath() + "!/");
|
||||||
|
result.getJarMavens().add(new URL(jarUrl, "/maven/"));
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
closer.close();
|
||||||
|
jarFile.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,116 @@
|
|||||||
|
package com.skcraft.launcher.builder.loaders;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
import com.google.common.collect.Lists;
|
||||||
|
import com.google.common.io.ByteStreams;
|
||||||
|
import com.google.common.io.Closer;
|
||||||
|
import com.google.common.io.Files;
|
||||||
|
import com.skcraft.launcher.builder.BuilderUtils;
|
||||||
|
import com.skcraft.launcher.model.loader.profiles.LegacyInstallProfile;
|
||||||
|
import com.skcraft.launcher.model.minecraft.GameArgument;
|
||||||
|
import com.skcraft.launcher.model.minecraft.Library;
|
||||||
|
import com.skcraft.launcher.model.minecraft.MinecraftArguments;
|
||||||
|
import com.skcraft.launcher.model.minecraft.VersionManifest;
|
||||||
|
import com.skcraft.launcher.model.modpack.Manifest;
|
||||||
|
import com.skcraft.launcher.util.Environment;
|
||||||
|
import lombok.extern.java.Log;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.jar.JarFile;
|
||||||
|
import java.util.zip.ZipEntry;
|
||||||
|
|
||||||
|
@Log
|
||||||
|
public class OldForgeLoaderProcessor implements ILoaderProcessor {
|
||||||
|
@Override
|
||||||
|
public LoaderResult process(File loaderJar, Manifest manifest, ObjectMapper mapper, File baseDir) throws IOException {
|
||||||
|
JarFile jarFile = new JarFile(loaderJar);
|
||||||
|
LoaderResult result = new LoaderResult();
|
||||||
|
Closer closer = Closer.create();
|
||||||
|
|
||||||
|
try {
|
||||||
|
ZipEntry profileEntry = BuilderUtils.getZipEntry(jarFile, "install_profile.json");
|
||||||
|
|
||||||
|
if (profileEntry != null) {
|
||||||
|
InputStream stream = jarFile.getInputStream(profileEntry);
|
||||||
|
|
||||||
|
// Read file
|
||||||
|
String data = BuilderUtils.readStringFromStream(closer.register(new InputStreamReader(stream)));
|
||||||
|
LegacyInstallProfile profile = mapper.readValue(data, LegacyInstallProfile.class);
|
||||||
|
VersionManifest version = manifest.getVersionManifest();
|
||||||
|
|
||||||
|
// Copy tweak class arguments
|
||||||
|
MinecraftArguments args = profile.getVersionInfo().getMinecraftArguments();
|
||||||
|
if (args != null) {
|
||||||
|
Iterator<GameArgument> iter = args.getGameArguments().iterator();
|
||||||
|
while (iter.hasNext()) {
|
||||||
|
GameArgument cur = iter.next();
|
||||||
|
if (cur.getValues().contains("--tweakClass")) {
|
||||||
|
String tweakClass = cur.getValues().size() > 1
|
||||||
|
? cur.getValues().get(1)
|
||||||
|
: iter.next().getJoinedValue();
|
||||||
|
|
||||||
|
GameArgument tweakArg = new GameArgument(Lists.newArrayList("--tweakClass", tweakClass));
|
||||||
|
manifest.getVersionManifest().getArguments().getGameArguments().add(tweakArg);
|
||||||
|
|
||||||
|
log.info(String.format("Adding tweak class '%s' to arguments", tweakClass));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add libraries
|
||||||
|
List<Library> libraries = profile.getVersionInfo().getLibraries();
|
||||||
|
if (libraries != null) {
|
||||||
|
for (Library library : libraries) {
|
||||||
|
if (!version.getLibraries().contains(library)) {
|
||||||
|
result.getLoaderLibraries().add(library);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy main class
|
||||||
|
String mainClass = profile.getVersionInfo().getMainClass();
|
||||||
|
if (mainClass != null) {
|
||||||
|
version.setMainClass(mainClass);
|
||||||
|
log.info("Using " + mainClass + " as the main class");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Extract the library
|
||||||
|
String filePath = profile.getInstallData().getFilePath();
|
||||||
|
String libraryPath = profile.getInstallData().getPath();
|
||||||
|
|
||||||
|
if (filePath != null && libraryPath != null) {
|
||||||
|
ZipEntry libraryEntry = BuilderUtils.getZipEntry(jarFile, filePath);
|
||||||
|
|
||||||
|
if (libraryEntry != null) {
|
||||||
|
Library library = new Library();
|
||||||
|
library.setName(libraryPath);
|
||||||
|
|
||||||
|
File librariesDir = new File(baseDir, manifest.getLibrariesLocation());
|
||||||
|
File extractPath = new File(librariesDir, library.getPath(Environment.getInstance()));
|
||||||
|
|
||||||
|
Files.createParentDirs(extractPath);
|
||||||
|
ByteStreams.copy(closer.register(jarFile.getInputStream(libraryEntry)),
|
||||||
|
Files.newOutputStreamSupplier(extractPath));
|
||||||
|
} else {
|
||||||
|
log.warning("Could not find the file '" + filePath + "' in "
|
||||||
|
+ loaderJar.getAbsolutePath()
|
||||||
|
+ ", which means that this mod loader will not work correctly");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
log.warning("The file at " + loaderJar.getAbsolutePath() + " did not appear to have an " +
|
||||||
|
"install_profile.json file inside -- is it actually an installer for a mod loader?");
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
closer.close();
|
||||||
|
jarFile.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,34 @@
|
|||||||
|
package com.skcraft.launcher.model.loader;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||||
|
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@JsonIgnoreProperties(ignoreUnknown = true)
|
||||||
|
public class BasicInstallProfile {
|
||||||
|
private String profile;
|
||||||
|
private int spec;
|
||||||
|
|
||||||
|
@JsonProperty("install")
|
||||||
|
private Legacy legacyProfile;
|
||||||
|
|
||||||
|
@JsonIgnore
|
||||||
|
public boolean isLegacy() {
|
||||||
|
return getLegacyProfile() != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String resolveProfileName() {
|
||||||
|
if (isLegacy()) {
|
||||||
|
return getLegacyProfile().getProfileName();
|
||||||
|
} else {
|
||||||
|
return getProfile();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public static class Legacy {
|
||||||
|
private String profileName;
|
||||||
|
}
|
||||||
|
}
|
@ -1,19 +0,0 @@
|
|||||||
/*
|
|
||||||
* SK's Minecraft Launcher
|
|
||||||
* Copyright (C) 2010-2014 Albert Pham <http://www.sk89q.com> and contributors
|
|
||||||
* Please see LICENSE.txt for license information.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.skcraft.launcher.model.loader;
|
|
||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
|
||||||
import lombok.Data;
|
|
||||||
|
|
||||||
@Data
|
|
||||||
@JsonIgnoreProperties(ignoreUnknown = true)
|
|
||||||
public class InstallData {
|
|
||||||
|
|
||||||
private String path;
|
|
||||||
private String filePath;
|
|
||||||
|
|
||||||
}
|
|
@ -8,10 +8,13 @@ package com.skcraft.launcher.model.loader;
|
|||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
||||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
|
import com.google.common.base.Splitter;
|
||||||
|
import com.skcraft.launcher.model.minecraft.GameArgument;
|
||||||
import com.skcraft.launcher.model.minecraft.Library;
|
import com.skcraft.launcher.model.minecraft.Library;
|
||||||
import com.skcraft.launcher.model.minecraft.MinecraftArguments;
|
import com.skcraft.launcher.model.minecraft.MinecraftArguments;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
@ -23,4 +26,18 @@ public class VersionInfo {
|
|||||||
private String mainClass;
|
private String mainClass;
|
||||||
private List<Library> libraries;
|
private List<Library> libraries;
|
||||||
|
|
||||||
|
public void setMinecraftArguments(MinecraftArguments arguments) {
|
||||||
|
this.minecraftArguments = arguments;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMinecraftArguments(String argumentString) {
|
||||||
|
MinecraftArguments minecraftArguments = new MinecraftArguments();
|
||||||
|
minecraftArguments.setGameArguments(new ArrayList<GameArgument>());
|
||||||
|
|
||||||
|
for (String arg : Splitter.on(' ').split(argumentString)) {
|
||||||
|
minecraftArguments.getGameArguments().add(new GameArgument(arg));
|
||||||
|
}
|
||||||
|
|
||||||
|
setMinecraftArguments(minecraftArguments);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,21 @@
|
|||||||
|
package com.skcraft.launcher.model.loader.profiles;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
|
import com.skcraft.launcher.model.loader.VersionInfo;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@JsonIgnoreProperties(ignoreUnknown = true)
|
||||||
|
public class LegacyInstallProfile {
|
||||||
|
@JsonProperty("install")
|
||||||
|
private InstallData installData;
|
||||||
|
private VersionInfo versionInfo;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@JsonIgnoreProperties(ignoreUnknown = true)
|
||||||
|
public static class InstallData {
|
||||||
|
private String path;
|
||||||
|
private String filePath;
|
||||||
|
}
|
||||||
|
}
|
@ -4,11 +4,14 @@
|
|||||||
* Please see LICENSE.txt for license information.
|
* Please see LICENSE.txt for license information.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package com.skcraft.launcher.model.loader;
|
package com.skcraft.launcher.model.loader.profiles;
|
||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
||||||
import com.google.common.base.Function;
|
import com.google.common.base.Function;
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
|
import com.skcraft.launcher.model.loader.InstallProcessor;
|
||||||
|
import com.skcraft.launcher.model.loader.ProcessorEntry;
|
||||||
|
import com.skcraft.launcher.model.loader.SidedData;
|
||||||
import com.skcraft.launcher.model.minecraft.Library;
|
import com.skcraft.launcher.model.minecraft.Library;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
@ -17,7 +20,7 @@ import java.util.Map;
|
|||||||
|
|
||||||
@Data
|
@Data
|
||||||
@JsonIgnoreProperties(ignoreUnknown = true)
|
@JsonIgnoreProperties(ignoreUnknown = true)
|
||||||
public class InstallProfile {
|
public class ModernForgeInstallProfile {
|
||||||
private List<Library> libraries;
|
private List<Library> libraries;
|
||||||
private List<InstallProcessor> processors;
|
private List<InstallProcessor> processors;
|
||||||
private Map<String, SidedData> data;
|
private Map<String, SidedData> data;
|
@ -11,10 +11,7 @@ import com.fasterxml.jackson.annotation.JsonProperty;
|
|||||||
import com.google.common.base.Splitter;
|
import com.google.common.base.Splitter;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
import java.util.Date;
|
import java.util.*;
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.LinkedHashSet;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
@JsonIgnoreProperties(ignoreUnknown = true)
|
@JsonIgnoreProperties(ignoreUnknown = true)
|
||||||
@ -49,10 +46,16 @@ public class VersionManifest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void setMinecraftArguments(String minecraftArguments) {
|
public void setMinecraftArguments(String minecraftArguments) {
|
||||||
|
MinecraftArguments result = new MinecraftArguments();
|
||||||
|
result.setGameArguments(new ArrayList<GameArgument>());
|
||||||
|
result.setJvmArguments(new ArrayList<GameArgument>());
|
||||||
|
|
||||||
for (String arg : Splitter.on(' ').split(minecraftArguments)) {
|
for (String arg : Splitter.on(' ').split(minecraftArguments)) {
|
||||||
this.arguments.getGameArguments().add(new GameArgument(arg));
|
result.getGameArguments().add(new GameArgument(arg));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setArguments(result);
|
||||||
|
|
||||||
// TODO: Possibly do some cheaty side-effects here to add parameters missing from early game versions.
|
// TODO: Possibly do some cheaty side-effects here to add parameters missing from early game versions.
|
||||||
// Either that or use a proper version adapter.
|
// Either that or use a proper version adapter.
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user