diff --git a/docs/PLAN.md b/docs/PLAN.md index c9de7e8..eb3f289 100644 --- a/docs/PLAN.md +++ b/docs/PLAN.md @@ -135,13 +135,54 @@ Source RS — клиент Garry's Mod, написанный с нуля на Ru - [x] Версия клиента в connect берётся из A2S-версии сервера (иначе `#GameUI_ServerRejectNewVersion`) - [x] CLI: `net info `, `net connect ` -- [ ] Подканалы/фрагменты надёжного потока (первый reliable-пакет содержит - subchannel-данные — их разбор откроет доступ к SVC_ServerInfo и signon) +- [x] Подканалы/фрагменты надёжного потока: `NetChan` (single/fragments, сжатие, + varint, сборка потоков, разбор сообщений); GMod-флаги (Challenge=0x20, + subchannel 4 бита) сверены с трафиком ClassicBox +- [x] Steam-тикет: клиент живёт всю сессию, ждём `AuthSessionTicketResponse`, + свежий тикет при повторных connect (challenge одноразовый) +- [ ] **Нерешённое**: сервер после `S2C.Connection` шлёт challenge-пакеты и через + ~1.5 с отключает (`NET_Disconnect: Client dropped by server`); кик не зависит + от наших пакетов (подробности и все проверенные гипотезы — в docs/RECON.md §11) - [ ] Полный signon: stringtables, datatables, baselines, снапшоты - [ ] Packet dump/replay стенд - [ ] Workshop через ISteamUGC (подписка/скачивание/монтирование) -Приёмка v0 достигнута: хендшейк и Steam-вход работают на живом ClassicBox. +Приёмка v0 достигнута: хендшейк и Steam-вход работают на живом ClassicBox +(до кика сервером; причина кика исследуется). + +### M3 — Рендер мира + interest-система (v1) + +**Сделано (v0/v1, 2026-10-11/12):** +- [x] `engine::world`: браш-грани, displacement'ы (ориентация по startPosition + + порядок обхода, нормали наружу), лайтмапы в вершинах, VMT/VTF-материалы, + pakfile карты, скайбокс 2D (`skyname`) +- [x] `render::WorldRenderer`: батчи по материалам, depth, PNG-захват (BGRA-фикс), + debug-материалы, `--only-material`, `--dump-textures` +- [x] Камера + ходьба: `engine::player` — AABB против брашей (BSP v20) и + displacement-треугольников (SAT + сетка), гравитация/прыжок/присед/noclip +- [x] Энтити-модели: `engine::model` (MDL+VVD+VTX, bind pose), prop_static/ + prop_dynamic/prop_physics в общий меш мира +- [x] 3D-скайбокс: выделение скайбокс-граней (AABB sky_camera), сжатие 1/scale, + отдельный пайплайн; 2D-скайбокс в незакрытых пикселях +- [x] HUD: 2D-текст (bitmap 8x8, `render::text`), FPS/позиция/режим/лог +- [x] Меню: `menu` (выбор карты из VFS, Enter — запуск) +- [ ] Куллинг/инстансинг, атлас лайтмапов, прозрачность/вода (SURF_WARP) +- [ ] Анимации моделей (парсинг seqdesc/animdesc начат; форматы RLE/raw сверяются) +- [ ] Звук, частицы, декали, оверлеи + +### M7 — Lua: машинерия + HUD/UI (частично, 2026-10-12) + +**Сделано (v0):** +- [x] `glua`: LuaJIT (mlua vendored), print/Msg, hook.Add/Remove/Call, + timer.Simple, concommand.Add, CreateConVar/GetConVar, util/engine/game + заглушки, FCVAR_* +- [x] Препроцессор GMod-синтаксиса: `!` → `not`, `!=` → `~=`, `&&` → `and`, + `||` → `or` (вне строк/комментариев) — оригинальные клиентские скрипты GMod + (demo_recording.lua, gm_demo.lua) грузятся +- [x] Автозагрузка `lua/autorun/client/*.lua` из VFS, Think-хук и таймеры в кадре, + вывод в HUD-лог; `lua run `, `lua list` +- [ ] surface/draw/render-таргеты, Derma, Entity/Player API, серверный Lua +- [ ] Загрузка lua с сервера (download-кэш), safe mode ### M3 — Рендер мира + interest-система (v1)