15 Commits

Author SHA1 Message Date
Bluewhale1337 6a6a9e3283 Hotfix: implement fast-path update pipeline to optimize mana tracking performance, skipping unnecessary ui re-draws 2026-08-23 15:22:57 +02:00
Bluewhale1337 d021441b32 hotfix: resolve UI layering and debuff coloring issues, and update version to 1.6.4 2026-08-17 22:29:53 +02:00
Bluewhale1337 99997b711a Merge pull request #14 from Bluewhale1337/dev
Dev
2026-08-16 21:33:23 +02:00
Bluewhale1337 496013ae9c Merge branch 'dev' of https://github.com/Bluewhale1337/HealBotBlue into dev 2026-08-09 12:11:57 +02:00
Bluewhale1337 f7443fcdf0 feat: increase icon limit to 10, add customizable icon size, and remove obsolete code 2026-08-09 12:11:29 +02:00
Bluewhale1337 a0d435eb70 Merge pull request #13 from Bluewhale1337/main
Merging minor changes from main to dev to sync up
2026-08-09 10:13:08 +02:00
Bluewhale1337 048970d1b7 chore: bump version to 1.6.3 and add string splitter fallback to changelog 2026-08-07 14:45:18 +02:00
Bluewhale1337 d5dec0f1f0 fix: handle empty or missing delimiters in HealBot_SplitString to prevent errors 2026-08-07 14:43:18 +02:00
Bluewhale1337 ad302f299e Merge pull request #12 from Bluewhale1337/dev
Dev merge
2026-08-05 22:26:36 +02:00
Bluewhale1337 6c4297c126 Update README.md
info about dev branch adses
2026-07-30 15:40:18 +02:00
Bluewhale1337 4f7a06ad6f Merge pull request #11 from Bluewhale1337/dev
Merge hotfixes to main
2026-07-26 14:11:10 +02:00
Bluewhale1337 caa3a03bc3 Merge pull request #10 from Bluewhale1337/dev
hotfix: add pet frame color support and update documentation with lat…
2026-07-21 19:02:19 +02:00
Bluewhale1337 5340eb253a Merge pull request #9 from Bluewhale1337/dev
Merge pull request #8 from Bluewhale1337/main
2026-07-21 13:52:32 +02:00
Bluewhale1337 5f015c89e5 Merge branch 'main' of https://github.com/Bluewhale1337/HealBotBlue 2026-07-21 13:48:03 +02:00
Bluewhale1337 e20c5baf74 docs: remove redundant trailing space in README version history 2026-07-21 13:48:00 +02:00
11 changed files with 148 additions and 53 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
## Interface: 11200
## Title: HealBotBlue
## Version: 1.6.2
## Version: 1.6.5
## Author: Bluewhale
## Notes: Adds panel with skinable bars for healing and decursive
## SavedVariablesPerCharacter: HealBot_Config
+3
View File
@@ -123,6 +123,9 @@ end
function HealBot_SplitString(str, delimiter)
local result = {}
if not delimiter or delimiter == "" then
return {str}
end
local start_pos = 1
while true do
local end_pos = string.find(str, delimiter, start_pos, true)
+54 -14
View File
@@ -18,6 +18,20 @@
<OnClick>HealBot_Action_HealUnit_OnClick(this,arg1);</OnClick>
</Scripts>
<Frames>
<StatusBar name="$parentBar2" inherits="HealBot_StatusBar">
<Anchors>
<Anchor point="TOPLEFT" relativePoint="TOPLEFT">
<Offset>
<AbsDimension x="0" y="0"/>
</Offset>
</Anchor>
<Anchor point="TOPRIGHT" relativePoint="TOPRIGHT">
<Offset>
<AbsDimension x="0" y="0"/>
</Offset>
</Anchor>
</Anchors>
</StatusBar>
<StatusBar name="$parentBar" inherits="HealBot_StatusBar">
<Anchors>
<Anchor point="TOPLEFT" relativePoint="TOPLEFT">
@@ -73,23 +87,49 @@
</Anchor>
</Anchors>
</Texture>
<Texture name="$parentIcon6" hidden="true">
<Size><AbsDimension x="12" y="12"/></Size>
<Anchors>
<Anchor point="LEFT" relativeTo="$parentIcon5" relativePoint="RIGHT">
<Offset><AbsDimension x="1" y="0"/></Offset>
</Anchor>
</Anchors>
</Texture>
<Texture name="$parentIcon7" hidden="true">
<Size><AbsDimension x="12" y="12"/></Size>
<Anchors>
<Anchor point="LEFT" relativeTo="$parentIcon6" relativePoint="RIGHT">
<Offset><AbsDimension x="1" y="0"/></Offset>
</Anchor>
</Anchors>
</Texture>
<Texture name="$parentIcon8" hidden="true">
<Size><AbsDimension x="12" y="12"/></Size>
<Anchors>
<Anchor point="LEFT" relativeTo="$parentIcon7" relativePoint="RIGHT">
<Offset><AbsDimension x="1" y="0"/></Offset>
</Anchor>
</Anchors>
</Texture>
<Texture name="$parentIcon9" hidden="true">
<Size><AbsDimension x="12" y="12"/></Size>
<Anchors>
<Anchor point="LEFT" relativeTo="$parentIcon8" relativePoint="RIGHT">
<Offset><AbsDimension x="1" y="0"/></Offset>
</Anchor>
</Anchors>
</Texture>
<Texture name="$parentIcon10" hidden="true">
<Size><AbsDimension x="12" y="12"/></Size>
<Anchors>
<Anchor point="LEFT" relativeTo="$parentIcon9" relativePoint="RIGHT">
<Offset><AbsDimension x="1" y="0"/></Offset>
</Anchor>
</Anchors>
</Texture>
</Layer>
</Layers>
</StatusBar>
<StatusBar name="$parentBar2" inherits="HealBot_StatusBar">
<Anchors>
<Anchor point="TOPLEFT" relativePoint="TOPLEFT">
<Offset>
<AbsDimension x="0" y="0"/>
</Offset>
</Anchor>
<Anchor point="TOPRIGHT" relativePoint="TOPRIGHT">
<Offset>
<AbsDimension x="0" y="0"/>
</Offset>
</Anchor>
</Anchors>
</StatusBar>
<StatusBar name="$parentBar3" inherits="HealBot_StatusBar" hidden="true">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="$parentBar" relativePoint="BOTTOMLEFT">
+6 -6
View File
@@ -160,19 +160,20 @@ function HealBot_OnEvent_UnitAura(this, unit)
if not HealBot_UnitIcons[unit] then
HealBot_UnitIcons[unit] = {}
end
for j = 1, 5 do
for j = 1, 10 do
HealBot_UnitIcons[unit][j] = nil
end
local iconCount = 0
local i = 1;
HealBot_UnitDebuff[unit] = nil;
while true do
local debuff, tmp, debuff_type = UnitDebuff(unit, i, 1)
if debuff then
if iconCount < 5 then
if iconCount < 10 then
iconCount = iconCount + 1
HealBot_UnitIcons[unit][iconCount] = debuff
end
if HealBot_CDCInc[UnitClass(unit)] == 1 and HealBot_DebuffWatch[debuff_type] then
if HealBot_CDCInc[UnitClass(unit)] == 1 and debuff_type and HealBot_DebuffWatch[debuff_type] then
HealBot_UnitDebuff[unit] = debuff_type
DebuffType = debuff_type;
if HealBot_DebuffPriority[debuff_type] then
@@ -181,7 +182,6 @@ function HealBot_OnEvent_UnitAura(this, unit)
end
i = i + 1;
else
if i == 1 then HealBot_UnitDebuff[unit] = nil; end
break
end
end
@@ -190,7 +190,7 @@ function HealBot_OnEvent_UnitAura(this, unit)
while true do
local buff = UnitBuff(unit, b)
if not buff then break end
if HealBot_TrackedHoTs[buff] and iconCount < 5 then
if HealBot_TrackedHoTs[buff] and iconCount < 10 then
iconCount = iconCount + 1
HealBot_UnitIcons[unit][iconCount] = buff
end
@@ -201,7 +201,7 @@ function HealBot_OnEvent_UnitAura(this, unit)
while true do
local debuff = UnitDebuff(unit, d)
if not debuff then break end
if HealBot_TrackedHoTs[debuff] and iconCount < 5 then
if HealBot_TrackedHoTs[debuff] and iconCount < 10 then
iconCount = iconCount + 1
HealBot_UnitIcons[unit][iconCount] = debuff
end
+10 -1
View File
@@ -2,6 +2,7 @@
-- Manages WoW Frame events and periodic updates, routing to respective services
HealBot_View_DirtyUnits = {}
HealBot_View_DirtyPower = {}
local HealBot_Timer1, HealsIn_Timer = 0, 0;
HealBot_LastModState = ""
@@ -20,7 +21,7 @@ function HealBot_OnLoad(this)
HealBot_View_DirtyUnits[unitID] = true
end)
HealBot_Model:RegisterObserver("UNIT_POWER_CHANGED", function(unitID)
HealBot_View_DirtyUnits[unitID] = true
HealBot_View_DirtyPower[unitID] = true
end)
HealBot_Model:RegisterObserver("UNIT_AURA_CHANGED", function(unitID)
HealBot_View_DirtyUnits[unitID] = true
@@ -78,9 +79,17 @@ function HealBot_OnUpdate(this, arg1)
while unitID do
HealBot_Action_RefreshButtons(unitID)
HealBot_View_DirtyUnits[unitID] = nil
HealBot_View_DirtyPower[unitID] = nil -- Skip fast path if doing full refresh
unitID, _ = next(HealBot_View_DirtyUnits)
end
local powerID, _ = next(HealBot_View_DirtyPower)
while powerID do
HealBot_Action_RefreshPower(powerID)
HealBot_View_DirtyPower[powerID] = nil
powerID, _ = next(HealBot_View_DirtyPower)
end
if HealBot_EquipChangeTimer > 0 then
HealBot_EquipChangeTimer = HealBot_EquipChangeTimer - arg1
if HealBot_EquipChangeTimer <= 0 then
+2 -13
View File
@@ -246,6 +246,7 @@ HealBot_ConfigDefaults = {
bpadding = {[HEALBOT_SKINS_STD] = 10, ["HealBot Party"] = 10, ["HealBot Raid"] = 10, ["Alteric Valley"] = 10, ["Modern Flat"] = 10},
bboffset = {[HEALBOT_SKINS_STD] = 16, ["HealBot Party"] = 16, ["HealBot Raid"] = 16, ["Alteric Valley"] = 16, ["Modern Flat"] = 3},
bfontoutline = {[HEALBOT_SKINS_STD] = 0, ["HealBot Party"] = 0, ["HealBot Raid"] = 0, ["Alteric Valley"] = 0, ["Modern Flat"] = 1},
biconsize = {[HEALBOT_SKINS_STD] = 12, ["HealBot Party"] = 12, ["HealBot Raid"] = 12, ["Alteric Valley"] = 12, ["Modern Flat"] = 12},
ShowTooltip = 1,
ShowManaBars = 0,
ManaBarsHealersOnly = 0,
@@ -274,18 +275,6 @@ HEALBOT_ADDON_ID="HealBot_Heals"
HealBot_AbortButton=1;
HealBot_Groups = {
["ITEMS"] = {
HEALBOT_BANDAGES,
HEALBOT_HEALING_POTIONS,
HEALBOT_HEALTHSTONES,
},
["PALADIN"] = {
HEALBOT_HOLY_LIGHT,
HEALBOT_FLASH_OF_LIGHT,
},
}
HealBot_Spells = {
-- Cast = secs until effect starts
-- Channel = secs until caster available
@@ -584,7 +573,7 @@ HealBot_Action_TooltipUnit=nil;
HealBot_Ressing = {};
HealBot_IamRessing = false;
-- Table Recycling Pool (Puppeteer-inspired)
-- Table Recycling Pool
local tablePool = {}
function HealBot_GetTable()
local t = table.remove(tablePool)
+3
View File
@@ -301,6 +301,9 @@ function HealBot_Options_SetSkins()
HealBot_Options_BarAlphaInHeal:SetValue(HealBot_Config.BarcolaInHeal[HealBot_Config.Current_Skin]);
HealBot_Options_BarTextureS:SetValue(HealBot_Config.btexture[HealBot_Config.Current_Skin])
HealBot_Options_BarHeightS:SetValue(HealBot_Config.bheight[HealBot_Config.Current_Skin])
HealBot_Options_AbortBarSize:SetValue(HealBot_Config.abortsize[HealBot_Config.Current_Skin])
HealBot_Options_FontHeight:SetValue(HealBot_Config.btextheight[HealBot_Config.Current_Skin])
HealBot_Options_IconSizeS:SetValue(HealBot_Config.biconsize[HealBot_Config.Current_Skin] or 12)
HealBot_Options_BarWidthS:SetValue(HealBot_Config.bwidth[HealBot_Config.Current_Skin])
HealBot_Options_BarNumColsS:SetValue(HealBot_Config.numcols[HealBot_Config.Current_Skin])
HealBot_Options_BarMaxRowsS:SetValue((HealBot_Config.bmaxrows and HealBot_Config.bmaxrows[HealBot_Config.Current_Skin]) or 0)
+5
View File
@@ -44,6 +44,11 @@ function HealBot_Options_FontHeight_OnValueChanged(this)
getglobal(this:GetName().."Text"):SetText(this.text .. ": " .. this:GetValue());
HealBot_Action_ResetSkin()
end
function HealBot_Options_IconSizeS_OnValueChanged(this)
HealBot_Config.biconsize[HealBot_Config.Current_Skin] = this:GetValue();
getglobal(this:GetName().."Text"):SetText(this.text .. ": " .. this:GetValue());
HealBot_Action_ResetSkin()
end
function HealBot_Options_AbortBarSize_OnValueChanged(this)
HealBot_Config.abortsize[HealBot_Config.Current_Skin] = this:GetValue();
getglobal(this:GetName().."Text"):SetText(this.text .. ": " .. this:GetValue());
+16
View File
@@ -360,6 +360,22 @@
<OnValueChanged>HealBot_Options_FontHeight_OnValueChanged(this)</OnValueChanged>
</Scripts>
</Slider>
<Slider name="HealBot_Options_IconSizeS" inherits="HealBot_Options_SliderTemplate">
<Size>
<AbsDimension x="123" y="17" />
</Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_FontHeight" relativePoint="TOPRIGHT">
<Offset>
<AbsDimension x="10" y="0" />
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_val_OnLoad(this,"Icon size",5,30)</OnLoad>
<OnValueChanged>HealBot_Options_IconSizeS_OnValueChanged(this)</OnValueChanged>
</Scripts>
</Slider>
<Slider name="HealBot_Options_BorderThicknessS" inherits="HealBot_Options_SliderTemplate">
<Size>
+31 -18
View File
@@ -27,24 +27,19 @@ end
function HealBot_HealthColor(unit, hlth, maxhlth)
if HealBot_UnitDebuff[unit] then
local debuff, tmp, debuff_type = UnitDebuff(unit, 1, 1)
if not debuff then
HealBot_UnitDebuff[unit] = nil;
HealBot_UnitDebuff[unit .. "_debuff_texture"] = nil
else
local dr = HealBot_Config.CDCBarColour[debuff_type].R
local dg = HealBot_Config.CDCBarColour[debuff_type].G
local db = HealBot_Config.CDCBarColour[debuff_type].B
if HealBot_Config.btexture[HealBot_Config.Current_Skin] == 10 then
dr = dr * 4
dg = dg * 4
db = db * 4
if dr > 1 then dr = 1 end
if dg > 1 then dg = 1 end
if db > 1 then db = 1 end
end
return dr, dg, db, HealBot_Config.Barcola[HealBot_Config.Current_Skin];
local debuff_type = HealBot_UnitDebuff[unit]
local dr = HealBot_Config.CDCBarColour[debuff_type].R
local dg = HealBot_Config.CDCBarColour[debuff_type].G
local db = HealBot_Config.CDCBarColour[debuff_type].B
if HealBot_Config.btexture[HealBot_Config.Current_Skin] == 10 then
dr = dr * 4
dg = dg * 4
db = db * 4
if dr > 1 then dr = 1 end
if dg > 1 then dg = 1 end
if db > 1 then db = 1 end
end
return dr, dg, db, HealBot_Config.Barcola[HealBot_Config.Current_Skin];
end
local text = UnitName(unit);
@@ -251,11 +246,14 @@ function HealBot_Action_EnableButton(button)
bar.txt:SetFont(fontName, fontHeight, "")
end
for i = 1, 5 do
local iconSize = HealBot_Config.biconsize[HealBot_Config.Current_Skin] or 12
for i = 1, 10 do
local icon = getglobal(button:GetName() .. "BarIcon" .. i)
if icon then
if HealBot_UnitIcons and HealBot_UnitIcons[unit] and HealBot_UnitIcons[unit][i] then
icon:SetTexture(HealBot_UnitIcons[unit][i])
icon:SetWidth(iconSize)
icon:SetHeight(iconSize)
icon:Show()
else
icon:Hide()
@@ -305,6 +303,21 @@ function HealBot_Action_RefreshButtons(unit)
end
end
function HealBot_Action_RefreshPower(unit)
if not unit or not HealBot_Action_UnitButtons[unit] then return end
local state = HealBot_Model.units[unit]
if not state then return end
for index, button in pairs(HealBot_Action_UnitButtons[unit]) do
if not button.bar3 then button.bar3 = getglobal(button:GetName() .. "Bar3") end
local bar3 = button.bar3
if bar3 and bar3:IsVisible() then
bar3:SetMinMaxValues(0, state.maxMana)
bar3:SetValue(state.mana)
end
end
end
function HealBot_Action_PositionButton(button, OsetX, OsetY, bwidth, bheight, checked, header)
local brspace = HealBot_Config.brspace[HealBot_Config.Current_Skin] or 3;
if header then
+17
View File
@@ -7,6 +7,9 @@ Original HealBot, while being a staple healing addon in Wrath and later expansio
> **Performance First:** The raidframe is not library reliant - unlike popular raidframe replacement addons it doesn't rely at all on external frameworks. While this makes my work a bit harder this allows complete control over garbage collection and CPU use which makes it multiple times more stable and lightweight.
### Development version
There is dev branch available, it might be slightly more unstabl but most of time it does have more features present. It's only merged into main when major feature set is implemented and stabilised.
### Reporting Errors
Major errors will pop up a frame with error information. Take a screenshot and post comments.
@@ -46,6 +49,20 @@ Default installation path: `C:\Program Files\World of Warcraft\Interface\AddOns\
### Change Log
**v1.6.5**
* **Performance Update - Mana Tracking** - Added a fast-path redraw pipeline for unit power changes. This massive optimization prevents full frame redraws when players naturally regenerate or consume mana, resolving severe FPS drops in 40-man raids while tracking mana.
**v1.6.4**
* **Bug Fix - UI Opacity** - Fixed a rendering layering bug where incoming heals drew on top of actual health, causing the semi-transparent incoming heal bar to wash out the solid health bar.
* **Bug Fix - CDC Colors** - Fixed health bar debuff coloring (CDC) by stopping `HealBot_HealthColor` from incorrectly querying debuffs directly, relying instead on cached debuff types.
**v1.6.3**
* **Hotfix string splitter** - added falback for string splitter if the the string is empty or nil.
* **UI Update - Icon Limit** - Increased maximum tracked buffs/debuffs per unit from 5 to 10.
* **UI Update - Customizable icon size** - Added an option to change size of HoT icons (default to 12px).
* **Cleanup** - Removed dead code `HealBot_Groups` table.
**v1.6.2**
* **Hotfix - raid and party frames** - if getNumRaidMembers() > 0 wrapper around extra bars stopped from displaying all frames blocked from displaying Extras\Raid.
* **UI Update - Raid & Pets Split** - Split the "Raid / Extra" toggle into separate "Raid" and "Pets" toggles. Simplified the raid bars filter dropdown to core options (All, Melee, Ranged, Heals, Custom).