diff --git a/docs/DIARY.md b/docs/DIARY.md index cee405a..8cc78cf 100644 --- a/docs/DIARY.md +++ b/docs/DIARY.md @@ -4,7 +4,46 @@ уплотнения контекста ничего не терялось. Коротко: состояние, замеры, следующий шаг, грабли. -Обновлён: 2026-10-23, день. +Обновлён: 2026-10-24, день. + +--- + +## 0. SWEP: оружие из Lua в клиенте (2026-10-24, ветка `feat/swep`) + +Скрипты `lua/weapons/*.lua` (на реальных ассетах — `weapon_fists`, +`weapon_flechettegun`, `weapon_medkit`) теперь не просто загружаются, а +**управляют клиентом**: + +- `client/src/weapon.rs`: реестр из `list.Get("Weapon")`, фильтр + `Spawnable` + существующий `ViewModel` в VFS, слоты (`Slot`/`SlotPos`), + `SOURCE_RS_SWEP` для старта. Клавиши `1..9` выбирают слот 1..9, `0` — слот 0 + (кулаки). При смене вызываются `Holster` старого и `Deploy` нового, + вьюмодель пересоздаётся под `SWEP.ViewModel`. +- `client/src/map.rs`: `ViewModelState` (модель, покой/выстрел, пересоздание), + ЛКМ → `PrimaryAttack` активного SWEP, автоматический огонь по + `Primary.Automatic` с учётом `GetNextPrimaryFire`, `Think` каждый кадр, + HUD с `PrintName` и патронами (`Clip1`/`ClipSize`). +- `glua`: база SWEP (`swep_base.lua`), `GetOwner`/`GetViewModel`, `NetworkVar`, + `SetNextPrimaryFire`, `Clip1`, `EmitSound`; глобальные `CurTime`, `IsValid`, + `player.GetAll`, `util.TraceLine`/`TraceHull`, `trace.*`, `sound.*`; + `game.SinglePlayer` исправлен на **функцию** (как в GMod), `GetConVar` знает + `sv_defaultdeployspeed`/`phys_pushscale` (ноль давал `inf` в `Deploy`). +- Ошибка Lua в любом методе логируется и не роняет кадр; `Think` после ошибки + отключается для этого оружия. + +**Проверка (Xvfb, `--hidden`):** `SOURCE_RS_SWEP=weapon_*` + +`SOURCE_RS_TEST_ATTACK=1` (ЛКМ на 10-м кадре) и `SOURCE_RS_TEST_SWITCH=1` +(смена оружия каждые 10 кадров). Flechette за 10 кадров сделал 5 выстрелов +(`SetNextPrimaryFire` = 0.1), ошибок Lua нет. Кадры: +`/tmp/opencode/swep_fists.png`, `swep_flechette.png`, `swep_medkit.png`, +`swep_switch.png`. Тесты: `real_gmod_weapon_methods_run_without_errors` +прогоняет настоящие Deploy/PrimaryAttack/Think/Holster всех трёх SWEP. + +**Грабли:** `c_arms.mdl` — скелет без геометрии (`c_arms.vvd` = 0 вершин), руки +в GMod берутся из модели игрока. Пока bonemerge нет, вьюмодель кулаков +скрывается (HUD показывает оружие), а не подменяется пистолетом. `c_smg1` и +`c_medkit` рисуются, но общая проекция камеры (FOV 100, дистанция 26) делает их +мелкими: отдельный FOV/масштаб вьюмодели — следующий шаг. --- diff --git a/docs/PARITY.md b/docs/PARITY.md index 5536544..cc1382e 100644 --- a/docs/PARITY.md +++ b/docs/PARITY.md @@ -3133,6 +3133,14 @@ Sandbox. `gmod_tool` спавнить проп; оружие переключается по слотам; вьюмодель видна и двигается. +**Сделано (ветка `feat/swep`):** реестр SWEP из Lua с фильтром +`Spawnable`/`ViewModel`, слоты 0..9, `SOURCE_RS_SWEP`, `Holster`/`Deploy` при +смене, пересоздание вьюмодели, ЛКМ → `PrimaryAttack` (автоматический огонь по +`Primary.Automatic` и `GetNextPrimaryFire`), `Think` каждый кадр, HUD с +`PrintName`/патронами. Осталось: `SecondaryAttack` на ПКМ, отдельный FOV/масштаб +вьюмодели, проигрывание `SendViewModelMatchingSequence`, урон/эффекты, `DrawHUD` +скриптов. + ### A24. Q-меню спавна (spawnmenu) Меню спавна из `sandbox/gamemode/spawnmenu` (Lua + VGUI). У нас VGUI нет (P10), поэтому путь такой: сначала **консольные эквиваленты** (`gm_spawn`, `gm_give`,