FBHealBox v1.4.4
Changelog
1.4.4 (2026-09-06)
Performance pass. No feature was added or changed; every visible behaviour is meant to be identical. A simulated five-second raid fight (40 players, aura and health events, mana changes, combat log, 60 frames per second) went from about 63,900 API and widget calls to about 14,450, a reduction of 77 %.
Changed (internals)
- Button states centralised. The up to 260 heal buttons (10 plates x 10, 40 raid cells x 4) no longer carry their own
SPELL_UPDATE_USABLE/SPELL_UPDATE_COOLDOWNhandlers. One pass over the visible buttons queries usability and cooldown once per spell id and range once per button, and sets colours and cooldown sweeps only when the state changes. Several such events within one frame are merged into one pass. - Display caches. Health text, bar maxima, bar values, bar colour and mana strip visibility are only written when they change. Dispellable debuffs are searched on
UNIT_AURAonly;UNIT_HEALTHand the prediction tick reuse the last result. - Aura scans shared. A unit's buff textures are read once per frame and shared between the heal prediction and the buff watch. Buff names resolved through tooltip scans are remembered per texture, so a unit missing the watched buff no longer costs up to 32 tooltip scans per aura event. Raid units are only scanned when something depends on them (own cast pending, tracked HoT or shield, or a visible cell).
- Cheaper ticks. Spell timers use precomputed base spell names instead of string parsing per button per tick and skip units without tracked HoTs or shields. Buff icons reuse their work tables, iterate a presorted list instead of sorting per tick, and update on change or once a second instead of five times a second. The attacked-member check skips entirely while there is no hostile target and nothing is marked, and compares names before calling
UnitIsUnit. - Event bursts coalesced.
PARTY_MEMBERS_CHANGED,UNIT_PETandRAID_ROSTER_UPDATEset a flag that is processed once in the next frame instead of rebuilding plates and grid for every event of a burst. - Mana ticker. Enabled/mana/full checks moved from every frame to mana events and option changes; the spark is re-anchored only when it has moved at least half a pixel; sizes and visibility are cached.
- Combat log. Heal patterns run only for buff events, the absorb pattern only for hit events that contain the word absorbed. Smart Damage parses damage lines only while enabled and while there is a target being measured or an own cast waiting; its live target line is refreshed only while the options window is open.
- Raid test ghost animation frame is hidden outside the raid test instead of running an empty update every frame.
- Client API compatibility.
IsSpellInRangeandIsUsableSpelldo not exist in the 1.12 client (they came with 2.0). All range and usability checks now go through wrappers that use them when a client offers them and otherwise fall back to 1.12 means: spell range from the tooltip againstUnitXP("distanceBetween")where available, elseCheckInteractDistance(28 m, beyond that undecided rather than red); mana cost from the tooltip against your current mana. Because clients differ (2.0 style(id, "spell", unit)versus the Turtle client's(name, unit)), the addon probes both signatures once at login withpcalland uses the one the client understands; a function that keeps throwing is switched off in favour of the fallback./fbpreports the detected form. Without this the new central button pass crashed at login.
Fixed
- The old per-button event handler declared
this,eventandarg1as parameters, which shadowed the 1.12 globals; range colouring and cooldown sweeps on the buttons never worked in the game. They do now.