gmod-rs/docs/RECON.md
Niko Marmeladkov dec5b2c48f sprint 0: workspace, tier/fs/math, VPK v1/v2 с CRC, окно SDL3+wgpu на Vulkan
- crates/tier: tracing-логи, конвары с реестром, конфиг TOML, авто-детект ассетов
- crates/fs: bounded-парсер VPK v1/v2 (preload, встроенные данные, внешние архивы),
  VirtualFs с приоритетами и защитой от traversal, CRC-проверка
- crates/math: Vec3/Angle/Aabb
- crates/client (gmod-rs): fs doctor / fs cat, окно SDL3+wgpu 30, FPS в заголовке и логе
- тесты на реальных VPK (~/gmod_server/server): 9 контейнеров, 77 933 записи, 0 ошибок CRC
- CI-скелет, fuzz-таргет vpk_parse, config.example.toml, обновление docs
2026-10-11 22:47:09 +03:00

6.9 KiB
Raw Blame History

Разведка (снято 2026-10-11)

1. Окружение разработки

  • OS: Linux x86_64 · CPU: 16 ядер · RAM: 31 ГБ (доступно ~17) · Swap: 8 ГБ
  • GPU: NVIDIA RTX 3060 (GA106) → Vulkan через wgpu
  • Rust: 1.97.1 (cargo 1.97.1)
  • Домашний каталог: /home/niko

2. Каталоги

  • ~/garrysmod-rs — корень проекта (на момент разведки пустой; сессия переведена сюда)
  • ~/source-rs — пустой, не используется (оставлен как есть)

3. Целевой сервер: ClassicBox

  • Адрес: 194.147.90.27:24215
  • A2S-инфо (2026-10-11): имя ClassicBox, карта gm_mobenix_v3_final, игра garrysmod, тип Sandbox, 36/46 игроков, Linux DS, VAC=1 (\x01), теги: gm:sandbox gmc:other loc:ru ver:260917
  • Вывод для плана: цель по нагрузке — 46–64 живых игрока и типичный сандбокс-набор (пропы, констрейны, PAC3/Starfall у игроков), открытая карта.

4. Локальные ассеты и полигон

  • GMod Dedicated Server: ~/gmod_server/server
    • garrysmod/garrysmod_{000,001,002}.vpk (~772 МБ) + fallbacks_*.vpk (~104 МБ)
    • sourceengine/* (hl2_* vpk), platform/*
    • garrysmod/mount.cfg, gameinfo.txt — порядок монтирования и mounts
    • srcds_linux — локальный сервер для автотестов (sv_lan)
    • garrysmod.ver: 260508 prerelease
  • Steam-клиент GMod: ~/.local/share/Steam/steamapps/common/GarrysMod — заглушка ~32 КБ (полного клиентского контента нет). Для рендера используем DS-ассеты.
  • Workshop: ~/.local/share/Steam/steamapps/workshop/content/4000 — пусто.

5. Инструменты пользователя

  • ~/glua-steal (исходники, C++) и ~/gluasteal (рабочий каталог с config.toml) — дампер клиентского/шаренного Lua с серверов, исполнитель Lua, блокировщик файлов. Полезен как:
    • источник тест-корпуса Lua (дампить ClassicBox);
    • источник требований к защите путей при загрузке файлов с сервера. Лицензию glua-steal отдельно проверить перед заимствованием идей (код не копируем).

6. Референс-проекты

Проект Что даёт Ограничения
SourceDotNET/Source.NET Структура Stage-слоёв Source; рабочий сетевой стек и подключение к реальным GMod-серверам; зачатки Lua C#, GL46, только UnlitGeneric, физика Jitter-враппер, нет анимаций, Source 1 SDK License
Leystryku/leysourceengineclient Базовый сетевой протокол для внешних клиентов —
ValveSoftware/source-sdk-2013 Спецификация: net_chan, dt_*, studio, шейдеры, VGUI, предсказание Лицензия SDK (только для модов Source) — берём как спеку
nillerusr/source-engine Кроссплатформенный порт: Linux-специфика, шейдерные переводы SDK-лицензия
wiki.facepunch.com/gmod Lua API и поведение движка —
gluasteal Требования к безопасности загрузки файлов проверить лицензию

7. Ключевые факты о GMod, влияющие на план

  • Клиент исторически 32-битный (есть 64-битная бета) → у нас сразу x86_64.
  • Lua: LuaJIT (семантика 5.1).
  • PAC3/Starfall — аддоны внутри GMod Lua (Starfall несёт свой интерпретатор) → наша задача = движковый API + sandbox; их логику не переписываем.
  • Скачиваемые с сервера файлы: Lua + контент; LZMA-сжатие (уточнить capture'ами в M2).
  • Сервер может требовать Steam-тикет (ClassicBox VAC=1) → steamworks-rs с M2, fallback noSteam конваром.
  • В DS-установке есть базовые lua-файлы игры — референс порядка bootstrap Lua-рантайма.

8. Лицензии и правовая позиция

  • Цель проекта — личный клиент для игры на серверах; ассеты берутся из локальных установок пользователя и не распространяются.
  • Source SDK 2013 и Source.NET — Source 1 SDK License: код не копируем, используем как спецификацию форматов и поведения.
  • Наш код — собственный (clean-room по форматам/поведению).

9. Тестовый контур

Контур Использование
Локальный srcds_linux (~/gmod_server/server) Контролируемые сценарии, синтетика (2000 пропов, 500 констрейнов)
Packet dump/replay Воспроизведение прод-нагрузки без сервера
ClassicBox (live) Финальные проверки (36–46 игроков), аккуратно и по делу
Fuzz-стенды vpk/bsp/mdl/vtf/pcf/сеть — cargo-fuzz

10. Заметки спринта 0 (обновляется по ходу)

  • VPK в установке: 9 *_dir.vpk (77 933 записи, 41 архив) — garrysmod (v2, 15 324 записи), fallbacks, hl2_{textures,misc,sound_misc,sound_vo_english}, content_hl2, content_cstrike, platform_misc. CS:S-контент присутствует (важно для gm_mobenix).
  • Формат VPK сверен с ValvePak (VRF): терминаторы, preload, встроенные данные, внешние архивы <stem>_NNN.vpk; парсер bounded и fuzz-устойчив.
  • fs doctor: 0 ошибок CRC на выборке; fs cat читает MDL (IDST) и текстовые файлы из VPK.
  • Клиент: SDL3 (собран из исходников, feature build-from-source) + wgpu 30. Запуск проверен: NVIDIA RTX 3060, Vulkan, ~58–63 FPS (vsync), чистое завершение по --frames.
  • wgpu 30: API проверено по примеру sdl3-rs (raw-window-handle-with-wgpu); заголовок окна обновляется через sdl3::sys (метод крейта требует &mut Window).