From d021441b3225f77fddea33ab796d5c29a08c7393 Mon Sep 17 00:00:00 2001
From: Bluewhale1337 <295648290+Bluewhale1337@users.noreply.github.com>
Date: Mon, 17 Aug 2026 22:29:53 +0200
Subject: [PATCH 1/4] hotfix: resolve UI layering and debuff coloring issues,
and update version to 1.6.4
---
HealBotBlue.toc | 2 +-
HealBot_Action.xml | 28 ++++++++++++++--------------
HealBot_Controller_Aura.lua | 4 ++--
HealBot_View_Layout.lua | 29 ++++++++++++-----------------
README.md | 5 +++++
5 files changed, 34 insertions(+), 34 deletions(-)
diff --git a/HealBotBlue.toc b/HealBotBlue.toc
index 53c95ec..b97c33e 100644
--- a/HealBotBlue.toc
+++ b/HealBotBlue.toc
@@ -1,6 +1,6 @@
## Interface: 11200
## Title: HealBotBlue
-## Version: 1.6.3
+## Version: 1.6.4
## Author: Bluewhale
## Notes: Adds panel with skinable bars for healing and decursive
## SavedVariablesPerCharacter: HealBot_Config
diff --git a/HealBot_Action.xml b/HealBot_Action.xml
index 9a82842..d49bd2c 100644
--- a/HealBot_Action.xml
+++ b/HealBot_Action.xml
@@ -18,6 +18,20 @@
HealBot_Action_HealUnit_OnClick(this,arg1);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -116,20 +130,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/HealBot_Controller_Aura.lua b/HealBot_Controller_Aura.lua
index 7b85427..60e79d6 100644
--- a/HealBot_Controller_Aura.lua
+++ b/HealBot_Controller_Aura.lua
@@ -165,6 +165,7 @@ function HealBot_OnEvent_UnitAura(this, unit)
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
@@ -172,7 +173,7 @@ function HealBot_OnEvent_UnitAura(this, unit)
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
diff --git a/HealBot_View_Layout.lua b/HealBot_View_Layout.lua
index 2af7eef..fff26d8 100644
--- a/HealBot_View_Layout.lua
+++ b/HealBot_View_Layout.lua
@@ -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);
diff --git a/README.md b/README.md
index be92b99..9fd55d4 100644
--- a/README.md
+++ b/README.md
@@ -49,6 +49,11 @@ Default installation path: `C:\Program Files\World of Warcraft\Interface\AddOns\
### Change Log
+**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.
From 6a6a9e32837d6f31ac5829857be75786f0fc5dc0 Mon Sep 17 00:00:00 2001
From: Bluewhale1337 <295648290+Bluewhale1337@users.noreply.github.com>
Date: Sun, 23 Aug 2026 15:22:57 +0200
Subject: [PATCH 2/4] Hotfix: implement fast-path update pipeline to optimize
mana tracking performance, skipping unnecessary ui re-draws
---
HealBotBlue.toc | 2 +-
HealBot_Controller_Events.lua | 11 ++++++++++-
HealBot_View_Layout.lua | 15 +++++++++++++++
README.md | 3 +++
4 files changed, 29 insertions(+), 2 deletions(-)
diff --git a/HealBotBlue.toc b/HealBotBlue.toc
index b97c33e..7c0d6b0 100644
--- a/HealBotBlue.toc
+++ b/HealBotBlue.toc
@@ -1,6 +1,6 @@
## Interface: 11200
## Title: HealBotBlue
-## Version: 1.6.4
+## Version: 1.6.5
## Author: Bluewhale
## Notes: Adds panel with skinable bars for healing and decursive
## SavedVariablesPerCharacter: HealBot_Config
diff --git a/HealBot_Controller_Events.lua b/HealBot_Controller_Events.lua
index ab094dd..f8ec5bd 100644
--- a/HealBot_Controller_Events.lua
+++ b/HealBot_Controller_Events.lua
@@ -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
diff --git a/HealBot_View_Layout.lua b/HealBot_View_Layout.lua
index fff26d8..138af47 100644
--- a/HealBot_View_Layout.lua
+++ b/HealBot_View_Layout.lua
@@ -303,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
diff --git a/README.md b/README.md
index 9fd55d4..ba988c2 100644
--- a/README.md
+++ b/README.md
@@ -49,6 +49,9 @@ 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.
From 60ef3bc41fcfd10b083f80c42c81fe6cbd216bf3 Mon Sep 17 00:00:00 2001
From: Bluewhale1337 <295648290+Bluewhale1337@users.noreply.github.com>
Date: Tue, 25 Aug 2026 10:23:46 +0200
Subject: [PATCH 3/4] Hotfix: replace party recalculation with button refresh
and add safety checks to debuff spell configuration - rewerting accidental
deletion
---
HealBot_Options_Buffs.lua | 8 ++++----
HealBot_Options_CDC.lua | 4 ++--
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/HealBot_Options_Buffs.lua b/HealBot_Options_Buffs.lua
index d849705..eb3a267 100644
--- a/HealBot_Options_Buffs.lua
+++ b/HealBot_Options_Buffs.lua
@@ -9,12 +9,12 @@ function HealBot_Options_BuffWatch_OnClick(self)
else
HealBot_Options_BuffWatchInCombat:Enable()
end
- HealBot_RecalcParty();
+ HealBot_Action_RefreshButtons(nil);
end
function HealBot_Options_BuffWatchInCombat_OnClick(self)
local frame = self or this
HealBot_Config.BuffWatchInCombat = frame:GetChecked() or 0;
- HealBot_RecalcParty();
+ HealBot_Action_RefreshButtons(nil);
end
function HealBot_Options_BuffSelf_OnLoad(self)
local frame = self or this
@@ -38,7 +38,7 @@ function HealBot_Options_BuffSelf_OnClick(self)
else
HealBot_Config.BuffWatchSelf[id] = 0
end
- HealBot_RecalcParty();
+ HealBot_Action_RefreshButtons(nil);
end
function HealBot_Options_Buff_OnLoad(self)
local frame = self or this
@@ -80,7 +80,7 @@ function HealBot_Options_Buff_OnClick()
HealBot_UIDropDownMenu_SetSelectedID(frame, this.value + 1)
UIDropDownMenu_SetText(text, frame)
- HealBot_RecalcParty();
+ HealBot_Action_RefreshButtons(nil);
end
function HealBot_Options_SetBuffs()
local myClass = UnitClass("player")
diff --git a/HealBot_Options_CDC.lua b/HealBot_Options_CDC.lua
index c52de4b..387ff92 100644
--- a/HealBot_Options_CDC.lua
+++ b/HealBot_Options_CDC.lua
@@ -248,13 +248,13 @@ function HealBot_Options_Debuff_Reset()
if classEN=="PRIEST" or classEN=="DRUID" or classEN=="PALADIN" or classEN=="SHAMAN" then
local spell = HealBot_Config.CDCLeftText[UnitClass("player")];
HealBot_DebuffWatch = {[HEALBOT_DISEASE_en]=false, [HEALBOT_MAGIC_en]=false, [HEALBOT_POISON_en]=false, [HEALBOT_CURSE_en]=false }
- if spell ~= "None" then
+ if spell and spell ~= "None" and HealBot_Debuff_Types[spell] then
table.foreach(HealBot_Debuff_Types[spell], function (index,debuff)
HealBot_DebuffWatch[debuff]=true;
end)
end
spell = HealBot_Config.CDCRightText[UnitClass("player")];
- if spell ~= "None" then
+ if spell and spell ~= "None" and HealBot_Debuff_Types[spell] then
table.foreach(HealBot_Debuff_Types[spell], function (index,debuff)
HealBot_DebuffWatch[debuff]=true;
end)
From 5aab23314a5d7e00dc3c98e4bd3342795a9c647e Mon Sep 17 00:00:00 2001
From: Bluewhale1337 <295648290+Bluewhale1337@users.noreply.github.com>
Date: Tue, 25 Aug 2026 17:54:18 +0200
Subject: [PATCH 4/4] feat: implement automatic default debuff tracking based
on player class in HealBot_Options_Debuff_Reset
---
HealBot_Options_CDC.lua | 19 ++++++++++++++++++-
1 file changed, 18 insertions(+), 1 deletion(-)
diff --git a/HealBot_Options_CDC.lua b/HealBot_Options_CDC.lua
index 387ff92..1350bdf 100644
--- a/HealBot_Options_CDC.lua
+++ b/HealBot_Options_CDC.lua
@@ -246,8 +246,25 @@ end
function HealBot_Options_Debuff_Reset()
local classEN=HealBot_UnitClass("player")
if classEN=="PRIEST" or classEN=="DRUID" or classEN=="PALADIN" or classEN=="SHAMAN" then
- local spell = HealBot_Config.CDCLeftText[UnitClass("player")];
HealBot_DebuffWatch = {[HEALBOT_DISEASE_en]=false, [HEALBOT_MAGIC_en]=false, [HEALBOT_POISON_en]=false, [HEALBOT_CURSE_en]=false }
+
+ -- Automatically track all curable debuffs out of the box
+ if classEN == "PRIEST" then
+ HealBot_DebuffWatch[HEALBOT_MAGIC_en] = true
+ HealBot_DebuffWatch[HEALBOT_DISEASE_en] = true
+ elseif classEN == "DRUID" then
+ HealBot_DebuffWatch[HEALBOT_CURSE_en] = true
+ HealBot_DebuffWatch[HEALBOT_POISON_en] = true
+ elseif classEN == "PALADIN" then
+ HealBot_DebuffWatch[HEALBOT_MAGIC_en] = true
+ HealBot_DebuffWatch[HEALBOT_POISON_en] = true
+ HealBot_DebuffWatch[HEALBOT_DISEASE_en] = true
+ elseif classEN == "SHAMAN" then
+ HealBot_DebuffWatch[HEALBOT_POISON_en] = true
+ HealBot_DebuffWatch[HEALBOT_DISEASE_en] = true
+ end
+
+ local spell = HealBot_Config.CDCLeftText[UnitClass("player")];
if spell and spell ~= "None" and HealBot_Debuff_Types[spell] then
table.foreach(HealBot_Debuff_Types[spell], function (index,debuff)
HealBot_DebuffWatch[debuff]=true;