nugsCastBars

Cast bars for you, your target, your focus, your pet and up to five bosses — one addon, one look, and the same controls on every bar.
Back to Files

nugsCastBars-0.4.6.zip

File namenugsCastBars-0.4.6.zip
Uploader
nugsxDnugsxD
Uploaded
Jul 29, 2026
Downloads
9
Size
49.4 KB
Flavors
Retail
File ID
8531787
Type
R
Release
Supported game versions
  • 12.0.7

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).

This mod has no additional files