Багфиксы ClassPath
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
+20
-49
@@ -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();
|
||||||
|
|||||||
+8
-6
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user