diff --git a/launcher/dependency-reduced-pom.xml b/launcher/dependency-reduced-pom.xml index 51a0b9f..93c5bb6 100644 --- a/launcher/dependency-reduced-pom.xml +++ b/launcher/dependency-reduced-pom.xml @@ -3,7 +3,7 @@ 4.0.0 me.sashegdev ZernMCLauncher - 1.0.3 + 1.0.4 diff --git a/launcher/pom.xml b/launcher/pom.xml index bf3d3a3..ac776cd 100644 --- a/launcher/pom.xml +++ b/launcher/pom.xml @@ -131,15 +131,16 @@ ${project.version} - + - + - + + includes="ZernMCLauncher.exe,jre21/**" + excludes="*.jar,build.version"/> diff --git a/launcher/src/main/java/me/sashegdev/zernmc/launcher/minecraft/installer/FabricInstaller.java b/launcher/src/main/java/me/sashegdev/zernmc/launcher/minecraft/installer/FabricInstaller.java index 92103d1..d153212 100644 --- a/launcher/src/main/java/me/sashegdev/zernmc/launcher/minecraft/installer/FabricInstaller.java +++ b/launcher/src/main/java/me/sashegdev/zernmc/launcher/minecraft/installer/FabricInstaller.java @@ -191,26 +191,55 @@ public class FabricInstaller { } private String getLatestInstallerVersion() throws Exception { - String url = "https://maven.fabricmc.net/net/fabricmc/fabric-installer/maven-metadata.xml"; - String xml = downloadString(url); + // Пробуем HTTPS сначала + String[] urls = { + "https://maven.fabricmc.net/net/fabricmc/fabric-installer/maven-metadata.xml", + "http://maven.fabricmc.net/net/fabricmc/fabric-installer/maven-metadata.xml" + }; - int start = xml.indexOf("") + 8; - int end = xml.indexOf("", start); - return xml.substring(start, end).trim(); + for (String url : urls) { + try { + String xml = downloadString(url); + int start = xml.indexOf("") + 8; + int end = xml.indexOf("", start); + return xml.substring(start, end).trim(); + } catch (Exception e) { + System.out.println(ZAnsi.yellow("Не удалось получить версию из " + url + ": " + e.getMessage())); + // продолжаем со следующим URL + } + } + + throw new Exception("Не удалось получить версию Fabric Installer ни с одного источника"); } private String downloadString(String url) throws Exception { - HttpRequest request = HttpRequest.newBuilder() - .uri(URI.create(url)) - .timeout(Duration.ofSeconds(30)) - .GET() - .build(); + // Увеличиваем таймауты и добавляем ретраи + Exception lastException = null; - HttpResponse resp = httpClient.send(request, HttpResponse.BodyHandlers.ofString()); - if (resp.statusCode() != 200) { - throw new IOException("HTTP " + resp.statusCode() + " при скачивании " + url); + for (int attempt = 1; attempt <= 3; attempt++) { + try { + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(url)) + .timeout(Duration.ofSeconds(30 * attempt)) // увеличиваем таймаут с каждой попыткой + .header("User-Agent", "ZernMC-Launcher/1.0") + .GET() + .build(); + + HttpResponse resp = httpClient.send(request, HttpResponse.BodyHandlers.ofString()); + if (resp.statusCode() == 200) { + return resp.body(); + } + throw new IOException("HTTP " + resp.statusCode()); + } catch (Exception e) { + lastException = e; + System.out.println(ZAnsi.yellow("Попытка " + attempt + " не удалась: " + e.getMessage())); + if (attempt < 3) { + Thread.sleep(1000 * attempt); + } + } } - return resp.body(); + + throw lastException; } private void downloadFile(String url, Path target) throws Exception { diff --git a/launcher/src/main/java/me/sashegdev/zernmc/launcher/minecraft/installer/VersionInstaller.java b/launcher/src/main/java/me/sashegdev/zernmc/launcher/minecraft/installer/VersionInstaller.java index 73c5aec..a2670aa 100644 --- a/launcher/src/main/java/me/sashegdev/zernmc/launcher/minecraft/installer/VersionInstaller.java +++ b/launcher/src/main/java/me/sashegdev/zernmc/launcher/minecraft/installer/VersionInstaller.java @@ -77,20 +77,22 @@ public class VersionInstaller { System.out.println(ZAnsi.cyan("Скачивание библиотек...")); downloadLibraries(versionData.getJSONArray("libraries")); - // Ассеты - ЭТО ВАЖНО - String assetIndex = versionData.getString("assets"); // ← Например "5" для 1.20.1 - System.out.println(ZAnsi.cyan("Asset index из версии: " + assetIndex)); - + String assetIndex; if (versionData.has("assetIndex")) { - System.out.println(ZAnsi.cyan("Скачивание ассетов...")); - downloadAssets(versionData); - System.out.println(ZAnsi.brightGreen("Asset index определён как: " + assetIndex)); + JSONObject assetIndexObj = versionData.getJSONObject("assetIndex"); + assetIndex = assetIndexObj.getString("id"); // ← это "5" для 1.20.1 } else { - System.out.println(ZAnsi.yellow("Нет assetIndex в версии, использую fallback: " + assetIndex)); + assetIndex = versionData.getString("assets"); // fallback } + System.out.println(ZAnsi.cyan("Asset index: " + assetIndex)); + + // Скачиваем ассеты используя правильный индекс + System.out.println(ZAnsi.cyan("Скачивание ассетов...")); + downloadAssets(versionData, assetIndex); + System.out.println(ZAnsi.brightGreen("\nMinecraft " + versionId + " полностью установлен!")); - return assetIndex; // ← Возвращаем правильный индекс (например "5") + return assetIndex; // ← возвращаем "5" а не "1.20.1" } private void downloadLibraries(JSONArray libraries) throws Exception { @@ -119,23 +121,23 @@ public class VersionInstaller { ProgressBar.finish("Библиотеки загружены"); } - private void downloadAssets(JSONObject versionData) throws Exception { + private void downloadAssets(JSONObject versionData, String assetIndex) throws Exception { + // Находим URL для asset index JSONObject assetIndexInfo = versionData.getJSONObject("assetIndex"); String indexUrl = assetIndexInfo.getString("url"); - String indexId = versionData.getString("assets"); Path indexesDir = minecraftDir.resolve("assets/indexes"); Files.createDirectories(indexesDir); - Path indexPath = indexesDir.resolve(indexId + ".json"); + Path indexPath = indexesDir.resolve(assetIndex + ".json"); // ← используем assetIndex - System.out.println(ZAnsi.cyan("Скачивание asset index (" + indexId + ")...")); + System.out.println(ZAnsi.cyan("Скачивание asset index (" + assetIndex + ")...")); downloadFile(indexUrl, indexPath, "asset index"); String jsonContent = Files.readString(indexPath); JSONObject root = new JSONObject(jsonContent); JSONObject objects = root.getJSONObject("objects"); - System.out.println(ZAnsi.cyan("Скачивание " + objects.length() + " объектов ассетов (index: " + indexId + ")...")); + System.out.println(ZAnsi.cyan("Скачивание " + objects.length() + " объектов ассетов (index: " + assetIndex + ")...")); int total = objects.length(); int[] success = {0};