diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java index 9970882c4..60360ea32 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java @@ -26,6 +26,7 @@ import org.jackhuang.hmcl.auth.AuthenticationException; import org.jackhuang.hmcl.auth.CredentialExpiredException; import org.jackhuang.hmcl.download.DefaultDependencyManager; import org.jackhuang.hmcl.download.MaintainTask; +import org.jackhuang.hmcl.download.game.GameAssetIndexDownloadTask; import org.jackhuang.hmcl.download.game.LibraryDownloadException; import org.jackhuang.hmcl.launch.NotDecompressingNativesException; import org.jackhuang.hmcl.launch.PermissionException; @@ -239,6 +240,8 @@ public final class LauncherHelper { message = i18n("launch.failed.decompressing_natives") + ex.getLocalizedMessage(); } else if (ex instanceof LibraryDownloadException) { message = i18n("launch.failed.download_library", ((LibraryDownloadException) ex).getLibrary().getName()) + "\n" + StringUtils.getStackTrace(ex.getCause()); + } else if (ex instanceof GameAssetIndexDownloadTask.GameAssetIndexMalformedException) { + message = i18n("assets.index.malformed"); } else { message = StringUtils.getStackTrace(ex); } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameAssetDownloadTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameAssetDownloadTask.java index 009228d18..413394bf6 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameAssetDownloadTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameAssetDownloadTask.java @@ -17,6 +17,7 @@ */ package org.jackhuang.hmcl.download.game; +import com.google.gson.JsonSyntaxException; import org.jackhuang.hmcl.download.AbstractDependencyManager; import org.jackhuang.hmcl.game.AssetIndex; import org.jackhuang.hmcl.game.AssetIndexInfo; @@ -46,6 +47,8 @@ public final class GameAssetDownloadTask extends Task { private final File assetIndexFile; private final List> dependents = new LinkedList<>(); private final List> dependencies = new LinkedList<>(); + private AssetIndex index; + private boolean retry = false; /** * Constructor. @@ -72,10 +75,32 @@ public final class GameAssetDownloadTask extends Task { public Collection> getDependencies() { return dependencies; } - + + @Override + public boolean doPreExecute() { + return true; + } + + @Override + public void preExecute() throws Exception { + try { + index = JsonUtils.GSON.fromJson(FileUtils.readText(assetIndexFile), AssetIndex.class); + } catch (JsonSyntaxException e) { + dependents.add(new GameAssetIndexDownloadTask(dependencyManager, this.version)); + retry = true; + } + } + @Override public void execute() throws Exception { - AssetIndex index = JsonUtils.GSON.fromJson(FileUtils.readText(assetIndexFile), AssetIndex.class); + if (retry) { + try { + index = JsonUtils.GSON.fromJson(FileUtils.readText(assetIndexFile), AssetIndex.class); + } catch (JsonSyntaxException e) { + throw new GameAssetIndexDownloadTask.GameAssetIndexMalformedException(); + } + } + int progress = 0; if (index != null) for (AssetObject assetObject : index.getObjects().values()) { diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameAssetIndexDownloadTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameAssetIndexDownloadTask.java index ce78a9fbb..c8226acc5 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameAssetIndexDownloadTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameAssetIndexDownloadTask.java @@ -25,6 +25,7 @@ import org.jackhuang.hmcl.task.Task; import org.jackhuang.hmcl.util.io.NetworkUtils; import java.io.File; +import java.io.IOException; import java.util.LinkedList; import java.util.List; @@ -69,4 +70,7 @@ public final class GameAssetIndexDownloadTask extends Task { ).setCacheRepository(dependencyManager.getCacheRepository())); } + + public static class GameAssetIndexMalformedException extends IOException { + } }