File Details
v1.1.2
- R
- May 18, 2026
- 199.41 KB
- 0
- 12.0.5
- Retail
File Name
MilestoneKeys-v1.1.2.zip
Supported Versions
- 12.0.5
MilestoneKeys
v1.1.2 (2026-05-18)
Full Changelog Previous Releases
- ci: add contents:write permission for GitHub release creation
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com - fix: remove /trunk from LibDataBroker external URL
SVN repo for libdatabroker-1-1 has no /trunk path; the suffix caused
a 500 error during the packager workflow externals checkout.
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com - ci: add BigWigs packager workflow for tagged releases
Also adds X-Curse-Project-ID to TOC so the packager knows the CurseForge target.
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com - chore: bump to 1.1.2, graduate MDT predictive, prep for first tagged release
Version bumped to 1.1.2 in MilestoneKeys.toc.
CHANGELOG: v1.1.2 entry added covering all post-1.1.1 work (opacity fixes,
settings reorganization, persistent panel, location-aware dungeon selection,
predictive alerts graduation). Stale "MDT predictive disabled" Notes section
removed from v1.1.1.
Predict.lua: no developer kill switches were found — the feature already runs
unconditionally when the user-facing toggle is on. No code changes needed.
README: MDT Predictive Alerts added as a named feature section.
docs/API-NOTES.md: version reference updated to v1.1.2; MDT predictive
graduation note added to Midnight environment section.
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com - chore: flesh out .pkgmeta with externals and full ignore list for CurseForge packaging
Adds externals section so the BigWigs packager pulls Ace3, LibDBIcon, and
LibDataBroker from upstream CurseForge SVN rather than the committed copies.
Libs are committed to the repo for local WoW loading; on CI the packager
replaces them with fresh upstream checkouts.
Externals path prefix is Libs/ (not MilestoneKeys/Libs/) because .pkgmeta
sits at the repo root (same level as the .toc), so packager resolves paths
relative to that directory.
Full ignore list added: .git, .github, .claude, docs, scripts, Build.lua,
CHANGELOG.md, README.md, ROADMAP.md, .pkgmeta — zip contains only runtime
files.
.gitignore: added .release/ so packager dry-run output is never committed.
Dry-run confirmed: CHANGELOG.md, README.md, docs/API-NOTES.md all ignored;
SVN externals error is expected on Windows (no svn binary) and will succeed
on Linux CI.
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com - chore: add .pkgmeta with ignore list for docs/ and .claude/
Prevents API-NOTES.md and Claude session memory from being packaged
into the CurseForge release zip. docs/ link in README points to GitHub
where the file is always accessible to contributors.
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com - docs: consolidate API notes and Midnight environment lessons into docs/API-NOTES.md
Promotes hard-won technical lessons from the v1.0.x–v1.1.1 debugging cycles
into a permanent reference file so future maintainers (and future-us) don't
have to re-derive them from CHANGELOG history.
Sections cover: TWW forces criteria API field layout and regression history,
AceGUI backdrop WHITE8x8 fix, sound playback on Midnight, AceDB profile
structure, MDT data structure, and the Midnight addon environment.
CHANGELOG.md: inline API table in dev-fix-3 replaced with a pointer to the
new file; stale texture-iteration bullet in v1.1.1 replaced with the correct
root-cause description (bgFile swap).
README.md: added "For Contributors" section linking to docs/API-NOTES.md.
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com - fix: replace AceGUI dialog backdrop texture to fix opacity at 1.0
Root cause: "Interface\DialogFrame\UI-DialogBox-Background" has
per-pixel alpha baked into the texture file. SetBackdropColor alone
cannot override it, so the panel stayed partially transparent even
at slider=1.0.
Fix: swap bgFile to Interface\Buttons\WHITE8x8 (a fully solid tile)
on first open via a _mkBgPatched guard, then drive all opacity through
SetBackdropColor(0,0,0,alpha). Same pattern as HUD and Alert frames.
Also removes the diagnostic print block added during investigation.
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com - fix: extend opacity pass to AceGUI child frames
The body background texture lives on a Frame child of the AceGUI root,
not on the root itself. Iterate all immediate Frame-type children and
apply the same BACKGROUND/BORDER texture alpha pass to each.
Updated diagnostic now prints each child frame's regions so we can
confirm which child held the background texture.
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com - fix: aggressively apply opacity to all backdrop layers in options panel
ApplyPanelOpacity now iterates every BACKGROUND/BORDER draw-layer
texture on the AceGUI root frame and sets alpha directly, so AceGUI's
own sub-textures that SetBackdropColor doesn't reach are also covered.
ARTWORK/OVERLAY layers are skipped to preserve widget legibility.
Includes a temporary diagnostic print block in BuildPanel that lists
every region and child frame — remove after in-game verification.
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com - feat: settings reorganization, fix opacity ceiling, consolidate sound selection
- HUD/Alert/Panel backdrops now use BackdropTemplate + SetBackdropColor(0,0,0,alpha)
so slider 1.0 = fully opaque pure black; no game world bleeds through at max value - MK_HUD_SetAlpha and alert frame alpha slider now target backdrop only,
not the whole frame, so text/rows stay fully visible at any opacity - Settings section reorganized into four InlineGroup subsections:
Alerts / HUD / Appearance / Behavior - Alert sound consolidated from 3 radio checkboxes to dropdown + single Play button;
db.profile.alertSound key format unchanged (backward compatible)
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
- HUD/Alert/Panel backdrops now use BackdropTemplate + SetBackdropColor(0,0,0,alpha)
- feat: options panel opacity slider for accessibility and stream overlay use
- Add panelOpacity = 1.0 to DB_DEFAULTS (options table)
- ApplyPanelOpacity() targets SetBackdropColor + Bg texture only;
never calls frame:SetAlpha() so child widgets stay fully opaque - Slider range 0.30-1.00 (step 0.05) in Settings near HUD alpha slider
- Applied immediately on BuildPanel and live on every drag tick
- CHANGELOG updated under v1.1.1
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
- release: update TOC interface to 120005, refresh README, ignore .claude/
- Interface: 120000 -> 120005 (WoW Midnight 12.0.5)
- README rewritten: accurate forces detection description, all current
features documented (HUD, per-dungeon profiles, MDT import, display modes) - .gitignore: add .claude/ to suppress Claude Code local settings
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
- dev: re-enable MDT predictive pull alerts for continued testing
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com - release: disable predictive pull alerts for v1.1.1 CurseForge release
- Remove predictive alerts checkbox from UI (not yet tested enough for release)
- Remove MK_Predict_OnCriteriaUpdate call from EvaluateForces
- MDT Route Import (calculate/add milestones from pulls) remains fully enabled
- Add HUD.lua to version control (was untracked, required by .toc)
- Update CHANGELOG with release note
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
- fix: exclude <New Route> from MDT preset dropdown
<New Route> is MDT's template sentinel that creates a new route on selection;
it has no pull data and should never appear as an importable route.
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com - fix: hide HUD on PLAYER_ENTERING_WORLD when no challenge mode is active
CHALLENGE_MODE_RESET does not fire reliably when a player is removed from the
group mid-key. PLAYER_ENTERING_WORLD always fires on zone transition, so check
IsChallengeModeActive() there and clean up State + hide HUD if the run ended.
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com - fix: replace \x hex emoji escapes with ASCII marker (Lua 5.1 has no \x support)
\xF0\x9F\x93\x8D was rendered as literal text "xF0x9Fx93x8D" in-game.
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com - fix: auto-detect current dungeon by name match instead of broken map ID lookup
GetMapUIInfo returns only 5 values (name, id, timeLimit, texture, bgTexture);
indexing the 8th slot always yielded nil, so the instanceMapID comparison never
matched and the dropdown always fell back to Global.
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com - feat: persistent options panel size/position, wider default, reset button
- Options panel default size increased to 820x620 (was 540x520) so All/None
buttons on milestone rows no longer wrap - Window position and size persist across sessions via AceGUI SetStatusTable
backed by db.profile.uiState - Off-screen safety: saved position is cleared if the frame would land outside
the current screen bounds (ultrawide->laptop scenario) - Minimum resize guard: panel cannot be shrunk below 700x450
- "Reset window" button in Settings wipes saved state and reopens at defaults
- Also commit Alerts.lua sound fix (FileDataIDs + PlaySoundFile) which was
staged but not committed in the previous session
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
- Options panel default size increased to 820x620 (was 540x520) so All/None
- chore: remove diagnostic logging after forces detection fix verified in-game
Algeth'ar Academy +14 confirmed: HUD pct matches Blizzard UI (80.87%),
milestones at 20/40/60/80 fired at correct thresholds.
Removed: [MK Detect] prints from DetectForcesIndex, lastEvalLog upvalue,
entire [MK Step] / [MK Eval] throttle block from EvaluateForces.
Bumped version to 1.1.0 in MilestoneKeys.toc.
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com - fix: parse rawKills from quantityString and compute decimal pct correctly
quantityString is "<rawKills>%" — the raw enemy kill count with a misleading
"%" suffix, NOT a percentage string. Decimal pct = (rawKills / totalQuantity) * 100.
Previous dev-fix-2 matched [%d%.]+, parsed "237%" as 237.0, and used it
directly as pct, firing all milestones simultaneously.
qty passed to alert/display formatting is now rawKills so nominal mode
renders correctly (e.g. 237/585 forces). pct clamped to [0, 100].
Diagnostics kept for one verification run.
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com - fix: read isWeightedProgress quantity as percent directly, parse quantityString for decimal precision
When isWeightedProgress=true, info.quantity IS the forces % (integer 0-100);
info.totalQuantity is enemy-count metadata, not a denominator. Using
(quantity / totalQuantity) * 100 produced wildly wrong results (4.57% vs
Blizzard's 21.52%). Restores v1.0.9 intent with added quantityString
parsing for decimal precision.
[MK Step] diagnostic now prints quantityString and pct at 4 decimal places
for next in-game verification. All diagnostic logging kept until confirmed.
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com - fix: re-fetch scenario criteria info each EvaluateForces call instead of using cached data
- Guard now includes
not info.totalQuantitynil check before the == 0 test - [MK Step] loop marks the FORCES_IDX slot with a suffix for easy identification
- Final forces-slot print issues a fresh GetCriteriaInfo(idx) call and shows computed pct
alongside qty/totalQty so the next screenshot can confirm values match Blizzard UI
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
- Guard now includes
- debug: dump scenario step info to diagnose multi-step forces detection issue
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com - feat: location-aware dungeon auto-selection in options panel
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com - debug: trace milestone evaluation to find why MDT-imported thresholds don't trigger
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com - fix: detect forces criteria via isWeightedProgress flag for TWW/Midnight
In-game diagnostic confirmed the forces slot is the only criteria where
isWeightedProgress=true. Boss kills use criteriaType=165 with
isWeightedProgress=false. The old flags & 0x80 check no longer applies
(all flags are 0 in the current API) and was causing the wrong slot to
be selected, firing all milestones simultaneously.
EvaluateForces now always divides quantity/totalQuantity for pct;
the old branch that used quantity directly as a percentage is removed.
All diagnostic logging stripped — back to clean production state.
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com - debug: dump all scenario criteria slots to locate forces criteria in TWW/Midnight
Replaces the single-slot pairs() dump with a throttled loop over every
criteria slot in the active step. Fires at most once per 5 s to avoid
chat spam. Selected slot from DetectForcesIndex is printed last so a
wrong selection is immediately obvious.
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com - debug: log scenario criteria info fields for forces detection
Dumps all fields of the GetCriteriaInfo table and computed pct to
chat on every SCENARIO_CRITERIA_UPDATE so we can identify the correct
field to use for forces percentage in TWW. Remove before merging.
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com - v1.0.10: Replace C_Scenario API calls with safe wrappers for TWW compatibility
GetCriteriaInfo() and GetStepInfo() now prefer C_ScenarioInfo (The War Within)
and fall back to C_Scenario, returning nil/defaults if neither exists. Fixes
"attempt to call a nil value" Lua error that broke forces tracking entirely.
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com - v1.0.5: Fix sound closure scoping, widen None button, consolidate forces display dropdown
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com - Fix button truncation, column headers, test alert frame, and nominal forces test path
- UI.lua: widen Play (50→60), All (40→50), None (48→56) buttons so labels render
- UI.lua: explicit sound ID fallback in Play button OnClick
- UI.lua: add gold column headers (On / Forces% / Label / Alerts) above milestone list
- UI.lua: /mk test and Test Alert button use sound_chat_frame so the alert frame fires
- Alerts.lua: nominal forces mode now works in test; derives q=floor(pct), t=100 when quantity/total are nil
- CHANGELOG.md: document as 1.0.4
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
- Add forces display options, tooltips, and MDT list auto-refresh
- Forces display: new options for decimal places (0/1/2) and nominal
mode (e.g. 382/450 instead of 84.9%). Both chat and frame alerts
respect these settings. Stored in profile.options.forcesDecimals
and profile.options.showNominalForces. - Tooltips: all Settings options now show a GameTooltip on hover via
the new AddTooltip() helper (hooks outer frame + Dropdown/Slider
interactive children so the tip fires reliably). - MDT auto-refresh: Calculate & Add now calls RebuildList() on success
so the new milestone appears immediately without reopening the panel. - Core.lua: pass info.quantity and info.totalQuantity to MK_TriggerAlert
so nominal mode has the raw values available.
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
- Forces display: new options for decimal places (0/1/2) and nominal
- Milestone rows: replace alert dropdown with S/C/F checkboxes + All/None buttons
- Each milestone row now has independent Sound, Chat, Frame checkboxes
instead of a single "All Alerts / Sound Only / Chat Only / Frame Only" dropdown.
All/None buttons let users quickly toggle everything at once. - alertType is now encoded as a substring string ("sound", "sound_chat",
"sound_chat_frame", "chat_frame", etc.) and parsed via string.find so
all combinations are supported and backward-compatible with saved data. - Alerts.lua updated to use hasAlert() substring check instead of equality.
- Fix sound preview play buttons: replaced unrenderable UTF-8 glyph with "Play".
- Core.lua: add alertFramePos and alertFrameAlpha to DB_DEFAULTS schema.
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
- Each milestone row now has independent Sound, Chat, Frame checkboxes
- Fix CalcPullForces: use MDT.dungeonTotalCount and read pull# at click time
dungeonTotalCount[dungeonIdx].normal is MDT's pre-computed dungeon total;
computing it from enemy.clones was fragile and incorrect.
Also read pullBox:GetText() on click so the user doesn't need to press
Enter before hitting Calculate & Add.
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com - Replace sound dropdown with radio-style list + per-sound preview buttons
Each sound now shows as a checkbox row (radio button behavior) with a
separate play button, matching the BigWigs sound selector pattern.
Eliminates the dropdown+preview-button layout struggle entirely.
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com - Fix sound preview button: use AceGUI Button instead of native frame
The native CreateFrame button was parented to soundGroup.frame but
SimpleGroup wraps all AceGUI children in an inner content frame that
sits on top of it, blocking mouse events. Replacing with an AceGUI
Button routes it through soundGroup.content where clicks reach it.
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com - Fix CalcPullForces crash: compute dungeon total from dungeonEnemies
MDT:GetDungeonTotalCount() does not exist. Replace with a local
GetDungeonTotal() that sums enemy.count * #enemy.clones across all
entries in MDT.dungeonEnemies[dungeonIdx], matching MDT's own
approach for computing the dungeon's total force count.
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com - Fix MDT GetDB() access, string enemy keys, and sound button collision
Predict.lua:- Use MDT:GetDB() (not MDT.db.global) to reach presets — MDT exposes
its global AceDB scope via a getter, not via MDT.db - Fix CalcPullForces: pull enemy keys are strings ("1","5"…), not numbers;
use tonumber() check to match MDT's own CountForces pattern
UI.lua: - Wrap sound dropdown + native preview button in a 220px SimpleGroup so
AceGUI flow layout accounts for the button and stops overlapping chatChk
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
- Use MDT:GetDB() (not MDT.db.global) to reach presets — MDT exposes
- Merge GitHub initial commit; resolve .gitignore and README conflicts
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com - Fix MDT route integration and add CHANGELOG
- Predict.lua: read presets from MDT.db.global.presets (not profile.routes),
traverse pulls with correct flat [enemyIdx]= structure, resolve
active preset via MDT.db.global.currentPreset - UI.lua: show clear message when global profile selected in MDT section
- Add CHANGELOG.md
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com
- Predict.lua: read presets from MDT.db.global.presets (not profile.routes),
- Initial commit
- Initial release: MilestoneKeys v1.0
WoW Midnight (12.x) Mythic+ addon. Set force % milestones and get
alerts (sound, chat, on-screen frame) as you progress through a key.
Includes minimap button, per-dungeon profiles, party sync, and MDT
predictive pull alerts.
Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com

