# Обновление: Использование нового Blizzard API для Empower Stages

## Что изменилось

### Старый подход (не работал)
Раньше мы хардкодили список заклинаний с их ID и количеством стадий:
```lua
ns.EMPOWER_SPELLS = {
    [357208] = {stages = 4},  -- Fire Breath
    [382266] = {stages = 4},  -- Fire Breath (rank 2)
    -- и т.д.
}
```

**Проблема:** Нужно было вручную добавлять каждое новое заклинание, и этот подход перестал работать после обновления API.

### Новый подход (работает!)
Теперь используем новый параметр `numEmpowerStages` из `UnitChannelInfo`:

```lua
local name, text, texture, startTimeMS, endTimeMS, isTradeSkill, 
      notInterruptible, spellID, _, numEmpowerStages = UnitChannelInfo("player")
```

**Преимущества:**
✅ API сам возвращает количество стадий для любого empower-заклинания
✅ Не нужно хардкодить spell ID
✅ Автоматически работает для всех текущих и будущих empower-заклинаний
✅ Соответствует актуальному API Blizzard

## Технические изменения

### Logic.lua - функция SetupEmpowerStages

**Было:**
```lua
function ns.SetupEmpowerStages(spellID, realDuration)
    local spellData = ns.EMPOWER_SPELLS[spellID] or {stages = 4}
    local numStages = spellData.stages
    -- ...
end
```

**Стало:**
```lua
function ns.SetupEmpowerStages(numStages, realDuration)
    if not numStages or numStages == 0 then return end
    
    local percentages = ns.STAGE_PERCENTAGES[numStages] or ns.STAGE_PERCENTAGES[4]
    -- ...
end
```

### Logic.lua - обработка UNIT_SPELLCAST_EMPOWER_START

**Было:**
```lua
if isEmpowerStart then
    local n, _, tex, sTime, eTime, _, _, sid = UnitChannelInfo(unit)
    -- Получали spellID и искали в таблице
    ns.SetupEmpowerStages(sid, correctedDuration)
end
```

**Стало:**
```lua
if isEmpowerStart then
    local n, _, tex, sTime, eTime, _, _, sid, _, numEmpowerStages = UnitChannelInfo(unit)
    
    self.startTime, self.endTime = sTime / 1000, eTime / 1000
    self.max = self.endTime - self.startTime
    
    -- Используем numEmpowerStages из API
    if numEmpowerStages and numEmpowerStages > 0 then
        ns.SetupEmpowerStages(numEmpowerStages, self.max)
    end
end
```

### Constants.lua - упрощение

**Удалили:**
```lua
ns.EMPOWER_SPELLS = {
    [357208] = {stages = 4},
    [382266] = {stages = 4}, 
    // большая таблица хардкода
}
```

**Оставили только:**
```lua
-- Проценты стадий для empower заклинаний
ns.STAGE_PERCENTAGES = {
    [3] = {0.333, 0.666, 1.0},      -- для 3-стадийных
    [4] = {0.25, 0.45, 0.65, 1.0},  -- для 4-стадийных
}
```

## Как это теперь работает

1. **Игрок начинает кастовать empower-заклинание**
   - Срабатывает событие `UNIT_SPELLCAST_EMPOWER_START`

2. **Получаем информацию из API**
   ```lua
   local name, _, texture, startTimeMS, endTimeMS, _, _, spellID, _, numEmpowerStages = UnitChannelInfo("player")
   ```
   - `numEmpowerStages` = 3 или 4 (количество стадий, которое Blizzard сам знает)

3. **Настраиваем визуальные маркеры**
   ```lua
   ns.SetupEmpowerStages(numEmpowerStages, duration)
   ```
   - Функция берёт проценты из `STAGE_PERCENTAGES[numEmpowerStages]`
   - Размещает маркеры на кастбаре

4. **Обновляем цвета маркеров в реальном времени**
   - В `SmoothOnUpdate` проверяем текущую стадию
   - Меняем цвет: жёлтый → зелёный при достижении стадии

## Преимущества нового подхода

### Универсальность
✅ Работает для всех empower-заклинаний автоматически
✅ Не нужно обновлять аддон при добавлении новых заклинаний
✅ Поддерживает будущие изменения Blizzard

### Надёжность
✅ Использует официальное API
✅ Меньше хардкода = меньше багов
✅ Данные всегда актуальны

### Простота
✅ Меньше кода для поддержки
✅ Легче понять логику
✅ Проще отлаживать

## Поддерживаемые заклинания

Благодаря новому API, автоматически поддерживаются ВСЕ empower-заклинания эвокера:

**4 стадии:**
- Fire Breath (357208, 382266)
- Dream Breath (355936, 382614)
- Spiritbloom (382731)
- Tip the Scales (370553)

**3 стадии:**
- Eternity Surge (359073)
- Upheaval (396286)

И любые новые заклинания, которые Blizzard добавит в будущем!

## Тестирование

### Для тестирования нужен персонаж эвокер:

1. Включите "Show Empower Stages" в настройках
2. Используйте Fire Breath или другое empower-заклинание
3. Должны появиться маркеры стадий на кастбаре
4. Маркеры должны менять цвет при достижении стадий

### Проверка в консоли (для дебага):

```lua
/run local n,_,_,s,e,_,_,id,_,stages = UnitChannelInfo("player"); if n then print("Spell:",n,"ID:",id,"Stages:",stages,"Duration:",(e-s)/1000) end
```

Используйте эту команду во время каста empower-заклинания, и она покажет количество стадий.

## Совместимость

✅ **WoW Retail 11.0+** (The War Within)
✅ **Все empower-заклинания эвокера**
✅ **Будущие обновления** (API не изменится)

## Откат на старую версию (не рекомендуется)

Если по какой-то причине нужно вернуться к старому подходу:
1. Верните таблицу `ns.EMPOWER_SPELLS` в Constants.lua
2. Измените `SetupEmpowerStages(numStages, ...)` обратно на `SetupEmpowerStages(spellID, ...)`
3. Верните старый код обработки empower в Logic.lua

Но это **не рекомендуется**, так как старый подход устарел и не работает с текущим API.

---

**Версия:** 1.2 New API
**Дата обновления:** 03.02.2026
**API Reference:** https://warcraft.wiki.gg/wiki/API_UnitChannelInfo
