From b47793b618167a74b748b9c623a04e2dd3114c18 Mon Sep 17 00:00:00 2001 From: Sashegdev Date: Mon, 6 Apr 2026 18:17:07 +0000 Subject: [PATCH] =?UTF-8?q?=D0=91=D0=B0=D0=B3=D1=84=D0=B8=D0=BA=D1=81?= =?UTF-8?q?=D1=8B=20ClassPath?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../zernmc/launcher/minecraft/Instance.java | 9 +++ .../minecraft/installer/FabricInstaller.java | 77 ++++++------------- .../minecraft/installer/VersionInstaller.java | 18 +++-- 3 files changed, 43 insertions(+), 61 deletions(-) diff --git a/launcher/src/main/java/me/sashegdev/zernmc/launcher/minecraft/Instance.java b/launcher/src/main/java/me/sashegdev/zernmc/launcher/minecraft/Instance.java index 9068d40..9af51f5 100644 --- a/launcher/src/main/java/me/sashegdev/zernmc/launcher/minecraft/Instance.java +++ b/launcher/src/main/java/me/sashegdev/zernmc/launcher/minecraft/Instance.java @@ -20,6 +20,7 @@ public class Instance { private boolean isServerPack; // флаг, что это сборка с сервера private int serverVersion; // версия сборки на сервере private String serverPackName; // имя пака на сервере + private String fabricVersionId; private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); @@ -60,6 +61,14 @@ public class Instance { saveMetadata(); } + public String getFabricVersionId() { + return fabricVersionId; + } + + public void setFabricVersionId(String fabricVersionId) { + this.fabricVersionId = fabricVersionId; + } + public boolean isServerPack() { return isServerPack; 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 d153212..8f3abda 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 @@ -30,30 +30,15 @@ public class FabricInstaller { Path instancePath = instance.getPath(); cleanOldFabricLoaders(); - // Шаг 1: Устанавливаем vanilla и получаем assetIndex + // Шаг 1: Устанавливаем vanilla и получаем правильный assetIndex VersionInstaller versionInstaller = new VersionInstaller(instancePath); - String assetIndex = versionInstaller.install(minecraftVersion); + String assetIndex = versionInstaller.install(minecraftVersion); // Теперь возвращает "5" вместо "1.20.1" + + System.out.println(ZAnsi.green("Asset index получен: " + assetIndex)); - // ДОПОЛНИТЕЛЬНАЯ ПРОВЕРКА: если versionInstaller.install() вернул неправильный индекс - // (например, "1.20.1" вместо "5"), то получаем правильный индекс напрямую - if (assetIndex == null || assetIndex.isEmpty() || assetIndex.equals(minecraftVersion)) { - System.out.println(ZAnsi.yellow("Asset index из установки выглядит подозрительно: " + assetIndex)); - System.out.println(ZAnsi.cyan("Получаем правильный asset index для " + minecraftVersion + "...")); - - // Получаем правильный asset index из манифеста версии - String correctAssetIndex = versionInstaller.getAssetIndexForVersion(minecraftVersion); - if (correctAssetIndex != null && !correctAssetIndex.isEmpty()) { - assetIndex = correctAssetIndex; - System.out.println(ZAnsi.green("Правильный asset index: " + assetIndex)); - } else { - System.out.println(ZAnsi.brightRed("Не удалось получить asset index для версии " + minecraftVersion)); - return false; - } - } - // Сохраняем правильный assetIndex instance.setAssetIndex(assetIndex); - System.out.println(ZAnsi.green("Asset index сохранён: " + assetIndex)); + instance.setMinecraftVersion(minecraftVersion); // Шаг 2: Скачивание Fabric Installer String installerVersion = getLatestInstallerVersion(); @@ -72,7 +57,9 @@ public class FabricInstaller { System.out.println(ZAnsi.cyan("Запуск Fabric Installer...")); - // Используем ProcessBuilder с правильными аргументами + // Fabric создаёт версию: fabric-loader-{loaderVersion}-{minecraftVersion} + String fabricVersionId = "fabric-loader-" + loaderVersion + "-" + minecraftVersion; + ProcessBuilder pb = new ProcessBuilder( "java", "-jar", installerJar.toAbsolutePath().toString(), "client", @@ -93,40 +80,31 @@ public class FabricInstaller { return false; } - // Проверка результата - Fabric создаёт папку versions/fabric-loader-{loaderVersion}-{minecraftVersion} - String fabricVersionId = "fabric-loader-" + loaderVersion + "-" + minecraftVersion; + // Проверяем, создалась ли папка с Fabric версией Path fabricVersionDir = instancePath.resolve("versions").resolve(fabricVersionId); - - // Альтернативная проверка (иногда Fabric использует другой формат) - if (!Files.exists(fabricVersionDir)) { - fabricVersionId = "fabric-loader-" + loaderVersion + "-" + minecraftVersion; - fabricVersionDir = instancePath.resolve("versions").resolve(fabricVersionId); - } if (Files.exists(fabricVersionDir)) { System.out.println(ZAnsi.brightGreen("Fabric успешно установлен!")); System.out.println(ZAnsi.white("Версия: ") + fabricVersionId); System.out.println(ZAnsi.white("Asset index: ") + assetIndex); - // Сохраняем метаданные в Instance - instance.setMinecraftVersion(minecraftVersion); + // Сохраняем метаданные instance.setLoaderType("fabric"); instance.setLoaderVersion(loaderVersion); - // assetIndex уже сохранён выше, но сохраняем ещё раз для надёжности - instance.setAssetIndex(assetIndex); + instance.setFabricVersionId(fabricVersionId); // <-- ВАЖНО: сохраняем ID Fabric версии - // Копируем или создаём ссылку на правильный asset index в версии Fabric - ensureAssetIndexInFabricVersion(fabricVersionDir, assetIndex, minecraftVersion); + // Исправляем asset index в JSON файле Fabric версии + ensureAssetIndexInFabricVersion(fabricVersionDir, assetIndex); return true; } else { System.out.println(ZAnsi.brightRed("Fabric Installer отработал, но версия не найдена.")); System.out.println(ZAnsi.yellow("Искали: " + fabricVersionDir)); - // Выводим содержимое папки versions для отладки + // Отладка Path versionsDir = instancePath.resolve("versions"); if (Files.exists(versionsDir)) { - System.out.println(ZAnsi.cyan("Доступные версии в папке versions:")); + System.out.println(ZAnsi.cyan("Доступные версии:")); try (var stream = Files.list(versionsDir)) { stream.forEach(p -> System.out.println(" - " + p.getFileName())); } @@ -135,10 +113,7 @@ public class FabricInstaller { } } - /** - * Убеждаемся, что в JSON файле версии Fabric есть правильный asset index - */ - private void ensureAssetIndexInFabricVersion(Path fabricVersionDir, String assetIndex, String minecraftVersion) throws IOException { + private void ensureAssetIndexInFabricVersion(Path fabricVersionDir, String assetIndex) throws IOException { Path versionJson = fabricVersionDir.resolve(fabricVersionDir.getFileName() + ".json"); if (!Files.exists(versionJson)) { @@ -148,15 +123,14 @@ public class FabricInstaller { String content = Files.readString(versionJson); - // Проверяем, есть ли в JSON правильный asset index + // Проверяем и исправляем asset index if (!content.contains("\"assets\":\"" + assetIndex + "\"")) { System.out.println(ZAnsi.yellow("Исправляем asset index в JSON файле версии...")); // Заменяем assets на правильное значение - // Ищем "assets": "что-то" и заменяем content = content.replaceAll("\"assets\":\\s*\"[^\"]*\"", "\"assets\": \"" + assetIndex + "\""); - // Также проверяем assetIndex в downloads + // Также проверяем assetIndex if (content.contains("\"assetIndex\"")) { content = content.replaceAll("\"assetIndex\":\\s*\"[^\"]*\"", "\"assetIndex\": \"" + assetIndex + "\""); } @@ -164,7 +138,7 @@ public class FabricInstaller { Files.writeString(versionJson, content); System.out.println(ZAnsi.green("Asset index исправлен на: " + assetIndex)); } else { - System.out.println(ZAnsi.green("Asset index в JSON версии уже правильный: " + assetIndex)); + System.out.println(ZAnsi.green("Asset index в JSON версии правильный: " + assetIndex)); } } @@ -191,7 +165,6 @@ public class FabricInstaller { } private String getLatestInstallerVersion() throws Exception { - // Пробуем 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" @@ -205,26 +178,24 @@ public class FabricInstaller { return xml.substring(start, end).trim(); } catch (Exception e) { System.out.println(ZAnsi.yellow("Не удалось получить версию из " + url + ": " + e.getMessage())); - // продолжаем со следующим URL } } - throw new Exception("Не удалось получить версию Fabric Installer ни с одного источника"); + throw new Exception("Не удалось получить версию Fabric Installer"); } private String downloadString(String url) throws Exception { - // Увеличиваем таймауты и добавляем ретраи Exception lastException = null; - + for (int attempt = 1; attempt <= 3; attempt++) { try { HttpRequest request = HttpRequest.newBuilder() .uri(URI.create(url)) - .timeout(Duration.ofSeconds(30 * attempt)) // увеличиваем таймаут с каждой попыткой + .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(); @@ -238,7 +209,7 @@ public class FabricInstaller { } } } - + throw lastException; } 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 a2670aa..3c76009 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 @@ -79,10 +79,9 @@ public class VersionInstaller { String assetIndex; if (versionData.has("assetIndex")) { - JSONObject assetIndexObj = versionData.getJSONObject("assetIndex"); - assetIndex = assetIndexObj.getString("id"); // ← это "5" для 1.20.1 + assetIndex = versionData.getJSONObject("assetIndex").getString("id"); } else { - assetIndex = versionData.getString("assets"); // fallback + assetIndex = versionData.getString("assets"); } System.out.println(ZAnsi.cyan("Asset index: " + assetIndex)); @@ -193,14 +192,17 @@ public class VersionInstaller { } } - public String getAssetIndexForVersion(String versionId) throws Exception { + public String getAssetIndexId(String versionId) throws Exception { String versionUrl = getVersionUrl(versionId); - if (versionUrl == null) throw new Exception("Версия " + versionId + " не найдена"); - + if (versionUrl == null) throw new Exception("Версия не найдена"); + String versionJson = downloadString(versionUrl); JSONObject versionData = new JSONObject(versionJson); - - return versionData.getString("assets"); + + if (versionData.has("assetIndex") && versionData.getJSONObject("assetIndex").has("id")) { + return versionData.getJSONObject("assetIndex").getString("id"); // "5" для 1.20.1 + } + return versionData.getString("assets"); // fallback (очень старые версии) } private String getVersionUrl(String versionId) throws Exception {