File Details
PlaterTOT 2.5.5.zip
- R
- May 5, 2026
- 250.82 KB
- 522
- 2.5.5
- Classic TBC
File Name
PlaterTOT 2.5.5.zip
Supported Versions
- 2.5.5
# PlaterTOT Changelog
All notable changes to this project will be documented in this file.
이 파일은 **영문** 본문 아래에 같은 버전별 **한글** 요약을 둡니다.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
---
## [Unreleased]
---
## [2.5.5] - 2026-05-05
- Changed the Warlock `Soul Link` warning gate to only check while a living pet actually exists, and added a short transition grace after `UNIT_PET` / control-loss changes so griffon/taxi pet despawns do not fire a one-shot false alert before the state settles.
- Added a short common transition grace for all class warnings (`Righteous Fury`, `Warlock armor / Soul Link`, `Omen of Clarity`) so zone/portal/control transitions do not produce a one-shot false alert while aura data is still settling.
### 한글
- 흑마법사의 `영혼의 고리` 경고 조건을 `살아 있는 소환수가 실제로 있을 때만 검사`하도록 바꿨고, `UNIT_PET` / 조작 상실 같은 전환 직후에는 짧은 유예 시간을 둬서 그리핀/비행 경로 탑승 시 소환수 해제 직전에 1회 오경보가 나는 문제도 막았습니다.
- `정의의 격노`, `흑마 갑옷/영혼의 고리`, `청명의 전조` 경보 전체에 공통 전환 유예를 추가해, 포탈/인던 진입이나 조작 전환 직후 버프 정보가 아직 덜 정리된 순간에 1회 오경보가 나는 문제를 줄였습니다.
---
## [2.5.4] - 2026-05-05
- Added a Warlock self-buff warning path in the same style as the existing `Righteous Fury` / `Omen of Clarity` alerts.
- New toggle: `PlaterTOTDB.showDAWarning` (default `true`).
- The armor requirement is satisfied when either `Demon Armor` or `Fel Armor` is active, and `Soul Link` is checked separately as an always-on companion buff.
- When either the armor buff or `Soul Link` is missing, a red pulsing warning is shown (`갑옷 OFF`, `영혼의 고리 OFF`, or `갑옷/영혼의 고리 OFF`) and the default raid warning sound repeats every 5 seconds.
- When the armor buff is active but has less than 3 minutes remaining, the warning switches to a yellow countdown (`갑옷 2분 30초` style) without pulsing.
- Unlike the RF / OC warnings, the Warlock armor warning is shown anywhere (not dungeon-only). It is refreshed from `UNIT_AURA` / spellbook update events and is included in `/platertot` status, slash commands (`da on|off|debug`), and login announce lines.
### 한글
- 흑마법사용 자버프 경보를 기존 `정의의 격노` / `청명의 전조`와 같은 스타일로 확장.
- 새 토글: `PlaterTOTDB.showDAWarning` (기본값 `true`).
- 갑옷 조건은 `악마의 갑옷` / `마의 갑옷(Fel Armor)` 중 하나만 켜져 있으면 충족되고, `영혼의 고리`는 별도로 항상 켜져 있어야 합니다.
- 갑옷 또는 `영혼의 고리` 가 빠져 있으면 빨간색 점멸 경고(`갑옷 OFF`, `영혼의 고리 OFF`, `갑옷/영혼의 고리 OFF`)와 함께 기본 공격대 경보 사운드가 5초마다 반복 재생됩니다.
- 갑옷 버프가 켜져 있지만 남은 시간이 3분 미만이면 점멸 없이 노란색 카운트다운(`갑옷 2분 30초` 형식)으로 전환됩니다.
- `정의의 격노` / `청명의 전조`와 달리 이 경보는 인던 밖에서도 항상 표시되며, `UNIT_AURA` / 주문 갱신 이벤트에서 즉시 재평가되고, `/platertot` 상태줄, 슬래시 명령(`da on|off|debug`), 접속 안내 문구에도 포함.
---
## [2.5.3] - 2026-04-20
### Added
- **Instance-only gating for RF / OC alerts**: The Righteous Fury (정의의 격노) and Omen of Clarity (청명의 전조) on-screen alerts are now suppressed outside of party (5-man) and raid instances by default. Existing guards (sound muted while dead/ghost, spec/learn checks, toggle off) are preserved — this is an additional condition layered on top.
- New SavedVariable: `PlaterTOTDB.warningInstanceOnly` (default `true`). When `true`, alerts only show if `IsInInstance()` returns instanceType `"party"` or `"raid"`. Open world (`"none"`), battlegrounds (`"pvp"`), arenas (`"arena"`), and scenarios (`"scenario"`) all suppress the warning frame.
- When the gate suppresses an alert, the warning frame is hidden, the last-state cache is reset to `false`, and the per-alert sound throttle is reset so the first re-alert plays cleanly upon dungeon entry.
- New helpers: `isInPartyOrRaidInstance()` and `warningAllowedByInstance()` centralize the check; `updateRFWarning()` and `updateOCWarning()` both call the gate after their existing guards.
- **Auto-refresh on zone change**: The event handler now also listens for `ZONE_CHANGED_NEW_AREA` and `ZONE_CHANGED` (in addition to `PLAYER_ENTERING_WORLD`) and re-runs `updateRFWarning()` / `updateOCWarning()` so the alerts toggle on the moment you step into a dungeon and turn off the moment you step out.
### Changed
- **Slash command surface**:
- Added `/platertot instance on` and `/platertot instance off` (aliases `inst on` / `inst off`) to toggle the new instance-only gate at runtime; both call `updateRFWarning()` / `updateOCWarning()` immediately after flipping the flag.
- `/platertot` status line now reports `instance-only: ON|OFF (now: party|raid|none|pvp|arena|scenario)` so you can verify both the user setting and the live `IsInInstance()` result in one place.
- `/platertot rf debug` and `/platertot oc debug` now include `instType`, `instOnly`, and `instAllow` fields so you can see exactly why an alert is or isn't firing.
- Help line at the end of the slash dispatcher updated to advertise `instance on|off`.
- Bumped `ADDON_VERSION` to `2.5.3`.
### 한글
- **RF / OC 경보를 파티/공격대 인던 안에서만 울리도록 게이트 추가**: 기존 가드(사망/유령 시 사운드 차단, 전문화·학습 여부 체크, 토글 OFF)는 그대로 유지하고, 그 위에 "파티 인던 또는 공격대 인던 안에 있을 때만 경보 표시" 라는 조건을 한 단계 더 얹음. 야외/도시/전장/투기장에서는 경보가 뜨지 않음.
- 새 SavedVariable: `PlaterTOTDB.warningInstanceOnly` (기본값 `true`). `IsInInstance()` 의 두 번째 반환값이 `"party"` 또는 `"raid"` 일 때만 경보 표시. `"none"`(야외) / `"pvp"`(전장) / `"arena"`(투기장) / `"scenario"` 는 모두 차단.
- 게이트가 경보를 막을 때 프레임 `Hide()`, lastState 캐시 `false` 리셋, 그리고 사운드 throttle 카운터(`rfSoundElapsed` / `ocSoundElapsed`)도 0으로 리셋. 던전에 들어간 직후 첫 알림 사운드가 깔끔하게 다시 울리도록 보장.
- 공통 헬퍼 `isInPartyOrRaidInstance()` / `warningAllowedByInstance()` 로 체크를 중앙화. `updateRFWarning()` / `updateOCWarning()` 둘 다 기존 가드 다음 단계에서 이 헬퍼를 호출.
- **존 변경 시 자동 갱신**: 이벤트 핸들러에 `ZONE_CHANGED_NEW_AREA` / `ZONE_CHANGED` 등록 추가 (기존 `PLAYER_ENTERING_WORLD` 와 동일 분기에서 `updateRFWarning()` / `updateOCWarning()` 호출). 던전 입장하자마자 경보가 켜지고, 나가는 즉시 꺼짐.
- **슬래시 명령 보강**:
- `/platertot instance on` / `/platertot instance off` (단축형 `inst on` / `inst off`) 추가 — 런타임에 인던 전용 게이트를 켜고 끌 수 있음. 토글 직후 `updateRFWarning()` / `updateOCWarning()` 즉시 재실행.
- `/platertot` 상태줄에 `instance-only: ON|OFF (now: party|raid|none|pvp|arena|scenario)` 표시. 사용자 설정값과 실시간 `IsInInstance()` 결과를 한 줄로 동시에 확인.
- `/platertot rf debug` / `/platertot oc debug` 출력에 `instType` / `instOnly` / `instAllow` 항목 추가. 경보가 왜 떴는지/왜 안 떴는지를 한눈에 파악 가능.
- 슬래시 도움말 줄에 `instance on|off` 항목 추가.
- 버전 표기 `2.5.2` → `2.5.3`.
---
## [2.5.2] - 2026-04-20
### Changed
- **Center RaidNotice banner is now green for activation messages**: The on-screen banner for `정의의 격노 경보 활성화` / `청명의 전조 경보 활성화` now uses an explicit green color `(r=0.20, g=1.00, b=0.20)` passed to `RaidNotice_AddMessage`, overriding the default `RAID_WARNING` red. This matches the chat line color for the same active state and reads more naturally (positive feedback = green).
### 한글
- **화면 중앙 활성 안내 배너 색상을 초록으로 변경**: `정의의 격노 경보 활성화` / `청명의 전조 경보 활성화` 의 화면 중앙 RaidWarning 배너에 명시적으로 초록색 `(r=0.20, g=1.00, b=0.20)` 을 지정. 기본 `RAID_WARNING` 의 빨간색 대신 채팅 줄(활성=초록) 과 컬러를 통일해 자연스럽게 보이도록 함.
---
## [2.5.1] - 2026-04-20
### Changed
- **Login announce wording polished**:
- Removed the diagnostic "v… 로드 — … 5초 내 안내 출력 예정" pre-line entirely. Only the final announce line remains.
- Whole chat line is now colored (green for active, red for inactive, gray for non-applicable classes) instead of coloring only the verb.
- Paladin label split: Protection paladins → `보호 성기사 접속 확인 …`, all others → `일반 성기사 접속 확인 …`.
- Druid inactive reason shortened: `(청명의 전조 탤런트 미학습)` → `(미학습)`.
- Other classes line shortened: `… 경보 모듈 대상 직업 아님` → `… 경보 대상 직업 아님`.
- **Center RaidNotice banner only on activation**: The big on-screen RaidWarning banner is now shown only for the active states (Prot Pally → 정의의 격노 경보 활성화, OoC Druid → 청명의 전조 경보 활성화). Inactive / non-applicable cases use chat only.
### 한글
- **접속 안내 멘트 정리**:
- "v… 5초 내 안내 출력 예정" 진단 줄 완전 제거. 이제 최종 안내 1줄만 출력.
- 채팅 줄 전체에 색상 적용(활성 초록, 비활성 빨강, 비대상 회색). 동사만 색칠하던 기존 방식 변경.
- 성기사 라벨 분리: 보호 → `보호 성기사 접속 확인 …`, 그 외 → `일반 성기사 접속 확인 …`.
- 드루이드 비활성 사유 축약: `(청명의 전조 탤런트 미학습)` → `(미학습)`.
- 비대상 직업 멘트 축약: `… 경보 모듈 대상 직업 아님` → `… 경보 대상 직업 아님`.
- **화면 중앙 RaidNotice 배너는 활성 상태일 때만 표출**: 보호 성기사 / OC 학습 드루이드만 큰 배너로 한 번 더 알림. 비활성·비대상은 채팅 1줄만 출력.
---
## [2.5.0] - 2026-04-20
### Changed (BREAKING for the announce path)
- **Single, isolated announce path with on-screen RaidNotice**: Removed every announce call from the main `onEvent` (PLAYER_LOGIN / PLAYER_ENTERING_WORLD / talent-update branches). The login announce is now driven by **one dedicated frame at the bottom of the file** that:
1. Listens for `PLAYER_LOGIN` and `PLAYER_ENTERING_WORLD`. Whichever fires first starts an `OnUpdate` poll.
2. Polls `ptotTalentDataReady()` every 0.25 s. As soon as talent data is ready (or after a hard 5 s timeout), prints the announce line **once**.
3. Outputs to **chat AND `RaidNotice_AddMessage(RaidWarningFrame, ...)`** simultaneously, so a giant centered on-screen banner appears no matter how spammy the chat is.
4. Is fully independent from the main `onEvent`, so even if a helper there raises a silent error, the announce still fires.
- This eliminates the previous problem where multiple competing trigger paths (file-load timer, main onEvent timer, backup timers, talent-update handler) made it possible for the announce to be silently swallowed or buried under loading-time chat spam.
### Fixed
- **Announce buried under login-time chat spam**: Even when the announce was firing, in busy environments (LFG channel + many addon load lines + party/guild chat) the single chat line was easy to miss. The new RaidWarning popup makes it impossible to miss.
### 한글
- **안내 경로 단일화 + 화면 중앙 RaidNotice 추가**: 메인 `onEvent` (PLAYER_LOGIN / PLAYER_ENTERING_WORLD / 탤런트 갱신) 의 안내 호출을 모두 제거. 안내는 이제 파일 끝의 **전용 프레임 1개** 가 단독으로 처리:
1. `PLAYER_LOGIN` 또는 `PLAYER_ENTERING_WORLD` 중 먼저 오는 이벤트로 `OnUpdate` 폴링 시작.
2. 0.25 초 간격으로 `ptotTalentDataReady()` 검사. 준비되거나 5초 타임아웃 도달 시 **딱 1회** 출력.
3. 출력은 **채팅 + `RaidNotice_AddMessage(RaidWarningFrame, ...)` 동시** — 화면 중앙에 큼지막한 빨간 배너로 떠서 채팅이 아무리 시끄러워도 절대 못 놓침.
4. 메인 `onEvent` 와 완전 독립.
- 이로써 여러 경쟁 트리거(파일-로드 타이머, 메인 onEvent 타이머, 백업 타이머, 탤런트 갱신 핸들러)가 서로 가드를 침범하면서 안내가 묵살되던 구조적 문제 제거.
### 수정
- **로그인 직후 채팅 스팸에 묻혀 안내가 안 보이던 문제**: 안내 자체는 동작했더라도, LFG 채널·다수 애드온 로드 메시지·길드/파티 대화가 뒤섞이면 1줄짜리 채팅을 놓치기 쉬웠음. 화면 중앙 RaidWarning 배너로 절대 놓칠 수 없게 변경.
---
## [2.4.8] - 2026-04-20
### Fixed
- **Auto announce never appearing while `/platertot announce` works**: Confirmed the function and slash registration are both fine — the failure is the *auto trigger*. File-load-time `print()`s and timers were being silently dropped because the chat frame is not yet ready that early in the login pipeline.
- Replaced the file-load-time boot block with a **dedicated CreateFrame that listens for both `PLAYER_LOGIN` and `PLAYER_ENTERING_WORLD`**. Whichever fires first is what we wait for; the other is then unregistered.
- On that first event, prints a short diagnostic line (`v… 로드 — <event> 수신, 자동 안내 시도 시작`) so the user can immediately verify the trigger fired, then schedules announce attempts at +1s / +3s / +6s and a guaranteed fallback at +12s.
- This handler is fully **independent of the main `onEvent`** — even if a helper inside the main handler raises a silent error, the announce path keeps running.
### 한글
- **`/platertot announce` 는 동작하는데 자동 안내만 안 떴던 문제**: 함수와 슬래시 등록은 모두 정상이었고, 진짜 원인은 *자동 트리거 경로* 였음. 파일-로드 시점의 `print()`/타이머는 채팅 프레임이 아직 준비되지 않아 메시지가 유실되는 환경이 있음.
- 파일-로드 시점 부팅 블록을 제거하고, `PLAYER_LOGIN` 과 `PLAYER_ENTERING_WORLD` 둘 다를 리슨하는 **전용 `CreateFrame`** 을 둠. 둘 중 먼저 오는 이벤트만 받고 그 시점에 전체 안내 스케줄을 가동.
- 그 첫 이벤트 시점에 진단용 1줄(`v… 로드 — <event> 수신, 자동 안내 시도 시작`)을 출력해 트리거 발화 자체를 사용자가 즉시 확인할 수 있게 함. 이어서 +1s / +3s / +6s 안내 시도 + +12s 최종 폴백 스케줄.
- 이 핸들러는 메인 `onEvent` 와 **완전 독립** — 메인 핸들러 내부에서 silent error 가 발생해도 안내 경로는 살아 있음.
---
## [2.4.7] - 2026-04-20
### Fixed
- **Login announce never appearing for any class**: Re-introduced the boot-time chat line (printed the moment the Lua file finishes loading) so the user can immediately confirm the addon is loaded. Added a fan-out of safe-pcall announce attempts at +0.2s / +1.0s / +3.0s / +6.0s and a final unconditional fallback at +12.0s, so even if `PLAYER_LOGIN` / `PLAYER_ENTERING_WORLD` fail to trigger our handler (or a helper raises a silent error), at least one announce line is guaranteed.
- **Announce silently swallowed on helper error**: `printPTOTLoadAnnounce` now wraps `isPaladinProtSpec()`, `druidLearnedOmenOfClarity()` and `invalidateOCLearnedCache()` in `pcall`, builds the line first, and only sets the session guard **after** the chat write actually happens. Previously, an early error could mark the announce as "done" without ever printing.
### 한글
- **로드 안내가 어떤 직업으로도 1줄도 안 떴던 문제**: Lua 파일이 로드되는 즉시 1줄짜리 부팅 로그를 채팅창에 강제로 출력하도록 복구. 추가로 +0.2s / +1.0s / +3.0s / +6.0s 시점에 안전 `pcall` 안내 시도 + +12.0s 최종 폴백을 걸어서, `PLAYER_LOGIN`/`PLAYER_ENTERING_WORLD` 핸들러가 잡히지 않거나 헬퍼에서 silent error 가 나도 최소 1줄은 반드시 출력됨.
- **헬퍼 에러로 안내가 묵살되던 문제**: `printPTOTLoadAnnounce` 가 `isPaladinProtSpec()` / `druidLearnedOmenOfClarity()` / `invalidateOCLearnedCache()` 호출을 모두 `pcall` 로 감싸도록 변경. 메시지를 먼저 만들고 채팅창 출력이 실제로 일어난 **다음에야** 세션 가드를 세우도록 순서 교정 — 이전 버전에선 헬퍼가 에러를 던지면 가드만 세워지고 출력이 누락될 수 있었음.
---
## [2.4.6] - 2026-04-20
### Changed
- **Login announce — unconditional, single line for every class**: The load-time announce now prints exactly one line on every login, regardless of class or talents.
- Paladin: `... 성기사 접속 확인 : 정의의 격노 경보 기능 활성화/비활성화 (보호 전문화 아님)`.
- Druid: `... 드루이드 접속 확인 : 청명의 전조 경보 기능 활성화/비활성화 (청명의 전조 탤런트 미학습)`.
- Other classes (warrior, mage, hunter, …): `... <한글 직업명> 접속 확인 : PlaterTOT 경보 모듈 대상 직업 아님` (gray).
- **Toggle status no longer mentioned**: The announce assumes both warning modules are always-on and only reports the spec / talent gate result. (Slash toggles still exist for power users but are not surfaced in the announce.)
- **Talent-data ready polling**: Login path now polls `DF:GetRoleByClassicTalentTree()` / talent-tab counts every 1 s (up to 15 s) before printing, so Protection paladins / Omen-of-Clarity druids are no longer mis-reported as inactive due to data not being populated yet at PLAYER_LOGIN.
### Fixed
- **Protection paladin reported as inactive at login**: Caused by `DF:GetRoleByClassicTalentTree()` returning `NONE` before the talent tree was populated. The new polling loop waits for talent data and re-evaluates before printing.
### 한글
- **접속 안내 — 모든 직업에 무조건 1줄 출력**: 로드 안내가 이제 직업·탤런트와 무관하게 접속할 때 정확히 1줄을 출력함.
- 성기사: `... 성기사 접속 확인 : 정의의 격노 경보 기능 활성화/비활성화 (보호 전문화 아님)`.
- 드루이드: `... 드루이드 접속 확인 : 청명의 전조 경보 기능 활성화/비활성화 (청명의 전조 탤런트 미학습)`.
- 그 외 직업(전사·마법사·사냥꾼 등): `... <한글 직업명> 접속 확인 : PlaterTOT 경보 모듈 대상 직업 아님` (회색).
- **토글 상태는 안내에 포함하지 않음**: 두 경보 모듈을 항상 ON 으로 가정하고, 전문화/탤런트 충족 여부만 보고. (슬래시 토글은 그대로 존재하지만 안내에는 노출 안 됨.)
- **탤런트 데이터 준비 폴링 도입**: 접속 시 `DF:GetRoleByClassicTalentTree()` 와 탤런트 탭 수를 1초 간격으로 최대 15초 폴링한 뒤 출력. PLAYER_LOGIN 시점에 탤런트가 아직 채워지지 않아 보호 성기사가 "비활성화"로 잘못 표시되던 문제 해결.
### 수정
- **보호 성기사가 접속 시 비활성화로 표시되던 버그**: PLAYER_LOGIN 시점엔 `DF:GetRoleByClassicTalentTree()` 가 `NONE` 을 돌려주는 탓이었음. 새 폴링 루프가 탤런트가 채워질 때까지 기다린 뒤 평가/출력하도록 수정.
---
## [2.4.5] - 2026-04-20
### Changed / Fixed
- 채팅창 출력 안정화 및 진단 보강. `print()` 대신 `DEFAULT_CHAT_FRAME:AddMessage()` 사용, 부팅 시점 1줄 로드 로그, `/platertot announce` 강제 출력 명령, PLAYER_ENTERING_WORLD 백업 트리거(2.5s/5.0s) 추가.
---
## [2.4.4] - 2026-04-20
### Changed
- **Load-time announce — class-confirmation format**: Replaced the multi-line "loaded" header + bullet list with a single clear class-confirmation line per applicable class:
- Paladin login → `[PlaterTOT] 성기사 접속 확인 : 정의의 격노 경보 기능 활성화` (green) or `... 비활성화 (사유)` (red).
- Druid login → `[PlaterTOT] 드루이드 접속 확인 : 청명의 전조 경보 기능 활성화` (green) or `... 비활성화 (사유)` (red).
- Active = user toggle ON **and** spec/talent gate satisfied (Prot for RF, OoC learned for OC).
- Inactive lines include the concrete reason and the slash command to flip the toggle, so the user immediately knows whether it is the toggle, the spec, or the talent that is missing.
- Other classes (warrior, mage, etc.) print nothing — neither module applies to them.
### 한글
- **로드 안내 — 클래스 접속 확인 형식**: 여러 줄짜리 헤더+불릿 목록을 클래스별 1줄 접속 확인 메시지로 대체.
- 성기사 접속 → `[PlaterTOT] 성기사 접속 확인 : 정의의 격노 경보 기능 활성화` (초록) 또는 `… 비활성화 (사유)` (빨강).
- 드루이드 접속 → `[PlaterTOT] 드루이드 접속 확인 : 청명의 전조 경보 기능 활성화` (초록) 또는 `… 비활성화 (사유)` (빨강).
- 활성 = 사용자 토글 ON **및** 전문화/탤런트 조건 충족(보호 성기사 / 청명의 전조 학습).
- 비활성 사유 + 토글 명령을 함께 표시 — 토글 문제인지, 전문화 문제인지, 탤런트 미학습인지 즉시 구분 가능.
- 그 외 직업은 아무 것도 출력하지 않음.
---
## [2.4.3] - 2026-04-20
### Changed
- **Load-time announce — character-targeted only**: The 2.4.2 announce printed the status of *all* warning modules regardless of the current character. Now it prints **only the modules that actually apply** to the logged-in character, and prints **nothing at all** when neither applies:
- Protection Paladin → "정의의 격노 경보 기능 로딩됨" line only.
- Druid with Omen of Clarity learned → "청명의 전조 경보 기능 로딩됨" line only.
- Both → both lines.
- Neither → no header, no lines.
- The session guard is **only** set when at least one line was printed, so a later talent/dual-spec switch that newly enables RF or OC will trigger the announce on the next eligibility transition.
- Hooked the announce into the talent/spell change events (`PLAYER_TALENT_UPDATE`, `CHARACTER_POINTS_CHANGED`, `ACTIVE_TALENT_GROUP_CHANGED`, `SPELLS_CHANGED`, `LEARNED_SPELL_IN_TAB`) so the message appears the moment the character becomes eligible.
### 한글
- **로드 안내 — 해당 캐릭터에게만 표시**: 2.4.2 까지는 캐릭터와 무관하게 두 모듈 상태를 모두 출력했음. 이제 **현재 캐릭터에 실제로 적용되는 모듈만** 출력, 둘 다 비대상이면 헤더 포함 아무 것도 출력하지 않음.
- 보호 성기사 → "정의의 격노 경보 기능 로딩됨" 한 줄만
- 청명의 전조 학습한 드루이드 → "청명의 전조 경보 기능 로딩됨" 한 줄만
- 둘 다 → 두 줄
- 어느 쪽도 아님 → 출력 없음
- 한 줄이라도 출력했을 때만 세션 가드 플래그를 세움. 즉 나중에 탤런트를 새로 찍거나 이중 특성을 보호/청명의 전조 트리로 전환하면 그 순간 안내가 뜸.
- 탤런트/스펠북/이중 특성 변경 이벤트에도 안내 호출을 연결.
---
## [2.4.2] - 2026-04-20
### Added
- **Load-time announce in chat**: After `PLAYER_LOGIN` (delayed 2s so talent/spell tables are fully populated), PlaterTOT prints a one-line summary plus per-module status:
- Header: `PlaterTOT vX.Y.Z 로드 — 경보 모듈 로딩됨`
- Righteous Fury line: toggle (`ON`/`OFF`) and current applicability (`보호 성기사 → 활성` / `성기사이지만 보호 아님 → 비활성` / `비-성기사 → 비활성`).
- Omen of Clarity line: toggle and current applicability (`드루이드 + 청명의 전조 학습 → 활성` / `드루이드이지만 청명의 전조 미학습 → 비활성` / `비-드루이드 → 비활성`).
- A short tip with the four toggle/diagnostic slash commands.
- Guarded by a session flag so subsequent `/reload` re-fires of `PLAYER_LOGIN`/`PLAYER_ENTERING_WORLD` do not double-print.
### 한글
- **로드 시 채팅 안내 출력 추가**: `PLAYER_LOGIN` 후 2초 (탤런트/스펠북 안정화 시점) 에 한 번만 채팅창에 모듈 상태를 출력합니다.
- 헤더: `PlaterTOT vX.Y.Z 로드 — 경보 모듈 로딩됨`
- 정의의 격노 경보: 토글 ON/OFF + 현재 클래스/전문화 기준 활성 여부
- 청명의 전조 경보: 토글 ON/OFF + 드루이드 여부 + **탤런트 학습 여부** 까지 반영
- 슬래시 명령 4개 (`/platertot rf on|off`, `/platertot oc on|off`, `rf debug`, `oc debug`) 안내 한 줄
- 세션 플래그로 중복 출력 차단 — `/reload` 후에도 1회만.
---
## [2.4.1] - 2026-04-20
### Fixed
- **OC warning false positive on non-OoC druid builds**: The 2.4.0 OC warning fired for **any** Druid even if the player had not actually learned **Omen of Clarity** (e.g. early-leveling druids, pure Feral/Balance specs without OoC). Now gated by `druidLearnedOmenOfClarity()`:
- Primary: `IsPlayerSpell(16864)` / `IsSpellKnown(16864)`.
- Fallback: scans the talent tabs (`GetTalentInfo`) for an entry whose name matches "청명의 전조" / "Omen of Clarity" with `currentRank > 0` (covers Classic builds where `IsPlayerSpell` does not report passive talent ranks).
- Cached; invalidated on `PLAYER_TALENT_UPDATE`, `CHARACTER_POINTS_CHANGED`, `ACTIVE_TALENT_GROUP_CHANGED` (dual spec), `SPELLS_CHANGED`, `LEARNED_SPELL_IN_TAB`, and on each `PLAYER_LOGIN` / `PLAYER_ENTERING_WORLD`.
- `/platertot oc debug` now also reports `learnedOC=`, `IsPlayerSpell=`, `IsSpellKnown=` so missing detection paths can be diagnosed quickly.
### 한글
- **수정**: 2.4.0 의 청명의 전조 경고가 **드루이드면 무조건** 떴던 문제. 야성/조화 위주 등 OoC 를 학습하지 않은 빌드/저레벨 드루이드에서도 "OFF" 가 떠버렸음. 이제 학습 여부를 `druidLearnedOmenOfClarity()` 로 검사하여 학습한 경우에만 경고 표시.
- 1차: `IsPlayerSpell(16864)` / `IsSpellKnown(16864)`.
- 폴백: `GetTalentInfo` 로 탤런트 트리를 훑어 "청명의 전조" / "Omen of Clarity" 이름 + `currentRank > 0` 매칭 (패시브 탤런트가 IsPlayerSpell 에 잡히지 않는 클래식 빌드 대비).
- 캐시 사용. 탤런트/스펠북/이중 특성 변경 이벤트와 로그인/필드 진입 시 자동 무효화.
- `/platertot oc debug` 가 학습 여부 + IsPlayerSpell/IsSpellKnown 결과까지 함께 출력.
---
## [2.4.0] - 2026-04-20
### Added
- **Omen of Clarity (청명의 전조) warning for Druids**
- When the player is a Druid and Omen of Clarity is **off**, a large red pulsing text **"청명의 전조 OFF"** is displayed below the RF warning slot (top center, offset `-180`) so it never overlaps the Paladin RF warning.
- When the buff has **less than 3 minutes** remaining, the text changes to a yellow countdown (e.g., "청명의 전조 2분 30초") without pulsing.
- The same default **raid warning** UI sound (`SOUNDKIT.RAID_WARNING`, fallback `8959`) plays every **5 seconds** while OC is off — no sound while dead/ghost.
- Detection: spell ID **16864** primary, with name fallback for "청명의 전조" / "Omen of Clarity" so build-specific ID variants still match.
- Active for **all Druid specs** (no spec/talent gating). Auto-disabled for non-Druid classes.
- Toggle: `/platertot oc on` or `/platertot oc off`.
- Diagnostics: `/platertot oc debug` — prints class / detection state and dumps any matching player buff slot (id + name) so unknown spell-ID variants can be identified.
### Changed
- Status line (`/platertot`) now also reports **OC warn: ON/OFF**.
- Internal: shared `playPTOTWarningSound = playRFFuryWarningSound` so the OC warning reuses the exact same sound code path as RF (single source of truth, no duplicated sound logic).
### 한글
- **드루이드 청명의 전조 꺼짐 경고 추가**
- 드루이드일 때 청명의 전조가 꺼져 있으면 화면 상단 중앙(RF 경고 아래, `-180` 위치)에 빨간색 깜빡이는 **"청명의 전조 OFF"** 텍스트 표시. RF 경고와 위치가 겹치지 않음.
- 남은 시간이 3분 이내면 노란색 카운트다운 표시(예: "청명의 전조 2분 30초").
- 꺼진 동안 5초마다 RF 와 동일한 기본 공격대 경보 사운드 재생. 사망·유령 상태에서는 사운드 없음.
- 감지: spell ID **16864** 우선, 빌드별 ID 차이 대비로 "청명의 전조" / "Omen of Clarity" 이름 매칭 폴백.
- **모든 드루이드 전문화**에서 작동(전문화 체크 없음). 다른 직업에서는 자동 비활성.
- `/platertot oc on|off` 로 켜기/끄기, `/platertot oc debug` 로 상태 확인 + 매칭된 버프 슬롯(id, 이름) 덤프.
### 변경
- 상태줄(`/platertot`) 에 **OC warn: ON/OFF** 추가 표시.
- 내부: `playPTOTWarningSound` 별칭으로 RF 사운드 함수를 OC 가 그대로 재사용 — 사운드 로직 중복 없음.
---
## [2.3.1] - 2026-04-03
### Changed
- **Righteous Fury off warning sound**: Replaced custom `rf_warning2.mp3` with the default UI **raid warning** sound (`SOUNDKIT.RAID_WARNING` when available, fallback sound kit `8959`). **No sound while dead or ghost**; the on-screen **"정의의 격노 OFF"** text still shows, and sounds resume after resurrection when RF is still off.
### 한글
- **정의의 격노 꺼짐 알림음**: 커스텀 mp3 대신 **기본 공격대 경보** 계열(`SOUNDKIT.RAID_WARNING`, 없으면 `8959`). **죽음·유령 상태에서는 소리 없음**, 경고 문구만 표시. 부활 후에도 격노가 꺼져 있으면 다시 주기적으로 재생.
---
## [2.3.0] - 2026-04-02
### Added
- **Righteous Fury (정의의 격노) warning for Protection Paladin**
- When the player is a Protection Paladin (detected via `DF:GetRoleByClassicTalentTree()`) and Righteous Fury is **off**, a large red pulsing text **"정의의 격노 OFF"** is displayed at the top center of the screen.
- When Righteous Fury has **less than 3 minutes** remaining, the text changes to a yellow countdown (e.g., "정의의 격노 2분 30초") without pulsing.
- A default **raid warning** UI sound plays every **5 seconds** while Righteous Fury is off (no custom mp3).
- The warning is automatically disabled for non-Protection Paladins (Holy, Retribution) and non-Paladin classes.
- Toggle on/off via `/platertot rf on` or `/platertot rf off`.
- Debug info available via `/platertot rf debug`.
### 한글
- **보호 성기사 정의의 격노 꺼짐 경고 추가**
- 보호 전문화 성기사일 때 정의의 격노가 꺼져 있으면 화면 상단 중앙에 빨간색 깜빡이는 **"정의의 격노 OFF"** 텍스트 표시.
- 정의의 격노 남은 시간이 3분 이내이면 노란색 카운트다운 표시 (예: "정의의 격노 2분 30초").
- 정의의 격노가 꺼진 동안 5초마다 기본 공격대 경보 계열 효과음 재생.
- 신성/징벌 성기사 및 다른 직업에서는 자동 비활성.
- `/platertot rf on|off` 로 켜기/끄기, `/platertot rf debug` 로 상태 확인 가능.
---
## [2.2.14] - 2026-03-09
### Fixed
- **Auto “Tank Threat Colors” looked like DPS** – Plater could leave **`Plater.PlayerIsTank` false** on some clients even when **`tank_threat_colors`** was **true** (profile matched but threat palette stayed DPS). **`syncPlaterTankThreatColors`** no longer returns early when the profile already matches; after **`RefreshTankCache`**, if we want tank colors and **`PlayerIsTank`** is still false, we set **`PlayerIsTank = true`** and call **`UpdateAllNameplateColors`** when needed.
### 한글
- **탱 위협 색 자동 맞춤이 딜 색처럼 보임** – 프로필 **`tank_threat_colors`** 는 맞는데 Plater가 **`PlayerIsTank`** 를 안 올리는 경우가 있어 위협 색이 딜 팔레트로 남던 문제. 프로필이 이미 맞아도 동기화 루틴을 돌리고, 필요 시 **`PlayerIsTank`** 보정 후 이름표 색 갱신.
---
## [2.2.13] - 2026-03-09
### Changed
- **TOT (`T : …`) bar height** – Default **`totBarHealthFraction`** is now **`0.80`** (80% of Plater **threat/health bar** height). Slash **`tot fraction`** allows **12%–92%** (was capped at 65%). Existing SavedVariables keep their value; use **`/platertot tot fraction 80`** to match.
- **Nameplate mana fill** – Back to **mana blue** (`GetColorForPowerType` / `PowerBarColor.MANA`, fallback `0.25, 0.55, 1`). **Thin white 1px border** (four `OVERLAY` lines, sublevel 6) on both the **in-health** mana strip frame and the **auxiliary** strip frame so the bar reads on threat-colored health.
### 한글
- **TOT 막대** – 기본 높이 **체력(위협)바의 80%**. `tot fraction` 허용 **12~92%**. 예전 저장값 유지 시 **`tot fraction 80`**.
- **마나 띠** – 채움 **마나 파랑** 복원, **1px 흰 테두리**(안쪽 스트립·보조 띠 공통).
---
## [2.2.12] - 2026-03-09
### Fixed
- **Yellow fixed mana strip / bar not moving** – **`mana mdebug`** used to draw a **yellow, ~45% width** fill and **return early**, so the bar **never tracked real mana** and looked “stuck.” That debug overlay is **removed**; mdebug now only toggles the **status line** flag (`/platertot`). Mana strips use the **same white, live fill** as normal.
- **Smoother updates** – Added **`pollNameplateManaBars()`** every **~0.05s** (in addition to power events and the 0.15s TOT loop) so nameplate mana **cur/max** refresh even when **`UNIT_POWER_*`** fires rarely.
- **White inner bar** – **`applyManaBarColor`** now sets both **texture vertex color** and **`SetStatusBarColor(1,1,1)`** so the fill stays white.
### 한글
- **노란색·고정 마나바** – **`mana mdebug`** 가 켜져 있으면 예전에 **노란색·약 45% 고정** 띠만 그리고 **실제 마나 갱신을 막았음**. 그 **시각 디버그 제거**; mdebug는 **`/platertot` 상태줄 표시용**만. 마나 띠는 항상 **흰색·실제 비율**.
- **갱신** – **`UNIT_POWER`** 가 드문 빌드 대비 **약 0.05초마다** 이름표 마나 폴링.
- **흰색** – StatusBar에 **`SetStatusBarColor`** 도 적용.
---
## [2.2.11] - 2026-03-09
### Fixed
- **Nameplate mana fill stuck / wrong % (e.g. ~40%)** – `updateManaBarFillForUnit` could mix **`UnitPower(..., nil)`** with a fallback **`maxp = 1`**, producing nonsense ratios. Mana is now read with **`getNameplateUnitManaCurMax`**: try **`UnitPower` / `UnitPowerMax` on the same power slot** in order **mana index `0` → `Enum.PowerType.Mana` → `nil`**, never mixing slots. Removed the **`maxp = 1`** clamp; if max cannot be read, the bar update is skipped.
### 한글
- **이름표 마나 바 % 고정(약 40% 등)** – `nil`로 읽은 값과 `maxp = 1` 폴백이 섞이면 비율이 깨짐. **`getNameplateUnitManaCurMax`**로 **같은 파워 슬롯**에서 cur/max를 함께 읽고, 순서는 **0 → Enum.Mana → nil**. **`maxp = 1` 강제 제거**; max를 못 읽으면 갱신 생략.
---
## [2.2.10] - 2026-03-09
### Changed
- **Mana strip smoothness** – Refresh auxiliary strip and in-bar mana on **`UNIT_POWER_FREQUENT`** and **`UNIT_MAXPOWER`** (in addition to `UNIT_POWER_UPDATE`), so fill tracks current/max mana closer to real-time on ticks and channeling. Unsupported events are skipped via `pcall` on register.
### 한글
- **마나 띠 갱신** – `UNIT_POWER_UPDATE` 외에 **`UNIT_POWER_FREQUENT`**, **`UNIT_MAXPOWER`**에서도 보조 띠·체력바 안쪽 마나를 갱신해 틱·채널링 등에서 현재/최대 마나에 더 가깝게 따라감. 클라이언트에 없는 이벤트는 등록 시 `pcall`로 건너뜀.
---
## [2.2.9] - 2026-03-09
### Fixed
- **Non-mana units still showing a strip** – `plateUnitHasMana` no longer treats NPCs as mana when only power slot 0 had a max, and no longer guesses mana from enemy **class**. It now returns true only when **`UnitPowerType` is mana** (token/`0`/`Enum.PowerType.Mana`) **and** `UnitPowerMax(unit) > 0` for the primary resource.
- **`mana mdebug`** – Yellow test strip only on **mana** nameplates (same rule), so warriors etc. stay clean while debugging.
### 한글
- **비마나에도 띠가 보이던 문제** – 슬롯 0만 보고 NPC를 마나로 보던 분기·적 직업 추정을 제거. **`UnitPowerType`이 마나**이고 **주 자원** `UnitPowerMax(unit) > 0`일 때만 참.
- **`mana mdebug`** – 노란 테스트 띠는 **마나 이름표에만** (전사 등은 디버그 중에도 깨끗하게).
---
## [2.2.8] - 2026-03-09
### Changed
- **Auxiliary mana strip** – Shown **only for mana units** (no more health-based green fallback for rage/energy/etc.).
- **Mana fill color** – In-health mana bar and auxiliary strip use **white** fill so the bar stays visible on Plater **threat-tinted** health bars (replaces blue/mana power color).
### 한글
- **보조 띠** – **마나 유닛만** 표시(분노·기력 등 체력 초록 대체 제거).
- **마나 채움 색** – 안쪽 마나·보조 띠 채움 **흰색**(Plater **위협색** 체력바와 겹쳐도 보이도록, 예전 파랑/파워 색 대체).
---
## [2.2.7] - 2026-03-09
### Changed
- **TOT (`T : …`) bar height** – No longer a fixed pixel height; it scales as **`Plater health bar height × totBarHealthFraction`**. New saved default **`totBarHealthFraction = 0.36`** (~36%). Allowed range **12%–65%** via **`/platertot tot fraction 0.36`** or **`/platertot tot fraction 36`** (percent when `> 1`). Status line (`/platertot` / `tt`) shows the current percent. Target-highlight neon strips follow the bar height when Plater’s profile height is unset (stored refs updated each tick when TOT is visible).
### 한글
- **TOT 막대 높이** – 고정 픽셀 대신 **`Plater 체력바 높이 × totBarHealthFraction`**. 저장 기본 **0.36**(약 36%). **`/platertot tot fraction 0.36`** 또는 **`36`**(1 초과면 퍼센트). 상태 줄에 현재 % 표시. Plater 네온 하이라이트는 프로필 높이 없을 때 막대 높이에 맞춤.
---
## [2.2.6] - 2026-03-09
### Changed
- **TOT (`T : …`) bar** – Bar height reduced from **14px to 12px**; anchor offset adjusted so the label stays aligned with the health bar top. Plater target-highlight neon default height follows the bar when profile height is unset.
### 한글
- **TOT 막대** – 높이 **14px → 12px**, 앵커 조정으로 체력바 상단과 정렬 유지. 네온 기본 높이도 막대에 맞춤.
---
## [2.2.5] - 2026-03-09
### Changed
- **Thinner default mana strip** – Default **`nameplateManaHealthFraction`** is now **`0.90`** (~**10%** of health bar height for the bottom strip, was ~20% at `0.80`). Slash **`mana fraction`** max raised to **`0.95`** (~5% strip). Existing SavedVariables unchanged; use `/platertot mana fraction 0.90` (or up to `0.95`) to match.
### 한글
- **더 얇은 기본 마나 띠** – 기본 **`nameplateManaHealthFraction` = `0.90`**(하단 약 10%, 예전 0.80은 약 20%). 슬래시 상한 **0.95**(약 5%). 기존 저장값은 유지; 맞추려면 `/platertot mana fraction 0.90` 등.
---
## [2.2.4] - 2026-03-09
### Fixed
- **Mana strip draw order** – Plater’s center health text (`lifePercent`) uses **OVERLAY sublevel 5**. Mana strip textures were also on OVERLAY **5 / 8**, so they could paint on top of the numbers. Strips now use **OVERLAY 2 (background) and 4 (fill)**, i.e. between the health bar fill and the percent text. Auxiliary mini-strip aligned; **FrameLevel** for these frames lowered slightly since ordering is handled by draw layer.
### 한글
- **마나 띠 그리기 순서** – Plater 가운데 체력 수치는 **OVERLAY 5**. 마나 띠가 **5/8**이라 수치를 가릴 수 있어 **배경 2·채움 4**로 조정(체력 채움과 수치 사이). 보조 띠 동일. **FrameLevel**은 약간 낮춤.
---
## [2.2.3] - 2026-03-09
### Changed
- **Mana / auxiliary strip height** – Uses **`(1 - nameplateManaHealthFraction) × health bar height`**, no extra 8–16px clamp on the auxiliary strip. Default **`nameplateManaHealthFraction` is now `0.80`** (new saves) so the strip is **~20%** of Plater health bar height. Existing SavedVariables keep their value; use `/platertot mana fraction 0.80` to match.
### 한글
- **마나·보조 띠 높이** – **`(1 - 비율) × 체력바 높이`**, 보조 띠 **8~16px** 캡 제거. 신규 저장 기본 **0.80**(하단 약 20%). 기존 값 유지; 맞추려면 `mana fraction 0.80`.
---
## [2.2.2] - 2026-03-09
### Changed
- **Auxiliary mini-strip (ex-`M :` label)** – Text removed; only the **background + fill bar** remains (full usable width of the health bar band). Mana = blue fill %, non-mana health fallback = green fill %. **`mana mdebug`** shows a **yellow partial fill** with no text.
### 한글
- **보조 미니 띠** – 텍스트 제거, **배경+채움**만(대역 전폭). (당시) 마나=파랑 %, 비마나=체력 초록 %. **`mdebug`** 노란 부분 채움.
---
## [2.2.1] - 2026-03-09
### Changed
- **`M :` mini-bar placement** – Anchored **inside** the threat-colored health bar on **`FrameOverlay`**: bottom band (~25% of bar height, max 16px), with **OVERLAY** textures and high **FrameLevel**, so it no longer sits under the nameplate name. When the **in-bar mana strip** is active for a mana unit, the **`M :` label hides** to avoid stacking the same info in the same band (health-fallback `M :` for non-mana units unchanged).
### 한글
- **`M :` 미니바 위치** – **`FrameOverlay`** 안 체력바 하단 밴드, **OVERLAY**·높은 **FrameLevel**. 안쪽 마나 띠 켜진 마나 유닛에서는 **M : 숨김**(중복 방지).
---
## [2.2.0] - 2026-03-09
### Changed
- **Mana strip layering & placement** – Parent the in-health mana strip to Plater’s **`healthBar.FrameOverlay`** when present so it sits above the threat-colored health fill; **`SetFrameLevel`** raised (`base + 85`), textures use **OVERLAY sublevels 5 (bg) / 8 (fill)** so they draw above Plater’s typical overlay-7 elements. **1px insets** on left/right/bottom to align with the visible bar. Bottom **25%** height still follows `nameplateManaHealthFraction` (default `0.75`).
### 한글
- **안쪽 마나 띠** – **`FrameOverlay`** 부모, 위협색 체력 채움 위. **FrameLevel**, **OVERLAY 5/8**, **1px** 인셋. 높이는 `nameplateManaHealthFraction`(당시 기본 0.75).
---
## [2.1.9] - 2026-03-09
### Changed
- **M : mini-label** – If the unit is **not** classified as mana for the strip, the same **`M : cur/max`** line shows **health** instead (green fill vs blue mana fill) so you can verify the widget on any hostile nameplate. Enemy-only filter unchanged. Inner mana overlay on the health bar still only applies to mana units.
### 한글
- **M : 라벨** – 스트립 기준 비마나면 **체력 cur/max** 표시(초록 vs 파랑). 적만 필터 동일. 안쪽 마나 오버레이는 마나만.
---
## [2.1.8] - 2026-03-09
### Fixed
- **`mana mdebug`** no longer requires **`showNameplateManaBar`** ON (debug label can show while mana strip is off).
### 한글
- **`mana mdebug`** – **`showNameplateManaBar`** 꺼져 있어도 디버그 표시 가능.
---
## [2.1.7] - 2026-03-09
### Fixed
- **M label never updating** – `/reload` or missed `NAME_PLATE_UNIT_ADDED` could leave `unitToPlate` empty so the TOT/M loop never ran. Added **`syncNameplatesToPlaterTOT()`** (scan `C_NamePlate.GetNamePlates()`, refill `unitToPlate`, ensure TOT + M widgets, refresh M) on **PLAYER_ENTERING_WORLD** (0.1s + 0.6s), **PLAYER_LOGIN**, **NAME_PLATE_UNIT_ADDED**, **`mana on` / `mana refresh`**, and immediate refresh after creating the M frame.
- **Mana detection vs ElvUI target** – Relaxed **`plateUnitHasMana`**: `tonumber(powerType)==0`, case-insensitive **MANA** token, **`UnitPowerMax(unit,0)>0`** (NPC nameplates), and **WotLK mana classes** for enemy players if the nameplate API is wrong.
### Added
- **`/platertot mana mdebug on|off`** – Yellow **`M : powerType|token|m0=…`** on hostile nameplates (ignores strict mana match) to see raw API values. Status line shows **M debug: ON/OFF**.
### 한글
- **M 라벨 안 갱신** – `unitToPlate` 비었을 때 **`syncNameplatesToPlaterTOT()`**로 전체 이름표 스캔·동기화(진입/로그인/추가/명령 등).
- **마나 판별 완화** – (당시) NPC·직업 추정 등으로 ElvUI 타겟과 맞춤.
- **`mana mdebug`** – 적 이름표에 API 원시값 노란 표시.
---
## [2.1.6] - 2026-03-09
### Added
- **Mana mini-bar label (TOT-style)** – When nameplate mana is enabled and the unit qualifies, shows **`M : current/max`** under the health bar with the same mini-bar look as **`T : …`** (Plater health textures, blue fill for mana %). Easier to see whether mana detection is active.
### 한글
- **마나 미니바 라벨** – 조건 충족 시 **`M : 현재/최대`**, TOT와 같은 Plater 텍스처·파란 채움.
---
## [2.1.5] - 2026-03-09
### Fixed
- **Mana strip invisible** – Match **TOT**: parent the mana container to **`healthBar`** (not `FrameOverlay`). Use **OVERLAY** draw layers for background + status bar texture so Plater’s health fill does not paint on top of a BACKGROUND-layer strip.
### 한글
- **마나 띠 안 보임** – TOT처럼 **`healthBar`** 부모, **OVERLAY** 레이어로 체력 채움 아래에 가리지 않게.
---
## [2.1.4] - 2026-03-09
### Changed
- **Nameplate mana layout (ElvUI-like)** – Mana is drawn **inside** the Plater health bar on the **bottom ~25%** (when `nameplateManaHealthFraction` is `0.75`), parented to **`healthBar.FrameOverlay`** so it paints **above** the health textures. **Removed `customHealthBarHeight`** splitting (avoids clipping / invisible strips below the bar). Cast bar stays on Plater’s default anchor (under the full health bar).
### Fixed
- **`UpdatePlateSize` hook** – If `actorType` or plate config was missing, the old mana UI could stick; now **`clearManaBarOverride`** runs in those cases.
### 한글
- **이름표 마나 레이아웃** – 체력바 **안쪽 하단** ~25%, **`FrameOverlay`**. **`customHealthBarHeight`** 분할 제거. 시전바는 Plater 기본.
- **훅** – 설정 없을 때 **`clearManaBarOverride`** 로 잔상 제거.
---
## [2.1.3] - 2026-03-09
### Fixed
- **Nameplate mana not visible** – Nameplate units often report `UnitPowerMax` as **0** until later; if `UnitPowerType` is mana we still show the strip. **StatusBar** always gets a fallback texture (`UI-StatusBar`) and explicit `Show()`, higher frame level so it isn’t hidden under Plater’s power bar.
- **Layout timing** – After `NAME_PLATE_UNIT_ADDED`, deferred `UpdatePlateSize`; on `PLAYER_ENTERING_WORLD`, refresh all Plater plates after a short delay.
### Changed
- **Default `nameplateManaEnemiesOnly`** is now **false** for new saves (friendly mana units / dummies); existing SavedVariables unchanged.
### Added
- Slash: **`/platertot mana refresh`** (모든 이름표 `UpdatePlateSize` 재실행), **`/platertot mana debug`** (현재 대상의 파워 타입·max·표시 여부 출력).
### 한글
- **이름표 마나 안 보임** – `UnitPowerMax` 늦게 오는 경우에도 마나 타입이면 스트립 표시. **StatusBar** 기본 텍스처·표시·프레임 레벨.
- **레이아웃 타이밍** – 유닛 추가 후 지연 `UpdatePlateSize`, 맵 진입 후 전체 갱신.
- **기본 `nameplateManaEnemiesOnly`** – 신규 저장 **false**(아군·허수아비 테스트).
- **슬래시** – `mana refresh`, `mana debug`(대상 파워 정보).
---
## [2.1.2] - 2026-03-09
### Changed
- **Nameplate mana fill** – Uses a **StatusBar** with `SetMinMaxValues` / `SetValue` and `pcall(UnitPower, unit, displayType)` / `UnitPowerMax`, matching **oUF Power / ElvUI** style updates instead of resizing a texture by width.
### 한글
- **마나 채움** – **StatusBar** + `SetValue`로 갱신(oUF/ElvUI 스타일), 텍스처 너비 조절 대신.
---
## [2.1.1] - 2026-03-09
### Fixed
- **Nameplate mana detection** – Match ElvUI-style `UnitPowerType` handling: use power **token** `"MANA"` and numeric `0` (and `Enum.PowerType.Mana` when it matches), not `Enum` alone. Fixes mana users not showing a bar when the first return value didn’t match `Enum.PowerType.Mana`.
### 한글
- **이름표 마나 판별** – 토큰 **`"MANA"`**, 숫자 **0**, `Enum.PowerType.Mana` 병행(`Enum`만으로 판별하던 문제 수정).
---
## [2.1.0] - 2026-03-09
### Added
- **Nameplate unit mana strip (Plater not modified)** – For units with mana (`UnitPowerType` mana & `UnitPowerMax` > 0), uses Plater’s `unitFrame.customHealthBarHeight` so the health bar uses a fraction of the configured height (default **75%**), and draws a **PlaterTOT mana bar** in the remaining band under the health bar. **Cast bar is re-anchored** below that strip (same offsets Plater would use from the health bar) so it does not overlap.
- **Saved:** `showNameplateManaBar` (default on), `nameplateManaHealthFraction` (default `0.75`), `nameplateManaEnemiesOnly` (default on).
- **Slash:** `/platertot mana on|off`, `mana fraction 0.75` (0.5–0.92), `mana enemiesonly on|off`. Status line (`/platertot` / `tt`) includes mana settings.
- **Updates:** `UNIT_POWER_UPDATE` + throttled TOT loop refresh the mana fill.
### Technical
- `hooksecurefunc(Plater, "UpdatePlateSize", …)` after Plater lays out each plate; one recursive `UpdatePlateSize` when applying the height split (guarded against re-entrancy).
### 한글
- **이름표 마나 스트립** – 마나 유닛에 `customHealthBarHeight`로 체력 **75%** 등 분할, 아래 밴드에 마나 바. 시전바 **재앵커**.
- **저장·슬래시·갱신** – 위 영문과 동일(당시 `mana fraction` 상한 0.92).
### 기술
- `hooksecurefunc(Plater, "UpdatePlateSize", …)`, 재진입 방지.
---
## [2.0.0] - 2026-03-09
### Added
- **Auto “Use Tank Threat Colors”** – On non-Retail clients, syncs `Plater.db.profile.tank_threat_colors` from role/talents/class signals so you don’t toggle Plater’s option by hand. **Does not modify Plater files**; survives Plater updates unless Plater removes/changes those APIs.
- **Saved setting** `PlaterTOTDB.autoTankThreatColors` (default on), `## SavedVariables: PlaterTOTDB` in TOC.
- **Slash:** `/platertot tankthreat on|off|status` (short: `tt on|off`).
### Changed
- **Release** – **2.0.0** (major version bump from 1.x).
- Sync runs on **all Classic** (including **WotLK / Mists / 20th Anniversary**); earlier logic skipped WotLK/MoP so the option never updated there.
- **Warrior:** `GetTalentGroupRole` / party role first; then Details!Framework `GetRoleByClassicTalentTree` for Protection; then defensive stance (form 18), shield (not Gladiator 24).
- **Paladin:** Righteous Fury buff spell IDs **25780** / **407627** when role APIs are empty.
- **Druid:** Bear / Dire Bear only (`GetShapeshiftFormID` **5** / **8**); any non-bear form forces DPS mode for this option (cat, caster, travel, etc.).
### Fixed
- **SavedVariables:** `PlaterTOTDB` must be global (was `local`, so settings could fail to persist).
- **MoP:** Removed reliance on undefined `IS_WOW_PROJECT_CLASSIC_MOP` global.
- **Druid form switch:** Some builds don’t fire `UPDATE_SHAPESHIFT_FORM` reliably; **poll `GetShapeshiftFormID` on the existing throttled OnUpdate** (~0.15s) so bear ↔ cat updates the checkbox.
- **UNIT_AURA** throttling (~0.4s) for RF/other auras; immediate sync on equipment, shapeshift event, group, entering world, login (delayed 1.5s).
### 한글
- **탱 위협 색 자동** – 비리테일에서 `tank_threat_colors` 동기화. **Plater 파일 미수정**. 저장·슬래시 동일.
- **변경** – 2.0.0, WotLK·MoP·20주년 포함 클래식 전체 동기화. 전사·성기사·드루 판별 로직(영문과 동일).
- **수정** – 전역 `PlaterTOTDB`, MoP 전역 제거, 드루 폼 **OnUpdate** 폴링, **UNIT_AURA** 쓰로틀.
---
## [1.0.3] - 2025-03-09
### Changed
- **Version bump** – For CurseForge re-upload (previous reject due to duplicate file). No gameplay changes from 1.0.2.
### 한글
- **버전만 상향** – CurseForge 재업로드용. 1.0.2와 동작 동일.
---
## [1.0.2] - 2025-03-09
### Changed
- **"T" color by relation** – The "T" prefix is red when the target of target is an enemy; white when friendly.
- **Target name** – Always white (no class color on name; bar fill keeps class color).
### 한글
- **"T" 색** – 대상의 대상이 적이면 빨강, 아군이면 흰색.
- **이름** – 항상 흰색(바 채움만 직업색).
---
## [1.0.1] - 2025-03-09
### Fixed
- **TOT health bar class color** – The selection overlay was drawn above the class-colored fill (ARTWORK layer), making the bar look washed out. The overlay is now on the BACKGROUND layer below the fill (sublayers 1 and 2), so the class color displays clearly on top.
### 한글
- **TOT 직업색** – 선택 오버레이를 채움 **아래** BACKGROUND로 옮겨 직업색이 선명하게 보이게 함.
---
## [1.0.0] - 2025-03-09
### Added
- **Target of Target on nameplates** – Shows who the nameplate unit is targeting above the health bar when that target is not the player.
- **Display format** – `T : [target name]` with white text and thin black outline for readability.
- **Class-colored health bar** – Bar background is semi-transparent (like Plater’s health bar); fill uses the target’s class color and is fully opaque.
- **Health-based fill** – Fill width reflects the TOT target’s current health percentage (left-to-right).
- **Bar width** – Bar length follows the text width (name length).
- **Plater integration** – Hides Plater’s built-in TOT text so only PlaterTOT’s bar is shown. Does not modify Plater files.
- **Dependency** – Declares Plater as a dependency in the TOC.
- **Compatibility** – Supports multiple WoW clients (Retail, Classic, TBC, Wrath, etc.) via Interface version tags in the TOC.
### Technical
- Uses `NAME_PLATE_UNIT_ADDED` / `NAME_PLATE_UNIT_REMOVED` and a throttled update loop for performance.
- TOT frame is parented to Plater’s health bar with a higher frame level so it draws above buff/debuff icons.
### 한글
- **이름표 TOT** – 플레이어가 아닌 대상을 잡을 때 체력바 위에 `T : 이름` 표시.
- **표시** – 흰 글·검은 외곽선, 직업색 채움·체력 비율, 너비는 텍스트에 맞춤.
- **Plater** – 기본 TOT 텍스트 숨김, 파일 미수정. TOC 의존성·다중 클라이언트 태그.
### 기술
- 이름표 이벤트 + 쓰로틀 루프, 체력바 부모·높은 프레임 레벨.

