nugsCastBars-0.4.6.zip
What's new
# nugsCastBars — changelog
## 0.4.6 — 2026-07-28
- A single line in the options window - "Part of the nugs suite" - shown only when
nugsSuite is not installed. A note, not a warning, and not a dependency: this
addon works exactly the same on its own, and the suite is only worth having once
you run more than one of them.
## 0.4.5 — 2026-07-28
- The minimap button no longer shows a sliver of the world between the icon and the
tracking border. The border's hole is slightly wider than the icon was, leaving a
thin see-through ring; there is now a dark disc behind the icon, and the icon
itself went from 19 to 21 pixels.
## 0.4.4 — 2026-07-28
- Registers with **nugsSuite**, the new hub addon: it can now list this addon, open
this window, fold this minimap button into its own, and carry these settings to
another character as part of one profile string.
- The registration is a single entry written into a plain global table. nugsSuite
does not have to be installed for it to be harmless, and does not have to load
first for it to be found - so nothing here changes if you never install it.
- The measured cast-length cache (`learned`) and the minimap button's angle are
marked as never exported. The first is machine-written and by far the largest
thing in the saved variables; the second is nobody else's business.
## 0.4.3 — 2026-07-28
- CurseForge project id (**1629882**) recorded in the .toc, so addon managers can
tie an installed copy back to the project and offer updates.
## 0.4.2 — 2026-07-28
- The N now sits **on** the bar rather than above it, where a spell name sits on a
real cast bar: left of the fill edge, with the spark clear to its right and the
empty track beyond. A dark halo, produced by resampling the glyph around a ring
of offsets, keeps it legible over the lit fill.
- A letter big enough to span the bar was tried first and rejected: it occluded the
very thing the mark is of, leaving the fill visible only as stubs either side of
the glyph.
## 0.4.1 — 2026-07-28
- The icon now carries the **N**, in the same bold geometric letterform as
nugsCooldownPulse's `ringN`, so the two sit together in the addon list as one
suite. Composed as a nameplate — the letter above, its cast bar beneath — rather
than copying the ring, so the pair are siblings and not twins. The glyph is drawn
from the same stroke-to-cap ratio (0.24) as `ringN`.
- The bar is a little taller and its rim a little stronger: at addon-list and
minimap sizes the unfilled half of a track that dark otherwise vanishes into the
backdrop.
## 0.4.0 — 2026-07-28
**0.3.0 was wrong.** It said timers and interruptibility on another unit's cast
were unknowable in 12.0. They are not — ElvUI and Plater both show them, and
reading oUF's castbar element on disk turned up a purpose-built API for exactly
this that I had not known existed.
The principle I had backwards: a secret value is not a wall, it is a *pipe*. The
client gives you something you may not read but may hand to a widget, and the
widget does the work.
- **Real countdowns on every unit.** `UnitCastingDuration` / `UnitChannelDuration`
/ `UnitEmpoweredChannelDuration` return a Duration object;
`StatusBar:SetTimerDuration(obj, interpolation, direction)` makes the bar animate
itself in the right direction at the right speed, and
`Duration:GetRemainingDuration()` feeds `FontString:SetFormattedText()` a real
number. Nothing passes through Lua, so nothing has to be readable. This is now
the primary drawing mode — `timer` — for **all** bars.
- **Interruptibility is back.** `Texture:SetAlphaFromBoolean(secretBool, 1, 0)` is
the display sink for a secret boolean. The shield icon uses it directly, and the
"cannot be interrupted" colour is now an overlay pinned to the fill texture whose
alpha that same boolean sets — so the bar changes colour without any code ever
branching on the value.
- **`UnitSpellTargetName` / `UnitSpellTargetClass`** replace the hand-rolled
`unit.."target"` snapshot: the spell's actual target, straight from the client.
- **`barID`**, the tenth return of `UnitCastingInfo` in 12.0 (added because castID
went secret), is a plain cast identity and is now what two casts are compared by.
- **Empower stage pips** are drawn from `UnitEmpoweredStagePercentages`. Which
stage is *currently* held is genuinely unknowable now — oUF notes Blizzard is
aware — so the pips mark boundaries and nothing tracks the current one.
- Channels count down and casts count up via `StatusBarTimerDirection`, so the
0.3.0 caveat about channels filling instead of draining is gone.
- The 0.3.0 paths all survive as fallbacks, in order: `timer` → `timed` →
`secret` → `guessed` → `unknown`. `/ncb diag` names the mode in use and reports
whether the client offers the timer API and secret-boolean display at all.
- "Elapsed" and "elapsed / total" formats need a subtraction the values may refuse;
it is attempted and falls back to time-remaining rather than to nothing.
## 0.3.0 — 2026-07-28
The target bar was not missing events. It was **erroring**, 40 times, on the first
thing it touched.
Confirmed from BugSack on retail 12.0.7: for another unit's cast,
`UnitCastingInfo` returns **every** field secret — name, icon, start, end, castID,
`notInterruptible` and spellID. Two rules came out of it, and the whole file now
obeys them:
- A secret **string or number** may be truth-tested and handed to a display sink
(`SetText`, `SetTexture`). It may not be measured, concatenated, compared or
computed with. (`if name then` was fine; that is why the error landed further
down the table constructor.)
- A secret **boolean** may not even be truth-tested — branching on it is exactly
the leak the system exists to prevent. That was the crash: `notInterruptible and
true or false`.
Fixes:
- Every boolean out of a unit API now goes through `Plain()`, giving a
true/false/**nil** tri-state where nil honestly means "not allowed to know".
Interruptibility on another player's cast now reads unknown rather than crashing
— the bar takes its normal colour and the shield stays down.
- **New "secret" drawing mode, and it is accurate.** The client's own timestamps
are handed straight to `StatusBar:SetMinMaxValues`, and the bar is fed
`GetTime()` each frame. Nothing in Lua ever reads them, so being secret does not
matter and the widget does the division. This draws a *correct* bar for another
player's cast — no timer text, since we never learn the fraction, and channels
fill rather than drain. If the widget refuses the values we find out once and
drop back to the remembered-length or sweep modes.
- **The spark is now pinned to the moving edge of the fill texture** instead of
being positioned by arithmetic, so it tracks a bar whose scale we are not
allowed to read.
- Spell and target names are never measured or concatenated when secret: trimming
passes them through whole, and the cast target falls back to its own line with
`SetTextColor` instead of embedded colour codes.
- `UnitExists` calls removed from the cast path — it returns a boolean, and
`UnitName`/`UnitCastingInfo` answer the same question by returning nil.
- `/ncb diag` reports each bar's drawing mode (timed / secret / guessed / unknown),
whether times are readable, and interruptibility as can / cannot / unknown —
and prints no secret value, since `string.format` will not take one either.
## 0.2.0 — 2026-07-28
Chasing a report that the target bar did not appear for another player's cast.
No cause was proven, so this build makes the bar not depend on the event stream
being perfect, and adds the tools to prove where the fault is next time.
- **Polling safety net.** Five times a second, every enabled bar checks what its
unit is actually casting and starts, replaces or ends its bar to match. Events
remain the fast path; this catches anything they miss. Demos, previews and bars
mid-fade are left alone.
- **Unit-event filters are re-armed** whenever a target, focus or pet slot
changes, so a filter can never go stale behind a swapped unit token.
- **`/ncb diag`** reports, per bar: enabled, whether the unit is there, whether
the frame is shown, its alpha, size and position, whether its events are
registered, and what the client says that unit is casting this instant.
- **`/ncb debug`** logs every spellcast event as it arrives, so a missing bar can
be told apart from a missing event.
- The poll only calls a vanished cast "interrupted" when it knew the length and
the cast stopped short of it; without that evidence it reports a finish.
## 0.1.0 — 2026-07-28
First build.
- Bars for **player, target, focus, pet and boss1–boss5**, each with its own
config: texture, width, height, scale, border, spark, icon (side / crop / gap),
font, outline, size, spell name with alignment and trimming, timer (remaining /
elapsed / elapsed-total, 0–2 decimals), hold and fade times, and eight colours.
- **Cast target display** — who the cast is aimed at, snapshotted at cast start,
shown inline, below the bar or to the right; class-coloured, and red when the
cast is on you.
- **Uninterruptible casts** get their own bar colour and a shield icon.
- **Latency tail** on the player bar.
- **Empowered casts** draw a divider at each stage boundary.
- Optional per-unit **suppression of Blizzard's own cast bars**.
- Options window in the RaidReady / nugsCooldownPulse skin: tab per bar, two
columns of settings that re-flow around whatever does not apply to the bar you
are on, a media picker that previews fonts in their own font and bar textures as
actual bars, and the game's colour picker behind every swatch.
- **Unlock mode** shows a looping demo cast on every enabled bar so you can place
them against something real. `/ncb test` does the same without unlocking.
- "Use this bar's look everywhere" copies style without touching sizes or
positions.
- Minimap button (left click options, right click lock/unlock), `/ncb` with
subcommands, and a stub in the Blizzard settings list.
- Cast timing is laundered through `Plain()`: where the client will not hand over
usable start/end times, the bar times the cast itself off `GetTime()` and falls
back to the length it last measured for that spell, marking the timer with `?`.
With no measurement to fall back on it sweeps and shows no number rather than
inventing progress.
- Icon generated by `..\nugsCastBars-art\icon.js` (dependency-free node renderer
and BLP2 writer, kept outside the addon folder so it never lands in a release
zip).
All Relations
- All Relations
- Embedded Library
- Optional Dependency
- Required Dependency
- Tool
- Incompatible
- Include
This mod has no related projects