# Launch Minecraft 1.20.1 (Forge 47.4.23) with OpenZen agent injected via -javaagent param( [string]$Username = "Player" ) $ErrorActionPreference = "Stop" $mcRoot = "C:\Users\Administrator\Desktop\nx\mc\.minecraft" $versionId = "1.20.1-Forge_47.4.23" $versionDir = Join-Path $mcRoot "versions\$versionId" $versionJson = Join-Path $versionDir "$versionId.json" $versionJar = Join-Path $versionDir "$versionId.jar" $nativesDir = Join-Path $versionDir "$versionId-natives" $libsDir = Join-Path $mcRoot "libraries" $assetsDir = Join-Path $mcRoot "assets" $agentJar = "C:\Users\Administrator\Desktop\nx\OpenZen\build\libs\hey-1.0.jar" $javaExe = "C:\Program Files\Common Files\Oracle\Java\javapath\javaw.exe" if (-not (Test-Path -LiteralPath $agentJar)) { throw "Agent jar not found: $agentJar (run gradlew build first)" } $json = Get-Content -LiteralPath $versionJson -Raw | ConvertFrom-Json # ---- classpath: windows-filtered libraries + client jar ---- $libPaths = New-Object System.Collections.Generic.List[string] foreach ($lib in $json.libraries) { if (-not ($lib.downloads -and $lib.downloads.artifact)) { continue } $allowed = $true if ($lib.rules) { $allowed = $false foreach ($r in $lib.rules) { if ($r.action -eq "allow" -and (-not $r.os -or $r.os.name -eq "windows")) { $allowed = $true; break } } } if ($allowed) { $p = Join-Path $libsDir $lib.downloads.artifact.path if (-not (Test-Path -LiteralPath $p)) { throw "Missing library: $p" } $libPaths.Add($p) } } $libPaths.Add($versionJar) $cp = $libPaths -join ";" # ---- module path: same jars as json "-p" argument ---- $moduleJarNames = @( "cpw/mods/bootstraplauncher/1.1.2/bootstraplauncher-1.1.2.jar", "cpw/mods/securejarhandler/2.1.10/securejarhandler-2.1.10.jar", "org/ow2/asm/asm-commons/9.9.1/asm-commons-9.9.1.jar", "org/ow2/asm/asm-util/9.9.1/asm-util-9.9.1.jar", "org/ow2/asm/asm-analysis/9.9.1/asm-analysis-9.9.1.jar", "org/ow2/asm/asm-tree/9.9.1/asm-tree-9.9.1.jar", "org/ow2/asm/asm/9.9.1/asm-9.9.1.jar", "net/minecraftforge/JarJarFileSystems/0.3.19/JarJarFileSystems-0.3.19.jar" ) $mp = ($moduleJarNames | ForEach-Object { Join-Path $libsDir $_ }) -join ";" # ---- offline auth (Mojang-style offline uuid) ---- $md5 = [System.Security.Cryptography.MD5]::Create() $hash = $md5.ComputeHash([Text.Encoding]::UTF8.GetBytes("OfflinePlayer:$Username")) $hash[6] = ($hash[6] -band 0x0F) -bor 0x30 $hash[8] = ($hash[8] -band 0x3F) -bor 0x80 $uuid = [Guid]$hash $uuidStr = $uuid.ToString().Replace("-", "") $accessToken = [Guid]::NewGuid().ToString().Replace("-", "") # ---- java argument file (JDK9+ @argfile, avoids cmd length limits) ---- function Add-Arg([System.Collections.Generic.List[string]]$list, [string]$arg) { if ($arg -match '\s') { $arg = '"' + $arg + '"' } $list.Add($arg) } $args = New-Object System.Collections.Generic.List[string] Add-Arg $args "-Xmx4G" Add-Arg $args "-XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe_minecraft.exe.heapdump" Add-Arg $args "-Xss1M" Add-Arg $args "-Djava.library.path=$nativesDir" Add-Arg $args "-Djna.tmpdir=$nativesDir" Add-Arg $args "-Dorg.lwjgl.system.SharedLibraryExtractPath=$nativesDir" Add-Arg $args "-Dio.netty.native.workdir=$nativesDir" Add-Arg $args "-Dminecraft.launcher.brand=PCL2" Add-Arg $args "-Dminecraft.launcher.version=2.9.3" Add-Arg $args "-Djava.net.preferIPv6Addresses=system" Add-Arg $args "-DignoreList=bootstraplauncher,securejarhandler,asm-commons,asm-util,asm-analysis,asm-tree,asm,JarJarFileSystems,client-extra,fmlcore,javafmllanguage,lowcodelanguage,mclanguage,forge-,$versionId.jar" Add-Arg $args "-DmergeModules=jna-5.10.0.jar,jna-platform-5.10.0.jar" Add-Arg $args "-DlibraryDirectory=$libsDir" Add-Arg $args "-p" Add-Arg $args $mp Add-Arg $args "--add-modules" Add-Arg $args "ALL-MODULE-PATH" Add-Arg $args "--add-opens" Add-Arg $args "java.base/java.util.jar=cpw.mods.securejarhandler" Add-Arg $args "--add-opens" Add-Arg $args "java.base/java.lang.invoke=cpw.mods.securejarhandler" Add-Arg $args "--add-exports" Add-Arg $args "java.base/sun.security.util=cpw.mods.securejarhandler" Add-Arg $args "--add-exports" Add-Arg $args "jdk.naming.dns/com.sun.jndi.dns=java.naming" Add-Arg $args "-javaagent:$agentJar" Add-Arg $args "-cp" Add-Arg $args $cp Add-Arg $args $json.mainClass Add-Arg $args "--launchTarget"; Add-Arg $args "forgeclient" Add-Arg $args "--fml.forgeVersion"; Add-Arg $args "47.4.23" Add-Arg $args "--fml.mcVersion"; Add-Arg $args "1.20.1" Add-Arg $args "--fml.forgeGroup"; Add-Arg $args "net.minecraftforge" Add-Arg $args "--fml.mcpVersion"; Add-Arg $args "20230612.114412" Add-Arg $args "--username"; Add-Arg $args $Username Add-Arg $args "--version"; Add-Arg $args $versionId Add-Arg $args "--gameDir"; Add-Arg $args $versionDir Add-Arg $args "--assetsDir"; Add-Arg $args $assetsDir Add-Arg $args "--assetIndex"; Add-Arg $args "5" Add-Arg $args "--uuid"; Add-Arg $args $uuidStr Add-Arg $args "--accessToken"; Add-Arg $args $accessToken Add-Arg $args "--userType"; Add-Arg $args "msa" Add-Arg $args "--versionType"; Add-Arg $args "OpenZen" $argFile = Join-Path $env:TEMP "opencode\mc-launch-args.txt" New-Item -ItemType Directory -Force -Path (Split-Path $argFile) | Out-Null Set-Content -LiteralPath $argFile -Value $args -Encoding ASCII Write-Output "Arg file: $argFile" Write-Output "Agent : $agentJar" Write-Output "Username: $Username (offline uuid $uuidStr)" # ---- launch ---- $proc = Start-Process -FilePath $javaExe -ArgumentList "@`"$argFile`"" -WorkingDirectory $versionDir -PassThru Write-Output ("Game process started, PID: " + $proc.Id)