promotional bannermobile promotional banner

MidnightSimpleUnitFrames

Midnight Simple Unit Frames replaces the default unitframes with clean, minimal bars that show only the information you actually need.

File Details

MidnightSimpleUnitFrames4.06.zip

  • R
  • May 5, 2026
  • 2.60 MB
  • 2.2K
  • 12.0.7+1
  • Retail

File Name

MidnightSimpleUnitFrames4.06.zip

Supported Versions

  • 12.0.7
  • 12.0.5

MidnightSimpleUnitFrames 4.02 - 4.06

  • fixed issue where the font system broke
  • fixed issue where absorb of party/group would not properly apply the opacity
  • fixed edge case on certain keyboards issue where the gameplay features would not move with the arrow keys while editing
  • fixed edge case with health showing red
  • fixed issue with heal prediction showing but turned off
  • fixed minor issue with group frame aura preview (no feature impact)

MidnightSimpleUnitFrames 4.0 — Full Changelog


New Features

Group Frames (entirely new module — 23,000+ lines)

  • Full party, raid, and mythic raid unit frames built from scratch as a first-class MSUF system
  • Each frame shows HP bar, power bar, name text, role/leader icons, and status icons
  • HP Alpha — dedicated HP alpha slider per group type, independent from unit frames
  • Auras — fully configurable per slot with filter rules, custom sizes, growth direction, and anchor
  • Private Auras — native Blizzard private aura support on group frames
  • Spell Indicators — configurable spells shown as colored overlays/icons per member, ships with a curated data set for common raid and PvP spells
  • Corner Indicators — up to 4 corner overlays per group frame (aggro, debuff type, dispellable, etc.)
  • Healer Buffs — dedicated healer buff tracker with a built-in in-game editor
  • GF Effects — HP gradient, missing HP overlay, absorb bar, and glow effects per group frame
  • Group Number — optional group number display per frame
  • Boss Frame Bridge — MSUF group frame system bridges Blizzard boss frames for consistent styling
  • Edit Mode — full drag/drop placement and per-frame popup configuration in Edit Mode
  • Masque support — group frame aura icons are Masque-skinnable
  • Dedicated Options — two new options panels: Group Frames and Group Frame Auras

Blizzard Native Aura Renderer (Group Frames)

  • Group frames use Blizzard's C-side native aura container by default
  • Aura rendering happens at engine level — zero Lua overhead per aura update in raids
  • Configurable types: Buffs, Debuffs, Dispellable auras, Externals, Private Auras — all independently toggleable
  • Configurable: icon size, cooldown text, organization type, dispel mode, container anchor and offset
  • Can be switched to MSUF custom renderer per group if desired
  • This is the performance-with-Blizzard-auras change — in large raids, aura updates that previously fired Lua filter/render loops now pass through Blizzard's optimized C path entirely

Dispel Glow Effect (Unit Frames)

  • New animated glow overlay on the dispel highlight border, powered by the bundled LibCustomGlow-1.0
  • Three glow styles selectable: PixelAutoCastProc
  • Configurable: line count, animation frequency, thickness
  • Color follows the dispel border color automatically
  • Test mode checkbox for previewing in the options menu

Elite / Rare Icon

  • New icon overlay for Target, Focus, Target-of-Target, and Boss frames
  • Gold icon for Elite and World Boss units; silver for Rare and Rare-Elite
  • Configurable: size, anchor (TL/TR/BL/BR), X/Y offset, draw layer (1–10)

HP Bar Gradient Mode

  • New Gradient bar color mode alongside the existing Dark, Class Color, and Unified modes
  • HP bar shifts red → yellow → green based on current health
  • Implemented via C_CurveUtil.CreateColorCurve — runs entirely C-side, fully secret-safe
  • No Lua arithmetic on HP values

HP Bar Alpha Layer

  • New HP Bar option in the per-unit alpha layer dropdown (previously only Foreground / Background)
  • Separate in-combat and out-of-combat alpha sliders for the HP bar specifically
  • Allows the HP bar to fade independently from the frame background and text

Preserve HP Color

  • New "Preserve HP Color" checkbox in the alpha settings
  • HP bar retains its class color / gradient even when transparent
  • Uses the bundled Better Blizzard bar texture which supports color bleed-through at sub-1.0 alpha
  • Works in all alpha layer modes

New HP Text Modes — Full Set

  • 7 new HP text display modes added to the bars options dropdown:
    • Percent / Current — percent first, then current value
    • Current / Max — slash-separated, no percent
    • Percent / Max — percent first, then max
    • Current / Max / Percent — three-part display
    • Percent / Current / Max — percent-first three-part
    • Max / Percent — max then percent
    • Percent / Max / Current — full reverse
  • New NormalizeHpTextMode() migration function maps old profile key names to new ones
  • Missing HP value display using UnitHealthMissing for a "−deficit" style

Per-Debuff-Type Dispel Colors (Colors Menu)

  • New Dispel collapsible section in the Colors menu
  • Color mode dropdown: Single (one color for all dispels) or Per debuff type
  • Individually configurable colors for: Magic, Curse, Disease, Poison, Bleed
  • Dispel color is shared between the highlight border on unit frames and the dispel overlay on group frames

Per-Unit Highlight Override

  • Each unit frame can now have fully independent highlight and border settings
  • New hlOverride flag per unit DB entry — when enabled, that unit's highlight reads from its own config instead of the shared global settings
  • Enables e.g. giving the target frame a unique dispel color while player stays on shared settings
  • Group frames note in the menu clarifies which highlights apply to GF

Portrait Fade on Range

  • New "Also Fade Portrait" toggle in Misc → Range Fade
  • Portrait textures (2D and 3D) now participate in range fade alongside the rest of the frame

HP Smooth Interpolation (Native)

  • Health bar smooth fill now uses Enum.StatusBarInterpolation.ExponentialEaseOut where available
  • Hands interpolation to the C-side status bar engine — zero per-frame Lua cost

New Bar Texture: Better Blizzard

  • New bundled bar texture registered as "Better Blizzard" in LibSharedMedia
  • Used internally by the Preserve HP Color feature; also selectable as a regular bar texture

New Gradient Textures

  • 4 new overlay textures: horizontal gradient, horizontal reversed, vertical gradient, vertical reversed

New Icon Sets — 11 Styles

  • Role/leader icons now ship in 11 visual styles: Classic, DarkEmboss, Diamonds, Dots, GlassPanels, GlossyOrbs, Midnight, NeonOutline, RingSymbols, Shapes, Squares
  • Each set includes Assist, DPS, Healer, Leader, Tank variants (with Classic/Midnight sub-styles)

LibCustomGlow-1.0

  • Bundled as a new library dependency (used by dispel glow on unit frames and group frame effects)

Wago Analytics

  • Optional WagoAnalytics dependency added for Wago install tracking (shim library; no effect if not on Wago)

Profile Format: MSUF3

  • New profile codec MSUF3: with CBOR-first deserialization and robust base64 padding normalization
  • Fully backwards compatible — MSUF2: profiles continue to import without issues
  • Import/Export now includes Group Frame settings, all new alpha keys, elite icon settings, per-unit highlight overrides

Improved Existing Features

Status Indicators — AFK / DND Tracking Rewritten

  • AFK and DND flag tracking replaced with a GUID-based bitfield cache
  • MSUF_AWAY_AFK = 1MSUF_AWAY_DND = 2 — stored as bitfield per GUID (or unit token as fallback)
  • Separate cache tables: _msufAwayFlagsByGUID / _msufAwayCheckedByGUID (prefer GUID) and _msufAwayFlagsByUnit / _msufAwayCheckedByUnit (fallback for ungrouped units)
  • PLAYER_FLAGS_CHANGED event now drives per-unit AFK/DND invalidation — zero polling, event-driven only
  • New public API: MSUF_GetCachedAwayStatusMSUF_InvalidateAwayStatusMSUF_ClearAwayStatusCache
  • Mouseover tooltips now call MSUF_GetCachedAwayStatus instead of direct UnitIsAFK/UnitIsDND
  • AFK/DND suppression inside instances during combat preserved (_MSUF_AwaySuppressedNow)

Status Indicators — Icon Layer System

  • New _MSUF_ApplyIconLayer helper applies per-indicator draw layer via the layout system
  • Combat, Rested, and Rez icons each have independent layer settings
  • MSUF_ApplyStatusTextLayout now exported as a global for external module use
  • Symbol texture cache keyed on symbolKey + useMidnight flag — avoids repeat path-building

Auras2 Engine — Consolidation and Optimization

  • 14 source files consolidated into 4 (A2_CoreAuraNativeA2_RenderA2_Reminder)
  • Selective field copy: only the fields actually consumed by cache/filter/render are copied per aura — saves ~50% work vs. a generic for k,v in next over full C API aura tables
  • Lightweight update copy for updatedAuraInstanceIDs path: only 5 mutable fields written (duration, expirationTime, applications, isRaid, isBossAura) — saves 8 table writes per update across ~31,000 calls/session in raid combat
  • MSUF_AuraNative extracted as a shared abstraction for the CUSTOM and BLIZZARD renderer paths, used by both unit frames and group frames
  • Buff reminder lookups now attempt direct C_UnitAuras.GetAuraDataByAuraInstanceID first, with cache fallback — more reliable on fresh login

HP Bar Color System

  • File-scope cached bar mode variables (_ufcBarMode_ufcBarModeIsGradient_ufcDarkR/G/B, etc.) set once per settings change in RefreshSettingsCache
  • Eliminates per-update table lookups in RefreshHealthBarColorFast hot path
  • New MSUF_UFCore_GradientCurve global exposes the C-side color curve to MSUF_Bars.HealthCalcUpdate

Health Update — Calculator-Based

  • CreateUnitHealPredictionCalculator per frame instead of UnitGetDetailedHealPrediction
  • Single C-side call returns current health + absorbs + heal-absorbs + incoming heals simultaneously
  • SetValue called directly without Lua-side secret-value guards — WoW 12.0 handles secrets C-side

Unit Normalization Cache

  • NormalizeUnit() result now cached in a file-scope table
  • Eliminates redundant GetBossIndexFromToken lookups that previously fired 8× per target click

Bars — Power Bar Scoping

  • smoothFill for power bar now stored per-unit (player/target/focus/boss) rather than globally shared
  • New helpers: MSUF_Bars_GetPowerBarScopeUnitKeyMSUF_Bars_GetSmoothPowerForCurrentScopeMSUF_Bars_SetSmoothPowerForCurrentScope
  • HP/Power text modes are now independently scopeable from bar/highlight overrides via hlOverride

Bars — Colors Menu: Gradient in Bar Mode Dropdown

  • Gradient added as fourth option in the bar color mode dropdown (alongside Dark, Class Color, Unified)
  • Switching to gradient disables legacy darkMode / useClassColors flags automatically

Scheduler — Deduped Next-Frame Dispatch

  • New MSUF_Scheduler replaces scattered C_Timer.After(0, ...) deferrals throughout the codebase
  • Keyed scheduling: scheduling the same key twice in one frame yields exactly one callback
  • Ring-buffer queue; OnUpdate registered only while work is pending, removed immediately after flush

BlizzKill — Extracted and Hardened

  • Blizzard frame suppression logic extracted from the main file into MSUF_BlizzKill.lua
  • Zero per-frame overhead: no OnUpdate, no polling
  • Combat-deferred RegisterStateDriver via lazy PLAYER_REGEN_ENABLED listener
  • Frames re-asserted hidden on PLAYER_ENTERING_WORLD (loading screens, zone transitions, flight)

Portraits — Unified 2D/3D System

  • MSUF_3DPortraits.lua merged into MSUF_Portraits.lua — "Unified 2D/3D/Class portrait system"
  • EnsureModel() creates the PlayerModel on demand — no separate preload file needed
  • SafeCall helper prevents nil errors on partially constructed frames
  • On PLAYER_TARGET_CHANGED: if portrait mode is OFF for all units, all portrait work is skipped entirely (no InvalidateByKey, no SyncUnitSafe, no HideAllDecor)

Range Fade — Improvements

  • Range fade strength now a configurable 0–60% slider (previously hardcoded)
  • New FRIENDLY_SPELLS table per class for non-party friendly range detection, covering all specs: Druid, Evoker, Hunter, Mage, Monk, Paladin, Priest, Rogue, Shaman, Warlock, Warrior
  • Portrait fade toggle added as separate option from frame fade
  • Improved runtime API: MSUF_RangeFade_EvaluateActive / MSUF_RangeFade_ApplyCurrent and their fallback-frame equivalents

Interrupt Indicator

  • _RefreshRawNotInterruptible re-queries UnitCastingInfo/UnitChannelInfo live when no cached value is present; keeps both _msufApiNotInterruptibleRaw (target/focus) and MSUF_apiNotInterruptibleRaw (boss) in sync
  • New _CastAllowsKickIndicator guard added to all three show paths — prevents the indicator firing on spells the castbar has confirmed as uninterruptible

Edit Mode — Consolidated

  • 18 source files consolidated into 5 (EM2_CoreEM2_LayoutEM2_HUDEM2_MoversEM2_Popups)
  • Registry, State, Undo, Snap, Grid, Anchors, Init all merged; element registration API documented inline

Class Power — Consolidated

  • 15 source files consolidated into 3 (MSUF_CP_CoreMSUF_CP_ModesMSUF_CP_Controller)
  • New reload prompt popup when enabling or disabling class resources

Colors — Bar Mode Dropdown

  • Bar color mode dropdown now shows all four modes: Dark Mode, Class Color Mode, Unified Color Mode, Color Gradient
  • Switching modes correctly migrates legacy darkMode / useClassColors flags

Colors — Dispel Section Revamped

  • "Dispel" is now its own collapsible section in the Colors menu
  • Hint text clarifies that the dispel color is shared between the UF highlight border and the GF dispel overlay
  • Single-color mode and per-debuff-type mode selectable via dropdown
  • Per-type colors (Magic, Curse, Disease, Poison, Bleed) each have a color swatch with picker

Bars Options — Highlight Section Refactored

  • MakeOutlineRow helper consolidates Aggro, Dispel, Purge, and Boss Target row creation
  • Each outline row has an on/off dropdown and a test-mode checkbox
  • Dispel outline now has a preview dropdown (per debuff type) — visible difference only with "Per debuff type" color mode
  • Dispel glow sub-section (style, lines, frequency, thickness) collapses when glow is disabled

Fonts Options — Group Frame Scope

  • Font scope tabs now include Party and Raid (Raid scope also applies to Mythic Raid)
  • Per-scope fontOverride stored in gf_party / gf_raid / gf_mythicraid DB keys independently

Castbars Options — Disabled State

  • New SetCastbarOptionEnabled helper applies enable/disable state to all control types (checkboxes, dropdowns, sliders, font strings) with proper alpha dimming

Gameplay Options — Disabled State

  • Option controls dim to 0.35 alpha and disable mouse when their feature is off
  • SetGameplayControlEnabled applies consistently across buttons, sliders, dropdowns, checkboxes, and their sub-elements

Colors Options — Accordion Behavior

  • Opening a section auto-collapses the previously open section (radio accordion)

Portraits Options — Smart Accordion

  • Portraits panel upgraded with radio accordion behavior, section state memory, and auto-open to last used section

Search Registration

  • Portraits panel registered with MSUF_Search_RegisterRoots — searchable by "portraits", "portrait type", "shape", "border", "background"

Misc Menu — Status Indicators Removed

  • "Status Indicators" section (AFK/DND/Dead/Ghost toggles) removed from the Misc menu — now 4 sections
  • The toggles are accessible in the per-unit Status Indicator settings

Slash Menu

  • Navigation header open/close state saved per-session in MSUF_GlobalDB.global.slashMenu.navHeaders
  • Alpha build detection: shows a Discord report prompt for pre-release builds
  • Theme refresh: new background, edge, accent (cyan), danger (red), success (green), and card colors

Font Aliases for Migration

  • Legacy shortnames mapped to full names on profile import: FRIZQTARIALNMORPHEUSSKURRI"Friz Quadrata (default)" → their proper display names

Profile Codec — MSUF3

  • CBOR-first deserialization with decompression fallback
  • Improved base64 padding normalization (handles unpadded strings correctly)
  • Profile payload wrapped in a versioned envelope (addon = "MSUF"fmt = 2)

Default Settings

  • Default startup scaling now off (disableScaling = true) — users opt in explicitly
  • UIScale = { Enabled = false, Scale = 1.0 } added as a top-level default
  • All alpha keys now have explicit defaults instead of nil fallbacks: alphaSyncalphaExcludeTextPortraitalphaLayerModealphaHPInCombatalphaHPOutOfCombatalphaPreserveHPColor
  • Group Frame DB defaults seeded with Blizzard renderer and sensible aura type toggles on first run

Bug Fixes (existing features — no group frame fixes)

  • Fixed portraits not updating correctly on target change when portrait mode is active
  • Fixed power bar settings becoming incorrectly grayed out and uneditable
  • Fixed castbar options being grayed out when they should be accessible
  • Fixed 1-second flash of colored auras appearing on unit frames when initially loading in
  • Fixed several scaling bugs and options not applying correctly on live-apply
  • Fixed options bug preventing the private aura UF disable setting from taking effect
  • Fixed interrupt indicator not showing or hiding correctly in multiple edge cases
  • Fixed aura preview and buff reminder display bugs
  • Fixed live apply not working for power bar changes
  • Fixed live apply not working for scaling changes
  • Fixed a scope issue causing power bar changes to apply to the wrong unit

Internal / Architecture

  • Foundation/MSUF_BlizzKill.lua — Blizzard frame kill system extracted from the 6,400-line main file
  • Foundation/MSUF_Scheduler.lua — new centralized deduped next-frame scheduler
  • Auras2/MSUF_AuraNative.lua — shared CUSTOM/BLIZZARD renderer abstraction for UF and GF
  • Core/MSUF_EliteIcon.lua — elite/rare icon overlay system
  • Features/MSUF_PortraitDecoration.lua — relocated from Modules/
  • Features/MSUF_Analytics.lua — Wago Analytics integration
  • GroupFrames/ — 19 new files, ~23,000 lines
  • Libs/LibCustomGlow-1.0/ — new bundled library
  • Libs/WagoAnalyticsShim/ — new bundled shim
  • MSUF_3DPortraits.lua removed — merged into MSUF_Portraits.lua
  • Foundation/MSUF_Presets.lua removed — preset logic consolidated
  • TOC: Interface 120007 added; OptionalDeps: WagoAnalytics; LibCustomGlow-1.0 added to load order