From 1d5241075b8bfaea557cd0649bf263aea7d0317c Mon Sep 17 00:00:00 2001 From: SashegDev Date: Sun, 10 May 2026 01:46:38 +0000 Subject: [PATCH] =?UTF-8?q?=D0=98=D0=9D=D0=A2=D0=95=D0=A0=D0=A4=D0=95?= =?UTF-8?q?=D0=99=D0=A1=20=D0=A4=D0=98=D0=9A=D0=A1=D0=95=D0=A1=D0=A1=D0=A1?= =?UTF-8?q?=D0=A1=20=D0=91=D0=9B=D0=AF=D0=AF=D0=AF=20=D0=B0=20=D1=82=D0=B0?= =?UTF-8?q?=D0=BA=20=D0=B6=D0=B5=20=D1=84=D0=B8=D0=BA=D1=81=20CLI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sashegdev/zernmc/launcher/Bootstrap.java | 24 ++++++++------- .../java/sashegdev/zernmc/launcher/Main.java | 2 ++ .../zernmc/launcher/ui/jfx/JFXLauncher.java | 29 ++++++++++++++++--- .../launcher/src/resources/ui/launcher.js | 5 ++++ launcher/launcher/src/resources/ui/style.css | 2 ++ 5 files changed, 48 insertions(+), 14 deletions(-) diff --git a/launcher/bootstrap/src/main/java/me/sashegdev/zernmc/launcher/Bootstrap.java b/launcher/bootstrap/src/main/java/me/sashegdev/zernmc/launcher/Bootstrap.java index 3b5e38e..3dc0af1 100644 --- a/launcher/bootstrap/src/main/java/me/sashegdev/zernmc/launcher/Bootstrap.java +++ b/launcher/bootstrap/src/main/java/me/sashegdev/zernmc/launcher/Bootstrap.java @@ -354,7 +354,7 @@ public class Bootstrap { } private static void launchJFX() throws Exception { - Path javaBin = findJava(); + Path javaBin = findJava(false); // false = use javaw for GUI mode Path jarPath = getLauncherJar(); log("Запуск JFX режима..."); @@ -393,8 +393,6 @@ public class Bootstrap { ProcessBuilder pb = new ProcessBuilder(cmd); pb.directory(baseDir.toFile()); - - // inheritIO позволяет лаунчеру закрываться при закрытии консоли pb.inheritIO(); Process p = pb.start(); @@ -404,8 +402,8 @@ public class Bootstrap { } private static void launchCLI() throws Exception { - Path javaBin = findJava(); - Path jarPath = getLauncherJar(); + Path javaBin = findJava(true); + Path jarPath = getLauncherJar(); // <-- added this line log("Запуск CLI режима..."); log("Java: " + javaBin); @@ -428,17 +426,23 @@ public class Bootstrap { ProcessBuilder pb = new ProcessBuilder(cmd); pb.directory(baseDir.toFile()); - pb.inheritIO(); - Process p = pb.start(); + pb.redirectErrorStream(true); + + Process p = pb.inheritIO().start(); int code = p.waitFor(); log("Завершено с кодом: " + code); System.exit(code); } - private static Path findJava() { + private static Path findJava(boolean needConsole) { String os = System.getProperty("os.name").toLowerCase(); - // Используем javaw для скрытия консоли в JFX режиме - String javaExe = os.contains("windows") ? "javaw.exe" : "java"; + String javaExe; + + if (needConsole || !os.contains("windows")) { + javaExe = "java"; + } else { + javaExe = "javaw.exe"; + } // Сначала ищем jre21/bin/java рядом с лаунчером Path javaBin = baseDir.resolve("jre21").resolve("bin").resolve(javaExe); diff --git a/launcher/launcher/src/main/java/sashegdev/zernmc/launcher/Main.java b/launcher/launcher/src/main/java/sashegdev/zernmc/launcher/Main.java index 836bc1f..6c76cf3 100644 --- a/launcher/launcher/src/main/java/sashegdev/zernmc/launcher/Main.java +++ b/launcher/launcher/src/main/java/sashegdev/zernmc/launcher/Main.java @@ -84,6 +84,8 @@ public class Main { System.out.println(ZAnsi.brightGreen("Добро пожаловать обратно, " + sessionInfo.getUsername() + "!")); } + System.out.println(ZAnsi.cyan("Запуск CLI режима...")); + // === ГЛАВНЫЙ ЦИКЛ === try { mainLoop(); 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 3568cfb..9a496e6 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 @@ -13,6 +13,7 @@ import me.sashegdev.zernmc.launcher.api.launch.LaunchService; import me.sashegdev.zernmc.launcher.auth.AuthManager; import me.sashegdev.zernmc.launcher.minecraft.Instance; import me.sashegdev.zernmc.launcher.minecraft.InstanceManager; +import me.sashegdev.zernmc.launcher.minecraft.MinecraftLib; import me.sashegdev.zernmc.launcher.minecraft.launch.LaunchCommandBuilder; import java.io.BufferedReader; @@ -427,8 +428,9 @@ public class JFXLauncher extends Application { String name = body.get("name"); String version = body.get("version"); String loader = body.get("loader"); + String loaderVersion = body.get("loaderVersion"); - log("Установка: " + name + " " + version + " " + loader); + log("Установка: " + name + " " + version + " " + loader + (loaderVersion != null ? " " + loaderVersion : "")); var createResult = api.instances().createInstance(name); if (!createResult.isSuccess()) { @@ -440,11 +442,30 @@ public class JFXLauncher extends Application { if (instance != null) { instance.setMinecraftVersion(version); instance.setLoaderType(loader); + if (loaderVersion != null) { + instance.setLoaderVersion(loaderVersion); + } + + MinecraftLib lib = new MinecraftLib(instance); + + boolean success = false; + if ("vanilla".equalsIgnoreCase(loader)) { + success = lib.installMinecraft(version); + } else { + success = lib.installPack(name, version, loader, loaderVersion != null ? loaderVersion : ""); + } + + if (success) { + log("Установлено: " + name); + sendJson(exchange, Map.of("success", true, "data", true)); + } else { + sendJson(exchange, Map.of("success", false, "error", "Ошибка установки")); + } + } else { + sendJson(exchange, Map.of("success", false, "error", "Instance not found")); } - - sendJson(exchange, Map.of("success", true, "data", true)); - log("Установлено: " + name); } catch (Exception e) { + log("Ошибка установки: " + e.getMessage()); sendJson(exchange, Map.of("success", false, "error", e.getMessage())); } } diff --git a/launcher/launcher/src/resources/ui/launcher.js b/launcher/launcher/src/resources/ui/launcher.js index 01425cf..43abafb 100644 --- a/launcher/launcher/src/resources/ui/launcher.js +++ b/launcher/launcher/src/resources/ui/launcher.js @@ -683,6 +683,11 @@ class LauncherApp { entry.className = 'log-entry ' + type; entry.textContent = '[' + new Date().toLocaleTimeString() + '] ' + message; container.appendChild(entry); + + while (container.children.length > 500) { + container.removeChild(container.firstChild); + } + container.scrollTop = container.scrollHeight; } diff --git a/launcher/launcher/src/resources/ui/style.css b/launcher/launcher/src/resources/ui/style.css index 70f509a..e8b066e 100644 --- a/launcher/launcher/src/resources/ui/style.css +++ b/launcher/launcher/src/resources/ui/style.css @@ -500,6 +500,7 @@ body { flex-direction: column; padding: 20px; background: var(--bg-primary); + height: 100%; } .logs-section { @@ -510,6 +511,7 @@ body { border-radius: var(--radius-md); border: 1px solid var(--border-color); overflow: hidden; + min-height: 0; } .logs-header {