diff --git a/launcher/launcher/src/main/java/sashegdev/zernmc/launcher/ui/jfx/JFXLauncher.java b/launcher/launcher/src/main/java/sashegdev/zernmc/launcher/ui/jfx/JFXLauncher.java index af798dd..b2b3218 100644 --- a/launcher/launcher/src/main/java/sashegdev/zernmc/launcher/ui/jfx/JFXLauncher.java +++ b/launcher/launcher/src/main/java/sashegdev/zernmc/launcher/ui/jfx/JFXLauncher.java @@ -12,8 +12,12 @@ import me.sashegdev.zernmc.launcher.auth.AuthManager; import me.sashegdev.zernmc.launcher.minecraft.Instance; import me.sashegdev.zernmc.launcher.minecraft.InstanceManager; +import java.io.BufferedReader; import java.io.InputStream; import java.io.OutputStream; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; import java.util.jar.JarEntry; import java.util.jar.JarFile; import java.net.InetSocketAddress; @@ -86,6 +90,16 @@ public class JFXLauncher extends Application { return; } + String serverVersion = getServerVersion(); + if (serverVersion != null && !serverVersion.isEmpty()) { + System.out.println("[JFX] Загрузка assets через мета для версии " + serverVersion); + if (downloadAssetsFromMeta(serverVersion)) { + System.out.println("[JFX] Assets загружены через мета"); + return; + } + System.out.println("[JFX] Мета недоступна, использую fallback"); + } + System.out.println("[JFX] Извлечение assets из JAR..."); Path jarPath = Paths.get(JFXLauncher.class.getProtectionDomain().getCodeSource().getLocation().toURI()); if (Files.exists(jarPath) && jarPath.toString().endsWith(".jar")) { @@ -106,12 +120,83 @@ public class JFXLauncher extends Application { } } } - System.out.println("[JFX] Assets извлечены"); + System.out.println("[JFX] Assets извлечены из JAR"); } } catch (Exception e) { System.out.println("[JFX] Ошибка извлечения assets: " + e.getMessage()); } } + + private static String getServerVersion() { + try { + URL url = new URL("http://localhost:1582/launcher/version"); + HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + conn.setConnectTimeout(3000); + conn.setReadTimeout(3000); + if (conn.getResponseCode() == 200) { + try (BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()))) { + StringBuilder sb = new StringBuilder(); + String line; + while ((line = br.readLine()) != null) sb.append(line); + String response = sb.toString(); + int versionStart = response.indexOf("\"version\":\""); + if (versionStart >= 0) { + int afterVersion = versionStart + 11; + int versionEnd = response.indexOf("\"", afterVersion); + if (versionEnd > afterVersion) { + return response.substring(afterVersion, versionEnd); + } + } + } + } + } catch (Exception ignored) {} + return null; + } + + private static boolean downloadAssetsFromMeta(String version) { + try { + URL metaUrl = new URL("http://localhost:1582/launcher/meta/" + version); + HttpURLConnection conn = (HttpURLConnection) metaUrl.openConnection(); + conn.setConnectTimeout(5000); + conn.setReadTimeout(10000); + if (conn.getResponseCode() != 200) return false; + + try (BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()))) { + StringBuilder sb = new StringBuilder(); + String line; + while ((line = br.readLine()) != null) sb.append(line); + org.json.JSONObject meta = new org.json.JSONObject(sb.toString()); + + Path assetsDir = Paths.get("assets"); + Files.createDirectories(assetsDir); + + for (Object fileObj : meta.getJSONArray("files")) { + org.json.JSONObject file = (org.json.JSONObject) fileObj; + String path = file.getString("path"); + if (path.startsWith("assets/")) { + String downloadUrl = "http://localhost:1582/launcher/file/" + version + "/" + path; + Path outPath = assetsDir.resolve(path.substring(7)); + Files.createDirectories(outPath.getParent()); + + URL fileUrl = new URL(downloadUrl); + HttpURLConnection fileConn = (HttpURLConnection) fileUrl.openConnection(); + fileConn.setConnectTimeout(10000); + fileConn.setReadTimeout(30000); + if (fileConn.getResponseCode() == 200) { + try (InputStream is = fileConn.getInputStream()) { + Files.copy(is, outPath); + } + } + fileConn.disconnect(); + } + } + return true; + } + } catch (Exception e) { + System.out.println("[JFX] Ошибка загрузки через мета: " + e.getMessage()); + return false; + } + } @Override public void start(Stage stage) {