Skip to content

Commit 7b32bab

Browse files
Merge branch 'main' into partyIndexText
2 parents 7151d83 + 42f6609 commit 7b32bab

13 files changed

Lines changed: 190 additions & 23 deletions

File tree

AuraDesigner/AuraAdapter.lua

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -108,10 +108,31 @@ function Provider:GetUnitAuras(unit, spec)
108108
scannedCount = scannedCount + 1
109109
local sid = auraData.spellId
110110

111-
-- Skip auras with secret spellIds — they are not
112-
-- on Blizzard's whitelist so they are not ours.
111+
-- Handle secret vs whitelisted auras
113112
if not sid or issecretvalue(sid) then
114-
-- not a trackable aura, skip
113+
-- Secret aura — try inline fingerprint matching
114+
-- (same tick as indicator rendering, avoids race condition)
115+
local SecretModule = DF.AuraDesigner.SecretAuras
116+
if SecretModule and auraData.auraInstanceID then
117+
local matchedName = SecretModule:MatchAura(unit, auraData, spec)
118+
if matchedName then
119+
local knownSpellId = forwardLookup and forwardLookup[matchedName]
120+
local iconTex = DF.AuraDesigner.IconTextures and DF.AuraDesigner.IconTextures[matchedName]
121+
result[matchedName] = {
122+
spellId = knownSpellId or 0,
123+
icon = iconTex or auraData.icon,
124+
duration = auraData.duration,
125+
expirationTime = auraData.expirationTime,
126+
stacks = auraData.applications,
127+
caster = auraData.sourceUnit,
128+
auraInstanceID = auraData.auraInstanceID,
129+
secret = true,
130+
}
131+
matchedCount = matchedCount + 1
132+
-- Update state cache for disambiguation engines
133+
SecretModule:RecordMatch(unit, auraData.auraInstanceID, matchedName)
134+
end
135+
end
115136
else
116137
local auraName = lookup[sid]
117138
if auraName then
@@ -132,7 +153,8 @@ function Provider:GetUnitAuras(unit, spec)
132153
end
133154
end
134155

135-
-- Merge secret-tracked auras (fingerprint + cast tracking system)
156+
-- Merge disambiguation overrides from SecretAuras state cache
157+
-- (e.g. VerdantEmbrace → Lifebind reclassification after 0.1s timer)
136158
local SecretAurasModule = DF.AuraDesigner.SecretAuras
137159
if SecretAurasModule then
138160
local secretResult = SecretAurasModule:GetUnitAuras(unit, spec)

AuraDesigner/Config.lua

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,16 @@ DF.AuraDesigner.IconTextures = {
113113
Dawnlight = 5927633,
114114
}
115115

116+
-- ============================================================
117+
-- TOOLTIP SPELL ID OVERRIDES
118+
-- Some aura spell IDs are internal/secret and produce wrong tooltips
119+
-- (e.g. 409895 shows "Upheaval" instead of "Verdant Embrace").
120+
-- Map aura name → castable spell ID for correct tooltip display.
121+
-- ============================================================
122+
DF.AuraDesigner.TooltipSpellIDs = {
123+
VerdantEmbrace = 360995,
124+
}
125+
116126
-- ============================================================
117127
-- SPELL IDS PER SPEC
118128
-- Used for runtime aura matching via reverse spell ID lookup

AuraDesigner/Options.lua

Lines changed: 88 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ local tinsert = table.insert
1313
local tremove = table.remove
1414
local max, min = math.max, math.min
1515
local sort = table.sort
16+
local RAID_CLASS_COLORS = RAID_CLASS_COLORS
1617

1718
-- Local references set during BuildAuraDesignerPage
1819
local GUI
@@ -2881,15 +2882,26 @@ local function CreateEnableBanner(parent)
28812882

28822883
local function UpdateSpecText()
28832884
local adDB = GetAuraDesignerDB()
2885+
local resolvedSpec
28842886
if adDB.spec == "auto" then
28852887
local autoSpec = Adapter:GetPlayerSpec()
28862888
if autoSpec then
28872889
specBtn.text:SetText("Auto (" .. Adapter:GetSpecDisplayName(autoSpec) .. ")")
2890+
resolvedSpec = autoSpec
28882891
else
28892892
specBtn.text:SetText("Auto (detect)")
28902893
end
28912894
else
28922895
specBtn.text:SetText(Adapter:GetSpecDisplayName(adDB.spec))
2896+
resolvedSpec = adDB.spec
2897+
end
2898+
-- Color the button text by class color
2899+
local specInfoEntry = resolvedSpec and DF.AuraDesigner.SpecInfo[resolvedSpec]
2900+
local cc = specInfoEntry and RAID_CLASS_COLORS[specInfoEntry.class]
2901+
if cc then
2902+
specBtn.text:SetTextColor(cc.r, cc.g, cc.b)
2903+
else
2904+
specBtn.text:SetTextColor(C_TEXT.r, C_TEXT.g, C_TEXT.b)
28932905
end
28942906
end
28952907

@@ -2925,10 +2937,24 @@ local function CreateEnableBanner(parent)
29252937
local label = btn:CreateFontString(nil, "OVERLAY", "GameFontHighlightSmall")
29262938
label:SetPoint("LEFT", 4, 0)
29272939
label:SetText(opt[2])
2928-
label:SetTextColor(C_TEXT.r, C_TEXT.g, C_TEXT.b)
29292940

2930-
btn:SetScript("OnEnter", function() label:SetTextColor(1, 1, 1) end)
2931-
btn:SetScript("OnLeave", function() label:SetTextColor(C_TEXT.r, C_TEXT.g, C_TEXT.b) end)
2941+
-- Color by class for spec entries, default for "auto"
2942+
local specInfoEntry = DF.AuraDesigner.SpecInfo[opt[1]]
2943+
local cc = specInfoEntry and RAID_CLASS_COLORS[specInfoEntry.class]
2944+
local baseR, baseG, baseB = C_TEXT.r, C_TEXT.g, C_TEXT.b
2945+
if cc then
2946+
baseR, baseG, baseB = cc.r, cc.g, cc.b
2947+
end
2948+
label:SetTextColor(baseR, baseG, baseB)
2949+
2950+
btn:SetScript("OnEnter", function()
2951+
if cc then
2952+
label:SetTextColor(min(baseR + 0.2, 1), min(baseG + 0.2, 1), min(baseB + 0.2, 1))
2953+
else
2954+
label:SetTextColor(1, 1, 1)
2955+
end
2956+
end)
2957+
btn:SetScript("OnLeave", function() label:SetTextColor(baseR, baseG, baseB) end)
29322958
btn:SetScript("OnClick", function()
29332959
GetAuraDesignerDB().spec = opt[1]
29342960
specMenu:Hide()
@@ -3407,9 +3433,11 @@ local function CreateSpellCard(grid, auraInfo, spec, x, y, CARD_SIZE, isSecret)
34073433
usedLabel:SetTextColor(0.6, 0.6, 0.6)
34083434
end
34093435

3410-
-- Spell tooltip on hover
3436+
-- Spell tooltip on hover (use tooltip override if available)
3437+
local tooltipOverrides = DF.AuraDesigner.TooltipSpellIDs
34113438
local spellIDs = DF.AuraDesigner.SpellIDs
3412-
local spellID = spellIDs and spellIDs[spec] and spellIDs[spec][auraInfo.name]
3439+
local spellID = tooltipOverrides and tooltipOverrides[auraInfo.name]
3440+
or spellIDs and spellIDs[spec] and spellIDs[spec][auraInfo.name]
34133441

34143442
if alreadyUsed then
34153443
-- Used cards still get tooltips but no highlight/click
@@ -4585,14 +4613,6 @@ BuildLayoutGroupsTab = function()
45854613
mBadgeText:SetTextColor(1, 1, 1)
45864614
mBadge:SetWidth(max(mBadgeText:GetStringWidth() + 12, 32))
45874615

4588-
-- Aura name
4589-
local mName = memberRow:CreateFontString(nil, "OVERLAY", "GameFontHighlightSmall")
4590-
mName:SetPoint("LEFT", mBadge, "RIGHT", 6, 0)
4591-
mName:SetPoint("RIGHT", memberRow, "RIGHT", -24, 0)
4592-
mName:SetMaxLines(1)
4593-
mName:SetText(displayNames[member.auraName] or member.auraName)
4594-
mName:SetTextColor(C_TEXT.r, C_TEXT.g, C_TEXT.b)
4595-
45964616
-- Remove button (using close icon)
45974617
local remBtn = CreateFrame("Button", nil, memberRow)
45984618
remBtn:SetSize(18, 18)
@@ -4618,6 +4638,42 @@ BuildLayoutGroupsTab = function()
46184638
RefreshPreviewEffects()
46194639
end)
46204640

4641+
-- Customise button (navigates to Effects tab for this indicator)
4642+
local custBtn = CreateFrame("Button", nil, memberRow, "BackdropTemplate")
4643+
custBtn:SetSize(56, 18)
4644+
custBtn:SetPoint("RIGHT", remBtn, "LEFT", -4, 0)
4645+
local custTC = GetThemeColor()
4646+
ApplyBackdrop(custBtn,
4647+
{r = custTC.r * 0.15, g = custTC.g * 0.15, b = custTC.b * 0.15, a = 1},
4648+
{r = custTC.r * 0.35, g = custTC.g * 0.35, b = custTC.b * 0.35, a = 0.6})
4649+
local custText = custBtn:CreateFontString(nil, "OVERLAY")
4650+
custText:SetFont("Fonts\\FRIZQT__.TTF", 8, "OUTLINE")
4651+
custText:SetPoint("CENTER", 0, 0)
4652+
custText:SetText("Customise")
4653+
custText:SetTextColor(custTC.r, custTC.g, custTC.b)
4654+
custBtn:SetScript("OnEnter", function() custText:SetTextColor(1, 1, 1) end)
4655+
custBtn:SetScript("OnLeave", function()
4656+
local tc2 = GetThemeColor()
4657+
custText:SetTextColor(tc2.r, tc2.g, tc2.b)
4658+
end)
4659+
local capturedAuraName = member.auraName
4660+
local capturedIndID = member.indicatorID
4661+
custBtn:SetScript("OnClick", function()
4662+
local cardKey = "placed:" .. capturedAuraName .. "#" .. capturedIndID
4663+
wipe(expandedCards)
4664+
expandedCards[cardKey] = true
4665+
activeTab = "effects"
4666+
DF:AuraDesigner_RefreshPage()
4667+
end)
4668+
4669+
-- Aura name
4670+
local mName = memberRow:CreateFontString(nil, "OVERLAY", "GameFontHighlightSmall")
4671+
mName:SetPoint("LEFT", mBadge, "RIGHT", 6, 0)
4672+
mName:SetPoint("RIGHT", custBtn, "LEFT", -4, 0)
4673+
mName:SetMaxLines(1)
4674+
mName:SetText(displayNames[member.auraName] or member.auraName)
4675+
mName:SetTextColor(C_TEXT.r, C_TEXT.g, C_TEXT.b)
4676+
46214677
by = by - 38
46224678
end
46234679
else
@@ -4964,10 +5020,15 @@ function DF.BuildAuraDesignerPage(guiRef, pageRef, dbRef)
49645020
-- Override RefreshStates: Aura Designer uses its own layout system
49655021
page.RefreshStates = function(self)
49665022
local pageH = self:GetHeight()
4967-
self.child:SetHeight(math.max(pageH, 600))
5023+
self.child:SetHeight(pageH)
49685024
if self.child and GUI.contentFrame then
49695025
self.child:SetWidth(GUI.contentFrame:GetWidth() - 30)
49705026
end
5027+
-- Keep parent scroll at 0 — only the right panel should scroll
5028+
local parentScroll = self:GetParent()
5029+
if parentScroll and parentScroll.SetVerticalScroll then
5030+
parentScroll:SetVerticalScroll(0)
5031+
end
49715032
DF:AuraDesigner_RefreshPage()
49725033
end
49735034

@@ -5272,6 +5333,19 @@ function DF:AuraDesigner_RefreshPage()
52725333
selectedSpec = currentSpec
52735334
end
52745335

5336+
-- Update frame preview container border to class color of current spec
5337+
if framePreview then
5338+
local resolvedSpec = currentSpec or selectedSpec
5339+
local specInfoEntry = resolvedSpec and DF.AuraDesigner.SpecInfo[resolvedSpec]
5340+
local classToken = specInfoEntry and specInfoEntry.class
5341+
local classColor = classToken and RAID_CLASS_COLORS[classToken]
5342+
if classColor then
5343+
framePreview:SetBackdropBorderColor(classColor.r, classColor.g, classColor.b, 1)
5344+
else
5345+
framePreview:SetBackdropBorderColor(C_BORDER.r, C_BORDER.g, C_BORDER.b, 1)
5346+
end
5347+
end
5348+
52755349
-- Rebuild the current tab to reflect data changes
52765350
if activeTab and SwitchTab then
52775351
SwitchTab(activeTab)

AuraDesigner/SecretAuras.lua

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -387,3 +387,26 @@ function SecretAuras:GetUnitAuras(unit, spec)
387387

388388
return result
389389
end
390+
391+
--- Match a single aura against known secret signatures for the given spec.
392+
-- Exposed for inline use by AuraAdapter during its scan loop so that
393+
-- secret aura detection and indicator rendering happen on the same tick.
394+
-- @param unit Unit token (e.g. "party1")
395+
-- @param auraData AuraData table from C_UnitAuras (must have .auraInstanceID)
396+
-- @param spec Spec key (e.g. "RestorationDruid")
397+
-- @return auraName String name of matched aura, or nil
398+
function SecretAuras:MatchAura(unit, auraData, spec)
399+
return MatchAuraSignature(unit, auraData, spec)
400+
end
401+
402+
--- Record an inline-matched aura into the state cache.
403+
-- Called by AuraAdapter after a successful inline match so that the
404+
-- disambiguation engines (e.g. VerdantEmbrace/Lifebind) and state
405+
-- cleanup (removedAuraInstanceIDs) continue to work correctly.
406+
-- @param unit Unit token
407+
-- @param auraInstanceID Blizzard aura instance ID
408+
-- @param auraName Matched aura name
409+
function SecretAuras:RecordMatch(unit, auraInstanceID, auraName)
410+
if not state.auras[unit] then state.auras[unit] = {} end
411+
state.auras[unit][auraInstanceID] = auraName
412+
end

CHANGELOG.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
* (Click Casting) **Fixed binding tooltip vanishing when pressing modifier keys** — modifier format mismatch caused all bindings to be filtered out
77
* (Pet Frames) Fixed taint error from secret boolean in pet range checking
88
* (Fading) **Fixed name and health text alpha resetting to 1.0** on zone change, combat res, vehicle exit, and test mode exit
9+
* (Aura Designer) **Fixed secret auras not appearing immediately on cast in combat** — inline fingerprint matching eliminates race condition between detection and rendering
10+
* (Aura Designer) Fixed Verdant Embrace tooltip incorrectly showing Upheaval
911

1012
### New Features
1113
* (Aura Designer) **Secret aura tracking** — tracks auras that WoW hides behind secret spell IDs using signature-based fingerprinting (credit to Harrek for the technique and aura data from Advanced Raid Frames)
@@ -25,6 +27,13 @@
2527
* (Aura Designer) Spell cards now show WoW spell tooltips on hover
2628
* (Aura Designer) Secret auras shown in a distinct section with visual styling to differentiate from regular auras
2729
* (Aura Designer) Added "unsupported spec" message when viewing a non-healer spec
30+
* (Aura Designer) **Class color border** on preview frame window showing the current spec's class
31+
* (Aura Designer) **Class-colored spec dropdown** — each spec name colored by class for clarity
32+
* (Aura Designer) **Customise button** on layout group members — jumps directly to that aura's effects settings
33+
* (Aura Designer) Fixed page scrolling — only the right settings panel scrolls now, preview stays in view
34+
* (Auras) Added **Raid In Combat** debuff filter option — matches the existing buff filter for better debuff coverage
35+
* (Click Casting) Renamed "Mouseover" fallback to "Global" for clarity
36+
* (Click Casting) "Does not work with action bar binds" warning now highlighted in red
2837

2938
## [4.0.15] - 2026-03-10
3039

ClickCasting/Constants.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -431,7 +431,7 @@ CC.FRAME_INFO = FRAME_INFO
431431
-- Targeting Fallback info (checkboxes - for keyboard/hover bindings)
432432
local FALLBACK_INFO = {
433433
mouseover = {
434-
name = "Mouseover",
434+
name = "Global",
435435
desc = "Cast on nameplates or characters in the world. Not needed for party/raid frames.",
436436
},
437437
target = {

ClickCasting/UI/BindingEditor.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1352,7 +1352,7 @@ function CC:CreateEditBindingPanel()
13521352
fallbackSubtitle:SetWidth(280)
13531353
fallbackSubtitle:SetJustifyH("LEFT")
13541354
fallbackSubtitle:SetWordWrap(true)
1355-
fallbackSubtitle:SetText("For nameplates & world units. Does not work with action bar binds.")
1355+
fallbackSubtitle:SetText("For nameplates & world units. |cffff3333Does not work with action bar binds.|r")
13561356
fallbackSubtitle:SetTextColor(0.5, 0.5, 0.5)
13571357
panel.fallbackSubtitle = fallbackSubtitle
13581358

Config.lua

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -866,6 +866,7 @@ DF.PartyDefaults = {
866866
-- Direct Mode: Debuff Filters
867867
directDebuffShowAll = false, -- Show all debuffs (ignores sub-filters)
868868
directDebuffFilterRaid = true, -- RAID filter
869+
directDebuffFilterRaidInCombat = true, -- RAID_IN_COMBAT filter
869870
directDebuffFilterCrowdControl = true, -- CROWD_CONTROL filter
870871
directDebuffFilterImportant = true, -- IMPORTANT filter (12.0.1)
871872
directDebuffSortOrder = "DEFAULT", -- "DEFAULT" / "TIME" / "NAME"
@@ -1196,7 +1197,7 @@ DF.PartyDefaults = {
11961197
-- Blizzard Frame Hiding
11971198
hideBlizzardFrames = true,
11981199
hideBlizzardPartyFrames = true,
1199-
hideBlizzardRaidFrames = false,
1200+
hideBlizzardRaidFrames = true,
12001201
hideDefaultPlayerFrame = false,
12011202
hidePlayerFrame = false,
12021203
showBlizzardSideMenu = true,
@@ -2059,6 +2060,7 @@ DF.RaidDefaults = {
20592060
-- Direct Mode: Debuff Filters
20602061
directDebuffShowAll = false, -- Show all debuffs (ignores sub-filters)
20612062
directDebuffFilterRaid = true, -- RAID filter
2063+
directDebuffFilterRaidInCombat = true, -- RAID_IN_COMBAT filter
20622064
directDebuffFilterCrowdControl = true, -- CROWD_CONTROL filter
20632065
directDebuffFilterImportant = true, -- IMPORTANT filter (12.0.1)
20642066
directDebuffSortOrder = "DEFAULT", -- "DEFAULT" / "TIME" / "NAME"
@@ -2389,7 +2391,7 @@ DF.RaidDefaults = {
23892391
-- Blizzard Frame Hiding
23902392
hideBlizzardFrames = true,
23912393
hideBlizzardPartyFrames = true,
2392-
hideBlizzardRaidFrames = false,
2394+
hideBlizzardRaidFrames = true,
23932395
hideDefaultPlayerFrame = false,
23942396
hidePlayerFrame = false,
23952397
showBlizzardSideMenu = true,

Core.lua

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3699,6 +3699,25 @@ eventFrame:SetScript("OnEvent", function(self, event, arg1)
36993699
end
37003700
end
37013701

3702+
-- One-time: force hideBlizzardRaidFrames = true for existing users
3703+
for _, mode in ipairs({"party", "raid"}) do
3704+
local modeDb = DF.db[mode]
3705+
if modeDb and not modeDb._hideBlizzRaidV407 then
3706+
modeDb.hideBlizzardRaidFrames = true
3707+
modeDb._hideBlizzRaidV407 = true
3708+
end
3709+
end
3710+
if DandersFramesDB_v2 and DandersFramesDB_v2.profiles then
3711+
for _, profile in pairs(DandersFramesDB_v2.profiles) do
3712+
for _, mode in ipairs({"party", "raid"}) do
3713+
if profile[mode] and not profile[mode]._hideBlizzRaidV407 then
3714+
profile[mode].hideBlizzardRaidFrames = true
3715+
profile[mode]._hideBlizzRaidV407 = true
3716+
end
3717+
end
3718+
end
3719+
end
3720+
37023721
-- Wrap DF.db with overlay proxy (must happen AFTER all migrations,
37033722
-- BEFORE anything that reads through the proxy)
37043723
DF:WrapDB()

DandersFrames.toc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
## Notes: Custom party/raid frames for WoW Midnight 12.0
44
## X-Credits: Some optimization patterns informed by studying Grid2 and other community addons. Secret aura tracking techniques from Harrek's Advanced Raid Frames (used with permission).
55
## Author: Danders
6-
## Version: v4.0.16-alpha.2
6+
## Version: v4.0.16
77
## X-Curse-Project-ID: 1389690
88
## X-Wago-ID: RNL9B46o
99
## IconTexture: Interface\AddOns\DandersFrames\Media\DF_Icon

0 commit comments

Comments
 (0)