Files
RustNotMC/rsx-client/scripts/run-game.ps1
T
sasheg dev d2a0a7a93b Вход без пароля, права админа и F3+B
Аутентификация переделана по схеме пользователя: лаунчер — единственный
источник токена, сервер проверяет его сам и лаунчера не спрашивает.

- rsx-auth/GameToken: токен это base64url(payload) + "." + base64url(HMAC-SHA256),
  payload {uuid, nick, aud, exp, jti, typ}, typ = session или reload.
- Сессия живёт час, reload-токен полтора часа и только внутри игры. Пакет
  SessionReload продлевает сессию и выдаёт новый reload-токен.
- Сервер проверяет подпись, аудиенс, срок и совпадение uuid. HTTP-запрос к
  лаунчеру из сервера убран.
- Клиент: окно пароля убрано совсем, ник берётся из токена, клиент сам
  продлевает сессию за 5 минут до конца.
- Для локальной разработки сервер с --dev-token пишет свой токен в
  world/dev-token.txt, клиент берёт токен оттуда.
- Права админа: свой список world/admins.txt, перечитывается раз в 5 секунд,
  поэтому право снимается на лету. Пакет AdminState.
- Ванильные блоки мира ломает только админ, режим игры прав не даёт.
- F3+B только для админов: без прав показываем отказ, с правом включаются и
  ванильные хитбоксы, и наш отладочный рендер. Права сняли посреди просмотра —
  гаснут сразу.
- run-game.ps1 умеет -Token.

Проверено на живом сервере: own session ok, player in, rights of Player given.
Тесты: протокол 34, сервер 88, форк собирается чисто.
2026-10-22 08:51:27 +03:00

72 lines
2.9 KiB
PowerShell

# Launches the compiled fork as an ordinary client: no agent, no injection.
#
# run-game.ps1 [-Run <dir>] [-Java <exe>] [-ExtraArgs <string[]>]
#
# Stage first if run\classpath.txt is missing:
# python tools\stage_run.py <run> ..\..\game-fork\build\classes <meta>
param(
[string]$Run = 'G:\RustNotMC\run',
[string]$Java = '',
[string[]]$ExtraArgs = @(),
[string]$Token = '',
[int]$Width = 1280,
[int]$Height = 720
)
$ErrorActionPreference = 'Stop'
$root = 'G:\RustNotMC'
if (-not (Test-Path (Join-Path $Run 'classpath.txt'))) {
throw "no classpath.txt in $Run - run stage_run.py first"
}
if (-not $Java) {
$Java = Get-ChildItem "$env:APPDATA\AstralRinthApp\meta\java_versions" `
-Directory | Where-Object { $_.Name -like 'zulu17*' } | ForEach-Object {
Get-ChildItem $_.FullName -Recurse -Filter 'java.exe' -ErrorAction SilentlyContinue |
Select-Object -First 1 } | Select-Object -First 1 -ExpandProperty FullName
}
if (-not $Java) { throw 'no Java 17 found' }
# The launcher's asset store is index-based: indexes/1.12.json pointing at
# objects/<aa>/<sha1>. A 1.12.2 client wants <assetsDir>/minecraft/<path> and
# will not look in either of those. Pointing --assetsDir at the store root
# leaves the game running and looking correct, because language and textures
# come from the jar, while every sound is silently missing.
$store = "$env:APPDATA\AstralRinthApp\meta\assets"
$assets = Join-Path $Run 'assets'
& python (Join-Path $root 'rsx-client\tools\materialize_assets.py') $store $assets --index 1.12
if ($LASTEXITCODE -ne 0) { throw 'asset materialisation failed' }
$cp = (Get-Content (Join-Path $Run 'classpath.txt') -Raw).Trim()
$natives = Join-Path $Run 'natives'
# built as strings first: mixing '+' into an array literal folds the whole
# list into one element, because the comma binds tighter than the concatenation
$javaArgs = @()
$javaArgs += "-Djava.library.path=$natives"
$javaArgs += "-Dorg.lwjgl.librarypath=$natives"
$javaArgs += '-Dfile.encoding=UTF-8'
$javaArgs += '-cp'
$javaArgs += $cp
$javaArgs += 'net.minecraft.client.main.Main'
# singleplayer-only session: the client never validates this against Mojang
$javaArgs += '--username'; $javaArgs += 'Player'
$javaArgs += '--version'; $javaArgs += '1.12.2'
$javaArgs += '--gameDir'; $javaArgs += $Run
$javaArgs += '--assetsDir'; $javaArgs += $assets
$javaArgs += '--uuid'; $javaArgs += '00000000000000000000000000000000'
$javaArgs += '--accessToken'; $javaArgs += $(if ($Token) { $Token } else { '0' })
$javaArgs += '--userType'; $javaArgs += 'legacy'
$javaArgs += '--versionType'; $javaArgs += 'release'
$javaArgs += '--width'; $javaArgs += "$Width"
$javaArgs += '--height'; $javaArgs += "$Height"
$javaArgs += $ExtraArgs
Write-Host "java : $Java"
Write-Host "game : $Run"
Write-Host "assets : $assets"
Write-Host "args : $($javaArgs.Count)"
& $Java @javaArgs
exit $LASTEXITCODE