Combat API (Retail — Patch 12.0.0)
Comprehensive reference for all combat-related APIs in WoW Retail. Critical: The combat log system was fundamentally changed in 12.0.0. COMBAT_LOG_EVENT_UNFILTERED is no longer available to addons.
Source: https://warcraft.wiki.gg/wiki/World_of_Warcraft_API
Current as of: Patch 12.0.0 (Build 65655) — January 28, 2026
Scope: Retail only.
CRITICAL: Combat Log Changes in 12.0.0
COMBAT_LOG_EVENT_UNFILTERED (CLEU) is NO LONGER available to addons.
CombatLogGetCurrentEventInfo() is unavailable to tainted (addon) code
- The old
COMBAT_LOG_EVENT event is also unavailable
- Combat log chat tab messages are now KStrings (unparseable escape sequences)
- Addons like damage meters must use
C_DamageMeter or the built-in system
- A new
COMBAT_LOG_EVENT_INTERNAL_UNFILTERED exists but is restricted to Blizzard code
New Combat Log Events (Addon-Facing)
| Event |
Description |
COMBAT_LOG_MESSAGE |
Formatted combat log messages (display text only) |
COMBAT_LOG_ENTRIES_CLEARED |
Combat log entries cleared |
COMBAT_LOG_APPLY_FILTER_SETTINGS |
Filter settings changed |
COMBAT_LOG_REFILTER_ENTRIES |
Entries need refiltering |
COMBAT_LOG_MESSAGE_LIMIT_CHANGED |
Message limit changed |
Scope
This skill covers:
- Combat Log — New 12.0.0 combat log system, COMBAT_LOG_MESSAGE
- C_DamageMeter — Built-in damage/healing meter system
- Threat — UnitThreatSituation, UnitDetailedThreatSituation
- C_LossOfControl — Loss of control tracking
- C_CombatText — Floating combat text
- C_CombatAudioAlert — Combat audio alert system (accessibility)
- C_Secrets / C_CurveUtil / C_DurationUtil — Secret value handling for combat data
- Encounter Events — ENCOUNTER_STATE_CHANGED, ENCOUNTER_WARNING, timeline events
- Spectator/Commentator — C_Commentator for spectator mode
C_DamageMeter — Built-in Damage Meter
New in 12.0.0. Provides official damage/healing meter data without needing combat log parsing.
Functions
| Function |
Returns |
Description |
C_DamageMeter.GetCurrentSessionID() |
sessionID |
Current combat session |
C_DamageMeter.GetSessions() |
sessions |
All available sessions |
C_DamageMeter.GetSessionInfo(sessionID) |
sessionInfo |
Session details |
C_DamageMeter.GetPlayerData(sessionID, unitGUID) |
playerData |
Player's damage/healing |
C_DamageMeter.GetPartyData(sessionID) |
partyData |
All party/raid data |
C_DamageMeter.ResetSessions() |
— |
Clear all sessions |
Events
| Event |
Description |
DAMAGE_METER_COMBAT_SESSION_UPDATED |
Session data updated |
DAMAGE_METER_CURRENT_SESSION_UPDATED |
Current session changed |
DAMAGE_METER_RESET |
Sessions cleared |
Pattern: Reading Damage Meter Data
local frame = CreateFrame("Frame")
frame:RegisterEvent("DAMAGE_METER_COMBAT_SESSION_UPDATED")
frame:SetScript("OnEvent", function(self, event)
local sessionID = C_DamageMeter.GetCurrentSessionID()
if sessionID then
local partyData = C_DamageMeter.GetPartyData(sessionID)
-- partyData contains per-player damage/healing totals
end
end)
Threat API
Threat Functions
| Function |
Returns |
Description |
UnitThreatSituation(unit [, target]) |
status |
Threat status (0-3) |
UnitDetailedThreatSituation(unit, target) |
isTanking, status, scaledPercent, rawPercent, threatValue |
Detailed threat info |
UnitThreatPercentageOfLead(unit, target) |
percent |
Threat lead percentage |
Threat Status Values
| Value |
Meaning |
| 0 |
Not on threat table |
| 1 |
On threat table, not tanking, not highest |
| 2 |
On threat table, not tanking, highest |
| 3 |
Tanking (highest threat with aggro) |
| nil |
Unit doesn't exist or has no threat table |
Note: In 12.0.0 instances, threat values for non-player units may be secret values. Pass them directly to UI widgets.
C_LossOfControl
Tracks crowd control effects on the player.
| Function |
Returns |
Description |
C_LossOfControl.GetActiveLossOfControlData(index) |
data |
Active CC effect data |
C_LossOfControl.GetActiveLossOfControlDataByUnit(unit, index) |
data |
CC data for unit |
C_LossOfControl.GetActiveLossOfControlDataCount() |
count |
Number of active CC effects |
C_LossOfControl.GetActiveLossOfControlDataCountByUnit(unit) |
count |
CC count for unit |
Loss of Control Data Fields
locType — Type of CC (STUN, FEAR, SILENCE, etc.)
spellID — Spell causing the CC
displayText — Localized display text
iconTexture — Spell icon
startTime — When CC started
timeRemaining — Duration remaining (may be DurationObject in 12.0.0)
duration — Total duration
lockoutSchool — School lockout (for SCHOOL_INTERRUPT type)
priority — Display priority
Events
| Event |
Description |
LOSS_OF_CONTROL_ADDED |
New CC effect applied |
LOSS_OF_CONTROL_UPDATE |
CC effect updated |
C_CombatText — Floating Combat Text
| Function |
Returns |
Description |
C_CombatText.IsCombatTextEnabled() |
enabled |
FCT enabled? |
Combat Text CVars
| CVar |
Description |
enableFloatingCombatText |
Enable/disable FCT |
floatingCombatTextCombatDamage |
Show damage |
floatingCombatTextCombatHealing |
Show healing |
floatingCombatTextCombatDamageStyle |
Damage display style |
C_CombatAudioAlert — Combat Audio Alerts
New accessibility system providing audio cues for combat events. Replaces some functionality that previously required combat log parsing.
| Function |
Returns |
Description |
C_CombatAudioAlert.IsEnabled() |
enabled |
Audio alerts enabled? |
C_CombatAudioAlert.SetEnabled(enabled) |
— |
Enable/disable |
Secret Value Handling for Combat Data
C_Secrets — Secret Predicates
| Function |
Returns |
Description |
C_Secrets.ShouldUnitHealthBeSecret(unit) |
isSecret |
Is health secret for this unit? |
C_Secrets.ShouldUnitPowerBeSecret(unit [, powerType]) |
isSecret |
Is power secret? |
C_Secrets.ShouldUnitPowerMaxBeSecret(unit [, powerType]) |
isSecret |
Is max power secret? |
C_Secrets.ShouldUnitSpellCastBeSecret(unit, spellIdentifier) |
isSpellCastSecret |
Is spell cast secret? |
C_Secrets.ShouldUnitSpellCastingBeSecret(unit) |
isSpellCastingSecret |
Is all casting secret? |
C_CurveUtil — Curves for Secret Values
Since addons cannot do math on secret values, Curves allow mapping secret numbers to visual output.
| Function |
Returns |
Description |
C_CurveUtil.CreateCurve() |
curveObject |
Create a numeric curve |
C_CurveUtil.CreateColorCurve() |
colorCurveObject |
Create a color curve |
Pattern: Health-to-Color Without Inspecting Value
-- Create a color curve: green at 100% → red at 0%
local colorCurve = C_CurveUtil.CreateColorCurve()
-- Configure curve points (green → yellow → red)
local healthBar = CreateFrame("StatusBar", nil, parent)
local hp = UnitHealth(unit) -- SECRET in instances
local maxHp = UnitHealthMax(unit) -- SECRET in instances
healthBar:SetMinMaxValues(0, maxHp) -- widgets accept secrets
healthBar:SetValue(hp) -- widgets accept secrets
-- Color is set by curve without addon seeing the actual number
C_DurationUtil — Duration Objects
| Function |
Returns |
Description |
C_DurationUtil.CreateDuration() |
durationObject |
Create a duration object |
-- Use DurationObject for cooldown display
local cooldown = CreateFrame("Cooldown", nil, parent, "CooldownFrameTemplate")
local duration = C_DurationUtil.CreateDuration()
cooldown:SetCooldownFromDurationObject(duration)
Encounter Events
New in 12.0.0, these replace addon combat log parsing for encounter state tracking.
| Event |
Description |
ENCOUNTER_STATE_CHANGED |
Encounter state changed (pull, wipe, kill) |
ENCOUNTER_WARNING |
Built-in encounter warning system |
ENCOUNTER_TIMELINE_EVENT_START |
Timeline event started |
ENCOUNTER_TIMELINE_EVENT_UPDATE |
Timeline event updated |
ENCOUNTER_TIMELINE_EVENT_END |
Timeline event ended |
Other Combat Events
| Event |
Description |
PLAYER_REGEN_DISABLED |
Entering combat |
PLAYER_REGEN_ENABLED |
Leaving combat |
PLAYER_ENTER_COMBAT |
Player starts auto-attack |
PLAYER_LEAVE_COMBAT |
Player stops auto-attack |
UNIT_COMBAT |
Unit took/dealt damage or healing |
UNIT_THREAT_SITUATION_UPDATE |
Threat status changed |
UNIT_THREAT_LIST_UPDATE |
Threat table updated |
PLAYER_DEAD |
Player died |
PLAYER_ALIVE |
Player released spirit |
PLAYER_UNGHOST |
Player resurrected |
Commentator / Spectator API
C_Commentator provides spectator mode functionality for esports viewing.
Key Functions
| Function |
Returns |
Description |
C_Commentator.IsSpectating() |
isSpectating |
In spectator mode? |
C_Commentator.GetAllPlayerData(teamIndex) |
playerData |
All player data for team |
C_Commentator.GetPlayerData(teamIndex, playerIndex) |
data |
Specific player data |
C_Commentator.GetTeamColorAndName(teamIndex) |
color, name |
Team info |
C_Commentator.GetMatchDuration() |
duration |
Match elapsed time |
C_Commentator.StartWargame(...) |
— |
Start a wargame |
C_Commentator.UpdatePlayerInfo() |
— |
Refresh player data |
Common Patterns
Check Combat State
local function IsInCombat()
return UnitAffectingCombat("player")
end
-- Or use the lockdown check for secure frame operations
if InCombatLockdown() then
print("In combat lockdown — restricted operations blocked")
end
Threat-Based Nameplate Coloring
-- Note: In 12.0.0 instances, threat values may be secret
local status = UnitThreatSituation("player", "target")
if not issecretvalue(status) then
if status == 3 then
-- Tanking — show red
elseif status == 2 then
-- Pulling aggro — show orange
else
-- Safe — show green
end
end
Loss of Control Display
local frame = CreateFrame("Frame")
frame:RegisterEvent("LOSS_OF_CONTROL_ADDED")
frame:RegisterEvent("LOSS_OF_CONTROL_UPDATE")
frame:SetScript("OnEvent", function()
local count = C_LossOfControl.GetActiveLossOfControlDataCount()
for i = 1, count do
local data = C_LossOfControl.GetActiveLossOfControlData(i)
if data then
print(data.displayText, data.timeRemaining)
end
end
end)
Gotchas & Restrictions
- CLEU is GONE — Do NOT register for
COMBAT_LOG_EVENT_UNFILTERED. It will not fire for addon code in 12.0.0.
- No combat log parsing —
CombatLogGetCurrentEventInfo() is unavailable to tainted code.
- KString chat messages — Combat log chat tab output is now KStrings that cannot be parsed.
- Health is secret —
UnitHealth() returns secret values in instances. Pass directly to StatusBar:SetValue().
- Use DurationObjects — Don't do manual cooldown math. Use
C_DurationUtil.CreateDuration() and Cooldown:SetCooldownFromDurationObject().
- Built-in damage meter — Use
C_DamageMeter for damage/healing data instead of parsing combat events.
- SendAddonMessage blocked — Cannot send addon messages in instances. Boss mod addons must use new encounter event patterns.
- Unit identity restricted —
UnitName(), UnitClass() may return secrets for enemy units in instances during combat.
- Threat in instances — Threat values may be secret. Pass to widgets directly; don't branch on them.
- Design philosophy — Addons should NOT provide competitive advantage in combat. Blizzard provides built-in replacements for most restricted functionality.
1---2name: wow-api-combat3description: Complete reference for WoW Retail Combat, Damage Meter, Threat, Loss of Control, Combat Text, Combat Audio Alert, Secret Values, and Spectator APIs. Covers the 12.0.0 combat log removal (CLEU no longer available to addons), C_DamageMeter built-in damage meter, C_Secrets secret predicates, C_CurveUtil/C_DurationUtil for secret value visualization, C_LossOfControl, C_CombatText, C_CombatAudioAlert, ENCOUNTER_STATE_CHANGED, threat functions, and the new COMBAT_LOG_MESSAGE event. Use when working with combat data, damage meters, threat, loss of control, combat text, encounter events, or any combat-related addon functionality.4---5
6# Combat API (Retail — Patch 12.0.0)
7
8Comprehensive reference for all combat-related APIs in WoW Retail. **Critical: The combat log system was fundamentally changed in 12.0.0.** `COMBAT_LOG_EVENT_UNFILTERED` is no longer available to addons.
9
10> **Source:** https://warcraft.wiki.gg/wiki/World_of_Warcraft_API
11> **Current as of:** Patch 12.0.0 (Build 65655) — January 28, 2026
12> **Scope:** Retail only.
13
14## CRITICAL: Combat Log Changes in 12.0.0
15
16**`COMBAT_LOG_EVENT_UNFILTERED` (CLEU) is NO LONGER available to addons.**
17
18- `CombatLogGetCurrentEventInfo()` is unavailable to tainted (addon) code
19- The old `COMBAT_LOG_EVENT` event is also unavailable
20- Combat log chat tab messages are now **KStrings** (unparseable escape sequences)
21- Addons like damage meters must use `C_DamageMeter` or the built-in system
22- A new `COMBAT_LOG_EVENT_INTERNAL_UNFILTERED` exists but is restricted to Blizzard code
23
24### New Combat Log Events (Addon-Facing)
25
26| Event | Description |
27|-------|-------------|
28| `COMBAT_LOG_MESSAGE` | Formatted combat log messages (display text only) |
29| `COMBAT_LOG_ENTRIES_CLEARED` | Combat log entries cleared |
30| `COMBAT_LOG_APPLY_FILTER_SETTINGS` | Filter settings changed |
31| `COMBAT_LOG_REFILTER_ENTRIES` | Entries need refiltering |
32| `COMBAT_LOG_MESSAGE_LIMIT_CHANGED` | Message limit changed |
33
34---
35
36## Scope
37
38This skill covers:
39
40- **Combat Log** — New 12.0.0 combat log system, COMBAT_LOG_MESSAGE
41- **C_DamageMeter** — Built-in damage/healing meter system
42- **Threat** — UnitThreatSituation, UnitDetailedThreatSituation
43- **C_LossOfControl** — Loss of control tracking
44- **C_CombatText** — Floating combat text
45- **C_CombatAudioAlert** — Combat audio alert system (accessibility)
46- **C_Secrets / C_CurveUtil / C_DurationUtil** — Secret value handling for combat data
47- **Encounter Events** — ENCOUNTER_STATE_CHANGED, ENCOUNTER_WARNING, timeline events
48- **Spectator/Commentator** — C_Commentator for spectator mode
49
50---
51
52## C_DamageMeter — Built-in Damage Meter
53
54New in 12.0.0. Provides official damage/healing meter data without needing combat log parsing.
55
56### Functions
57
58| Function | Returns | Description |
59|----------|---------|-------------|
60| `C_DamageMeter.GetCurrentSessionID()` | `sessionID` | Current combat session |
61| `C_DamageMeter.GetSessions()` | `sessions` | All available sessions |
62| `C_DamageMeter.GetSessionInfo(sessionID)` | `sessionInfo` | Session details |
63| `C_DamageMeter.GetPlayerData(sessionID, unitGUID)` | `playerData` | Player's damage/healing |
64| `C_DamageMeter.GetPartyData(sessionID)` | `partyData` | All party/raid data |
65| `C_DamageMeter.ResetSessions()` | — | Clear all sessions |
66
67### Events
68
69| Event | Description |
70|-------|-------------|
71| `DAMAGE_METER_COMBAT_SESSION_UPDATED` | Session data updated |
72| `DAMAGE_METER_CURRENT_SESSION_UPDATED` | Current session changed |
73| `DAMAGE_METER_RESET` | Sessions cleared |
74
75### Pattern: Reading Damage Meter Data
76
77```lua
78local frame = CreateFrame("Frame")
79frame:RegisterEvent("DAMAGE_METER_COMBAT_SESSION_UPDATED")
80frame:SetScript("OnEvent", function(self, event)
81 local sessionID = C_DamageMeter.GetCurrentSessionID()
82 if sessionID then
83 local partyData = C_DamageMeter.GetPartyData(sessionID)
84 -- partyData contains per-player damage/healing totals
85 end
86end)
87```
88
89---
90
91## Threat API
92
93### Threat Functions
94
95| Function | Returns | Description |
96|----------|---------|-------------|
97| `UnitThreatSituation(unit [, target])` | `status` | Threat status (0-3) |
98| `UnitDetailedThreatSituation(unit, target)` | `isTanking, status, scaledPercent, rawPercent, threatValue` | Detailed threat info |
99| `UnitThreatPercentageOfLead(unit, target)` | `percent` | Threat lead percentage |
100
101### Threat Status Values
102
103| Value | Meaning |
104|-------|---------|
105| 0 | Not on threat table |
106| 1 | On threat table, not tanking, not highest |
107| 2 | On threat table, not tanking, highest |
108| 3 | Tanking (highest threat with aggro) |
109| nil | Unit doesn't exist or has no threat table |
110
111> **Note:** In 12.0.0 instances, threat values for non-player units may be **secret values**. Pass them directly to UI widgets.
112
113---
114
115## C_LossOfControl
116
117Tracks crowd control effects on the player.
118
119| Function | Returns | Description |
120|----------|---------|-------------|
121| `C_LossOfControl.GetActiveLossOfControlData(index)` | `data` | Active CC effect data |
122| `C_LossOfControl.GetActiveLossOfControlDataByUnit(unit, index)` | `data` | CC data for unit |
123| `C_LossOfControl.GetActiveLossOfControlDataCount()` | `count` | Number of active CC effects |
124| `C_LossOfControl.GetActiveLossOfControlDataCountByUnit(unit)` | `count` | CC count for unit |
125
126### Loss of Control Data Fields
127
128- `locType` — Type of CC (STUN, FEAR, SILENCE, etc.)
129- `spellID` — Spell causing the CC
130- `displayText` — Localized display text
131- `iconTexture` — Spell icon
132- `startTime` — When CC started
133- `timeRemaining` — Duration remaining (may be DurationObject in 12.0.0)
134- `duration` — Total duration
135- `lockoutSchool` — School lockout (for SCHOOL_INTERRUPT type)
136- `priority` — Display priority
137
138### Events
139
140| Event | Description |
141|-------|-------------|
142| `LOSS_OF_CONTROL_ADDED` | New CC effect applied |
143| `LOSS_OF_CONTROL_UPDATE` | CC effect updated |
144
145---
146
147## C_CombatText — Floating Combat Text
148
149| Function | Returns | Description |
150|----------|---------|-------------|
151| `C_CombatText.IsCombatTextEnabled()` | `enabled` | FCT enabled? |
152
153### Combat Text CVars
154
155| CVar | Description |
156|------|-------------|
157| `enableFloatingCombatText` | Enable/disable FCT |
158| `floatingCombatTextCombatDamage` | Show damage |
159| `floatingCombatTextCombatHealing` | Show healing |
160| `floatingCombatTextCombatDamageStyle` | Damage display style |
161
162---
163
164## C_CombatAudioAlert — Combat Audio Alerts
165
166New accessibility system providing audio cues for combat events. Replaces some functionality that previously required combat log parsing.
167
168| Function | Returns | Description |
169|----------|---------|-------------|
170| `C_CombatAudioAlert.IsEnabled()` | `enabled` | Audio alerts enabled? |
171| `C_CombatAudioAlert.SetEnabled(enabled)` | — | Enable/disable |
172
173---
174
175## Secret Value Handling for Combat Data
176
177### C_Secrets — Secret Predicates
178
179| Function | Returns | Description |
180|----------|---------|-------------|
181| `C_Secrets.ShouldUnitHealthBeSecret(unit)` | `isSecret` | Is health secret for this unit? |
182| `C_Secrets.ShouldUnitPowerBeSecret(unit [, powerType])` | `isSecret` | Is power secret? |
183| `C_Secrets.ShouldUnitPowerMaxBeSecret(unit [, powerType])` | `isSecret` | Is max power secret? |
184| `C_Secrets.ShouldUnitSpellCastBeSecret(unit, spellIdentifier)` | `isSpellCastSecret` | Is spell cast secret? |
185| `C_Secrets.ShouldUnitSpellCastingBeSecret(unit)` | `isSpellCastingSecret` | Is all casting secret? |
186
187### C_CurveUtil — Curves for Secret Values
188
189Since addons cannot do math on secret values, Curves allow mapping secret numbers to visual output.
190
191| Function | Returns | Description |
192|----------|---------|-------------|
193| `C_CurveUtil.CreateCurve()` | `curveObject` | Create a numeric curve |
194| `C_CurveUtil.CreateColorCurve()` | `colorCurveObject` | Create a color curve |
195
196### Pattern: Health-to-Color Without Inspecting Value
197
198```lua
199-- Create a color curve: green at 100% → red at 0%
200local colorCurve = C_CurveUtil.CreateColorCurve()
201-- Configure curve points (green → yellow → red)
202
203local healthBar = CreateFrame("StatusBar", nil, parent)
204local hp = UnitHealth(unit) -- SECRET in instances
205local maxHp = UnitHealthMax(unit) -- SECRET in instances
206healthBar:SetMinMaxValues(0, maxHp) -- widgets accept secrets
207healthBar:SetValue(hp) -- widgets accept secrets
208-- Color is set by curve without addon seeing the actual number
209```
210
211### C_DurationUtil — Duration Objects
212
213| Function | Returns | Description |
214|----------|---------|-------------|
215| `C_DurationUtil.CreateDuration()` | `durationObject` | Create a duration object |
216
217```lua
218-- Use DurationObject for cooldown display
219local cooldown = CreateFrame("Cooldown", nil, parent, "CooldownFrameTemplate")
220local duration = C_DurationUtil.CreateDuration()
221cooldown:SetCooldownFromDurationObject(duration)
222```
223
224---
225
226## Encounter Events
227
228New in 12.0.0, these replace addon combat log parsing for encounter state tracking.
229
230| Event | Description |
231|-------|-------------|
232| `ENCOUNTER_STATE_CHANGED` | Encounter state changed (pull, wipe, kill) |
233| `ENCOUNTER_WARNING` | Built-in encounter warning system |
234| `ENCOUNTER_TIMELINE_EVENT_START` | Timeline event started |
235| `ENCOUNTER_TIMELINE_EVENT_UPDATE` | Timeline event updated |
236| `ENCOUNTER_TIMELINE_EVENT_END` | Timeline event ended |
237
238### Other Combat Events
239
240| Event | Description |
241|-------|-------------|
242| `PLAYER_REGEN_DISABLED` | Entering combat |
243| `PLAYER_REGEN_ENABLED` | Leaving combat |
244| `PLAYER_ENTER_COMBAT` | Player starts auto-attack |
245| `PLAYER_LEAVE_COMBAT` | Player stops auto-attack |
246| `UNIT_COMBAT` | Unit took/dealt damage or healing |
247| `UNIT_THREAT_SITUATION_UPDATE` | Threat status changed |
248| `UNIT_THREAT_LIST_UPDATE` | Threat table updated |
249| `PLAYER_DEAD` | Player died |
250| `PLAYER_ALIVE` | Player released spirit |
251| `PLAYER_UNGHOST` | Player resurrected |
252
253---
254
255## Commentator / Spectator API
256
257`C_Commentator` provides spectator mode functionality for esports viewing.
258
259### Key Functions
260
261| Function | Returns | Description |
262|----------|---------|-------------|
263| `C_Commentator.IsSpectating()` | `isSpectating` | In spectator mode? |
264| `C_Commentator.GetAllPlayerData(teamIndex)` | `playerData` | All player data for team |
265| `C_Commentator.GetPlayerData(teamIndex, playerIndex)` | `data` | Specific player data |
266| `C_Commentator.GetTeamColorAndName(teamIndex)` | `color, name` | Team info |
267| `C_Commentator.GetMatchDuration()` | `duration` | Match elapsed time |
268| `C_Commentator.StartWargame(...)` | — | Start a wargame |
269| `C_Commentator.UpdatePlayerInfo()` | — | Refresh player data |
270
271---
272
273## Common Patterns
274
275### Check Combat State
276
277```lua
278local function IsInCombat()
279 return UnitAffectingCombat("player")
280end
281
282-- Or use the lockdown check for secure frame operations
283if InCombatLockdown() then
284 print("In combat lockdown — restricted operations blocked")
285end
286```
287
288### Threat-Based Nameplate Coloring
289
290```lua
291-- Note: In 12.0.0 instances, threat values may be secret
292local status = UnitThreatSituation("player", "target")
293if not issecretvalue(status) then
294 if status == 3 then
295 -- Tanking — show red
296 elseif status == 2 then
297 -- Pulling aggro — show orange
298 else
299 -- Safe — show green
300 end
301end
302```
303
304### Loss of Control Display
305
306```lua
307local frame = CreateFrame("Frame")
308frame:RegisterEvent("LOSS_OF_CONTROL_ADDED")
309frame:RegisterEvent("LOSS_OF_CONTROL_UPDATE")
310frame:SetScript("OnEvent", function()
311 local count = C_LossOfControl.GetActiveLossOfControlDataCount()
312 for i = 1, count do
313 local data = C_LossOfControl.GetActiveLossOfControlData(i)
314 if data then
315 print(data.displayText, data.timeRemaining)
316 end
317 end
318end)
319```
320
321---
322
323## Gotchas & Restrictions
324
3251. **CLEU is GONE** — Do NOT register for `COMBAT_LOG_EVENT_UNFILTERED`. It will not fire for addon code in 12.0.0.
3262. **No combat log parsing** — `CombatLogGetCurrentEventInfo()` is unavailable to tainted code.
3273. **KString chat messages** — Combat log chat tab output is now KStrings that cannot be parsed.
3284. **Health is secret** — `UnitHealth()` returns secret values in instances. Pass directly to `StatusBar:SetValue()`.
3295. **Use DurationObjects** — Don't do manual cooldown math. Use `C_DurationUtil.CreateDuration()` and `Cooldown:SetCooldownFromDurationObject()`.
3306. **Built-in damage meter** — Use `C_DamageMeter` for damage/healing data instead of parsing combat events.
3317. **SendAddonMessage blocked** — Cannot send addon messages in instances. Boss mod addons must use new encounter event patterns.
3328. **Unit identity restricted** — `UnitName()`, `UnitClass()` may return secrets for enemy units in instances during combat.
3339. **Threat in instances** — Threat values may be secret. Pass to widgets directly; don't branch on them.
33410. **Design philosophy** — Addons should NOT provide competitive advantage in combat. Blizzard provides built-in replacements for most restricted functionality.