diff --git a/launcher-builder/src/main/java/com/skcraft/launcher/builder/PackageBuilder.java b/launcher-builder/src/main/java/com/skcraft/launcher/builder/PackageBuilder.java index 9981a17..9b693ce 100644 --- a/launcher-builder/src/main/java/com/skcraft/launcher/builder/PackageBuilder.java +++ b/launcher-builder/src/main/java/com/skcraft/launcher/builder/PackageBuilder.java @@ -125,7 +125,8 @@ public void addLoaders(File dir, File librariesDir) { logSection("Checking for mod loaders to install..."); - LinkedHashSet collected = new LinkedHashSet(); + VersionManifest version = manifest.getVersionManifest(); + LinkedHashSet collected = new LinkedHashSet<>(); File[] files = dir.listFiles(new JarFileFilter()); if (files != null) { @@ -140,7 +141,6 @@ this.loaderLibraries.addAll(collected); - VersionManifest version = manifest.getVersionManifest(); collected.addAll(version.getLibraries()); version.setLibraries(collected); } diff --git a/launcher-builder/src/main/java/com/skcraft/launcher/builder/loaders/FabricLoaderProcessor.java b/launcher-builder/src/main/java/com/skcraft/launcher/builder/loaders/FabricLoaderProcessor.java index f3362a6..59b1baa 100644 --- a/launcher-builder/src/main/java/com/skcraft/launcher/builder/loaders/FabricLoaderProcessor.java +++ b/launcher-builder/src/main/java/com/skcraft/launcher/builder/loaders/FabricLoaderProcessor.java @@ -7,6 +7,7 @@ import com.skcraft.launcher.model.loader.QuiltMod; import com.skcraft.launcher.model.loader.Versionable; import com.skcraft.launcher.model.minecraft.Library; +import com.skcraft.launcher.model.minecraft.MavenName; import com.skcraft.launcher.model.minecraft.VersionManifest; import com.skcraft.launcher.model.modpack.Manifest; import com.skcraft.launcher.util.HttpRequest; @@ -66,7 +67,8 @@ // a hack that replaced hashed with intermediary! This is a lot of technical debt that is gonna come // back to bite them in the ass later, because it's all still there! // TODO pester Quilt again about fixing this.... - if (library.getName().startsWith("org.quiltmc:hashed") && loaderMod instanceof QuiltMod) { + MavenName libraryName = library.getName(); + if (libraryName.getGroup().equals("org.quiltmc") && libraryName.getPath().equals("hashed") && loaderMod instanceof QuiltMod) { continue; } diff --git a/launcher-builder/src/main/java/com/skcraft/launcher/builder/loaders/OldForgeLoaderProcessor.java b/launcher-builder/src/main/java/com/skcraft/launcher/builder/loaders/OldForgeLoaderProcessor.java index c5e970d..c5c9759 100644 --- a/launcher-builder/src/main/java/com/skcraft/launcher/builder/loaders/OldForgeLoaderProcessor.java +++ b/launcher-builder/src/main/java/com/skcraft/launcher/builder/loaders/OldForgeLoaderProcessor.java @@ -6,10 +6,7 @@ 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.minecraft.*; import com.skcraft.launcher.model.modpack.Manifest; import lombok.extern.java.Log; @@ -64,11 +61,7 @@ // Add libraries List libraries = profile.getVersionInfo().getLibraries(); if (libraries != null) { - for (Library library : libraries) { - if (!version.getLibraries().contains(library)) { - result.getLoaderLibraries().add(library); - } - } + result.getLoaderLibraries().addAll(libraries); } // Copy main class @@ -87,7 +80,7 @@ if (libraryEntry != null) { File librariesDir = new File(baseDir, "libraries"); - File extractPath = new File(librariesDir, Library.mavenNameToPath(libraryPath)); + File extractPath = new File(librariesDir, MavenName.from(libraryPath).getFilePath()); Files.createParentDirs(extractPath); ByteStreams.copy(closer.register(jarFile.getInputStream(libraryEntry)), diff --git a/launcher/src/main/java/com/skcraft/launcher/model/loader/LoaderSubResolver.java b/launcher/src/main/java/com/skcraft/launcher/model/loader/LoaderSubResolver.java index 9042daa..ab25cbd 100644 --- a/launcher/src/main/java/com/skcraft/launcher/model/loader/LoaderSubResolver.java +++ b/launcher/src/main/java/com/skcraft/launcher/model/loader/LoaderSubResolver.java @@ -2,6 +2,7 @@ import com.google.common.base.Function; import com.skcraft.launcher.model.minecraft.Library; +import com.skcraft.launcher.model.minecraft.MavenName; import com.skcraft.launcher.model.minecraft.Side; import com.skcraft.launcher.model.modpack.DownloadableFile; import com.skcraft.launcher.model.modpack.Manifest; @@ -51,7 +52,7 @@ if (library != null) { arg = getPathOf(library.getPath(env)); } else { - arg = getPathOf(Library.mavenNameToPath(libraryName)); + arg = getPathOf(MavenName.from(libraryName).getFilePath()); } } else if (start == '&' && end == '&') { String localFileName = arg.substring(1, bound); diff --git a/launcher/src/main/java/com/skcraft/launcher/model/minecraft/Library.java b/launcher/src/main/java/com/skcraft/launcher/model/minecraft/Library.java index 3945c10..9ba25ac 100644 --- a/launcher/src/main/java/com/skcraft/launcher/model/minecraft/Library.java +++ b/launcher/src/main/java/com/skcraft/launcher/model/minecraft/Library.java @@ -9,8 +9,6 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; -import com.google.common.base.Joiner; -import com.google.common.base.Splitter; import com.google.common.collect.Lists; import com.skcraft.launcher.util.Environment; import lombok.Data; @@ -24,7 +22,7 @@ @JsonIgnoreProperties(ignoreUnknown = true) public class Library { - private String name; + private MavenName name; private Downloads downloads; private Map natives; private Extract extract; @@ -104,7 +102,7 @@ // BACKWARDS COMPATIBILITY: make up a virtual artifact Artifact virtualArtifact = new Artifact(); virtualArtifact.setUrl(getDownloads().getArtifact().getUrl()); - virtualArtifact.setPath(mavenNameToPath(name + ":" + nativeString)); + virtualArtifact.setPath(MavenName.from(name + ":" + nativeString).getFilePath()); return virtualArtifact; } @@ -128,8 +126,9 @@ EqualsBuilder builder = new EqualsBuilder(); builder.append(name, library.getName()); - // If libraries have different natives lists, they should be separate. + // If libraries have different natives or environment rules, they should be separate. builder.append(natives, library.getNatives()); + builder.append(rules, library.getRules()); return builder.isEquals(); } @@ -193,7 +192,7 @@ virtualArtifact.setUrl(url); if (getName() != null) { - virtualArtifact.setPath(mavenNameToPath(getName())); + virtualArtifact.setPath(name.getFilePath()); } Downloads downloads = new Downloads(); @@ -203,13 +202,7 @@ } public void setName(String name) { - int classifierPos = name.indexOf("@"); - if (classifierPos != -1) { - // Take off classifiers - name = name.substring(0, classifierPos); - } - - this.name = name; + this.name = MavenName.from(name); // [DEEP SIGH] // Sometimes 'name' comes after 'url', and I can't figure out how to get Jackson to enforce order @@ -218,7 +211,7 @@ if (getDownloads().getArtifact() == null) return; if (getDownloads().getArtifact().getPath() == null) { - getDownloads().getArtifact().setPath(mavenNameToPath(name)); + getDownloads().getArtifact().setPath(this.name.getFilePath()); } } } @@ -235,45 +228,10 @@ } /** - * Classifier-independent library name check - * @param mavenName Maven name of a library, possibly with a classifier + * @param mavenName Maven name of a library * @return True if this library is named 'mavenName'. */ public boolean matches(String mavenName) { - int classifierPos = mavenName.indexOf('@'); - if (classifierPos != -1) { - mavenName = mavenName.substring(0, classifierPos); - } - - return this.name.equals(mavenName); - } - - public static String mavenNameToPath(String mavenName) { - List split = Splitter.on(':').splitToList(mavenName); - int size = split.size(); - - String group = split.get(0); - String name = split.get(1); - String version = split.get(2); - String extension = "jar"; - - String fileName = name + "-" + version; - - if (size > 3) { - String classifier = split.get(3); - - if (classifier.indexOf("@") != -1) { - List parts = Splitter.on('@').splitToList(classifier); - - classifier = parts.get(0); - extension = parts.get(1); - } - - fileName += "-" + classifier; - } - - fileName += "." + extension; - - return Joiner.on('/').join(group.replace('.', '/'), name, version, fileName); + return this.name.equals(MavenName.from(mavenName)); } } diff --git a/launcher/src/main/java/com/skcraft/launcher/model/minecraft/MavenName.java b/launcher/src/main/java/com/skcraft/launcher/model/minecraft/MavenName.java new file mode 100644 index 0000000..1f1ebaa --- /dev/null +++ b/launcher/src/main/java/com/skcraft/launcher/model/minecraft/MavenName.java @@ -0,0 +1,63 @@ +package com.skcraft.launcher.model.minecraft; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import com.google.common.base.Joiner; +import com.google.common.base.Splitter; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.List; + +@Data +@EqualsAndHashCode(of = {"group", "path", "classifier"}) +public class MavenName { + @JsonValue + private final String fullName; + private final String group; + private final String path; + private final String version; + private final String classifier; + private final String extension; + + private final String filePath; + + @Override + public String toString() { + return fullName; + } + + @JsonCreator + public static MavenName from(String mavenName) { + if (mavenName == null) return null; + + List split = Splitter.on(':').splitToList(mavenName); + int size = split.size(); + + String group = split.get(0); + String name = split.get(1); + String version = split.get(2); + String classifier = null; + String extension = "jar"; + + String fileName = name + "-" + version; + + if (size > 3) { + classifier = split.get(3); + + if (classifier.indexOf("@") != -1) { + List parts = Splitter.on('@').splitToList(classifier); + + classifier = parts.get(0); + extension = parts.get(1); + } + + fileName += "-" + classifier; + } + + fileName += "." + extension; + String filePath = Joiner.on('/').join(group.replace('.', '/'), name, version, fileName); + + return new MavenName(mavenName, group, name, version, classifier, extension, filePath); + } +} diff --git a/launcher/src/main/java/com/skcraft/launcher/model/minecraft/VersionManifest.java b/launcher/src/main/java/com/skcraft/launcher/model/minecraft/VersionManifest.java index f1ffa2e..d82ebd4 100644 --- a/launcher/src/main/java/com/skcraft/launcher/model/minecraft/VersionManifest.java +++ b/launcher/src/main/java/com/skcraft/launcher/model/minecraft/VersionManifest.java @@ -41,16 +41,6 @@ : "legacy"; } - public Library findLibrary(String name) { - for (Library library : getLibraries()) { - if (library.getName().equals(name)) { - return library; - } - } - - return null; - } - public void setMinecraftArguments(String minecraftArguments) { MinecraftArguments result = new MinecraftArguments(); diff --git a/launcher/src/main/java/com/skcraft/launcher/update/BaseUpdater.java b/launcher/src/main/java/com/skcraft/launcher/update/BaseUpdater.java index 15d1f87..4bb4a76 100644 --- a/launcher/src/main/java/com/skcraft/launcher/update/BaseUpdater.java +++ b/launcher/src/main/java/com/skcraft/launcher/update/BaseUpdater.java @@ -273,11 +273,11 @@ } File tempFile = installer.getDownloader().download(urls, "", size, - library.getName() + ".jar"); + library.getName().toString()); log.info("Fetching " + path + " from " + urls); installer.queue(new FileMover(tempFile, targetFile)); if (artifact.getSha1() != null) { - installer.queue(new FileVerify(targetFile, library.getName(), artifact.getSha1())); + installer.queue(new FileVerify(targetFile, library.getName().toString(), artifact.getSha1())); } } }