HUD: моды рисуют через собственный API игры
Хук в отрисовку компаса. Выбор не случайный: виджет рисуется только пока виден HUD-сло�� игры, поэтому панель бесплатно наследует и видимость, и масштаб, и состояние горячей клавиши, которая HUD прячет. Дублировать логику клавиш не пришлось. Бридж зашивает ASM и регистрирует ClassFileTransformer, который дописывает вызов rsx.HudHook.render перед возвратом метода. Профиль диктует цель, обфусцированных имён в коде нет. Трансформер отдаёт контекст как Object: так один дескриптор работает при любом переименовании класса контекста. Привязка к API отрисовки трёхуровневая, и каждая ступень умеет отвалиться отдельно: точное совпадение по дескриптору, затем по имени и числу аргументов (класс текстуры грузится позже, чем привязка), затем по runtime-классу билдера, который мы держим в руках. Не нашлось - пишем в лог один раз и гасим только эту возможность. Текст рисуется ванильной текстурой textures/font/ascii.png: у игры нет однострочного текстового API, а для цифр и меток атласа хватает. Своим TTF конвейером мы не занимались. Стенд учит подделки: батч, билдер, команду, реестр текстур, масштаб, синглтон экрана и виджет-компас. Проверяет, что панель рисует плашку и глифы с верными координатами и что замолкает, когда игра прячет HUD. С отключённым хуком падают пять проверок из двадцати пяти. Профиль: hook.hud, экран HUD, батч, реестр текстур, масштаб и сетевые методы NetHandlerPlayClient. У каждой строки - рецепт поиска после реобфускации.
This commit is contained in:
+13
-1
@@ -35,10 +35,22 @@ $agentOut = Join-Path $Out 'agent'
|
||||
Remove-Item $agentOut -Recurse -Force -ErrorAction SilentlyContinue
|
||||
New-Item -ItemType Directory -Force -Path $agentOut | Out-Null
|
||||
$agentFiles = Get-ChildItem $agentSrc -Recurse -Filter '*.java' | ForEach-Object { $_.FullName }
|
||||
& javac -encoding UTF-8 --release 8 -nowarn -d $agentOut $agentFiles
|
||||
& javac -encoding UTF-8 --release 8 -nowarn -cp ($Asm -join ';') -d $agentOut $agentFiles
|
||||
if ($LASTEXITCODE -ne 0) { Write-Host ' Агент не собрался.' -ForegroundColor Red; exit 1 }
|
||||
Say "агент скомпилирован ($($agentFiles.Count) файлов)"
|
||||
|
||||
# The agent rewrites bytecode at runtime to give mods the game's own HUD, so it
|
||||
# carries ASM inside rather than making every install provide it.
|
||||
foreach ($jar in $Asm) {
|
||||
Push-Location $agentOut
|
||||
& jar xf $jar
|
||||
Pop-Location
|
||||
}
|
||||
Get-ChildItem (Join-Path $agentOut 'META-INF') -Recurse -ErrorAction SilentlyContinue |
|
||||
Remove-Item -Recurse -Force -ErrorAction SilentlyContinue
|
||||
Remove-Item (Join-Path $agentOut 'module-info.class') -Force -ErrorAction SilentlyContinue
|
||||
Say 'ASM зашит в агент'
|
||||
|
||||
$manifest = Join-Path $Out 'agent-manifest.txt'
|
||||
@"
|
||||
Manifest-Version: 1.0
|
||||
|
||||
Reference in New Issue
Block a user