Smol Fixes Yoooo

This commit is contained in:
Sashegdev
2026-04-06 17:00:39 +00:00
parent 0b4af1353d
commit 94968e8e77
4 changed files with 65 additions and 33 deletions
+1 -1
View File
@@ -3,7 +3,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>me.sashegdev</groupId> <groupId>me.sashegdev</groupId>
<artifactId>ZernMCLauncher</artifactId> <artifactId>ZernMCLauncher</artifactId>
<version>1.0.3</version> <version>1.0.4</version>
<build> <build>
<plugins> <plugins>
<plugin> <plugin>
+5 -4
View File
@@ -131,15 +131,16 @@
<target> <target>
<echo file="../server/builds/build.version">${project.version}</echo> <echo file="../server/builds/build.version">${project.version}</echo>
<!-- Копируем JRE --> <!-- Копируем содержимое jre/jre21 в папку jre21 (без лишней вложенности) -->
<copy todir="../server/builds/jre21" overwrite="true"> <copy todir="../server/builds/jre21" overwrite="true">
<fileset dir="${user.home}/launcher/jre"/> <fileset dir="${user.home}/launcher/jre/jre21"/>
</copy> </copy>
<!-- Создаём zip --> <!-- Создаём zip только с .exe и jre21 (без .jar и build.version) -->
<zip destfile="../server/builds/ZernMCLauncher-${project.version}.zip" <zip destfile="../server/builds/ZernMCLauncher-${project.version}.zip"
basedir="../server/builds" basedir="../server/builds"
includes="ZernMCLauncher.exe,ZernMCLauncher.jar,build.version,jre21/**"/> includes="ZernMCLauncher.exe,jre21/**"
excludes="*.jar,build.version"/>
</target> </target>
</configuration> </configuration>
</execution> </execution>
@@ -191,26 +191,55 @@ public class FabricInstaller {
} }
private String getLatestInstallerVersion() throws Exception { private String getLatestInstallerVersion() throws Exception {
String url = "https://maven.fabricmc.net/net/fabricmc/fabric-installer/maven-metadata.xml"; // Пробуем HTTPS сначала
String xml = downloadString(url); 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("<latest>") + 8; for (String url : urls) {
int end = xml.indexOf("</latest>", start); try {
return xml.substring(start, end).trim(); String xml = downloadString(url);
int start = xml.indexOf("<latest>") + 8;
int end = xml.indexOf("</latest>", 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 { private String downloadString(String url) throws Exception {
HttpRequest request = HttpRequest.newBuilder() // Увеличиваем таймауты и добавляем ретраи
.uri(URI.create(url)) Exception lastException = null;
.timeout(Duration.ofSeconds(30))
.GET()
.build();
HttpResponse<String> resp = httpClient.send(request, HttpResponse.BodyHandlers.ofString()); for (int attempt = 1; attempt <= 3; attempt++) {
if (resp.statusCode() != 200) { try {
throw new IOException("HTTP " + resp.statusCode() + " при скачивании " + url); HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.timeout(Duration.ofSeconds(30 * attempt)) // увеличиваем таймаут с каждой попыткой
.header("User-Agent", "ZernMC-Launcher/1.0")
.GET()
.build();
HttpResponse<String> 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 { private void downloadFile(String url, Path target) throws Exception {
@@ -77,20 +77,22 @@ public class VersionInstaller {
System.out.println(ZAnsi.cyan("Скачивание библиотек...")); System.out.println(ZAnsi.cyan("Скачивание библиотек..."));
downloadLibraries(versionData.getJSONArray("libraries")); downloadLibraries(versionData.getJSONArray("libraries"));
// Ассеты - ЭТО ВАЖНО String assetIndex;
String assetIndex = versionData.getString("assets"); // Например "5" для 1.20.1
System.out.println(ZAnsi.cyan("Asset index из версии: " + assetIndex));
if (versionData.has("assetIndex")) { if (versionData.has("assetIndex")) {
System.out.println(ZAnsi.cyan("Скачивание ассетов...")); JSONObject assetIndexObj = versionData.getJSONObject("assetIndex");
downloadAssets(versionData); assetIndex = assetIndexObj.getString("id"); // это "5" для 1.20.1
System.out.println(ZAnsi.brightGreen("Asset index определён как: " + assetIndex));
} else { } 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 + " полностью установлен!")); System.out.println(ZAnsi.brightGreen("\nMinecraft " + versionId + " полностью установлен!"));
return assetIndex; // Возвращаем правильный индекс (например "5") return assetIndex; // возвращаем "5" а не "1.20.1"
} }
private void downloadLibraries(JSONArray libraries) throws Exception { private void downloadLibraries(JSONArray libraries) throws Exception {
@@ -119,23 +121,23 @@ public class VersionInstaller {
ProgressBar.finish("Библиотеки загружены"); 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"); JSONObject assetIndexInfo = versionData.getJSONObject("assetIndex");
String indexUrl = assetIndexInfo.getString("url"); String indexUrl = assetIndexInfo.getString("url");
String indexId = versionData.getString("assets");
Path indexesDir = minecraftDir.resolve("assets/indexes"); Path indexesDir = minecraftDir.resolve("assets/indexes");
Files.createDirectories(indexesDir); 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"); downloadFile(indexUrl, indexPath, "asset index");
String jsonContent = Files.readString(indexPath); String jsonContent = Files.readString(indexPath);
JSONObject root = new JSONObject(jsonContent); JSONObject root = new JSONObject(jsonContent);
JSONObject objects = root.getJSONObject("objects"); 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 total = objects.length();
int[] success = {0}; int[] success = {0};