Skip to content

[Draft] Midnight 12.1 continuation (Krysio → NeRgY fork) — not for merge as-is - #501

Draft
NeeRgY wants to merge 62 commits into
enderneko:masterfrom
NeeRgY:master
Draft

[Draft] Midnight 12.1 continuation (Krysio → NeRgY fork) — not for merge as-is#501
NeeRgY wants to merge 62 commits into
enderneko:masterfrom
NeeRgY:master

Conversation

@NeeRgY

@NeeRgY NeeRgY commented Aug 17, 2026

Copy link
Copy Markdown

Hi enderneko,

This is a draft so you can see that Cell is still being worked on for Midnight / 12.1. It is not a request to merge this branch as-is.

What this is

A public fork continued from your Cell, then Skyking / jdtoppin, then Krysio (r277.7.5.3-krysio), now NeRgY (r277.9.7.1).

That version number is our fork numbering, not a claim that this is ahead of your r279-beta. The histories have diverged (GitHub reports this cannot be merged automatically).

What this is not

  • Not a drop-in replacement for current master
  • Not reviewed as one clean PR (50 commits, 111 files, including work that is not mine)
  • Not ready until conflicts with your latest Classic/MoP and Midnight changes are handled

If any of this is useful, I would rather split it into small, reviewable PRs against your current master than ask you to take the whole tree.

Focus of this fork

Retail Midnight (12.0 / 12.1) raid frames: secret values, aura display, Edit Mode / Blizzard frame taint, healer QoL, and keeping Classic / TBC usable.

Recent NeRgY-side fixes include:

  • Edit Mode no longer tainting the Cooldown Viewer when auras update
  • Hide Blizzard Party no longer throwing secret errors (Edit Mode and group updates)
  • Missing indicators / white frames on a clean 12.1 install (libraries failing to load)
  • Assorted Midnight indicator and taint fixes (arena frames, tooltips, cooldowns, aggro, combat icon, etc.)

Krysio and Skyking did the earlier Midnight foundation this fork still stands on.

Happy to close this and follow up with smaller PRs if you want that instead. Thanks for Cell.

jdtoppin and others added 30 commits March 23, 2026 11:01
…omAura

Replace SanitizeAura (sanitize-then-recover) with AnnotateAura (read-only
_hasSecrets tag). Secret values flow directly to C-level APIs which accept
them natively.

Core changes:
- Utils.lua: Add F.HasAnySecretValues(), remove F.IsSecretValue(), remove
  unjustified pcalls from range checks and FindAuraById
- UnitButton.lua: AnnotateAura replaces SanitizeAura, remove all _raw*
  shadow fields, merge caches, secret cooldown infrastructure. New Midnight
  display path via SetCooldownFromAura. Dispel detection via bracket curves
  with pass-through color rendering. Health calculator path. CLEU removal.
- Base.lua: Add SetCooldownFromAura to BorderIcon (DurationObject) and
  BarIcon (EvaluateElapsedPercent with linear curve)

Mechanical cleanup across 12 files:
- Migrate F.IsSecretValue callers to not F.IsValueNonSecret()
- Replace bare issecretvalue with F.IsValueNonSecret
- Replace rawequal(x, nil) with x == nil
- Remove local issecretvalue/hasanysecretvalues polyfills
- Replace hasanysecretvalues with F.HasAnySecretValues

Addresses all feedback from Krealle and ljosberinn on PRs 462/463.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Health text: BuildSecretSegment pre-builds C-level format strings for
secret values. UnitHealthPercent (C-level) for percentage display.
AbbreviateNumbers for numeric display. Remove unjustified pcall around
UnitHealthPercent.

Power text: F.HasAnySecretValues guard, UnitPowerPercent with
ScaleTo100 curve, AbbreviateNumbers for short format.

Shield/absorb display: rawequal → == nil cleanup.
hideIfEmptyOrFull: stays removed on Midnight (no C-level path for
health == maxHealth check).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Tiered fallback for secret auras:
- Tier 1: Non-secret (whitelisted) auras use standard spellId/name lookup
- Tier 2: Secret auras use IsAuraFilteredOutByInstanceID with HARMFUL|RAID
- Tier 3: Encounter fallback for unidentified secret debuffs during bosses

RaidDebuffs module: FillMissingInstances for EJ gaps, dual name+id indexing.
RaidDebuffs_Midnight.lua: Complete Midnight expansion dungeon/raid debuff data
(The Voidspire, March on Quel'Danas, 4 dungeons).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Complete rewrite for Midnight secret value compatibility:
- Remove pcall wrappers around UnitIsUnit, C_Spell.GetSpellTexture,
  C_Spell.IsSpellImportant (C-level APIs accept secrets natively)
- Secret-safe target resolution via SafeUnitIsUnit + server filter fallback
- Display mode system (Icons/Border/Both) with settings UI
- sourceUnit string as tracking key instead of UnitGUID (GUIDs can be secret)
- Spell list and showAllSpells hidden on Midnight clients

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
DeathReport: Fix shared handlers (PLAYER_ENTERING_WORLD, GROUP_ROSTER_UPDATE)
that short-circuited on Midnight, breaking instance tracking and priority.
Simplified death detection via UNIT_HEALTH + UnitIsDeadOrGhost on Midnight.

Comm: Remove unused QueueComm/FlushPendingComms dead code. Add
IsCommRestricted() guards for encounter/M+/PvP contexts. Simplify
Nicknames.lua redundant F.IsCommRestricted existence checks.

StatusIcon: F.IsValueNonSecret for GUID checks, CLEU conditional unregister.
Request_Show: CombatLogGetCurrentEventInfo nil guards.
BuffTracker: F.IsAuraNonSecret guard for sourceUnit comparison.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Appearance: Preview button Midnight StatusBar API compatibility,
Flash animation removal (Smooth only on Midnight), shield preview rework.

Settings: Remove unused durationVisibilitySimple widget. Add
TargetedSpells display mode dropdown. Update indicator setting lists.

Cleanup:
- Delete RaidDebuffs_Midnight_skeleton.lua (development artifact)
- Fix stale F.IsSecretValue() references in changelog
- Revise.lua: Flash → Smooth migration
- Cell.toc: version bump
- ClickCasting: updated Midnight spell list

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
SetCooldownFromDurationObject drives a CooldownFrame that supports
built-in countdown numbers. Enable them with SetHideCountdownNumbers(false)
and size the FontString to match Cell's duration font settings.

Limitations: anchor point, offset, and color are controlled by Blizzard's
C-level rendering and cannot be customized via Cell settings.

TODO: Fix preview pane to show countdown text.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Preview pane now shows Blizzard countdown numbers matching in-game
display. Uses same font sizing as the frame countdown text.

TODO: Live-update preview countdown font when settings change.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Re-add durationVisibility and durationFont settings to debuffs and raidDebuffs
- Shared_SetFont live-updates countdown FontString when font settings change
- Shared_ShowDuration toggles SetHideCountdownNumbers for Midnight
- ApplyCountdownFont guards for CooldownFrame vs StatusBar (BarIcon)
- SetCountdownAbbrevThreshold(60) abbreviates above 60s (shows "1m", "2m")
- Preview: hide Cell duration text, show Blizzard countdown, no swipe override
- Raid debuffs: colored border base + black swipe (matches regular debuffs)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Use font-noOffset widget for Midnight indicators (no anchor/offset/color
  since Blizzard's countdown text doesn't support them)
- Pre-Midnight retains full font2 widget with all positioning options
- New font-noOffset:durationFont parser in widget builder and settings handler
- Center countdown FontString on iconFrame for proper alignment
- SetCountdownAbbrevThreshold(60) abbreviates above 60s

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Green border for player's own externals/defensives, yellow for others
  Uses |PLAYER server filter suffix for secret auras, sourceUnit check
  for non-secret
- New built-in spells: Power Infusion (Priest), Blessing of Freedom
  (Paladin), Rewind + Verdant Embrace (Evoker), Strength of the Black
  Ox (Monk)
- builtInExternals/Defensives always store by ID for consistent lookup
- BuffTracker: InCombatLockdown guard before SendChatMessage
- Removed all fingerprinting code (widget, file, stale comments)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
BorderIcon_ShowDuration now toggles SetHideCountdownNumbers when the
user changes Duration Visibility (Always/Never). Without this, the
countdown text only responded after a reload.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Debuffs, raid debuffs, externals, defensives, all cooldowns, and
crowd controls use Always/Never dropdown on Midnight instead of
percentage/time thresholds (Blizzard's countdown text doesn't support
thresholds). Custom indicators retain full threshold options.

Restores CreateSetting_DurationVisibilitySimple widget with coercion
of existing threshold values to Always.

Known limitation: toggling Always/Never only takes effect on the next
aura update, not immediately on active cooldowns.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
I1: Move SetCountdownAbbrevThreshold to frame creation, cache
    ApplyCountdownFont via _countdownFontApplied flag
I2: Reset font cache on settings change in Shared_SetFont
I3: Remove dead Midnight toggle from Shared_ShowDuration
S1: Preview alternates green (first icon = player cast) / yellow
S2: Clearer comments on always-by-ID storage
S3: Threshold coercion comment clarified
Fix: BorderIcon_ShowDuration hides Cell's duration text on Midnight
     (only toggles Blizzard countdown, prevents dual text display)
Fix: Hide custom spell field and showAnimation on Midnight for
     externals/defensives (custom spells can't be tracked with secrets)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Tooltip: CellSpellTooltip registered TOOLTIP_DATA_UPDATE at creation
and never unregistered, causing RefreshData to crash with tainted
color data in combat even when the tooltip wasn't visible. Fix: only
register while tooltip is shown, plus InCombatLockdown guard.

UpdateTextWidth: utf8len crashes on secret NPC name strings. Guard
with F.IsValueNonSecret — pass secrets directly to SetText (C-level).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Updated README to reflect the new fork and its features.
Pushed the latest r277.7.3 that has been developed locally
Updated README to reflect the fork's focus and features.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants