Иконка ресурса

[ACS] True Flashbang 1.2.6.7

Нет прав для скачивания
reapi 
Авторы:
Refresh

Благодарность:
HLDS.RUN

Требования:
ReAPI, RefsAPI

Мультиязычность:
  1. RU

🎯 ACS True Flashbang — краткое описание​




📌 Назначение​


Плагин заменяет штатную (движковую) модель ослепления от флешгранаты в CS 1.6 (ReHLDS + ReAPI) на физически правдоподобную. Вместо двоичной логики «сзади / в лицо» считается реальная геометрия: угол между взглядом и источником, дистанция, перекрытие препятствием, накопление от повторных вспышек. Работает как для обычных игроков, так и для наблюдателей в режиме OBS_IN_EYE.



🐞 Какие дефекты движка (combat.cpp, RadiusFlash) устраняются​


  1. Всего две градации по углу: flDot < 0 → alpha 200; flDot >= 0 → alpha 255. Вспышка в 89° сбоку считается «в лицо» и слепит на полную.
  2. Наследование силы: if (m_blindAlpha >= alpha) alpha = m_blindAlpha; — слабая задняя вспышка усиливается до 255 после передней.
  3. Отсев по телам: трасса ВЗРЫВ → ИГРОК выполняется с dont_ignore_monsters = 0 (в ReHLDS это MOVE_NORMAL), любое тело на линии считается твёрдым — игрок за чужими спинами не получает ScreenFade вообще.
  4. Случайный прицел: движок целится не в глаза, а в BodyTarget = Center + view_ofs * RANDOM_FLOAT(0.5, 1.1) — игрок за низкой кромкой слепнет непредсказуемо (то да, то нет) при одинаковой геометрии.



⚙️ Модель силы (acs_tfb_strength)​


Единый сток расчёта, используется обоими путями (пересчёт ScreenFade и дослепление):

  • Угол: косинус между forward-вектором взгляда и направлением на взрыв → f_ang = (dot+1)/2, затем pow(f_ang, curve).
  • Близость (только при dot >= 0, т.е. в передней полусфере): две зоны — dist <= fullblind даёт prox = 1.0 (абсолютная слепота), fullblind < dist < closedist линейно убывает, дальше 0. f_ang += (1-f_ang) * prox — близкий взрыв игнорирует угол.
  • Масштаб: f_scale = minscale + (1-minscale) * f_ang — при 180° гарантированно minscale.
  • Перекрытие: трасса от глаз к взрыву, пропускает игроков, прозрачные энтити (kRenderTransColor/Texture/Alpha/Add), маскированные текстуры ({-префикс, glass, window), и «касание пола» (отрезок короче TFB_MIN_SEG). При перекрытии f_scale *= wallscale.



🧮 Накопление (две модели, acs_tfb_stack)​


  • 0 — композиция слоёв: f_eff = 1 - (1-f_scale)(1-f_resid) (как наложение стёкол).
  • 1 — сложение света с насыщением (по умолчанию): f_eff = min(1, f_scale + f_resid).

Остаточная засветка затухает линейно от силы последней вспышки до нуля.

Плато и спад хранятся раздельно (gf_res_hold_end, gf_res_end) и складываются по разным законам:

  • Плато — по насыщению: hold_end = max(old, now + hold*eff) (переэкспонировать белое нельзя).
  • Спад — по сбросу часов: dur_end = max(old, hold_end + dur*eff) (прирост равен прошедшему времени, а не сумме длительностей).

Это устраняет прежний баг, когда f_residual входил дважды с разными знаками и сокращался — остаток терялся целиком.



🧩 Дополнительные подсистемы​


ПодсистемаРоль
acs_tfb_catchupПосле взрыва в POST-хуке считает трассу от глаз (без кубика) и дослепляет тех, кого движок пропустил из-за случайного прицела. Своё сообщение помечается в gi_tfb_seen — повторно не пересчитывается.
acs_tfb_bodypassPOST-хук RG_RadiusFlash_TraceLine: если трасса упёрлась в живое тело, ставит flFraction = 1.0 — движок не отсекает по телам. Стены не трогает.
acs_tfb_teamfilterВладелец берётся из gi_tfb_owner[]; своим ScreenFade давится в msg_screen_fade и не начисляется в catchup_apply. Самого владельца вспышка слепит (как в движке).
acs_tfb_view_targetНаблюдатель OBS_IN_EYE считает геометрию по наблюдаемому, но состояние накопления пишет только игрок (i_view == id), иначе один взрыв учёлся бы трижды.
Цвет (_r/_g/_b)Подставляется в аргументы 4/5/6 после фильтра белого (TFB_WHITE_MIN = 250), поэтому на распознавание флешки не влияет.



💎 Инженерные преимущества​


  • Единый расчёт: acs_tfb_strength вызывается и из catchup_apply, и из msg_screen_fade — исключено расхождение формул (в 1.2.4 дослепление подавало точку со смещением +1 по Z, а пересчёт — без).
  • Кэш перекрытия по ключу (игрок, слот, поколение слота): трасса — самая дорогая операция, а один взрыв проверяется дважды. Поколение (gi_tfb_slot_gen) защищает от возврата чужого ответа при переиспользовании слота.
  • POST, не PRE в RadiusFlash_TraceLine: TraceResult в оригинале объявлен без инициализации, а PRE-хуки идут до трассы — get_tr2(TR_pHit) на мусоре вызывал IndexOfEdict: bad entity и ронял сервер (реальный краш 30.10.2026).
  • POST, не таймер 0.02 с в дослеплении: работает в том же кадре, после того как движок разослал свои ScreenFade и msg_screen_fade выставил seen[]. Сброс seen[] перенесён в PRE — иначе в POST метки движка уничтожались бы.
  • Кламп 16-битных полей (TFB_SHORT_MAX) в обоих путях: раньше дослепление писало f_dur*4096 без ограничения, при catchup_dur > 16 c значение искажалось.
  • Самопроверка правки трассы: после set_tr2 перечитывается flFraction, в лог пишется «тело пропущено» или «ПРАВКА НЕ ПРИМЕНИЛАСЬ» — видно, работает ли хукчейн.
  • Безопасное чтение трассы: сначала fraction, только потом pHit (при fraction = 1.0 в pHit лежит NULL).
  • Быстрый путь find_source: начинает с последнего слота, но всегда доходит до полного перебора и выбирает ближайший взрыв — в 1.2.5 ранний return приводил к выбору последнего взрыва при двух активных.
  • Нормировка только направления: forward из углов уже единичный, делим скалярное произведение на длину вектора к взрыву — минус три деления на вызов.
  • Устойчивость к внешним сообщениям: get_msg_args() < 7 защищает от укороченных ScreenFade сторонних плагинов, is_valid_player(id) — от id = 0 при MSG_ALL.
  • Диагностика: acs_tfb_debug = 1 печатает фактические значения кваров при старте, разбор каждого ScreenFade (dot, prox, resid, eff, [BLOCKED], [OBS]), строки near:, trace:, catchup: — позволяет отличить «квар не работает» от «в конфиге старое значение».
Опубликовал
Refresh
Скачивания
2
Просмотры
99
Первый выпуск
Обновление

Оценки

0,00 звёзд Оценок: 0

Другие ресурсы пользователя Refresh

Назад
Верх