TotemBar v0.4.0

This commit is contained in:
2026-08-30 15:37:01 +02:00
parent 166d870dec
commit 4d9befbdf6
7 changed files with 1172 additions and 58 deletions
+76
View File
@@ -2,6 +2,82 @@
All notable changes to TotemBar are documented here.
## v0.4.0 — 2026-08-30
### Added
- **Destroyed totems can now be detected while SuperWoW is present (verified against captured
event log 2026-08-20, live eviction pending retest).** A totem killed before its timer ran
out used to keep counting down as if it were still standing — both TotemBar's own tracking
and pfUI's libtotem are blind, duration-only timers, and neither ever checked whether the
totem itself was still alive (pfUI's `GetTotemInfo` was previously assumed to cover this
case; checked against its source — it does not). A live event tap against the real client
(2026-08-20) captured totem spawn/pulse/death lines and found the original mechanism could
never have fired at all: the spawn/pulse latch paths compared totem names for *exact*
equality, but the live client hands back a *ranked* name ("Searing Totem VI"), never the bare
book name; and the pulse-cast latch mapped through the pulse *spell's* name ("Searing Bolt"),
which is not the totem's own name either. Both are now fixed, and a third, GUID-free signal
was added as the primary path:
1. **Primary — `CHAT_MSG_COMBAT_FRIENDLY_DEATH`** (native 1.12, needs no SuperWoW/nampower):
TurtleWoW emits a totem's own death as `"<Name> (<Owner>) is destroyed."` verbatim; parsed
and evicted once the owner resolves to the player and the name rank-tolerantly matches a
tracked totem. The generic vanilla `"<Name> dies."` form is accepted as a second, stricter
shape — since it carries no owner, it only evicts a candidate that already has a latched
GUID, confirmed via a live `UnitExists`/`UnitHealth`/`UnitIsDeadOrGhost` read.
2. **`UNIT_CASTEVENT`** (SuperWoW), for totems that periodically cast their own pulse — now
keyed off `UnitName(casterGUID)` (the totem unit's own, rank-tolerant name) instead of the
pulse spell's name; covers only pulsing totems (Searing/Magma/Fire Nova/Mana Spring/
Healing Stream/Mana Tide/the Cleansing totems), gated on the caster's resolved owner
matching the player.
3. **`UNIT_MODEL_CHANGED`** (native 1.12), for totems that never cast anything visible — now
rank-tolerant instead of an exact name compare.
4. **`UNIT_DIED`** (nampower), extended with a GUID-free fallback: when no GUID was ever
latched, a rank-tolerant name + owner match at the death instant (both resolve reliably
there per the captured log) still evicts.
A totem confirmed destroyed is evicted immediately and tombstoned for the remainder of its
own natural duration, so pfUI's libtotem — itself just another blind timer — cannot
resurrect the countdown/ring/pulse a moment later; a real re-cast on that element clears the
tombstone right away. This clears the countdown, duration ring, pulse animation and
out-of-range tint together, since all four already derive from the same tracking record. On
a client without SuperWoW, only the primary `CHAT_MSG_COMBAT_FRIENDLY_DEATH` signal is
active; without either SuperWoW or TurtleWoW's own death-line wording, behaviour is
byte-for-byte unchanged from before this feature. The decision logic (name matching, line
parsing, eviction gating) is fully offline-tested against the captured fixture lines (95
assertions in `tools/luatests/test_destroy.lua`); a live totem-kill retest with the addon
in the loop is still pending — `/tb tdump` prints each totem's latched `guid`, the raw
`UnitExists`/`UnitHealth`/`UnitIsDeadOrGhost` reads, and (for an evicted slot) its tombstone
status, for that verification.
### Fixed
- **A totem's countdown no longer starts when the cast was refused for lack of mana.** The
pre-cast mana gate stood down completely while Clearcasting (Elemental Focus) was up, on the
assumption that it zeroes the next cast's price. Elemental Focus covers the shaman's damage
spells, not totem summons -- so a totem costs full mana while Clearcasting is up, and since
totems are the only thing this addon casts, that exemption disabled the mana gate outright.
The client then refused the cast while the timer had already been recorded, leaving a
countdown running for a totem that was never placed. The exemption is gone from the cast
gate, the out-of-mana dim and the flyout tint alike; the unverified buff-icon constant it
relied on went with it. The gate still accepts (and ignores) the old sixth argument, so no
stale caller can quietly reinstate it.
- **A Totemic Recall the server refuses no longer wipes your totem timers.**
Recall already checked whether the cast could go out *before* touching the
tracking, but a press that passes that check can still be refused after the
fact — moving at the wrong moment, a stun or silence landing first, or plain
latency. The tracking was cleared unconditionally the instant the cast was
issued, so a refused Recall left the addon believing nothing was out while a
full set kept standing — the same phantom-state bug class the totem casts'
own two-layer guard already closed, mirrored. The recall paths now remember
what they cleared, and the same failure signals that take back a refused
totem's countdown (the exact per-spell one with nampower, the error-message
fallback without it) put the timers back. The restore follows the same
narrow rules as the totem-cast revoke: only when the Recall itself was the
last cast attempted, only within a short window afterward, and never over a
slot a new cast has already refilled — when attribution is uncertain it
stays silent, since here a *wrongly restored* timer would be the phantom.
Covers the Recall button, its keybind, and the DropSet keybind's recall
stroke alike.
## v0.3.0 — 2026-08-15
### Added