diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/download/DownloadType.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/download/DownloadType.java index d61651726..6e35c7b0c 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/download/DownloadType.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/download/DownloadType.java @@ -27,7 +27,7 @@ public enum DownloadType { Mojang("download.mojang", new MojangDownloadProvider()), BMCL("download.BMCL", new BMCLAPIDownloadProvider()), - RapidData("download.rapid_data", new RapidDataDownloadProvider()), + //RapidData("download.rapid_data", new RapidDataDownloadProvider()), Curse("Curse CDN", new CurseDownloadProvider()); private final String name; diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/download/MinecraftDownloadService.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/download/MinecraftDownloadService.java index 397d8ca6e..0745dc543 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/download/MinecraftDownloadService.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/download/MinecraftDownloadService.java @@ -34,6 +34,7 @@ import org.jackhuang.hellominecraft.util.tasks.TaskWindow; import org.jackhuang.hellominecraft.util.tasks.download.FileDownloadTask; import org.jackhuang.hellominecraft.util.NetUtils; import org.jackhuang.hellominecraft.util.OverridableSwingWorker; +import org.jackhuang.hellominecraft.util.func.Function; import org.jackhuang.hellominecraft.util.system.FileUtils; import org.jackhuang.hellominecraft.util.tasks.DoingDoneListener; import org.jackhuang.hellominecraft.util.tasks.Task; @@ -110,7 +111,7 @@ public class MinecraftDownloadService extends IMinecraftDownloadService { } } - taskCollection.add(new FileDownloadTask(jarURL, mvj, hash).setTag(id + ".jar")); + taskCollection.add(new FileDownloadTask(jarURL, mvj, hash).setFailedCallbackReturnsNewURL(new DownloadTypeSwitcher(id + "/" + id + ".jar")).setTag(id + ".jar")); } @Override @@ -147,7 +148,7 @@ public class MinecraftDownloadService extends IMinecraftDownloadService { if (!vpath.exists() && !vpath.mkdirs()) HMCLog.warn("Failed to make version folder " + vpath); if (TaskWindow.factory() - .append(new FileDownloadTask(vurl + id + ".jar", mvt).setTag(id + ".jar")) + .append(new FileDownloadTask(vurl + id + ".jar", mvt).setFailedCallbackReturnsNewURL(new DownloadTypeSwitcher(id + "/" + id + ".jar")).setTag(id + ".jar")) .create()) { if (moved != null && moved.exists() && !moved.delete()) HMCLog.warn("Failed to delete " + moved); @@ -161,10 +162,38 @@ public class MinecraftDownloadService extends IMinecraftDownloadService { } } + private static class DownloadTypeSwitcher implements Function { + + String suffix; + + public DownloadTypeSwitcher(String suffix) { + this.suffix = suffix; + } + + @Override + public String apply(Integer t) { + return DownloadType.values()[t / 3].getProvider().getVersionsDownloadURL() + suffix; + } + + } + @Override - public Task downloadMinecraftJarTo(String id, File mvt) { - String vurl = service.getDownloadType().getProvider().getVersionsDownloadURL() + id + "/"; - return new FileDownloadTask(vurl + id + ".jar", mvt).setTag(id + ".jar"); + public Task downloadMinecraftJarTo(MinecraftVersion mv, File mvt) { + String jar = mv.jar == null ? mv.id : mv.jar; + String vurl = service.getDownloadType().getProvider().getVersionsDownloadURL() + jar + "/"; + String jarURL = vurl + jar + ".jar", hash = null; + if (mv.downloads != null) { + // Dont consider adding isAllowedToUseSelfURL, because some modpacks want to use their own download source. + GameDownloadInfo gdi = mv.downloads.get("client"); + if (gdi != null) { + if (gdi.url != null) + jarURL = gdi.url; + if (gdi.sha1 != null) + hash = gdi.sha1; + } + } + + return new FileDownloadTask(jarURL, mvt, hash).setTag(jar + ".jar"); } @Override diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/mod/ModpackManager.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/mod/ModpackManager.java index 6a8eee7a2..26586205a 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/mod/ModpackManager.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/mod/ModpackManager.java @@ -155,7 +155,7 @@ public final class ModpackManager { if (mv.jar == null) throw new FileNotFoundException(C.i18n("modpack.incorrect_format.no_jar")); - c.add(service.download().downloadMinecraftJarTo(mv.jar, new File(nowFile, id + ".jar"))); + c.add(service.download().downloadMinecraftJarTo(mv, new File(nowFile, id + ".jar"))); mv.jar = null; FileUtils.writeStringToFile(json, C.GSON.toJson(mv)); if (!json.renameTo(new File(nowFile, id + ".json"))) @@ -190,7 +190,7 @@ public final class ModpackManager { } - public static final List MODPACK_BLACK_LIST = Arrays.asList(new String[] { "usernamecache.json", "asm", "logs", "backups", "versions", "assets", "usercache.json", "libraries", "crash-reports", "launcher_profiles.json", "NVIDIA", "AMD", "TCNodeTracker", "screenshots", "natives", "native", "$native", "hmclversion.cfg", "pack.json", "launcher.jar", "launcher.pack.lzma", "hmclmc.log" }); + public static final List MODPACK_BLACK_LIST = Arrays.asList(new String[] { "usernamecache.json", "asm", "logs", "backups", "versions", "assets", "usercache.json", "libraries", "crash-reports", "launcher_profiles.json", "NVIDIA", "AMD", "TCNodeTracker", "screenshots", "natives", "native", "$native", "pack.json", "launcher.jar", "launcher.pack.lzma", "hmclmc.log" }); public static final List MODPACK_SUGGESTED_BLACK_LIST = Arrays.asList(new String[] { "saves", "servers.dat", "options.txt", "optionsshaders.txt", "mods/VoxelMods" }); /** diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/service/IMinecraftDownloadService.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/service/IMinecraftDownloadService.java index d7e72f7a3..a3905e99e 100755 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/service/IMinecraftDownloadService.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/core/service/IMinecraftDownloadService.java @@ -40,7 +40,7 @@ public abstract class IMinecraftDownloadService extends IMinecraftBasicService { public abstract boolean downloadMinecraftJar(String id); - public abstract Task downloadMinecraftJarTo(String id, File f); + public abstract Task downloadMinecraftJarTo(MinecraftVersion mv, File f); public abstract boolean downloadMinecraftVersionJson(String id); diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/modpack/ModpackFileSelectionPanel.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/modpack/ModpackFileSelectionPanel.java index 6aeb0b3a1..ff003c8cb 100644 --- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/modpack/ModpackFileSelectionPanel.java +++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/modpack/ModpackFileSelectionPanel.java @@ -76,9 +76,9 @@ public class ModpackFileSelectionPanel extends javax.swing.JPanel { put("minecraft/options.txt", C.i18n("modpack.files.options_txt")); put("minecraft/optionsshaders.txt", C.i18n("modpack.files.optionsshaders_txt")); put("minecraft/mods/VoxelMods", C.i18n("modpack.files.mods.voxelmods")); - put("minecraft/dumps", C.i18n("modpack.files.mods.dumps")); - put("minecraft/blueprints", C.i18n("modpack.files.mods.blueprints")); - put("minecraft/scripts", C.i18n("modpack.files.mods.scripts")); + put("minecraft/dumps", C.i18n("modpack.files.dumps")); + put("minecraft/blueprints", C.i18n("modpack.files.blueprints")); + put("minecraft/scripts", C.i18n("modpack.files.scripts")); } }; diff --git a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/tasks/download/FileDownloadTask.java b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/tasks/download/FileDownloadTask.java index 0cbb367e7..e1aa52393 100755 --- a/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/tasks/download/FileDownloadTask.java +++ b/HMCLAPI/src/main/java/org/jackhuang/hellominecraft/util/tasks/download/FileDownloadTask.java @@ -28,6 +28,7 @@ import java.security.MessageDigest; import java.util.ArrayList; import org.jackhuang.hellominecraft.util.C; import org.jackhuang.hellominecraft.util.code.DigestUtils; +import org.jackhuang.hellominecraft.util.func.Function; import org.jackhuang.hellominecraft.util.logging.HMCLog; import org.jackhuang.hellominecraft.util.tasks.Task; import org.jackhuang.hellominecraft.util.tasks.communication.PreviousResult; @@ -49,6 +50,13 @@ public class FileDownloadTask extends Task implements PreviousResult, Prev protected File filePath; protected String expectedHash; + protected Function failedCallbackReturnsNewURL; + + public FileDownloadTask setFailedCallbackReturnsNewURL(Function failedCallbackReturnsNewURL) { + this.failedCallbackReturnsNewURL = failedCallbackReturnsNewURL; + return this; + } + public FileDownloadTask() { } @@ -110,8 +118,13 @@ public class FileDownloadTask extends Task implements PreviousResult, Prev this.url = IOUtils.parseURL(p.getResult()); for (int repeat = 0; repeat < 6; repeat++) { - if (repeat > 0) + if (repeat > 0) { HMCLog.warn("Failed to download, repeat: " + repeat); + if (failedCallbackReturnsNewURL != null) { + url = IOUtils.parseURL(failedCallbackReturnsNewURL.apply(repeat)); + HMCLog.warn("Switch to: " + url); + } + } try { // Open connection to URL. diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index b8bc957ce..000000000 --- a/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,6 +0,0 @@ -#Thu Feb 18 20:51:49 CST 2016 -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-1.11-bin.zip diff --git a/gradlew b/gradlew deleted file mode 100755 index 9d82f7891..000000000 --- a/gradlew +++ /dev/null @@ -1,160 +0,0 @@ -#!/usr/bin/env bash - -############################################################################## -## -## Gradle start up script for UN*X -## -############################################################################## - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" - -warn ( ) { - echo "$*" -} - -die ( ) { - echo - echo "$*" - echo - exit 1 -} - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; -esac - -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=$((i+1)) - done - case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac -fi - -# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules -function splitJvmOpts() { - JVM_OPTS=("$@") -} -eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS -JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" - -exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"