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 303c63d34..69171916b 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 @@ -23,7 +23,9 @@ import com.skcraft.launcher.model.loader.InstallProfile; import com.skcraft.launcher.model.minecraft.Library; import com.skcraft.launcher.model.minecraft.VersionManifest; +import com.skcraft.launcher.model.modpack.LauncherJSON; import com.skcraft.launcher.model.modpack.Manifest; +import com.skcraft.launcher.model.modpack.ModpackVersion; import com.skcraft.launcher.util.Environment; import com.skcraft.launcher.util.HttpRequest; import com.skcraft.launcher.util.SimpleLogFormatter; @@ -215,7 +217,6 @@ private void processLoader(LinkedHashSet loaderLibraries, File file, Fi public void downloadLibraries(File librariesDir) throws IOException, InterruptedException { logSection("Downloading libraries..."); - // TODO: Download libraries for different environments -- As of writing, this is not an issue Environment env = Environment.getInstance(); for (Library library : loaderLibraries) { @@ -242,6 +243,7 @@ public void downloadLibraries(File librariesDir) throws IOException, Interrupted pathname = compressor.transformPathname(pathname); } +// URL url = new URL(library.getDownloadUrl(env)); URL url = new URL(baseUrl + pathname); File tempFile = File.createTempFile("launcherlib", null); @@ -297,9 +299,7 @@ public void readVersionManifest(File path) throws IOException, InterruptedExcept log.info("Loaded version manifest from " + path.getAbsolutePath()); } else { - URL url = url(String.format( - properties.getProperty("versionManifestUrl"), - manifest.getGameVersion())); + URL url = Launcher.getMetaURL(manifest.getGameVersion()); log.info("Fetching version manifest from " + url + "..."); @@ -311,7 +311,6 @@ public void readVersionManifest(File path) throws IOException, InterruptedExcept .asJson(VersionManifest.class)); } } - public void writeManifest(@NonNull File path) throws IOException { logSection("Writing manifest..."); diff --git a/launcher/src/main/java/com/skcraft/launcher/Launcher.java b/launcher/src/main/java/com/skcraft/launcher/Launcher.java index f6d5cce44..c9320d68e 100644 --- a/launcher/src/main/java/com/skcraft/launcher/Launcher.java +++ b/launcher/src/main/java/com/skcraft/launcher/Launcher.java @@ -17,6 +17,9 @@ import com.skcraft.launcher.auth.YggdrasilLoginService; import com.skcraft.launcher.launch.LaunchSupervisor; import com.skcraft.launcher.model.minecraft.VersionManifest; +import com.skcraft.launcher.model.modpack.LauncherJSON; +import com.skcraft.launcher.model.modpack.ModJSON; +import com.skcraft.launcher.model.modpack.ModpackVersion; import com.skcraft.launcher.persistence.Persistence; import com.skcraft.launcher.swing.SwingHelper; import com.skcraft.launcher.update.UpdateManager; @@ -366,6 +369,36 @@ public URL propUrl(String key, String... args) { return HttpRequest.url(prop(key, args)); } + public static URL getMetaURL(String version) throws IOException, InterruptedException { + URL url = new URL("https://launchermeta.mojang.com/mc/game/version_manifest.json"); + LauncherJSON launcherJSON = HttpRequest + .get(url) + .execute() + .expectResponseCode(200) + .returnContent() + .asJson(LauncherJSON.class); + for(ModpackVersion mpVersion : launcherJSON.getVersions()) { + if(mpVersion.getID().equalsIgnoreCase(version)) { + return new URL(mpVersion.getURL()); + } + } + return null; + } + + public static String getDownloadURL(String version) throws IOException, InterruptedException { + URL url = getMetaURL(version); + if(url == null) { + return ""; + } + ModJSON modJson = HttpRequest + .get(url) + .execute() + .expectResponseCode(200) + .returnContent() + .asJson(ModJSON.class); + return modJson.getDownloads().getClient().getUrl(); + } + /** * Show the launcher. */ diff --git a/launcher/src/main/java/com/skcraft/launcher/launch/Runner.java b/launcher/src/main/java/com/skcraft/launcher/launch/Runner.java index 833d73316..b4b76c476 100644 --- a/launcher/src/main/java/com/skcraft/launcher/launch/Runner.java +++ b/launcher/src/main/java/com/skcraft/launcher/launch/Runner.java @@ -180,6 +180,12 @@ private void addPlatformArgs() { if (getEnvironment().getPlatform() == Platform.WINDOWS) { builder.getFlags().add("-XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe_minecraft.exe.heapdump"); } + + if(getEnvironment().getArch()=="x86"){ + builder.getFlags().add("-Xss1M"); + } + builder.getFlags().add("-Dminecraft.launcher.brand="+launcher.getProperties().getProperty("agentName")); + builder.getFlags().add("-Dminecraft.launcher.version="+launcher.getVersion()); } /** @@ -271,7 +277,8 @@ private void addJvmArgs() throws IOException { private void addJarArgs() throws JsonProcessingException { List args = builder.getArgs(); - String[] rawArgs = versionManifest.getMinecraftArguments().split(" +"); +// String[] rawArgs = versionManifest.getMinecraftArguments().split(" +"); + String[] rawArgs = versionManifest.getNewMinecraftArguments().split(" +"); StrSubstitutor substitutor = new StrSubstitutor(getCommandSubstitutions()); for (String arg : rawArgs) { args.add(substitutor.replace(arg)); @@ -358,6 +365,7 @@ private Map getCommandSubstitutions() throws JsonProcessingExcep Map map = new HashMap(); map.put("version_name", versionManifest.getId()); + map.put("version_type", versionManifest.getType()); map.put("auth_access_token", session.getAccessToken()); map.put("auth_session", session.getSessionToken()); diff --git a/launcher/src/main/java/com/skcraft/launcher/model/minecraft/Arguments.java b/launcher/src/main/java/com/skcraft/launcher/model/minecraft/Arguments.java new file mode 100644 index 000000000..72a0d7963 --- /dev/null +++ b/launcher/src/main/java/com/skcraft/launcher/model/minecraft/Arguments.java @@ -0,0 +1,17 @@ +package com.skcraft.launcher.model.minecraft; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; + +import java.util.List; + +/** + * @author barpec12 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class Arguments { + + private List game; + private List jvm; +} diff --git a/launcher/src/main/java/com/skcraft/launcher/model/minecraft/Artifact.java b/launcher/src/main/java/com/skcraft/launcher/model/minecraft/Artifact.java new file mode 100644 index 000000000..b5483742a --- /dev/null +++ b/launcher/src/main/java/com/skcraft/launcher/model/minecraft/Artifact.java @@ -0,0 +1,15 @@ +package com.skcraft.launcher.model.minecraft; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; + +/** + * @author barpec12 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class Artifact { + + private String path; + private String url; +} diff --git a/launcher/src/main/java/com/skcraft/launcher/model/minecraft/Downloads.java b/launcher/src/main/java/com/skcraft/launcher/model/minecraft/Downloads.java new file mode 100644 index 000000000..bec92930a --- /dev/null +++ b/launcher/src/main/java/com/skcraft/launcher/model/minecraft/Downloads.java @@ -0,0 +1,17 @@ +package com.skcraft.launcher.model.minecraft; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; + +import java.util.HashMap; + +/** + * @author barpec12 + */ +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class Downloads { + + private Artifact artifact; + private HashMap classifiers; +} 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 ccb13def7..de13d7ea9 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 @@ -13,8 +13,8 @@ import com.skcraft.launcher.util.Platform; import lombok.Data; +import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.regex.Pattern; @Data @@ -22,12 +22,14 @@ public class Library { private String name; + private String path; private transient String group; private transient String artifact; private transient String version; @JsonProperty("url") private String baseUrl; - private Map natives; + private Downloads downloads; + private HashMap natives; private Extract extract; private List rules; @@ -83,15 +85,15 @@ public String getVersion() { return version; } - public String getNativeString(Platform platform) { + public String getNativeString(Environment env) { if (getNatives() != null) { - switch (platform) { + switch (env.getPlatform()) { case LINUX: - return getNatives().get("linux"); + return getNatives().get("linux") == null ? null : getNatives().get("linux").replace("${arch}", env.getArchBits()); case WINDOWS: - return getNatives().get("windows"); + return getNatives().get("windows") == null ? null : getNatives().get("windows").replace("${arch}", env.getArchBits()); case MAC_OS_X: - return getNatives().get("osx"); + return getNatives().get("osx") == null ? null : getNatives().get("osx").replace("${arch}", env.getArchBits()); default: return null; } @@ -101,7 +103,7 @@ public String getNativeString(Platform platform) { } public String getFilename(Environment environment) { - String nativeString = getNativeString(environment.getPlatform()); + String nativeString = getNativeString(environment); if (nativeString != null) { return String.format("%s-%s-%s.jar", getArtifact(), getVersion(), nativeString); @@ -111,6 +113,18 @@ public String getFilename(Environment environment) { } public String getPath(Environment environment) { + if(path!=null) + return path; + if(downloads!=null) { + String nativeString = getNativeString(environment); + if (nativeString != null) { + path = downloads.getClassifiers().get(nativeString).getPath(); + return path; + } else { + path = downloads.getArtifact().getPath(); + return path; + } + } StringBuilder builder = new StringBuilder(); builder.append(getGroup().replace('.', '/')); builder.append("/"); @@ -123,7 +137,6 @@ public String getPath(Environment environment) { path = path.replace("${arch}", environment.getArchBits()); return path; } - @Override public boolean equals(Object o) { if (this == o) return true; @@ -133,13 +146,16 @@ public boolean equals(Object o) { if (name != null ? !name.equals(library.name) : library.name != null) return false; - + Environment env = Environment.getInstance(); + if(getNativeString(env)==library.getNativeString(env)) + return false; return true; } @Override public int hashCode() { - return name != null ? name.hashCode() : 0; + String nativeString = getNativeString(Environment.getInstance()); + return name != null ? (name+(nativeString != null ? nativeString : "")).hashCode() : 0; } @Data 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 283bb8a75..a9faa32b5 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 @@ -11,6 +11,7 @@ import lombok.Data; import java.util.Date; +import java.util.HashMap; import java.util.LinkedHashSet; @Data @@ -24,13 +25,30 @@ public class VersionManifest { private String type; private String processArguments; private String minecraftArguments; + private Arguments arguments; private String mainClass; private int minimumLauncherVersion; private LinkedHashSet libraries; + private HashMap assetIndex; @JsonIgnore public String getAssetsIndex() { return getAssets() != null ? getAssets() : "legacy"; } + @JsonIgnore + public String getNewMinecraftArguments() { + return getMinecraftArguments() != null ? getMinecraftArguments() : getNewArguments(); + } + @JsonIgnore + private String getNewArguments(){ + String result = ""; + if(getArguments()!=null) + for(Object obj:getArguments().getGame()){ + if(obj instanceof String) { + result += ((String)obj + " "); + } + } + return result; + } } diff --git a/launcher/src/main/java/com/skcraft/launcher/model/modpack/DownloadClient.java b/launcher/src/main/java/com/skcraft/launcher/model/modpack/DownloadClient.java new file mode 100644 index 000000000..83c65a86c --- /dev/null +++ b/launcher/src/main/java/com/skcraft/launcher/model/modpack/DownloadClient.java @@ -0,0 +1,12 @@ +package com.skcraft.launcher.model.modpack; + +import lombok.Data; + +@Data +public class DownloadClient { + + private String sha1; + private int size; + private String url; + +} diff --git a/launcher/src/main/java/com/skcraft/launcher/model/modpack/DownloadServer.java b/launcher/src/main/java/com/skcraft/launcher/model/modpack/DownloadServer.java new file mode 100644 index 000000000..bc6f96917 --- /dev/null +++ b/launcher/src/main/java/com/skcraft/launcher/model/modpack/DownloadServer.java @@ -0,0 +1,12 @@ +package com.skcraft.launcher.model.modpack; + +import lombok.Data; + +@Data +public class DownloadServer { + + private String sha1; + private int size; + private String url; + +} diff --git a/launcher/src/main/java/com/skcraft/launcher/model/modpack/LatestVersions.java b/launcher/src/main/java/com/skcraft/launcher/model/modpack/LatestVersions.java new file mode 100644 index 000000000..fff25d8bf --- /dev/null +++ b/launcher/src/main/java/com/skcraft/launcher/model/modpack/LatestVersions.java @@ -0,0 +1,11 @@ +package com.skcraft.launcher.model.modpack; + +import lombok.Data; + +@Data +public class LatestVersions { + + private String release; + private String snapshot; + +} diff --git a/launcher/src/main/java/com/skcraft/launcher/model/modpack/LauncherJSON.java b/launcher/src/main/java/com/skcraft/launcher/model/modpack/LauncherJSON.java new file mode 100644 index 000000000..473433aa8 --- /dev/null +++ b/launcher/src/main/java/com/skcraft/launcher/model/modpack/LauncherJSON.java @@ -0,0 +1,18 @@ +package com.skcraft.launcher.model.modpack; + + +import lombok.Data; + +import java.util.List; + +@Data +public class LauncherJSON { + + private LatestVersions latest; + private List versions; + + public List getVersions() { + return versions; + } + +} diff --git a/launcher/src/main/java/com/skcraft/launcher/model/modpack/LauncherMeta.java b/launcher/src/main/java/com/skcraft/launcher/model/modpack/LauncherMeta.java new file mode 100644 index 000000000..2f11042f0 --- /dev/null +++ b/launcher/src/main/java/com/skcraft/launcher/model/modpack/LauncherMeta.java @@ -0,0 +1,13 @@ +package com.skcraft.launcher.model.modpack; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; + +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class LauncherMeta { + + private DownloadClient client; + private DownloadServer server; + +} diff --git a/launcher/src/main/java/com/skcraft/launcher/model/modpack/ModJSON.java b/launcher/src/main/java/com/skcraft/launcher/model/modpack/ModJSON.java new file mode 100644 index 000000000..d9f98ceb6 --- /dev/null +++ b/launcher/src/main/java/com/skcraft/launcher/model/modpack/ModJSON.java @@ -0,0 +1,12 @@ +package com.skcraft.launcher.model.modpack; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; + +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class ModJSON { + + private LauncherMeta downloads; + +} diff --git a/launcher/src/main/java/com/skcraft/launcher/model/modpack/ModpackVersion.java b/launcher/src/main/java/com/skcraft/launcher/model/modpack/ModpackVersion.java new file mode 100644 index 000000000..d8231e7cd --- /dev/null +++ b/launcher/src/main/java/com/skcraft/launcher/model/modpack/ModpackVersion.java @@ -0,0 +1,34 @@ +package com.skcraft.launcher.model.modpack; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class ModpackVersion { + + private String id; + private String type; + private String url; + private String time; + private String releaseTime; + + public String getURL() { + return url; + } + + public String getID() { + return id; + } + + public String getTime() { + return time; + } + + public String getType() { + return type; + } + + public String getReleaseTime() { + return releaseTime; + } + +} diff --git a/launcher/src/main/java/com/skcraft/launcher/update/Updater.java b/launcher/src/main/java/com/skcraft/launcher/update/Updater.java index 70fa583b7..54749cbbf 100644 --- a/launcher/src/main/java/com/skcraft/launcher/update/Updater.java +++ b/launcher/src/main/java/com/skcraft/launcher/update/Updater.java @@ -99,7 +99,6 @@ public Instance call() throws Exception { return instance; } - private VersionManifest readVersionManifest(Manifest manifest) throws IOException, InterruptedException { // Check whether the package manifest contains an embedded version manifest, // otherwise we'll have to download the one for the given Minecraft version @@ -108,10 +107,7 @@ private VersionManifest readVersionManifest(Manifest manifest) throws IOExceptio mapper.writeValue(instance.getVersionPath(), version); return version; } else { - URL url = url(String.format( - launcher.getProperties().getProperty("versionManifestUrl"), - manifest.getGameVersion())); - + URL url = launcher.getMetaURL(manifest.getGameVersion()); return HttpRequest .get(url) .execute() @@ -152,9 +148,10 @@ protected void update(Instance instance) throws Exception { // Install the .jar File jarPath = launcher.getJarPath(version); - URL jarSource = launcher.propUrl("jarUrl", version.getId()); - log.info("JAR at " + jarPath.getAbsolutePath() + ", fetched from " + jarSource); - installJar(installer, jarPath, jarSource); + String downloadURLString = Launcher.getDownloadURL(version.getId()); + URL downloadURL = new URL(downloadURLString); + log.info("JAR at " + jarPath.getAbsolutePath() + ", fetched from " + downloadURL); + installJar(installer, jarPath, downloadURL); // Download libraries log.info("Enumerating libraries to download..."); @@ -171,7 +168,10 @@ protected void update(Instance instance) throws Exception { // Download assets log.info("Enumerating assets to download..."); progress = new DefaultProgress(-1, SharedLocale.tr("instanceUpdater.collectingAssets")); - installAssets(installer, version, launcher.propUrl("assetsIndexUrl", version.getAssetsIndex()), assetsSources); + URL assetUrl = version.getAssetIndex() != null + ? url(version.getAssetIndex().get("url")) + : launcher.propUrl("assetsIndexUrl", version.getAssetsIndex()); + installAssets(installer, version, assetUrl, assetsSources); log.info("Executing download phase..."); progress = ProgressFilter.between(installer.getDownloader(), 0, 0.98); diff --git a/launcher/src/main/resources/com/skcraft/launcher/launcher.properties b/launcher/src/main/resources/com/skcraft/launcher/launcher.properties index f434d2c35..d61d2009b 100644 --- a/launcher/src/main/resources/com/skcraft/launcher/launcher.properties +++ b/launcher/src/main/resources/com/skcraft/launcher/launcher.properties @@ -8,14 +8,13 @@ version=${project.version} agentName=Minecraft offlinePlayerName=Player -versionManifestUrl=https://s3.amazonaws.com/Minecraft.Download/versions/%1$s/%1$s.json +versionManifestUrl=https://launchermeta.mojang.com/mc/game/version_manifest.json librariesSource=https://libraries.minecraft.net/ -jarUrl=https://s3.amazonaws.com/Minecraft.Download/versions/%1$s/%1$s.jar -assetsIndexUrl=https://s3.amazonaws.com/Minecraft.Download/indexes/%s.json assetsSource=http://resources.download.minecraft.net/ yggdrasilAuthUrl=https://authserver.mojang.com/authenticate resetPasswordUrl=https://minecraft.net/resetpassword + newsUrl=http://update.skcraft.com/template/news.html?version=%s packageListUrl=http://update.skcraft.com/template/packages.json?key=%s selfUpdateUrl=http://update.skcraft.com/template/launcher/latest.json