diff --git a/launcher/launcher/src/main/java/sashegdev/zernmc/launcher/minecraft/launch/LaunchCommandBuilder.java b/launcher/launcher/src/main/java/sashegdev/zernmc/launcher/minecraft/launch/LaunchCommandBuilder.java index 159ebde..bac9b69 100644 --- a/launcher/launcher/src/main/java/sashegdev/zernmc/launcher/minecraft/launch/LaunchCommandBuilder.java +++ b/launcher/launcher/src/main/java/sashegdev/zernmc/launcher/minecraft/launch/LaunchCommandBuilder.java @@ -36,15 +36,37 @@ public class LaunchCommandBuilder { } command.add("-Djava.library.path=" + nativesDir.toAbsolutePath()); + String loaderType = instance.getLoaderType().toLowerCase(); + boolean isModloader = "fabric".equals(loaderType) || "forge".equals(loaderType) || "neoforge".equals(loaderType); + VersionManifest manifest = resolveVersionManifest(); - if (manifest != null) { + + // For modloaders, always use vanilla classpath with all libraries + if (isModloader) { + System.out.println(ZAnsi.cyan(" Modloader detected (" + loaderType + "), using vanilla classpath")); command.add("-cp"); - command.add(buildClasspathFromManifest(manifest)); + command.add(buildVanillaClasspath()); + command.add(getVanillaMainClass()); + command.addAll(getVanillaGameArguments(options)); + } else if (manifest != null) { + String classpath = buildClasspathFromManifest(manifest); + + // Fallback if classpath is empty + if (classpath.isEmpty() || classpath.equals(instance.getPath().resolve("versions").resolve(getVersionId()).resolve(getVersionId() + ".jar").toAbsolutePath().toString())) { + System.out.println(ZAnsi.yellow(" manifest classpath пустой, использую vanilla classpath")); + command.add("-cp"); + command.add(buildVanillaClasspath()); + command.add(getVanillaMainClass()); + command.addAll(getVanillaGameArguments(options)); + } else { + command.add("-cp"); + command.add(classpath); - String mainClass = resolveMainClass(manifest); - command.add(mainClass); + String mainClass = resolveMainClass(manifest); + command.add(mainClass); - command.addAll(resolveGameArguments(manifest, options)); + command.addAll(resolveGameArguments(manifest, options)); + } } else { command.add("-cp"); command.add(buildVanillaClasspath()); diff --git a/launcher/launcher/src/resources/ui/launcher.js b/launcher/launcher/src/resources/ui/launcher.js index 42f20d2..6edea1d 100644 --- a/launcher/launcher/src/resources/ui/launcher.js +++ b/launcher/launcher/src/resources/ui/launcher.js @@ -268,8 +268,10 @@ function startLogPolling() { // Game logs const gameResult = await apiCall('/game-logs'); + console.log('[DEBUG] Game logs request:', gameResult.success, 'length:', gameResult.data ? gameResult.data.length : 0); if (gameResult.success && gameResult.data && gameResult.data.length > lastGameLogLength) { const newLogs = gameResult.data.substring(lastGameLogLength); + console.log('[DEBUG] New game logs:', newLogs.substring(0, 200)); const lines = newLogs.split('\n').filter(l => l.trim()); lines.forEach(line => { log('[GAME] ' + line, 'info');