MSUF 4.0 RC 1
Top-line stats
- Total LOC: 90,525 → 117,521 (+26,996, +29.8%)
- Lua files: 262 → 351 (+89)
issecretvalue()guards: 55 → 142 (+158%)- Interface compatibility: added 120007 (12.0.7)
★ HEADLINE: NEW MODULE — Group Frames
A complete party/raid frame system has been added. ~21,150 LOC across 17 new files, positioned as a built-in alternative to Grid2/Cell. All under GroupFrames/.
Architecture (new files)
MSUF_GF_Core.lua— factory, layout, preview, hiding (EQoL-pattern hierarchy onSecureGroupHeaderTemplate)MSUF_GF_DB.lua— defaults + config resolution, 3-slot health text modes, name color, role-aware visibilityMSUF_GF_Render.lua— coalesced dirty-flag visual pipeline (multiple DB writes → 1 update per tick)MSUF_GF_Effects.lua— per-frameRegisterUnitEvent, range fade (Grid2 pattern), aggro/dispel/target borders, AFK/DND text, UNIT_AURA coalescingMSUF_GF_Auras.lua— 3-group aura display (Buffs / Debuffs / Externals), zero-alloc icon pools, externals via BIG_DEFENSIVE filterMSUF_GF_AuraFilter.lua— 2-tier filter engine (Tier 1: Blizzard API tokens, Tier 2: declassified spell blacklist, user-toggleable)MSUF_GF_AuraPreview.lua— drag-to-position mock frame, live colors, real spell icons via process-lifetime cacheMSUF_GF_PrivateAuras.lua— 12.0.5 Private Aura anchoring + Dispel Overlay (isContainer = true), no fallback pathsMSUF_GF_SpellIndicators.lua+MSUF_GF_SpellIndicators_Data.lua— per-spell tracker for healer HoTs (icon/square/bar/number + frame effects: tint, border, glow, pulse, name color, alpha), multi-specMSUF_GF_HealerBuffs.lua+MSUF_GF_HealerBuffs_Editor.lua— per-spec spell families, compilation, aura matching, manual slot managementMSUF_GF_CornerIndicators.lua— 5 fixed slots (TL/TR/BL/BR/C) for dispel/aggro/custom dots, full perf rewriteMSUF_GF_GroupNumber.lua— subgroup number (1-8) overlay, hooked into public GF APIMSUF_GF_Masque.lua— separate Masque group from A2, registersIcon+Cooldownonly (count never passed)MSUF_GF_EM2.lua— Edit Mode 2 integration, GF behaves like a normal EM2 unitframe (CENTER-stored offsets)MSUF_BossFrameBridge.lua— bridges MSUF boss1..boss5 frames into the GF Private Aura subsystem (additive only, no GF child-registration)
GF features
- Party + raid in one addon — created via
SecureGroupHeaderTemplate, A/B pool system to handle zone-change header recreation - 3-slot health text —
textLeft / textCenter / textRightindependently configurable - Power-bar role visibility — show/hide power per assigned role
- Smooth fill toggle — animated bar fill, default ON
- Hide-in-client-scene — auto-hide GF in cinematics/cutscenes
- Target/aggro highlight — configurable size / draw layer / texture
- Dispel tint + glow via LibCustomGlow integration
- Dispel Overlay edge modes — Full Frame / Bottom Edge / Top Edge / Left Edge / Right Edge
- Externals defensives panel — separate slot for external CDs (e.g. Pain Suppression, Roar of Sacrifice)
- Boss-heal auras for Boss frames —
highlightOwn(highlight your own healing) +hideOthers(suppress other players' heals) - Backed by Masque with separate skin group from A2
- Mini-cc integration — frames registered in
_G.MSUF_UnitFramesforparty1-4/raid1-40(base units never registered to avoid stomping power bar) - Preview/edit mode — drag-to-position with radio-section UX, scaled preview (1.4×–2.8×)
Group Frames Options
- New
Options/MSUF_Options_GF.lua(~9k LOC) — Layout / Health & Text / Indicators / Effects tabs - New
Options/MSUF_Options_GF_Auras.lua(~3k LOC) — Buffs / Debuffs / Externals scopes
★ ARCHITECTURE: Code Consolidation
Three large modules were collapsed from many small files into fewer, more cohesive ones — easier to navigate, fewer file-scope local pressures, faster TOC parse.
Auras 2.0 — 14 files → 6 files
- Removed:
A2_Cache,A2_Collect,A2_Colors,A2_CooldownText,A2_Filters,A2_Icons,A2_Masque,A2_Preview,A2_Public,A2_Units - Consolidated into:
MSUF_A2_Core.lua(Cache + Collect + Icons),MSUF_A2_DB.lua(DB + Colors + Filters + Public + Units) - Kept:
A2_DB,A2_Reminder,A2_Render,A2_Events,A2_EditMode
Edit Mode 2 — 16 files → 5 files
- Removed:
EM2_Anchors,EM2_Compat,EM2_Elements,EM2_Grid,EM2_Init,EM2_Nudge,EM2_PopupFactory,EM2_Popup_Aura,EM2_Popup_Cast,EM2_Popup_Unit,EM2_Registry,EM2_Snap,EM2_State,EM2_Ticker,EM2_Undo - Consolidated into:
MSUF_EM2_Core.lua(Registry + State + Undo + Init),MSUF_EM2_Layout.lua(Grid + Snap + Anchors + Nudge + Ticker) - Kept:
EM2_Movers,EM2_Popups,EM2_HUD
ClassPower — 15 files → 4 files
- Removed all
ClassPower/Modes/MSUF_CP_Mode_*.lua,Features/MSUF_CP_*.lua,Core/MSUF_CP_*.lua,MSUF_CP_Profiles.lua - Consolidated into:
MSUF_CP_Core.lua(Build + Layout + Presentation + Runtime + Specials),MSUF_CP_Modes.lua(all mode builders) - Kept:
MSUF_CP_Constants.lua,MSUF_CP_Controller.lua
Removed legacy modules
Core/MSUF_Indicators.lua— replaced byMSUF_EliteIcon.lua+ indicator changes in coreModules/MSUF_3DPortraits.lua— replaced by the rewrittenMSUF_PortraitDecoration.lua
★ NEW: Foundation & Core Modules
Foundation/MSUF_BlizzKill.lua (NEW, 334 LOC) — Blizzard frame kill system + compat anchors + HideDefaultFrames. Tracks killed frames for re-assertion on PLAYER_ENTERING_WORLD (loading screens, flight, zone transitions). Combat-deferred RegisterStateDriver via lazy PLAYER_REGEN_ENABLED. Zero per-frame overhead. Extracted from the main backbone for maintainability.
Foundation/MSUF_Scheduler.lua (NEW, 96 LOC) — central next-frame / delayed scheduler. Replaces scattered C_Timer.After(0, ...) runtime deferrals with keyed, deduped scheduling. Secret-safe (no protected/secret API reads).
Core/MSUF_EliteIcon.lua (NEW, 136 LOC) — per-unit elite / rare / rare-elite icon overlay using nameplates-icon-elite-gold and nameplates-icon-elite-silver atlases. Supported on: Target, Focus, Target-of-Target, Boss. Per-unit DB keys: showEliteIcon, eliteIconSize, eliteIconAnchor, eliteIconOffsetX/Y, eliteIconLayer.
★ Performance Overhaul (Midnight 12.0)
UnitframeCore — hash-dispatch event handler
- Replaced if/elseif chain in
FrameOnEventwith_UF_DISPATCHhash table (UNIT_HEALTH,UNIT_POWER_UPDATE,UNIT_POWER_FREQUENT,UNIT_MAXHEALTH, etc.) - Lazy text-clear flags
_msufHpTextCleared/_msufPowerTextCleared— skip redundantSetText("")calls
Bars — calculator-based unified health update
- New
_MSUF_HealthCalcUpdate— ONECreateUnitHealPredictionCalculatorper frame, ONEUnitGetDetailedHealPredictioncall delivers HP, max-HP, absorbs, heal-absorbs, incoming heals (all C-side, secret-safe) - Eliminates per-event API call clusters; only runs on
UNIT_MAXHEALTH/UNIT_ABSORB_AMOUNT_CHANGED/UNIT_HEAL_ABSORB_AMOUNT_CHANGED/UNIT_HEAL_PREDICTION/UNIT_MAXHEALTHMODIFIER(lean path onUNIT_HEALTH) - Pure-function unit-key normalize cache — eliminates 8×
GetBossIndexFromTokenlookups per target click - Settings-serial gate (
_msufBarConfigGen) skips redundant overlay-color and absorb-enable resolution MSUF_SetBarValue/MSUF_SetBarMinMaxreduced to 1-line direct C calls (no smoothing/transaction wrappers)
Auras2 Render — render-path optimizations
- Inlined
DirtyAdd+ScheduleFlush(3 function calls → 0) - Inlined
AcquireIconfast path —pool[i]hit skips function call entirely - Per-
configGencached resolved config — eliminates ~40 table reads per aura event - Combat-skip for preview entirely (
isEditActivealways false in combat) - Aura table pool (max 64 entries) — zero Lua allocations for aura updates in steady-state raid combat
- Sort-order 0 fast path: pure cache iteration, ZERO C API calls per render
_masqueButtonCounttracking — Masque ReSkin only on structural change
StatusIndicators — AFK/DND cache
- New
_MSUF_GetCachedAwayStatuswith bit flags + invalidation API - Cached
_MSUF_AwayHasBit/_MSUF_AwaySetBit— replaces per-frameUnitIsAFK/UnitIsDNDpolling
RangeFade — array-cached frame refs
- New
_pollFramesarray (replaces map-based iteration),_pollUnits,_pollConfKey,_pollCountfor tight inner loop - 175 added / 47 removed LOC
EventBus — simplified dispatch
- Removed
_DispatchSafe/_DispatchFastsplit; removed:SetSafeCalls - Direct dispatch via simplified
Compact/MaybeUnregisterhelpers - 285 LOC removed, 74 added — net -211
Modules.lua — pcall removed from registration
SafeCallno longer wraps in pcall; runs callback directly- Replaces former
hooksecurefuncfor RoundedUF init with explicit_G.MSUF_RoundedUF_OnModulesAppliednotify
Bars (Core/MSUF_Bars.lua)
- NEW Bar Mode:
gradient— HP-derived gradient mode added alongsidedark/class/unified - Gradient direction pad — independent
gradientDirLeft/gradientDirRight/gradientDirUp/gradientDirDownflags (replaces singlegradientDirectionstring; auto-migrates on first load) - Gradient strength slider —
gradientStrength0–1 (default 0.45) - Power bar gradient —
powerGradientEnabledindependent of HP gradient - Scope-aware bar border thickness — new
MSUF_NormalizeBarBorderScope/MSUF_GetScopedBarBorderThicknessDB/ per-scope cache (MSUF_BarBorderCache.byScope) hlOverrideflag — additional override key alongsidehpPowerTextOverridefor absorb display/anchor/opacity resolution- Dark-tint helper
ns.Bars._DarkTint(g, r, gg, b)andns.Bars._MatchHPColorextracted as pure functions - Removed transaction system (
MSUF_BeginTransaction/HasTransaction/GetTransactionSnapshot/CommitTransaction/RollbackTransaction) - Removed
HidePowerBarOnly/HideAndResetPowerBar/ApplySpecfrom publicns.BarsAPI
Castbars (Core/MSUF_Castbars.lua + LoD addon)
Main addon (Core/MSUF_Castbars.lua) — 65 added / 49 removed
LoD addon (MidnightSimpleUnitFrames_Castbars)
- Removed
Castbars/MSUF_CastbarPreviewEdit.luafrom TOC (10 different files) - TOC: removed interface
120005(it's now declared on the main addon only) MSUF_CastbarFrames.lua— 266 added / 266 removed (full rewrite)MSUF_CastbarVisuals.lua— minor tweaksMSUF_CastbarGCD.lua— Midnight 12.0 secret-safe rewrite- Removed all
GetHaste()arithmetic (returns secret-tainted number on 12.0.5/Midnight; anyhastePct / 100raises taint and breaks every subsequent castbar update) - Falls back to base GCD; Frogski-style minimum clamps (0.75s when
baseGCD > 1.49, else 1.0s) - Saves 3 API calls when path is taken (
GetSpellInfo+GetSpellBaseCooldown+GetHaste)
- Removed all
Auras 2.0 (Auras2/)
- Boss heal auras — new
bossHealAuras = { highlightOwn = false, hideOthers = false }config block (per-aura behavior on Boss frames; global across boss1..boss5) - Edit mode rewrite —
MSUF_A2_EditMode.lua+865 LOC (preview ticker, mouse-state apply, text config resolver, container clear, per-entry render, stack/cooldown preview tickers) - Curve-based pandemic + threshold cache —
_pandemicCurve+_pandemicEvalBool(C_CurveUtil.EvaluateColorValueFromBoolean), threshold cache for secret-safe text parsing fallback API._Render.DefaultKV/Clamp— shared helpers for default-value merge and number clamping- Per-group offsets for drag movers (mirror containers)
- Reload popup factory —
EnsureReloadPopup+ dialog builder forMakeDialog(dialogKey, text, prevGlobalKey, cbGlobalKey, sharedField) - Masque overlay sync —
SyncIconOverlayLevelsensures MSUF overlays (countFrame, dispel border) stay above any Masque skin layers - Removed legacy
_msufSelfHealCalcglobal cache; replaced with per-frame_msufHealthCalc
Edit Mode 2
- Consolidated to 5 files (Core/Layout/Movers/Popups/HUD) — see Architecture section
- Element registration API —
Registerunchanged but file location moved (now inEM2_Core.lua);popupTypefield supports"unit"/"castbar"/"aura"/"classpower"/"custom" - Grid + Snap + Anchors + Nudge + Ticker unified in
EM2_Layout.luafor fewer file-scope locals and lower load-time cost
ClassPower
- Consolidated to 4 files — see Architecture section
- All mode builders (Segmented, Fractional, Aura, Rune, Timer, Continuous, Stagger) now in
MSUF_CP_Modes.luaand registered to_G.MSUF_CP_MODE_BUILDERS - All build/layout/presentation/runtime/specials helpers now in
MSUF_CP_Core.luaregistered to_G.MSUF_CP_CORE_BUILDERS MSUF_CP_Controller.luareworked (~2,384 LOC)
Text & Icons
Core/MSUF_Text.lua (+188 / -70)
- NEW
ns.Text.NormalizeHpTextMode(mode)— public mode normalizer - NEW
ns.Text.RenderHpMode(self, show, hpStr, hpPct, hasPct, conf, g, absorbText, absorbStyle, hpMaxStr, hpDeficitStr)— single render entry-point covering all HP text modes - New helpers:
_MSUF_HpModeUsesPercent,_MSUF_HpModeCanSplit,_MSUF_HpMissingText,_MSUF_HpMainForSplit,_MSUF_FormatHpByMode,_MSUF_SetHpSecret
Icon layer system — new ns.Icons._layout namespace with Layer(conf, g, key, defaultVal) / EnsureLayerFrame(owner, region, key, parent) / ApplyLayer(region, layer, owner). Used by EliteIcon, leader, raid marker, level, incoming-res, combat-state, rested-state.
Borders (Core/MSUF_Borders.lua)
- 334 added / 159 removed — major rework, scope-aware border resolution feeds the bar-border thickness pipeline
- Cache invalidation tied to
_BarBorderCache.byScope
Range Fade (Core/MSUF_RangeFade.lua)
- Array-based polling (
_pollFrames,_pollCount) replaces map iteration - Group Frames range fade uses Grid2-style pattern via separate path in
MSUF_GF_Effects.lua - 175 added / 47 removed
Status Indicators (Core/MSUF_StatusIndicators.lua)
- AFK/DND status caching with bit flags
- New
_MSUF_ClampIconLayer(v, defaultVal)and_MSUF_ApplyIconLayer(region, layer, owner)for the new layer system - Cache invalidation on unit change
- 379 added / 147 removed
Portraits
Core/MSUF_Portraits.lua (+82 / minor) — supporting changes for the new PortraitDecoration
Modules/MSUF_PortraitDecoration.lua (+15 / -3) — replaces former MSUF_3DPortraits.lua. Per-unit portraitContainer reparents portrait texture for strata elevation (above HP/power bars); ComputeAndApplyLayout cheap and always-runs; decoration (border, bg, shape) stamp-gated.
Foundation
Foundation/MSUF_Defaults.lua (+87 / -30 lines)
- Bar Mode normalizer — supports
dark/class/unified/gradient(was 3-mode) - GCD bar time default flipped —
showGCDBarTimedefaultfalse→true - Absorb-color migration v2 — wipes both legacy
absorbColor*andabsorbBarColor*key sets once. Pre-v2 the picker wrote to keys that no readers used, so picker had no effect; v1 patch surfaced default-white into now-live keys; v2 lets defaults render again until user explicitly picks a colour. Idempotent viaabsorbBarColorMigrationV2flag. - Layer-z defaults for indicators (default 7):
leaderIconLayer,levelIndicatorLayer,incomingResIndicatorLayer,combatStateIndicatorLayer,restedStateIndicatorLayer, per-unitraidMarkerLayer - Elite icon defaults per unit (target/focus/targettarget/boss):
showEliteIcon=true,eliteIconSize=20,eliteIconAnchor="TOPRIGHT",eliteIconOffsetX=2,eliteIconOffsetY=2,eliteIconLayer=7 - Boss heal auras defaults —
bossHealAuras = { highlightOwn = false, hideOthers = false } - Boss layout migration — one-shot migration from legacy
invertBossOrdercheckbox to new layout mode (bossLayoutMode);_bossLayoutMigratedflag keeps it idempotent - Per-unit
smoothFilldefaulttrue— matches Group Frames default - Secret-safe nil checks —
if type(x) ~= "table" thenreplaced withif not x thenthroughout (avoids type-call on potentially-secret tables)
Foundation/MSUF_EventBus.lua — simplified to bare-minimum dispatch (see Performance)
Foundation/MSUF_Util.lua (+157 / -193) — utility consolidation, more inline helpers
Foundation/MSUF_Modules.lua — SafeCall no longer pcalls; RoundedUF notification via direct global call
Foundation/MSUF_Profiles.lua / MSUF_Style.lua / MSUF_Transitions.lua / MSUF_Presets.lua — touched for new defaults and bar-mode handling
Foundation/MSUF_Libs.lua — registers LibCustomGlow
Libraries
LibCustomGlow-1.0added to TOC load (was previously vendored but not loaded)LibStub,CallbackHandler-1.0,LibSharedMedia-3.0updated
Localization
- deDE.lua — added 9 new keys for Group Frames Dispel Overlay:
Dispel Overlay,Enable Dispel Overlay,Show On Current Health Only,Full Frame,Bottom Edge,Top Edge,Left Edge,Right Edge, plus full descriptive tooltip - All other locales (
enUS,enGB,zhCN,zhTW,frFR,esES,esMX,itIT,koKR,ptBR,ruRU) — minor cosmetic (load-pattern tweak:_G and _G.MSUF_L→_G.MSUF_L) MSUF_Localization.lua— touched
Options Reorganization
Sidebar restructure (in MidnightSimpleUnitFrames_SlashMenu.lua)
The options window was reorganized with a new top-level sidebar:
- Dashboard (Home)
- Unit Frames — Player / Target / Target of Target / Focus / Boss Frames / Pet
- Group Frames (NEW top-level section) — Layout / Health & Text / Buffs & Debuffs / Indicators
- Global Style (renamed from "Options") — Bars / Fonts / Unit Auras (renamed from "Auras 2.0") / Castbar / Portraits / Colors / Miscellaneous
- Class Resources
- Gameplay
- Modules — Style
- Profiles
Slash commands — slash menu rewrote NAV and pages table for the new structure; added GF tab routes: gf_layout, gf_bars, gf_auras, gf_indicators (each routes via _G.MSUF_GF_SwitchTab)
Alpha-build popup — when the version string contains "alpha", a MSUF_ALPHA_DISCORD static popup invites users to the Discord on first login
Per-options-file changes
| File | Added | Removed | Notes |
|---|---|---|---|
MSUF_Options_Bars.lua |
1146 | 362 | Textures & Gradient collapsible box, gradient enable/strength/direction-pad, scope-aware HP/Power gradient checks |
MSUF_Options_Auras.lua |
527 | 196 | "Unit Auras" rename, Boss Heal Auras (highlightOwn / hideOthers), GF cooldown-text invalidation hooks, Search registration via MSUF_Search_RegisterRoots |
MSUF_Options_Castbars.lua |
43 | 6 | Minor (GCD default = on, layer-aware) |
MSUF_Options_Player.lua |
2118 | 4261 | Major shrink, refactored to use shared accordion utility; eliteicon indicator spec entry |
MSUF_Options_Portraits.lua |
21 | 23 | Touched for the rewritten PortraitDecoration |
MSUF_Options_Colors.lua |
215 | 769 | ~770 LOC of color setter/getter helpers moved out of Core/MSUF_ColorsCore.lua and into the options layer |
MSUF_Options_Core.lua |
varies | varies | Reorg for new sidebar |
MSUF_Options_Fonts.lua |
varies | varies | Touched |
MSUF_Options_Profiles.lua |
varies | varies | Touched |
MSUF_Options_ClassPower.lua |
varies | varies | Touched (for consolidated CP) |
MSUF_Options_ClassPower_QuickSetup.lua |
varies | varies | Touched |
MSUF_Options_Toolkit.lua |
varies | varies | Shared helpers extended |
MSUF_Options_GF.lua |
NEW | — | ~9k LOC |
MSUF_Options_GF_Auras.lua |
NEW | — | ~3k LOC |
MSUF_Options_Misc.lua |
0 | 0 | Unchanged |
MSUF_Options_Gameplay.lua |
varies | varies | Touched |
Options total: 24,318 → 30,340 LOC (+6,022)
Colors Core (Core/MSUF_ColorsCore.lua)
Massive shrink: 1,164 → 610 LOC (-554, ~48%). All color getter/setter helpers moved to Options/MSUF_Options_Colors.lua (where they belong — they're cold-path UI code, not runtime). Removed:
GetGlobalFontColor/SetGlobalFontColor/ResetGlobalFontToPaletteGetCastbarTextColor/SetCastbarTextColor/ResetCastbarTextColorToGlobalGetCastbarBorderColor/SetCastbarBorderColor/ResetCastbarBorderColorGetCastbarBackgroundColor/SetCastbarBackgroundColor/ResetCastbarBackgroundColorGetInterruptibleCastColor/SetInterruptibleCastColorGetNonInterruptibleCastColor/SetNonInterruptibleCastColorGetInterruptFeedbackCastColor/SetInterruptFeedbackCastColorGetPlayerCastbarOverrideEnabled/SetPlayerCastbarOverrideEnabledGetPlayerCastbarOverrideMode/SetPlayerCastbarOverrideModeGetPlayerCastbarOverrideColor/SetPlayerCastbarOverrideColorGetClassBarBgColor/SetClassBarBgColorGetBarBgMatchHP/SetBarBgMatchHPResetAllNPCColors/GetNPCColorMode
Runtime color resolution (the hot-path stuff that still lives in ColorsCore) is unchanged.
Backbone (MidnightSimpleUnitFrames.lua)
- Net 6,430 → 5,824 LOC (-606) — code extracted to dedicated modules (BlizzKill, Scheduler, EliteIcon)
- Removed:
_MSUF_BucketUpdateManager(bucket update system replaced by Scheduler) - Removed: legacy
_MSUF_KillGuard*functions (moved to BlizzKill) - Removed:
_MSUF_DeferredPBRelayout,MSUF_GetMSUFPlayerFrame,MSUF_ApplyCompatAnchor_PlayerFrame,HideDefaultFrames(moved to BlizzKill) - Removed:
__MSUF_OpenOptionsToKey_Flush,__MSUF_OpenOptionsToCastbar_Flush,MSUF_OpenOptionsToKey,MSUF_OpenOptionsToUnitMenu,MSUF_OpenOptionsToCastbarMenu,MSUF_OpenOptionsToBossCastbarMenu(now in slash menu rewrite) - Removed:
_G.MSUF_OnCDMExtensionChanged,_G.MSUF_FlushCDMBridgeRefresh - Added:
MSUF_NormalizeBarBorderScope,MSUF_GetScopedBarBorderThicknessDB,MSUF_GetDesiredBarBorderThicknessAndStamp(frameOrUnit),MSUF_GetFontPathForKey,MSUF_ResolveNameAnchor(anchor, x) - Added:
_MSUF_HideUnitFrame(unit),_MSUF_PreviewUnitFrame(unit, conf),_MSUF_ApplyToUnitFrame(unit, conf)(extracted from inline factories) - Added:
ns.Icons._layout.Layer/EnsureLayerFrame/ApplyLayer - Added:
ns.UF.MakeLayeredTex(self, key, parentKey, layer, sublayer, nameSuffix) - Added:
ns.Bars._DarkTint,ns.Bars._MatchHPColor - Added:
_G.MSUF_QueueUnitframeUpdate,_G.MSUF_QueueUnitframeInit,_G.MSUF_ScheduleWarmupFrame - Added:
_G.MSUF_UFCore_RequestLayout/_RequestLayoutForUnit/_MarkDirty(UFCore public API) - Added:
_G.MSUF_ApplyEliteIconLayout/_G.MSUF_UpdateEliteIcon - Added:
_G.MSUF_ToT_OnTargetChanged(callable hook) MSUF_RegisterBucketUpdate/MSUF_UnregisterBucketUpdateare now legacy stubs (no-op fallbacks) — call sites migrated to Scheduler
Features
Features/MSUF_Search.lua (+189 / -135) — MSUF_Search_RegisterRoots API (e.g. { "auras", "auras2" }, { "MSUF_AurasPanel" }, "Unit Auras"); rebuilt for new sidebar
Features/MSUF_VersionCheck.lua (+1 / -25) — simplified
Features/MidnightSimpleUnitFrames_Gameplay.lua (+69 / -168) — net shrink, rebased on Scheduler instead of inline timers
Features/MidnightSimpleUnitFrames_SlashMenu.lua (+265 / -107) — full sidebar/nav rewrite (see Options Reorganization), Alpha popup, GF tab routing
Modules
Modules/MSUF_RoundedUnitframes.lua (+17 / -43) — net -26; uses new _G.MSUF_RoundedUF_OnModulesApplied notification entry-point instead of hooksecurefunc
Modules/MidnightSimpleUnitFrames_FocusKickIcon.lua (+220 / -542) — major shrink, ~322 LOC removed, simplified
Modules/MSUF_InterruptReady.lua — unchanged (0 differences)
Modules/MSUF_PortraitDecoration.lua — minor tweak (+15 / -3)
Modules/MSUF_3DPortraits.lua — DELETED (replaced by PortraitDecoration)
UI
UI/MidnightSimpleUnitFrames_MinimapButton.lua — touched for sidebar reorg
UI/MSUF_AddonCompartment.lua — touched for sidebar reorg
Media (TGA assets)
Role icon themes — 11 NEW theme packs (per-icon TGA files, each with assist/dps/healer/leader/tank, most with _midnight accent variants):
Media/Icons/Classic/— 5 filesMedia/Icons/DarkEmboss/— 10 files (with midnight variants)Media/Icons/Diamonds/— 10 filesMedia/Icons/Dots/— 10 filesMedia/Icons/GlassPanels/— 10 filesMedia/Icons/GlossyOrbs/— 10 filesMedia/Icons/Midnight/— 5 filesMedia/Icons/NeonOutline/— 10 filesMedia/Icons/RingSymbols/— 10 filesMedia/Icons/Shapes/— 10 filesMedia/Icons/Squares/— 10 files
Total: 100 new role-icon assets, 10 packs of 10 (Classic and Midnight are 5-icon variants without midnight accents).
Gradient bar textures (4 new TGAs)
Media/MSUF_Grad_H.tga— horizontalMedia/MSUF_Grad_H_Rev.tga— horizontal reversedMedia/MSUF_Grad_V.tga— verticalMedia/MSUF_Grad_V_Rev.tga— vertical reversed
Media/MSUF_Media.lua — registers the new gradient textures and role-icon paths
TOC Changes
MidnightSimpleUnitFrames.toc
## Interface: 120000, 120001, 120005, 120007 (+ 120007)
## Version: 4.0 Beta 16 (was 3.70)
- LIBS: added
LibCustomGlow-1.0\LibCustomGlow-1.0.lua - FOUNDATION: added
MSUF_Scheduler.lua - EDIT MODE 2: 17 entries → 5 entries (Core, Layout, Movers, Popups, HUD)
- AURAS 2.0: 15 entries → 6 entries (DB, Core, Reminder, Render, Events, EditMode)
- CORE (pre-main): added
Foundation\MSUF_BlizzKill.lua(loads after Core post-main on purpose for kill-system ordering) - CORE (post-main): added
Core\MSUF_EliteIcon.lua - CLASSPOWER: 14 entries → 4 entries (Constants, Modes, Core, Controller)
- GROUP FRAMES section (NEW) — 17 entries (DB, Core, Effects, Render, GroupNumber, SpellIndicators_Data, SpellIndicators, PrivateAuras, AuraFilter, Auras, CornerIndicators, HealerBuffs, HealerBuffs_Editor, EM2, AuraPreview, Masque, BossFrameBridge)
- OPTIONS: added
MSUF_Options_GF.lua,MSUF_Options_GF_Auras.lua - MODULES: removed
MSUF_3DPortraits.lua
MidnightSimpleUnitFrames_Castbars.toc
## Interface:cleaned up (removed stray120005after dot-typo, kept120001, 120000)MSUF_CastbarPreviewEdit.luaremoved from load order
Default Behavior Changes (User-Visible)
- Bar Mode now supports
gradient. Existing users default unchanged. - GCD bar timer —
showGCDBarTimedefault flipped fromfalse→true(was hidden by default in 3.70, now visible) - Smooth health fill — per-unit
smoothFilldefaults totrueeverywhere (matches the GF behavior for consistency across MSUF and the new Group Frames) - Elite icons —
showEliteIcondefaults totrueon Target / Focus / Target-of-Target / Boss - Boss heal auras —
highlightOwnandhideOthersdefault tofalse(off) - Absorb colors — one-time wipe via
absorbBarColorMigrationV2flag; users see correct defaults again. If a colour was explicitly picked AFTER the marker is set, it persists. - Boss layout migration — legacy
invertBossOrder = trueusers get auto-migrated to the newbossLayoutModeenum once (_bossLayoutMigratedmarker)
Secret-Safety / Midnight 12.0
issecretvalueguards more than doubled (55 → 142, +158%)- All
type(x) ~= "table"early-returns in defaults rewritten toif not x then(avoidstype()call on potentially-secret tables) - Castbar GCD path stripped of all
GetHaste()arithmetic (was tainting the entire castbar update chain) - New files all built secret-safe from the ground up (every
issecretvaluecheck precedes anytype/ comparison / arithmetic / table-key use) - GroupFrames uses C-side delegation wherever possible:
SetAlphaFromBoolean,C_CurveUtil.EvaluateColorFromBoolean,SetCooldownFromDurationObject,C_UnitAuras.GetAuraDispelTypeColor,UnitHealthPercent,UnitPowerPercent,UnitHealthMissing
Module-by-Module LOC Delta Summary
| Module | v3.70 | v4.0 Beta 16 | Δ |
|---|---|---|---|
| Total addon | 90,525 | 117,521 | +26,996 (+29.8%) |
| GroupFrames (new) | 0 | 21,146 | +21,146 |
| Options | 24,318 | 30,340 | +6,022 |
| Auras 2.0 | 10,100 | 10,230 | +130 |
| EditMode 2 | 4,683 | 4,810 | +127 |
| ClassPower | 4,638 | 4,437 | -201 |
Backbone (MidnightSimpleUnitFrames.lua) |
6,430 | 5,824 | -606 |
Core/MSUF_UnitframeCore.lua |
3,613 | 3,426 | -187 |
Core/MSUF_ColorsCore.lua |
1,164 | 610 | -554 |
Core/MSUF_Bars.lua |
746 | 878 | +132 |
Core/MSUF_Castbars.lua |
894 | 910 | +16 |
Core/MSUF_Text.lua |
801 | 919 | +118 |
Core/MSUF_Portraits.lua |
351 | 433 | +82 |
Core/MSUF_RangeFade.lua |
928 | 1,056 | +128 |
Core/MSUF_StatusIndicators.lua |
— | — | +232 net |
Core/MSUF_Borders.lua |
— | — | +175 net |
Foundation/MSUF_Defaults.lua |
1,586 | 1,644 | +58 |
Foundation/MSUF_BlizzKill.lua (new) |
0 | 334 | +334 |
Foundation/MSUF_Scheduler.lua (new) |
0 | 96 | +96 |
Core/MSUF_EliteIcon.lua (new) |
0 | 136 | +136 |
Files Added (89 net new files)
Code (29 new Lua files)
GroupFrames/— 17 filesOptions/MSUF_Options_GF.luaOptions/MSUF_Options_GF_Auras.luaFoundation/MSUF_BlizzKill.luaFoundation/MSUF_Scheduler.luaCore/MSUF_EliteIcon.luaAuras2/MSUF_A2_Core.lua(consolidated)ClassPower/MSUF_CP_Core.lua(consolidated)ClassPower/MSUF_CP_Modes.lua(consolidated)EditMode2/MSUF_EM2_Core.lua(consolidated)EditMode2/MSUF_EM2_Layout.lua(consolidated)Modules/MSUF_PortraitDecoration.lua(replaces 3DPortraits)
Media (104 new TGA files) — see Media section
Files Deleted (43)
Auras2/—A2_Cache,A2_Collect,A2_Colors,A2_CooldownText,A2_Filters,A2_Icons,A2_Masque,A2_Preview,A2_Public,A2_Units(10)ClassPower/Core/—CP_AltMana,CP_Build,CP_EbonMight,CP_Layout,CP_Presentation(5)ClassPower/Features/—CP_Balance,CP_Runtime,CP_Specials(3)ClassPower/Modes/—CP_Mode_Aura,CP_Mode_Continuous,CP_Mode_Fractional,CP_Mode_Rune,CP_Mode_Segmented,CP_Mode_Stagger,CP_Mode_Timer(7)ClassPower/MSUF_CP_Profiles.luaCore/MSUF_Indicators.luaEditMode2/—EM2_Anchors,EM2_Compat,EM2_Elements,EM2_Grid,EM2_Init,EM2_Nudge,EM2_PopupFactory,EM2_Popup_Aura,EM2_Popup_Cast,EM2_Popup_Unit,EM2_Registry,EM2_Snap,EM2_State,EM2_Ticker,EM2_Undo(15)Modules/MSUF_3DPortraits.lua
Migration Notes
- First login after upgrade triggers (in this order, all idempotent):
- Boss layout — converts legacy
invertBossOrder = truetobossLayoutMode - Absorb colors v2 — wipes legacy/intermediate keys; defaults render until user picks a colour
- Layer defaults — backfills missing
*Layerdefaults at z=7 - Elite icon defaults — backfills per-unit on target/focus/targettarget/boss
- Boss heal auras defaults — backfills
highlightOwn=false,hideOthers=false - Per-unit
smoothFill = true— backfills missing key - Gradient direction — converts legacy
gradientDirectionstring to per-direction booleans
- Boss layout — converts legacy
- All migrations gated by per-flag markers; cannot run twice.