File Details
MidnightSimpleUnitFrames4.01.zip
- R
- May 5, 2026
- 2.60 MB
- 1.8K
- 12.0.7+1
- Retail
File Name
MidnightSimpleUnitFrames4.01.zip
Supported Versions
- 12.0.7
- 12.0.5
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: Pixel, AutoCast, Proc
- 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 valueCurrent / Max— slash-separated, no percentPercent / Max— percent first, then maxCurrent / Max / Percent— three-part displayPercent / Current / Max— percent-first three-partMax / Percent— max then percentPercent / Max / Current— full reverse
- New
NormalizeHpTextMode()migration function maps old profile key names to new ones - Missing HP value display using
UnitHealthMissingfor 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
hlOverrideflag 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.ExponentialEaseOutwhere 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 = 1,MSUF_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_CHANGEDevent now drives per-unit AFK/DND invalidation — zero polling, event-driven only- New public API:
MSUF_GetCachedAwayStatus,MSUF_InvalidateAwayStatus,MSUF_ClearAwayStatusCache - Mouseover tooltips now call
MSUF_GetCachedAwayStatusinstead of directUnitIsAFK/UnitIsDND - AFK/DND suppression inside instances during combat preserved (
_MSUF_AwaySuppressedNow)
Status Indicators — Icon Layer System
- New
_MSUF_ApplyIconLayerhelper applies per-indicator draw layer via the layout system - Combat, Rested, and Rez icons each have independent layer settings
MSUF_ApplyStatusTextLayoutnow exported as a global for external module use- Symbol texture cache keyed on
symbolKey + useMidnightflag — avoids repeat path-building
Auras2 Engine — Consolidation and Optimization
- 14 source files consolidated into 4 (
A2_Core,AuraNative,A2_Render,A2_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 nextover full C API aura tables - Lightweight update copy for
updatedAuraInstanceIDspath: 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_AuraNativeextracted 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.GetAuraDataByAuraInstanceIDfirst, 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 inRefreshSettingsCache - Eliminates per-update table lookups in
RefreshHealthBarColorFasthot path - New
MSUF_UFCore_GradientCurveglobal exposes the C-side color curve toMSUF_Bars.HealthCalcUpdate
Health Update — Calculator-Based
CreateUnitHealPredictionCalculatorper frame instead ofUnitGetDetailedHealPrediction- Single C-side call returns current health + absorbs + heal-absorbs + incoming heals simultaneously
SetValuecalled 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
GetBossIndexFromTokenlookups that previously fired 8× per target click
Bars — Power Bar Scoping
smoothFillfor power bar now stored per-unit (player/target/focus/boss) rather than globally shared- New helpers:
MSUF_Bars_GetPowerBarScopeUnitKey,MSUF_Bars_GetSmoothPowerForCurrentScope,MSUF_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/useClassColorsflags automatically
Scheduler — Deduped Next-Frame Dispatch
- New
MSUF_Schedulerreplaces scatteredC_Timer.After(0, ...)deferrals throughout the codebase - Keyed scheduling: scheduling the same key twice in one frame yields exactly one callback
- Ring-buffer queue;
OnUpdateregistered 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
RegisterStateDrivervia lazyPLAYER_REGEN_ENABLEDlistener - Frames re-asserted hidden on
PLAYER_ENTERING_WORLD(loading screens, zone transitions, flight)
Portraits — Unified 2D/3D System
MSUF_3DPortraits.luamerged intoMSUF_Portraits.lua— "Unified 2D/3D/Class portrait system"EnsureModel()creates the PlayerModel on demand — no separate preload file neededSafeCallhelper prevents nil errors on partially constructed frames- On
PLAYER_TARGET_CHANGED: if portrait mode isOFFfor all units, all portrait work is skipped entirely (noInvalidateByKey, noSyncUnitSafe, noHideAllDecor)
Range Fade — Improvements
- Range fade strength now a configurable 0–60% slider (previously hardcoded)
- New
FRIENDLY_SPELLStable 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_ApplyCurrentand their fallback-frame equivalents
Interrupt Indicator
_RefreshRawNotInterruptiblere-queriesUnitCastingInfo/UnitChannelInfolive when no cached value is present; keeps both_msufApiNotInterruptibleRaw(target/focus) andMSUF_apiNotInterruptibleRaw(boss) in sync- New
_CastAllowsKickIndicatorguard 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_Core,EM2_Layout,EM2_HUD,EM2_Movers,EM2_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_Core,MSUF_CP_Modes,MSUF_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/useClassColorsflags
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
MakeOutlineRowhelper 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
fontOverridestored ingf_party/gf_raid/gf_mythicraidDB keys independently
Castbars Options — Disabled State
- New
SetCastbarOptionEnabledhelper 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
SetGameplayControlEnabledapplies 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:
FRIZQT,ARIALN,MORPHEUS,SKURRI,"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:
alphaSync,alphaExcludeTextPortrait,alphaLayerMode,alphaHPInCombat,alphaHPOutOfCombat,alphaPreserveHPColor - 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 fileFoundation/MSUF_Scheduler.lua— new centralized deduped next-frame schedulerAuras2/MSUF_AuraNative.lua— shared CUSTOM/BLIZZARD renderer abstraction for UF and GFCore/MSUF_EliteIcon.lua— elite/rare icon overlay systemFeatures/MSUF_PortraitDecoration.lua— relocated fromModules/Features/MSUF_Analytics.lua— Wago Analytics integrationGroupFrames/— 19 new files, ~23,000 linesLibs/LibCustomGlow-1.0/— new bundled libraryLibs/WagoAnalyticsShim/— new bundled shimMSUF_3DPortraits.luaremoved — merged intoMSUF_Portraits.luaFoundation/MSUF_Presets.luaremoved — preset logic consolidated- TOC: Interface 120007 added; OptionalDeps: WagoAnalytics; LibCustomGlow-1.0 added to load order

