From 58f593947edf36cc05c21b7c3108ab7ed6350d27 Mon Sep 17 00:00:00 2001
From: Bluewhale1337 <295648290+Bluewhale1337@users.noreply.github.com>
Date: Mon, 17 Aug 2026 20:26:09 +0200
Subject: [PATCH 01/22] Features implementation - added integration support for
UnitXP and nampower, expand Options UI.
---
HealBotBlue.toc | 4 ++-
HealBot_Controller_Aura.lua | 8 +++--
HealBot_Controller_Events.lua | 1 +
HealBot_Controller_Range.lua | 5 +++
HealBot_Data.lua | 2 ++
HealBot_Integrations.lua | 23 ++++++++++++++
HealBot_Options.lua | 2 +-
HealBot_Options.xml | 13 ++++++--
HealBot_Options_Buffs.lua | 2 +-
HealBot_Options_Integrations.lua | 4 +++
HealBot_Options_Integrations.xml | 52 ++++++++++++++++++++++++++++++++
HealBot_View_Layout.lua | 38 +++++++++++------------
README.md | 5 +++
13 files changed, 131 insertions(+), 28 deletions(-)
create mode 100644 HealBot_Integrations.lua
create mode 100644 HealBot_Options_Integrations.lua
create mode 100644 HealBot_Options_Integrations.xml
diff --git a/HealBotBlue.toc b/HealBotBlue.toc
index 53c95ec..6acff89 100644
--- a/HealBotBlue.toc
+++ b/HealBotBlue.toc
@@ -1,6 +1,6 @@
## Interface: 11200
## Title: HealBotBlue
-## Version: 1.6.3
+## Version: 1.7.0
## Author: Bluewhale
## Notes: Adds panel with skinable bars for healing and decursive
## SavedVariablesPerCharacter: HealBot_Config
@@ -10,6 +10,7 @@
..\..\FrameXML\UIDropDownMenu.xml
HealBot_Error.xml
HealBot_Model.lua
+HealBot_Integrations.lua
HealBot_Controller_Range.lua
HealBot_Controller_Comms.lua
HealBot_Controller_Aura.lua
@@ -28,3 +29,4 @@ HealBot_Options_Skins.xml
HealBot_Options_Buffs.xml
HealBot_Options_Chat.xml
HealBot_Options_Auto.xml
+HealBot_Options_Integrations.xml
diff --git a/HealBot_Controller_Aura.lua b/HealBot_Controller_Aura.lua
index 7b85427..6e84e14 100644
--- a/HealBot_Controller_Aura.lua
+++ b/HealBot_Controller_Aura.lua
@@ -39,7 +39,7 @@ function HealBot_CheckShamanWeaponBuff(spellName)
if not firstWord then return false end
HealBot_ScanTooltip:SetOwner(UIParent, "ANCHOR_NONE")
- local slots = {}
+ local slots = HealBot_GetTable()
if hasMainHandEnchant then table.insert(slots, 16) end
if hasOffHandEnchant then table.insert(slots, 17) end
@@ -52,6 +52,7 @@ function HealBot_CheckShamanWeaponBuff(spellName)
local text = textObj:GetText()
if text and string.find(text, firstWord) then
HealBot_ScanTooltip:Hide()
+ HealBot_ReleaseTable(slots)
return true
end
end
@@ -59,6 +60,7 @@ function HealBot_CheckShamanWeaponBuff(spellName)
end
HealBot_ScanTooltip:Hide()
+ HealBot_ReleaseTable(slots)
return false
end
@@ -165,6 +167,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 +175,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 +184,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_Controller_Events.lua b/HealBot_Controller_Events.lua
index ab094dd..5d76946 100644
--- a/HealBot_Controller_Events.lua
+++ b/HealBot_Controller_Events.lua
@@ -201,6 +201,7 @@ local HealBot_EventHandlers = {
end,
["VARIABLES_LOADED"] = function(this)
HealBot_OnEvent_VariablesLoaded(this)
+ HealBot_Integrations_Toggle()
end,
-- Legacy pass-throughs
["CHAT_MSG_ADDON"] = function(this, arg1, arg2, arg3, arg4) HealBot_OnEvent_AddonMsg(this, arg1, arg2, arg3, arg4) end,
diff --git a/HealBot_Controller_Range.lua b/HealBot_Controller_Range.lua
index e34a3e3..d24a191 100644
--- a/HealBot_Controller_Range.lua
+++ b/HealBot_Controller_Range.lua
@@ -14,6 +14,11 @@ function HealBot_Range_Check(unit, range)
end
if ( unit == "player" ) then
return_val = 1;
+ elseif HealBot_Integrations_UnitXP_Active then
+ local dist = UnitXP("distanceBetween", "player", unit, "Gaussian")
+ if dist and dist <= range then
+ return_val = 1;
+ end
elseif ( UnitIsVisible(unit) == 1 ) then
local tx, ty = GetPlayerMapPosition(unit)
local dist
diff --git a/HealBot_Data.lua b/HealBot_Data.lua
index 387e68a..c5ea038 100644
--- a/HealBot_Data.lua
+++ b/HealBot_Data.lua
@@ -255,6 +255,8 @@ HealBot_ConfigDefaults = {
Tooltip_Recommend = 1,
TooltipPos = 1,
HideParty = 0,
+ HealBot_Integrations_UnitXP = 0,
+ HealBot_Integrations_Nampower = 0,
};
HealBot_Config = {};
diff --git a/HealBot_Integrations.lua b/HealBot_Integrations.lua
new file mode 100644
index 0000000..028bcce
--- /dev/null
+++ b/HealBot_Integrations.lua
@@ -0,0 +1,23 @@
+HealBot_Integrations_UnitXP_Active = false;
+HealBot_Integrations_Nampower_Active = false;
+
+function HealBot_Integrations_Toggle()
+ -- UnitXP
+ if HealBot_Config.HealBot_Integrations_UnitXP == 1 and UnitXP ~= nil then
+ HealBot_Integrations_UnitXP_Active = true;
+ HealBot_AddDebug("UnitXP Integration: ENABLED");
+ else
+ HealBot_Integrations_UnitXP_Active = false;
+ HealBot_AddDebug("UnitXP Integration: DISABLED");
+ end
+
+ -- nampower
+ if HealBot_Config.HealBot_Integrations_Nampower == 1 then
+ HealBot_Integrations_Nampower_Active = true;
+ HealBot_AddDebug("nampower Integration: ENABLED");
+ -- Add Nampower specific initialization here later
+ else
+ HealBot_Integrations_Nampower_Active = false;
+ HealBot_AddDebug("nampower Integration: DISABLED");
+ end
+end
diff --git a/HealBot_Options.lua b/HealBot_Options.lua
index 553aab7..815af55 100644
--- a/HealBot_Options.lua
+++ b/HealBot_Options.lua
@@ -223,7 +223,7 @@ function HealBot_Options_OnLoad(this)
table.insert(UISpecialFrames,this:GetName());
-- Tabs
- PanelTemplates_SetNumTabs(this,8);
+ PanelTemplates_SetNumTabs(this,9);
this.selectedTab = 1;
PanelTemplates_UpdateTabs(this);
HealBot_Options_ShowPanel(this.selectedTab);
diff --git a/HealBot_Options.xml b/HealBot_Options.xml
index 6380dd1..74d8814 100644
--- a/HealBot_Options.xml
+++ b/HealBot_Options.xml
@@ -94,7 +94,7 @@
-
+
@@ -121,7 +121,7 @@
-
+
@@ -215,6 +215,15 @@
+
diff --git a/HealBot_Options_Buffs.lua b/HealBot_Options_Buffs.lua
index d849705..f86e30c 100644
--- a/HealBot_Options_Buffs.lua
+++ b/HealBot_Options_Buffs.lua
@@ -105,7 +105,7 @@ function HealBot_Options_SetBuffs()
HealBot_UIDropDownMenu_SetSelectedID(dropDown, val + 1)
end
- local selfCheck = getglobal("HealBot_Options_BuffSelf" .. i)
+ local selfCheck = getglobal("HealBot_Options_Buff" .. i .. "Self")
if selfCheck then
if HealBot_Config.BuffWatchSelf and HealBot_Config.BuffWatchSelf[i] then
local isSelf = (HealBot_Config.BuffWatchSelf[i] == 1)
diff --git a/HealBot_Options_Integrations.lua b/HealBot_Options_Integrations.lua
new file mode 100644
index 0000000..f93f5de
--- /dev/null
+++ b/HealBot_Options_Integrations.lua
@@ -0,0 +1,4 @@
+function HealBot_Options_Integrations_OnShow(this)
+ HealBot_Options_Integrations_UnitXP:SetChecked(HealBot_Config.HealBot_Integrations_UnitXP);
+ HealBot_Options_Integrations_Nampower:SetChecked(HealBot_Config.HealBot_Integrations_Nampower);
+end
diff --git a/HealBot_Options_Integrations.xml b/HealBot_Options_Integrations.xml
new file mode 100644
index 0000000..d4e3154
--- /dev/null
+++ b/HealBot_Options_Integrations.xml
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ getglobal(this:GetName().."Text"):SetText("Enable UnitXP_SP3 Integration (Distance/LoS)");
+
+
+ HealBot_Config.HealBot_Integrations_UnitXP = this:GetChecked() and 1 or 0;
+ HealBot_Integrations_Toggle();
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ getglobal(this:GetName().."Text"):SetText("Enable nampower Integration (Buffs/Heals)");
+
+
+ HealBot_Config.HealBot_Integrations_Nampower = this:GetChecked() and 1 or 0;
+ HealBot_Integrations_Toggle();
+
+
+
+
+
+
+
+ HealBot_Options_Integrations_OnShow(this);
+
+
+
+
diff --git a/HealBot_View_Layout.lua b/HealBot_View_Layout.lua
index 2af7eef..d73562b 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);
@@ -431,7 +426,7 @@ function HealBot_Action_PartyChanged()
local numBars = 0;
local numHeaders = 0;
local TempMaxH = 0;
- local HeaderPos = {};
+ local HeaderPos = HealBot_GetTable();
if HealBot_Config.AutoSwap_Enabled == 1 then
local totalMembers = GetNumRaidMembers()
@@ -598,8 +593,8 @@ function HealBot_Action_PartyChanged()
last = last + 40
local ExtraValid = numBars;
if HealBot_Config.EmergencyHeals == 1 then
- local order = {};
- local units = {};
+ local order = HealBot_GetTable();
+ local units = HealBot_GetTable();
if HealBot_Config.ShowHeader[HealBot_Config.Current_Skin] == 1 and HealBot_Config.ExtraOrder == 1 then
HeaderPos[i + 1] = HEALBOT_OPTIONS_EMERGENCYHEALS
numBars = numBars + 1;
@@ -804,6 +799,8 @@ function HealBot_Action_PartyChanged()
if i == last then break end
end
end
+ HealBot_ReleaseTable(order);
+ HealBot_ReleaseTable(units);
end
if numBars == PetsValid + 1 and HealBot_Config.ShowHeader[HealBot_Config.Current_Skin] == 1 then
HeaderPos[PetsValid + 1] = nil;
@@ -968,6 +965,7 @@ function HealBot_Action_PartyChanged()
HidePartyFrame();
end
HealBot_Action_RefreshButtons();
+ HealBot_ReleaseTable(HeaderPos);
HealBot_Action_ShowFrame();
end
diff --git a/README.md b/README.md
index be92b99..f30f68a 100644
--- a/README.md
+++ b/README.md
@@ -49,11 +49,16 @@ Default installation path: `C:\Program Files\World of Warcraft\Interface\AddOns\
### Change Log
+**v1.7.0**
+* **External Addon Integrations** - Added a new 'Extras' tab in Options to optionally enable integrations with `UnitXP_SP3` (for ultra-precise 3D range and Line of Sight checks) and `nampower` (for accurate real-time heal/buff tracking).
+* **UI Layout** - Widened the Options UI and neatly centered elements to accommodate the new integrations tab.
+
**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.
+* **Bug Fix - Buff Watch Self** - Fixed an issue where the "Self Only" toggle for watched buffs failed to load visually across sessions.
**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.
From dc2f0ca08906a94f379770fc4d6f61d6e29a257c Mon Sep 17 00:00:00 2001
From: Bluewhale1337 <295648290+Bluewhale1337@users.noreply.github.com>
Date: Mon, 17 Aug 2026 23:33:20 +0200
Subject: [PATCH 02/22] Implemented modular external addon integration system
for UnitXP, Nampower, and SuperWoW support.
---
HealBot_Controller_Events.lua | 5 ++
HealBot_Controller_Range.lua | 9 ++-
HealBot_Data.lua | 1 +
HealBot_Integrations.lua | 76 ++++++++++++++++++++++++-
HealBot_Model.lua | 95 +++++++++++++++++++++++++++++++-
HealBot_Options_Integrations.lua | 1 +
HealBot_Options_Integrations.xml | 19 +++++++
README.md | 11 +++-
8 files changed, 208 insertions(+), 9 deletions(-)
diff --git a/HealBot_Controller_Events.lua b/HealBot_Controller_Events.lua
index 5d76946..830392e 100644
--- a/HealBot_Controller_Events.lua
+++ b/HealBot_Controller_Events.lua
@@ -388,6 +388,11 @@ function HealBot_OnEvent_PlayerTargetChanged(this)
end
function HealBot_OnEvent_PartyMembersChanged(this)
+ HealBot_Model:PreserveStateByGUID()
+ HealBot_Integrations_PruneNampower()
+ if HealBot_IsFighting then
+ HealBot_Action_PartyChanged()
+ end
HealBot_Delay_RecalcParty = 1;
end
diff --git a/HealBot_Controller_Range.lua b/HealBot_Controller_Range.lua
index d24a191..2a95219 100644
--- a/HealBot_Controller_Range.lua
+++ b/HealBot_Controller_Range.lua
@@ -15,9 +15,12 @@ function HealBot_Range_Check(unit, range)
if ( unit == "player" ) then
return_val = 1;
elseif HealBot_Integrations_UnitXP_Active then
- local dist = UnitXP("distanceBetween", "player", unit, "Gaussian")
- if dist and dist <= range then
- return_val = 1;
+ local inSight = UnitXP("inSight", "player", unit)
+ if inSight then
+ local dist = UnitXP("distanceBetween", "player", unit, "Gaussian")
+ if dist and dist <= range then
+ return_val = 1;
+ end
end
elseif ( UnitIsVisible(unit) == 1 ) then
local tx, ty = GetPlayerMapPosition(unit)
diff --git a/HealBot_Data.lua b/HealBot_Data.lua
index c5ea038..7737148 100644
--- a/HealBot_Data.lua
+++ b/HealBot_Data.lua
@@ -257,6 +257,7 @@ HealBot_ConfigDefaults = {
HideParty = 0,
HealBot_Integrations_UnitXP = 0,
HealBot_Integrations_Nampower = 0,
+ HealBot_Integrations_SuperWoW = 0,
};
HealBot_Config = {};
diff --git a/HealBot_Integrations.lua b/HealBot_Integrations.lua
index 028bcce..d1926a9 100644
--- a/HealBot_Integrations.lua
+++ b/HealBot_Integrations.lua
@@ -15,9 +15,83 @@ function HealBot_Integrations_Toggle()
if HealBot_Config.HealBot_Integrations_Nampower == 1 then
HealBot_Integrations_Nampower_Active = true;
HealBot_AddDebug("nampower Integration: ENABLED");
- -- Add Nampower specific initialization here later
+ if not HealBot_NampowerFrame then
+ HealBot_Nampower_Auras = {}
+ HealBot_NampowerFrame = CreateFrame("Frame")
+ HealBot_NampowerFrame:RegisterEvent("AURA_CAST_ON_SELF")
+ HealBot_NampowerFrame:RegisterEvent("AURA_CAST_ON_OTHER")
+ HealBot_NampowerFrame:SetScript("OnEvent", function()
+ if not HealBot_Integrations_Nampower_Active then return end
+ local spellID, caster, target, _, _, _, _, duration = arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8
+ if not caster or not target or duration <= 0 then return end
+
+ local spellName = GetSpellRecField(spellID, "name")
+ if not spellName then return end
+
+ if not HealBot_Nampower_Auras[target] then
+ HealBot_Nampower_Auras[target] = {}
+ end
+
+ local expirationTime = GetTime() + (duration / 1000)
+ HealBot_Nampower_Auras[target][spellName] = expirationTime
+
+ local unitID = HealBot_Model:GetUnitIDByName(target)
+ if unitID then
+ HealBot_OnEvent_UnitAura(nil, unitID)
+ end
+ end)
+ end
else
HealBot_Integrations_Nampower_Active = false;
HealBot_AddDebug("nampower Integration: DISABLED");
+ if HealBot_Nampower_Auras then
+ for k in pairs(HealBot_Nampower_Auras) do
+ HealBot_Nampower_Auras[k] = nil
+ end
+ end
+ end
+
+
+
+function HealBot_Integrations_PruneNampower()
+ if not HealBot_Integrations_Nampower_Active or not HealBot_Nampower_Auras then return end
+
+ local currentTime = GetTime()
+ for targetName, auras in pairs(HealBot_Nampower_Auras) do
+ -- Check if target is still in the raid/party
+ if not HealBot_Model:GetUnitIDByName(targetName) then
+ HealBot_Nampower_Auras[targetName] = nil
+ else
+ -- Prune expired auras
+ local hasAuras = false
+ for spellName, expiration in pairs(auras) do
+ if currentTime > expiration then
+ auras[spellName] = nil
+ else
+ hasAuras = true
+ end
+ end
+ if not hasAuras then
+ HealBot_Nampower_Auras[targetName] = nil
+ end
+ end
+ end
+end
+
+ -- SuperWoW
+ if HealBot_Config.HealBot_Integrations_SuperWoW == 1 and UnitExists ~= nil then
+ -- We can check if GetUnitGUID exists as a quick SuperWoW test, or UnitExists returns 2 args
+ -- Actually SuperWoW adds SpellInfo, or we can just rely on GetUnitGUID if it exists in the environment
+ if GetUnitGUID or (type(UnitExists) == "function") then
+ -- If the client actually supports GUID tracking via SuperWoW (or a similar mod)
+ HealBot_Integrations_SuperWoW_Active = true;
+ HealBot_AddDebug("SuperWoW Integration: ENABLED");
+ else
+ HealBot_Integrations_SuperWoW_Active = false;
+ HealBot_AddDebug("SuperWoW Integration: DISABLED (Mod Not Found)");
+ end
+ else
+ HealBot_Integrations_SuperWoW_Active = false;
+ HealBot_AddDebug("SuperWoW Integration: DISABLED");
end
end
diff --git a/HealBot_Model.lua b/HealBot_Model.lua
index 7fca64a..259a52b 100644
--- a/HealBot_Model.lua
+++ b/HealBot_Model.lua
@@ -35,7 +35,11 @@ HealBot_Model = {
partyMembers = {},
raidMembers = {},
playerPet = nil,
- target = nil
+ target = nil,
+
+ -- Integration maps
+ unitGUIDs = {}, -- unit -> GUID
+ guidUnits = {} -- GUID -> unit
}
--------------------------------------------------------------------------------
@@ -131,18 +135,105 @@ function HealBot_Model:UpdateUnitIdentity(unit)
if not self.units[unit] then return false end
local oldName = self.units[unit].name
+ local oldEnglishClass = self.units[unit].englishClass
local name = UnitName(unit)
local _, englishClass = UnitClass(unit)
- if oldName ~= name then
+ if oldName ~= name or oldEnglishClass ~= englishClass then
self.units[unit].name = name
self.units[unit].englishClass = englishClass
self.units[unit].class = UnitClass(unit)
+
+ if HealBot_Integrations_SuperWoW_Active and GetUnitGUID then
+ local guid = GetUnitGUID(unit)
+ if guid then
+ self.unitGUIDs[unit] = guid
+ self.guidUnits[guid] = unit
+ end
+ end
return true -- Identity changed
end
return false
end
+function HealBot_Model:GetUnitByGUID(guid)
+ if not guid then return nil end
+ return self.guidUnits[guid]
+end
+
+function HealBot_Model:GetUnitIDByName(name)
+ if not name then return nil end
+ for unit, data in pairs(self.units) do
+ if data.name == name then return unit end
+ end
+ return nil
+end
+
+function HealBot_Model:PreserveStateByGUID()
+ if not HealBot_Integrations_SuperWoW_Active or not GetUnitGUID then return end
+
+ local oldGUIDs = {}
+ for unit, guid in pairs(self.unitGUIDs) do
+ oldGUIDs[unit] = guid
+ end
+
+ local newUnitForGUID = {}
+ -- Scan the new roster
+ for _, unit in ipairs(self.partyMembers) do
+ local guid = GetUnitGUID(unit)
+ if guid then
+ newUnitForGUID[guid] = unit
+ self.unitGUIDs[unit] = guid
+ self.guidUnits[guid] = unit
+ end
+ end
+ for _, unit in ipairs(self.raidMembers) do
+ local guid = GetUnitGUID(unit)
+ if guid then
+ newUnitForGUID[guid] = unit
+ self.unitGUIDs[unit] = guid
+ self.guidUnits[guid] = unit
+ end
+ end
+
+ local stateSwaps = {}
+ local iconSwaps = {}
+ local missingBuffSwaps = {}
+ local debuffSwaps = {}
+
+ for oldUnit, guid in pairs(oldGUIDs) do
+ local newUnit = newUnitForGUID[guid]
+ if newUnit and newUnit ~= oldUnit then
+ stateSwaps[newUnit] = self.units[oldUnit]
+
+ -- Preserve external global tables if they exist
+ if HealBot_UnitIcons and HealBot_UnitIcons[oldUnit] then
+ iconSwaps[newUnit] = HealBot_UnitIcons[oldUnit]
+ end
+ if HealBot_MissingBuffs and HealBot_MissingBuffs[oldUnit] ~= nil then
+ missingBuffSwaps[newUnit] = HealBot_MissingBuffs[oldUnit]
+ end
+ if HealBot_UnitDebuff and HealBot_UnitDebuff[oldUnit] ~= nil then
+ debuffSwaps[newUnit] = HealBot_UnitDebuff[oldUnit]
+ end
+ end
+ end
+
+ for targetUnit, stateData in pairs(stateSwaps) do
+ self.units[targetUnit] = stateData
+
+ if HealBot_UnitIcons then
+ HealBot_UnitIcons[targetUnit] = iconSwaps[targetUnit]
+ end
+ if HealBot_MissingBuffs then
+ HealBot_MissingBuffs[targetUnit] = missingBuffSwaps[targetUnit]
+ end
+ if HealBot_UnitDebuff then
+ HealBot_UnitDebuff[targetUnit] = debuffSwaps[targetUnit]
+ end
+ end
+end
+
-- Updates health/maxHealth values. Returns true if changed.
function HealBot_Model:UpdateUnitHealth(unit)
if not self.units[unit] then return false end
diff --git a/HealBot_Options_Integrations.lua b/HealBot_Options_Integrations.lua
index f93f5de..31f23b2 100644
--- a/HealBot_Options_Integrations.lua
+++ b/HealBot_Options_Integrations.lua
@@ -1,4 +1,5 @@
function HealBot_Options_Integrations_OnShow(this)
HealBot_Options_Integrations_UnitXP:SetChecked(HealBot_Config.HealBot_Integrations_UnitXP);
HealBot_Options_Integrations_Nampower:SetChecked(HealBot_Config.HealBot_Integrations_Nampower);
+ HealBot_Options_Integrations_SuperWoW:SetChecked(HealBot_Config.HealBot_Integrations_SuperWoW);
end
diff --git a/HealBot_Options_Integrations.xml b/HealBot_Options_Integrations.xml
index d4e3154..a990483 100644
--- a/HealBot_Options_Integrations.xml
+++ b/HealBot_Options_Integrations.xml
@@ -42,6 +42,25 @@
+
+
+
+
+
+
+
+
+
+
+ getglobal(this:GetName().."Text"):SetText("Enable SuperWoW Integration (GUID Tracking)");
+
+
+ HealBot_Config.HealBot_Integrations_SuperWoW = this:GetChecked() and 1 or 0;
+ HealBot_Integrations_Toggle();
+
+
+
+
diff --git a/README.md b/README.md
index f30f68a..c4393b9 100644
--- a/README.md
+++ b/README.md
@@ -39,8 +39,7 @@ Default installation path: `C:\Program Files\World of Warcraft\Interface\AddOns\
* **Highly Customizable Skins:** Fully configure dimensions (width, height), row spacing, column layouts, custom textures, opacity, class-colored frames, and outline of fonts.
### To be implemented
-- **GUID-based frame mapping:** Migrate internal state to use lightweight GUID tracking to resolve bugs when targets switch or duplicate names appear (e.g., enemy mobs, warlock pets).
-- **Mod Integration Optimization:** Add conditional SuperWoW/UnitXP SP3 integration to reduce GC spikes and improve frame rendering accuracy.
+- **Strategy Pattern / Code Tree Splits:** Migrate heavy mod integrations (like Nampower aura tracking and SuperWoW UI rendering) into isolated code trees (e.g., `HealBot_Model_SuperWoW.lua`). This will allow dynamic overwriting of global functions at startup, eliminating the CPU overhead of running `if integration then` branch checks inside high-frequency update loops on Vanilla clients.
### Known issues
@@ -50,8 +49,14 @@ Default installation path: `C:\Program Files\World of Warcraft\Interface\AddOns\
### Change Log
**v1.7.0**
-* **External Addon Integrations** - Added a new 'Extras' tab in Options to optionally enable integrations with `UnitXP_SP3` (for ultra-precise 3D range and Line of Sight checks) and `nampower` (for accurate real-time heal/buff tracking).
+* **Integrations UI** - Added a new 'Extras' tab in the Options menu to easily toggle external mod integrations.
+* **UnitXP_SP3 Integration** - Added optional support for UnitXP's API to provide ultra-precise 3D range finding and strict Line of Sight (LoS) checks. This completely bypasses the limitations of Vanilla's 2D map coordinate distance checks.
+* **Nampower Integration** - Implemented background aura tracking to map explicit HoT expiration timestamps directly from nampower. This allows for accurate real-time heal and buff tracking instead of estimating based on cast times.
+* **SuperWoW Integration** - Added robust GUID-based state tracking leveraging SuperWoW's enhanced API. This tracks players by their unique IDs rather than volatile unit strings.
* **UI Layout** - Widened the Options UI and neatly centered elements to accommodate the new integrations tab.
+* **Bug Fix - Class Colors** - Fixed a bug where class colors failed to apply to new units due to a delayed server response.
+* **Bug Fix - Combat Updates** - Fixed an issue where new party members joining mid-combat failed to append to the grid without dropping combat.
+* **Bug Fix - Target Swaps** - Implemented optional SuperWoW GUID-based state preservation to prevent UI tracking bugs when group members are rearranged during combat.
**v1.6.3**
* **Hotfix string splitter** - added falback for string splitter if the the string is empty or nil.
From d0e027ec12f107c437f394a00d33e4ea53cce237 Mon Sep 17 00:00:00 2001
From: Bluewhale1337 <295648290+Bluewhale1337@users.noreply.github.com>
Date: Tue, 18 Aug 2026 18:11:54 +0200
Subject: [PATCH 03/22] added ClassicAPI integration for enhanced distance
checking, healing bonuses, and Focus unit support - overrides some
functionality of other integrations
---
HealBot_Controller_Range.lua | 8 ++++++++
HealBot_Controller_Spells.lua | 7 ++++++-
HealBot_Data.lua | 1 +
HealBot_Integrations.lua | 26 ++++++++++++++++++++++++++
HealBot_Model.lua | 10 +++++-----
HealBot_Options_Integrations.lua | 1 +
HealBot_Options_Integrations.xml | 19 +++++++++++++++++++
HealBot_View_Layout.lua | 29 +++++++++++++++++++++++++++++
README.md | 1 +
9 files changed, 96 insertions(+), 6 deletions(-)
diff --git a/HealBot_Controller_Range.lua b/HealBot_Controller_Range.lua
index 2a95219..aff7caf 100644
--- a/HealBot_Controller_Range.lua
+++ b/HealBot_Controller_Range.lua
@@ -14,6 +14,14 @@ function HealBot_Range_Check(unit, range)
end
if ( unit == "player" ) then
return_val = 1;
+ elseif HealBot_Integrations_ClassicAPI_Active and UnitDistanceSquared and UnitInLineOfSight then
+ local inSight = UnitInLineOfSight("player", unit)
+ if inSight then
+ local distSq = UnitDistanceSquared(unit)
+ if distSq and distSq <= (range * range) then
+ return_val = 1;
+ end
+ end
elseif HealBot_Integrations_UnitXP_Active then
local inSight = UnitXP("inSight", "player", unit)
if inSight then
diff --git a/HealBot_Controller_Spells.lua b/HealBot_Controller_Spells.lua
index 2205af4..e819867 100644
--- a/HealBot_Controller_Spells.lua
+++ b/HealBot_Controller_Spells.lua
@@ -564,7 +564,12 @@ function HealBot_SpiBonus(spell)
end
function HealBot_GetBonus()
- local HealBonus = HealBot_BonusScanner:GetBonus() or 0;
+ local HealBonus = 0;
+ if HealBot_Integrations_ClassicAPI_Active and GetSpellBonusHealing then
+ HealBonus = GetSpellBonusHealing() or 0;
+ else
+ HealBonus = HealBot_BonusScanner:GetBonus() or 0;
+ end
if UnitClass("player") == "PALADIN" then
local ironRank = HealBot_GetTalentRank("Ironclad")
if ironRank > 0 then
diff --git a/HealBot_Data.lua b/HealBot_Data.lua
index 7737148..15fac96 100644
--- a/HealBot_Data.lua
+++ b/HealBot_Data.lua
@@ -258,6 +258,7 @@ HealBot_ConfigDefaults = {
HealBot_Integrations_UnitXP = 0,
HealBot_Integrations_Nampower = 0,
HealBot_Integrations_SuperWoW = 0,
+ HealBot_Integrations_ClassicAPI = 0,
};
HealBot_Config = {};
diff --git a/HealBot_Integrations.lua b/HealBot_Integrations.lua
index d1926a9..0a1a24b 100644
--- a/HealBot_Integrations.lua
+++ b/HealBot_Integrations.lua
@@ -1,5 +1,17 @@
HealBot_Integrations_UnitXP_Active = false;
HealBot_Integrations_Nampower_Active = false;
+HealBot_Integrations_SuperWoW_Active = false;
+HealBot_Integrations_ClassicAPI_Active = false;
+
+function HealBot_GetUnitGUID(unit)
+ if not unit then return nil end
+ if HealBot_Integrations_ClassicAPI_Active and UnitGUID then
+ return UnitGUID(unit)
+ elseif HealBot_Integrations_SuperWoW_Active and GetUnitGUID then
+ return GetUnitGUID(unit)
+ end
+ return nil
+end
function HealBot_Integrations_Toggle()
-- UnitXP
@@ -94,4 +106,18 @@ end
HealBot_Integrations_SuperWoW_Active = false;
HealBot_AddDebug("SuperWoW Integration: DISABLED");
end
+
+ -- ClassicAPI
+ if HealBot_Config.HealBot_Integrations_ClassicAPI == 1 then
+ if UnitGUID then
+ HealBot_Integrations_ClassicAPI_Active = true;
+ HealBot_AddDebug("ClassicAPI Integration: ENABLED");
+ else
+ HealBot_Integrations_ClassicAPI_Active = false;
+ HealBot_AddDebug("ClassicAPI Integration: DISABLED (Mod Not Found)");
+ end
+ else
+ HealBot_Integrations_ClassicAPI_Active = false;
+ HealBot_AddDebug("ClassicAPI Integration: DISABLED");
+ end
end
diff --git a/HealBot_Model.lua b/HealBot_Model.lua
index 259a52b..ac3dc17 100644
--- a/HealBot_Model.lua
+++ b/HealBot_Model.lua
@@ -144,8 +144,8 @@ function HealBot_Model:UpdateUnitIdentity(unit)
self.units[unit].englishClass = englishClass
self.units[unit].class = UnitClass(unit)
- if HealBot_Integrations_SuperWoW_Active and GetUnitGUID then
- local guid = GetUnitGUID(unit)
+ if (HealBot_Integrations_SuperWoW_Active or HealBot_Integrations_ClassicAPI_Active) and HealBot_GetUnitGUID then
+ local guid = HealBot_GetUnitGUID(unit)
if guid then
self.unitGUIDs[unit] = guid
self.guidUnits[guid] = unit
@@ -170,7 +170,7 @@ function HealBot_Model:GetUnitIDByName(name)
end
function HealBot_Model:PreserveStateByGUID()
- if not HealBot_Integrations_SuperWoW_Active or not GetUnitGUID then return end
+ if not (HealBot_Integrations_SuperWoW_Active or HealBot_Integrations_ClassicAPI_Active) or not HealBot_GetUnitGUID then return end
local oldGUIDs = {}
for unit, guid in pairs(self.unitGUIDs) do
@@ -180,7 +180,7 @@ function HealBot_Model:PreserveStateByGUID()
local newUnitForGUID = {}
-- Scan the new roster
for _, unit in ipairs(self.partyMembers) do
- local guid = GetUnitGUID(unit)
+ local guid = HealBot_GetUnitGUID(unit)
if guid then
newUnitForGUID[guid] = unit
self.unitGUIDs[unit] = guid
@@ -188,7 +188,7 @@ function HealBot_Model:PreserveStateByGUID()
end
end
for _, unit in ipairs(self.raidMembers) do
- local guid = GetUnitGUID(unit)
+ local guid = HealBot_GetUnitGUID(unit)
if guid then
newUnitForGUID[guid] = unit
self.unitGUIDs[unit] = guid
diff --git a/HealBot_Options_Integrations.lua b/HealBot_Options_Integrations.lua
index 31f23b2..e8a6ecd 100644
--- a/HealBot_Options_Integrations.lua
+++ b/HealBot_Options_Integrations.lua
@@ -2,4 +2,5 @@ function HealBot_Options_Integrations_OnShow(this)
HealBot_Options_Integrations_UnitXP:SetChecked(HealBot_Config.HealBot_Integrations_UnitXP);
HealBot_Options_Integrations_Nampower:SetChecked(HealBot_Config.HealBot_Integrations_Nampower);
HealBot_Options_Integrations_SuperWoW:SetChecked(HealBot_Config.HealBot_Integrations_SuperWoW);
+ HealBot_Options_Integrations_ClassicAPI:SetChecked(HealBot_Config.HealBot_Integrations_ClassicAPI);
end
diff --git a/HealBot_Options_Integrations.xml b/HealBot_Options_Integrations.xml
index a990483..00d73d3 100644
--- a/HealBot_Options_Integrations.xml
+++ b/HealBot_Options_Integrations.xml
@@ -61,6 +61,25 @@
+
+
+
+
+
+
+
+
+
+
+ getglobal(this:GetName().."Text"):SetText("Enable ClassicAPI Integration (+Healing/Focus/Distance)");
+
+
+ HealBot_Config.HealBot_Integrations_ClassicAPI = this:GetChecked() and 1 or 0;
+ HealBot_Integrations_Toggle();
+
+
+
+
diff --git a/HealBot_View_Layout.lua b/HealBot_View_Layout.lua
index d73562b..4f20b39 100644
--- a/HealBot_View_Layout.lua
+++ b/HealBot_View_Layout.lua
@@ -12,7 +12,9 @@ HealBot_Action_HealGroup = {
"party4",
};
+HealBot_Action_HealGroup = {};
HealBot_Action_HealTarget = {};
+HealBot_Action_HealFocus = {};
HealBot_Action_HealButtons = {};
HealBot_Action_UnitButtons = {};
@@ -589,6 +591,32 @@ function HealBot_Action_PartyChanged()
numBars = numBars + 1;
numHeaders = numHeaders + 1;
end
+
+ -- Focus
+ local FocusValid = numBars;
+ if HealBot_Integrations_ClassicAPI_Active and FocusUnit then
+ if HealBot_Config.ShowHeader[HealBot_Config.Current_Skin] == 1 then
+ HeaderPos[i + 1] = "Focus"
+ end
+ if HealBot_MayHeal("focus") then
+ i = i + 1;
+ h = h + 1;
+ if h < 61 then
+ HealBot_Action_SetHealButton(h, "focus");
+ local check = getglobal("HealBot_Action_HealUnit" .. h .. "Check");
+ check:SetChecked(0);
+ check.unit = "focus";
+ check:Show();
+ else
+ HealBot_Action_SetHealButton(i, "focus");
+ end
+ numBars = numBars + 1;
+ end
+ end
+ if numBars > FocusValid and HealBot_Config.ShowHeader[HealBot_Config.Current_Skin] == 1 then
+ numBars = numBars + 1;
+ numHeaders = numHeaders + 1;
+ end
last = last + 40
local ExtraValid = numBars;
@@ -985,6 +1013,7 @@ function HealBot_Action_Reset()
HealBot_Action:ClearAllPoints();
HealBot_Action:SetPoint("TOP", "MinimapCluster", "BOTTOM", 7, 10);
HealBot_Action_HealTarget = {};
+ HealBot_Action_HealFocus = {};
HealBot_Action_PartyChanged();
end
diff --git a/README.md b/README.md
index c4393b9..296e20f 100644
--- a/README.md
+++ b/README.md
@@ -53,6 +53,7 @@ Default installation path: `C:\Program Files\World of Warcraft\Interface\AddOns\
* **UnitXP_SP3 Integration** - Added optional support for UnitXP's API to provide ultra-precise 3D range finding and strict Line of Sight (LoS) checks. This completely bypasses the limitations of Vanilla's 2D map coordinate distance checks.
* **Nampower Integration** - Implemented background aura tracking to map explicit HoT expiration timestamps directly from nampower. This allows for accurate real-time heal and buff tracking instead of estimating based on cast times.
* **SuperWoW Integration** - Added robust GUID-based state tracking leveraging SuperWoW's enhanced API. This tracks players by their unique IDs rather than volatile unit strings.
+* **ClassicAPI Integration** - Added support for ClassicAPI to natively inject accurate +Healing bonuses, ultra-fast 3D distance checks (`UnitDistanceSquared`), and a dedicated Focus frame for pinning Main Tanks without requiring additional memory-heavy addons.
* **UI Layout** - Widened the Options UI and neatly centered elements to accommodate the new integrations tab.
* **Bug Fix - Class Colors** - Fixed a bug where class colors failed to apply to new units due to a delayed server response.
* **Bug Fix - Combat Updates** - Fixed an issue where new party members joining mid-combat failed to append to the grid without dropping combat.
From b3c2b4a0962e9db6802a01bc241a09e661eee12c Mon Sep 17 00:00:00 2001
From: Bluewhale1337 <295648290+Bluewhale1337@users.noreply.github.com>
Date: Sat, 22 Aug 2026 17:18:48 +0200
Subject: [PATCH 04/22] fix: resolve UI rendering crashes, address unit frame
aliasing bugs, and implement automatic debuff tracking with lazy-load
identity fetches.
---
HealBot_Action.lua | 6 +++
HealBot_Controller_Aura.lua | 71 ++++++++++++++++++++++++++++-------
HealBot_Controller_Events.lua | 23 +++++++++---
HealBot_Model.lua | 26 +++++++++----
HealBot_Options_CDC.lua | 22 +++--------
HealBot_View_Layout.lua | 45 ++++++++++++++++------
README.md | 15 ++++----
7 files changed, 145 insertions(+), 63 deletions(-)
diff --git a/HealBot_Action.lua b/HealBot_Action.lua
index ddcc0f6..2c9489d 100644
--- a/HealBot_Action.lua
+++ b/HealBot_Action.lua
@@ -205,6 +205,12 @@ function HealBot_Action_HealUnit_OnClick(this,button)
end
end
+ -- Special cases for targeting
+ if string.lower(pattern) == "target" or string.lower(pattern) == "/target" then
+ TargetUnit(this.unit)
+ return
+ end
+
-- Priority 1: Inline Scripts (starts with /)
if string.sub(pattern, 1, 1) == "/" then
local oldTarget = nil
diff --git a/HealBot_Controller_Aura.lua b/HealBot_Controller_Aura.lua
index 6e84e14..d89b237 100644
--- a/HealBot_Controller_Aura.lua
+++ b/HealBot_Controller_Aura.lua
@@ -155,10 +155,21 @@ local HealBot_TrackedHoTs = {
["Interface\\Icons\\Spell_Holy_AshesToAshes"] = true,
}
+local HealBot_DebuffTypeMap = nil
+
function HealBot_OnEvent_UnitAura(this, unit)
+ if not HealBot_DebuffTypeMap then
+ HealBot_DebuffTypeMap = {
+ [HEALBOT_DISEASE] = HEALBOT_DISEASE_en,
+ [HEALBOT_MAGIC] = HEALBOT_MAGIC_en,
+ [HEALBOT_POISON] = HEALBOT_POISON_en,
+ [HEALBOT_CURSE] = HEALBOT_CURSE_en
+ }
+ end
+
local DebuffType;
- if HealBot_Heals[unit] and unit ~= "target" then
+ if HealBot_Heals[unit] then
if not HealBot_UnitIcons[unit] then
HealBot_UnitIcons[unit] = {}
end
@@ -168,17 +179,43 @@ function HealBot_OnEvent_UnitAura(this, unit)
local iconCount = 0
local i = 1;
HealBot_UnitDebuff[unit] = nil;
+
while true do
- local debuff, tmp, debuff_type = UnitDebuff(unit, i, 1)
+ local debuff, tmp, debuff_type = UnitDebuff(unit, i)
if debuff then
- if iconCount < 10 then
- iconCount = iconCount + 1
- HealBot_UnitIcons[unit][iconCount] = debuff
+ local mapped_type = nil
+ if debuff_type then
+ mapped_type = HealBot_DebuffTypeMap[debuff_type] or debuff_type
end
- 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
+
+ local unitClass = HealBot_Model.units[unit] and HealBot_Model.units[unit].class or UnitClass(unit)
+ local shouldTrack = false
+ if unit == "target" then
+ shouldTrack = true
+ elseif HealBot_CDCInc[unitClass] == 1 then
+ shouldTrack = true
+ elseif not unitClass or HealBot_CDCInc[unitClass] == nil then
+ shouldTrack = true
+ end
+
+ if shouldTrack and mapped_type and HealBot_DebuffWatch[mapped_type] then
+ if iconCount < 10 then
+ iconCount = iconCount + 1
+ HealBot_UnitIcons[unit][iconCount] = debuff
+ end
+ HealBot_UnitDebuff[unit] = mapped_type
+ DebuffType = mapped_type;
+
+ local isPriority = false
+ if HealBot_DebuffPriority then
+ for _, pType in ipairs(HealBot_DebuffPriority) do
+ if pType == mapped_type then
+ isPriority = true
+ break
+ end
+ end
+ end
+ if isPriority then
break
end
end
@@ -213,16 +250,22 @@ function HealBot_OnEvent_UnitAura(this, unit)
if HealBot_UnitDebuff[unit] then
if DebuffType and HealBot_Range_Check(unit, 27) == 1 then
if HealBot_Config.ShowDebuffWarning == 1 then
+ local color = HealBot_Config.CDCBarColour[DebuffType]
+ local r, g, b = 1, 0, 0
+ if color then
+ r, g, b = color.R, color.G, color.B
+ end
UIErrorsFrame:AddMessage(UnitName(unit) .. " suffers from " .. DebuffType,
- HealBot_Config.CDCBarColour[DebuffType].R,
- HealBot_Config.CDCBarColour[DebuffType].G,
- HealBot_Config.CDCBarColour[DebuffType].B,
+ r, g, b,
1, UIERRORS_HOLD_TIME);
end
if HealBot_Config.SoundDebuffWarning == 1 then HealBot_PlaySound(HealBot_Config.SoundDebuffPlay); end
end
end
- HealBot_CheckBuffs(unit);
- HealBot_RecalcHeals(unit);
+ -- Check buffs synchronously because tooltip scanning fails in OnUpdate
+ HealBot_CheckBuffs(unit)
+
+ -- Defer UI updates
+ HealBot_View_DirtyUnits[unit] = true
end
end
diff --git a/HealBot_Controller_Events.lua b/HealBot_Controller_Events.lua
index 830392e..2ea3668 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
@@ -74,11 +75,23 @@ function HealBot_OnUpdate(this, arg1)
end
-- Process Dirty Queue for MVC View
- local unitID, _ = next(HealBot_View_DirtyUnits)
- while unitID do
- HealBot_Action_RefreshButtons(unitID)
+ local unitsToRefresh = {}
+ for unitID in pairs(HealBot_View_DirtyUnits) do
+ unitsToRefresh[unitID] = true
HealBot_View_DirtyUnits[unitID] = nil
- unitID, _ = next(HealBot_View_DirtyUnits)
+ HealBot_View_DirtyPower[unitID] = nil -- No need to do power-only if full refresh is queued
+ end
+ for unitID in pairs(unitsToRefresh) do
+ HealBot_Action_Refresh(unitID)
+ end
+
+ local powerToRefresh = {}
+ for unitID in pairs(HealBot_View_DirtyPower) do
+ powerToRefresh[unitID] = true
+ HealBot_View_DirtyPower[unitID] = nil
+ end
+ for unitID in pairs(powerToRefresh) do
+ HealBot_Action_RefreshPower(unitID)
end
if HealBot_EquipChangeTimer > 0 then
diff --git a/HealBot_Model.lua b/HealBot_Model.lua
index ac3dc17..830e2c5 100644
--- a/HealBot_Model.lua
+++ b/HealBot_Model.lua
@@ -146,7 +146,7 @@ function HealBot_Model:UpdateUnitIdentity(unit)
if (HealBot_Integrations_SuperWoW_Active or HealBot_Integrations_ClassicAPI_Active) and HealBot_GetUnitGUID then
local guid = HealBot_GetUnitGUID(unit)
- if guid then
+ if guid and guid ~= "0" and guid ~= "0x0000000000000000" then
self.unitGUIDs[unit] = guid
self.guidUnits[guid] = unit
end
@@ -174,14 +174,16 @@ function HealBot_Model:PreserveStateByGUID()
local oldGUIDs = {}
for unit, guid in pairs(self.unitGUIDs) do
- oldGUIDs[unit] = guid
+ if string.find(unit, "^party") or string.find(unit, "^raid") or unit == "player" or unit == "pet" then
+ oldGUIDs[unit] = guid
+ end
end
local newUnitForGUID = {}
-- Scan the new roster
for _, unit in ipairs(self.partyMembers) do
local guid = HealBot_GetUnitGUID(unit)
- if guid then
+ if guid and guid ~= "0" and guid ~= "0x0000000000000000" then
newUnitForGUID[guid] = unit
self.unitGUIDs[unit] = guid
self.guidUnits[guid] = unit
@@ -189,7 +191,7 @@ function HealBot_Model:PreserveStateByGUID()
end
for _, unit in ipairs(self.raidMembers) do
local guid = HealBot_GetUnitGUID(unit)
- if guid then
+ if guid and guid ~= "0" and guid ~= "0x0000000000000000" then
newUnitForGUID[guid] = unit
self.unitGUIDs[unit] = guid
self.guidUnits[guid] = unit
@@ -220,10 +222,18 @@ function HealBot_Model:PreserveStateByGUID()
end
for targetUnit, stateData in pairs(stateSwaps) do
- self.units[targetUnit] = stateData
-
- if HealBot_UnitIcons then
- HealBot_UnitIcons[targetUnit] = iconSwaps[targetUnit]
+ -- Deep copy to prevent memory aliasing
+ self.units[targetUnit] = {}
+ for k, v in pairs(stateData) do
+ self.units[targetUnit][k] = v
+ end
+ self.units[targetUnit].icons = {}
+
+ if HealBot_UnitIcons and iconSwaps[targetUnit] then
+ if not HealBot_UnitIcons[targetUnit] then HealBot_UnitIcons[targetUnit] = {} end
+ for j=1, 10 do
+ HealBot_UnitIcons[targetUnit][j] = iconSwaps[targetUnit][j]
+ end
end
if HealBot_MissingBuffs then
HealBot_MissingBuffs[targetUnit] = missingBuffSwaps[targetUnit]
diff --git a/HealBot_Options_CDC.lua b/HealBot_Options_CDC.lua
index c52de4b..854bc9f 100644
--- a/HealBot_Options_CDC.lua
+++ b/HealBot_Options_CDC.lua
@@ -244,22 +244,12 @@ function HealBot_Options_CDC_SetCombo(spell, button, class)
HealBot_Options_KeyCombo_Change()
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 }
- if spell ~= "None" 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
- table.foreach(HealBot_Debuff_Types[spell], function (index,debuff)
- HealBot_DebuffWatch[debuff]=true;
- end)
- end
- end
+ HealBot_DebuffWatch = {
+ [HEALBOT_DISEASE_en] = true,
+ [HEALBOT_MAGIC_en] = true,
+ [HEALBOT_POISON_en] = true,
+ [HEALBOT_CURSE_en] = true
+ }
end
function HealBot_Colorpick_OnClick(CDCType)
HealBot_ColourObjWaiting=CDCType;
diff --git a/HealBot_View_Layout.lua b/HealBot_View_Layout.lua
index 4f20b39..4283859 100644
--- a/HealBot_View_Layout.lua
+++ b/HealBot_View_Layout.lua
@@ -12,7 +12,6 @@ HealBot_Action_HealGroup = {
"party4",
};
-HealBot_Action_HealGroup = {};
HealBot_Action_HealTarget = {};
HealBot_Action_HealFocus = {};
HealBot_Action_HealButtons = {};
@@ -30,18 +29,21 @@ end
function HealBot_HealthColor(unit, hlth, maxhlth)
if HealBot_UnitDebuff[unit] then
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
+ local color = HealBot_Config.CDCBarColour[debuff_type]
+ if color then
+ local dr = color.R
+ local dg = color.G
+ local db = color.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
- return dr, dg, db, HealBot_Config.Barcola[HealBot_Config.Current_Skin];
end
local text = UnitName(unit);
@@ -102,6 +104,10 @@ function HealBot_Action_EnableButton(button)
local state = HealBot_Model.units[unit]
if not state then return end
+ if not state.englishClass then
+ HealBot_Model:UpdateUnitIdentity(unit)
+ end
+
local hlth = state.health
local maxhlth = state.maxHealth
local name = state.name
@@ -305,6 +311,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 296e20f..69dacb8 100644
--- a/README.md
+++ b/README.md
@@ -49,15 +49,14 @@ Default installation path: `C:\Program Files\World of Warcraft\Interface\AddOns\
### Change Log
**v1.7.0**
-* **Integrations UI** - Added a new 'Extras' tab in the Options menu to easily toggle external mod integrations.
-* **UnitXP_SP3 Integration** - Added optional support for UnitXP's API to provide ultra-precise 3D range finding and strict Line of Sight (LoS) checks. This completely bypasses the limitations of Vanilla's 2D map coordinate distance checks.
-* **Nampower Integration** - Implemented background aura tracking to map explicit HoT expiration timestamps directly from nampower. This allows for accurate real-time heal and buff tracking instead of estimating based on cast times.
-* **SuperWoW Integration** - Added robust GUID-based state tracking leveraging SuperWoW's enhanced API. This tracks players by their unique IDs rather than volatile unit strings.
-* **ClassicAPI Integration** - Added support for ClassicAPI to natively inject accurate +Healing bonuses, ultra-fast 3D distance checks (`UnitDistanceSquared`), and a dedicated Focus frame for pinning Main Tanks without requiring additional memory-heavy addons.
+* **External Addon Integrations** - Added a new 'Extras' tab in Options to optionally enable integrations with `UnitXP_SP3` (for ultra-precise 3D range and Line of Sight checks) and `nampower` (for accurate real-time heal/buff tracking).
* **UI Layout** - Widened the Options UI and neatly centered elements to accommodate the new integrations tab.
-* **Bug Fix - Class Colors** - Fixed a bug where class colors failed to apply to new units due to a delayed server response.
-* **Bug Fix - Combat Updates** - Fixed an issue where new party members joining mid-combat failed to append to the grid without dropping combat.
-* **Bug Fix - Target Swaps** - Implemented optional SuperWoW GUID-based state preservation to prevent UI tracking bugs when group members are rearranged during combat.
+* **Bug Fix - Rendering Crash** - Fixed a critical UI issue where unrecognized debuff types would crash the rendering loop, causing unit frames to disappear.
+* **Bug Fix - Missing Group Frames** - Fixed a layout initialization bug where the group unit array was accidentally cleared, causing the panel to draw 0 bars and shrink to a floating "Options" button.
+* **Bug Fix - Target State Aliasing** - Fixed a bug in `PreserveStateByGUID` where targeting a party member caused their frame to alias the target's state table in memory. This previously caused party frames to adopt enemy mob names and lose their class colors when changing targets.
+* **Bug Fix - Group Aliasing** - Fixed a bug where roster updates caused frames to share memory references, causing the UI to display the same player across multiple group slots.
+* **Bug Fix - Slow Client Init** - Fixed missing class colors after `/reload` by adding lazy-load identity fetches directly into the render pipeline for when `UnitClass` data is delayed by the server.
+* **Bug Fix - Debuff Tracking** - HealBot now automatically tracks all curable debuffs for the player's class out of the box. Previously, users had to manually assign a cure spell to a click binding to enable CDC debuff tracking.
**v1.6.3**
* **Hotfix string splitter** - added falback for string splitter if the the string is empty or nil.
From 9a033a1045eeef8ce06c7aac939c59000af5116a Mon Sep 17 00:00:00 2001
From: Bluewhale1337 <295648290+Bluewhale1337@users.noreply.github.com>
Date: Sun, 23 Aug 2026 15:24:14 +0200
Subject: [PATCH 05/22] docs: update changelog with additional addon
integrations for SuperWoW and ClassicAPI
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 69dacb8..8168d6d 100644
--- a/README.md
+++ b/README.md
@@ -49,7 +49,7 @@ Default installation path: `C:\Program Files\World of Warcraft\Interface\AddOns\
### Change Log
**v1.7.0**
-* **External Addon Integrations** - Added a new 'Extras' tab in Options to optionally enable integrations with `UnitXP_SP3` (for ultra-precise 3D range and Line of Sight checks) and `nampower` (for accurate real-time heal/buff tracking).
+* **External Addon Integrations** - Added a new 'Extras' tab in Options to optionally enable integrations with `UnitXP_SP3` (for ultra-precise 3D range and Line of Sight checks), `nampower` (for accurate real-time heal/buff tracking), `SuperWoW` (for robust GUID-based state tracking), and `ClassicAPI` (for native +Healing bonuses and fast 3D distance checks).
* **UI Layout** - Widened the Options UI and neatly centered elements to accommodate the new integrations tab.
* **Bug Fix - Rendering Crash** - Fixed a critical UI issue where unrecognized debuff types would crash the rendering loop, causing unit frames to disappear.
* **Bug Fix - Missing Group Frames** - Fixed a layout initialization bug where the group unit array was accidentally cleared, causing the panel to draw 0 bars and shrink to a floating "Options" button.
From d09e49d26adb0a5fc9494881029ac92971aedb2c Mon Sep 17 00:00:00 2001
From: Bluewhale1337 <295648290+Bluewhale1337@users.noreply.github.com>
Date: Mon, 24 Aug 2026 11:15:33 +0200
Subject: [PATCH 06/22] docs: update
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 8168d6d..6c5c14f 100644
--- a/README.md
+++ b/README.md
@@ -27,7 +27,7 @@ Default installation path: `C:\Program Files\World of Warcraft\Interface\AddOns\
* **Native Hovercasting (Mouseover):** Cast configured spells on hovered unit frames using keybinds directly from your action bars, without losing your current target. (Toggleable in Options -> General).
* **Macro, Item, & Script Bindings:** Bind named macros, inventory items, and scripts directly to mouse clicks. Supports implicit `@mouseover` targeting natively.
* **Zero-Latency Self-Heals:** Incoming heals for the local player process instantly with zero latency, independent of network lag.
-* **Talent-Based Calculations & Equipment Bonus:** Dynamic spell healing calculations for Druid, Priest, and Paladin based on talents, and automatically scans equipped gear to scale healing predictions - currently only TurtleWoW patch 1.18 supported.
+* **Talent-Based Calculations & Equipment Bonus:** Dynamic spell healing calculations for Druid, Priest, and Paladin based on talents, and automatically scans equipped gear to scale healing predictions.
* **Modifier-Aware Tooltips:** Tooltips dynamically update to show exact bound actions (Shift/Ctrl/Alt) and required mana costs (turns red if insufficient mana).
* **Blizzard Party Frame Toggle:** Toggle to automatically hide Blizzard's default party frames when in a group in favor of HealBot's layouts.
* **HoT & Buff Tracking:** Intelligently track active HoTs and buffs directly on the grid frames with custom icons (e.g., Renew, Rejuvenation, Regrowth, Fear Ward).
From 6d977f6963aa78d666c8dd2c005d93813c2e679f Mon Sep 17 00:00:00 2001
From: Bluewhale1337 <295648290+Bluewhale1337@users.noreply.github.com>
Date: Mon, 24 Aug 2026 12:42:23 +0200
Subject: [PATCH 07/22] docs: add function-level documentation comments across
various source files to improve the readability of codebase
---
HealBot.lua | 16 ++++++++++++
HealBot_Action.lua | 33 +++++++++++++++++++++++
HealBot_BonusScanner.lua | 10 +++++++
HealBot_Controller_Aura.lua | 4 +++
HealBot_Controller_Comms.lua | 7 +++++
HealBot_Controller_Events.lua | 22 ++++++++++++++++
HealBot_Controller_Range.lua | 2 ++
HealBot_Controller_Spells.lua | 28 ++++++++++++++++++++
HealBot_Data.lua | 2 ++
HealBot_Errors.lua | 6 +++++
HealBot_Integrations.lua | 2 ++
HealBot_Model.lua | 8 ++++++
HealBot_Options.lua | 14 ++++++++++
HealBot_Options_Auto.lua | 4 +++
HealBot_Options_Buffs.lua | 8 ++++++
HealBot_Options_CDC.lua | 27 +++++++++++++++++++
HealBot_Options_Chat.lua | 2 ++
HealBot_Options_General.lua | 41 +++++++++++++++++++++++++++++
HealBot_Options_Healing.lua | 45 +++++++++++++++++++++++---------
HealBot_Options_Integrations.lua | 1 +
HealBot_Options_Skins.lua | 10 +++++++
HealBot_Options_Spells.lua | 40 +++++++++++++++++-----------
HealBot_View_Layout.lua | 20 ++++++++++++++
HealBot_View_Tooltip.lua | 10 +++++++
24 files changed, 335 insertions(+), 27 deletions(-)
diff --git a/HealBot.lua b/HealBot.lua
index 28020e0..a24b6b3 100644
--- a/HealBot.lua
+++ b/HealBot.lua
@@ -15,6 +15,7 @@ HealBot_Delay_RecalcParty=0;
-- Debugging and Error functions moved to HealBot_Controller_Comms.lua
+-- HealBot_TogglePanel: Toggles visibility of a frame panel.
function HealBot_TogglePanel(panel)
if (not panel) then return end
if ( panel:IsVisible() ) then
@@ -24,6 +25,7 @@ function HealBot_TogglePanel(panel)
end
end
+-- HealBot_StartMoving: Initiates frame dragging when unlocked.
function HealBot_StartMoving(frame)
if ( not frame.isMoving ) and ( frame.isLocked ~= 1 ) then
frame:StartMoving();
@@ -31,6 +33,7 @@ function HealBot_StartMoving(frame)
end
end
+-- HealBot_StopMoving: Stops frame dragging.
function HealBot_StopMoving(frame)
if ( frame.isMoving ) then
frame:StopMovingOrSizing();
@@ -47,6 +50,7 @@ function HealBot_StopMoving(frame)
end
+-- HealBot_SlashCmd: Handles '/hb' or '/healbot' chat commands.
function HealBot_SlashCmd(cmd)
if (cmd=="") then
HealBot_TogglePanel(HealBot_Action);
@@ -103,6 +107,7 @@ end
-- HealBot_SendAddonMessage moved to HealBot_Controller_Comms.lua
+-- HealBot_TargetName: Retrieves the name of the current target, ignoring enemies.
function HealBot_TargetName()
if UnitIsEnemy("target","player") then return nil end
-- if not UnitPlayerControlled("target") then return nil end
@@ -136,14 +141,17 @@ end
+-- HealBot_PackBagSlot: Combines bag and slot into a single ID.
function HealBot_PackBagSlot(bag,slot)
return bag*100+slot;
end
+-- HealBot_UnpackBagSlot: Extracts bag and slot from a combined ID.
function HealBot_UnpackBagSlot(bagslot)
return math.floor(bagslot/100),math.mod(bagslot,100);
end
+-- HealBot_GetItemName: Gets item name from bag slot link.
function HealBot_GetItemName(bag,slot)
local link = GetContainerItemLink(bag,slot);
if not link then return nil end;
@@ -152,6 +160,7 @@ function HealBot_GetItemName(bag,slot)
return item,count;
end
+-- HealBot_GetBagSlot: Finds bag slot ID for an item name.
function HealBot_GetBagSlot(item)
local BagSlot,BestCount;
for bag=0,NUM_BAG_FRAMES do
@@ -168,6 +177,7 @@ function HealBot_GetBagSlot(item)
return BagSlot;
end
+-- HealBot_UseItem: Uses an item from inventory.
function HealBot_UseItem(item)
local bagslot = HealBot_GetBagSlot(item);
if not bagslot then return end;
@@ -178,6 +188,7 @@ end
-- Spell parsing and casting functions moved to HealBot_Controller_Spells.lua
+-- HealBot_UnitClass: Returns English class string for a unit.
function HealBot_UnitClass(unit)
local playerClass, englishClass = UnitClass(unit);
return englishClass;
@@ -197,6 +208,7 @@ end
-- SpiBonus and GetBonus functions moved to HealBot_Controller_Spells.lua
+-- HealBot_FindUnitID: Finds a unit token for a given player name.
function HealBot_FindUnitID(unitname)
local text;
for _,unit in ipairs(HealBot_Action_HealGroup) do
@@ -219,6 +231,7 @@ function HealBot_FindUnitID(unitname)
return nil;
end
+-- HealBot_PlaySound: Plays an audio alert based on ID.
function HealBot_PlaySound(id)
if id==1 then
PlaySoundFile("Sound\\Doodad\\BellTollTribal.wav");
@@ -231,6 +244,7 @@ end
-- HealBot_InitSpells moved to HealBot_Controller_Spells.lua
+-- HealBot_InitData: Registers options and basic setup on variables loaded.
function HealBot_InitData()
HealBot_Skins = HealBot_Config.Skins;
if(CT_RegisterMod) then
@@ -246,6 +260,7 @@ function HealBot_InitData()
HealBot_Options_Debuff_Reset()
end
+-- HealBot_ToggleOptions: Toggles the main options menu.
function HealBot_ToggleOptions()
HealBot_TogglePanel(HealBot_Options)
end
@@ -262,6 +277,7 @@ end
do
local pass = function() end
local orig = UseAction
+ -- UseAction: Intercepts standard clicks for mouseover support.
function UseAction(slot, checkCursor, onSelf)
if HealBot_Config.ActionMouseover == 1 then
local mouseover = HealBot_Action_TooltipUnit
diff --git a/HealBot_Action.lua b/HealBot_Action.lua
index 2c9489d..69ef209 100644
--- a/HealBot_Action.lua
+++ b/HealBot_Action.lua
@@ -1,9 +1,11 @@
-- Status bar layout functions and tables moved to HealBot_View_Layout.lua
+-- HealBot_AlwaysHeal: Returns true if healthy units should be shown.
function HealBot_AlwaysHeal()
return HealBot_Config.EnableHealthy==1
end
+-- HealBot_MayHeal: Checks if unit is eligible for healing UI.
function HealBot_MayHeal(unit)
if not UnitName(unit) or not HealBot_Heals[unit] then return false end
if unit ~= 'target' then return true end
@@ -11,6 +13,7 @@ function HealBot_MayHeal(unit)
return true;
end
+-- HealBot_ShouldHeal: Checks if unit needs immediate healing.
function HealBot_ShouldHeal(unit)
if HealBot_UnitDebuff[unit] and not UnitIsDeadOrGhost(unit) then
if HealBot_Range_Check(unit, 30)==1 then
@@ -21,22 +24,26 @@ function HealBot_ShouldHeal(unit)
and (UnitHealth(unit) 0) then
@@ -10,6 +11,7 @@ function HealBot_Get_DebugChan()
end
end
+-- HealBot_AddChat: Prints standard messages to default chat frame.
function HealBot_AddChat(msg)
local chanid = HealBot_Get_DebugChan();
if chanid and HealBot_SpamCnt < 3 then
@@ -28,6 +30,7 @@ function HealBot_AddChat(msg)
end
end
+-- HealBot_AddDebug: Prints debug messages to internal chat channel.
function HealBot_AddDebug(msg)
local chanid = HealBot_Get_DebugChan();
if chanid and HealBot_SpamCnt < 3 then
@@ -44,6 +47,7 @@ function HealBot_AddDebug(msg)
end
end
+-- HealBot_Report_Error: Formats and prints error logs.
function HealBot_Report_Error(msg)
if HealBot_ErrorCnt < 28 then
HealBot_ErrorCnt = HealBot_ErrorCnt + 1;
@@ -52,11 +56,13 @@ function HealBot_Report_Error(msg)
end
end
+-- HealBot_AddError: Displays error text in the UI frame.
function HealBot_AddError(msg)
UIErrorsFrame:AddMessage(msg, 1.0, 1.0, 1.0, 1.0, UIERRORS_HOLD_TIME);
HealBot_AddDebug(msg);
end
+-- HealBot_SendAddonMessage: Broadcasts data to party/raid channels.
function HealBot_SendAddonMessage(prefix, text)
if GetNumRaidMembers() > 0 then
SendAddonMessage(prefix, text, "RAID")
@@ -65,6 +71,7 @@ function HealBot_SendAddonMessage(prefix, text)
end
end
+-- HealBot_OnEvent_AddonMsg: Parses incoming heal data from other clients.
function HealBot_OnEvent_AddonMsg(this, addon_id, inc_msg, dist_target, sender_id)
if addon_id == HEALBOT_ADDON_ID then
local tmpTest, unitname, heal_val
diff --git a/HealBot_Controller_Events.lua b/HealBot_Controller_Events.lua
index 2ea3668..2760a2e 100644
--- a/HealBot_Controller_Events.lua
+++ b/HealBot_Controller_Events.lua
@@ -6,6 +6,7 @@ HealBot_View_DirtyPower = {}
local HealBot_Timer1, HealsIn_Timer = 0, 0;
HealBot_LastModState = ""
+-- HealBot_OnLoad: Registers core events and observers on addon load.
function HealBot_OnLoad(this)
this:RegisterEvent("VARIABLES_LOADED");
@@ -36,10 +37,12 @@ function HealBot_OnLoad(this)
end)
end
+-- HealBot_RegisterThis: Internal utility: HealBot_RegisterThis
function HealBot_RegisterThis(this)
-- Deprecated / not used
end
+-- HealBot_OnUpdate: Main loop: processes dirty queues and timers.
function HealBot_OnUpdate(this, arg1)
if HealBot_Action_TooltipUnit and HealBot_Tooltip:IsVisible() then
local s = IsShiftKeyDown() and true or false
@@ -243,6 +246,7 @@ local HealBot_EventHandlers = {
["UPDATE_SHAPESHIFT_FORMS"] = function(this) HealBot_UpdateShapeshiftForm() end
}
+-- HealBot_OnEvent: Event dispatcher for WoW UI events.
function HealBot_OnEvent(this, event, arg1, arg2, arg3, arg4)
local handler = HealBot_EventHandlers[event]
if handler then
@@ -252,6 +256,7 @@ function HealBot_OnEvent(this, event, arg1, arg2, arg3, arg4)
end
end
+-- HealBot_OnEvent_VariablesLoaded: Applies config defaults and initializes state.
function HealBot_OnEvent_VariablesLoaded(this)
local class = HealBot_UnitClass("player")
@@ -335,6 +340,7 @@ function HealBot_OnEvent_VariablesLoaded(this)
end
end
+-- HealBot_OnEvent_UnitHealth: Internal utility: HealBot_OnEvent_UnitHealth
function HealBot_OnEvent_UnitHealth(this, unit)
if (not HealBot_Heals[unit]) then return end
HealBot_CheckCasting(unit);
@@ -343,16 +349,19 @@ function HealBot_OnEvent_UnitHealth(this, unit)
end
end
+-- HealBot_OnEvent_UnitMana: Internal utility: HealBot_OnEvent_UnitMana
function HealBot_OnEvent_UnitMana(this, unit)
if (unit ~= "player") then return end
HealBot_RecalcHeals();
end
+-- HealBot_OnEvent_ZoneChanged: Internal utility: HealBot_OnEvent_ZoneChanged
function HealBot_OnEvent_ZoneChanged(this)
HealBot_ResetRangeScale();
HealBot_Delay_RecalcParty = 1;
end
+-- HealBot_OnEvent_PlayerRegenDisabled: Internal utility: HealBot_OnEvent_PlayerRegenDisabled
function HealBot_OnEvent_PlayerRegenDisabled(this)
-- Removed HealBot_RecalcParty();
if (UnitIsDeadOrGhost("player")) or (UnitOnTaxi("player")) then
@@ -388,11 +397,13 @@ function HealBot_OnEvent_PlayerRegenDisabled(this)
-- HealBot_RecalcHeals();
end
+-- HealBot_OnEvent_PlayerRegenEnabled: Internal utility: HealBot_OnEvent_PlayerRegenEnabled
function HealBot_OnEvent_PlayerRegenEnabled(this)
HealBot_IsFighting = false;
HealBot_Delay_RecalcParty = 1;
end
+-- HealBot_OnEvent_PlayerTargetChanged: Internal utility: HealBot_OnEvent_PlayerTargetChanged
function HealBot_OnEvent_PlayerTargetChanged(this)
if HealBot_Action_UnitButtons and HealBot_Action_UnitButtons["target"] then
HealBot_View_DirtyUnits["target"] = true
@@ -400,6 +411,7 @@ function HealBot_OnEvent_PlayerTargetChanged(this)
end
end
+-- HealBot_OnEvent_PartyMembersChanged: Internal utility: HealBot_OnEvent_PartyMembersChanged
function HealBot_OnEvent_PartyMembersChanged(this)
HealBot_Model:PreserveStateByGUID()
HealBot_Integrations_PruneNampower()
@@ -409,10 +421,12 @@ function HealBot_OnEvent_PartyMembersChanged(this)
HealBot_Delay_RecalcParty = 1;
end
+-- HealBot_OnEvent_PartyMemberDisable: Internal utility: HealBot_OnEvent_PartyMemberDisable
function HealBot_OnEvent_PartyMemberDisable(this, unit)
HealBot_RecalcHeals();
end
+-- HealBot_OnEvent_SystemMsg: Internal utility: HealBot_OnEvent_SystemMsg
function HealBot_OnEvent_SystemMsg(this, msg)
if type(msg) == "string" then
local tmpTest, tmpTest, deserter = string.find(msg, HEALBOT_HASLEFTRAID);
@@ -439,30 +453,36 @@ function HealBot_OnEvent_SystemMsg(this, msg)
end
end
+-- HealBot_OnEvent_PartyMemberEnable: Internal utility: HealBot_OnEvent_PartyMemberEnable
function HealBot_OnEvent_PartyMemberEnable(this, unit)
HealBot_RecalcHeals();
end
+-- HealBot_OnEvent_PlayerEquipmentChanged: Internal utility: HealBot_OnEvent_PlayerEquipmentChanged
function HealBot_OnEvent_PlayerEquipmentChanged(this)
HealBot_EquipChangeTimer = 1;
end
+-- HealBot_OnEvent_PlayerEquipmentChanged2: Internal utility: HealBot_OnEvent_PlayerEquipmentChanged2
function HealBot_OnEvent_PlayerEquipmentChanged2(this, unit)
if unit == "player" then
HealBot_EquipChangeTimer = 1;
end
end
+-- HealBot_OnEvent_SpellsChanged: Internal utility: HealBot_OnEvent_SpellsChanged
function HealBot_OnEvent_SpellsChanged(this, arg1)
if arg1 then return; end
HealBot_AddDebug("HB: SpellsChanged");
HealBot_SpellsInitFlag = 2;
end
+-- HealBot_OnEvent_TalentsChanged: Internal utility: HealBot_OnEvent_TalentsChanged
function HealBot_OnEvent_TalentsChanged(this, arg1)
HealBot_AddDebug("HB: TalentsChanged");
end
+-- HealBot_OnEvent_PlayerEnteringWorld: Internal utility: HealBot_OnEvent_PlayerEnteringWorld
function HealBot_OnEvent_PlayerEnteringWorld(this)
HealBot_IsFighting = false;
-- Re-apply the refresh hook late in case another addon overrode it during load
@@ -471,6 +491,7 @@ function HealBot_OnEvent_PlayerEnteringWorld(this)
end
end
+-- HealBot_OnEvent_SpellcastStart: Internal utility: HealBot_OnEvent_SpellcastStart
function HealBot_OnEvent_SpellcastStart(this, spell, duration)
HealBot_IsCasting = true;
HealBot_RecalcHeals();
@@ -483,6 +504,7 @@ function HealBot_OnEvent_SpellcastStart(this, spell, duration)
end
end
+-- HealBot_OnEvent_SpellcastStop: Internal utility: HealBot_OnEvent_SpellcastStop
function HealBot_OnEvent_SpellcastStop(this, eventName)
HealBot_IsCasting = false;
if eventName == "SPELLCAST_FAILED" then
diff --git a/HealBot_Controller_Range.lua b/HealBot_Controller_Range.lua
index aff7caf..f37c7b2 100644
--- a/HealBot_Controller_Range.lua
+++ b/HealBot_Controller_Range.lua
@@ -3,10 +3,12 @@
local _scale = 0
+-- HealBot_ResetRangeScale: Resets map range scaling on zone change.
function HealBot_ResetRangeScale()
_scale = 0
end
+-- HealBot_Range_Check: Checks if unit is in range via map distance or API.
function HealBot_Range_Check(unit, range)
local return_val = 0;
if not range then
diff --git a/HealBot_Controller_Spells.lua b/HealBot_Controller_Spells.lua
index e819867..45f2fcd 100644
--- a/HealBot_Controller_Spells.lua
+++ b/HealBot_Controller_Spells.lua
@@ -18,6 +18,7 @@ local HealBot_Health60 = {
["WARRIOR"] = 5000,
}
+-- HealBot_GetSpellName: Internal utility: HealBot_GetSpellName
function HealBot_GetSpellName(id)
if (not id) then
return nil;
@@ -32,6 +33,7 @@ function HealBot_GetSpellName(id)
return spellName .. " (" .. subSpellName .. ")";
end
+-- HealBot_GetSpellId: Internal utility: HealBot_GetSpellId
function HealBot_GetSpellId(spell)
local id, idd = 1, 0;
while true do
@@ -55,6 +57,7 @@ function HealBot_GetSpellId(spell)
end
end
+-- HealBot_CastSpellByName: Internal utility: HealBot_CastSpellByName
function HealBot_CastSpellByName(spell)
if (HealBot_Spells[spell] and HealBot_Spells[spell].BagSlot) then
HealBot_UseItem(spell);
@@ -74,6 +77,7 @@ function HealBot_CastSpellByName(spell)
CastSpell(id, BOOKTYPE_SPELL);
end
+-- HealBot_AnnounceCast: Internal utility: HealBot_AnnounceCast
function HealBot_AnnounceCast(spell, target)
if not spell or not target then return end
@@ -127,6 +131,7 @@ function HealBot_AnnounceCast(spell, target)
end
end
+-- HealBot_Process_HealValue: Internal utility: HealBot_Process_HealValue
function HealBot_Process_HealValue(spell, target)
if HealBot_Spells[spell] and HealBot_Spells[spell].CastTime > 1 then
HealBot_HealValue = HealBot_Spells[spell].HealsDur;
@@ -163,6 +168,7 @@ function HealBot_Process_HealValue(spell, target)
end
end
+-- HealBot_StartCasting: Initiates spell cast and broadcasts incoming heal.
function HealBot_StartCasting(spell, target, ttype)
HealBot_CastFailed = false;
HealBot_CastSpellByName(spell);
@@ -188,6 +194,7 @@ function HealBot_StartCasting(spell, target, ttype)
end
end
+-- HealBot_StopCasting: Internal utility: HealBot_StopCasting
function HealBot_StopCasting()
if HealBot_CastingTarget then
if HealBot_HealValue > 0 then
@@ -221,6 +228,7 @@ function HealBot_StopCasting()
bar.txt:SetTextColor(sr, sg, sb, sa);
end
+-- HealBot_UnitHealth: Internal utility: HealBot_UnitHealth
function HealBot_UnitHealth(unit)
local Current, Desired = UnitHealth(unit), UnitHealthMax(unit);
if unit == 'target' and Desired == 100 then
@@ -235,6 +243,7 @@ function HealBot_UnitHealth(unit)
return Current, Desired;
end
+-- HealBot_CheckCasting: Internal utility: HealBot_CheckCasting
function HealBot_CheckCasting(unit)
if not HealBot_CastingSpell or HealBot_AlwaysHeal() then return nil end
if not HealBot_Spells[HealBot_CastingSpell] then return nil end
@@ -281,6 +290,7 @@ function HealBot_CheckCasting(unit)
end
end
+-- HealBot_CastSpellOnFriend: Target-safe wrapper for casting spells on allies.
function HealBot_CastSpellOnFriend(spell, target)
if (not spell or not target or not UnitName(target)) then
return;
@@ -308,6 +318,7 @@ function HealBot_CastSpellOnFriend(spell, target)
HealBot_TargetRestoreTimer = 0;
end
+-- HealBot_SetItemDefaults: Internal utility: HealBot_SetItemDefaults
function HealBot_SetItemDefaults(spell)
if not HealBot_Spells[spell].Target then
HealBot_Spells[spell].Target = {"player", "party", "pet"};
@@ -340,6 +351,7 @@ function HealBot_SetItemDefaults(spell)
end
end
+-- HealBot_SetSpellDefaults: Internal utility: HealBot_SetSpellDefaults
function HealBot_SetSpellDefaults(spell)
local baseHeal = HealBot_Spells[spell].HealsCast or 0
local extHeal = HealBot_Spells[spell].HealsExt or 0
@@ -383,6 +395,7 @@ function HealBot_SetSpellDefaults(spell)
HealBot_Spells[spell].HealsDur = math.floor(baseHeal + extHeal + realHeal);
end
+-- HealBot_AddHeal: Internal utility: HealBot_AddHeal
function HealBot_AddHeal(spell)
HealBot_SetSpellDefaults(spell);
table.foreachi(HealBot_Spells[spell].Target, function (i, val)
@@ -391,6 +404,7 @@ function HealBot_AddHeal(spell)
HealBot_Spells[spell].BagSlot = HealBot_GetBagSlot(spell);
end
+-- HealBot_FindHealSpells: Maps best heal ranks to UI buttons.
function HealBot_FindHealSpells()
local id = 1;
if HealBot_SpellsInitFlag > 0 then NeedEquipUpdate = 1; return; end
@@ -460,6 +474,7 @@ function HealBot_FindHealSpells()
HealBot_CalcEquipBonus = false;
end
+-- HealBot_CanCastSpell: Internal utility: HealBot_CanCastSpell
function HealBot_CanCastSpell(spell, unit)
local this = HealBot_Spells[spell];
-- Removed manual mana check so WoW can properly handle 0-cost buffs (Clearcasting/Inner Focus)
@@ -474,6 +489,7 @@ function HealBot_CanCastSpell(spell, unit)
return true;
end
+-- HealBot_GetHealSpell: Resolves spell rank based on health deficit.
function HealBot_GetHealSpell(unit, pattern)
if (not UnitName(unit)) then return nil end;
if not pattern then return nil end;
@@ -515,14 +531,17 @@ function HealBot_GetHealSpell(unit, pattern)
return nil;
end
+-- HealBot_HealUnit: Main entry point for healing a unit.
function HealBot_HealUnit(unit, pattern)
HealBot_CastSpellOnFriend(HealBot_GetHealSpell(unit, pattern), unit);
end
+-- HealBot_RecalcHeals: Flags unit for visual refresh.
function HealBot_RecalcHeals(unit)
HealBot_Action_Refresh(unit);
end
+-- HealBot_RecalcParty: Triggers group layout rebuild.
function HealBot_RecalcParty()
HealBot_Action_PartyChanged();
if HealBot_Action_HealButtons then
@@ -535,11 +554,13 @@ function HealBot_RecalcParty()
HealBot_Action_RefreshButtons();
end
+-- HealBot_RecalcSpells: Recalculates spells and updates layout.
function HealBot_RecalcSpells()
HealBot_FindHealSpells();
HealBot_RecalcParty();
end
+-- HealBot_GetTalentRank: Internal utility: HealBot_GetTalentRank
function HealBot_GetTalentRank(talentName)
for t = 1, GetNumTalentTabs() do
for i = 1, GetNumTalents(t) do
@@ -552,6 +573,7 @@ function HealBot_GetTalentRank(talentName)
return 0;
end
+-- HealBot_SpiBonus: Internal utility: HealBot_SpiBonus
function HealBot_SpiBonus(spell)
local heals_modifer = 0;
local base, stat, posBuff, negBuff = UnitStat("player", 5);
@@ -563,6 +585,7 @@ function HealBot_SpiBonus(spell)
return heals_modifer;
end
+-- HealBot_GetBonus: Internal utility: HealBot_GetBonus
function HealBot_GetBonus()
local HealBonus = 0;
if HealBot_Integrations_ClassicAPI_Active and GetSpellBonusHealing then
@@ -580,6 +603,7 @@ function HealBot_GetBonus()
return HealBonus;
end
+-- HealBot_InitSpells: Scans spellbook to find available heals.
function HealBot_InitSpells()
local id = 1
local cnt = 0;
@@ -602,6 +626,7 @@ function HealBot_InitSpells()
return cnt;
end
+-- HealBot_InitGetSpellData: Extracts mana and cast time from spell tooltips.
function HealBot_InitGetSpellData(spell, id, class)
local i, _mana, _cast, _HealsMin, _HealsMax, _HealsExt, _duration, _range, _shield, _channel;
local tooltip = getglobal("HealBot_ScanTooltip");
@@ -791,6 +816,7 @@ function HealBot_InitGetSpellData(spell, id, class)
end
end
+-- HealBot_Generic_Patten: Internal utility: HealBot_Generic_Patten
function HealBot_Generic_Patten(matchStr, matchPattern)
local tmpTest, _HealsMin, _HealsMax, _HealsExt, _duration
tmpTest, tmpTest, _HealsMin, _HealsMax = string.find(matchStr, matchPattern);
@@ -805,10 +831,12 @@ end
HealBot_ActiveShapeshiftStance = nil;
+-- HealBot_UpdateShapeshiftForm: Internal utility: HealBot_UpdateShapeshiftForm
function HealBot_UpdateShapeshiftForm()
HealBot_ActiveShapeshiftStance = HealBot_GetShapeshiftForm();
end
+-- HealBot_GetShapeshiftForm: Detects active druid form to prevent invalid casts.
function HealBot_GetShapeshiftForm()
local forms = GetNumShapeshiftForms();
if forms then
diff --git a/HealBot_Data.lua b/HealBot_Data.lua
index 15fac96..167c706 100644
--- a/HealBot_Data.lua
+++ b/HealBot_Data.lua
@@ -579,6 +579,7 @@ HealBot_IamRessing = false;
-- Table Recycling Pool
local tablePool = {}
+-- HealBot_GetTable: Internal utility: HealBot_GetTable
function HealBot_GetTable()
local t = table.remove(tablePool)
if not t then
@@ -587,6 +588,7 @@ function HealBot_GetTable()
return t
end
+-- HealBot_ReleaseTable: Internal utility: HealBot_ReleaseTable
function HealBot_ReleaseTable(t)
if type(t) == "table" then
for k in pairs(t) do
diff --git a/HealBot_Errors.lua b/HealBot_Errors.lua
index 6049ecb..426c3d2 100644
--- a/HealBot_Errors.lua
+++ b/HealBot_Errors.lua
@@ -1,7 +1,9 @@
+-- HealBot_Errors_OnLoad: Internal utility: HealBot_Errors_OnLoad
function HealBot_Errors_OnLoad(this)
-- do nothing
end
+-- HealBot_Errors_OnShow: Show event handler.
function HealBot_Errors_OnShow(this)
local client = getglobal("HealBot_Error_Clientx")
client:SetText("Client="..GetLocale())
@@ -9,6 +11,7 @@ function HealBot_Errors_OnShow(this)
HealBot_Error_Classx:SetText("Player class="..HealBot_UnitClass("player"))
end
+-- HealBot_Errors_OnHide: Hide event handler.
function HealBot_Errors_OnHide(this)
local errtext;
HealBot_StopMoving(this);
@@ -19,14 +22,17 @@ function HealBot_Errors_OnHide(this)
HealBot_ErrorCnt=0;
end
+-- HealBot_Errors_OnDragStart: Internal utility: HealBot_Errors_OnDragStart
function HealBot_Errors_OnDragStart(this,arg1)
HealBot_StartMoving(this);
end
+-- HealBot_Errors_OnDragStop: Internal utility: HealBot_Errors_OnDragStop
function HealBot_Errors_OnDragStop(this)
HealBot_StopMoving(this);
end
+-- HealBot_ErrorsIn: Internal utility: HealBot_ErrorsIn
function HealBot_ErrorsIn(msg,id)
local errtext = getglobal("HealBot_Error"..id);
errtext:SetText(msg)
diff --git a/HealBot_Integrations.lua b/HealBot_Integrations.lua
index 0a1a24b..f0f8cfb 100644
--- a/HealBot_Integrations.lua
+++ b/HealBot_Integrations.lua
@@ -3,6 +3,7 @@ HealBot_Integrations_Nampower_Active = false;
HealBot_Integrations_SuperWoW_Active = false;
HealBot_Integrations_ClassicAPI_Active = false;
+-- HealBot_GetUnitGUID: Internal utility: HealBot_GetUnitGUID
function HealBot_GetUnitGUID(unit)
if not unit then return nil end
if HealBot_Integrations_ClassicAPI_Active and UnitGUID then
@@ -13,6 +14,7 @@ function HealBot_GetUnitGUID(unit)
return nil
end
+-- HealBot_Integrations_Toggle: Enables or disables external addon APIs on load/click.
function HealBot_Integrations_Toggle()
-- UnitXP
if HealBot_Config.HealBot_Integrations_UnitXP == 1 and UnitXP ~= nil then
diff --git a/HealBot_Model.lua b/HealBot_Model.lua
index 830e2c5..f808ce5 100644
--- a/HealBot_Model.lua
+++ b/HealBot_Model.lua
@@ -15,6 +15,7 @@ function HealBot_UIDropDownMenu_SetSelectedID(frame, id, useValue)
end
end
+-- HealBot_UIDropDownMenu_SetSelectedValue: Internal utility: HealBot_UIDropDownMenu_SetSelectedValue
function HealBot_UIDropDownMenu_SetSelectedValue(frame, value, useValue)
local wasNil = false
if not UIDROPDOWNMENU_OPEN_MENU then
@@ -55,6 +56,7 @@ HealBot_Model = {
-- "EQUIPMENT_CHANGED"
-- "INCOMING_HEAL_CHANGED"
+-- HealBot_Model:RegisterObserver: Registers an observer callback for an event.
function HealBot_Model:RegisterObserver(event, callback)
if not self.observers[event] then
self.observers[event] = {}
@@ -62,6 +64,7 @@ function HealBot_Model:RegisterObserver(event, callback)
table.insert(self.observers[event], callback)
end
+-- HealBot_Model:NotifyObservers: Fires all registered callbacks for an event.
function HealBot_Model:NotifyObservers(event, unitID, arg1, arg2)
if self.observers[event] then
local len = table.getn(self.observers[event])
@@ -75,6 +78,7 @@ end
-- Model Initialization
--------------------------------------------------------------------------------
+-- HealBot_Model:Initialize: Pre-allocates the unit state dictionary.
function HealBot_Model:Initialize()
self:InitUnitState("player")
self:InitUnitState("target")
@@ -93,6 +97,7 @@ function HealBot_Model:Initialize()
end
end
+-- HealBot_Model:InitUnitState: Internal utility: HealBot_Model:InitUnitState
function HealBot_Model:InitUnitState(unit)
if not self.units[unit] then
self.units[unit] = {
@@ -156,11 +161,13 @@ function HealBot_Model:UpdateUnitIdentity(unit)
return false
end
+-- HealBot_Model:GetUnitByGUID: Internal utility: HealBot_Model:GetUnitByGUID
function HealBot_Model:GetUnitByGUID(guid)
if not guid then return nil end
return self.guidUnits[guid]
end
+-- HealBot_Model:GetUnitIDByName: Looks up a group unit token by player name.
function HealBot_Model:GetUnitIDByName(name)
if not name then return nil end
for unit, data in pairs(self.units) do
@@ -169,6 +176,7 @@ function HealBot_Model:GetUnitIDByName(name)
return nil
end
+-- HealBot_Model:PreserveStateByGUID: Preserves icon and debuff state when group indices shift during combat.
function HealBot_Model:PreserveStateByGUID()
if not (HealBot_Integrations_SuperWoW_Active or HealBot_Integrations_ClassicAPI_Active) or not HealBot_GetUnitGUID then return end
diff --git a/HealBot_Options.lua b/HealBot_Options.lua
index 815af55..e796ad1 100644
--- a/HealBot_Options.lua
+++ b/HealBot_Options.lua
@@ -14,10 +14,12 @@ HealBot_Options_EmergencyFilter_List = {
HEALBOT_OPTIONS_MONITORCUSTOM,
}
+-- HealBot_Options_AddDebug: UI handler for AddDebug options panel.
function HealBot_Options_AddDebug(msg)
HealBot_AddDebug("Options: " .. msg);
end
+-- HealBot_Options_Pct_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_Pct_OnLoad(this,text)
this.text = text;
getglobal(this:GetName().."Text"):SetText(text);
@@ -27,6 +29,7 @@ function HealBot_Options_Pct_OnLoad(this,text)
this:SetValueStep(0.01);
end
+-- HealBot_Options_Pct_OnLoad_MinMax: UI handler for MinMax options panel.
function HealBot_Options_Pct_OnLoad_MinMax(this,text,Min,Max)
this.text = text;
local MinTxt,MaxTxt
@@ -41,6 +44,7 @@ function HealBot_Options_Pct_OnLoad_MinMax(this,text,Min,Max)
this:SetValueStep(0.01);
end
+-- HealBot_Options_val_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_val_OnLoad(this,text,Min,Max)
this.text = text;
@@ -51,6 +55,7 @@ function HealBot_Options_val_OnLoad(this,text,Min,Max)
this:SetValueStep(1);
end
+-- HealBot_Options_Pct_OnValueChanged: UI handler for OnValueChanged options panel.
function HealBot_Options_Pct_OnValueChanged(this)
local pct = math.floor(this:GetValue()*100+0.5);
getglobal(this:GetName().."Text"):SetText(this.text .. " (" .. pct .. "%)");
@@ -106,10 +111,12 @@ end
+-- HealBot_Options_CastNotify_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_CastNotify_OnLoad(this,text)
getglobal(this:GetName().."Text"):SetText(text);
end
+-- HealBot_Options_CastNotify_OnClick: UI handler for OnClick options panel.
function HealBot_Options_CastNotify_OnClick(this,id)
-- CastNotify UI elements were removed and replaced by Custom Chat Messages
end
@@ -147,6 +154,7 @@ end
--------------------------------------------------------------------------------
+-- HealBot_Returned_Colours: Internal utility: HealBot_Returned_Colours
function HealBot_Returned_Colours()
local A = OpacitySliderFrame:GetValue();
A = ((0-A)+1);
@@ -188,6 +196,7 @@ function HealBot_Returned_Colours()
HealBot_SetSkinColours()
HealBot_SetCDCBarColours()
end
+-- HealBot_UseColourPick: Internal utility: HealBot_UseColourPick
function HealBot_UseColourPick(R, G, B, A)
if ColorPickerFrame:IsVisible() then
ColorPickerFrame:Hide();
@@ -208,6 +217,7 @@ function HealBot_UseColourPick(R, G, B, A)
end
return ColorPickerFrame:GetColorRGB();
end
+-- HealBot_Options_Defaults_OnClick: UI handler for OnClick options panel.
function HealBot_Options_Defaults_OnClick(this)
HealBot_Options_CastNotify_OnClick(nil,0);
-- HealBot_Config = HealBot_ConfigDefaults;
@@ -219,6 +229,7 @@ function HealBot_Options_Defaults_OnClick(this)
HealBot_Action_Reset();
HealBot_Config.ActionVisible = HealBot_Action:IsVisible();
end
+-- HealBot_Options_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_OnLoad(this)
table.insert(UISpecialFrames,this:GetName());
@@ -228,6 +239,7 @@ function HealBot_Options_OnLoad(this)
PanelTemplates_UpdateTabs(this);
HealBot_Options_ShowPanel(this.selectedTab);
end
+-- HealBot_Options_OnShow: UI handler for OnShow options panel.
function HealBot_Options_OnShow(this)
HealBot_Skins = HealBot_Config.Skins;
HealBot_Options_SetSkins()
@@ -295,6 +307,7 @@ function HealBot_Options_OnShow(this)
HealBot_Options_SetChatMessages();
HealBot_Options_ShowPanel(this.selectedTab or 1);
end
+-- HealBot_Options_SetSkins: UI handler for SetSkins options panel.
function HealBot_Options_SetSkins()
HealBot_Options_Skins_Refresh()
HealBot_Options_BarAlpha:SetValue(HealBot_Config.Barcola[HealBot_Config.Current_Skin]);
@@ -334,6 +347,7 @@ function HealBot_Options_SetSkins()
HealBot_Options_DeleteSkin:Enable();
end
end
+-- HealBot_Options_ShowPanel: UI handler for ShowPanel options panel.
function HealBot_Options_ShowPanel(id)
if HealBot_Options_CurrentPanel>0 then
local panel = getglobal("HealBot_Options_Panel"..HealBot_Options_CurrentPanel);
diff --git a/HealBot_Options_Auto.lua b/HealBot_Options_Auto.lua
index 2ebe79c..6790c7f 100644
--- a/HealBot_Options_Auto.lua
+++ b/HealBot_Options_Auto.lua
@@ -1,3 +1,4 @@
+-- HealBot_Options_AutoSwap_OnClick: UI handler for OnClick options panel.
function HealBot_Options_AutoSwap_OnClick(this)
if this:GetChecked() then
HealBot_Config.AutoSwap_Enabled = 1
@@ -7,6 +8,7 @@ function HealBot_Options_AutoSwap_OnClick(this)
HealBot_Action_PartyChanged()
end
+-- HealBot_Options_Auto_Initialize: UI handler for Initialize options panel.
function HealBot_Options_Auto_Initialize()
local dropdownName = UIDROPDOWNMENU_OPEN_MENU
if not dropdownName then return end
@@ -30,6 +32,7 @@ function HealBot_Options_Auto_Initialize()
end
end
+-- HealBot_Options_Auto_OnSelect: UI handler for OnSelect options panel.
function HealBot_Options_Auto_OnSelect()
local skin = this:GetText()
local id = this.value
@@ -53,6 +56,7 @@ function HealBot_Options_Auto_OnSelect()
HealBot_Action_PartyChanged()
end
+-- HealBot_Options_Auto_OnShow: UI handler for OnShow options panel.
function HealBot_Options_Auto_OnShow(this)
if HealBot_Config.AutoSwap_Enabled == 1 then
HealBot_Options_AutoSwap:SetChecked(1)
diff --git a/HealBot_Options_Buffs.lua b/HealBot_Options_Buffs.lua
index f86e30c..417843d 100644
--- a/HealBot_Options_Buffs.lua
+++ b/HealBot_Options_Buffs.lua
@@ -1,6 +1,7 @@
-- HealBot Options panel file: HealBot_Options_Buffs.lua
-- Split from original HealBot_Options.lua
+-- HealBot_Options_BuffWatch_OnClick: UI handler for OnClick options panel.
function HealBot_Options_BuffWatch_OnClick(self)
local frame = self or this
HealBot_Config.BuffWatch = frame:GetChecked() or 0;
@@ -11,11 +12,13 @@ function HealBot_Options_BuffWatch_OnClick(self)
end
HealBot_RecalcParty();
end
+-- HealBot_Options_BuffWatchInCombat_OnClick: UI handler for OnClick options panel.
function HealBot_Options_BuffWatchInCombat_OnClick(self)
local frame = self or this
HealBot_Config.BuffWatchInCombat = frame:GetChecked() or 0;
HealBot_RecalcParty();
end
+-- HealBot_Options_BuffSelf_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_BuffSelf_OnLoad(self)
local frame = self or this
getglobal(this:GetName().."Text"):SetText("Self Only")
@@ -27,6 +30,7 @@ function HealBot_Options_BuffSelf_OnLoad(self)
this:SetChecked(nil)
end
end
+-- HealBot_Options_BuffSelf_OnClick: UI handler for OnClick options panel.
function HealBot_Options_BuffSelf_OnClick(self)
local frame = self or this
local id = this:GetID()
@@ -40,11 +44,13 @@ function HealBot_Options_BuffSelf_OnClick(self)
end
HealBot_RecalcParty();
end
+-- HealBot_Options_Buff_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_Buff_OnLoad(self)
local frame = self or this
UIDropDownMenu_Initialize(frame, HealBot_Options_Buff_Initialize)
UIDropDownMenu_SetWidth(110, frame)
end
+-- HealBot_Options_Buff_Initialize: UI handler for Initialize options panel.
function HealBot_Options_Buff_Initialize()
local myClass = UnitClass("player")
local info
@@ -63,6 +69,7 @@ function HealBot_Options_Buff_Initialize()
end
end
end
+-- HealBot_Options_Buff_OnClick: UI handler for OnClick options panel.
function HealBot_Options_Buff_OnClick()
local frameName = UIDROPDOWNMENU_OPEN_MENU
local frame = getglobal(frameName)
@@ -82,6 +89,7 @@ function HealBot_Options_Buff_OnClick()
UIDropDownMenu_SetText(text, frame)
HealBot_RecalcParty();
end
+-- HealBot_Options_SetBuffs: UI handler for SetBuffs options panel.
function HealBot_Options_SetBuffs()
local myClass = UnitClass("player")
if HealBot_Options_BuffWatch then
diff --git a/HealBot_Options_CDC.lua b/HealBot_Options_CDC.lua
index 854bc9f..23dbf09 100644
--- a/HealBot_Options_CDC.lua
+++ b/HealBot_Options_CDC.lua
@@ -1,15 +1,19 @@
-- HealBot Options panel file: HealBot_Options_CDC.lua
-- Split from original HealBot_Options.lua
+-- HealBot_Options_ShowDebuffWarning_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_ShowDebuffWarning_OnLoad(this,text)
getglobal(this:GetName().."Text"):SetText(text);
end
+-- HealBot_Options_ShowDebuffWarning_OnClick: UI handler for OnClick options panel.
function HealBot_Options_ShowDebuffWarning_OnClick(this)
HealBot_Config.ShowDebuffWarning = this:GetChecked() or 0;
end
+-- HealBot_Options_SoundDebuffWarning_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_SoundDebuffWarning_OnLoad(this,text)
getglobal(this:GetName().."Text"):SetText(text);
end
+-- HealBot_Options_SoundDebuffWarning_OnClick: UI handler for OnClick options panel.
function HealBot_Options_SoundDebuffWarning_OnClick(this)
HealBot_Config.SoundDebuffWarning = this:GetChecked() or 0;
if HealBot_Config.SoundDebuffWarning==0 then
@@ -22,9 +26,11 @@ function HealBot_Options_SoundDebuffWarning_OnClick(this)
HealBot_WarningSound3:Enable();
end
end
+-- HealBot_WarningSound_OnLoad: Internal utility: HealBot_WarningSound_OnLoad
function HealBot_WarningSound_OnLoad(this,text)
getglobal(this:GetName().."Text"):SetText(text);
end
+-- HealBot_WarningSound_OnClick: Click event handler.
function HealBot_WarningSound_OnClick(this,id)
if HealBot_Config.SoundDebuffPlay>0 then
getglobal("HealBot_WarningSound"..HealBot_Config.SoundDebuffPlay):SetChecked(nil);
@@ -37,6 +43,7 @@ function HealBot_WarningSound_OnClick(this,id)
end
end
end
+-- HealBot_Options_CDCMonitor_DropDown: UI handler for DropDown options panel.
function HealBot_Options_CDCMonitor_DropDown()
for i=1, getn(HealBot_Options_EmergencyFilter_List), 1 do
local info = {};
@@ -45,23 +52,28 @@ function HealBot_Options_CDCMonitor_DropDown()
UIDropDownMenu_AddButton(info);
end
end
+-- HealBot_Options_CDCMonitor_Initialize: UI handler for Initialize options panel.
function HealBot_Options_CDCMonitor_Initialize()
UIDropDownMenu_Initialize(HealBot_Options_CDCMonitor,HealBot_Options_CDCMonitor_DropDown)
end
+-- HealBot_Options_CDCMonitor_Refresh: UI handler for Refresh options panel.
function HealBot_Options_CDCMonitor_Refresh(onselect)
if not HealBot_Config.CDCMonitor then return end
if not onselect then HealBot_Options_CDCMonitor_Initialize() end -- or wrong menu may be used !
HealBot_UIDropDownMenu_SetSelectedID(HealBot_Options_CDCMonitor,HealBot_Config.CDCMonitor)
end
+-- HealBot_Options_CDCMonitor_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_CDCMonitor_OnLoad()
UIDropDownMenu_Initialize(this, HealBot_Options_CDCMonitor_DropDown)
UIDropDownMenu_SetWidth(100, this)
end
+-- HealBot_Options_CDCMonitor_OnSelect: UI handler for OnSelect options panel.
function HealBot_Options_CDCMonitor_OnSelect()
HealBot_Config.CDCMonitor = this:GetID()
HealBot_Options_CDCMonitor_Refresh(true)
HealBot_Options_CDCMonitor_Reset()
end
+-- HealBot_Options_CDCMonitor_Reset: UI handler for Reset options panel.
function HealBot_Options_CDCMonitor_Reset()
HealBot_CDCInc[HEALBOT_DRUID] = 0;
@@ -145,10 +157,12 @@ function HealBot_Options_CDCMonitor_Reset()
HealBot_Action_PartyChanged()
end
+-- HealBot_Options_GetDebuffSpells_List: UI handler for List options panel.
function HealBot_Options_GetDebuffSpells_List(class)
local DebuffSpells = HealBot_Debuff_Spells[class];
return DebuffSpells;
end
+-- HealBot_Options_CDCButLeft_DropDown: UI handler for DropDown options panel.
function HealBot_Options_CDCButLeft_DropDown()
local classEN=HealBot_UnitClass("player")
if classEN=="PRIEST" or classEN=="DRUID" or classEN=="PALADIN" or classEN=="SHAMAN" then
@@ -169,6 +183,7 @@ function HealBot_Options_CDCButLeft_DropDown()
end
end
end
+-- HealBot_Options_CDCButRight_DropDown: UI handler for DropDown options panel.
function HealBot_Options_CDCButRight_DropDown()
local classEN=HealBot_UnitClass("player")
if classEN=="PRIEST" or classEN=="DRUID" or classEN=="PALADIN" or classEN=="SHAMAN" then
@@ -189,12 +204,15 @@ function HealBot_Options_CDCButRight_DropDown()
end
end
end
+-- HealBot_Options_CDCButLeft_Initialize: UI handler for Initialize options panel.
function HealBot_Options_CDCButLeft_Initialize()
UIDropDownMenu_Initialize(HealBot_Options_CDCButLeft,HealBot_Options_CDCButLeft_DropDown)
end
+-- HealBot_Options_CDCButRight_Initialize: UI handler for Initialize options panel.
function HealBot_Options_CDCButRight_Initialize()
UIDropDownMenu_Initialize(HealBot_Options_CDCButRight,HealBot_Options_CDCButRight_DropDown)
end
+-- HealBot_Options_CDCButLeft_Refresh: UI handler for Refresh options panel.
function HealBot_Options_CDCButLeft_Refresh(onselect)
local set_id=1;
local class=UnitClass("Player");
@@ -202,6 +220,7 @@ function HealBot_Options_CDCButLeft_Refresh(onselect)
set_id = HealBot_Config.Debuff_Left[class];
HealBot_UIDropDownMenu_SetSelectedID(HealBot_Options_CDCButLeft,set_id)
end
+-- HealBot_Options_CDCButRight_Refresh: UI handler for Refresh options panel.
function HealBot_Options_CDCButRight_Refresh(onselect)
local set_id;
local class=UnitClass("Player");
@@ -209,14 +228,17 @@ function HealBot_Options_CDCButRight_Refresh(onselect)
set_id = HealBot_Config.Debuff_Right[class];
HealBot_UIDropDownMenu_SetSelectedID(HealBot_Options_CDCButRight,set_id)
end
+-- HealBot_Options_CDCButLeft_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_CDCButLeft_OnLoad()
UIDropDownMenu_Initialize(this, HealBot_Options_CDCButLeft_DropDown)
UIDropDownMenu_SetWidth(140, this)
end
+-- HealBot_Options_CDCButRight_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_CDCButRight_OnLoad()
UIDropDownMenu_Initialize(this, HealBot_Options_CDCButRight_DropDown)
UIDropDownMenu_SetWidth(140, this)
end
+-- HealBot_Options_CDCButLeft_OnSelect: UI handler for OnSelect options panel.
function HealBot_Options_CDCButLeft_OnSelect()
local class=UnitClass("Player");
HealBot_Config.Debuff_Left[class] = this:GetID();
@@ -228,6 +250,7 @@ function HealBot_Options_CDCButLeft_OnSelect()
HealBot_DebuffPriority = HealBot_Debuff_Types[HealBot_Options_CDCButLeftText:GetText()];
HealBot_Options_Debuff_Reset()
end
+-- HealBot_Options_CDCButRight_OnSelect: UI handler for OnSelect options panel.
function HealBot_Options_CDCButRight_OnSelect()
local class=UnitClass("Player");
HealBot_Config.Debuff_Right[class] = this:GetID();
@@ -238,11 +261,13 @@ function HealBot_Options_CDCButRight_OnSelect()
end
HealBot_Options_Debuff_Reset()
end
+-- HealBot_Options_CDC_SetCombo: UI handler for SetCombo options panel.
function HealBot_Options_CDC_SetCombo(spell, button, class)
local combo = HealBot_Config.KeyCombo[class]
combo["Alt"..button] = spell
HealBot_Options_KeyCombo_Change()
end
+-- HealBot_Options_Debuff_Reset: Restores default debuff tracking options.
function HealBot_Options_Debuff_Reset()
HealBot_DebuffWatch = {
[HEALBOT_DISEASE_en] = true,
@@ -251,10 +276,12 @@ function HealBot_Options_Debuff_Reset()
[HEALBOT_CURSE_en] = true
}
end
+-- HealBot_Colorpick_OnClick: Opens color picker for debuff colors.
function HealBot_Colorpick_OnClick(CDCType)
HealBot_ColourObjWaiting=CDCType;
HealBot_UseColourPick(HealBot_Config.CDCBarColour[CDCType].R,HealBot_Config.CDCBarColour[CDCType].G,HealBot_Config.CDCBarColour[CDCType].B, nil)
end
+-- HealBot_SetCDCBarColours: Internal utility: HealBot_SetCDCBarColours
function HealBot_SetCDCBarColours()
HealBot_DiseaseColorpick:SetStatusBarColor(HealBot_Config.CDCBarColour[HEALBOT_DISEASE_en].R,
HealBot_Config.CDCBarColour[HEALBOT_DISEASE_en].G,
diff --git a/HealBot_Options_Chat.lua b/HealBot_Options_Chat.lua
index 7e49fa3..a97ad4c 100644
--- a/HealBot_Options_Chat.lua
+++ b/HealBot_Options_Chat.lua
@@ -1,6 +1,7 @@
-- HealBot Options panel file: HealBot_Options_Chat.lua
-- Split from original HealBot_Options.lua
+-- HealBot_Options_ChatMsg_Channel_OnClick: UI handler for OnClick options panel.
function HealBot_Options_ChatMsg_Channel_OnClick(id, buttonFrame)
if not HealBot_Config.ChatMessages then HealBot_Config.ChatMessages = {} end
if not HealBot_Config.ChatMessages[id] then
@@ -26,6 +27,7 @@ function HealBot_Options_ChatMsg_Channel_OnClick(id, buttonFrame)
buttonFrame:SetText(nextChan)
end
+-- HealBot_Options_SetChatMessages: UI handler for SetChatMessages options panel.
function HealBot_Options_SetChatMessages()
if not HealBot_Config.ChatMessages then
HealBot_Config.ChatMessages = {}
diff --git a/HealBot_Options_General.lua b/HealBot_Options_General.lua
index 89eb156..2a4def1 100644
--- a/HealBot_Options_General.lua
+++ b/HealBot_Options_General.lua
@@ -1,75 +1,91 @@
-- HealBot Options panel file: HealBot_Options_General.lua
-- Split from original HealBot_Options.lua
+-- HealBot_Options_ShowHeaders_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_ShowHeaders_OnLoad(this)
getglobal(this:GetName().."Text"):SetText(HEALBOT_OPTIONS_SHOWHEADERS);
end
+-- HealBot_Options_ShowHeaders_OnClick: UI handler for OnClick options panel.
function HealBot_Options_ShowHeaders_OnClick(this)
local isChecked = this:GetChecked()
HealBot_Config.ShowHeader[HealBot_Config.Current_Skin] = isChecked and 1 or 0;
HealBot_Action_ResetSkin()
end
+-- HealBot_Options_BarTextureS_OnValueChanged: UI handler for OnValueChanged options panel.
function HealBot_Options_BarTextureS_OnValueChanged(this)
HealBot_Config.btexture[HealBot_Config.Current_Skin] = this:GetValue();
getglobal(this:GetName().."Text"):SetText(this.text .. ": " .. this:GetValue());
HealBot_Action_ResetSkin()
end
+-- HealBot_Options_BarHeightS_OnValueChanged: UI handler for OnValueChanged options panel.
function HealBot_Options_BarHeightS_OnValueChanged(this)
HealBot_Config.bheight[HealBot_Config.Current_Skin] = this:GetValue();
getglobal(this:GetName().."Text"):SetText(this.text .. ": " .. this:GetValue());
HealBot_Action_ResetSkin()
end
+-- HealBot_Options_BarWidthS_OnValueChanged: UI handler for OnValueChanged options panel.
function HealBot_Options_BarWidthS_OnValueChanged(this)
HealBot_Config.bwidth[HealBot_Config.Current_Skin] = this:GetValue();
getglobal(this:GetName().."Text"):SetText(this.text .. ": " .. this:GetValue());
HealBot_Action_ResetSkin()
end
+-- HealBot_Options_BarNumColsS_OnValueChanged: UI handler for OnValueChanged options panel.
function HealBot_Options_BarNumColsS_OnValueChanged(this)
HealBot_Config.numcols[HealBot_Config.Current_Skin] = this:GetValue();
getglobal(this:GetName().."Text"):SetText(this.text .. ": " .. this:GetValue());
HealBot_Action_ResetSkin()
end
+-- HealBot_Options_BarBRSpaceS_OnValueChanged: UI handler for OnValueChanged options panel.
function HealBot_Options_BarBRSpaceS_OnValueChanged(this)
HealBot_Config.brspace[HealBot_Config.Current_Skin] = this:GetValue();
getglobal(this:GetName().."Text"):SetText(this.text .. ": " .. this:GetValue());
HealBot_Action_ResetSkin()
end
+-- HealBot_Options_BarBCSpaceS_OnValueChanged: UI handler for OnValueChanged options panel.
function HealBot_Options_BarBCSpaceS_OnValueChanged(this)
HealBot_Config.bcspace[HealBot_Config.Current_Skin] = this:GetValue();
getglobal(this:GetName().."Text"):SetText(this.text .. ": " .. this:GetValue());
HealBot_Action_ResetSkin()
end
+-- HealBot_Options_FontHeight_OnValueChanged: UI handler for OnValueChanged options panel.
function HealBot_Options_FontHeight_OnValueChanged(this)
HealBot_Config.btextheight[HealBot_Config.Current_Skin] = this:GetValue();
getglobal(this:GetName().."Text"):SetText(this.text .. ": " .. this:GetValue());
HealBot_Action_ResetSkin()
end
+-- HealBot_Options_IconSizeS_OnValueChanged: UI handler for OnValueChanged options panel.
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
+-- HealBot_Options_AbortBarSize_OnValueChanged: UI handler for OnValueChanged options panel.
function HealBot_Options_AbortBarSize_OnValueChanged(this)
HealBot_Config.abortsize[HealBot_Config.Current_Skin] = this:GetValue();
getglobal(this:GetName().."Text"):SetText(this.text .. ": " .. this:GetValue());
HealBot_Action_ResetSkin()
end
+-- HealBot_Options_ActionAlpha_OnValueChanged: UI handler for OnValueChanged options panel.
function HealBot_Options_ActionAlpha_OnValueChanged(this)
HealBot_Config.backcola[HealBot_Config.Current_Skin] = HealBot_Options_Pct_OnValueChanged(this);
HealBot_Action_ResetSkin()
end
+-- HealBot_Options_BarAlpha_OnValueChanged: UI handler for OnValueChanged options panel.
function HealBot_Options_BarAlpha_OnValueChanged(this)
HealBot_Config.Barcola[HealBot_Config.Current_Skin] = HealBot_Options_Pct_OnValueChanged(this);
HealBot_Action_ResetSkin()
end
+-- HealBot_Options_BarAlphaInHeal_OnValueChanged: UI handler for OnValueChanged options panel.
function HealBot_Options_BarAlphaInHeal_OnValueChanged(this)
HealBot_Config.BarcolaInHeal[HealBot_Config.Current_Skin] = HealBot_Options_Pct_OnValueChanged(this);
HealBot_Action_ResetSkin()
end
+-- HealBot_Options_BarAlphaDis_OnValueChanged: UI handler for OnValueChanged options panel.
function HealBot_Options_BarAlphaDis_OnValueChanged(this)
HealBot_Config.bardisa[HealBot_Config.Current_Skin] = HealBot_Options_Pct_OnValueChanged(this);
HealBot_Action_ResetSkin()
end
+-- HealBot_SkinColorpick_OnClick: Opens color picker for skin customization.
function HealBot_SkinColorpick_OnClick(SkinType)
HealBot_ColourObjWaiting=SkinType;
@@ -105,6 +121,7 @@ function HealBot_SkinColorpick_OnClick(SkinType)
HealBot_Config.babortcola[HealBot_Config.Current_Skin])
end
end
+-- HealBot_SetSkinColours: Applies skin configuration to UI elements.
function HealBot_SetSkinColours()
-- Cache the current skin configuration for performance and readability
local skin = HealBot_Config.Current_Skin
@@ -202,76 +219,97 @@ function HealBot_SetSkinColours()
HealBot_Action_PartyChanged()
end
+-- HealBot_Options_AlertLevel_OnValueChanged: UI handler for OnValueChanged options panel.
function HealBot_Options_AlertLevel_OnValueChanged(this)
HealBot_Config.AlertLevel = HealBot_Options_Pct_OnValueChanged(this);
HealBot_Action_Refresh();
end
+-- HealBot_Options_AutoShow_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_AutoShow_OnLoad(this)
getglobal(this:GetName().."Text"):SetText(HEALBOT_OPTIONS_AUTOSHOW);
end
+-- HealBot_Options_AutoShow_OnClick: UI handler for OnClick options panel.
function HealBot_Options_AutoShow_OnClick(this)
HealBot_Config.AutoClose = this:GetChecked() or 0;
HealBot_Action_Refresh();
end
+-- HealBot_Options_PanelSounds_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_PanelSounds_OnLoad(this)
getglobal(this:GetName().."Text"):SetText(HEALBOT_OPTIONS_PANELSOUNDS);
end
+-- HealBot_Options_PanelSounds_OnClick: UI handler for OnClick options panel.
function HealBot_Options_PanelSounds_OnClick(this)
HealBot_Config.PanelSounds = this:GetChecked() or 0;
end
+-- HealBot_Options_ActionMouseover_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_ActionMouseover_OnLoad(this, text)
getglobal(this:GetName().."Text"):SetText(text);
end
+-- HealBot_Options_ActionMouseover_OnClick: UI handler for OnClick options panel.
function HealBot_Options_ActionMouseover_OnClick(this)
HealBot_Config.ActionMouseover = this:GetChecked() or 0;
end
+-- HealBot_Options_ActionLocked_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_ActionLocked_OnLoad(this)
getglobal(this:GetName().."Text"):SetText(HEALBOT_OPTIONS_ACTIONLOCKED);
end
+-- HealBot_Options_ActionLocked_OnClick: UI handler for OnClick options panel.
function HealBot_Options_ActionLocked_OnClick(this)
HealBot_Config.ActionLocked = this:GetChecked() or 0;
end
+-- HealBot_Options_HideOptions_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_HideOptions_OnLoad(this,text)
getglobal(this:GetName().."Text"):SetText(text);
end
+-- HealBot_Options_HideOptions_OnClick: UI handler for OnClick options panel.
function HealBot_Options_HideOptions_OnClick(this)
HealBot_Config.HideOptions = this:GetChecked() or 0;
HealBot_Action_PartyChanged();
end
+-- HealBot_Options_HideAbort_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_HideAbort_OnLoad(this,text)
getglobal(this:GetName().."Text"):SetText(text);
end
+-- HealBot_Options_HideAbort_OnClick: UI handler for OnClick options panel.
function HealBot_Options_HideAbort_OnClick(this)
HealBot_Config.HideAbort = this:GetChecked() or 0;
HealBot_Action_PartyChanged();
end
+-- HealBot_Options_GrowUpwards_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_GrowUpwards_OnLoad(this,text)
getglobal(this:GetName().."Text"):SetText(text);
end
+-- HealBot_Options_GrowUpwards_OnClick: UI handler for OnClick options panel.
function HealBot_Options_GrowUpwards_OnClick(this)
HealBot_Config.GrowUpwards = this:GetChecked() or 0;
HealBot_Action_PartyChanged();
end
+-- HealBot_Options_QualityRange_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_QualityRange_OnLoad(this,text)
getglobal(this:GetName().."Text"):SetText(text);
end
+-- HealBot_Options_QualityRange_OnClick: UI handler for OnClick options panel.
function HealBot_Options_QualityRange_OnClick(this)
HealBot_Config.QualityRange = this:GetChecked() or 0;
HealBot_Action_PartyChanged();
end
+-- HealBot_Options_ProtectPvP_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_ProtectPvP_OnLoad(this,text)
getglobal(this:GetName().."Text"):SetText(text);
end
+-- HealBot_Options_ProtectPvP_OnClick: UI handler for OnClick options panel.
function HealBot_Options_ProtectPvP_OnClick(this)
HealBot_Config.ProtectPvP = this:GetChecked() or 0;
HealBot_Action_Refresh();
end
+-- HealBot_Options_FramePaddingS_OnValueChanged: UI handler for OnValueChanged options panel.
function HealBot_Options_FramePaddingS_OnValueChanged(this)
if not HealBot_Config.bpadding then HealBot_Config.bpadding = {} end
HealBot_Config.bpadding[HealBot_Config.Current_Skin] = this:GetValue();
getglobal(this:GetName().."Text"):SetText(this.text .. ": " .. this:GetValue());
HealBot_Action_ResetSkin()
end
+-- HealBot_Options_BorderThicknessS_OnValueChanged: UI handler for OnValueChanged options panel.
function HealBot_Options_BorderThicknessS_OnValueChanged(this)
if not HealBot_Config.bboffset then HealBot_Config.bboffset = {} end
HealBot_Config.bboffset[HealBot_Config.Current_Skin] = this:GetValue();
@@ -279,15 +317,18 @@ function HealBot_Options_BorderThicknessS_OnValueChanged(this)
HealBot_Action_ResetSkin()
end
+-- HealBot_Options_HideParty_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_HideParty_OnLoad(this, text)
getglobal(this:GetName().."Text"):SetText(text);
end
+-- HealBot_Options_HideParty_OnClick: UI handler for OnClick options panel.
function HealBot_Options_HideParty_OnClick(this)
HealBot_Config.HideParty = this:GetChecked() or 0;
HealBot_Options_TogglePartyFrames();
end
+-- HealBot_Options_TogglePartyFrames: UI handler for TogglePartyFrames options panel.
function HealBot_Options_TogglePartyFrames()
if HealBot_Config.HideParty == 1 then
if HidePartyFrame then HidePartyFrame(); end
diff --git a/HealBot_Options_Healing.lua b/HealBot_Options_Healing.lua
index 772f17b..83fe512 100644
--- a/HealBot_Options_Healing.lua
+++ b/HealBot_Options_Healing.lua
@@ -1,52 +1,65 @@
-- HealBot Options panel file: HealBot_Options_Healing.lua
-- Split from original HealBot_Options.lua
+-- HealBot_Options_GroupHeals_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_GroupHeals_OnLoad(this,text)
this.text = text
getglobal(this:GetName().."Text"):SetText(text);
end
+-- HealBot_Options_GroupHeals_OnClick: UI handler for OnClick options panel.
function HealBot_Options_GroupHeals_OnClick(this)
HealBot_Config.GroupHeals = this:GetChecked() or 0;
HealBot_RecalcParty();
end
+-- HealBot_Options_TankHeals_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_TankHeals_OnLoad(this,text)
this.text = text
getglobal(this:GetName().."Text"):SetText(text);
end
+-- HealBot_Options_TankHeals_OnClick: UI handler for OnClick options panel.
function HealBot_Options_TankHeals_OnClick(this)
HealBot_Config.TankHeals = this:GetChecked() or 0;
HealBot_RecalcParty();
end
+-- HealBot_Options_TargetHeals_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_TargetHeals_OnLoad(this,text)
this.text = text
getglobal(this:GetName().."Text"):SetText(text);
end
+-- HealBot_Options_TargetHeals_OnClick: UI handler for OnClick options panel.
function HealBot_Options_TargetHeals_OnClick(this)
HealBot_Config.TargetHeals = this:GetChecked() or 0;
HealBot_RecalcParty();
end
+-- HealBot_Options_EmergencyHeals_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_EmergencyHeals_OnLoad(this,text)
this.text = text
getglobal(this:GetName().."Text"):SetText(text);
end
+-- HealBot_Options_EmergencyHeals_OnClick: UI handler for OnClick options panel.
function HealBot_Options_EmergencyHeals_OnClick(this)
HealBot_Config.EmergencyHeals = this:GetChecked() or 0;
HealBot_RecalcParty();
end
+-- HealBot_Options_PetHeals_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_PetHeals_OnLoad(this,text)
this.text = text
getglobal(this:GetName().."Text"):SetText(text);
end
+-- HealBot_Options_PetHeals_OnClick: UI handler for OnClick options panel.
function HealBot_Options_PetHeals_OnClick(this)
HealBot_Config.PetHeals = this:GetChecked() or 0;
HealBot_RecalcParty();
end
+-- HealBot_Options_OverHeal_OnValueChanged: UI handler for OnValueChanged options panel.
function HealBot_Options_OverHeal_OnValueChanged(this)
HealBot_Config.OverHeal = HealBot_Options_Pct_OnValueChanged(this);
end
+-- HealBot_Options_EFClass_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_EFClass_OnLoad(this,text)
getglobal(this:GetName().."Text"):SetText(text);
end
+-- HealBot_Options_EFClass_OnClick: UI handler for OnClick options panel.
function HealBot_Options_EFClass_OnClick(this)
if HealBot_Config.EmergencyFClass==1 then
HealBot_Config.EmergIncMelee[HEALBOT_DRUID] = HealBot_Options_EFClassDruid:GetChecked() or 0;
@@ -100,6 +113,7 @@ HealBot_Options_HealthText_List = {
"Health Deficit",
}
+-- HealBot_Options_HealthText_DropDown: UI handler for DropDown options panel.
function HealBot_Options_HealthText_DropDown()
for i=1, getn(HealBot_Options_HealthText_List), 1 do
local info = {};
@@ -109,11 +123,13 @@ function HealBot_Options_HealthText_DropDown()
end
end
+-- HealBot_Options_HealthText_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_HealthText_OnLoad(this)
UIDropDownMenu_Initialize(this, HealBot_Options_HealthText_DropDown);
UIDropDownMenu_SetWidth(110, this);
end
+-- HealBot_Options_HealthText_OnSelect: UI handler for OnSelect options panel.
function HealBot_Options_HealthText_OnSelect()
HealBot_Config.ShowHealthText = this:GetID() - 1;
HealBot_UIDropDownMenu_SetSelectedID(HealBot_Options_HealthText, this:GetID())
@@ -127,6 +143,7 @@ local HealBot_Options_EmergencyFClass_List = {
HEALBOT_CLASSES_CUSTOM,
}
+-- HealBot_Options_EmergencyFClass_DropDown: UI handler for DropDown options panel.
function HealBot_Options_EmergencyFClass_DropDown()
for i=1, getn(HealBot_Options_EmergencyFClass_List), 1 do
local info = {};
@@ -136,27 +153,32 @@ function HealBot_Options_EmergencyFClass_DropDown()
end
end
+-- HealBot_Options_EmergencyFClass_Initialize: UI handler for Initialize options panel.
function HealBot_Options_EmergencyFClass_Initialize()
UIDropDownMenu_Initialize(HealBot_Options_EmergencyFClass,HealBot_Options_EmergencyFClass_DropDown)
end
+-- HealBot_Options_EmergencyFClass_Refresh: UI handler for Refresh options panel.
function HealBot_Options_EmergencyFClass_Refresh(onselect)
if not HealBot_Config.EmergencyFClass then return end
if not onselect then HealBot_Options_EmergencyFClass_Initialize() end -- or wrong menu may be used !
HealBot_UIDropDownMenu_SetSelectedID(HealBot_Options_EmergencyFClass,HealBot_Config.EmergencyFClass)
end
+-- HealBot_Options_EmergencyFClass_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_EmergencyFClass_OnLoad()
UIDropDownMenu_Initialize(this, HealBot_Options_EmergencyFClass_DropDown)
UIDropDownMenu_SetWidth(100, this)
end
+-- HealBot_Options_EmergencyFClass_OnSelect: UI handler for OnSelect options panel.
function HealBot_Options_EmergencyFClass_OnSelect()
HealBot_Config.EmergencyFClass = this:GetID()
HealBot_Options_EmergencyFClass_Refresh(true)
HealBot_Options_EFClass_Reset()
end
+-- HealBot_Options_EFClass_Reset: UI handler for Reset options panel.
function HealBot_Options_EFClass_Reset()
if HealBot_Config.EmergencyFClass==1 then
HealBot_Options_EFClassDruid:SetChecked(HealBot_Config.EmergIncMelee[HEALBOT_DRUID]);
@@ -210,6 +232,7 @@ local HealBot_Options_ExtraSort_List = {
HEALBOT_SORTBY_MAXHEALTH,
}
+-- HealBot_Options_ExtraSort_DropDown: UI handler for DropDown options panel.
function HealBot_Options_ExtraSort_DropDown()
for i=1, getn(HealBot_Options_ExtraSort_List), 1 do
local info = {};
@@ -219,21 +242,25 @@ function HealBot_Options_ExtraSort_DropDown()
end
end
+-- HealBot_Options_ExtraSort_Initialize: UI handler for Initialize options panel.
function HealBot_Options_ExtraSort_Initialize()
UIDropDownMenu_Initialize(HealBot_Options_ExtraSort,HealBot_Options_ExtraSort_DropDown)
end
+-- HealBot_Options_ExtraSort_Refresh: UI handler for Refresh options panel.
function HealBot_Options_ExtraSort_Refresh(onselect)
if not HealBot_Config.ExtraOrder then return end
if not onselect then HealBot_Options_ExtraSort_Initialize() end -- or wrong menu may be used !
HealBot_UIDropDownMenu_SetSelectedID(HealBot_Options_ExtraSort,HealBot_Config.ExtraOrder)
end
+-- HealBot_Options_ExtraSort_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_ExtraSort_OnLoad()
UIDropDownMenu_Initialize(this, HealBot_Options_ExtraSort_DropDown)
UIDropDownMenu_SetWidth(100, this)
end
+-- HealBot_Options_ExtraSort_OnSelect: UI handler for OnSelect options panel.
function HealBot_Options_ExtraSort_OnSelect()
HealBot_Config.ExtraOrder = this:GetID()
HealBot_Options_ExtraSort_Refresh(true)
@@ -242,6 +269,7 @@ end
--------------------------------------------------------------------------------
+-- HealBot_Options_EmergencyFilter_DropDown: UI handler for DropDown options panel.
function HealBot_Options_EmergencyFilter_DropDown()
for i=1, getn(HealBot_Options_EmergencyFilter_List), 1 do
local info = {};
@@ -252,11 +280,13 @@ function HealBot_Options_EmergencyFilter_DropDown()
end
+-- HealBot_Options_EmergencyFilter_Initialize: UI handler for Initialize options panel.
function HealBot_Options_EmergencyFilter_Initialize()
UIDropDownMenu_Initialize(HealBot_Options_EmergencyFilter,HealBot_Options_EmergencyFilter_DropDown)
end
+-- HealBot_Options_EmergencyFilter_Refresh: UI handler for Refresh options panel.
function HealBot_Options_EmergencyFilter_Refresh(onselect)
if not HealBot_Config.EmergIncMonitor then return end
if not onselect then HealBot_Options_EmergencyFilter_Initialize() end -- or wrong menu may be used !
@@ -264,18 +294,21 @@ function HealBot_Options_EmergencyFilter_Refresh(onselect)
end
+-- HealBot_Options_EmergencyFilter_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_EmergencyFilter_OnLoad()
UIDropDownMenu_Initialize(this, HealBot_Options_EmergencyFilter_DropDown)
UIDropDownMenu_SetWidth(100, this)
end
+-- HealBot_Options_EmergencyFilter_OnSelect: UI handler for OnSelect options panel.
function HealBot_Options_EmergencyFilter_OnSelect()
HealBot_Config.EmergIncMonitor = this:GetID()
HealBot_Options_EmergencyFilter_Refresh(true)
HealBot_Options_EmergencyFilter_Reset()
end
+-- HealBot_Options_EmergencyFilter_Reset: UI handler for Reset options panel.
function HealBot_Options_EmergencyFilter_Reset()
HealBot_EmergInc[HEALBOT_DRUID] = 0;
@@ -341,15 +374,3 @@ function HealBot_Options_EmergencyFilter_Reset()
HealBot_Action_PartyChanged()
end
-
-
-
---------------------------------------------------------------------------------
-
-
-
-
-
-
---------------------------------------------------------------------------------
-
diff --git a/HealBot_Options_Integrations.lua b/HealBot_Options_Integrations.lua
index e8a6ecd..41cb703 100644
--- a/HealBot_Options_Integrations.lua
+++ b/HealBot_Options_Integrations.lua
@@ -1,3 +1,4 @@
+-- HealBot_Options_Integrations_OnShow: UI handler for OnShow options panel.
function HealBot_Options_Integrations_OnShow(this)
HealBot_Options_Integrations_UnitXP:SetChecked(HealBot_Config.HealBot_Integrations_UnitXP);
HealBot_Options_Integrations_Nampower:SetChecked(HealBot_Config.HealBot_Integrations_Nampower);
diff --git a/HealBot_Options_Skins.lua b/HealBot_Options_Skins.lua
index 9a0e2a5..0c81e1d 100644
--- a/HealBot_Options_Skins.lua
+++ b/HealBot_Options_Skins.lua
@@ -1,12 +1,14 @@
-- HealBot Options panel file: HealBot_Options_Skins.lua
-- Split from original HealBot_Options.lua
+-- HealBot_Options_BarMaxRowsS_OnValueChanged: UI handler for OnValueChanged options panel.
function HealBot_Options_BarMaxRowsS_OnValueChanged(this)
if not HealBot_Config.bmaxrows then HealBot_Config.bmaxrows = {} end
HealBot_Config.bmaxrows[HealBot_Config.Current_Skin] = this:GetValue()
HealBot_Action_PartyChanged()
end
+-- HealBot_Options_GridOrientation_OnClick: UI handler for OnClick options panel.
function HealBot_Options_GridOrientation_OnClick(this)
if not HealBot_Config.GridOrientation then HealBot_Config.GridOrientation = {} end
if this:GetChecked() then
@@ -17,6 +19,7 @@ function HealBot_Options_GridOrientation_OnClick(this)
HealBot_Action_PartyChanged()
end
+-- HealBot_Options_NewSkin_OnTextChanged: UI handler for OnTextChanged options panel.
function HealBot_Options_NewSkin_OnTextChanged(this)
local text= this:GetText()
if string.len(text)>0 then
@@ -25,6 +28,7 @@ function HealBot_Options_NewSkin_OnTextChanged(this)
HealBot_Options_NewSkinb:Disable();
end
end
+-- HealBot_Options_NewSkinb_OnClick: UI handler for OnClick options panel.
function HealBot_Options_NewSkinb_OnClick(this)
HealBot_Config.numcols[HealBot_Options_NewSkin:GetText()] = HealBot_Config.numcols[HealBot_Config.Current_Skin]
if not HealBot_Config.bmaxrows then HealBot_Config.bmaxrows = {} end
@@ -73,6 +77,7 @@ function HealBot_Options_NewSkinb_OnClick(this)
HealBot_Options_SetSkins()
HealBot_Options_NewSkin:SetText("")
end
+-- HealBot_Options_DeleteSkin_OnClick: UI handler for OnClick options panel.
function HealBot_Options_DeleteSkin_OnClick(this)
if HealBot_Config.Current_Skin~=HEALBOT_SKINS_STD then
HealBot_Config.numcols[HealBot_Options_SkinsText:GetText()] = nil
@@ -120,6 +125,7 @@ function HealBot_Options_DeleteSkin_OnClick(this)
HealBot_Options_SetSkins()
end
end
+-- HealBot_Options_Skins_DropDown: UI handler for DropDown options panel.
function HealBot_Options_Skins_DropDown()
for i=1, getn(HealBot_Skins), 1 do
local info = {};
@@ -128,18 +134,22 @@ function HealBot_Options_Skins_DropDown()
UIDropDownMenu_AddButton(info);
end
end
+-- HealBot_Options_Skins_Initialize: UI handler for Initialize options panel.
function HealBot_Options_Skins_Initialize()
UIDropDownMenu_Initialize(HealBot_Options_Skins,HealBot_Options_Skins_DropDown)
end
+-- HealBot_Options_Skins_Refresh: UI handler for Refresh options panel.
function HealBot_Options_Skins_Refresh(onselect)
if not HealBot_Config.Skin_ID then return end
if not onselect then HealBot_Options_Skins_Initialize() end -- or wrong menu may be used !
HealBot_UIDropDownMenu_SetSelectedID(HealBot_Options_Skins,HealBot_Config.Skin_ID)
end
+-- HealBot_Options_Skins_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_Skins_OnLoad()
UIDropDownMenu_Initialize(this, HealBot_Options_Skins_DropDown)
UIDropDownMenu_SetWidth(100, this)
end
+-- HealBot_Options_Skins_OnSelect: UI handler for OnSelect options panel.
function HealBot_Options_Skins_OnSelect()
HealBot_Config.Skin_ID = this:GetID()
HealBot_Options_Skins_Refresh(true)
diff --git a/HealBot_Options_Spells.lua b/HealBot_Options_Spells.lua
index 4c63e8b..c8f962c 100644
--- a/HealBot_Options_Spells.lua
+++ b/HealBot_Options_Spells.lua
@@ -1,9 +1,11 @@
-- HealBot Options panel file: HealBot_Options_Spells.lua
-- Split from original HealBot_Options.lua
+-- HealBot_ComboButtons_Button_OnLoad: UI handler for dropdown combo box.
function HealBot_ComboButtons_Button_OnLoad(this,text)
getglobal(this:GetName().."Text"):SetText(text);
end
+-- HealBot_ComboButtons_Button_OnClick: Click event handler.
function HealBot_ComboButtons_Button_OnClick(this,id)
if HealBot_Options_ComboButtons_Button>0 then
getglobal("HealBot_ComboButtons_Button"..HealBot_Options_ComboButtons_Button):SetChecked(nil);
@@ -14,27 +16,35 @@ function HealBot_ComboButtons_Button_OnClick(this,id)
end
HealBot_Options_ComboClass_Text()
end
+-- HealBot_Options_ShowTooltip_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_ShowTooltip_OnLoad(this,text)
getglobal(this:GetName().."Text"):SetText(text);
end
+-- HealBot_Options_ShowTooltip_OnClick: UI handler for OnClick options panel.
function HealBot_Options_ShowTooltip_OnClick(this)
HealBot_Config.ShowTooltip = this:GetChecked() or 0;
end
+-- HealBot_Options_ShowTooltipTarget_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_ShowTooltipTarget_OnLoad(this,text)
getglobal(this:GetName().."Text"):SetText(text);
end
+-- HealBot_Options_ShowTooltipTarget_OnClick: UI handler for OnClick options panel.
function HealBot_Options_ShowTooltipTarget_OnClick(this)
HealBot_Config.Tooltip_ShowTarget = this:GetChecked() or 0;
end
+-- HealBot_Options_ShowTooltipSpellDetail_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_ShowTooltipSpellDetail_OnLoad(this,text)
getglobal(this:GetName().."Text"):SetText(text);
end
+-- HealBot_Options_ShowTooltipSpellDetail_OnClick: UI handler for OnClick options panel.
function HealBot_Options_ShowTooltipSpellDetail_OnClick(this)
HealBot_Config.Tooltip_ShowSpellDetail = this:GetChecked() or 0;
end
+-- HealBot_Options_ShowTooltipInstant_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_ShowTooltipInstant_OnLoad(this,text)
getglobal(this:GetName().."Text"):SetText(text);
end
+-- HealBot_Options_ShowTooltipInstant_OnClick: UI handler for OnClick options panel.
function HealBot_Options_ShowTooltipInstant_OnClick(this)
HealBot_Config.Tooltip_Recommend = this:GetChecked() or 0;
end
@@ -46,6 +56,7 @@ local HealBot_Options_TooltipPos_List = {
HEALBOT_TOOLTIP_POSBELOW,
}
+-- HealBot_Options_TooltipPos_DropDown: UI handler for DropDown options panel.
function HealBot_Options_TooltipPos_DropDown()
for i=1, getn(HealBot_Options_TooltipPos_List), 1 do
local info = {};
@@ -55,21 +66,25 @@ function HealBot_Options_TooltipPos_DropDown()
end
end
+-- HealBot_Options_TooltipPos_Initialize: UI handler for Initialize options panel.
function HealBot_Options_TooltipPos_Initialize()
UIDropDownMenu_Initialize(HealBot_Options_TooltipPos,HealBot_Options_TooltipPos_DropDown)
end
+-- HealBot_Options_TooltipPos_Refresh: UI handler for Refresh options panel.
function HealBot_Options_TooltipPos_Refresh(onselect)
if not HealBot_Config.TooltipPos then return end
if not onselect then HealBot_Options_TooltipPos_Initialize() end -- or wrong menu may be used !
HealBot_UIDropDownMenu_SetSelectedID(HealBot_Options_TooltipPos,HealBot_Config.TooltipPos)
end
+-- HealBot_Options_TooltipPos_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_TooltipPos_OnLoad()
UIDropDownMenu_Initialize(this, HealBot_Options_TooltipPos_DropDown)
UIDropDownMenu_SetWidth(128, this)
end
+-- HealBot_Options_TooltipPos_OnSelect: UI handler for OnSelect options panel.
function HealBot_Options_TooltipPos_OnSelect()
HealBot_Config.TooltipPos = this:GetID()
HealBot_Options_TooltipPos_Refresh(true)
@@ -91,6 +106,7 @@ local HealBot_Options_ComboClass_List = {
+-- HealBot_Options_ComboClass_Text: UI handler for Text options panel.
function HealBot_Options_ComboClass_Text()
local class=UnitClass("Player");
local combo = HealBot_Config.KeyCombo[class]
@@ -108,6 +124,7 @@ end
+-- HealBot_Options_ComboClass_Button: UI handler for Button options panel.
function HealBot_Options_ComboClass_Button()
local button = "Left"
if HealBot_Options_ComboButtons_Button==2 then button = "Middle"; end
@@ -128,10 +145,12 @@ ColorPickerFrame.func = HealBot_Returned_Colours
--------------------------------------------------------------------------------
+-- HealBot_Options_EditBox_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_EditBox_OnLoad(this,text)
getglobal(this:GetName().."Text"):SetText(text);
end
+-- HealBot_Options_Click_OnTextChanged: UI handler for OnTextChanged options panel.
function HealBot_Options_Click_OnTextChanged(this)
local class=UnitClass("Player");
if not HealBot_Config.KeyCombo[class] then HealBot_Config.KeyCombo[class] = {} end
@@ -141,6 +160,7 @@ function HealBot_Options_Click_OnTextChanged(this)
HealBot_Options_KeyCombo_Change()
end
+-- HealBot_Options_Shift_OnTextChanged: UI handler for OnTextChanged options panel.
function HealBot_Options_Shift_OnTextChanged(this)
local class=UnitClass("Player");
if not HealBot_Config.KeyCombo[class] then HealBot_Config.KeyCombo[class] = {} end
@@ -150,6 +170,7 @@ function HealBot_Options_Shift_OnTextChanged(this)
HealBot_Options_KeyCombo_Change()
end
+-- HealBot_Options_Ctrl_OnTextChanged: UI handler for OnTextChanged options panel.
function HealBot_Options_Ctrl_OnTextChanged(this)
local class=UnitClass("Player");
if not HealBot_Config.KeyCombo[class] then HealBot_Config.KeyCombo[class] = {} end
@@ -159,6 +180,7 @@ function HealBot_Options_Ctrl_OnTextChanged(this)
HealBot_Options_KeyCombo_Change()
end
+-- HealBot_Options_ShiftCtrl_OnTextChanged: UI handler for OnTextChanged options panel.
function HealBot_Options_ShiftCtrl_OnTextChanged(this)
local class=UnitClass("Player");
if not HealBot_Config.KeyCombo[class] then HealBot_Config.KeyCombo[class] = {} end
@@ -168,32 +190,20 @@ function HealBot_Options_ShiftCtrl_OnTextChanged(this)
HealBot_Options_KeyCombo_Change()
end
+-- HealBot_Options_KeyCombo_Change: Applies binding combo updates.
function HealBot_Options_KeyCombo_Change()
local class=UnitClass("Player");
HealBot_Config.KeyCombo[class]=HealBot_Config.KeyCombo[class];
end
+-- HealBot_Options_EnableHealthy_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_EnableHealthy_OnLoad(this,text)
getglobal(this:GetName().."Text"):SetText(text);
end
+-- HealBot_Options_EnableHealthy_OnClick: UI handler for OnClick options panel.
function HealBot_Options_EnableHealthy_OnClick(this)
HealBot_Config.EnableHealthy = this:GetChecked() or 0;
HealBot_Action_EnableButtons();
end
-
---------------------------------------------------------------------------------
-
-
-
-
-
-
-
-
-
---------------------------------------------------------------------------------
--- Chat Custom Messages UI Logic
---------------------------------------------------------------------------------
-
diff --git a/HealBot_View_Layout.lua b/HealBot_View_Layout.lua
index 4283859..f53d49d 100644
--- a/HealBot_View_Layout.lua
+++ b/HealBot_View_Layout.lua
@@ -17,6 +17,7 @@ HealBot_Action_HealFocus = {};
HealBot_Action_HealButtons = {};
HealBot_Action_UnitButtons = {};
+-- HealBot_Action_SetTexture: Internal utility: HealBot_Action_SetTexture
function HealBot_Action_SetTexture(bar, btexture)
if not bar then return end
if btexture == 10 then
@@ -26,6 +27,7 @@ function HealBot_Action_SetTexture(bar, btexture)
end
end
+-- HealBot_HealthColor: Computes health bar RGBA based on debuffs and class.
function HealBot_HealthColor(unit, hlth, maxhlth)
if HealBot_UnitDebuff[unit] then
local debuff_type = HealBot_UnitDebuff[unit]
@@ -85,6 +87,7 @@ function HealBot_HealthColor(unit, hlth, maxhlth)
return r, g, b, a;
end
+-- HealBot_Action_HealthBar: Internal utility: HealBot_Action_HealthBar
function HealBot_Action_HealthBar(button)
if not button.bar then
button.bar = getglobal(button:GetName() .. "Bar")
@@ -92,6 +95,7 @@ function HealBot_Action_HealthBar(button)
return button.bar;
end
+-- HealBot_Action_HealthBar2: Internal utility: HealBot_Action_HealthBar2
function HealBot_Action_HealthBar2(button)
if not button.bar2 then
button.bar2 = getglobal(button:GetName() .. "Bar2")
@@ -99,6 +103,7 @@ function HealBot_Action_HealthBar2(button)
return button.bar2;
end
+-- HealBot_Action_EnableButton: Updates a button's health, color, text, and debuffs.
function HealBot_Action_EnableButton(button)
local unit = button.unit;
local state = HealBot_Model.units[unit]
@@ -270,12 +275,14 @@ function HealBot_Action_EnableButton(button)
end
end
+-- HealBot_Action_EnableButtons: Internal utility: HealBot_Action_EnableButtons
function HealBot_Action_EnableButtons()
for index, button in pairs(HealBot_Action_HealButtons) do
HealBot_Action_EnableButton(button)
end
end
+-- HealBot_Action_RefreshButton: Calls EnableButton if unit is valid.
function HealBot_Action_RefreshButton(button)
if not button then return end
local unit = button.unit;
@@ -284,6 +291,7 @@ function HealBot_Action_RefreshButton(button)
end
end
+-- HealBot_Action_ResetSkin: Internal utility: HealBot_Action_ResetSkin
function HealBot_Action_ResetSkin()
HealBot_Action_PartyChanged()
if HealBot_Options:IsVisible() then
@@ -299,6 +307,7 @@ function HealBot_Action_ResetSkin()
end
end
+-- HealBot_Action_RefreshButtons: Refreshes all active unit buttons.
function HealBot_Action_RefreshButtons(unit)
if unit and HealBot_Action_UnitButtons[unit] then
for index, button in pairs(HealBot_Action_UnitButtons[unit]) do
@@ -311,6 +320,7 @@ function HealBot_Action_RefreshButtons(unit)
end
end
+-- HealBot_Action_RefreshPower: Fast path: updates only mana bar textures.
function HealBot_Action_RefreshPower(unit)
if not unit or not HealBot_Action_UnitButtons[unit] then return end
local state = HealBot_Model.units[unit]
@@ -326,6 +336,7 @@ function HealBot_Action_RefreshPower(unit)
end
end
+-- HealBot_Action_PositionButton: Positions a button element within the grid.
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
@@ -361,6 +372,7 @@ function HealBot_Action_PositionButton(button, OsetX, OsetY, bwidth, bheight, ch
return OsetY;
end
+-- HealBot_Action_PositionButtonHorizontal: Internal utility: HealBot_Action_PositionButtonHorizontal
function HealBot_Action_PositionButtonHorizontal(button, OsetX, OsetY, bwidth, bheight, checked, header)
local bcspace = HealBot_Config.bcspace[HealBot_Config.Current_Skin] or 3;
if header then
@@ -396,6 +408,7 @@ function HealBot_Action_PositionButtonHorizontal(button, OsetX, OsetY, bwidth, b
return OsetX;
end
+-- HealBot_Action_SetHeightWidth: Resizes the main panel frame to fit content.
function HealBot_Action_SetHeightWidth(width, height, bwidth)
if HealBot_ActionHeight then
HealBot_Action:SetHeight(HealBot_ActionHeight);
@@ -421,6 +434,7 @@ function HealBot_Action_SetHeightWidth(width, height, bwidth)
HealBot_Action:SetWidth(width + bwidth + bpadding)
end
+-- HealBot_Action_SetHealButton: Assigns a unit string to a grid button slot.
function HealBot_Action_SetHealButton(index, unit)
if not index then
HealBot_Action_HealButtons = {};
@@ -440,6 +454,7 @@ function HealBot_Action_SetHealButton(index, unit)
return button;
end
+-- HealBot_Action_PartyChanged: Rebuilds the entire grid layout based on roster.
function HealBot_Action_PartyChanged()
if HealBot_IsFighting then
HealBot_Action_AppendNewUnits()
@@ -1018,6 +1033,7 @@ function HealBot_Action_PartyChanged()
HealBot_Action_ShowFrame();
end
+-- HealBot_Action_ShowFrame: Internal utility: HealBot_Action_ShowFrame
function HealBot_Action_ShowFrame()
if HealBot_Config.ActionVisible == 1 then
if HealBot_Config.HideSolo == 1 and GetNumPartyMembers() == 0 and GetNumRaidMembers() == 0 then
@@ -1030,6 +1046,7 @@ function HealBot_Action_ShowFrame()
end
end
+-- HealBot_Action_Reset: Resets action panel position and rebuilds layout.
function HealBot_Action_Reset()
HealBot_Action:ClearAllPoints();
HealBot_Action:SetPoint("TOP", "MinimapCluster", "BOTTOM", 7, 10);
@@ -1038,6 +1055,7 @@ function HealBot_Action_Reset()
HealBot_Action_PartyChanged();
end
+-- HealBot_Action_Refresh: Alias for refreshing a unit button.
function HealBot_Action_Refresh(unit)
if (UnitIsDeadOrGhost("player")) or (UnitOnTaxi("player")) then
if HealBot_Config.AutoClose == 1 and HealBot_Config.ActionVisible ~= 0 then
@@ -1064,6 +1082,7 @@ function HealBot_Action_Refresh(unit)
end
end
end
+-- HealBot_Action_AppendUnit: Internal utility: HealBot_Action_AppendUnit
function HealBot_Action_AppendUnit(unit)
if not HealBot_Grid_LastI then return end
if HealBot_Grid_LastI >= 100 then return end
@@ -1126,6 +1145,7 @@ function HealBot_Action_AppendUnit(unit)
HealBot_Action_SetHeightWidth(totalOffsetX, totalOffsetY + bpadding, bwidth)
end
+-- HealBot_Action_AppendNewUnits: Internal utility: HealBot_Action_AppendNewUnits
function HealBot_Action_AppendNewUnits()
if not HealBot_Grid_LastI then return end
diff --git a/HealBot_View_Tooltip.lua b/HealBot_View_Tooltip.lua
index 7c1dd11..4c09515 100644
--- a/HealBot_View_Tooltip.lua
+++ b/HealBot_View_Tooltip.lua
@@ -3,6 +3,7 @@
HealBot_Action_TooltipUnit = nil
+-- HealBot_Tooltip_GetSpellColor: Internal utility: HealBot_Tooltip_GetSpellColor
function HealBot_Tooltip_GetSpellColor(spell)
local r, g, b = 1, 1, 0 -- default yellow
if spell and HealBot_Spells and HealBot_Spells[spell] and HealBot_Spells[spell].Mana then
@@ -13,6 +14,7 @@ function HealBot_Tooltip_GetSpellColor(spell)
return r, g, b
end
+-- HealBot_Action_RefreshTooltip: Builds and displays spell tooltip on hover.
function HealBot_Action_RefreshTooltip(unit)
if HealBot_Config.ShowTooltip==0 then return end
if not unit then unit = HealBot_Action_TooltipUnit end
@@ -149,6 +151,7 @@ function HealBot_Action_RefreshTooltip(unit)
HealBot_Tooltip:Show();
end
+-- HealBot_Action_Tooltip_SpellInfo: Internal utility: HealBot_Action_Tooltip_SpellInfo
function HealBot_Action_Tooltip_SpellInfo(spell,linenum)
local text
if HealBot_Spells[spell] then
@@ -184,6 +187,7 @@ function HealBot_Action_Tooltip_SpellInfo(spell,linenum)
return linenum
end
+-- HealBot_Action_Tooltip_SpellSummary: Internal utility: HealBot_Action_Tooltip_SpellSummary
function HealBot_Action_Tooltip_SpellSummary(spell)
local ret_val = " ";
if HealBot_Spells[spell] then
@@ -211,6 +215,7 @@ function HealBot_Action_Tooltip_SpellSummary(spell)
return ret_val
end
+-- HealBot_Action_Tooltip_CheckForInstant: Internal utility: HealBot_Action_Tooltip_CheckForInstant
function HealBot_Action_Tooltip_CheckForInstant(unit,spell,upd,linenum,check)
if HealBot_Spells[spell] then
if HealBot_Spells[spell].CastTime == 0 then
@@ -229,6 +234,7 @@ function HealBot_Action_Tooltip_CheckForInstant(unit,spell,upd,linenum,check)
return check+1,linenum;
end
+-- HealBot_Action_Tooltip_SetLineLeft: Internal utility: HealBot_Action_Tooltip_SetLineLeft
function HealBot_Action_Tooltip_SetLineLeft(Text,R,G,B,linenum)
local txtL = getglobal("HealBot_TooltipTextL" .. linenum)
txtL:SetTextColor(R,G,B)
@@ -236,6 +242,7 @@ function HealBot_Action_Tooltip_SetLineLeft(Text,R,G,B,linenum)
txtL:Show()
end
+-- HealBot_Action_Tooltip_SetLineRight: Internal utility: HealBot_Action_Tooltip_SetLineRight
function HealBot_Action_Tooltip_SetLineRight(Text,R,G,B,linenum)
local txtR = getglobal("HealBot_TooltipTextR" .. linenum)
txtR:SetTextColor(R,G,B)
@@ -243,6 +250,7 @@ function HealBot_Action_Tooltip_SetLineRight(Text,R,G,B,linenum)
txtR:Show()
end
+-- HealBot_Action_Tooltip_ClearLines: Internal utility: HealBot_Action_Tooltip_ClearLines
function HealBot_Action_Tooltip_ClearLines()
for j=1,30 do
local txtL = getglobal("HealBot_TooltipTextL" .. j)
@@ -254,6 +262,7 @@ function HealBot_Action_Tooltip_ClearLines()
end
end
+-- HealBot_Action_ShowTooltip: Internal utility: HealBot_Action_ShowTooltip
function HealBot_Action_ShowTooltip(this)
if HealBot_Config.ShowTooltip==0 then return end
if not this.unit then return end;
@@ -263,6 +272,7 @@ function HealBot_Action_ShowTooltip(this)
HealBot_Action_RefreshTooltip(this.unit);
end
+-- HealBot_Action_HideTooltip: Internal utility: HealBot_Action_HideTooltip
function HealBot_Action_HideTooltip(this)
if HealBot_Config.ShowTooltip==0 then return end
HealBot_Tooltip:Hide();
From 9c1f873b48994f136ec7281044989a3885a83f3f Mon Sep 17 00:00:00 2001
From: Bluewhale1337 <295648290+Bluewhale1337@users.noreply.github.com>
Date: Mon, 24 Aug 2026 12:52:44 +0200
Subject: [PATCH 08/22] Fix: removed legacy full ui teardowns of ui on refresh
functions with button-specific updates, add CDC toggle logic, and update
documentation for mod integrations
---
HealBot_Options_Buffs.lua | 8 ++++----
HealBot_Options_CDC.lua | 12 ++++++++++++
HealBot_Options_General.lua | 2 --
README.md | 1 +
4 files changed, 17 insertions(+), 6 deletions(-)
diff --git a/HealBot_Options_Buffs.lua b/HealBot_Options_Buffs.lua
index 417843d..53fb43d 100644
--- a/HealBot_Options_Buffs.lua
+++ b/HealBot_Options_Buffs.lua
@@ -10,13 +10,13 @@ function HealBot_Options_BuffWatch_OnClick(self)
else
HealBot_Options_BuffWatchInCombat:Enable()
end
- HealBot_RecalcParty();
+ HealBot_Action_RefreshButtons(nil);
end
-- HealBot_Options_BuffWatchInCombat_OnClick: UI handler for OnClick options panel.
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
-- HealBot_Options_BuffSelf_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_BuffSelf_OnLoad(self)
@@ -42,7 +42,7 @@ function HealBot_Options_BuffSelf_OnClick(self)
else
HealBot_Config.BuffWatchSelf[id] = 0
end
- HealBot_RecalcParty();
+ HealBot_Action_RefreshButtons(nil);
end
-- HealBot_Options_Buff_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_Buff_OnLoad(self)
@@ -87,7 +87,7 @@ function HealBot_Options_Buff_OnClick()
HealBot_UIDropDownMenu_SetSelectedID(frame, this.value + 1)
UIDropDownMenu_SetText(text, frame)
- HealBot_RecalcParty();
+ HealBot_Action_RefreshButtons(nil);
end
-- HealBot_Options_SetBuffs: UI handler for SetBuffs options panel.
function HealBot_Options_SetBuffs()
diff --git a/HealBot_Options_CDC.lua b/HealBot_Options_CDC.lua
index 23dbf09..bc37860 100644
--- a/HealBot_Options_CDC.lua
+++ b/HealBot_Options_CDC.lua
@@ -238,6 +238,18 @@ function HealBot_Options_CDCButRight_OnLoad()
UIDropDownMenu_Initialize(this, HealBot_Options_CDCButRight_DropDown)
UIDropDownMenu_SetWidth(140, this)
end
+-- HealBot_Options_CDCToggle_OnClick: UI handler for OnClick event.
+function HealBot_Options_CDCToggle_OnClick(spell, button, class)
+ local spellID = HealBot_GetSpellId(spell)
+ local spellName = HealBot_GetSpellName(spellID)
+
+ if HealBot_Config.CDCLeftText[class]==spellName then
+ HealBot_Config.CDCLeftText[class]="None"
+ elseif HealBot_Config.CDCRightText[class]==spellName then
+ HealBot_Config.CDCRightText[class]="None"
+ end
+ HealBot_Options_CDC_SetCombo(spell, button, class)
+end
-- HealBot_Options_CDCButLeft_OnSelect: UI handler for OnSelect options panel.
function HealBot_Options_CDCButLeft_OnSelect()
local class=UnitClass("Player");
diff --git a/HealBot_Options_General.lua b/HealBot_Options_General.lua
index 2a4def1..3a26a6a 100644
--- a/HealBot_Options_General.lua
+++ b/HealBot_Options_General.lua
@@ -291,7 +291,6 @@ end
-- HealBot_Options_QualityRange_OnClick: UI handler for OnClick options panel.
function HealBot_Options_QualityRange_OnClick(this)
HealBot_Config.QualityRange = this:GetChecked() or 0;
- HealBot_Action_PartyChanged();
end
-- HealBot_Options_ProtectPvP_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_ProtectPvP_OnLoad(this,text)
@@ -300,7 +299,6 @@ end
-- HealBot_Options_ProtectPvP_OnClick: UI handler for OnClick options panel.
function HealBot_Options_ProtectPvP_OnClick(this)
HealBot_Config.ProtectPvP = this:GetChecked() or 0;
- HealBot_Action_Refresh();
end
-- HealBot_Options_FramePaddingS_OnValueChanged: UI handler for OnValueChanged options panel.
function HealBot_Options_FramePaddingS_OnValueChanged(this)
diff --git a/README.md b/README.md
index 6c5c14f..e1d2537 100644
--- a/README.md
+++ b/README.md
@@ -37,6 +37,7 @@ Default installation path: `C:\Program Files\World of Warcraft\Interface\AddOns\
* **Customizable Health Text:** Dynamic unit health display (Name Only, Percentage, Real Health, or Health Deficit).
* **Non-Mana Resource Tracking:** Track Rage, Energy, and Focus for non-mana classes.
* **Highly Customizable Skins:** Fully configure dimensions (width, height), row spacing, column layouts, custom textures, opacity, class-colored frames, and outline of fonts.
+* **Additional Mods Integration:** Navigate to 'Extras' tab in Options to optionally enable integrations with `UnitXP_SP3` (for ultra-precise 3D range and Line of Sight checks), `nampower` (for accurate real-time heal/buff tracking), `SuperWoW` (for robust GUID-based state tracking), and `ClassicAPI` (for native +Healing bonuses and fast 3D distance checks).
### To be implemented
- **Strategy Pattern / Code Tree Splits:** Migrate heavy mod integrations (like Nampower aura tracking and SuperWoW UI rendering) into isolated code trees (e.g., `HealBot_Model_SuperWoW.lua`). This will allow dynamic overwriting of global functions at startup, eliminating the CPU overhead of running `if integration then` branch checks inside high-frequency update loops on Vanilla clients.
From 50661ac924bcd4e6f00e8da75d6f65a1e4d4b38a Mon Sep 17 00:00:00 2001
From: Bluewhale1337 <295648290+Bluewhale1337@users.noreply.github.com>
Date: Mon, 24 Aug 2026 18:25:04 +0200
Subject: [PATCH 09/22] Reverted previous class check on debuffs - only
dispellable by players class will be displayed + certain mechanical debuffs
like debuff from PW:S
---
HealBot_Options_CDC.lua | 35 +++++++++++++++++------------------
1 file changed, 17 insertions(+), 18 deletions(-)
diff --git a/HealBot_Options_CDC.lua b/HealBot_Options_CDC.lua
index bc37860..51ec1c8 100644
--- a/HealBot_Options_CDC.lua
+++ b/HealBot_Options_CDC.lua
@@ -238,18 +238,7 @@ function HealBot_Options_CDCButRight_OnLoad()
UIDropDownMenu_Initialize(this, HealBot_Options_CDCButRight_DropDown)
UIDropDownMenu_SetWidth(140, this)
end
--- HealBot_Options_CDCToggle_OnClick: UI handler for OnClick event.
-function HealBot_Options_CDCToggle_OnClick(spell, button, class)
- local spellID = HealBot_GetSpellId(spell)
- local spellName = HealBot_GetSpellName(spellID)
-
- if HealBot_Config.CDCLeftText[class]==spellName then
- HealBot_Config.CDCLeftText[class]="None"
- elseif HealBot_Config.CDCRightText[class]==spellName then
- HealBot_Config.CDCRightText[class]="None"
- end
- HealBot_Options_CDC_SetCombo(spell, button, class)
-end
+
-- HealBot_Options_CDCButLeft_OnSelect: UI handler for OnSelect options panel.
function HealBot_Options_CDCButLeft_OnSelect()
local class=UnitClass("Player");
@@ -281,12 +270,22 @@ function HealBot_Options_CDC_SetCombo(spell, button, class)
end
-- HealBot_Options_Debuff_Reset: Restores default debuff tracking options.
function HealBot_Options_Debuff_Reset()
- HealBot_DebuffWatch = {
- [HEALBOT_DISEASE_en] = true,
- [HEALBOT_MAGIC_en] = true,
- [HEALBOT_POISON_en] = true,
- [HEALBOT_CURSE_en] = true
- }
+ 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 }
+ 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 and spell ~= "None" and HealBot_Debuff_Types[spell] then
+ table.foreach(HealBot_Debuff_Types[spell], function (index,debuff)
+ HealBot_DebuffWatch[debuff]=true;
+ end)
+ end
+ end
end
-- HealBot_Colorpick_OnClick: Opens color picker for debuff colors.
function HealBot_Colorpick_OnClick(CDCType)
From 553a5ece365aac7968df0873a439748261daf5e0 Mon Sep 17 00:00:00 2001
From: Bluewhale1337 <295648290+Bluewhale1337@users.noreply.github.com>
Date: Tue, 25 Aug 2026 10:24:23 +0200
Subject: [PATCH 10/22] docs: add release notes for v1.6.4 and v1.6.5
---
README.md | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/README.md b/README.md
index e1d2537..058e1a5 100644
--- a/README.md
+++ b/README.md
@@ -59,6 +59,14 @@ Default installation path: `C:\Program Files\World of Warcraft\Interface\AddOns\
* **Bug Fix - Slow Client Init** - Fixed missing class colors after `/reload` by adding lazy-load identity fetches directly into the render pipeline for when `UnitClass` data is delayed by the server.
* **Bug Fix - Debuff Tracking** - HealBot now automatically tracks all curable debuffs for the player's class out of the box. Previously, users had to manually assign a cure spell to a click binding to enable CDC debuff tracking.
+**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.
From bcd566d80b7770b20571997467622afc5ae17e83 Mon Sep 17 00:00:00 2001
From: Bluewhale1337 <295648290+Bluewhale1337@users.noreply.github.com>
Date: Tue, 25 Aug 2026 16:24:55 +0200
Subject: [PATCH 11/22] fix: move icon tracking logic before condition checks
to ensure icons are captured correctly
---
HealBot_Controller_Aura.lua | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/HealBot_Controller_Aura.lua b/HealBot_Controller_Aura.lua
index 090214a..62035f9 100644
--- a/HealBot_Controller_Aura.lua
+++ b/HealBot_Controller_Aura.lua
@@ -202,11 +202,12 @@ function HealBot_OnEvent_UnitAura(this, unit)
shouldTrack = true
end
+ if iconCount < 10 then
+ iconCount = iconCount + 1
+ HealBot_UnitIcons[unit][iconCount] = debuff
+ end
+
if shouldTrack and mapped_type and HealBot_DebuffWatch[mapped_type] then
- if iconCount < 10 then
- iconCount = iconCount + 1
- HealBot_UnitIcons[unit][iconCount] = debuff
- end
HealBot_UnitDebuff[unit] = mapped_type
DebuffType = mapped_type;
From 36fad01424f568b61552c61adcde3d9b931ff241 Mon Sep 17 00:00:00 2001
From: Bluewhale1337 <295648290+Bluewhale1337@users.noreply.github.com>
Date: Tue, 25 Aug 2026 17:01:56 +0200
Subject: [PATCH 12/22] docs: update
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 058e1a5..c1efa66 100644
--- a/README.md
+++ b/README.md
@@ -60,7 +60,7 @@ Default installation path: `C:\Program Files\World of Warcraft\Interface\AddOns\
* **Bug Fix - Debuff Tracking** - HealBot now automatically tracks all curable debuffs for the player's class out of the box. Previously, users had to manually assign a cure spell to a click binding to enable CDC debuff tracking.
**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.
+* **Performance Update - Mana Tracking** - Added a fast-path redraw pipeline for unit power changes. This 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.
From cf05b94611a83641b939742b8fd7fccc1cd2a05b Mon Sep 17 00:00:00 2001
From: Bluewhale1337 <295648290+Bluewhale1337@users.noreply.github.com>
Date: Tue, 25 Aug 2026 19:49:20 +0200
Subject: [PATCH 13/22] Fix : re-implement automatic class-specific debuff
tracking defaults 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 51ec1c8..a697ecc 100644
--- a/HealBot_Options_CDC.lua
+++ b/HealBot_Options_CDC.lua
@@ -272,8 +272,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;
From 998a64a83f9cff83f3e8dd97a1cad7e1f14388c5 Mon Sep 17 00:00:00 2001
From: Bluewhale1337 <295648290+Bluewhale1337@users.noreply.github.com>
Date: Wed, 26 Aug 2026 22:01:31 +0200
Subject: [PATCH 14/22] fix: resolve CDC debuff filtering logic and reorder XML
status bar layering for correct visual rendering
---
HealBot_Action.xml | 29 ++++++++++++++---------------
HealBot_Controller_Aura.lua | 15 +++++++++++----
README.md | 2 ++
3 files changed, 27 insertions(+), 19 deletions(-)
diff --git a/HealBot_Action.xml b/HealBot_Action.xml
index 9a82842..48732f5 100644
--- a/HealBot_Action.xml
+++ b/HealBot_Action.xml
@@ -18,6 +18,20 @@
HealBot_Action_HealUnit_OnClick(this,arg1);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -115,21 +129,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/HealBot_Controller_Aura.lua b/HealBot_Controller_Aura.lua
index 62035f9..e5d48c2 100644
--- a/HealBot_Controller_Aura.lua
+++ b/HealBot_Controller_Aura.lua
@@ -202,12 +202,19 @@ function HealBot_OnEvent_UnitAura(this, unit)
shouldTrack = true
end
- if iconCount < 10 then
- iconCount = iconCount + 1
- HealBot_UnitIcons[unit][iconCount] = debuff
+ local isDispellable = false
+ if mapped_type and HealBot_DebuffWatch[mapped_type] then
+ isDispellable = true
end
- if shouldTrack and mapped_type and HealBot_DebuffWatch[mapped_type] then
+ if isDispellable then
+ if iconCount < 10 then
+ iconCount = iconCount + 1
+ HealBot_UnitIcons[unit][iconCount] = debuff
+ end
+ end
+
+ if shouldTrack and isDispellable then
HealBot_UnitDebuff[unit] = mapped_type
DebuffType = mapped_type;
diff --git a/README.md b/README.md
index c1efa66..3c22d9b 100644
--- a/README.md
+++ b/README.md
@@ -58,6 +58,7 @@ Default installation path: `C:\Program Files\World of Warcraft\Interface\AddOns\
* **Bug Fix - Group Aliasing** - Fixed a bug where roster updates caused frames to share memory references, causing the UI to display the same player across multiple group slots.
* **Bug Fix - Slow Client Init** - Fixed missing class colors after `/reload` by adding lazy-load identity fetches directly into the render pipeline for when `UnitClass` data is delayed by the server.
* **Bug Fix - Debuff Tracking** - HealBot now automatically tracks all curable debuffs for the player's class out of the box. Previously, users had to manually assign a cure spell to a click binding to enable CDC debuff tracking.
+* **Bug Fix - CDC Filter** - Fixed an issue where the CDC module displayed all debuffs instead of filtering for dispellable ones, restoring proper health bar coloring.
**v1.6.5**
* **Performance Update - Mana Tracking** - Added a fast-path redraw pipeline for unit power changes. This optimization prevents full frame redraws when players naturally regenerate or consume mana, resolving severe FPS drops in 40-man raids while tracking mana.
@@ -79,6 +80,7 @@ Default installation path: `C:\Program Files\World of Warcraft\Interface\AddOns\
* **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).
**v1.6.1**
+* **Hotfix - XML Layering** - Reverted `bar` and `bar2` element order in `HealBot_Action.xml`. The incoming heals bar was rendering on top of the health bar, causing debuff colors to be obscured and creating visual opacity issues.
* **Hotfix - pet frames** - With class colours toggled extra frames for player pets were given some classy mint colour.
* **Hotfi - raidframes in combat** - Modfied how frames behave when player leaves during combat.
From 377c2c31d00550dc3683f9d5455f45396168dfa5 Mon Sep 17 00:00:00 2001
From: Bluewhale1337 <295648290+Bluewhale1337@users.noreply.github.com>
Date: Thu, 27 Aug 2026 22:19:02 +0200
Subject: [PATCH 15/22] fix: add missing closing StatusBar tag to
HealBot_Action XML layout
---
HealBot_Action.xml | 1 +
1 file changed, 1 insertion(+)
diff --git a/HealBot_Action.xml b/HealBot_Action.xml
index 48732f5..d49bd2c 100644
--- a/HealBot_Action.xml
+++ b/HealBot_Action.xml
@@ -129,6 +129,7 @@
+
From 8026e14cde9a1aa55688888e1721ccbce76a01bb Mon Sep 17 00:00:00 2001
From: Bluewhale1337 <295648290+Bluewhale1337@users.noreply.github.com>
Date: Sat, 29 Aug 2026 11:34:41 +0200
Subject: [PATCH 16/22] feat: add CDC module toggle to track all debuffs and
fix minor aura and casting bug regressions
---
HealBot_Controller_Aura.lua | 20 +++++++++--
HealBot_Controller_Spells.lua | 2 +-
HealBot_Localization.en.lua | 1 +
HealBot_Options_CDC.lua | 22 +++++++++++++
HealBot_Options_CDC.xml | 62 +++++++++++++++++++++--------------
README.md | 3 ++
6 files changed, 83 insertions(+), 27 deletions(-)
diff --git a/HealBot_Controller_Aura.lua b/HealBot_Controller_Aura.lua
index e5d48c2..fc6ad86 100644
--- a/HealBot_Controller_Aura.lua
+++ b/HealBot_Controller_Aura.lua
@@ -183,9 +183,10 @@ function HealBot_OnEvent_UnitAura(this, unit)
local iconCount = 0
local i = 1;
HealBot_UnitDebuff[unit] = nil;
+ local trackedTextures = {}
while true do
- local debuff, tmp, debuff_type = UnitDebuff(unit, i)
+ local debuff, tmp, debuff_type = UnitDebuff(unit, i, 1)
if debuff then
local mapped_type = nil
if debuff_type then
@@ -208,9 +209,10 @@ function HealBot_OnEvent_UnitAura(this, unit)
end
if isDispellable then
- if iconCount < 10 then
+ if iconCount < 10 and not trackedTextures[debuff] then
iconCount = iconCount + 1
HealBot_UnitIcons[unit][iconCount] = debuff
+ trackedTextures[debuff] = true
end
end
@@ -236,6 +238,20 @@ function HealBot_OnEvent_UnitAura(this, unit)
break
end
end
+
+ if HealBot_Config.CDCShowAllDebuffs == 1 then
+ local k = 1
+ while true do
+ local debuff = UnitDebuff(unit, k)
+ if not debuff then break end
+ if not trackedTextures[debuff] and iconCount < 10 then
+ iconCount = iconCount + 1
+ HealBot_UnitIcons[unit][iconCount] = debuff
+ trackedTextures[debuff] = true
+ end
+ k = k + 1
+ end
+ end
local b = 1
while true do
diff --git a/HealBot_Controller_Spells.lua b/HealBot_Controller_Spells.lua
index 45f2fcd..09607fb 100644
--- a/HealBot_Controller_Spells.lua
+++ b/HealBot_Controller_Spells.lua
@@ -133,7 +133,7 @@ end
-- HealBot_Process_HealValue: Internal utility: HealBot_Process_HealValue
function HealBot_Process_HealValue(spell, target)
- if HealBot_Spells[spell] and HealBot_Spells[spell].CastTime > 1 then
+ if HealBot_Spells[spell] and (HealBot_Spells[spell].CastTime or 0) > 1 then
HealBot_HealValue = HealBot_Spells[spell].HealsDur;
-- Apply dynamic Preservation bonus
diff --git a/HealBot_Localization.en.lua b/HealBot_Localization.en.lua
index cf44909..30c90e3 100644
--- a/HealBot_Localization.en.lua
+++ b/HealBot_Localization.en.lua
@@ -310,6 +310,7 @@ HEALBOT_OPTIONS_CDCLEFT = "Alt+Left";
HEALBOT_OPTIONS_CDCRIGHT = "Alt+Right";
HEALBOT_OPTIONS_CDCBARS = "Healthbar colours";
HEALBOT_OPTIONS_CDCCLASS = "Monitor classes";
+HEALBOT_OPTIONS_CDCSHOWALLDEBUFFS = "Track All Debuffs";
HEALBOT_OPTIONS_CDCWARNINGS = "Debuff warnings";
HEALBOT_OPTIONS_USEBUTTONS = "Define spells";
HEALBOT_OPTIONS_CDC = "Cure/Dispel/Cleanse for";
diff --git a/HealBot_Options_CDC.lua b/HealBot_Options_CDC.lua
index a697ecc..4fbbe90 100644
--- a/HealBot_Options_CDC.lua
+++ b/HealBot_Options_CDC.lua
@@ -162,6 +162,28 @@ function HealBot_Options_GetDebuffSpells_List(class)
local DebuffSpells = HealBot_Debuff_Spells[class];
return DebuffSpells;
end
+
+-- HealBot_Options_CDCShowAllDebuffs_OnLoad: UI handler for OnLoad options panel.
+function HealBot_Options_CDCShowAllDebuffs_OnLoad(this,text)
+ getglobal(this:GetName().."Text"):SetText(text);
+ if HealBot_Config.CDCShowAllDebuffs == nil then HealBot_Config.CDCShowAllDebuffs = 0; end
+ if HealBot_Config.CDCShowAllDebuffs == 1 then
+ this:SetChecked(1);
+ else
+ this:SetChecked(0);
+ end
+end
+
+-- HealBot_Options_CDCShowAllDebuffs_OnClick: UI handler for OnClick options panel.
+function HealBot_Options_CDCShowAllDebuffs_OnClick(this)
+ if this:GetChecked() then
+ HealBot_Config.CDCShowAllDebuffs = 1;
+ else
+ HealBot_Config.CDCShowAllDebuffs = 0;
+ end
+ HealBot_RecalcParty();
+end
+
-- HealBot_Options_CDCButLeft_DropDown: UI handler for DropDown options panel.
function HealBot_Options_CDCButLeft_DropDown()
local classEN=HealBot_UnitClass("player")
diff --git a/HealBot_Options_CDC.xml b/HealBot_Options_CDC.xml
index f2bd49a..415f393 100644
--- a/HealBot_Options_CDC.xml
+++ b/HealBot_Options_CDC.xml
@@ -7,9 +7,9 @@
-
+
-
+
@@ -31,6 +31,20 @@
+
+
+
+
+
+
+
+
+
+ HealBot_Options_CDCShowAllDebuffs_OnLoad(this,HEALBOT_OPTIONS_CDCSHOWALLDEBUFFS)
+ HealBot_Options_CDCShowAllDebuffs_OnClick(this)
+
+
+
@@ -57,9 +71,9 @@
-
+
-
+
@@ -71,7 +85,7 @@
-
+
@@ -81,7 +95,7 @@
-
+
@@ -98,7 +112,7 @@
-
+
@@ -108,7 +122,7 @@
-
+
@@ -148,9 +162,9 @@
-
+
-
+
@@ -163,9 +177,9 @@
-
+
-
+
@@ -178,9 +192,9 @@
-
+
-
+
@@ -255,9 +269,9 @@
-
+
-
+
@@ -270,9 +284,9 @@
-
+
-
+
@@ -368,9 +382,9 @@
-
+
-
+
@@ -380,9 +394,9 @@
-
+
-
+
@@ -407,9 +421,9 @@
-
+
-
+
diff --git a/README.md b/README.md
index 3c22d9b..051f1b5 100644
--- a/README.md
+++ b/README.md
@@ -80,7 +80,10 @@ Default installation path: `C:\Program Files\World of Warcraft\Interface\AddOns\
* **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).
**v1.6.1**
+* **Feature - CDC Module** - Added a new toggle in the CDC options to track all debuffs. When enabled, non-dispellable debuff icons will appear on the unit frame. Bar coloring continues to only highlight dispellable debuffs to prevent visual clutter.
* **Hotfix - XML Layering** - Reverted `bar` and `bar2` element order in `HealBot_Action.xml`. The incoming heals bar was rendering on top of the health bar, causing debuff colors to be obscured and creating visual opacity issues.
+* **Hotfix - Debuff Bar Coloring** - Restored the `showDispellable` parameter to `UnitDebuff` in the aura scanning loop so the Vanilla client correctly returns the debuff type string required for bar coloring.
+* **Hotfix - Shapeshift / ShaguTweaks Interaction** - Fixed a Lua error (`attempt to compare number with nil`) in `HealBot_Process_HealValue` caused by missing `CastTime` values when external addons like ShaguTweaks trigger auto-unshift or intercept casts.
* **Hotfix - pet frames** - With class colours toggled extra frames for player pets were given some classy mint colour.
* **Hotfi - raidframes in combat** - Modfied how frames behave when player leaves during combat.
From d2642745cbe07e1744c4a14dc15bf12d86fcc9fa Mon Sep 17 00:00:00 2001
From: Bluewhale1337 <295648290+Bluewhale1337@users.noreply.github.com>
Date: Sun, 30 Aug 2026 15:43:03 +0200
Subject: [PATCH 17/22] refactor: simplify UnitDebuff parameters and
consolidate debuff tracking logic into a single loop
---
HealBot_Controller_Aura.lua | 24 +++++-------------------
1 file changed, 5 insertions(+), 19 deletions(-)
diff --git a/HealBot_Controller_Aura.lua b/HealBot_Controller_Aura.lua
index fc6ad86..44816d0 100644
--- a/HealBot_Controller_Aura.lua
+++ b/HealBot_Controller_Aura.lua
@@ -186,20 +186,20 @@ function HealBot_OnEvent_UnitAura(this, unit)
local trackedTextures = {}
while true do
- local debuff, tmp, debuff_type = UnitDebuff(unit, i, 1)
+ local debuff, tmp, debuff_type = UnitDebuff(unit, i)
if debuff then
local mapped_type = nil
if debuff_type then
mapped_type = HealBot_DebuffTypeMap[debuff_type] or debuff_type
end
- local unitClass = HealBot_Model.units[unit] and HealBot_Model.units[unit].class or UnitClass(unit)
+ local localizedClass = UnitClass(unit)
local shouldTrack = false
if unit == "target" then
shouldTrack = true
- elseif HealBot_CDCInc[unitClass] == 1 then
+ elseif localizedClass and HealBot_CDCInc[localizedClass] == 1 then
shouldTrack = true
- elseif not unitClass or HealBot_CDCInc[unitClass] == nil then
+ elseif not localizedClass or HealBot_CDCInc[localizedClass] == nil then
shouldTrack = true
end
@@ -208,7 +208,7 @@ function HealBot_OnEvent_UnitAura(this, unit)
isDispellable = true
end
- if isDispellable then
+ if isDispellable or HealBot_Config.CDCShowAllDebuffs == 1 then
if iconCount < 10 and not trackedTextures[debuff] then
iconCount = iconCount + 1
HealBot_UnitIcons[unit][iconCount] = debuff
@@ -238,20 +238,6 @@ function HealBot_OnEvent_UnitAura(this, unit)
break
end
end
-
- if HealBot_Config.CDCShowAllDebuffs == 1 then
- local k = 1
- while true do
- local debuff = UnitDebuff(unit, k)
- if not debuff then break end
- if not trackedTextures[debuff] and iconCount < 10 then
- iconCount = iconCount + 1
- HealBot_UnitIcons[unit][iconCount] = debuff
- trackedTextures[debuff] = true
- end
- k = k + 1
- end
- end
local b = 1
while true do
From e05238a5b21585b2036c967c3bb57019ed940d03 Mon Sep 17 00:00:00 2001
From: Bluewhale1337 <295648290+Bluewhale1337@users.noreply.github.com>
Date: Tue, 1 Sep 2026 09:10:38 +0200
Subject: [PATCH 18/22] Fix: Removed current form caching as druid to prevent
being locked into current form - now querries form on each spellcast via API.
Another attempt to resolve CDC colouring issues.
---
HealBot.lua | 18 ++++++++++++++++--
HealBot_Controller_Aura.lua | 16 +++++++++++++++-
HealBot_Controller_Spells.lua | 13 +++++++------
HealBot_Data.lua | 2 +-
4 files changed, 39 insertions(+), 10 deletions(-)
diff --git a/HealBot.lua b/HealBot.lua
index a24b6b3..00befc2 100644
--- a/HealBot.lua
+++ b/HealBot.lua
@@ -190,8 +190,22 @@ end
-- HealBot_UnitClass: Returns English class string for a unit.
function HealBot_UnitClass(unit)
- local playerClass, englishClass = UnitClass(unit);
- return englishClass;
+ local locClass, enClass = UnitClass(unit)
+ if enClass then return string.upper(enClass) end
+
+ -- Fallback for Vanilla 1.12 where enClass is nil
+ if locClass == HEALBOT_DRUID then return "DRUID"
+ elseif locClass == HEALBOT_HUNTER then return "HUNTER"
+ elseif locClass == HEALBOT_MAGE then return "MAGE"
+ elseif locClass == HEALBOT_PALADIN then return "PALADIN"
+ elseif locClass == HEALBOT_PRIEST then return "PRIEST"
+ elseif locClass == HEALBOT_ROGUE then return "ROGUE"
+ elseif locClass == HEALBOT_SHAMAN then return "SHAMAN"
+ elseif locClass == HEALBOT_WARLOCK then return "WARLOCK"
+ elseif locClass == HEALBOT_WARRIOR then return "WARRIOR"
+ end
+
+ return locClass
end
---- HealBot_UnitAffected moved to HealBot_Controller_Aura.lua
diff --git a/HealBot_Controller_Aura.lua b/HealBot_Controller_Aura.lua
index 44816d0..b499ede 100644
--- a/HealBot_Controller_Aura.lua
+++ b/HealBot_Controller_Aura.lua
@@ -186,7 +186,7 @@ function HealBot_OnEvent_UnitAura(this, unit)
local trackedTextures = {}
while true do
- local debuff, tmp, debuff_type = UnitDebuff(unit, i)
+ local debuff, tmp, debuff_type = UnitDebuff(unit, i, 1)
if debuff then
local mapped_type = nil
if debuff_type then
@@ -238,6 +238,20 @@ function HealBot_OnEvent_UnitAura(this, unit)
break
end
end
+
+ if HealBot_Config.CDCShowAllDebuffs == 1 then
+ local k = 1
+ while true do
+ local debuff = UnitDebuff(unit, k)
+ if not debuff then break end
+ if not trackedTextures[debuff] and iconCount < 10 then
+ iconCount = iconCount + 1
+ HealBot_UnitIcons[unit][iconCount] = debuff
+ trackedTextures[debuff] = true
+ end
+ k = k + 1
+ end
+ end
local b = 1
while true do
diff --git a/HealBot_Controller_Spells.lua b/HealBot_Controller_Spells.lua
index 09607fb..93bb996 100644
--- a/HealBot_Controller_Spells.lua
+++ b/HealBot_Controller_Spells.lua
@@ -298,8 +298,11 @@ function HealBot_CastSpellOnFriend(spell, target)
local targetEnemy = UnitCanAttack("player", "target");
local oldTarget = UnitName("target");
- if HealBot_UnitClass("player") == "DRUID" and HealBot_ActiveShapeshiftStance and HealBot_Config.AutoUnshift == 1 then
- CastShapeshiftForm(HealBot_ActiveShapeshiftStance);
+ if HealBot_UnitClass("player") == "DRUID" and HealBot_Config.AutoUnshift == 1 then
+ local currentForm = HealBot_GetShapeshiftForm()
+ if currentForm then
+ CastShapeshiftForm(currentForm);
+ end
end
if oldTarget ~= UnitName(target) then
@@ -496,7 +499,7 @@ function HealBot_GetHealSpell(unit, pattern)
if UnitOnTaxi("player") then return nil end;
if HealBot_Config.ProtectPvP == 1 and UnitIsPVP(unit) and not UnitIsPVP("player") then return nil end
if HealBot_UnitClass("player") == "DRUID" then
- if HealBot_ActiveShapeshiftStance and HealBot_Config.AutoUnshift ~= 1 then return nil end;
+ if HealBot_GetShapeshiftForm() and HealBot_Config.AutoUnshift ~= 1 then return nil end;
end
-- Handle Inline Scripts
@@ -829,11 +832,9 @@ function HealBot_Generic_Patten(matchStr, matchPattern)
return tmpTest, _HealsMin, _HealsMax;
end
-HealBot_ActiveShapeshiftStance = nil;
-
-- HealBot_UpdateShapeshiftForm: Internal utility: HealBot_UpdateShapeshiftForm
function HealBot_UpdateShapeshiftForm()
- HealBot_ActiveShapeshiftStance = HealBot_GetShapeshiftForm();
+ -- Deprecated, state is pulled in real-time on cast
end
-- HealBot_GetShapeshiftForm: Detects active druid form to prevent invalid casts.
diff --git a/HealBot_Data.lua b/HealBot_Data.lua
index 167c706..bc576d9 100644
--- a/HealBot_Data.lua
+++ b/HealBot_Data.lua
@@ -49,7 +49,7 @@ HealBot_ConfigDefaults = {
ShowDebuffWarning = 0,
SoundDebuffWarning = 0,
SoundDebuffPlay = 1,
- CDCMonitor = 1,
+ CDCMonitor = 2,
PanelAnchorX = -1,
PanelAnchorY = -1,
CDCBarColour = {
From 59ceb3b465f860b6f785b2c5f81c95c61807177e Mon Sep 17 00:00:00 2001
From: Bluewhale1337 <295648290+Bluewhale1337@users.noreply.github.com>
Date: Tue, 1 Sep 2026 11:03:11 +0200
Subject: [PATCH 19/22] feature: implemented delayed spell casting logic to
handle auto-unshift requirements for Druid forms
---
HealBot_Controller_Events.lua | 30 ++++++++++++++++++++++++++++++
HealBot_Controller_Spells.lua | 7 +++++++
2 files changed, 37 insertions(+)
diff --git a/HealBot_Controller_Events.lua b/HealBot_Controller_Events.lua
index 2760a2e..dd6a816 100644
--- a/HealBot_Controller_Events.lua
+++ b/HealBot_Controller_Events.lua
@@ -77,6 +77,36 @@ function HealBot_OnUpdate(this, arg1)
end
end
+ if HealBot_PendingShapeshiftCast then
+ if GetTime() > HealBot_PendingShapeshiftCast.expires then
+ HealBot_PendingShapeshiftCast = nil
+ else
+ -- Only cast once the form has successfully been removed
+ local currentForm = HealBot_GetShapeshiftForm()
+ if not currentForm then
+ local pendingCast = HealBot_PendingShapeshiftCast
+ HealBot_PendingShapeshiftCast = nil
+
+ -- Target the unit if necessary before casting
+ if pendingCast.oldTarget ~= UnitName(pendingCast.target) then
+ TargetUnit(pendingCast.target)
+ end
+
+ -- Attempt the cast now that form is cleared
+ HealBot_StartCasting(pendingCast.spell, pendingCast.target, "direct")
+
+ if pendingCast.targetEnemy then
+ HealBot_TargetRestorePending = { type = "enemy" }
+ elseif pendingCast.oldTarget and pendingCast.oldTarget ~= UnitName(pendingCast.target) then
+ HealBot_TargetRestorePending = { type = "friend" }
+ elseif not pendingCast.oldTarget then
+ HealBot_TargetRestorePending = { type = "clear" }
+ end
+ HealBot_TargetRestoreTimer = 0
+ end
+ end
+ end
+
-- Process Dirty Queue for MVC View
local unitsToRefresh = {}
for unitID in pairs(HealBot_View_DirtyUnits) do
diff --git a/HealBot_Controller_Spells.lua b/HealBot_Controller_Spells.lua
index 93bb996..36fd542 100644
--- a/HealBot_Controller_Spells.lua
+++ b/HealBot_Controller_Spells.lua
@@ -298,13 +298,20 @@ function HealBot_CastSpellOnFriend(spell, target)
local targetEnemy = UnitCanAttack("player", "target");
local oldTarget = UnitName("target");
+ local formCancelled = false
if HealBot_UnitClass("player") == "DRUID" and HealBot_Config.AutoUnshift == 1 then
local currentForm = HealBot_GetShapeshiftForm()
if currentForm then
CastShapeshiftForm(currentForm);
+ formCancelled = true
end
end
+ if formCancelled then
+ HealBot_PendingShapeshiftCast = { spell = spell, target = target, targetEnemy = targetEnemy, oldTarget = oldTarget, expires = GetTime() + 1.0 }
+ return;
+ end
+
if oldTarget ~= UnitName(target) then
TargetUnit(target);
end
From 16bc4d95eea610f3473100134986ea26011c3c8a Mon Sep 17 00:00:00 2001
From: Bluewhale1337 <295648290+Bluewhale1337@users.noreply.github.com>
Date: Tue, 1 Sep 2026 18:55:47 +0200
Subject: [PATCH 20/22] refactor: implement reliable shapeshift unshifting with
a queued cast system and Nampower integration settings
---
HealBot_Controller_Events.lua | 80 +++++++++++++++++++++++++-------
HealBot_Controller_Spells.lua | 34 ++++++++++----
HealBot_Data.lua | 3 +-
HealBot_Options_Integrations.xml | 21 +++++++--
README.md | 2 +
5 files changed, 108 insertions(+), 32 deletions(-)
diff --git a/HealBot_Controller_Events.lua b/HealBot_Controller_Events.lua
index dd6a816..56a6853 100644
--- a/HealBot_Controller_Events.lua
+++ b/HealBot_Controller_Events.lua
@@ -78,33 +78,75 @@ function HealBot_OnUpdate(this, arg1)
end
if HealBot_PendingShapeshiftCast then
- if GetTime() > HealBot_PendingShapeshiftCast.expires then
- HealBot_PendingShapeshiftCast = nil
- else
- -- Only cast once the form has successfully been removed
- local currentForm = HealBot_GetShapeshiftForm()
- if not currentForm then
- local pendingCast = HealBot_PendingShapeshiftCast
- HealBot_PendingShapeshiftCast = nil
-
+ local pendingCast = HealBot_PendingShapeshiftCast
+
+ -- Wait for server to process the unshift before attempting the cast
+ if GetTime() >= pendingCast.fireTime then
+ if not HealBot_GetShapeshiftForm() then
+ -- Target the unit if necessary before casting
-- Target the unit if necessary before casting
if pendingCast.oldTarget ~= UnitName(pendingCast.target) then
TargetUnit(pendingCast.target)
end
- -- Attempt the cast now that form is cleared
- HealBot_StartCasting(pendingCast.spell, pendingCast.target, "direct")
+ -- 1. Initialize the MVC side effects (AnnounceCast, Incoming Heals) only ONCE
+ if not pendingCast.started then
+ pendingCast.started = true
+
+ -- Extract base spell
+ local baseSpell = pendingCast.spell
+ local parenIndex = string.find(pendingCast.spell, "%(")
+ if parenIndex then
+ baseSpell = string.sub(pendingCast.spell, 1, parenIndex - 1)
+ end
+ baseSpell = string.gsub(baseSpell, "%s+$", "")
+
+ -- Force MVC updates since we guarantee the cast will eventually pierce the server
+ HealBot_CastFailed = false
+ HealBot_CastingSpell = baseSpell
+ HealBot_CastingTarget = pendingCast.target
+ HealBot_Process_HealValue(baseSpell, pendingCast.target)
+ HealBot_AnnounceCast(pendingCast.spell, pendingCast.target)
+
+ -- Restore target logic
+ if pendingCast.targetEnemy then
+ HealBot_TargetRestorePending = { type = "enemy" }
+ elseif pendingCast.oldTarget and pendingCast.oldTarget ~= UnitName(pendingCast.target) then
+ HealBot_TargetRestorePending = { type = "friend" }
+ elseif not pendingCast.oldTarget then
+ HealBot_TargetRestorePending = { type = "clear" }
+ end
+ HealBot_TargetRestoreTimer = 0
+ end
- if pendingCast.targetEnemy then
- HealBot_TargetRestorePending = { type = "enemy" }
- elseif pendingCast.oldTarget and pendingCast.oldTarget ~= UnitName(pendingCast.target) then
- HealBot_TargetRestorePending = { type = "friend" }
- elseif not pendingCast.oldTarget then
- HealBot_TargetRestorePending = { type = "clear" }
+ -- 2. Spam the raw cast silently to guarantee it pierces the server delay
+ if pendingCast.started then
+ if not pendingCast.nextSpam or GetTime() >= pendingCast.nextSpam then
+ pendingCast.nextSpam = GetTime() + 0.15
+
+ -- Safely suppress UI errors
+ UIErrorsFrame:UnregisterEvent("UI_ERROR_MESSAGE")
+
+ -- Only use HealBot's native cast wrapper
+ HealBot_CastSpellByName(pendingCast.spell)
+
+ if SpellCanTargetUnit(pendingCast.target) then
+ SpellTargetUnit(pendingCast.target)
+ elseif SpellIsTargeting() then
+ SpellTargetUnit(pendingCast.target)
+ SpellStopTargeting()
+ end
+
+ UIErrorsFrame:RegisterEvent("UI_ERROR_MESSAGE")
+ end
end
- HealBot_TargetRestoreTimer = 0
end
end
+
+ -- Failsafe timeout
+ if HealBot_PendingShapeshiftCast and GetTime() > pendingCast.expires then
+ HealBot_PendingShapeshiftCast = nil
+ end
end
-- Process Dirty Queue for MVC View
@@ -524,6 +566,7 @@ end
-- HealBot_OnEvent_SpellcastStart: Internal utility: HealBot_OnEvent_SpellcastStart
function HealBot_OnEvent_SpellcastStart(this, spell, duration)
HealBot_IsCasting = true;
+ HealBot_PendingShapeshiftCast = nil;
HealBot_RecalcHeals();
HealBot_CheckCasting();
if spell == HEALBOT_RESURRECTION or spell == HEALBOT_ANCESTRALSPIRIT or spell == HEALBOT_REBIRTH or spell == HEALBOT_REDEMPTION then
@@ -537,6 +580,7 @@ end
-- HealBot_OnEvent_SpellcastStop: Internal utility: HealBot_OnEvent_SpellcastStop
function HealBot_OnEvent_SpellcastStop(this, eventName)
HealBot_IsCasting = false;
+ HealBot_PendingShapeshiftCast = nil;
if eventName == "SPELLCAST_FAILED" then
HealBot_CastFailed = true;
end
diff --git a/HealBot_Controller_Spells.lua b/HealBot_Controller_Spells.lua
index 36fd542..14e96d0 100644
--- a/HealBot_Controller_Spells.lua
+++ b/HealBot_Controller_Spells.lua
@@ -171,6 +171,19 @@ end
-- HealBot_StartCasting: Initiates spell cast and broadcasts incoming heal.
function HealBot_StartCasting(spell, target, ttype)
HealBot_CastFailed = false;
+
+ -- Extract base spell for internal tracking
+ local baseSpell = spell
+ local parenIndex = string.find(spell, " %(")
+ if parenIndex then
+ baseSpell = string.sub(spell, 1, parenIndex - 1)
+ else
+ parenIndex = string.find(spell, "%(")
+ if parenIndex then
+ baseSpell = string.sub(spell, 1, parenIndex - 1)
+ end
+ end
+
HealBot_CastSpellByName(spell);
if ( SpellCanTargetUnit(target) ) then
SpellTargetUnit(target);
@@ -184,14 +197,16 @@ function HealBot_StartCasting(spell, target, ttype)
end
end
- if ttype == "fired" and HealBot_Spells[spell] then
+ if ttype == "fired" and HealBot_Spells[baseSpell] then
if not HealBot_CastFailed then
- HealBot_CastingSpell = spell;
+ HealBot_CastingSpell = baseSpell;
HealBot_CastingTarget = target;
- HealBot_Process_HealValue(spell, target);
+ HealBot_Process_HealValue(baseSpell, target);
HealBot_AnnounceCast(spell, target);
end
end
+
+ return ttype == "fired"
end
-- HealBot_StopCasting: Internal utility: HealBot_StopCasting
@@ -308,7 +323,9 @@ function HealBot_CastSpellOnFriend(spell, target)
end
if formCancelled then
- HealBot_PendingShapeshiftCast = { spell = spell, target = target, targetEnemy = targetEnemy, oldTarget = oldTarget, expires = GetTime() + 1.0 }
+ -- ALWAYS put the cast into the Pending queue so the OnUpdate loop can wait for the server
+ -- to process the unshift before attempting the cast, otherwise we get "You are in shapeshift form".
+ HealBot_PendingShapeshiftCast = { spell = spell, target = target, targetEnemy = targetEnemy, oldTarget = oldTarget, fireTime = GetTime() + 0.05, expires = GetTime() + 1.0 }
return;
end
@@ -839,9 +856,9 @@ function HealBot_Generic_Patten(matchStr, matchPattern)
return tmpTest, _HealsMin, _HealsMax;
end
--- HealBot_UpdateShapeshiftForm: Internal utility: HealBot_UpdateShapeshiftForm
+-- HealBot_UpdateShapeshiftForm: Called on UPDATE_SHAPESHIFT_FORM
function HealBot_UpdateShapeshiftForm()
- -- Deprecated, state is pulled in real-time on cast
+ -- Deprecated
end
-- HealBot_GetShapeshiftForm: Detects active druid form to prevent invalid casts.
@@ -852,10 +869,7 @@ function HealBot_GetShapeshiftForm()
for i=1,forms do
local icon,name,active = GetShapeshiftFormInfo(i);
if active then
- local icon_lower = string.lower(icon);
- if not string.find(icon_lower, "humanoidform") and not string.find(icon_lower, "treeoflife") and not string.find(icon_lower, "stoneclawtotem") then
- return i;
- end
+ return i;
end
end
end
diff --git a/HealBot_Data.lua b/HealBot_Data.lua
index bc576d9..cf04277 100644
--- a/HealBot_Data.lua
+++ b/HealBot_Data.lua
@@ -27,8 +27,9 @@ HealBot_ConfigDefaults = {
ActionVisible = 1,
HideSolo = 0,
OverHeal = 0.25,
- CastNotify = 1,
+ UpdateFreq = 0.5,
AutoUnshift = 1,
+ Integrations_Nampower_Active = true,
ChatMessages = {
[1] = { Spell = "None", Message = "Casting #Spell# on #Target#", Channel = "None" },
[2] = { Spell = "None", Message = "Casting #Spell# on #Target#", Channel = "None" },
diff --git a/HealBot_Options_Integrations.xml b/HealBot_Options_Integrations.xml
index 00d73d3..af31f10 100644
--- a/HealBot_Options_Integrations.xml
+++ b/HealBot_Options_Integrations.xml
@@ -33,7 +33,7 @@
- getglobal(this:GetName().."Text"):SetText("Enable nampower Integration (Buffs/Heals)");
+ getglobal(this:GetName().."Text"):SetText("Enable nampower Integration (Buffs/Heals/Queueing)");
HealBot_Config.HealBot_Integrations_Nampower = this:GetChecked() and 1 or 0;
@@ -44,9 +44,9 @@
-
+
-
+
@@ -81,6 +81,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
HealBot_Options_Integrations_OnShow(this);
diff --git a/README.md b/README.md
index 051f1b5..9362c81 100644
--- a/README.md
+++ b/README.md
@@ -59,6 +59,8 @@ Default installation path: `C:\Program Files\World of Warcraft\Interface\AddOns\
* **Bug Fix - Slow Client Init** - Fixed missing class colors after `/reload` by adding lazy-load identity fetches directly into the render pipeline for when `UnitClass` data is delayed by the server.
* **Bug Fix - Debuff Tracking** - HealBot now automatically tracks all curable debuffs for the player's class out of the box. Previously, users had to manually assign a cure spell to a click binding to enable CDC debuff tracking.
* **Bug Fix - CDC Filter** - Fixed an issue where the CDC module displayed all debuffs instead of filtering for dispellable ones, restoring proper health bar coloring.
+* **Bug Fix - UnitClass Localization** - Added a fallback mapping for the Vanilla `UnitClass` API to always return the uppercase English class string. This fixes a bug where default options (like Debuff tracking) failed to initialize.
+* **Feature - Shapeshift Spell Queue** - Built a native spell queue system for Druid auto-unshifting. Bypasses the "Cannot cast while shapeshifted" error and server lag when AutoUnshift is enabled, firing the heal seamlessly the exact millisecond the form is dropped. Now completely unified to use the standard casting API for maximum reliability across all client setups.
**v1.6.5**
* **Performance Update - Mana Tracking** - Added a fast-path redraw pipeline for unit power changes. This optimization prevents full frame redraws when players naturally regenerate or consume mana, resolving severe FPS drops in 40-man raids while tracking mana.
From 6760e4e43d84528cacdc41154bbfe0961476ecca Mon Sep 17 00:00:00 2001
From: Bluewhale1337 <295648290+Bluewhale1337@users.noreply.github.com>
Date: Wed, 2 Sep 2026 18:56:05 +0200
Subject: [PATCH 21/22] fix: optimize shapeshift auto-unshift logic by
improving cast event handling, reducing spam intervals, and extending state
timeout durations
---
HealBot_Controller_Aura.lua | 2 +-
HealBot_Controller_Events.lua | 25 ++++++++++++++++++++-----
HealBot_Controller_Spells.lua | 3 ++-
HealBot_Options_Integrations.xml | 2 +-
4 files changed, 24 insertions(+), 8 deletions(-)
diff --git a/HealBot_Controller_Aura.lua b/HealBot_Controller_Aura.lua
index b499ede..5d57dfa 100644
--- a/HealBot_Controller_Aura.lua
+++ b/HealBot_Controller_Aura.lua
@@ -186,7 +186,7 @@ function HealBot_OnEvent_UnitAura(this, unit)
local trackedTextures = {}
while true do
- local debuff, tmp, debuff_type = UnitDebuff(unit, i, 1)
+ local debuff, tmp, debuff_type = UnitDebuff(unit, i)
if debuff then
local mapped_type = nil
if debuff_type then
diff --git a/HealBot_Controller_Events.lua b/HealBot_Controller_Events.lua
index 56a6853..390b25f 100644
--- a/HealBot_Controller_Events.lua
+++ b/HealBot_Controller_Events.lua
@@ -102,7 +102,7 @@ function HealBot_OnUpdate(this, arg1)
baseSpell = string.gsub(baseSpell, "%s+$", "")
-- Force MVC updates since we guarantee the cast will eventually pierce the server
- HealBot_CastFailed = false
+ HealBot_CastFailed = true -- Trigger first attempt immediately
HealBot_CastingSpell = baseSpell
HealBot_CastingTarget = pendingCast.target
HealBot_Process_HealValue(baseSpell, pendingCast.target)
@@ -119,10 +119,10 @@ function HealBot_OnUpdate(this, arg1)
HealBot_TargetRestoreTimer = 0
end
- -- 2. Spam the raw cast silently to guarantee it pierces the server delay
+ -- 2. Spam the cast until the server explicitly accepts it (firing SPELLCAST_START)
if pendingCast.started then
if not pendingCast.nextSpam or GetTime() >= pendingCast.nextSpam then
- pendingCast.nextSpam = GetTime() + 0.15
+ pendingCast.nextSpam = GetTime() + 0.10
-- Safely suppress UI errors
UIErrorsFrame:UnregisterEvent("UI_ERROR_MESSAGE")
@@ -146,6 +146,8 @@ function HealBot_OnUpdate(this, arg1)
-- Failsafe timeout
if HealBot_PendingShapeshiftCast and GetTime() > pendingCast.expires then
HealBot_PendingShapeshiftCast = nil
+ HealBot_StopCasting()
+ HealBot_RecalcHeals()
end
end
@@ -580,10 +582,23 @@ end
-- HealBot_OnEvent_SpellcastStop: Internal utility: HealBot_OnEvent_SpellcastStop
function HealBot_OnEvent_SpellcastStop(this, eventName)
HealBot_IsCasting = false;
- HealBot_PendingShapeshiftCast = nil;
- if eventName == "SPELLCAST_FAILED" then
+ if eventName == "SPELLCAST_FAILED" or eventName == "SPELLCAST_INTERRUPTED" then
HealBot_CastFailed = true;
+ if HealBot_PendingShapeshiftCast then
+ return;
+ end
end
+
+ if HealBot_PendingShapeshiftCast and eventName == "SPELLCAST_STOP" then
+ if HealBot_CastFailed or not HealBot_PendingShapeshiftCast.started then
+ -- This STOP is either the trailing event of a failed/interrupted cast,
+ -- or it is the STOP event from the unshift spell itself.
+ -- Do not wipe the queue yet!
+ return;
+ end
+ end
+
+ HealBot_PendingShapeshiftCast = nil;
HealBot_StopCasting();
HealBot_RecalcHeals();
if HealBot_IamRessing then
diff --git a/HealBot_Controller_Spells.lua b/HealBot_Controller_Spells.lua
index 14e96d0..b05015b 100644
--- a/HealBot_Controller_Spells.lua
+++ b/HealBot_Controller_Spells.lua
@@ -211,6 +211,7 @@ end
-- HealBot_StopCasting: Internal utility: HealBot_StopCasting
function HealBot_StopCasting()
+ HealBot_IsCasting = false;
if HealBot_CastingTarget then
if HealBot_HealValue > 0 then
local uname = UnitName(HealBot_CastingTarget)
@@ -325,7 +326,7 @@ function HealBot_CastSpellOnFriend(spell, target)
if formCancelled then
-- ALWAYS put the cast into the Pending queue so the OnUpdate loop can wait for the server
-- to process the unshift before attempting the cast, otherwise we get "You are in shapeshift form".
- HealBot_PendingShapeshiftCast = { spell = spell, target = target, targetEnemy = targetEnemy, oldTarget = oldTarget, fireTime = GetTime() + 0.05, expires = GetTime() + 1.0 }
+ HealBot_PendingShapeshiftCast = { spell = spell, target = target, targetEnemy = targetEnemy, oldTarget = oldTarget, fireTime = GetTime() + 0.05, expires = GetTime() + 2.0 }
return;
end
diff --git a/HealBot_Options_Integrations.xml b/HealBot_Options_Integrations.xml
index af31f10..ab6cc20 100644
--- a/HealBot_Options_Integrations.xml
+++ b/HealBot_Options_Integrations.xml
@@ -83,7 +83,7 @@
-
+
From b64e7070ba1f3cefa867a4b2576dee7e5b9bb958 Mon Sep 17 00:00:00 2001
From: Bluewhale1337 <295648290+Bluewhale1337@users.noreply.github.com>
Date: Sat, 5 Sep 2026 17:08:58 +0200
Subject: [PATCH 22/22] Feature: add raid mark display to unit frames Fix:
resolve CDC configuration and color rendering issues
---
HealBot_Action.xml | 8 ++++++++
HealBot_Controller_Aura.lua | 2 +-
HealBot_Controller_Events.lua | 8 ++++++++
HealBot_Data.lua | 8 ++++----
HealBot_Options.lua | 14 ++++++++++++++
HealBot_Options_CDC.lua | 4 ++--
HealBot_View_Layout.lua | 25 ++++++++++++++-----------
README.md | 3 +++
8 files changed, 54 insertions(+), 18 deletions(-)
diff --git a/HealBot_Action.xml b/HealBot_Action.xml
index d49bd2c..7bb5fb3 100644
--- a/HealBot_Action.xml
+++ b/HealBot_Action.xml
@@ -47,6 +47,14 @@
+
+
+
+
+
+
+
+
diff --git a/HealBot_Controller_Aura.lua b/HealBot_Controller_Aura.lua
index 5d57dfa..b499ede 100644
--- a/HealBot_Controller_Aura.lua
+++ b/HealBot_Controller_Aura.lua
@@ -186,7 +186,7 @@ function HealBot_OnEvent_UnitAura(this, unit)
local trackedTextures = {}
while true do
- local debuff, tmp, debuff_type = UnitDebuff(unit, i)
+ local debuff, tmp, debuff_type = UnitDebuff(unit, i, 1)
if debuff then
local mapped_type = nil
if debuff_type then
diff --git a/HealBot_Controller_Events.lua b/HealBot_Controller_Events.lua
index 390b25f..6af4f53 100644
--- a/HealBot_Controller_Events.lua
+++ b/HealBot_Controller_Events.lua
@@ -281,6 +281,13 @@ local HealBot_EventHandlers = {
HealBot_Model:NotifyObservers("ROSTER_CHANGED")
HealBot_OnEvent_PartyMembersChanged(this)
end,
+ ["RAID_TARGET_UPDATE"] = function(this)
+ if HealBot_Action_UnitButtons then
+ for unit, _ in pairs(HealBot_Action_UnitButtons) do
+ HealBot_View_DirtyUnits[unit] = true
+ end
+ end
+ end,
["PLAYER_ENTERING_WORLD"] = function(this)
HealBot_Model:RefreshUnit("player")
HealBot_Model:RefreshUnit("pet")
@@ -386,6 +393,7 @@ function HealBot_OnEvent_VariablesLoaded(this)
this:RegisterEvent("PLAYER_TARGET_CHANGED");
this:RegisterEvent("PARTY_MEMBERS_CHANGED");
this:RegisterEvent("RAID_ROSTER_UPDATE");
+ this:RegisterEvent("RAID_TARGET_UPDATE");
this:RegisterEvent("PARTY_MEMBER_DISABLE");
this:RegisterEvent("PARTY_MEMBER_ENABLE");
this:RegisterEvent("UNIT_PET");
diff --git a/HealBot_Data.lua b/HealBot_Data.lua
index cf04277..71dd9ec 100644
--- a/HealBot_Data.lua
+++ b/HealBot_Data.lua
@@ -54,10 +54,10 @@ HealBot_ConfigDefaults = {
PanelAnchorX = -1,
PanelAnchorY = -1,
CDCBarColour = {
- [HEALBOT_DISEASE_en] = { R = 0.1, G = 0.05, B = 0.2, },
- [HEALBOT_MAGIC_en] = { R = 0.05, G = 0.05, B = 0.1, },
- [HEALBOT_POISON_en] = { R = 0.05, G = 0.2, B = 0.1, },
- [HEALBOT_CURSE_en] = { R = 0.2, G = 0.05, B = 0.05, },
+ [HEALBOT_DISEASE_en] = { R = 0.55, G = 0.19, B = 0.70, }, -- Bright Purple
+ [HEALBOT_MAGIC_en] = { R = 0.01, G = 0.30, B = 0.90, }, -- Bright Blue
+ [HEALBOT_POISON_en] = { R = 0.12, G = 0.46, B = 0.24, }, -- Bright Green
+ [HEALBOT_CURSE_en] = { R = 0.83, G = 0.01, B = 0.01, }, -- Bright Red
},
Debuff_Left = {
diff --git a/HealBot_Options.lua b/HealBot_Options.lua
index e796ad1..83e6882 100644
--- a/HealBot_Options.lua
+++ b/HealBot_Options.lua
@@ -14,6 +14,20 @@ HealBot_Options_EmergencyFilter_List = {
HEALBOT_OPTIONS_MONITORCUSTOM,
}
+HealBot_Options_CDCMonitor_List = {
+ HEALBOT_OPTIONS_MONITORNO,
+ HEALBOT_OPTIONS_MONITORALL,
+ HEALBOT_DRUID,
+ HEALBOT_HUNTER,
+ HEALBOT_MAGE,
+ HEALBOT_PALADIN,
+ HEALBOT_PRIEST,
+ HEALBOT_ROGUE,
+ HEALBOT_SHAMAN,
+ HEALBOT_WARLOCK,
+ HEALBOT_WARRIOR,
+}
+
-- HealBot_Options_AddDebug: UI handler for AddDebug options panel.
function HealBot_Options_AddDebug(msg)
HealBot_AddDebug("Options: " .. msg);
diff --git a/HealBot_Options_CDC.lua b/HealBot_Options_CDC.lua
index 4fbbe90..f2aaec3 100644
--- a/HealBot_Options_CDC.lua
+++ b/HealBot_Options_CDC.lua
@@ -45,9 +45,9 @@ function HealBot_WarningSound_OnClick(this,id)
end
-- HealBot_Options_CDCMonitor_DropDown: UI handler for DropDown options panel.
function HealBot_Options_CDCMonitor_DropDown()
- for i=1, getn(HealBot_Options_EmergencyFilter_List), 1 do
+ for i=1, getn(HealBot_Options_CDCMonitor_List), 1 do
local info = {};
- info.text = HealBot_Options_EmergencyFilter_List[i];
+ info.text = HealBot_Options_CDCMonitor_List[i];
info.func = HealBot_Options_CDCMonitor_OnSelect;
UIDropDownMenu_AddButton(info);
end
diff --git a/HealBot_View_Layout.lua b/HealBot_View_Layout.lua
index f53d49d..661613a 100644
--- a/HealBot_View_Layout.lua
+++ b/HealBot_View_Layout.lua
@@ -29,21 +29,13 @@ end
-- HealBot_HealthColor: Computes health bar RGBA based on debuffs and class.
function HealBot_HealthColor(unit, hlth, maxhlth)
- if HealBot_UnitDebuff[unit] then
- local debuff_type = HealBot_UnitDebuff[unit]
- local color = HealBot_Config.CDCBarColour[debuff_type]
+ local cached_debuff = HealBot_UnitDebuff[unit]
+ if cached_debuff then
+ local color = HealBot_Config.CDCBarColour[cached_debuff]
if color then
local dr = color.R
local dg = color.G
local db = color.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
end
@@ -273,6 +265,17 @@ function HealBot_Action_EnableButton(button)
end
end
end
+
+ local raidIcon = getglobal(button:GetName() .. "BarRaidIcon")
+ if raidIcon then
+ local index = GetRaidTargetIndex(unit)
+ if index then
+ SetRaidTargetIconTexture(raidIcon, index)
+ raidIcon:Show()
+ else
+ raidIcon:Hide()
+ end
+ end
end
-- HealBot_Action_EnableButtons: Internal utility: HealBot_Action_EnableButtons
diff --git a/README.md b/README.md
index 9362c81..ed2cc34 100644
--- a/README.md
+++ b/README.md
@@ -50,6 +50,7 @@ Default installation path: `C:\Program Files\World of Warcraft\Interface\AddOns\
### Change Log
**v1.7.0**
+* **Feature - Raid Marks** - Added tracking and display of raid marks on unit frames.
* **External Addon Integrations** - Added a new 'Extras' tab in Options to optionally enable integrations with `UnitXP_SP3` (for ultra-precise 3D range and Line of Sight checks), `nampower` (for accurate real-time heal/buff tracking), `SuperWoW` (for robust GUID-based state tracking), and `ClassicAPI` (for native +Healing bonuses and fast 3D distance checks).
* **UI Layout** - Widened the Options UI and neatly centered elements to accommodate the new integrations tab.
* **Bug Fix - Rendering Crash** - Fixed a critical UI issue where unrecognized debuff types would crash the rendering loop, causing unit frames to disappear.
@@ -61,6 +62,8 @@ Default installation path: `C:\Program Files\World of Warcraft\Interface\AddOns\
* **Bug Fix - CDC Filter** - Fixed an issue where the CDC module displayed all debuffs instead of filtering for dispellable ones, restoring proper health bar coloring.
* **Bug Fix - UnitClass Localization** - Added a fallback mapping for the Vanilla `UnitClass` API to always return the uppercase English class string. This fixes a bug where default options (like Debuff tracking) failed to initialize.
* **Feature - Shapeshift Spell Queue** - Built a native spell queue system for Druid auto-unshifting. Bypasses the "Cannot cast while shapeshifted" error and server lag when AutoUnshift is enabled, firing the heal seamlessly the exact millisecond the form is dropped. Now completely unified to use the standard casting API for maximum reliability across all client setups.
+* **Bug Fix - CDC Config List** - Fixed an uninitialized dropdown list array that prevented the CDC class monitor configuration from saving correctly.
+* **Bug Fix - Color Picker Accuracy** - Removed an undocumented multiplier hack on default textures that was artificially brightening debuff bar colors and overriding the user's selected colors from the color picker.
**v1.6.5**
* **Performance Update - Mana Tracking** - Added a fast-path redraw pipeline for unit power changes. This optimization prevents full frame redraws when players naturally regenerate or consume mana, resolving severe FPS drops in 40-man raids while tracking mana.