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};