From b298ad70476e1321a2950db15b6842590dc102fc Mon Sep 17 00:00:00 2001
From: Bluewhale1337 <295648290+Bluewhale1337@users.noreply.github.com>
Date: Sun, 4 Oct 2026 23:58:17 +0200
Subject: [PATCH 1/8] refactor: update HoT timer integration requirements to
remove SuperWoW and ClassicAPI references
---
HealBot_Options_Integrations.xml | 2 +-
README.md | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/HealBot_Options_Integrations.xml b/HealBot_Options_Integrations.xml
index f839c0f..4609264 100644
--- a/HealBot_Options_Integrations.xml
+++ b/HealBot_Options_Integrations.xml
@@ -112,7 +112,7 @@
-
+
diff --git a/README.md b/README.md
index d98adba..c28501d 100644
--- a/README.md
+++ b/README.md
@@ -61,7 +61,7 @@ Default installation path: `C:\Program Files\World of Warcraft\Interface\AddOns\
* **Performance Fix - Unit Hash Lookup** - Eliminated heavy C-API calls to `UnitName()` during incoming heals by caching raid and party unit tokens in a fast O(1) hash table that updates on roster changes.
* **Performance Fix - Range Cache GC Leak** - Fixed a continuous memory leak in the range checker caused by string concatenation (`unit .. "_" .. range`) running every frame. Range states are now stored in a nested numeric table cache.
* **Performance Fix - Talent Rank Scan** - Fixed severe CPU stutter when gaining or losing auras that affect stats. Previously, inventory updates forced a full equipment and spell recalculation which linearly scanned the entire talent tree multiple times per rank. Talent ranks are now cached natively.
-* **Feature - HoT Tracking** - Added an option in the Integrations tab to track Player-cast HoT timers in a dedicated list below the main HealBot frame. Requires Nampower, SuperWoW, or ClassicAPI to fetch exact durations. Added support for tracking Power Word: Shield. Implemented with a pre-allocated static cache array for zero GC leaks, and precise GUID trapping for instant name resolution on self and non-party members.
+* **Feature - HoT Tracking** - Added an option in the Integrations tab to track Player-cast HoT timers in a dedicated list below the main HealBot frame. Requires Nampower to fetch exact durations. Added support for tracking Power Word: Shield. Implemented with a pre-allocated static cache array for zero GC leaks, and precise GUID trapping for instant name resolution on self and non-party members.
**v1.7.3**
From 8050561733ac8b4f62ee570bda14eaaa92b94fcb Mon Sep 17 00:00:00 2001
From: Bluewhale1337 <295648290+Bluewhale1337@users.noreply.github.com>
Date: Thu, 8 Oct 2026 16:16:19 +0200
Subject: [PATCH 2/8] Chanes: add test mode bars and options for UI testing and
layout configuration
---
HealBotBlue.toc | 2 +-
HealBot_Action.lua | 4 +
HealBot_Controller_Aura.lua | 3 +
HealBot_Controller_Range.lua | 2 +-
HealBot_Controller_Spells.lua | 8 +-
HealBot_Localization.en.lua | 2 +
HealBot_Model.lua | 2 +-
HealBot_Options.lua | 12 +-
HealBot_Options_Buffs.xml | 8 +-
HealBot_Options_CDC.xml | 64 ++---
HealBot_Options_General.xml | 22 +-
HealBot_Options_Healing.xml | 48 ++--
HealBot_Options_Skins.lua | 56 ++++-
HealBot_Options_Skins.xml | 447 +++++++++++++---------------------
HealBot_Options_Spells.xml | 18 +-
HealBot_View_Layout.lua | 60 ++++-
HealBot_View_Tooltip.lua | 16 +-
README.md | 4 +
18 files changed, 377 insertions(+), 401 deletions(-)
diff --git a/HealBotBlue.toc b/HealBotBlue.toc
index 4a508a7..2a890a3 100644
--- a/HealBotBlue.toc
+++ b/HealBotBlue.toc
@@ -1,6 +1,6 @@
## Interface: 11200
## Title: HealBotBlue
-## Version: 1.7.4
+## Version: 1.7.5
## Author: Bluewhale
## Notes: Raidframe replacement for healing, decursing, resource tracking and buffing with optional support for SuperWow, ClassicAPI, UnitXP_SP3 and Nampower.
## SavedVariablesPerCharacter: HealBot_Config
diff --git a/HealBot_Action.lua b/HealBot_Action.lua
index 207d7ad..33e8151 100644
--- a/HealBot_Action.lua
+++ b/HealBot_Action.lua
@@ -7,6 +7,7 @@ end
-- HealBot_MayHeal: Checks if unit is eligible for healing UI.
function HealBot_MayHeal(unit)
+ if string.find(unit, "^Test") then return true end
if not UnitName(unit) or not HealBot_Heals[unit] then return false end
if unit ~= 'target' then return true end
if not HealBot_Config.TargetHeals or UnitCanAttack("player",unit) then return false end
@@ -20,6 +21,7 @@ function HealBot_ShouldHeal(unit)
return true;
end
end
+ if string.find(unit, "^Test") then return true end
return HealBot_MayHeal(unit) and UnitHealth(unit)>0 and not UnitIsDeadOrGhost(unit)
and (UnitHealth(unit)
-
-
-
- this:SetBackdropBorderColor(0.4, 0.4, 0.4);
- this:SetBackdropColor(0, 0, 0, 0);
-
-
+
diff --git a/HealBot_Options_CDC.xml b/HealBot_Options_CDC.xml
index 415f393..3c82f4d 100644
--- a/HealBot_Options_CDC.xml
+++ b/HealBot_Options_CDC.xml
@@ -9,7 +9,7 @@
-
+
@@ -45,13 +45,7 @@
-
-
-
- this:SetBackdropBorderColor(0.4, 0.4, 0.4);
- this:SetBackdropColor(0, 0, 0, 0);
-
-
+
@@ -83,9 +77,9 @@
-
+
-
+
@@ -93,9 +87,9 @@
-
+
-
+
@@ -110,9 +104,9 @@
-
+
-
+
@@ -120,9 +114,9 @@
-
+
-
+
@@ -136,13 +130,7 @@
-
-
-
- this:SetBackdropBorderColor(0.4, 0.4, 0.4);
- this:SetBackdropColor(0, 0, 0, 0);
-
-
+
@@ -177,9 +165,9 @@
-
+
-
+
@@ -192,9 +180,9 @@
-
+
-
+
@@ -269,9 +257,9 @@
-
+
-
+
@@ -284,9 +272,9 @@
-
+
-
+
@@ -356,13 +344,7 @@
-
-
-
- this:SetBackdropBorderColor(0.4, 0.4, 0.4);
- this:SetBackdropColor(0, 0, 0, 0);
-
-
+
@@ -394,9 +376,9 @@
-
+
-
+
@@ -409,7 +391,7 @@
-
+
diff --git a/HealBot_Options_General.xml b/HealBot_Options_General.xml
index 0742fed..c4c5ac5 100644
--- a/HealBot_Options_General.xml
+++ b/HealBot_Options_General.xml
@@ -23,7 +23,7 @@
-
+
@@ -36,7 +36,7 @@
-
+
@@ -94,13 +94,7 @@
-
-
-
- this:SetBackdropBorderColor(0.4, 0.4, 0.4);
- this:SetBackdropColor(0, 0, 0, 0);
-
-
+
@@ -178,7 +172,7 @@
-
+
@@ -216,7 +210,7 @@
-
+
@@ -229,7 +223,7 @@
-
+
@@ -242,7 +236,7 @@
-
+
@@ -255,7 +249,7 @@
-
+
diff --git a/HealBot_Options_Healing.xml b/HealBot_Options_Healing.xml
index 18d0a13..53ffd36 100644
--- a/HealBot_Options_Healing.xml
+++ b/HealBot_Options_Healing.xml
@@ -5,13 +5,7 @@
-
-
-
- this:SetBackdropBorderColor(0.4, 0.4, 0.4);
- this:SetBackdropColor(0, 0, 0, 0);
-
-
+
@@ -32,9 +26,9 @@
-
+
-
+
@@ -47,7 +41,7 @@
-
+
@@ -60,7 +54,7 @@
-
+
@@ -86,7 +80,7 @@
-
+
@@ -99,7 +93,7 @@
-
+
@@ -114,9 +108,9 @@
-
+
-
+
@@ -142,9 +136,9 @@
-
+
-
+
@@ -170,9 +164,9 @@
-
+
-
+
@@ -198,9 +192,9 @@
-
+
-
+
@@ -224,13 +218,7 @@
-
-
-
- this:SetBackdropBorderColor(0.4, 0.4, 0.4);
- this:SetBackdropColor(0, 0, 0, 0);
-
-
+
@@ -251,9 +239,9 @@
-
+
-
+
diff --git a/HealBot_Options_Skins.lua b/HealBot_Options_Skins.lua
index 0c81e1d..41bdd18 100644
--- a/HealBot_Options_Skins.lua
+++ b/HealBot_Options_Skins.lua
@@ -8,15 +8,41 @@ function HealBot_Options_BarMaxRowsS_OnValueChanged(this)
HealBot_Action_PartyChanged()
end
--- HealBot_Options_GridOrientation_OnClick: UI handler for OnClick options panel.
-function HealBot_Options_GridOrientation_OnClick(this)
+function HealBot_Options_GridOrientationDD_OnLoad(this)
+ UIDropDownMenu_Initialize(this, HealBot_Options_GridOrientationDD_Initialize);
+ UIDropDownMenu_SetWidth(110, this);
+end
+
+function HealBot_Options_GridOrientationDD_Initialize()
+ local orient = HealBot_Config.GridOrientation and HealBot_Config.GridOrientation[HealBot_Config.Current_Skin] or 1;
+ local info = {};
+ info.text = "Vertical (Columns)";
+ info.func = HealBot_Options_GridOrientationDD_OnClick;
+ info.value = 1;
+ info.checked = (orient == 1);
+ UIDropDownMenu_AddButton(info);
+
+ info = {};
+ info.text = "Horizontal (Rows)";
+ info.func = HealBot_Options_GridOrientationDD_OnClick;
+ info.value = 2;
+ info.checked = (orient == 2);
+ UIDropDownMenu_AddButton(info);
+end
+
+function HealBot_Options_GridOrientationDD_OnClick()
+ UIDropDownMenu_SetSelectedID(HealBot_Options_GridOrientation_Dropdown, this:GetID());
if not HealBot_Config.GridOrientation then HealBot_Config.GridOrientation = {} end
- if this:GetChecked() then
- HealBot_Config.GridOrientation[HealBot_Config.Current_Skin] = 2 -- Horizontal
- else
- HealBot_Config.GridOrientation[HealBot_Config.Current_Skin] = 1 -- Vertical
- end
+ HealBot_Config.GridOrientation[HealBot_Config.Current_Skin] = this.value;
HealBot_Action_PartyChanged()
+
+ if (this.value == 2) then
+ HealBot_Options_BarMaxRowsS:Hide();
+ HealBot_Options_BarNumColsS:Show();
+ else
+ HealBot_Options_BarMaxRowsS:Show();
+ HealBot_Options_BarNumColsS:Hide();
+ end
end
-- HealBot_Options_NewSkin_OnTextChanged: UI handler for OnTextChanged options panel.
@@ -158,3 +184,19 @@ function HealBot_Options_Skins_OnSelect()
HealBot_Options_SetSkins()
end
end
+
+function HealBot_Options_TestBarsButton_OnClick(this)
+ if HealBot_Config.TestBarsOn then
+ HealBot_Config.TestBarsOn = false
+ this:SetText(HEALBOT_OPTIONS_TESTBARS.." OFF")
+ else
+ HealBot_Config.TestBarsOn = true
+ this:SetText(HEALBOT_OPTIONS_TESTBARS.." ON")
+ end
+ HealBot_Action_PartyChanged()
+end
+
+function HealBot_Options_NumTestBars_OnValueChanged(this)
+ HealBot_Config.numTestBars = this:GetValue()
+ if HealBot_Config.TestBarsOn then HealBot_Action_PartyChanged() end
+end
diff --git a/HealBot_Options_Skins.xml b/HealBot_Options_Skins.xml
index a85fb30..bbcb57e 100644
--- a/HealBot_Options_Skins.xml
+++ b/HealBot_Options_Skins.xml
@@ -21,9 +21,9 @@
-
+
-
+
@@ -92,14 +92,41 @@
HealBot_Options_NewSkinb_OnClick(this)
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ HealBot_Options_val_OnLoad(this,HEALBOT_OPTIONS_TESTBARS,1,40)
+ HealBot_Options_NumTestBars_OnValueChanged(this)
+
+
+
+
@@ -115,326 +142,192 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HealBot_Options_ShowHeaders_OnLoad(this,HEALBOT_OPTIONS_SHOWHEADERS)
- HealBot_Options_ShowHeaders_OnClick(this)
-
-
-
-
-
- getglobal(this:GetName().."Text"):SetText("Class Colors")
- HealBot_Config.bcolormode[HealBot_Config.Current_Skin] = (this:GetChecked() and 2 or 1); HealBot_Action_ResetSkin()
-
-
-
-
-
- getglobal(this:GetName().."Text"):SetText("Font Outline")
- HealBot_Config.bfontoutline[HealBot_Config.Current_Skin] = (this:GetChecked() and 1 or 0); HealBot_Action_ResetSkin()
-
-
-
-
-
- getglobal(this:GetName().."Text"):SetText("1px Borders")
- HealBot_Config.bborder[HealBot_Config.Current_Skin] = (this:GetChecked() and 1 or 2); HealBot_Action_ResetSkin()
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HealBot_Options_val_OnLoad(this,HEALBOT_OPTIONS_SKINTEXTURE,1,14)
- HealBot_Options_BarTextureS_OnValueChanged(this)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HealBot_Options_val_OnLoad(this,HEALBOT_OPTIONS_SKINNUMCOLS,1,8)
- HealBot_Options_BarNumColsS_OnValueChanged(this)
-
-
+
-
-
-
-
-
-
-
-
-
-
+
+
HealBot_Options_val_OnLoad(this,HEALBOT_OPTIONS_SKINHEIGHT,10,100)
HealBot_Options_BarHeightS_OnValueChanged(this)
-
-
-
-
-
-
-
-
-
-
+
+
HealBot_Options_val_OnLoad(this,HEALBOT_OPTIONS_SKINWIDTH,50,225)
HealBot_Options_BarWidthS_OnValueChanged(this)
-
-
-
-
-
-
-
-
-
-
-
+
+
HealBot_Options_val_OnLoad(this,HEALBOT_OPTIONS_SKINBRSPACE,0,10)
HealBot_Options_BarBRSpaceS_OnValueChanged(this)
-
-
-
-
-
-
-
-
-
-
+
+
HealBot_Options_val_OnLoad(this,HEALBOT_OPTIONS_SKINBCSPACE,0,25)
HealBot_Options_BarBCSpaceS_OnValueChanged(this)
-
-
-
-
-
-
-
-
-
-
+
+
HealBot_Options_val_OnLoad(this,"Frame Padding",0,50)
HealBot_Options_FramePaddingS_OnValueChanged(this)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HealBot_Options_Pct_OnLoad_MinMax(this,HEALBOT_OPTIONS_BARALPHA,0.25,1)
- HealBot_Options_BarAlpha_OnValueChanged(this)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HealBot_Options_Pct_OnLoad_MinMax(this,HEALBOT_OPTIONS_BARALPHAINHEAL,0.05,0.75)
- HealBot_Options_BarAlphaInHeal_OnValueChanged(this)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HealBot_Options_Pct_OnLoad(this,HEALBOT_OPTIONS_BARALPHADIS)
- HealBot_Options_BarAlphaDis_OnValueChanged(this)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HealBot_Options_val_OnLoad(this,"Abort size",0,15)
- HealBot_Options_AbortBarSize_OnValueChanged(this)
-
-
-
-
-
-
-
-
-
-
-
-
+
+
HealBot_Options_val_OnLoad(this,HEALBOT_OPTIONS_SKINFHEIGHT,7,18)
HealBot_Options_FontHeight_OnValueChanged(this)
-
-
-
-
-
-
-
-
-
-
+
+
HealBot_Options_val_OnLoad(this,"Icon size",5,30)
HealBot_Options_IconSizeS_OnValueChanged(this)
-
+
+
+
+
+
+ HealBot_Options_ShowHeaders_OnLoad(this,HEALBOT_OPTIONS_SHOWHEADERS)
+ HealBot_Options_ShowHeaders_OnClick(this)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ HealBot_Options_GridOrientationDD_OnLoad(this)
+
+
+
+
+
+
+
+ HealBot_Options_val_OnLoad(this,HEALBOT_OPTIONS_SKINNUMCOLS,1,8)
+ local orient = HealBot_Config.GridOrientation and HealBot_Config.GridOrientation[HealBot_Config.Current_Skin] or 1; if (orient == 2) then this:Show() else this:Hide() end
+
+ HealBot_Options_BarNumColsS_OnValueChanged(this)
+
+
+
+
+
+
+
+ HealBot_Options_val_OnLoad(this,"Max Rows",0,40)
+ local orient = HealBot_Config.GridOrientation and HealBot_Config.GridOrientation[HealBot_Config.Current_Skin] or 1; if (orient == 2) then this:Hide() else this:Show() end
+
+ HealBot_Options_BarMaxRowsS_OnValueChanged(this)
+
+
+
+
+
+
+ HealBot_Options_val_OnLoad(this,"Abort size",0,15)
+ HealBot_Options_AbortBarSize_OnValueChanged(this)
+
+
+
+
+
+
+
+ getglobal(this:GetName().."Text"):SetText("Class Colors")
+ HealBot_Config.bcolormode[HealBot_Config.Current_Skin] = (this:GetChecked() and 2 or 1); HealBot_Action_ResetSkin()
+
+
+
+
+
+ getglobal(this:GetName().."Text"):SetText("Font Outline")
+ HealBot_Config.bfontoutline[HealBot_Config.Current_Skin] = (this:GetChecked() and 1 or 0); HealBot_Action_ResetSkin()
+
+
+
+
+
+ getglobal(this:GetName().."Text"):SetText("1px Borders")
+ HealBot_Config.bborder[HealBot_Config.Current_Skin] = (this:GetChecked() and 1 or 2); HealBot_Action_ResetSkin()
+
+
+
+
+
+
+ HealBot_Options_val_OnLoad(this,HEALBOT_OPTIONS_SKINTEXTURE,1,14)
+ HealBot_Options_BarTextureS_OnValueChanged(this)
+
+
+
+
+
+
+ HealBot_Options_Pct_OnLoad_MinMax(this,HEALBOT_OPTIONS_BARALPHA,0.25,1)
+ HealBot_Options_BarAlpha_OnValueChanged(this)
+
+
+
+
+
+
+ HealBot_Options_Pct_OnLoad_MinMax(this,HEALBOT_OPTIONS_BARALPHAINHEAL,0.05,0.75)
+ HealBot_Options_BarAlphaInHeal_OnValueChanged(this)
+
+
+
+
+
+
+ HealBot_Options_Pct_OnLoad(this,HEALBOT_OPTIONS_BARALPHADIS)
+ HealBot_Options_BarAlphaDis_OnValueChanged(this)
+
+
-
-
-
-
-
-
-
-
-
-
+
+
HealBot_Options_val_OnLoad(this,"Solid Border",1,10)
HealBot_Options_BorderThicknessS_OnValueChanged(this)
-
-
-
-
-
-
-
-
-
-
-
-
- HealBot_Options_val_OnLoad(this,"Max Rows",0,40)
- HealBot_Options_BarMaxRowsS_OnValueChanged(this)
-
-
-
-
-
-
-
-
-
-
-
-
- getglobal(this:GetName().."Text"):SetText("Horizontal Grid");
-
-
- HealBot_Options_GridOrientation_OnClick(this);
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HealBot_Options_val_OnLoad(this,HEALBOT_OPTIONS_TESTBARS,1,40)
- HealBot_Options_NumTestBars_OnValueChanged(this)
-
-
@@ -612,6 +579,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ HealBot_Options_val_OnLoad(this,HEALBOT_OPTIONS_TESTBARS,1,40)
+ HealBot_Options_NumTestBars_OnValueChanged(this)
+
+
diff --git a/HealBot_Options_Spells.xml b/HealBot_Options_Spells.xml
index 9e23506..e7be0b3 100644
--- a/HealBot_Options_Spells.xml
+++ b/HealBot_Options_Spells.xml
@@ -11,7 +11,7 @@
-
+
@@ -63,7 +63,7 @@
-
+
@@ -79,7 +79,7 @@
-
+
@@ -92,7 +92,7 @@
-
+
@@ -118,7 +118,7 @@
-
+
@@ -200,7 +200,7 @@
-
+
@@ -219,7 +219,7 @@
-
+
@@ -233,7 +233,7 @@
-
+
@@ -246,7 +246,7 @@
-
+
@@ -258,7 +258,7 @@
-
+
@@ -271,7 +271,7 @@
-
+
@@ -284,7 +284,7 @@
-
+
diff --git a/HealBot_View_Layout.lua b/HealBot_View_Layout.lua
index 48c1eb7..50034f6 100644
--- a/HealBot_View_Layout.lua
+++ b/HealBot_View_Layout.lua
@@ -69,13 +69,13 @@ function HealBot_HealthColor(unit, hlth, maxhlth)
end
local colorMode = HealBot_Config.bcolormode[HealBot_Config.Current_Skin] or 1
- if colorMode == 2 and HealBot_Model and HealBot_Model.units[unit] and HealBot_Model.units[unit].englishClass and RAID_CLASS_COLORS and RAID_CLASS_COLORS[HealBot_Model.units[unit].englishClass] then
+ if colorMode == 2 and string.find(unit, "pet") then
+ r, g, b = 0.4, 0.9, 0.6 -- Mint color
+ elseif colorMode == 2 and HealBot_Model and HealBot_Model.units[unit] and HealBot_Model.units[unit].englishClass and RAID_CLASS_COLORS and RAID_CLASS_COLORS[HealBot_Model.units[unit].englishClass] then
local engClass = HealBot_Model.units[unit].englishClass
r = RAID_CLASS_COLORS[engClass].r
g = RAID_CLASS_COLORS[engClass].g
b = RAID_CLASS_COLORS[engClass].b
- elseif colorMode == 2 and string.find(unit, "pet") then
- r, g, b = 0.4, 0.9, 0.6 -- Mint color
else
if pct >= 0.98 then r = 0.0; end
if pct < 0.98 and pct >= 0.65 then r = 2.94 - (pct * 3); end
diff --git a/README.md b/README.md
index df9b2e2..ee20e16 100644
--- a/README.md
+++ b/README.md
@@ -114,6 +114,7 @@ Default installation path: `C:\Program Files\World of Warcraft\Interface\AddOns\
* **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.
+* **Bug Fix - Pet Coloring** - Fixed an issue where custom server integrations giving pets a class could override the mint pet color when class color override is toggled.
**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 d5ecdc6c76250307a605b60b9ca1b45e81dbf0d6 Mon Sep 17 00:00:00 2001
From: Bluewhale1337 <295648290+Bluewhale1337@users.noreply.github.com>
Date: Sat, 10 Oct 2026 11:41:53 +0200
Subject: [PATCH 4/8] gperf: optimize lookups by caching talent ranks, spell
IDs, and unit IDs
---
HealBot_BonusScanner.lua | 6 ++-
HealBot_View_Layout.lua | 90 +++++++++++++++++++++-------------------
README.md | 1 +
3 files changed, 53 insertions(+), 44 deletions(-)
diff --git a/HealBot_BonusScanner.lua b/HealBot_BonusScanner.lua
index d77080d..b27712b 100644
--- a/HealBot_BonusScanner.lua
+++ b/HealBot_BonusScanner.lua
@@ -77,7 +77,11 @@ function HealBot_BonusScanner:ScanEquipment()
HealBot_BonusTooltip:SetOwner(HealBot_BonusTooltip, "ANCHOR_NONE");
HealBot_BonusScanner.temp.bonuses = 0;
- HealBot_BonusScanner.temp.sets = {};
+ if not HealBot_BonusScanner.temp.sets then
+ HealBot_BonusScanner.temp.sets = {}
+ else
+ for k in pairs(HealBot_BonusScanner.temp.sets) do HealBot_BonusScanner.temp.sets[k] = nil end
+ end
HealBot_BonusScanner.temp.set = "";
for i, slotname in HealBot_BonusScanner.slots do
slotid, _ = GetInventorySlotInfo(slotname.. "Slot");
diff --git a/HealBot_View_Layout.lua b/HealBot_View_Layout.lua
index 50034f6..defa603 100644
--- a/HealBot_View_Layout.lua
+++ b/HealBot_View_Layout.lua
@@ -464,8 +464,10 @@ 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 = {};
- HealBot_Action_UnitButtons = {};
+ for k in pairs(HealBot_Action_HealButtons) do HealBot_Action_HealButtons[k] = nil end
+ for k, v in pairs(HealBot_Action_UnitButtons) do
+ for j in pairs(v) do v[j] = nil end
+ end
return nil
end
local button = getglobal("HealBot_Action_HealUnit" .. index);
@@ -905,47 +907,47 @@ function HealBot_Action_PartyChanged()
HeaderPos[i + 1] = nil;
numBars = numBars - 1;
end
+ HealBot_ReleaseTable(order);
+ HealBot_ReleaseTable(units);
+ end
- last = last + 40
- local PetsValid = numBars;
- if HealBot_Config.PetHeals == 1 then
- if HealBot_Config.ShowHeader[HealBot_Config.Current_Skin] == 1 then
- HeaderPos[i + 1] = HEALBOT_OPTIONS_PETHEALS
- numBars = numBars + 1;
- numHeaders = numHeaders + 1;
+ last = last + 40
+ local PetsValid = numBars;
+ if HealBot_Config.PetHeals == 1 then
+ if HealBot_Config.ShowHeader[HealBot_Config.Current_Skin] == 1 then
+ HeaderPos[i + 1] = HEALBOT_OPTIONS_PETHEALS
+ numBars = numBars + 1;
+ numHeaders = numHeaders + 1;
+ end
+ if GetNumRaidMembers() > 0 then
+ for j = 1, 40 do
+ local unit = "raidpet" .. j;
+ if not HealBot_Action_UnitButtons[unit] and HealBot_MayHeal(unit) then
+ i = i + 1;
+ HealBot_Action_SetHealButton(i, unit);
+ numBars = numBars + 1;
+ end
+ if i == last then break end
end
- if GetNumRaidMembers() > 0 then
- for j = 1, 40 do
- local unit = "raidpet" .. j;
- if not HealBot_Action_UnitButtons[unit] and HealBot_MayHeal(unit) then
- i = i + 1;
- HealBot_Action_SetHealButton(i, unit);
- numBars = numBars + 1;
- end
- if i == last then break end
+ else
+ if not HealBot_PetUnits then
+ HealBot_PetUnits = { "pet", "partypet1", "partypet2", "partypet3", "partypet4" };
+ end
+ for _, unit in ipairs(HealBot_PetUnits) do
+ if not HealBot_Action_UnitButtons[unit] and HealBot_MayHeal(unit) then
+ i = i + 1;
+ HealBot_Action_SetHealButton(i, unit);
+ numBars = numBars + 1;
end
- else
- if not HealBot_PetUnits then
- HealBot_PetUnits = { "pet", "partypet1", "partypet2", "partypet3", "partypet4" };
- end
- for _, unit in ipairs(HealBot_PetUnits) do
- if not HealBot_Action_UnitButtons[unit] and HealBot_MayHeal(unit) then
- i = i + 1;
- HealBot_Action_SetHealButton(i, unit);
- numBars = numBars + 1;
- end
- if i == last then break end
- end
+ if i == last then break 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;
- numBars = numBars - 1;
- numHeaders = numHeaders - 1;
- end
end
+ end
+ if numBars == PetsValid + 1 and HealBot_Config.ShowHeader[HealBot_Config.Current_Skin] == 1 then
+ HeaderPos[PetsValid + 1] = nil;
+ numBars = numBars - 1;
+ numHeaders = numHeaders - 1;
+ end
local bpadding = (HealBot_Config.bpadding and HealBot_Config.bpadding[HealBot_Config.Current_Skin]) or 10
local OffsetY = bpadding;
@@ -1125,8 +1127,8 @@ end
function HealBot_Action_Reset()
HealBot_Action:ClearAllPoints();
HealBot_Action:SetPoint("TOP", "MinimapCluster", "BOTTOM", 7, 10);
- HealBot_Action_HealTarget = {};
- HealBot_Action_HealFocus = {};
+ for k in pairs(HealBot_Action_HealTarget) do HealBot_Action_HealTarget[k] = nil end
+ for k in pairs(HealBot_Action_HealFocus) do HealBot_Action_HealFocus[k] = nil end
HealBot_Action_PartyChanged();
end
@@ -1306,6 +1308,10 @@ local HealBot_PlayerHoTs_ValidHoTs = {
local HealBot_PlayerHoTs_ListCache = {}
+local function HealBot_PlayerHoTs_SortComparator(a, b)
+ return (a.expires or 0) < (b.expires or 0)
+end
+
function HealBot_Action_UpdatePlayerHoTs()
if not HealBot_PlayerHoTsListFrame then
HealBot_PlayerHoTsListFrame = CreateFrame("Frame", "HealBot_PlayerHoTsListFrame", HealBot_Action)
@@ -1351,9 +1357,7 @@ function HealBot_Action_UpdatePlayerHoTs()
end
-- Sort only the active portion by shifting expired ones to the end
- table.sort(HealBot_PlayerHoTs_ListCache, function(a, b)
- return (a.expires or 0) < (b.expires or 0)
- end)
+ table.sort(HealBot_PlayerHoTs_ListCache, HealBot_PlayerHoTs_SortComparator)
for i = 1, math.max(numHoTs, table.getn(HealBot_PlayerHoTFrames)) do
local frame = HealBot_PlayerHoTFrames[i]
diff --git a/README.md b/README.md
index ee20e16..9b9008a 100644
--- a/README.md
+++ b/README.md
@@ -53,6 +53,7 @@ Default installation path: `C:\Program Files\World of Warcraft\Interface\AddOns\
**v1.7.5**
* **Feature - Test Bars** - Implemented a "Test Bars" button and slider in the Skins options tab, allowing you to spawn and adjust a dummy raid group of up to 40 members without being in a real raid. This allows for easy layout and appearance customization out of combat.
* **UI - Cleanup** - While adding new funcionalities I ignored how menus look, just adding things for each tab where there was free space, so now I tried to clean up this convoluted mess I made. Menu Tabs are now aligned and grouped in a manner that makes more sense.
+* **Performance Fix - Table Pooling & GC Leaks** - Resolved critical table leaks in emergency heals where pooled tables (`order` and `units`) failed to release when pet heals were disabled, un-nested pet healing from emergency heals, eliminated high-frequency (4 Hz) anonymous closure allocations in `HealBot_Action_UpdatePlayerHoTs`, and implemented in-place key recycling for equipment scanning and grid button tables.
**v1.7.4**
* **Performance Fix - CPU Spikes** - Fixed massive FPS drops during raid combat. The `HealBot_CheckBuffs` function previously forced the client to generate hidden UI tooltips for up to 32 buffs per player on every single `UNIT_AURA` event. Tooltip parsing is now cached per texture, bypassing thousands of redundant API calls per second.
From 4694db4f908598ea9d00de5d80432985f1b5a699 Mon Sep 17 00:00:00 2001
From: Bluewhale1337 <295648290+Bluewhale1337@users.noreply.github.com>
Date: Sat, 10 Oct 2026 12:25:28 +0200
Subject: [PATCH 5/8] feat: add max/min HP bar color configuration and font
selection options to skins
---
HealBot_Controller_Spells.lua | 8 +-
HealBot_Data.lua | 7 +
HealBot_Localization.de.lua | 2 +
HealBot_Localization.en.lua | 2 +
HealBot_Localization.fr.lua | 2 +
HealBot_Localization.kr.lua | 2 +
HealBot_Options.lua | 29 ++
HealBot_Options_General.lua | 26 ++
HealBot_Options_Skins.lua | 60 ++++
HealBot_Options_Skins.xml | 594 ++++++++++++++++------------------
HealBot_View_Layout.lua | 37 ++-
README.md | 4 +-
12 files changed, 451 insertions(+), 322 deletions(-)
diff --git a/HealBot_Controller_Spells.lua b/HealBot_Controller_Spells.lua
index a377df6..ae95946 100644
--- a/HealBot_Controller_Spells.lua
+++ b/HealBot_Controller_Spells.lua
@@ -473,7 +473,13 @@ end
-- HealBot_AddHeal: Internal utility: HealBot_AddHeal
function HealBot_AddHeal(spell)
HealBot_SetSpellDefaults(spell);
- table.foreachi(HealBot_Spells[spell].Target, function (i, val)
+ local targetList = HealBot_Spells[spell].Target
+ if not targetList and HealBot_Spells[spell].Group and HealBot_Spells[HealBot_Spells[spell].Group] then
+ targetList = HealBot_Spells[HealBot_Spells[spell].Group].Target
+ end
+ if not targetList then targetList = {"player", "party", "pet"} end
+ table.foreachi(targetList, function (i, val)
+ if not HealBot_Heals[val] then HealBot_Heals[val] = {} end
table.insert(HealBot_Heals[val], spell);
end);
HealBot_Spells[spell].BagSlot = HealBot_GetBagSlot(spell);
diff --git a/HealBot_Data.lua b/HealBot_Data.lua
index a4a4c8a..362c495 100644
--- a/HealBot_Data.lua
+++ b/HealBot_Data.lua
@@ -249,6 +249,13 @@ HealBot_ConfigDefaults = {
bboffset = {[HEALBOT_SKINS_STD] = 16, ["HealBot Party"] = 16, ["HealBot Raid"] = 16, ["Alteric Valley"] = 16, ["Modern Flat"] = 3},
bfontoutline = {[HEALBOT_SKINS_STD] = 0, ["HealBot Party"] = 0, ["HealBot Raid"] = 0, ["Alteric Valley"] = 0, ["Modern Flat"] = 1},
biconsize = {[HEALBOT_SKINS_STD] = 12, ["HealBot Party"] = 12, ["HealBot Raid"] = 12, ["Alteric Valley"] = 12, ["Modern Flat"] = 12},
+ bcolormaxr = {[HEALBOT_SKINS_STD] = 0, ["HealBot Party"] = 0, ["HealBot Raid"] = 0, ["Alteric Valley"] = 0, ["Modern Flat"] = 0},
+ bcolormaxg = {[HEALBOT_SKINS_STD] = 1, ["HealBot Party"] = 1, ["HealBot Raid"] = 1, ["Alteric Valley"] = 1, ["Modern Flat"] = 1},
+ bcolormaxb = {[HEALBOT_SKINS_STD] = 0, ["HealBot Party"] = 0, ["HealBot Raid"] = 0, ["Alteric Valley"] = 0, ["Modern Flat"] = 0},
+ bcolorminr = {[HEALBOT_SKINS_STD] = 1, ["HealBot Party"] = 1, ["HealBot Raid"] = 1, ["Alteric Valley"] = 1, ["Modern Flat"] = 1},
+ bcolorming = {[HEALBOT_SKINS_STD] = 0, ["HealBot Party"] = 0, ["HealBot Raid"] = 0, ["Alteric Valley"] = 0, ["Modern Flat"] = 0},
+ bcolorminb = {[HEALBOT_SKINS_STD] = 0, ["HealBot Party"] = 0, ["HealBot Raid"] = 0, ["Alteric Valley"] = 0, ["Modern Flat"] = 0},
+ bfont = {[HEALBOT_SKINS_STD] = "Fonts\\FRIZQT__.TTF", ["HealBot Party"] = "Fonts\\FRIZQT__.TTF", ["HealBot Raid"] = "Fonts\\FRIZQT__.TTF", ["Alteric Valley"] = "Fonts\\FRIZQT__.TTF", ["Modern Flat"] = "Fonts\\FRIZQT__.TTF"},
ShowTooltip = 1,
ShowManaBars = 0,
ManaBarsHealersOnly = 0,
diff --git a/HealBot_Localization.de.lua b/HealBot_Localization.de.lua
index 80cea1b..cc64ac7 100644
--- a/HealBot_Localization.de.lua
+++ b/HealBot_Localization.de.lua
@@ -242,6 +242,8 @@ HEALBOT_OPTIONS_NEWSKINTEXT = "Neuer Skin"
HEALBOT_OPTIONS_SAVESKIN = "Speichern"
HEALBOT_OPTIONS_SKINBARS = "Leisten Optionen"
HEALBOT_OPTIONS_SKINPANEL = "Panel Farben"
+HEALBOT_SKIN_MAXHPTEXT = "Max HP"
+HEALBOT_SKIN_MINHPTEXT = "Min HP"
HEALBOT_SKIN_ENTEXT = "Aktiv"
HEALBOT_SKIN_DISTEXT = "Inaktiv"
HEALBOT_SKIN_DEBTEXT = "Debuff"
diff --git a/HealBot_Localization.en.lua b/HealBot_Localization.en.lua
index 18de362..0147ab8 100644
--- a/HealBot_Localization.en.lua
+++ b/HealBot_Localization.en.lua
@@ -275,6 +275,8 @@ HEALBOT_OPTIONS_BUFF7 = "Buff 7";
HEALBOT_OPTIONS_BUFF8 = "Buff 8";
HEALBOT_OPTIONS_SKINBARS = "Bar options"
HEALBOT_OPTIONS_SKINPANEL = "Panel colours"
+HEALBOT_SKIN_MAXHPTEXT = "Max HP"
+HEALBOT_SKIN_MINHPTEXT = "Min HP"
HEALBOT_SKIN_ENTEXT = "Enabled"
HEALBOT_SKIN_DISTEXT = "Disabled"
HEALBOT_SKIN_DEBTEXT = "Debuff"
diff --git a/HealBot_Localization.fr.lua b/HealBot_Localization.fr.lua
index 56f7b67..7c6f693 100644
--- a/HealBot_Localization.fr.lua
+++ b/HealBot_Localization.fr.lua
@@ -305,6 +305,8 @@ HEALBOT_OPTIONS_NEWSKINTEXT = "New skin" -- *************** needs French
HEALBOT_OPTIONS_SAVESKIN = "Save" -- *************** needs French translation ***************
HEALBOT_OPTIONS_SKINBARS = "Bar options" -- *************** needs French translation ***************
HEALBOT_OPTIONS_SKINPANEL = "Panel colours" -- *************** needs French translation ***************
+HEALBOT_SKIN_MAXHPTEXT = "Max HP"
+HEALBOT_SKIN_MINHPTEXT = "Min HP"
HEALBOT_SKIN_ENTEXT = "Enabled" -- *************** needs French translation ***************
HEALBOT_SKIN_DISTEXT = "Disabled" -- *************** needs French translation ***************
HEALBOT_SKIN_DEBTEXT = "Debuff" -- *************** needs French translation ***************
diff --git a/HealBot_Localization.kr.lua b/HealBot_Localization.kr.lua
index 765ff36..0b7e0ea 100644
--- a/HealBot_Localization.kr.lua
+++ b/HealBot_Localization.kr.lua
@@ -221,6 +221,8 @@ HEALBOT_GREATER_BLESSING_OF_SALVATION = "상급 구원의 축복";
HEALBOT_OPTIONS_SAVESKIN = "저장"
HEALBOT_OPTIONS_SKINBARS = "바 옵션들"
HEALBOT_OPTIONS_SKINPANEL = "패널 색"
+ HEALBOT_SKIN_MAXHPTEXT = "최대 생명력"
+ HEALBOT_SKIN_MINHPTEXT = "최소 생명력"
HEALBOT_SKIN_ENTEXT = "활성화"
HEALBOT_SKIN_DISTEXT = "비활성화"
HEALBOT_SKIN_DEBTEXT = "디버프"
diff --git a/HealBot_Options.lua b/HealBot_Options.lua
index c3837bf..8ca3554 100644
--- a/HealBot_Options.lua
+++ b/HealBot_Options.lua
@@ -202,6 +202,20 @@ function HealBot_Returned_Colours()
HealBot_Config.babortcolg[HealBot_Config.Current_Skin],
HealBot_Config.babortcolb[HealBot_Config.Current_Skin] = ColorPickerFrame:GetColorRGB();
HealBot_Config.babortcola[HealBot_Config.Current_Skin] = A;
+ elseif HealBot_ColourObjWaiting=="MaxHP" then
+ if not HealBot_Config.bcolormaxr then HealBot_Config.bcolormaxr = {} end
+ if not HealBot_Config.bcolormaxg then HealBot_Config.bcolormaxg = {} end
+ if not HealBot_Config.bcolormaxb then HealBot_Config.bcolormaxb = {} end
+ HealBot_Config.bcolormaxr[HealBot_Config.Current_Skin],
+ HealBot_Config.bcolormaxg[HealBot_Config.Current_Skin],
+ HealBot_Config.bcolormaxb[HealBot_Config.Current_Skin] = ColorPickerFrame:GetColorRGB();
+ elseif HealBot_ColourObjWaiting=="MinHP" then
+ if not HealBot_Config.bcolorminr then HealBot_Config.bcolorminr = {} end
+ if not HealBot_Config.bcolorming then HealBot_Config.bcolorming = {} end
+ if not HealBot_Config.bcolorminb then HealBot_Config.bcolorminb = {} end
+ HealBot_Config.bcolorminr[HealBot_Config.Current_Skin],
+ HealBot_Config.bcolorming[HealBot_Config.Current_Skin],
+ HealBot_Config.bcolorminb[HealBot_Config.Current_Skin] = ColorPickerFrame:GetColorRGB();
else
HealBot_Config.CDCBarColour[HealBot_ColourObjWaiting].R,
HealBot_Config.CDCBarColour[HealBot_ColourObjWaiting].G,
@@ -358,6 +372,21 @@ function HealBot_Options_SetSkins()
HealBot_Options_FramePaddingS:SetValue((HealBot_Config.bpadding and HealBot_Config.bpadding[HealBot_Config.Current_Skin]) or 10)
HealBot_Options_BorderThicknessS:SetValue((HealBot_Config.bboffset and HealBot_Config.bboffset[HealBot_Config.Current_Skin]) or 1)
HealBot_Options_FontHeight:SetValue(HealBot_Config.btextheight[HealBot_Config.Current_Skin])
+
+ local fontFile = (HealBot_Config.bfont and HealBot_Config.bfont[HealBot_Config.Current_Skin]) or "Fonts\\FRIZQT__.TTF"
+ local fontName = "Friz Quadrata"
+ if HealBot_Font_List then
+ for i = 1, getn(HealBot_Font_List) do
+ if HealBot_Font_List[i].file == fontFile then
+ fontName = HealBot_Font_List[i].text
+ UIDropDownMenu_SetSelectedID(HealBot_Options_Font_Dropdown, i)
+ break
+ end
+ end
+ end
+ if HealBot_Options_Font_DropdownText then
+ HealBot_Options_Font_DropdownText:SetText(fontName)
+ end
HealBot_Options_BarAlphaDis:SetValue(HealBot_Config.bardisa[HealBot_Config.Current_Skin])
HealBot_Options_AbortBarSize:SetValue(HealBot_Config.abortsize[HealBot_Config.Current_Skin])
local isShowHeaders = (HealBot_Config.ShowHeader[HealBot_Config.Current_Skin] == 1)
diff --git a/HealBot_Options_General.lua b/HealBot_Options_General.lua
index 3a26a6a..22df00b 100644
--- a/HealBot_Options_General.lua
+++ b/HealBot_Options_General.lua
@@ -119,6 +119,16 @@ function HealBot_SkinColorpick_OnClick(SkinType)
HealBot_Config.babortcolg[HealBot_Config.Current_Skin],
HealBot_Config.babortcolb[HealBot_Config.Current_Skin],
HealBot_Config.babortcola[HealBot_Config.Current_Skin])
+ elseif SkinType=="MaxHP" then
+ local r = HealBot_Config.bcolormaxr and HealBot_Config.bcolormaxr[HealBot_Config.Current_Skin] or 0.0
+ local g = HealBot_Config.bcolormaxg and HealBot_Config.bcolormaxg[HealBot_Config.Current_Skin] or 1.0
+ local b = HealBot_Config.bcolormaxb and HealBot_Config.bcolormaxb[HealBot_Config.Current_Skin] or 0.0
+ HealBot_UseColourPick(r, g, b, 1.0)
+ elseif SkinType=="MinHP" then
+ local r = HealBot_Config.bcolorminr and HealBot_Config.bcolorminr[HealBot_Config.Current_Skin] or 1.0
+ local g = HealBot_Config.bcolorming and HealBot_Config.bcolorming[HealBot_Config.Current_Skin] or 0.0
+ local b = HealBot_Config.bcolorminb and HealBot_Config.bcolorminb[HealBot_Config.Current_Skin] or 0.0
+ HealBot_UseColourPick(r, g, b, 1.0)
end
end
-- HealBot_SetSkinColours: Applies skin configuration to UI elements.
@@ -136,6 +146,20 @@ function HealBot_SetSkinColours()
HealBot_EnTextColorpickin:SetStatusBarColor(0, 1, 0, inHealAlpha)
HealBot_DisTextColorpick:SetStatusBarColor(0, 1, 0, disabledAlpha)
+ local maxR = HealBot_Config.bcolormaxr and HealBot_Config.bcolormaxr[skin] or 0.0
+ local maxG = HealBot_Config.bcolormaxg and HealBot_Config.bcolormaxg[skin] or 1.0
+ local maxB = HealBot_Config.bcolormaxb and HealBot_Config.bcolormaxb[skin] or 0.0
+ if HealBot_MaxHPColorpick then
+ HealBot_MaxHPColorpick:SetStatusBarColor(maxR, maxG, maxB, 1.0)
+ end
+
+ local minR = HealBot_Config.bcolorminr and HealBot_Config.bcolorminr[skin] or 1.0
+ local minG = HealBot_Config.bcolorming and HealBot_Config.bcolorming[skin] or 0.0
+ local minB = HealBot_Config.bcolorminb and HealBot_Config.bcolorminb[skin] or 0.0
+ if HealBot_MinHPColorpick then
+ HealBot_MinHPColorpick:SetStatusBarColor(minR, minG, minB, 1.0)
+ end
+
-- 2. Set Text Colors
HealBot_EnTextColorpickt:SetTextColor(
HealBot_Config.btextenabledcolr[skin], HealBot_Config.btextenabledcolg[skin],
@@ -210,6 +234,8 @@ function HealBot_SetSkinColours()
HealBot_EnTextColorpickt:SetText(HEALBOT_SKIN_ENTEXT)
HealBot_DisTextColorpickt:SetText(HEALBOT_SKIN_DISTEXT)
HealBot_DebTextColorpickt:SetText(HEALBOT_SKIN_DEBTEXT)
+ if HealBot_MaxHPColorpickt then HealBot_MaxHPColorpickt:SetText(HEALBOT_SKIN_MAXHPTEXT or "Max HP") end
+ if HealBot_MinHPColorpickt then HealBot_MinHPColorpickt:SetText(HEALBOT_SKIN_MINHPTEXT or "Min HP") end
-- 6. Force UI redraw (Kept the scale hack since it addresses a specific engine quirk)
local barScale = HealBot_EnTextColorpick:GetScale()
diff --git a/HealBot_Options_Skins.lua b/HealBot_Options_Skins.lua
index 41bdd18..5b1522d 100644
--- a/HealBot_Options_Skins.lua
+++ b/HealBot_Options_Skins.lua
@@ -1,6 +1,41 @@
-- HealBot Options panel file: HealBot_Options_Skins.lua
-- Split from original HealBot_Options.lua
+HealBot_Font_List = {
+ { text = "Friz Quadrata", file = "Fonts\\FRIZQT__.TTF" },
+ { text = "Arial Narrow", file = "Fonts\\ARIALN.TTF" },
+ { text = "Skurri", file = "Fonts\\skurri.ttf" },
+ { text = "Morpheus", file = "Fonts\\MORPHEUS.ttf" },
+}
+
+function HealBot_Options_FontDD_OnLoad(this)
+ UIDropDownMenu_Initialize(this, HealBot_Options_FontDD_Initialize)
+ UIDropDownMenu_SetWidth(110, this)
+end
+
+function HealBot_Options_FontDD_Initialize()
+ local currentFont = (HealBot_Config.bfont and HealBot_Config.bfont[HealBot_Config.Current_Skin]) or "Fonts\\FRIZQT__.TTF"
+ for i = 1, getn(HealBot_Font_List) do
+ local fontItem = HealBot_Font_List[i]
+ local info = {}
+ info.text = fontItem.text
+ info.func = HealBot_Options_FontDD_OnClick
+ info.value = fontItem.file
+ info.checked = (currentFont == fontItem.file)
+ UIDropDownMenu_AddButton(info)
+ end
+end
+
+function HealBot_Options_FontDD_OnClick()
+ UIDropDownMenu_SetSelectedID(HealBot_Options_Font_Dropdown, this:GetID())
+ if HealBot_Options_Font_DropdownText then
+ HealBot_Options_Font_DropdownText:SetText(this:GetText())
+ end
+ if not HealBot_Config.bfont then HealBot_Config.bfont = {} end
+ HealBot_Config.bfont[HealBot_Config.Current_Skin] = this.value
+ HealBot_Action_ResetSkin()
+end
+
-- 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
@@ -97,6 +132,24 @@ function HealBot_Options_NewSkinb_OnClick(this)
HealBot_Config.babortcola[HealBot_Options_NewSkin:GetText()] = HealBot_Config.babortcola[HealBot_Config.Current_Skin]
HealBot_Config.ShowHeader[HealBot_Options_NewSkin:GetText()] = HealBot_Config.ShowHeader[HealBot_Config.Current_Skin]
+ if not HealBot_Config.bcolormaxr then HealBot_Config.bcolormaxr = {} end
+ if not HealBot_Config.bcolormaxg then HealBot_Config.bcolormaxg = {} end
+ if not HealBot_Config.bcolormaxb then HealBot_Config.bcolormaxb = {} end
+ if not HealBot_Config.bcolorminr then HealBot_Config.bcolorminr = {} end
+ if not HealBot_Config.bcolorming then HealBot_Config.bcolorming = {} end
+ if not HealBot_Config.bcolorminb then HealBot_Config.bcolorminb = {} end
+ if not HealBot_Config.bfont then HealBot_Config.bfont = {} end
+
+ local curSkin = HealBot_Config.Current_Skin
+ local newSkin = HealBot_Options_NewSkin:GetText()
+ HealBot_Config.bcolormaxr[newSkin] = HealBot_Config.bcolormaxr[curSkin] or 0
+ HealBot_Config.bcolormaxg[newSkin] = HealBot_Config.bcolormaxg[curSkin] or 1
+ HealBot_Config.bcolormaxb[newSkin] = HealBot_Config.bcolormaxb[curSkin] or 0
+ HealBot_Config.bcolorminr[newSkin] = HealBot_Config.bcolorminr[curSkin] or 1
+ HealBot_Config.bcolorming[newSkin] = HealBot_Config.bcolorming[curSkin] or 0
+ HealBot_Config.bcolorminb[newSkin] = HealBot_Config.bcolorminb[curSkin] or 0
+ HealBot_Config.bfont[newSkin] = HealBot_Config.bfont[curSkin] or "Fonts\\FRIZQT__.TTF"
+
table.insert(HealBot_Skins,2,HealBot_Options_NewSkin:GetText())
HealBot_Config.Skin_ID = 2;
HealBot_Config.Skins = HealBot_Skins; HealBot_Config.Current_Skin = HealBot_Options_NewSkin:GetText();
@@ -144,6 +197,13 @@ function HealBot_Options_DeleteSkin_OnClick(this)
HealBot_Config.babortcolb[HealBot_Options_SkinsText:GetText()] = nil
HealBot_Config.babortcola[HealBot_Options_SkinsText:GetText()] = nil
HealBot_Config.ShowHeader[HealBot_Options_SkinsText:GetText()] = nil
+ if HealBot_Config.bcolormaxr then HealBot_Config.bcolormaxr[HealBot_Options_SkinsText:GetText()] = nil end
+ if HealBot_Config.bcolormaxg then HealBot_Config.bcolormaxg[HealBot_Options_SkinsText:GetText()] = nil end
+ if HealBot_Config.bcolormaxb then HealBot_Config.bcolormaxb[HealBot_Options_SkinsText:GetText()] = nil end
+ if HealBot_Config.bcolorminr then HealBot_Config.bcolorminr[HealBot_Options_SkinsText:GetText()] = nil end
+ if HealBot_Config.bcolorming then HealBot_Config.bcolorming[HealBot_Options_SkinsText:GetText()] = nil end
+ if HealBot_Config.bcolorminb then HealBot_Config.bcolorminb[HealBot_Options_SkinsText:GetText()] = nil end
+ if HealBot_Config.bfont then HealBot_Config.bfont[HealBot_Options_SkinsText:GetText()] = nil end
table.remove(HealBot_Skins,HealBot_Config.Skin_ID)
HealBot_Config.Skin_ID = 1;
HealBot_Config.Skins = HealBot_Skins;
diff --git a/HealBot_Options_Skins.xml b/HealBot_Options_Skins.xml
index ce7899e..9311f28 100644
--- a/HealBot_Options_Skins.xml
+++ b/HealBot_Options_Skins.xml
@@ -170,13 +170,13 @@
-
+
HealBot_Options_ShowHeaders_OnLoad(this,HEALBOT_OPTIONS_SHOWHEADERS)
HealBot_Options_ShowHeaders_OnClick(this)
-
+
@@ -223,6 +223,23 @@
HealBot_Options_AbortBarSize_OnValueChanged(this)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ HealBot_Options_FontDD_OnLoad(this)
+
+
@@ -287,309 +304,269 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- this:SetMinMaxValues(0,100); this:SetValue(70);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- this:SetMinMaxValues(0,100); this:SetValue(100);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- this:SetMinMaxValues(0,100); this:SetValue(100);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- this:SetMinMaxValues(0,100); this:SetValue(100);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- this:SetMinMaxValues(0,100); this:SetValue(100);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- this:SetMinMaxValues(0,100); this:SetValue(100);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- this:SetMinMaxValues(0,100); this:SetValue(100);
-
-
-
-
-
-
-
-
-
-
+
+
@@ -52,15 +52,15 @@
-
+
-
-
+
+
@@ -76,15 +76,15 @@
-
+
-
-
+
+
@@ -100,15 +100,15 @@
-
+
-
-
+
+
@@ -124,15 +124,15 @@
-
+
-
-
+
+
@@ -141,7 +141,6 @@
-
diff --git a/HealBot_Options_Buffs.xml b/HealBot_Options_Buffs.xml
index 87212d1..4d5d3d7 100644
--- a/HealBot_Options_Buffs.xml
+++ b/HealBot_Options_Buffs.xml
@@ -2,365 +2,372 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.blizzard.com/wow/ui/ ..\FrameXML\UI.xsd">
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HealBot_WarningSound_OnLoad(this,HEALBOT_OPTIONS_BUFFWATCH)
- HealBot_Options_BuffWatch_OnClick(this)
-
-
-
-
-
-
-
-
-
-
-
-
- HealBot_WarningSound_OnLoad(this,HEALBOT_OPTIONS_BUFFWATCHINCOMBAT)
- HealBot_Options_BuffWatchInCombat_OnClick(this)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HealBot_Options_Buff_OnLoad(this)
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+
+
+
-
- HealBot_Options_BuffSelf_OnLoad(this)
- HealBot_Options_BuffSelf_OnClick(this)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HealBot_Options_Buff_OnLoad(this)
-
-
-
-
-
-
-
-
-
-
- HealBot_Options_BuffSelf_OnLoad(this)
- HealBot_Options_BuffSelf_OnClick(this)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HealBot_Options_Buff_OnLoad(this)
-
-
-
-
-
-
-
-
-
-
- HealBot_Options_BuffSelf_OnLoad(this)
- HealBot_Options_BuffSelf_OnClick(this)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HealBot_Options_Buff_OnLoad(this)
-
-
-
-
-
-
-
-
-
-
- HealBot_Options_BuffSelf_OnLoad(this)
- HealBot_Options_BuffSelf_OnClick(this)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HealBot_Options_Buff_OnLoad(this)
-
-
-
-
-
-
-
-
-
-
- HealBot_Options_BuffSelf_OnLoad(this)
- HealBot_Options_BuffSelf_OnClick(this)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HealBot_Options_Buff_OnLoad(this)
-
-
-
-
-
-
-
-
-
-
- HealBot_Options_BuffSelf_OnLoad(this)
- HealBot_Options_BuffSelf_OnClick(this)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HealBot_Options_Buff_OnLoad(this)
-
-
-
-
-
-
-
-
-
-
- HealBot_Options_BuffSelf_OnLoad(this)
- HealBot_Options_BuffSelf_OnClick(this)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HealBot_Options_Buff_OnLoad(this)
-
-
-
-
-
-
-
-
-
-
- HealBot_Options_BuffSelf_OnLoad(this)
- HealBot_Options_BuffSelf_OnClick(this)
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+ HealBot_WarningSound_OnLoad(this,HEALBOT_OPTIONS_BUFFWATCH)
+ HealBot_Options_BuffWatch_OnClick(this)
+
+
+
+
+
+
+
+
+
+
+
+
+ HealBot_WarningSound_OnLoad(this,HEALBOT_OPTIONS_BUFFWATCHINCOMBAT)
+ HealBot_Options_BuffWatchInCombat_OnClick(this)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ HealBot_Options_Buff_OnLoad(this)
+
+
+
+
+
+
+
+
+
+
+ HealBot_Options_BuffSelf_OnLoad(this)
+ HealBot_Options_BuffSelf_OnClick(this)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ HealBot_Options_Buff_OnLoad(this)
+
+
+
+
+
+
+
+
+
+
+ HealBot_Options_BuffSelf_OnLoad(this)
+ HealBot_Options_BuffSelf_OnClick(this)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ HealBot_Options_Buff_OnLoad(this)
+
+
+
+
+
+
+
+
+
+
+ HealBot_Options_BuffSelf_OnLoad(this)
+ HealBot_Options_BuffSelf_OnClick(this)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ HealBot_Options_Buff_OnLoad(this)
+
+
+
+
+
+
+
+
+
+
+ HealBot_Options_BuffSelf_OnLoad(this)
+ HealBot_Options_BuffSelf_OnClick(this)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ HealBot_Options_Buff_OnLoad(this)
+
+
+
+
+
+
+
+
+
+
+ HealBot_Options_BuffSelf_OnLoad(this)
+ HealBot_Options_BuffSelf_OnClick(this)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ HealBot_Options_Buff_OnLoad(this)
+
+
+
+
+
+
+
+
+
+
+ HealBot_Options_BuffSelf_OnLoad(this)
+ HealBot_Options_BuffSelf_OnClick(this)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ HealBot_Options_Buff_OnLoad(this)
+
+
+
+
+
+
+
+
+
+
+ HealBot_Options_BuffSelf_OnLoad(this)
+ HealBot_Options_BuffSelf_OnClick(this)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ HealBot_Options_Buff_OnLoad(this)
+
+
+
+
+
+
+
+
+
+
+ HealBot_Options_BuffSelf_OnLoad(this)
+ HealBot_Options_BuffSelf_OnClick(this)
+
+
+
+
diff --git a/HealBot_Options_Chat.xml b/HealBot_Options_Chat.xml
index 81ccb3a..acc548b 100644
--- a/HealBot_Options_Chat.xml
+++ b/HealBot_Options_Chat.xml
@@ -2,288 +2,292 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.blizzard.com/wow/ui/ ..\FrameXML\UI.xsd">
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- if HealBot_Config.ChatMessages then
- HealBot_Config.ChatMessages[1].Spell = this:GetText();
- end
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HealBot_Options_ChatMsg_Channel_OnClick(1, this);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- if HealBot_Config.ChatMessages then
- HealBot_Config.ChatMessages[1].Message = this:GetText();
- end
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- if HealBot_Config.ChatMessages then
- HealBot_Config.ChatMessages[2].Spell = this:GetText();
- end
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HealBot_Options_ChatMsg_Channel_OnClick(2, this);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- if HealBot_Config.ChatMessages then
- HealBot_Config.ChatMessages[2].Message = this:GetText();
- end
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- if HealBot_Config.ChatMessages then
- HealBot_Config.ChatMessages[3].Spell = this:GetText();
- end
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HealBot_Options_ChatMsg_Channel_OnClick(3, this);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- if HealBot_Config.ChatMessages then
- HealBot_Config.ChatMessages[3].Message = this:GetText();
- end
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- if HealBot_Config.ChatMessages then
- HealBot_Config.ChatMessages[4].Spell = this:GetText();
- end
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HealBot_Options_ChatMsg_Channel_OnClick(4, this);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- if HealBot_Config.ChatMessages then
- HealBot_Config.ChatMessages[4].Message = this:GetText();
- end
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- if HealBot_Config.ChatMessages then
- HealBot_Config.ChatMessages[5].Spell = this:GetText();
- end
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HealBot_Options_ChatMsg_Channel_OnClick(5, this);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- if HealBot_Config.ChatMessages then
- HealBot_Config.ChatMessages[5].Message = this:GetText();
- end
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if HealBot_Config.ChatMessages then
+ HealBot_Config.ChatMessages[1].Spell = this:GetText();
+ end
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ HealBot_Options_ChatMsg_Channel_OnClick(1, this);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if HealBot_Config.ChatMessages then
+ HealBot_Config.ChatMessages[1].Message = this:GetText();
+ end
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if HealBot_Config.ChatMessages then
+ HealBot_Config.ChatMessages[2].Spell = this:GetText();
+ end
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ HealBot_Options_ChatMsg_Channel_OnClick(2, this);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if HealBot_Config.ChatMessages then
+ HealBot_Config.ChatMessages[2].Message = this:GetText();
+ end
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if HealBot_Config.ChatMessages then
+ HealBot_Config.ChatMessages[3].Spell = this:GetText();
+ end
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ HealBot_Options_ChatMsg_Channel_OnClick(3, this);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if HealBot_Config.ChatMessages then
+ HealBot_Config.ChatMessages[3].Message = this:GetText();
+ end
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if HealBot_Config.ChatMessages then
+ HealBot_Config.ChatMessages[4].Spell = this:GetText();
+ end
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ HealBot_Options_ChatMsg_Channel_OnClick(4, this);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if HealBot_Config.ChatMessages then
+ HealBot_Config.ChatMessages[4].Message = this:GetText();
+ end
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if HealBot_Config.ChatMessages then
+ HealBot_Config.ChatMessages[5].Spell = this:GetText();
+ end
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ HealBot_Options_ChatMsg_Channel_OnClick(5, this);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if HealBot_Config.ChatMessages then
+ HealBot_Config.ChatMessages[5].Message = this:GetText();
+ end
+
+
+
+
+
\ No newline at end of file
diff --git a/HealBot_Options_Integrations.xml b/HealBot_Options_Integrations.xml
index 3611276..df1ce3b 100644
--- a/HealBot_Options_Integrations.xml
+++ b/HealBot_Options_Integrations.xml
@@ -8,7 +8,7 @@
-
+
@@ -27,7 +27,7 @@
-
+
@@ -44,9 +44,9 @@
-
+
-
+
@@ -65,7 +65,7 @@
-
+
@@ -84,7 +84,7 @@
-
+
@@ -97,27 +97,26 @@
-
-
+
-
+
-
+
-
+
-
+
diff --git a/HealBot_Options_Spells.xml b/HealBot_Options_Spells.xml
index e7be0b3..b9341ac 100644
--- a/HealBot_Options_Spells.xml
+++ b/HealBot_Options_Spells.xml
@@ -2,213 +2,229 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.blizzard.com/wow/ui/ ..\FrameXML\UI.xsd">
-
-
-
+
+
+
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HealBot_ComboButtons_Button_OnLoad(this,HEALBOT_OPTIONS_BUTTONLEFT)
- HealBot_ComboButtons_Button_OnClick(this,this:GetID())
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
- HealBot_ComboButtons_Button_OnLoad(this,HEALBOT_OPTIONS_BUTTONMIDDLE)
- HealBot_ComboButtons_Button_OnClick(this,this:GetID())
-
-
-
-
-
-
-
-
-
-
-
- HealBot_ComboButtons_Button_OnLoad(this,HEALBOT_OPTIONS_BUTTONRIGHT)
- HealBot_ComboButtons_Button_OnClick(this,this:GetID())
-
-
-
-
-
-
-
-
-
-
-
- HealBot_ComboButtons_Button_OnLoad(this,HEALBOT_OPTIONS_BUTTON4)
- HealBot_ComboButtons_Button_OnClick(this,this:GetID())
-
-
-
-
-
-
-
-
-
-
-
- HealBot_ComboButtons_Button_OnLoad(this,HEALBOT_OPTIONS_BUTTON5)
- HealBot_ComboButtons_Button_OnClick(this,this:GetID())
-
-
+
+
+
+
+
+
+
+
+
+ HealBot_ComboButtons_Button_OnLoad(this,HEALBOT_OPTIONS_BUTTONLEFT)
+ HealBot_ComboButtons_Button_OnClick(this,this:GetID())
+
+
-
-
-
-
-
-
-
-
-
-
- HealBot_Options_EditBox_OnLoad(this,HEALBOT_OPTIONS_CLICK)
-
-
- HealBot_Options_Click_OnTextChanged(this)
-
-
-
-
-
-
-
-
-
-
-
-
-
- HealBot_Options_EditBox_OnLoad(this,HEALBOT_OPTIONS_SHIFT)
-
-
- HealBot_Options_Shift_OnTextChanged(this)
-
-
-
-
-
-
-
-
-
-
-
-
-
- HealBot_Options_EditBox_OnLoad(this,HEALBOT_OPTIONS_CTRL)
-
-
- HealBot_Options_Ctrl_OnTextChanged(this)
-
-
-
-
-
-
-
-
-
-
-
-
-
- HealBot_Options_EditBox_OnLoad(this,HEALBOT_OPTIONS_SHIFTCTRL)
-
-
- HealBot_Options_ShiftCtrl_OnTextChanged(this)
-
-
-
-
-
-
-
-
-
-
-
-
- HealBot_Options_EnableHealthy_OnLoad(this,HEALBOT_OPTIONS_ENABLEHEALTHY)
- HealBot_Options_EnableHealthy_OnClick(this)
-
-
+
+
+
+
+
+
+
+
+
+ HealBot_ComboButtons_Button_OnLoad(this,HEALBOT_OPTIONS_BUTTONMIDDLE)
+ HealBot_ComboButtons_Button_OnClick(this,this:GetID())
+
+
+
+
+
+
+
+
+
+
+
+
+ HealBot_ComboButtons_Button_OnLoad(this,HEALBOT_OPTIONS_BUTTONRIGHT)
+ HealBot_ComboButtons_Button_OnClick(this,this:GetID())
+
+
+
+
+
+
+
+
+
+
+
+
+ HealBot_ComboButtons_Button_OnLoad(this,HEALBOT_OPTIONS_BUTTON4)
+ HealBot_ComboButtons_Button_OnClick(this,this:GetID())
+
+
+
+
+
+
+
+
+
+
+
+
+ HealBot_ComboButtons_Button_OnLoad(this,HEALBOT_OPTIONS_BUTTON5)
+ HealBot_ComboButtons_Button_OnClick(this,this:GetID())
+
+
+
+
+
+
+
+
+
+
+
+
+
+ HealBot_Options_EditBox_OnLoad(this,HEALBOT_OPTIONS_CLICK)
+
+
+ HealBot_Options_Click_OnTextChanged(this)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ HealBot_Options_EditBox_OnLoad(this,HEALBOT_OPTIONS_SHIFT)
+
+
+ HealBot_Options_Shift_OnTextChanged(this)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ HealBot_Options_EditBox_OnLoad(this,HEALBOT_OPTIONS_CTRL)
+
+
+ HealBot_Options_Ctrl_OnTextChanged(this)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ HealBot_Options_EditBox_OnLoad(this,HEALBOT_OPTIONS_SHIFTCTRL)
+
+
+ HealBot_Options_ShiftCtrl_OnTextChanged(this)
+
+
+
+
+
+
+
+
+
+
+
+
+
+ HealBot_Options_EnableHealthy_OnLoad(this,HEALBOT_OPTIONS_ENABLEHEALTHY)
+ HealBot_Options_EnableHealthy_OnClick(this)
+
+
@@ -217,86 +233,88 @@
-
+
-
+
-
+
-
+
-
-
-
-
-
-
-
-
-
-
- HealBot_Options_ShowTooltip_OnLoad(this,HEALBOT_OPTIONS_SHOWTOOLTIP)
- HealBot_Options_ShowTooltip_OnClick(this)
-
-
-
-
-
-
-
-
-
-
-
- HealBot_Options_TooltipPos_OnLoad(this)
-
-
-
-
-
-
-
-
-
-
-
- HealBot_Options_ShowTooltipTarget_OnLoad(this,HEALBOT_OPTIONS_SHOWUNITTOOLTIP)
- HealBot_Options_ShowTooltipTarget_OnClick(this)
-
-
-
-
-
-
-
-
-
-
-
- HealBot_Options_ShowTooltipSpellDetail_OnLoad(this,HEALBOT_OPTIONS_SHOWDETTOOLTIP)
- HealBot_Options_ShowTooltipSpellDetail_OnClick(this)
-
-
-
-
-
-
-
-
-
-
-
- HealBot_Options_ShowTooltipInstant_OnLoad(this,HEALBOT_OPTIONS_SHOWRECTOOLTIP)
- HealBot_Options_ShowTooltipInstant_OnClick(this)
-
-
+
+
+
+
+
+
+
+
+
+
+ HealBot_Options_ShowTooltip_OnLoad(this,HEALBOT_OPTIONS_SHOWTOOLTIP)
+ HealBot_Options_ShowTooltip_OnClick(this)
+
+
-
-
-
-
+
+
+
+
+
+
+
+
+
+ HealBot_Options_TooltipPos_OnLoad(this)
+
+
+
+
+
+
+
+
+
+
+
+ HealBot_Options_ShowTooltipTarget_OnLoad(this,HEALBOT_OPTIONS_SHOWUNITTOOLTIP)
+ HealBot_Options_ShowTooltipTarget_OnClick(this)
+
+
+
+
+
+
+
+
+
+
+
+
+ HealBot_Options_ShowTooltipSpellDetail_OnLoad(this,HEALBOT_OPTIONS_SHOWDETTOOLTIP)
+ HealBot_Options_ShowTooltipSpellDetail_OnClick(this)
+
+
+
+
+
+
+
+
+
+
+
+
+ HealBot_Options_ShowTooltipInstant_OnLoad(this,HEALBOT_OPTIONS_SHOWRECTOOLTIP)
+ HealBot_Options_ShowTooltipInstant_OnClick(this)
+
+
+
+
+
+
diff --git a/README.md b/README.md
index c917193..148453d 100644
--- a/README.md
+++ b/README.md
@@ -54,6 +54,7 @@ Default installation path: `C:\Program Files\World of Warcraft\Interface\AddOns\
* **Feature - Test Bars** - Implemented a "Test Bars" button and slider in the Skins options tab, allowing you to spawn and adjust a dummy raid group of up to 40 members without being in a real raid. This allows for easy layout and appearance customization out of combat.
* **UI - Skins Options & Custom Health Gradients** - Added configurable Max HP and Min HP colour pickers with descriptive labels for custom gradient support. Fixed colour picker button click interceptors and hooked ColorPickerFrame callbacks. Integrated global font selector across raid frame text, headers, Options button, and preview bars. Reorganized Skins tab layout to anchor Test Bars cleanly in Column 2.
* **UI - Cleanup** - While adding new funcionalities the way menus look was ignored, new functions were added to each tab where there was free space, so attempt was made to clean up this convoluted mess I made. Menu Tabs are now aligned and grouped in a manner that makes more sense.
+* **UI - Options Tabs Relative Anchoring Fix** - Fixed layout skewing and margin drift across Spells, Buffs, Chat, Extras (Integrations), and Auto options tabs. Replaced arbitrary hardcoded coordinate shifts with clean relative-anchoring hierarchies centered across the dialog width.
* **Performance Fix - Table Pooling & GC Leaks** - Resolved critical table leaks in emergency heals where pooled tables (`order` and `units`) failed to release when pet heals were disabled, un-nested pet healing from emergency heals, eliminated high-frequency (4 Hz) anonymous closure allocations in `HealBot_Action_UpdatePlayerHoTs`, and implemented in-place key recycling for equipment scanning and grid button tables.
**v1.7.4**
From d949b7489a9ffc5d6761a0f2e89c2bf312ccf4dc Mon Sep 17 00:00:00 2001
From: Bluewhale1337 <295648290+Bluewhale1337@users.noreply.github.com>
Date: Sat, 10 Oct 2026 15:45:29 +0200
Subject: [PATCH 8/8] refactor: adjust UI layouts and templates across options
XML files
---
HealBot_Options_Buffs.xml | 40 ++++++++-----------
HealBot_Options_General.xml | 4 +-
HealBot_Options_Integrations.xml | 66 ++++++++++++++++----------------
3 files changed, 52 insertions(+), 58 deletions(-)
diff --git a/HealBot_Options_Buffs.xml b/HealBot_Options_Buffs.xml
index 4d5d3d7..ecdbb7b 100644
--- a/HealBot_Options_Buffs.xml
+++ b/HealBot_Options_Buffs.xml
@@ -89,11 +89,10 @@
HealBot_Options_Buff_OnLoad(this)
-
-
+
-
+
@@ -127,11 +126,10 @@
HealBot_Options_Buff_OnLoad(this)
-
-
+
-
+
@@ -165,11 +163,10 @@
HealBot_Options_Buff_OnLoad(this)
-
-
+
-
+
@@ -203,11 +200,10 @@
HealBot_Options_Buff_OnLoad(this)
-
-
+
-
+
@@ -242,11 +238,10 @@
HealBot_Options_Buff_OnLoad(this)
-
-
+
-
+
@@ -280,11 +275,10 @@
HealBot_Options_Buff_OnLoad(this)
-
-
+
-
+
@@ -318,11 +312,10 @@
HealBot_Options_Buff_OnLoad(this)
-
-
+
-
+
@@ -356,11 +349,10 @@
HealBot_Options_Buff_OnLoad(this)
-
-
+
-
+
diff --git a/HealBot_Options_General.xml b/HealBot_Options_General.xml
index 38f5ba8..e86fe73 100644
--- a/HealBot_Options_General.xml
+++ b/HealBot_Options_General.xml
@@ -128,7 +128,7 @@
-
+
@@ -197,7 +197,7 @@
-
+
diff --git a/HealBot_Options_Integrations.xml b/HealBot_Options_Integrations.xml
index df1ce3b..bec1dde 100644
--- a/HealBot_Options_Integrations.xml
+++ b/HealBot_Options_Integrations.xml
@@ -8,7 +8,7 @@
-
+
@@ -27,7 +27,7 @@
-
+
@@ -44,9 +44,9 @@
-
+
-
+
@@ -65,7 +65,7 @@
-
+
@@ -84,7 +84,7 @@
-
+
@@ -97,33 +97,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
HealBot_Options_Integrations_OnShow(this);