Changelog
1.4.5 (2026-09-09)
Three additions around the frames and the prediction: Blizzard's party frames can go away, the resource bar is no longer reserved for mana, and gear healing is counted where an API can supply it. Plus a performance pass with no change in behaviour.
New & Changed
- Hide Blizzard party frames. New switch on the General tab that hides
PartyMemberFrame1to4while you are grouped, leaving only the Heal Box plates. Off by default. Blizzard shows those frames again on every roster change, so the addon hooks theirOnShowonce instead of hiding them a single time; a frame that reappears is hidden again in the same moment. - Mutually exclusive with the attach mode. Default party frames docks the plates onto exactly those frames, so the two options can never both be on. Whichever one is ticked disables and greys out the other (
FBHealBox_UpdatePartyExclusion), andFBHealBox_HideBlizzPartyActive()re-checks the same rule in code for saved settings that were edited by hand. Switching the option off brings the frames back immediately, and so does the class gate: an addon that stays asleep for warriors, rogues and hunters returns the frames as well. - Rage, energy and focus in the resource bar. The thin strip under the health bar used to be reserved for mana and stayed empty for everyone else. New switch Show rage, energy, focus on the General tab gives every unit its own resource in its usual colour, from the new table
FBPOWER_COLORS: mana blue, rage red, focus orange, energy yellow.FBUnitMana()now returns the power type as a fourth value, and both the plates and the raid cells colour their bar from it. Off by default, and it still needs the mana bar to be on. - Equipment healing bonus in the prediction. Vanilla spell tooltips show the naked base value; the bonus from your gear is missing. Learned values from the combat log carry it automatically, so the gap only affected ranks you had never cast.
FBHealBox_ProbeHealBonus()now looks forGetSpellBonusHealing,GetSpellBonusHealandGetHealingBonus, first as globals and then inside aClassicAPItable, andFBPredict_ExpectedDirect()adds the share that belongs to the spell. - Weighted the vanilla way. The bonus counts as cast time divided by 3.5, capped at 3.5 seconds, with instants counting as 1.5 and an unreadable cast time as 2.5. Cast time is read once per spellbook slot from the tooltip (
FBHealBox_SpellCastSeconds, right-hand side of line 2), so a 3 second Greater Heal takes 600 of a +700 bonus and a 1.5 second Flash Heal takes 300. Without a suitable API the bonus stays 0 and nothing about the old behaviour changes. - New command
/fbp healbonus. Turns the equipment bonus off and on, saved per character inHealBox.HealBonus(on by default)./fbpreports the value found and whether it is being applied; the command says so when no API supplies a bonus at all.
Performance (no change in behaviour)
- Own buff timers read once per frame.
FBPredict_PlayerBuffTimeLeftused to walk the whole player buff list once per watched buff, callingstrupperon every texture along the way: with six watches and thirty buffs that was around 200 API calls and 200 throwaway strings a second. The list is now read once per frame into a texture-to-seconds map (FBPredict_ScanPlayerBuffTimes), the wayFBHealBox_UnitBuffsalready worked, and every watch is served from it. Texture paths are upper-cased once and remembered (FBHealBox_UpperTex), which also removes the same allocation from the unit buff scan. - Range and line of sight in raid mode are spread over several ticks.
FBRaid_Tickused to check up to 40 cells in one frame every half second. It now walks a quarter of the groups per tick at a quarter of the interval (FBRAID_TICK_SLICES), so a full sweep still takes the same half second while the peak load per frame drops to a quarter. pcallper sweep instead of per unit. Range, distance and line of sight went through a protected call for every single unit, up to 160 a second in a full raid. The first successful call now marks the form as safe and the individual calls go straight through, while the sweep as a whole stays protected: onepcallper pass inFBHealBox_CheckRangeAll,FBHealBox_CheckLOSAllandFBRaid_Tick. A client that throws on the very first call keeps the old per-call protection and its fallback path.- Self-healing if an API throws late. Should a sweep throw after the form had already proven itself,
FBHealBox_ApiFailed()puts all three queries back to the protected single call, where the error is caught and the fallback takes over as before. The frame is never torn open, and at worst one pass is skipped. - Raid health text no longer builds strings it throws away. The percentage and deficit texts were formatted before the change check, so every
UNIT_HEALTHin a 40 man raid produced a string that was usually discarded immediately. The cell now compares the number and only formats on a real change, the way the plates always did. - Cheap pre-test before the combat log patterns. Up to four anchored patterns ran on every message from twenty registered events. A plain substring test now filters first, with the words cut out of the client's own message templates so it works in every language. The tick test deliberately comes from the self template, because "You gain" and "%s gains" differ in the verb but share what follows.
- Equipment bonus read once instead of per candidate. With heal chains a single Smart Healing click asked the API for the bonus up to fifteen times. The value is now remembered and dropped again on
UNIT_INVENTORY_CHANGEDor a spellbook rebuild. - Cast time comes free with the spell scan.
FBHealBox_SpellCastSecondsused to build its own tooltip on a cache miss, which could mean a dozen tooltip builds in the middle of combat on the first click.FBPredict_TooltipTextnow picks the cast time off the right-hand side while the tooltip is standing anyway and fills the cache; the standalone scan remains only as a fallback. The cast time is deliberately kept out of the parsed text, because a number like 2.5 would confuse the shield duration and heal amount patterns. - Smaller things. The range spell of the first assigned button is remembered instead of being searched over ten slots on every range check (invalidated on rebinding and on a spellbook rebuild). The ticker redraws on a fixed 0.03 second step instead of every frame. Blizzard's party frames are re-evaluated in the same collection point as the name updates instead of on every event of a burst. Two
or {}fallbacks in loops no longer allocate a throwaway table.