GTA Presets — графические пресеты¶

GTA Presets — секция админ-панели для графических пресетов (settings.xml). Это не моды и не текстуры, а готовые settings.xml файлы которые юзер применяет одним кликом, чтобы выставить графику «Low / Medium / High / Ultra / Custom Hunter style».
Что это вообще¶
GTA V держит свои настройки графики в %USERPROFILE%\Documents\Rockstar Games\GTA V\settings.xml. В этом XML — все слайдеры из меню «Графика»: текстуры, тени, anti-aliasing, рефлексы и так далее.
Замена этого файла = моментальная смена настроек. Юзер не лезет в in-game меню, просто кликает «применить пресет Ultra Hunter».
Структура таблицы¶
create table gta_presets (
id uuid primary key,
name text not null, -- "Hunter Ultra"
description text,
preview_url text, -- скрин с настройками
payload_url text not null, -- R2 link на settings.xml
target_resolution text, -- "1920x1080" / "2560x1440"
target_gpu_tier text, -- "1060" / "3070" / "4090"
popularity int default 0,
is_deleted bool default false
);
Пресет привязан к разрешению и GPU tier для guidance. Юзеру с 1060-й бесполезно ставить пресет «Hunter Ultra 4K» — он будет лагать.
Handlers¶
["adminGtaPresetList"] = async _ => await _bridge.AdminGtaPresetListAsync(),
["adminGtaPresetUpload"] = ... // upload settings.xml + preview
["adminGtaPresetPatch"] = ... // edit name/description/target
["adminGtaPresetDelete"] = ... // soft-delete
["adminGtaPresetAnalyze"] = ... // парсинг settings.xml → читаемые поля
adminGtaPresetAnalyze¶
Самый интересный handler. Принимает локальный settings.xml, парсит его и возвращает readable summary: разрешение, FPS limit, текстуры, тени, MSAA.
public sealed class GtaSettingsAnalyzer
{
public GtaSettingsSummary Analyze(string xmlPath)
{
var doc = XDocument.Load(xmlPath);
var root = doc.Root!;
return new GtaSettingsSummary(
Resolution: $"{root.Element("graphics")!.Element("ScreenWidth")?.Value}" +
$"x{root.Element("graphics")!.Element("ScreenHeight")?.Value}",
VSync: ParseBool(root.Element("video")!.Element("VSync")?.Value),
TextureQuality: ParseEnum(root.Element("graphics")!.Element("TextureQuality")?.Value),
ShadowQuality: ParseEnum(root.Element("graphics")!.Element("Shadow_Quality")?.Value),
MsaaX: ParseEnum(root.Element("graphics")!.Element("MSAA")?.Value),
// ...
);
}
}
UI показывает админу: «Этот пресет 2560x1440, MSAA 4x, Tex Ultra, Shadow High». Админ верифицирует и публикует.
Применение у юзера¶
Юзер кликает «Apply preset» → GtaPresetApplyAsync:
public async Task<ApplyPresetResultDto> GtaPresetApplyAsync(string presetId)
{
var preset = await _supa.GetGtaPresetAsync(presetId);
var xmlBytes = await _assetCache.GetOrDownloadAsync(preset.PayloadUrl);
// Backup существующего settings.xml
var settingsPath = Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),
"Rockstar Games", "GTA V", "settings.xml");
if (File.Exists(settingsPath))
File.Copy(settingsPath, settingsPath + ".backup.xml", overwrite: true);
// Atomic replace
var temp = settingsPath + ".tmp";
await File.WriteAllBytesAsync(temp, xmlBytes);
File.Move(temp, settingsPath, overwrite: true);
return new ApplyPresetResultDto(true, BackupPath: settingsPath + ".backup.xml");
}
Backup нужен потому что юзер может захотеть откатить. Не делаем версионную историю — просто settings.xml.backup.xml рядом, перезаписываемый при каждом следующем apply'е.
Connection с GTA settings analyzer¶
Эта же GtaSettingsAnalyzer используется не только в админке, но и для юзерских settings. В Main → Settings → «Анализ настроек GTA» — мы читаем текущий settings.xml юзера, показываем что у него стоит, и предлагаем подходящие presets из каталога. Такой матчинг по GPU tier и resolution.
Где взять начальные пресеты¶
Изначально админ берёт settings.xml с известных «золотых» билдов GTA — например с тестового ПК с 4090, выкручиваем максимум, кладём как preset «Hunter 4K Ultra». Потом community присылает свои — добавляем.