Багфиксы ClassPath

This commit is contained in:
Sashegdev
2026-04-06 18:17:07 +00:00
parent 94968e8e77
commit b47793b618
3 changed files with 43 additions and 61 deletions
@@ -20,6 +20,7 @@ public class Instance {
private boolean isServerPack; // флаг, что это сборка с сервера private boolean isServerPack; // флаг, что это сборка с сервера
private int serverVersion; // версия сборки на сервере private int serverVersion; // версия сборки на сервере
private String serverPackName; // имя пака на сервере private String serverPackName; // имя пака на сервере
private String fabricVersionId;
private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create();
@@ -60,6 +61,14 @@ public class Instance {
saveMetadata(); saveMetadata();
} }
public String getFabricVersionId() {
return fabricVersionId;
}
public void setFabricVersionId(String fabricVersionId) {
this.fabricVersionId = fabricVersionId;
}
public boolean isServerPack() { public boolean isServerPack() {
return isServerPack; return isServerPack;
@@ -30,30 +30,15 @@ public class FabricInstaller {
Path instancePath = instance.getPath(); Path instancePath = instance.getPath();
cleanOldFabricLoaders(); cleanOldFabricLoaders();
// Шаг 1: Устанавливаем vanilla и получаем assetIndex // Шаг 1: Устанавливаем vanilla и получаем правильный assetIndex
VersionInstaller versionInstaller = new VersionInstaller(instancePath); VersionInstaller versionInstaller = new VersionInstaller(instancePath);
String assetIndex = versionInstaller.install(minecraftVersion); String assetIndex = versionInstaller.install(minecraftVersion); // Теперь возвращает "5" вместо "1.20.1"
// ДОПОЛНИТЕЛЬНАЯ ПРОВЕРКА: если versionInstaller.install() вернул неправильный индекс System.out.println(ZAnsi.green("Asset index получен: " + assetIndex));
// (например, "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 // Сохраняем правильный assetIndex
instance.setAssetIndex(assetIndex); instance.setAssetIndex(assetIndex);
System.out.println(ZAnsi.green("Asset index сохранён: " + assetIndex)); instance.setMinecraftVersion(minecraftVersion);
// Шаг 2: Скачивание Fabric Installer // Шаг 2: Скачивание Fabric Installer
String installerVersion = getLatestInstallerVersion(); String installerVersion = getLatestInstallerVersion();
@@ -72,7 +57,9 @@ public class FabricInstaller {
System.out.println(ZAnsi.cyan("Запуск Fabric Installer...")); System.out.println(ZAnsi.cyan("Запуск Fabric Installer..."));
// Используем ProcessBuilder с правильными аргументами // Fabric создаёт версию: fabric-loader-{loaderVersion}-{minecraftVersion}
String fabricVersionId = "fabric-loader-" + loaderVersion + "-" + minecraftVersion;
ProcessBuilder pb = new ProcessBuilder( ProcessBuilder pb = new ProcessBuilder(
"java", "-jar", installerJar.toAbsolutePath().toString(), "java", "-jar", installerJar.toAbsolutePath().toString(),
"client", "client",
@@ -93,40 +80,31 @@ public class FabricInstaller {
return false; return false;
} }
// Проверка результата - Fabric создаёт папку versions/fabric-loader-{loaderVersion}-{minecraftVersion} // Проверяем, создалась ли папка с Fabric версией
String fabricVersionId = "fabric-loader-" + loaderVersion + "-" + minecraftVersion;
Path fabricVersionDir = instancePath.resolve("versions").resolve(fabricVersionId); 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)) { if (Files.exists(fabricVersionDir)) {
System.out.println(ZAnsi.brightGreen("Fabric успешно установлен!")); System.out.println(ZAnsi.brightGreen("Fabric успешно установлен!"));
System.out.println(ZAnsi.white("Версия: ") + fabricVersionId); System.out.println(ZAnsi.white("Версия: ") + fabricVersionId);
System.out.println(ZAnsi.white("Asset index: ") + assetIndex); System.out.println(ZAnsi.white("Asset index: ") + assetIndex);
// Сохраняем метаданные в Instance // Сохраняем метаданные
instance.setMinecraftVersion(minecraftVersion);
instance.setLoaderType("fabric"); instance.setLoaderType("fabric");
instance.setLoaderVersion(loaderVersion); instance.setLoaderVersion(loaderVersion);
// assetIndex уже сохранён выше, но сохраняем ещё раз для надёжности instance.setFabricVersionId(fabricVersionId); // <-- ВАЖНО: сохраняем ID Fabric версии
instance.setAssetIndex(assetIndex);
// Копируем или создаём ссылку на правильный asset index в версии Fabric // Исправляем asset index в JSON файле Fabric версии
ensureAssetIndexInFabricVersion(fabricVersionDir, assetIndex, minecraftVersion); ensureAssetIndexInFabricVersion(fabricVersionDir, assetIndex);
return true; return true;
} else { } else {
System.out.println(ZAnsi.brightRed("Fabric Installer отработал, но версия не найдена.")); System.out.println(ZAnsi.brightRed("Fabric Installer отработал, но версия не найдена."));
System.out.println(ZAnsi.yellow("Искали: " + fabricVersionDir)); System.out.println(ZAnsi.yellow("Искали: " + fabricVersionDir));
// Выводим содержимое папки versions для отладки // Отладка
Path versionsDir = instancePath.resolve("versions"); Path versionsDir = instancePath.resolve("versions");
if (Files.exists(versionsDir)) { if (Files.exists(versionsDir)) {
System.out.println(ZAnsi.cyan("Доступные версии в папке versions:")); System.out.println(ZAnsi.cyan("Доступные версии:"));
try (var stream = Files.list(versionsDir)) { try (var stream = Files.list(versionsDir)) {
stream.forEach(p -> System.out.println(" - " + p.getFileName())); stream.forEach(p -> System.out.println(" - " + p.getFileName()));
} }
@@ -135,10 +113,7 @@ public class FabricInstaller {
} }
} }
/** private void ensureAssetIndexInFabricVersion(Path fabricVersionDir, String assetIndex) throws IOException {
* Убеждаемся, что в JSON файле версии Fabric есть правильный asset index
*/
private void ensureAssetIndexInFabricVersion(Path fabricVersionDir, String assetIndex, String minecraftVersion) throws IOException {
Path versionJson = fabricVersionDir.resolve(fabricVersionDir.getFileName() + ".json"); Path versionJson = fabricVersionDir.resolve(fabricVersionDir.getFileName() + ".json");
if (!Files.exists(versionJson)) { if (!Files.exists(versionJson)) {
@@ -148,15 +123,14 @@ public class FabricInstaller {
String content = Files.readString(versionJson); String content = Files.readString(versionJson);
// Проверяем, есть ли в JSON правильный asset index // Проверяем и исправляем asset index
if (!content.contains("\"assets\":\"" + assetIndex + "\"")) { if (!content.contains("\"assets\":\"" + assetIndex + "\"")) {
System.out.println(ZAnsi.yellow("Исправляем asset index в JSON файле версии...")); System.out.println(ZAnsi.yellow("Исправляем asset index в JSON файле версии..."));
// Заменяем assets на правильное значение // Заменяем assets на правильное значение
// Ищем "assets": "что-то" и заменяем
content = content.replaceAll("\"assets\":\\s*\"[^\"]*\"", "\"assets\": \"" + assetIndex + "\""); content = content.replaceAll("\"assets\":\\s*\"[^\"]*\"", "\"assets\": \"" + assetIndex + "\"");
// Также проверяем assetIndex в downloads // Также проверяем assetIndex
if (content.contains("\"assetIndex\"")) { if (content.contains("\"assetIndex\"")) {
content = content.replaceAll("\"assetIndex\":\\s*\"[^\"]*\"", "\"assetIndex\": \"" + assetIndex + "\""); content = content.replaceAll("\"assetIndex\":\\s*\"[^\"]*\"", "\"assetIndex\": \"" + assetIndex + "\"");
} }
@@ -164,7 +138,7 @@ public class FabricInstaller {
Files.writeString(versionJson, content); Files.writeString(versionJson, content);
System.out.println(ZAnsi.green("Asset index исправлен на: " + assetIndex)); System.out.println(ZAnsi.green("Asset index исправлен на: " + assetIndex));
} else { } 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 { private String getLatestInstallerVersion() throws Exception {
// Пробуем HTTPS сначала
String[] urls = { String[] urls = {
"https://maven.fabricmc.net/net/fabricmc/fabric-installer/maven-metadata.xml", "https://maven.fabricmc.net/net/fabricmc/fabric-installer/maven-metadata.xml",
"http://maven.fabricmc.net/net/fabricmc/fabric-installer/maven-metadata.xml" "http://maven.fabricmc.net/net/fabricmc/fabric-installer/maven-metadata.xml"
@@ -205,22 +178,20 @@ public class FabricInstaller {
return xml.substring(start, end).trim(); return xml.substring(start, end).trim();
} catch (Exception e) { } catch (Exception e) {
System.out.println(ZAnsi.yellow("Не удалось получить версию из " + url + ": " + e.getMessage())); 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 { private String downloadString(String url) throws Exception {
// Увеличиваем таймауты и добавляем ретраи
Exception lastException = null; Exception lastException = null;
for (int attempt = 1; attempt <= 3; attempt++) { for (int attempt = 1; attempt <= 3; attempt++) {
try { try {
HttpRequest request = HttpRequest.newBuilder() HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url)) .uri(URI.create(url))
.timeout(Duration.ofSeconds(30 * attempt)) // увеличиваем таймаут с каждой попыткой .timeout(Duration.ofSeconds(30 * attempt))
.header("User-Agent", "ZernMC-Launcher/1.0") .header("User-Agent", "ZernMC-Launcher/1.0")
.GET() .GET()
.build(); .build();
@@ -79,10 +79,9 @@ public class VersionInstaller {
String assetIndex; String assetIndex;
if (versionData.has("assetIndex")) { if (versionData.has("assetIndex")) {
JSONObject assetIndexObj = versionData.getJSONObject("assetIndex"); assetIndex = versionData.getJSONObject("assetIndex").getString("id");
assetIndex = assetIndexObj.getString("id"); // ← это "5" для 1.20.1
} else { } else {
assetIndex = versionData.getString("assets"); // fallback assetIndex = versionData.getString("assets");
} }
System.out.println(ZAnsi.cyan("Asset index: " + assetIndex)); 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); String versionUrl = getVersionUrl(versionId);
if (versionUrl == null) throw new Exception("Версия " + versionId + " не найдена"); if (versionUrl == null) throw new Exception("Версия не найдена");
String versionJson = downloadString(versionUrl); String versionJson = downloadString(versionUrl);
JSONObject versionData = new JSONObject(versionJson); 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 { private String getVersionUrl(String versionId) throws Exception {