Skip to content

4.0rc1

Latest

Choose a tag to compare

@Mapkov2 Mapkov2 released this 02 May 00:26

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 on SecureGroupHeaderTemplate)
  • MSUF_GF_DB.lua — defaults + config resolution, 3-slot health text modes, name color, role-aware visibility
  • MSUF_GF_Render.lua — coalesced dirty-flag visual pipeline (multiple DB writes → 1 update per tick)
  • MSUF_GF_Effects.lua — per-frame RegisterUnitEvent, range fade (Grid2 pattern), aggro/dispel/target borders, AFK/DND text, UNIT_AURA coalescing
  • MSUF_GF_Auras.lua — 3-group aura display (Buffs / Debuffs / Externals), zero-alloc icon pools, externals via BIG_DEFENSIVE filter
  • MSUF_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 cache
  • MSUF_GF_PrivateAuras.lua — 12.0.5 Private Aura anchoring + Dispel Overlay (isContainer = true), no fallback paths
  • MSUF_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-spec
  • MSUF_GF_HealerBuffs.lua + MSUF_GF_HealerBuffs_Editor.lua — per-spec spell families, compilation, aura matching, manual slot management
  • MSUF_GF_CornerIndicators.lua — 5 fixed slots (TL/TR/BL/BR/C) for dispel/aggro/custom dots, full perf rewrite
  • MSUF_GF_GroupNumber.lua — subgroup number (1-8) overlay, hooked into public GF API
  • MSUF_GF_Masque.lua — separate Masque group from A2, registers Icon + Cooldown only (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 texttextLeft / textCenter / textRight independently 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_UnitFrames for party1-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 by MSUF_EliteIcon.lua + indicator changes in core
  • Modules/MSUF_3DPortraits.lua — replaced by the rewritten MSUF_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 FrameOnEvent with _UF_DISPATCH hash table (UNIT_HEALTH, UNIT_POWER_UPDATE, UNIT_POWER_FREQUENT, UNIT_MAXHEALTH, etc.)
  • Lazy text-clear flags _msufHpTextCleared / _msufPowerTextCleared — skip redundant SetText("") calls

Bars — calculator-based unified health update

  • New _MSUF_HealthCalcUpdate — ONE CreateUnitHealPredictionCalculator per frame, ONE UnitGetDetailedHealPrediction call 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 on UNIT_HEALTH)
  • Pure-function unit-key normalize cache — eliminates 8× GetBossIndexFromToken lookups per target click
  • Settings-serial gate (_msufBarConfigGen) skips redundant overlay-color and absorb-enable resolution
  • MSUF_SetBarValue / MSUF_SetBarMinMax reduced to 1-line direct C calls (no smoothing/transaction wrappers)

Auras2 Render — render-path optimizations

  • Inlined DirtyAdd + ScheduleFlush (3 function calls → 0)
  • Inlined AcquireIcon fast path — pool[i] hit skips function call entirely
  • Per-configGen cached resolved config — eliminates ~40 table reads per aura event
  • Combat-skip for preview entirely (isEditActive always 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
  • _masqueButtonCount tracking — Masque ReSkin only on structural change

StatusIndicators — AFK/DND cache

  • New _MSUF_GetCachedAwayStatus with bit flags + invalidation API
  • Cached _MSUF_AwayHasBit / _MSUF_AwaySetBit — replaces per-frame UnitIsAFK/UnitIsDND polling

RangeFade — array-cached frame refs

  • New _pollFrames array (replaces map-based iteration), _pollUnits, _pollConfKey, _pollCount for tight inner loop
  • 175 added / 47 removed LOC

EventBus — simplified dispatch

  • Removed _DispatchSafe/_DispatchFast split; removed :SetSafeCalls
  • Direct dispatch via simplified Compact / MaybeUnregister helpers
  • 285 LOC removed, 74 added — net -211

Modules.luapcall removed from registration

  • SafeCall no longer wraps in pcall; runs callback directly
  • Replaces former hooksecurefunc for RoundedUF init with explicit _G.MSUF_RoundedUF_OnModulesApplied notify

Bars (Core/MSUF_Bars.lua)

  • NEW Bar Mode: gradient — HP-derived gradient mode added alongside dark / class / unified
  • Gradient direction pad — independent gradientDirLeft / gradientDirRight / gradientDirUp / gradientDirDown flags (replaces single gradientDirection string; auto-migrates on first load)
  • Gradient strength slidergradientStrength 0–1 (default 0.45)
  • Power bar gradientpowerGradientEnabled independent of HP gradient
  • Scope-aware bar border thickness — new MSUF_NormalizeBarBorderScope / MSUF_GetScopedBarBorderThicknessDB / per-scope cache (MSUF_BarBorderCache.byScope)
  • hlOverride flag — additional override key alongside hpPowerTextOverride for absorb display/anchor/opacity resolution
  • Dark-tint helper ns.Bars._DarkTint(g, r, gg, b) and ns.Bars._MatchHPColor extracted as pure functions
  • Removed transaction system (MSUF_BeginTransaction / HasTransaction / GetTransactionSnapshot / CommitTransaction / RollbackTransaction)
  • Removed HidePowerBarOnly / HideAndResetPowerBar / ApplySpec from public ns.Bars API

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.lua from 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 tweaks
  • MSUF_CastbarGCD.lua — Midnight 12.0 secret-safe rewrite
    • Removed all GetHaste() arithmetic (returns secret-tainted number on 12.0.5/Midnight; any hastePct / 100 raises 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)

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 rewriteMSUF_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 factoryEnsureReloadPopup + dialog builder for MakeDialog(dialogKey, text, prevGlobalKey, cbGlobalKey, sharedField)
  • Masque overlay syncSyncIconOverlayLevels ensures MSUF overlays (countFrame, dispel border) stay above any Masque skin layers
  • Removed legacy _msufSelfHealCalc global cache; replaced with per-frame _msufHealthCalc

Edit Mode 2

  • Consolidated to 5 files (Core/Layout/Movers/Popups/HUD) — see Architecture section
  • Element registration APIRegister unchanged but file location moved (now in EM2_Core.lua); popupType field supports "unit" / "castbar" / "aura" / "classpower" / "custom"
  • Grid + Snap + Anchors + Nudge + Ticker unified in EM2_Layout.lua for 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.lua and registered to _G.MSUF_CP_MODE_BUILDERS
  • All build/layout/presentation/runtime/specials helpers now in MSUF_CP_Core.lua registered to _G.MSUF_CP_CORE_BUILDERS
  • MSUF_CP_Controller.lua reworked (~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 flippedshowGCDBarTime default falsetrue
  • Absorb-color migration v2 — wipes both legacy absorbColor* and absorbBarColor* 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 via absorbBarColorMigrationV2 flag.
  • Layer-z defaults for indicators (default 7): leaderIconLayer, levelIndicatorLayer, incomingResIndicatorLayer, combatStateIndicatorLayer, restedStateIndicatorLayer, per-unit raidMarkerLayer
  • Elite icon defaults per unit (target/focus/targettarget/boss): showEliteIcon=true, eliteIconSize=20, eliteIconAnchor="TOPRIGHT", eliteIconOffsetX=2, eliteIconOffsetY=2, eliteIconLayer=7
  • Boss heal auras defaultsbossHealAuras = { highlightOwn = false, hideOthers = false }
  • Boss layout migration — one-shot migration from legacy invertBossOrder checkbox to new layout mode (bossLayoutMode); _bossLayoutMigrated flag keeps it idempotent
  • Per-unit smoothFill default true — matches Group Frames default
  • Secret-safe nil checksif type(x) ~= "table" then replaced with if not x then throughout (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.luaSafeCall 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.0 added to TOC load (was previously vendored but not loaded)
  • LibStub, CallbackHandler-1.0, LibSharedMedia-3.0 updated

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 / ResetGlobalFontToPalette
  • GetCastbarTextColor / SetCastbarTextColor / ResetCastbarTextColorToGlobal
  • GetCastbarBorderColor / SetCastbarBorderColor / ResetCastbarBorderColor
  • GetCastbarBackgroundColor / SetCastbarBackgroundColor / ResetCastbarBackgroundColor
  • GetInterruptibleCastColor / SetInterruptibleCastColor
  • GetNonInterruptibleCastColor / SetNonInterruptibleCastColor
  • GetInterruptFeedbackCastColor / SetInterruptFeedbackCastColor
  • GetPlayerCastbarOverrideEnabled / SetPlayerCastbarOverrideEnabled
  • GetPlayerCastbarOverrideMode / SetPlayerCastbarOverrideMode
  • GetPlayerCastbarOverrideColor / SetPlayerCastbarOverrideColor
  • GetClassBarBgColor / SetClassBarBgColor
  • GetBarBgMatchHP / SetBarBgMatchHP
  • ResetAllNPCColors / 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_UnregisterBucketUpdate are 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.luaunchanged (0 differences)

Modules/MSUF_PortraitDecoration.lua — minor tweak (+15 / -3)

Modules/MSUF_3DPortraits.luaDELETED (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 files
  • Media/Icons/DarkEmboss/ — 10 files (with midnight variants)
  • Media/Icons/Diamonds/ — 10 files
  • Media/Icons/Dots/ — 10 files
  • Media/Icons/GlassPanels/ — 10 files
  • Media/Icons/GlossyOrbs/ — 10 files
  • Media/Icons/Midnight/ — 5 files
  • Media/Icons/NeonOutline/ — 10 files
  • Media/Icons/RingSymbols/ — 10 files
  • Media/Icons/Shapes/ — 10 files
  • Media/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 — horizontal
  • Media/MSUF_Grad_H_Rev.tga — horizontal reversed
  • Media/MSUF_Grad_V.tga — vertical
  • Media/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 stray 120005 after dot-typo, kept 120001, 120000)
  • MSUF_CastbarPreviewEdit.lua removed from load order

Default Behavior Changes (User-Visible)

  • Bar Mode now supports gradient. Existing users default unchanged.
  • GCD bar timershowGCDBarTime default flipped from falsetrue (was hidden by default in 3.70, now visible)
  • Smooth health fill — per-unit smoothFill defaults to true everywhere (matches the GF behavior for consistency across MSUF and the new Group Frames)
  • Elite iconsshowEliteIcon defaults to true on Target / Focus / Target-of-Target / Boss
  • Boss heal aurashighlightOwn and hideOthers default to false (off)
  • Absorb colors — one-time wipe via absorbBarColorMigrationV2 flag; users see correct defaults again. If a colour was explicitly picked AFTER the marker is set, it persists.
  • Boss layout migration — legacy invertBossOrder = true users get auto-migrated to the new bossLayoutMode enum once (_bossLayoutMigrated marker)

Secret-Safety / Midnight 12.0

  • issecretvalue guards more than doubled (55 → 142, +158%)
  • All type(x) ~= "table" early-returns in defaults rewritten to if not x then (avoids type() 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 issecretvalue check precedes any type / 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 files
  • Options/MSUF_Options_GF.lua
  • Options/MSUF_Options_GF_Auras.lua
  • Foundation/MSUF_BlizzKill.lua
  • Foundation/MSUF_Scheduler.lua
  • Core/MSUF_EliteIcon.lua
  • Auras2/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.lua
  • Core/MSUF_Indicators.lua
  • EditMode2/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):
    1. Boss layout — converts legacy invertBossOrder = true to bossLayoutMode
    2. Absorb colors v2 — wipes legacy/intermediate keys; defaults render until user picks a colour
    3. Layer defaults — backfills missing *Layer defaults at z=7
    4. Elite icon defaults — backfills per-unit on target/focus/targettarget/boss
    5. Boss heal auras defaults — backfills highlightOwn=false, hideOthers=false
    6. Per-unit smoothFill = true — backfills missing key
    7. Gradient direction — converts legacy gradientDirection string to per-direction booleans
  • All migrations gated by per-flag markers; cannot run twice.