Skip to content

FBHealBox v1.4.5

Latest

Choose a tag to compare

@QbiXibQ QbiXibQ released this 09 Sep 06:08
· 1 commit to main since this release
f527200

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 PartyMemberFrame1 to 4 while 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 their OnShow once 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), and FBHealBox_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 for GetSpellBonusHealing, GetSpellBonusHeal and GetHealingBonus, first as globals and then inside a ClassicAPI table, and FBPredict_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 in HealBox.HealBonus (on by default). /fbp reports 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_PlayerBuffTimeLeft used to walk the whole player buff list once per watched buff, calling strupper on 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 way FBHealBox_UnitBuffs already 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_Tick used 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.
  • pcall per 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: one pcall per pass in FBHealBox_CheckRangeAll, FBHealBox_CheckLOSAll and FBRaid_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_HEALTH in 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_CHANGED or a spellbook rebuild.
  • Cast time comes free with the spell scan. FBHealBox_SpellCastSeconds used 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_TooltipText now 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.