# Perf Этап 2b — presence-гейт для skill_unit_timer ## Что изменилось В `skill_unit_timer_sub` (per-unit AoE-скан, 100мс) добавлен гейт: если наземный скилл-юнит **может задеть ТОЛЬКО player-side цели** (PC / Homunculus / Mercenary) и в радиусе `unit->range` **нет ни одного** такого (по гриду присутствия `block_pc_count`), то per-tick скан (`map_foreachinshootrange`/`inrange`) **пропускается** — он всё равно никого не нашёл бы. **Важно (PvM не затронут):** юниты, чей `bl_flag` включает любые НЕ-player-side биты (BL_MOB и т.п.), **НЕ гейтятся** — `block_pc_count` не считает мобов, поэтому PvM-AoE и ловушки, срабатывающие на мобах, работают как раньше. Гейт срабатывает только для «чисто PvP» AoE без игроков рядом. Поведение-сохраняющее: пропускается лишь провально-пустой скан. ## Флаг `conf/battle/skill.conf`: ``` skill_unit_skip_noplayer: yes // yes (деф.) = пропускать пустые player-only сканы; no = всегда сканировать ``` `@reloadbattleconf` — A/B в одном бинарнике. ## Как замерить Под `UA_PERF=1`, сценарий с PvP-AoE/ловушками, где игроки то есть, то ушли из зоны: 1. `no` → профиль (скан идёт всегда). 2. `yes` → профиль. Эффект заметнее, когда AoE-юниты «доживают» в зонах без игроков (края WoE, после боя). Под активным WoE с игроками в куче гейт почти не срабатывает (игроки рядом) — это ожидаемо; основной WoE-выигрыш даёт 2c. ## Чек-лист корректности - [ ] **PvM не сломан:** игрок ставит AoE/ловушку среди мобов (без других игроков рядом) → мобы получают урон/триггерят ловушку как раньше. - [ ] PvP-AoE по игрокам бьёт штатно, пока игроки в радиусе. - [ ] AoE, накрывающая хозяина/пати (Gospel/Basilica и пр.), работает (хозяин-PC учитывается гридом). - [ ] Homunculus и Mercenary тоже «удерживают» скан (они в гриде присутствия) — AoE по ним не пропадает. - [ ] `no` и `yes` дают одинаковый игровой результат (разница только в CPU). ## Откат `skill_unit_skip_noplayer: no` + `@reloadbattleconf`. Сборка чистая, локальный буст кластера чистый.