bdf0ae866a
Проект начинается с двух вещей: клиент, который мы действительно собрали, и загрузчик, который является его частью, а не чем-то рядом. Форк - prepare-game.ps1 пересобирает клиент целиком: ванильный jar, SRG и MCP, SpecialSource, FernFlower, патчи, автофиксеры, javac. Идемпотентен. - Свой код игры лежит в src-overlay, потому что src пересоздаётся при каждой сборке и всё написанное вручную там погибает. - 116 патчей в patches/decompiler-fixes.txt. Каждый сверялся с оригинальным байткодом через javap: компиляция не ловит ошибки декомпиляции. - struct_diff.py сравнивает исходный байткод с нашей сборкой по классам, интерфейсам, суперклассам, методам и полям, и отдельно проверяет, что пропавшие классы действительно никому не нужны. Загрузчик - Собирается и тестируется без игры: build.ps1 не использует classpath вообще, поэтому SelfTest из 128 проверок проходит без запущенного форка. - Клиентский API не содержит ни одного игрового типа, реализацию даёт игра. - Политика: мод меняет то, что клиент показывает, но никогда то, что истинно в мире. Мир, предметы, игроки и сеть принадлежат серверу. - Capability приведены в соответствие с этой политикой: осталось шесть, и за каждым стоит реальная проверка. Прежние WORLD, PLAYER, NETWORK, TEXT, INPUT и COMMAND выдавались, но ничего не проверяли. - Команды модов имеют область CLIENT, SERVER или BOTH. Серверные не выполняются на клиенте никогда. - Свой jar загрузчика лежит в classpath игры и сборки форка. Инструменты - add_patch.py, чтобы каждое исправление переживало передекомпиляцию - find_self_comparisons.py, find_remove_index_bugs.py, find_callers.py - stage_run.py и fetch_missing.py для запуска клиента
63 lines
2.3 KiB
PowerShell
63 lines
2.3 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 = @(),
|
|
[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' }
|
|
|
|
$assets = "$env:APPDATA\AstralRinthApp\meta\assets"
|
|
$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 += '--assetIndex'; $javaArgs += '1.12'
|
|
$javaArgs += '--uuid'; $javaArgs += '00000000000000000000000000000000'
|
|
$javaArgs += '--accessToken'; $javaArgs += '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 |