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 348c9b7..3b5e38e 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 @@ -361,15 +361,11 @@ public class Bootstrap { log("Java: " + javaBin); log("JAR: " + jarPath); - // JVM аргументы для UTF-8 и JavaFX - List jvmArgs = List.of( - "-Dfile.encoding=UTF-8", - "-Dsun.stdout.encoding=UTF-8", - "-Dsun.stderr.encoding=UTF-8" - ); + Path consoleLog = logDir.resolve("console.log"); - // Путь к JavaFX модулям + // JVM аргументы для UTF-8 и JavaFX Path javafxPath = baseDir.resolve("lib").resolve("javafx"); + List jvmArgs; if (Files.exists(javafxPath)) { jvmArgs = List.of( "-Dfile.encoding=UTF-8", @@ -397,7 +393,10 @@ public class Bootstrap { ProcessBuilder pb = new ProcessBuilder(cmd); pb.directory(baseDir.toFile()); + + // inheritIO позволяет лаунчеру закрываться при закрытии консоли pb.inheritIO(); + Process p = pb.start(); int code = p.waitFor(); log("Завершено с кодом: " + code); diff --git a/launcher/launcher/src/main/java/sashegdev/zernmc/launcher/api/launch/LaunchService.java b/launcher/launcher/src/main/java/sashegdev/zernmc/launcher/api/launch/LaunchService.java index 921b56f..919e22f 100644 --- a/launcher/launcher/src/main/java/sashegdev/zernmc/launcher/api/launch/LaunchService.java +++ b/launcher/launcher/src/main/java/sashegdev/zernmc/launcher/api/launch/LaunchService.java @@ -46,8 +46,6 @@ public class LaunchService { return ApiResponse.error("Сборка не найдена: " + instanceName); } - JFXLauncher.initGameLog(instance.getPath()); - LaunchCommandBuilder builder = new LaunchCommandBuilder(instance); LaunchOptions options = new LaunchOptions(); @@ -63,42 +61,16 @@ public class LaunchService { ProcessBuilder processBuilder = new ProcessBuilder(command); processBuilder.directory(instance.getPath().toFile()); processBuilder.redirectErrorStream(true); + // Не перехватываем вывод игры - пусть выводится напрямую в консоль + // Инициализируем лог файл для игры, но не дублируем вывод + Path logsDir = instance.getPath().resolve("logs"); + java.nio.file.Files.createDirectories(logsDir); + Path gameLog = logsDir.resolve("game.log"); + processBuilder.redirectOutput(ProcessBuilder.Redirect.to(gameLog.toFile())); Process process = processBuilder.start(); System.out.println("[LAUNCH] Process started, pid=" + process.pid()); - // Capture output (stdout) - Thread outThread = new Thread(() -> { - try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) { - String line; - while ((line = reader.readLine()) != null) { - System.out.println("[STDOUT] " + line); - JFXLauncher.appendGameLog(line); - } - } catch (Exception e) { - System.out.println("[STDOUT ERROR] " + e.getMessage()); - JFXLauncher.appendGameLog("[Ошибка чтения вывода: " + e.getMessage()); - } - }); - outThread.setDaemon(true); - outThread.start(); - - // Capture errors (stderr) - Thread errThread = new Thread(() -> { - try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getErrorStream()))) { - String line; - while ((line = reader.readLine()) != null) { - System.out.println("[STDERR] " + line); - JFXLauncher.appendGameLog("[ERR] " + line); - } - } catch (Exception e) { - System.out.println("[STDERR ERROR] " + e.getMessage()); - JFXLauncher.appendGameLog("[Ошибка чтения ошибок: " + e.getMessage()); - } - }); - errThread.setDaemon(true); - errThread.start(); - ProcessInfo info = new ProcessInfo( instanceName, process.pid(),