Active Effects HUD

F4SE-плагин для Fallout 4, который выводит на экран активные эффекты (active magic effects) игрока в виде иконок, обновляющихся в реальном времени. Отображение реализовано через [PrismaUI](https://www.nexusmods.com/fallout4/mods/) (веб-слой поверх игры); C++ часть только отслеживает активные эффекты и управляет данными, вся отрисовка — на TypeScript/React.

Скачать

## Возможности
- Опрос активных эффектов игрока раз в ~0.2с.

- Три режима отображения иконки: «иконка + % оставшегося времени», «иконка + полоса оставшегося времени», «только иконка». У бесконечных эффектов режим всегда «только иконка» — считать оставшееся время не от чего.

- Стакающиеся эффекты (несколько активных инстансов одного и того же эффекта) — не дублируются иконками, а показываются одной иконкой с цифрой стака в углу.

- Визуальная индикация появления/снятия эффекта — короткая цветная вспышка кольцом вокруг иконки (зелёная при появлении, красная при снятии), независимо от остальных настроек отображения.

- Цветовой градиент между цветом «только появился» и «вот-вот закончится» (с возможностью инверсии). На самой иконке цвет может показываться четырьмя способами: кольцом вокруг иконки, заливкой самой иконки, круглой подложкой без цвета, либо не показываться вовсе — независимо от режима отображения процента/полосы.

- Прозрачность и масштаб — отдельно для каждого эффекта.

- Режим «не показывать постоянно» (flash-only): иконка показывается вспышкой при появлении эффекта, затем скрывается, и снова показывается вспышкой при его снятии — вместо того чтобы висеть на экране всё время, пока эффект активен. Настраивается на каждый эффект отдельно, с глобальным значением по умолчанию для эффектов без JSON.

- Отдельный, независимый переключатель «не показывать постоянно бесконечные эффекты» — можно, например, держать конечные баффы с таймером на экране постоянно, а бесконечные пассивные эффекты показывать только вспышкой.

- Опция полностью скрывать бесконечные эффекты без своего JSON-описания (на эффекты с JSON не действует — у них для этого свой флаг **Visible**) и настраиваемый порог, начиная с которого длительность считается «бесконечной».

- Показ либо только эффектов, заданных через JSON, либо вообще всех активных эффектов игрока (с общим настраиваемым внешним видом по умолчанию для тех, что не заданы через JSON — они всегда показываются только во фрейме, без свободного позиционирования).

- Флаг движка `kHideInUI` по умолчанию уважается для эффектов без JSON-описания — но если для эффекта есть JSON, он показывается всегда, независимо от этого флага.

- Свободное позиционирование иконки (drag-n-drop) **или** автоматическая раскладка в одном из двух фреймов:

  • **Permanent** — сетка слева-направо/сверху-вниз с ручным порядком, для эффектов, которые показываются постоянно.

  • **Temporary** — группа по центру, для эффектов в режиме «не показывать постоянно» (самый недавно изменившийся — первым).

Фреймы можно двигать и растягивать, у каждого настраивается выравнивание содержимого.

- Панель настроек прямо в игре — всё перечисленное выше настраивается мышью, без правки файлов.

- Всё расширяется без пересборки плагина простым добавлением файлов в соответствующие папки: свои эффекты (`definitions`), переводы интерфейса (`locales`), кастомные шрифты (`fonts`).

- Горячая клавиша, открывающая панель настроек — по умолчанию **F3**, переназначаема и требует удержания.

## Требования

- [F4SE](https://f4se.silverlock.org/)

- Addres Library

- [PrismaUI_F4](https://www.nexusmods.com/fallout4/mods/) (плагин использует V4 API — нужна свежая версия)

## Установка

Через любой менеджер модов (MO2, Vortex) — обычная структура `Data/…`. Собранный `ActiveEffects.dll` кладётся в `Data/F4SE/Plugins/`, вместе с ним разворачивается папка `Data/F4SE/Plugins/ActiveEffects/` (описания эффектов/шрифты/переводы) и веб-интерфейс в `Data/PrismaUI_F4/views/ActiveEffects/`.

## Использование

1. Удерживайте горячую клавишу (по умолчанию **F3**) не менее 3 секунд — откроется панель настроек, поверх HUD появятся иконки для перетаскивания.

2. В обычном режиме HUD кликов не перехватывает — управление персонажем не блокируется.

3. Чтобы закрыть панель — снова удержите ту же клавишу нужное время.

### Что можно сделать в панели

**Общие настройки** (вверху панели): Show HUD, язык, шрифт, горячая клавиша + Rebind + время удержания.

**Раздел «Effects»** (глобальные настройки, не привязанные к конкретному эффекту):

- **Show** — только эффекты из `definitions/` (Only defined effects) или вообще все активные эффекты игрока (All player effects).

- **Respect game’s “hide in UI” flag** — виден только в режиме «All»: уважать ли флаг `kHideInUI` для эффектов без своего JSON.

- **Hide infinite-duration effects** — виден только в режиме «All»: полностью скрыть бесконечные эффекты без своего JSON. На эффекты, для которых есть JSON-описание, не действует — у них для этого есть собственный флаг **Visible**.

- **Infinite threshold (s)** — длительность (в секундах), начиная с которой (или равной 0) эффект считается бесконечным.

- **Flash-only for infinite effects** — принудительно применять режим «не показывать постоянно» ко всем бесконечным эффектам, независимо от их собственной настройки.

- **Default appearance** (только в режиме «All») — цвет иконки, масштаб, прозрачность и flash-only для эффектов без своего JSON-описания.

**Настройки каждого эффекта** (для всех, у кого есть JSON в `definitions/`):

- **Visible**, режим отображения (иконка+полоса/иконка+процент/только иконка — % считается от оставшегося времени, для бесконечных эффектов режим всегда «только иконка»), **Icon color** (Ring/Fill/Badge/None), цвет «только появился»/«вот-вот закончится», **Invert**, **Opacity**, **Size**.

- **Free position** — свободное перетаскивание, иначе попадает в Permanent (постоянно видимые) или Temporary (flash-only) фрейм.

- **Order** — порядок в сетке Permanent-фрейма.

- **Flash only** + **Flash duration** — не показывать постоянно, только вспышкой при появлении/снятии.

- **Show name** — показывать ли название эффекта под иконкой. Для эффектов без своего JSON (режим «All player effects») название показывается всегда, независимо от этой настройки.

**Фреймы**: заголовок — потяните, чтобы переместить; уголок снизу-справа — потяните, чтобы изменить размер; выпадающий список в заголовке — выравнивание содержимого.

## Где хранятся настройки

- `Data/F4SE/Plugins/ActiveEffects.json` — глобальные настройки (HUD, фреймы, язык, шрифт, горячая клавиша, раздел Effects).

- `Data/F4SE/Plugins/ActiveEffects/definitions/*.json` — один файл на эффект: откуда брать магический эффект и как его показывать. Правки через панель настроек сохраняются прямо в этот файл.

- `Data/F4SE/Plugins/ActiveEffects/locales/*.json` — переводы интерфейса.

- `Data/F4SE/Plugins/ActiveEffects/fonts/*.{ttf,otf,woff,woff2}` — кастомные шрифты.

Все три папки сканируются один раз при старте игры (`kGameDataReady`).

## Добавление своего эффекта

Создайте в `definitions/` файл `<Ключ>.json` и положите рядом иконку — схема и пример подробно описаны в `/definitions/README.txt` (тот же файл разворачивается в `Data/F4SE/Plugins/ActiveEffects/definitions/README.txt`). Коротко:

```json

{

"displayName": "Adrenaline Rush",

"magicEffect": { "editorID": "Adrenalin", "plugin": "Fallout4.esm", "formId": "0x80F" },

"icon": "Adrenalin.svg",

"defaults": {

    "x": 5, "y": 10,

    "mode": "iconOnly",

    "colorMode": "ring",

    "colorMin": "#8B0000", "colorMax": "#00C800",

    "invert": false,

    "scale": 1.0, "opacity": 1.0,

    "visible": true,

    "freePosition": false, "order": 0,

    "flashOnly": false, "flashSeconds": 3.0,

    "showName": true

}

}

```

Эффекты всегда читаются с игрока. Если эффект найти не удалось — определение пропускается с предупреждением в лог, остальные эффекты это не затрагивает.

## Добавление перевода / шрифта

`locales/<код>.json` с `displayName` + плоской картой `strings` (полный список ключей — в `/locales/en.json`), и просто файл шрифта в `fonts/`.