ClassicFCT M0.89
What's new
M0.89 Oct 20, 2026
Combat text
- Fixed merged events mislabelling a hit as a miss. A merged group is now shown as a miss only
when every event in it is a miss, so a real hit is never relabelled or dropped by the
merge, and the result no longer depends on which event arrived last.
- Fixed damage, heals and misses of different kinds being merged into one number: the merge
bucket now separates them by event type and by miss flag.
- Event handling is now contained. A failure in one event no longer aborts the rest of the
frame, and the frame release step always runs, so a single error can no longer leave
numbers frozen on screen and grow without bound.
- Fixed the rolling average dropping one entry per cleanup pass and never ageing out old
entries outside combat, which made the "Hide Below Average Threshold" filter drift.
- Fixed the "Hide Below Blizzard Combat Text" option doing nothing on every client: the
option used CVar names that do not exist, and the guard around them turned the failure
into silence. The names are now resolved at runtime and the option works.
- The combat log is now read through the current API where the client provides it, with a
fallback to the older one, so the addon keeps working as those older APIs are retired.
A missing combat log is now reported once instead of failing silently.
- Fixed a spell event with no name being shown as an auto-attack.
- Fixed the crit flag being read as "true" for a hit that was not a crit when the client
delivers it as a number. Every hit would then be styled as a crit and the small-crit
demotion would apply to all of them. The flag is now read as a boolean, so a client
that delivers 0/1 and one that delivers true/false both behave correctly.
- Fixed "Max Simultaneous Numbers" leaving more numbers on screen than the limit allows
when the limit was lowered while numbers were already showing.
- Fixed the preview numbers polluting the damage average while the options panel was open.
- Fixed the "Hide Blizzard Combat Text" state not re-syncing while no numbers were on screen.
- Numbers now use the client's own text scaling and measurement helpers instead of relying on
a handful of client globals being present.
Options and presets
- Fixed the preset Save, Delete and Rename buttons keeping a stale state after a different
preset was picked from the open dropdown. Deleting or renaming a built-in preset now says
so instead of changing it behind your back.
- Fixed the built-in preset badge and the confirm dialog buttons showing in English on
non-English clients.
- Fixed the options panel writing an empty value where a preset value should have been kept.
- Fixed the log dump helper returning the wrong slice of the log.
- The options panel no longer writes a global named "n", which could collide with another
addon's.
Layout and performance
- The overlap resolver now skips frames where no text size changed, which removes the bulk of
its cost when many numbers are on screen at once.
Options panel
- Fixed the off-target sliders being drawn on top of the text-position sliders, which made
those settings unreadable and impossible to check. The "Dim Off-Target Text" checkbox
stays where it was; the two sliders that control how much the off-target text is dimmed
are now in their own section at the bottom of the panel.
- The options panel now sizes itself to its content, so the bottom of the panel is
reachable instead of being clipped off.
- "Max Simultaneous Numbers" now defaults to 20 instead of unlimited. An unlimited number
of numbers filled the screen and made the options panel unreadable. The slider still
goes from 0 (unlimited) to 200, and a limit you set yourself is never changed.
Compatibility
- The four classic-family .toc files now declare their client's game type, so an
unsupported classic client can no longer pick up the wrong one. The retail .toc is
deliberately left unmarked so it keeps loading everywhere it does today.
- The restricted-combat check now reads the client version as well as the project id, so the
options panel and the combat text agree on every client.
Options and presets
- The "text strata" setting now actually applies: it is set on the addon's own frame instead
of being silently ignored, because the frame it was written for could never support it.
- Spells that a client reports with an id of 0 are now identified by name on TBC Anniversary
and WotLK Titanforge as well as Classic Era, so they can be disabled by spell and given
their own merge interval on every supported client.
Localization
- Every locale now carries the full set of strings. The animation name and the initial
animation-status label, which previously fell back to English on every non-English client,
are now translated.
Documentation and packaging
- Added the GPL v3 license, the LGPL v2.1 text for the bundled LibSharedMedia library, and
third-party notices. The license of the bundled CallbackHandler library is not confirmed
and is flagged as an open item in those notices.
- Added a packaging script that builds the release archive from an explicit file list, so
no workspace file can end up in a published package, and verified the result is
reproducible.
- The release check now covers the locale tables, the version metadata, the client flavor
matrix and the packaging references, and derives the expected locale key count and the
expected version from the files themselves instead of hard-coding them.
- Added a behavioural test suite that drives the addon against a stub client: the combat
text pipeline, the secret-value guard, the merge rules, the number limit and the saved
configuration are now covered on all five supported clients, where before they had no
automated coverage at all.
- Added a mutation check that breaks one protected behaviour at a time and asserts the test
suite catches each one, so a passing test run cannot be mistaken for a working addon.
All Relations
- All Relations
- Embedded Library
- Optional Dependency
- Required Dependency
- Tool
- Incompatible
- Include
This mod has no related projects

