Skip to content

v5 fix round 2: Pixel Perfect, identity gate hardening, override-icon unification, buff-filter curation#214

Open
Krathe82 wants to merge 17 commits into
DanderBot:feature/aura-factory-12.1from
Krathe82:krathe/v5-alpha10
Open

v5 fix round 2: Pixel Perfect, identity gate hardening, override-icon unification, buff-filter curation#214
Krathe82 wants to merge 17 commits into
DanderBot:feature/aura-factory-12.1from
Krathe82:krathe/v5-alpha10

Conversation

@Krathe82

@Krathe82 Krathe82 commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

Base: feature/aura-factory-12.1 (alpha.10). Continues from #212 — the five commits below landed on #212's head after its merge (698a094) and are carried here unchanged, plus a new fix round on top.

Carried over from #212 (pushed post-merge, previously unmerged)

  • Restore Pixel Perfect on the container render path. With Pixel Perfect on, container-rendered aura icons could show uneven borders (fat one side, thin/missing another), border-to-icon gaps, and row-to-row inconsistency. Three legacy invariants are restored engine-wide: border thickness snaps to whole pixels in the border's actual rendered space (scale folded in, via Border:SnapThickness + renderScale), icon sizes/spacings quantize to whole pixels, and each row/window is nudged onto the pixel grid. Root cause of the "toggle fixes it until reload" variant: the pixel-scale cache could bake pre-settle values into login builds — the factory signatures now carry a pixel-scale token and a settle re-derive invalidates aura layout when the effective scale changes. Missing-badge anchoring compensates the empty container's 1-unit size floor. Diagnostics: /df ppdump, /df ppbadge.
  • Hide spell-ID-filtered containers while their unit fails UnitCanAssist. The 12.1 identity gate fails OPEN: include/exclude spell-ID maps are skipped entirely for units you cannot currently assist — a cross-faction group member outside instanced content, or a duel partner — so "only these spells" pools silently degrade to "every buff" (food/flask icons flooding the defensive bar). Affected handles now hide render-side (plain anchor frame, combat-safe, fail-safe to SHOW on any doubt) until the gate holds again.
  • Aura Designer: repaint the editor preview canvas on same-size page revisits (icons vanished from the second round trip until the window was reopened).
  • Profiles: fix the doubled "v" (e.g. "vv5.0.0") in the version label shown after parsing an import string.
  • Auras: brighten the default Color by Time duration colours (Vivid set); existing profiles keep their saved colours.

New in this round

  • Dispel overlay: route the out-of-range fade through the DF-owned window. The fade wrote alpha directly on native slot buttons — forbidden while auras are secret, producing an "Attempt to access forbidden object" error storm in restricted content. The window's alpha cascades over the slots and widgets for the same visual result.
  • Filter presets: rename "Per-spec Healing" to "Healing" and "Raid Defensives" to "Raid Cooldowns". Display labels + locale keys only; the stable preset keys are untouched, so saved selections and per-spell overrides carry over unchanged.
  • Identity gate hardening (field-driven, live cross-faction party testing):
    • Hover-safe visibility writes. Flipping a window's shown state while the cursor is over a native aura button runs the button's tooltip intrinsics (OnEnter/OnLeave -> Show/HideTooltip) synchronously inside addon execution, where they index secret aura data — an error class that is reported to the user even when caught. All window visibility now goes through a single writer that defers the flip until the cursor leaves, verifies the result against IsShown, and retries — so an aborted write can no longer strand the gate out of sync (the field bug: icons stuck visible with the gate believing them hidden). Destroy, retarget, and the Edit-Mode fake-data park/restore paths ride the same channel; the restore also composes with the gate now (a bare Show() used to re-open gate-hidden windows).
    • Post-load re-checks. After a loading screen UnitCanAssist can keep reporting the pre-load answer while the world streams in, and no watched event fires once it settles — the wrong verdict stuck until an actual reinvite. The watcher now also covers member-data settle events (UNIT_NAME_UPDATE, PARTY_MEMBER_ENABLE/DISABLE), coalesces bursts onto one sweep, and parks two delayed sweeps after PLAYER_ENTERING_WORLD.
    • Widened vulnerability classification. Gated pools are now: includeSpellIDs regardless of tokens — HELPFUL|PLAYER is NOT immune (the token still narrows the pool at query level, but the spell whitelist is skipped, so a "My Buffs" indicator degrades to "anything I cast"; live-caught with an instance-cast buff persisting on a cross-faction ally and rendering in the wrong indicator) — plus excludeSpellIDs pools, and the BIG_DEFENSIVE/EXTERNAL_DEFENSIVE category-token fallbacks. Genuinely unfiltered pools stay visible, since their data is correct on non-assistable units.
    • New diagnostic: /df idgate — per handle: filter string, include/exclude presence, live UnitCanAssist, stored verdict, and actual window visibility.
  • Changelog entries for the round.

UI + buff-filter round (on top of the above)

  • One override indicator, addon-wide. Auto layouts and the Filter Designer used a mix of a gold star and a yellow box to mark an overridden setting, with an inconsistent reset control. Both now flow through two shared helpers — GUI:CreateOverrideMarker (a filled dot, one colour constant) and GUI:CreateOverrideResetButton (a red icon-only reset that reads like the Reset Page button) — so every override reads the same. Hover tooltips ("Override active" + what's overridden) sit on the inline markers, the nav tab/category dots, and the frame-position indicator; the layout-editor cogwheel becomes an edit_square icon.
  • Removed the Aura Filter Setup wizard; added an Aura Filters explainer. The wizard only reset filters to defaults — which Reset Page already does — so it's gone (builtin + /df aurasetup + first-login auto-show + its saved flag). The Aura Filters page now opens with a single banner: you have full control over which buffs show (enable/disable any spell in the presets, or build a custom filter), while debuffs can only be filtered by category (boss, dispellable, crowd control, …) because of a Blizzard limitation.
  • Filter Designer polish. Directly-added spell IDs resolve their real name/icon and show a "not in database" chip; curated-preset tooltips tidied to two lines; "Reset to stock" is now a Reset Page-style red "Reset to Default"; the Add/Rename/Delete hover-fill bug is fixed (the wash now rides the same alpha channel as everywhere else).
  • Buff-filter preset curation pass. A maintainer pass over the built-in presets: default on/off tuning (e.g. Infusion of Light, Immolation Aura and Ghost Wolf now start off), a few category moves/copies (Twin Guardian → Utility + Movement; Spatial Paradox and Temporal Burst also into Utility), two adds (Primordial Bond, Echoing Freedom), a wrong-id fix (Bestow Weyrnstone), and some removals. "Remove" keeps real auras in the database (empty category set — still addable via the picker) and only drops genuine non-auras (totems/guardians) and a duplicate id. All durable via R.Excluded / R.CategoryPatch / off flags; the two adds and the wrong-id need a gatherer-source update, tracked in a lab discussion. Users' own per-preset choices are unaffected.

Status: this round is syntax-verified; an in-game pass is still pending (the Pixel Perfect and identity-gate items above are the live-verified ones).

Filter Designer polish + further curation (latest)

  • Disabled preset rows are readable for dark classes. A disabled spell's name used to scale the class colour toward black under a 40% alpha, so dark classes (Shaman, Warlock) were nearly illegible while light ones (Priest) read fine. The name now keeps the true class colour and fades only through alpha (50%), and the icon is greyscaled (SetDesaturated) on top of its dim — so a disabled row reads as "greyed icon + faded-but-true-colour name". One shared helper, so it applies to both the preset list and the Add-from-Database picker.
  • Filter Designer opts into the shared wide minimum width (850) used by the Aura Designer, Text Designer, Pinned Frames and Nicknames, so its two-column list no longer squashes at narrow widths.
  • More preset curation. Dream Flight now lives entirely in Raid Cooldowns as one record (all three same-named ids) — WCL sighting data showed 363502 is the ally-facing HoT, not a duplicate, so it's kept alongside the self-buff ids rather than removed. Plus a second tuning pass: more self-buff / noise auras default off (Invoke Chi-Ji, Tranquility, Apotheosis, Ultimate Penitence, Vampiric Embrace, Ascendance, Bulwark of Order, Sacrosanct Crusade), Halo removed (leaves no aura), and Seraphic Barrier / Saved by the Light / Light of the Titans moved into Healing. All durable via the override tables and synced with the data team in the lab.

The disabled-row readability was iterated with in-game feedback; the rest of this section is syntax-verified pending a full in-game pass.

Testing

Live-verified in a cross-faction party: in a non-assistable zone every vulnerable surface hides (buff/defensive rows, missing badges, Aura Designer indicators including My Buffs — confirmed via /df idgate: canAssist=false -> gateHidden=true shown=false across the board) while debuff surfaces stay; in a sanctuary city and in instances everything returns automatically; /reload mid-party no longer resurrects hidden icons; no tooltip-taint errors while hovering during gate flips. Pixel Perfect verified across buff/debuff/defensive rows, AD icons and missing badges, including border animations and anim inset/offset stability.

Krathe82 added 9 commits July 18, 2026 15:08
Tab switching re-enters the page ONLY through GUI RefreshCached ->
RefreshStates (the builder is cache-skipped), and the AD RefreshStates
override early-outs when the page dimensions are unchanged (the guard that
stops the banner-cascade rebuild loop). But the mainFrame OnHide hook
clears the preview canvas on every navigation away — so from the second
same-size revisit on, the cleared canvas was never repainted (the first
revisit only worked because the dims baseline was captured pre-layout).
Track the clear with a flag and, on a same-size revisit that needs it,
repaint the pooled slots only — slot restyling creates no banners, so the
cascade loop the early-out exists for cannot re-arm.
The container port lost the legacy pixel-perfect contract; with PP on, aura icon borders rendered uneven (fat/thin edges), gapped from the art, and differed between adjacent icons. Restored engine-wide:

- Border:SnapThickness + spec.renderScale: thickness (and art insets, via the same function) now snap to whole physical pixels in the border's ACTUAL render space, folding the container/window SetScale instead of assuming UIParent space. Min one physical pixel so thin borders can't vanish.
- Layout quantization: icon sizes/spacings/strip reservation quantize to whole pixels in scaled space at config adoption; the container pin offset is nudged onto the physical pixel grid from the anchor frame's rect (never the container's own secret-derived rect), with a retry once the rect resolves at login and a re-pin on frame resize.
- Stale pixel-scale cache: login builds could bake all snapped values before UIParent's scale settled, with nothing restyling after (uneven until any settings toggle, broken again on reload). The pixel-scale value now rides the factory cosmetic signatures, and UpdatePixelScale invalidates the aura layout when the value actually changes (plus a post-login settle check), so everything re-bakes automatically.
- Missing badges: badge size, cell pitch and animation spill quantize in the strip's scaled space; the parked badge compensates the flow layout's 1x1 empty-container size floor exactly (source-cited), so its border renders uniform; SetBadgeSpill no longer floors the quantized spill (badge stayed planted while animation inset/offset sliders drag).
- Diagnostics: /df ppdump (physical-pixel rects + grid deviation for every aura container anchor chain) and /df ppbadge (window-park missing badges to isolate container-anchor drift).
…anAssist

The 12.1 identity gate only evaluates include/excludeSpellIDs candidate filters for units passing UnitCanAssist, and a failed gate SKIPS the checks (fail-open: every helpful aura passes). A cross-faction group member only counts as assistable inside instanced content — outside (or when dueling a party member) the gate drops and any 'only these spells' pool silently degrades to 'every buff on the unit': food buffs flooding the defensive bar, live-confirmed.

Containers now self-classify at build: a HELPFUL pool whose selection comes from includeSpellIDs (and doesn't carry the query-level PLAYER token, which is immune) hides its anchor frame while UnitCanAssist('player', unit) is false, and returns when it flips back. Render-side only (combat-safe, secure enabled state untouched), composed with consumer visibility intent, fail-safe to visible on any doubt. A module watcher re-evaluates on faction/phase/roster/world/target changes. Exclude-only pools deliberately stay visible: 'everything except X' degrading to 'everything' beats hiding a whole row.
Nudge the default colour-by-time breakpoints up off dark aura icons to a more vivid green -> gold -> orange -> red ladder, clearer at a glance in combat without going pure-primary. Both sync-locked sources move together (Config.lua GlobalDefaults + the Auras.lua engine fallback), so Reset to Default and the fallback agree. Baseline-only: existing customised breakpoints and already-materialised profiles keep their values.
Krathe82 added 5 commits July 18, 2026 21:50
SetDisabled toggled the wash via object alpha while its rest strength lives
in the vertex-colour alpha, so a disable->enable cycle could restore it at
full strength. Off/on now both go through the vertex channel (ApplyThemeColor
on re-enable), so a re-enabled button matches one that was never disabled.
… tooltips

Raw IDs typed into a custom filter now resolve their live name/icon from the
client (with a one-shot repaint while spell data streams in) and carry a
"not in database" chip; only genuinely invalid IDs keep "unknown ID".
The disabled add/rename/delete tooltips now use the shared two-line style.
Override indicator rework
- Replace the auto-layout gold star and Filter Designer yellow box with one
  shared filled-dot marker (GUI:CreateOverrideMarker) and one shared red reset
  button (GUI:CreateOverrideResetButton), so overrides read the same way
  everywhere. One OVERRIDE_MARKER_COLOR constant.
- Hover tooltips on inline markers, the nav tab/category dots, and the
  frame-position indicator (all "Override active" + a description).
- Nav dots sized consistently; layout-editor cogwheel -> edit_square icon.
- Filter Designer: modified-preset dot uses the shared marker (with tooltip);
  "Reset to stock" becomes a Reset Page-style red "Reset to Default" button.

Aura Filters banner
- Single info banner: full control over which buffs show (enable/disable in the
  presets or build a custom filter), while debuffs are category-only by a
  Blizzard limitation.

Remove Aura Filter Setup wizard
- Drop the builtin wizard, the /df aurasetup command, the first-login auto-show
  and its seenAuraSetupWizard default. Reset Page covers the same ground.

New icons: dot.tga, edit_square.tga. Locale keys added; orphans removed.
Runtime (R.Spells):
- off=true (disable): Infusion of Light, Avenging Wrath, Avenging Crusader,
  Elemental Resistance, Ironfur, Protective Light, Immolation Aura (427912),
  Forestwalk, Ghost Wolf, Temporal Burst
- enable: Symbiotic Blooms
- remove: Dream Guide, Dream Flight healing dup 363502 (raid-CD 359816 kept),
  Overflowing Mists, Healing Stream/Tide Totem, Earth Elemental,
  Poison Cleansing Totem, Shell Cover (totems/guardians/procs - not auras)
- move/copy: Twin Guardian -> Utility+Movement; Spatial Paradox +Utility;
  Temporal Burst +Utility (off in both)
- add: Primordial Bond 381755 (Defensives), Echoing Freedom 394454 (Movement)
- fix wrong id: Bestow Weyrnstone 408233 -> 410318

Durability: removals + wrong-id drop go in R.Excluded, moves/copies in
R.CategoryPatch, so /update-spelldb reproduces them. off flags survive
natively. The two adds, the wrong-id, and the 427912 "Infernal Armor"
mislabel (actually Immolation Aura) need a gatherer-source update - tracked
in the lab curation discussion.
…r-only removal)

"Remove" means drop from the preset only, not the database. Dream Guide
(1278914) and Overflowing Mists (388513) go back into R.Spells with an empty
cats set - still addable via the Add-from-Database picker (which sources
R.Spells by class, not category), just in no built-in preset. Dropped from
R.Excluded; R.CategoryPatch[id] = {} carries the empty set through re-harvest.

Left fully excluded (agreed): Dream Flight 363502 (duplicate id - the spell
stays in the DB via 359816) and the genuine non-auras (Healing Stream/Tide
Totem, Earth Elemental, Poison Cleansing Totem, Shell Cover).
@Krathe82 Krathe82 changed the title v5 fix round 2: Pixel Perfect restoration, cross-faction identity gate, dispel fade, preset renames v5 fix round 2: Pixel Perfect, identity gate hardening, override-icon unification, buff-filter curation Jul 19, 2026
Krathe82 added 3 commits July 19, 2026 20:32
Dream Flight: all three same-named ids (359816 + 362361 + 363502) now live
in ONE Raid Cooldowns record; 363502 dropped from R.Excluded and all three
CategoryPatch'd to raidDefensives. Per Mael's sighting split, 363502 is the
ally-facing HoT (241k on others) - kept alongside the self-buff ids, not
split into Healing.

Second curation pass:
- disable (off): Invoke Chi-Ji, Tranquility, Apotheosis, Ultimate Penitence,
  Vampiric Embrace, Ascendance, Bulwark of Order, Sacrosanct Crusade
  (self-buffs / noise)
- remove: Halo (all 4 ids -> R.Excluded) - the cast leaves no aura
- move to Healing: Seraphic Barrier (+off), Saved by the Light (+off),
  Light of the Titans; via cats + CategoryPatch
Disabled spell names keep the TRUE class colour and fade only through alpha
(50%), instead of the old scale-toward-black that buried dark classes like
Shaman. The shared ApplyNameColor no longer shifts the hue - enabled and
disabled use identical RGB.

Disabled icons are now greyscaled (SetDesaturated) on top of their 0.4 dim;
the enabled path resets it so pooled rows never stay grey. Applies to both
the preset list and the Add-from-Database picker.
Add auras_filterdesigner to WIDE_PAGES so its two-column preset+spell list
gets the same minimum width and expand-on-open as the Aura Designer, Text
Designer, Pinned Frames and Nicknames, instead of squashing at narrow widths.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant