feat: initialize HealBotBlue addon with core controller, options, locales, and view components

This commit is contained in:
Bluewhale1337
2026-11-09 23:29:50 +01:00
parent d9f256733b
commit f404ec71d7
17 changed files with 261 additions and 30 deletions
+8
View File
@@ -417,6 +417,13 @@ function HealBot_OnEvent_VariablesLoaded(this)
HealBot_InitData();
if HealBot_Config and HealBot_Config.CDCOverlay == 6 and not HealBot_Config.CDCOverlay_v2 then
HealBot_Config.CDCOverlay = 7
end
if HealBot_Config then
HealBot_Config.CDCOverlay_v2 = 1
end
if not HealBot_PartyFrameHooked then
local origShowPartyFrame = ShowPartyFrame;
ShowPartyFrame = function()
@@ -436,6 +443,7 @@ function HealBot_OnEvent_VariablesLoaded(this)
HealBot_BonusScanner:ScanEquipment();
HealBot_Action_ShowFrame();
HealBot_Action_ResetSkin();
this:RegisterEvent("ZONE_CHANGED_NEW_AREA");
this:RegisterEvent("PLAYER_REGEN_DISABLED");
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 MiB

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 MiB

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 MiB

After

Width:  |  Height:  |  Size: 1.0 MiB

+1
View File
@@ -427,3 +427,4 @@ HEALBOT_OPTIONS_CDCOVERLAY_GLOW = "Glow Effect";
HEALBOT_OPTIONS_CDCOVERLAY_GLOWFRAME = "Glow + Frame";
HEALBOT_OPTIONS_CDCOVERLAY_NONE = "Disabled";
HEALBOT_OPTIONS_CDCOVERLAY_ANIMATED = "Animated";
HEALBOT_OPTIONS_CDCOVERLAY_ANIMFRAME = "Animated + Frame";
+1
View File
@@ -457,3 +457,4 @@ HEALBOT_OPTIONS_CDCOVERLAY_GLOW = "Glow Effect";
HEALBOT_OPTIONS_CDCOVERLAY_GLOWFRAME = "Glow + Frame";
HEALBOT_OPTIONS_CDCOVERLAY_NONE = "Disabled";
HEALBOT_OPTIONS_CDCOVERLAY_ANIMATED = "Animated";
HEALBOT_OPTIONS_CDCOVERLAY_ANIMFRAME = "Animated + Frame";
+1
View File
@@ -408,3 +408,4 @@ HEALBOT_OPTIONS_CDCOVERLAY_GLOW = "Glow Effect";
HEALBOT_OPTIONS_CDCOVERLAY_GLOWFRAME = "Glow + Frame";
HEALBOT_OPTIONS_CDCOVERLAY_NONE = "Disabled";
HEALBOT_OPTIONS_CDCOVERLAY_ANIMATED = "Animated";
HEALBOT_OPTIONS_CDCOVERLAY_ANIMFRAME = "Animated + Frame";
+1
View File
@@ -402,3 +402,4 @@ HEALBOT_OPTIONS_CDCOVERLAY_GLOW = "Glow Effect";
HEALBOT_OPTIONS_CDCOVERLAY_GLOWFRAME = "Glow + Frame";
HEALBOT_OPTIONS_CDCOVERLAY_NONE = "Disabled";
HEALBOT_OPTIONS_CDCOVERLAY_ANIMATED = "Animated";
HEALBOT_OPTIONS_CDCOVERLAY_ANIMFRAME = "Animated + Frame";
+6
View File
@@ -283,6 +283,12 @@ HealBot_ConfigDefaults = {
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"},
bframe = {[HEALBOT_SKINS_STD] = 0, ["HealBot Party"] = 0, ["HealBot Raid"] = 0, ["Alteric Valley"] = 0, ["Modern Flat"] = 0},
bframewidth = {[HEALBOT_SKINS_STD] = 10, ["HealBot Party"] = 10, ["HealBot Raid"] = 10, ["Alteric Valley"] = 10, ["Modern Flat"] = 10},
bframecolr = {[HEALBOT_SKINS_STD] = 1, ["HealBot Party"] = 1, ["HealBot Raid"] = 1, ["Alteric Valley"] = 1, ["Modern Flat"] = 1},
bframecolg = {[HEALBOT_SKINS_STD] = 1, ["HealBot Party"] = 1, ["HealBot Raid"] = 1, ["Alteric Valley"] = 1, ["Modern Flat"] = 1},
bframecolb = {[HEALBOT_SKINS_STD] = 1, ["HealBot Party"] = 1, ["HealBot Raid"] = 1, ["Alteric Valley"] = 1, ["Modern Flat"] = 1},
bframecola = {[HEALBOT_SKINS_STD] = 1, ["HealBot Party"] = 1, ["HealBot Raid"] = 1, ["Alteric Valley"] = 1, ["Modern Flat"] = 1},
ShowTooltip = 1,
ShowManaBars = 0,
ManaBarsHealersOnly = 0,
+20
View File
@@ -216,6 +216,16 @@ function HealBot_Returned_Colours()
HealBot_Config.bcolorminr[HealBot_Config.Current_Skin],
HealBot_Config.bcolorming[HealBot_Config.Current_Skin],
HealBot_Config.bcolorminb[HealBot_Config.Current_Skin] = ColorPickerFrame:GetColorRGB();
elseif HealBot_ColourObjWaiting=="BarFrame" then
if not HealBot_Config.bframecolr then HealBot_Config.bframecolr = {} end
if not HealBot_Config.bframecolg then HealBot_Config.bframecolg = {} end
if not HealBot_Config.bframecolb then HealBot_Config.bframecolb = {} end
if not HealBot_Config.bframecola then HealBot_Config.bframecola = {} end
HealBot_Config.bframecolr[HealBot_Config.Current_Skin],
HealBot_Config.bframecolg[HealBot_Config.Current_Skin],
HealBot_Config.bframecolb[HealBot_Config.Current_Skin] = ColorPickerFrame:GetColorRGB();
HealBot_Config.bframecola[HealBot_Config.Current_Skin] = A;
HealBot_Action_ResetSkin()
else
HealBot_Config.CDCBarColour[HealBot_ColourObjWaiting].R,
HealBot_Config.CDCBarColour[HealBot_ColourObjWaiting].G,
@@ -408,6 +418,16 @@ function HealBot_Options_SetSkins()
local is1pxBorder = (HealBot_Config.bborder[HealBot_Config.Current_Skin] == 1)
HealBot_Options_1pxBorders:SetChecked(is1pxBorder and 1 or nil)
local isBarFrame = (HealBot_Config.bframe and HealBot_Config.bframe[HealBot_Config.Current_Skin] == 1)
HealBot_Options_BarFrame:SetChecked(isBarFrame and 1 or nil)
local frameWidth = (HealBot_Config.bframewidth and HealBot_Config.bframewidth[HealBot_Config.Current_Skin]) or 10
HealBot_Options_BarFrameWidthS:SetValue(frameWidth)
if HealBot_Options_Skins_ScrollFrame then
HealBot_Options_Skins_ScrollFrame:UpdateScrollChildRect()
end
HealBot_SetSkinColours()
if HealBot_Config.Current_Skin==HEALBOT_SKINS_STD then
HealBot_Options_DeleteSkin:Disable();
+1
View File
@@ -51,6 +51,7 @@ function HealBot_Options_CDCOverlay_DropDown()
HEALBOT_OPTIONS_CDCOVERLAY_GLOW or "Glow Effect",
HEALBOT_OPTIONS_CDCOVERLAY_GLOWFRAME or "Glow + Frame",
HEALBOT_OPTIONS_CDCOVERLAY_ANIMATED or "Animated",
HEALBOT_OPTIONS_CDCOVERLAY_ANIMFRAME or "Animated + Frame",
HEALBOT_OPTIONS_CDCOVERLAY_NONE or "Disabled",
};
for i=1, getn(list), 1 do
+13
View File
@@ -129,6 +129,12 @@ function HealBot_SkinColorpick_OnClick(SkinType)
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)
elseif SkinType=="BarFrame" then
local r = (HealBot_Config.bframecolr and HealBot_Config.bframecolr[HealBot_Config.Current_Skin]) or 1.0
local g = (HealBot_Config.bframecolg and HealBot_Config.bframecolg[HealBot_Config.Current_Skin]) or 1.0
local b = (HealBot_Config.bframecolb and HealBot_Config.bframecolb[HealBot_Config.Current_Skin]) or 1.0
local a = (HealBot_Config.bframecola and HealBot_Config.bframecola[HealBot_Config.Current_Skin]) or 1.0
HealBot_UseColourPick(r, g, b, a)
end
end
-- HealBot_SetSkinColours: Applies skin configuration to UI elements.
@@ -184,6 +190,13 @@ function HealBot_SetSkinColours()
HealBot_Config.babortcolr[skin], HealBot_Config.babortcolg[skin],
HealBot_Config.babortcolb[skin], HealBot_Config.babortcola[skin]
)
if HealBot_BarFrameColorpick then
local bfr = (HealBot_Config.bframecolr and HealBot_Config.bframecolr[skin]) or 1.0
local bfg = (HealBot_Config.bframecolg and HealBot_Config.bframecolg[skin]) or 1.0
local bfb = (HealBot_Config.bframecolb and HealBot_Config.bframecolb[skin]) or 1.0
local bfa = (HealBot_Config.bframecola and HealBot_Config.bframecola[skin]) or 1.0
HealBot_BarFrameColorpick:SetStatusBarColor(bfr, bfg, bfb, bfa)
end
-- 4. Setup Main Panel Backdrop (Fixed scoping bugs)
local borderStyle = HealBot_Config.bborder[skin] or 2
+31
View File
@@ -43,6 +43,19 @@ function HealBot_Options_BarMaxRowsS_OnValueChanged(this)
HealBot_Action_PartyChanged()
end
function HealBot_Options_BarFrame_OnClick(this)
if not HealBot_Config.bframe then HealBot_Config.bframe = {} end
HealBot_Config.bframe[HealBot_Config.Current_Skin] = (this:GetChecked() and 1 or 0)
HealBot_Action_ResetSkin()
end
function HealBot_Options_BarFrameWidthS_OnValueChanged(this)
if not HealBot_Config.bframewidth then HealBot_Config.bframewidth = {} end
HealBot_Config.bframewidth[HealBot_Config.Current_Skin] = this:GetValue()
getglobal(this:GetName().."Text"):SetText(this.text .. ": " .. this:GetValue())
HealBot_Action_ResetSkin()
end
function HealBot_Options_GridOrientationDD_OnLoad(this)
UIDropDownMenu_Initialize(this, HealBot_Options_GridOrientationDD_Initialize);
UIDropDownMenu_SetWidth(110, this);
@@ -139,6 +152,12 @@ function HealBot_Options_NewSkinb_OnClick(this)
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
if not HealBot_Config.bframe then HealBot_Config.bframe = {} end
if not HealBot_Config.bframewidth then HealBot_Config.bframewidth = {} end
if not HealBot_Config.bframecolr then HealBot_Config.bframecolr = {} end
if not HealBot_Config.bframecolg then HealBot_Config.bframecolg = {} end
if not HealBot_Config.bframecolb then HealBot_Config.bframecolb = {} end
if not HealBot_Config.bframecola then HealBot_Config.bframecola = {} end
local curSkin = HealBot_Config.Current_Skin
local newSkin = HealBot_Options_NewSkin:GetText()
@@ -149,6 +168,12 @@ function HealBot_Options_NewSkinb_OnClick(this)
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"
HealBot_Config.bframe[newSkin] = HealBot_Config.bframe[curSkin] or 0
HealBot_Config.bframewidth[newSkin] = HealBot_Config.bframewidth[curSkin] or 10
HealBot_Config.bframecolr[newSkin] = HealBot_Config.bframecolr[curSkin] or 1
HealBot_Config.bframecolg[newSkin] = HealBot_Config.bframecolg[curSkin] or 1
HealBot_Config.bframecolb[newSkin] = HealBot_Config.bframecolb[curSkin] or 1
HealBot_Config.bframecola[newSkin] = HealBot_Config.bframecola[curSkin] or 1
table.insert(HealBot_Skins,2,HealBot_Options_NewSkin:GetText())
HealBot_Config.Skin_ID = 2;
@@ -204,6 +229,12 @@ function HealBot_Options_DeleteSkin_OnClick(this)
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
if HealBot_Config.bframe then HealBot_Config.bframe[HealBot_Options_SkinsText:GetText()] = nil end
if HealBot_Config.bframewidth then HealBot_Config.bframewidth[HealBot_Options_SkinsText:GetText()] = nil end
if HealBot_Config.bframecolr then HealBot_Config.bframecolr[HealBot_Options_SkinsText:GetText()] = nil end
if HealBot_Config.bframecolg then HealBot_Config.bframecolg[HealBot_Options_SkinsText:GetText()] = nil end
if HealBot_Config.bframecolb then HealBot_Config.bframecolb[HealBot_Options_SkinsText:GetText()] = nil end
if HealBot_Config.bframecola then HealBot_Config.bframecola[HealBot_Options_SkinsText:GetText()] = nil end
table.remove(HealBot_Skins,HealBot_Config.Skin_ID)
HealBot_Config.Skin_ID = 1;
HealBot_Config.Skins = HealBot_Skins;
+83 -15
View File
@@ -93,23 +93,36 @@
</Scripts>
</Button>
<Frame name="HealBot_Options_Scale">
<ScrollFrame name="HealBot_Options_Skins_ScrollFrame" inherits="UIPanelScrollFrameTemplate">
<Size>
<AbsDimension y="325"/>
<AbsDimension x="475" y="330"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="20" y="-88"/>
</Offset>
</Anchor>
<Anchor point="TOPRIGHT">
<Offset>
<AbsDimension x="-20" y="-180"/>
<AbsDimension x="20" y="-85"/>
</Offset>
</Anchor>
</Anchors>
<Frames>
<Scripts>
<OnMouseWheel>
local scrollBar = getglobal(this:GetName().."ScrollBar");
if not scrollBar then return end
local current = scrollBar:GetValue();
local minVal, maxVal = scrollBar:GetMinMaxValues();
if arg1 &gt; 0 then
scrollBar:SetValue(math.max(minVal, current - 25));
else
scrollBar:SetValue(math.min(maxVal, current + 25));
end
</OnMouseWheel>
</Scripts>
<ScrollChild>
<Frame name="HealBot_Options_Scale">
<Size>
<AbsDimension x="475" y="490"/>
</Size>
<Frames>
<!-- COLUMN 1: Geometry -->
<Slider name="HealBot_Options_BarHeightS" inherits="HealBot_Options_SliderTemplate">
<Size><AbsDimension x="123" y="18" /></Size>
@@ -286,9 +299,16 @@
<OnClick>HealBot_Config.bborder[HealBot_Config.Current_Skin] = (this:GetChecked() and 1 or 2); HealBot_Action_ResetSkin()</OnClick>
</Scripts>
</CheckButton>
<CheckButton name="HealBot_Options_BarFrame" inherits="SendMailRadioButtonTemplate">
<Anchors><Anchor point="TOPLEFT" relativeTo="HealBot_Options_1pxBorders" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="-5" /></Offset></Anchor></Anchors>
<Scripts>
<OnLoad>getglobal(this:GetName().."Text"):SetText("Bar Frames")</OnLoad>
<OnClick>HealBot_Options_BarFrame_OnClick(this)</OnClick>
</Scripts>
</CheckButton>
<Slider name="HealBot_Options_BarTextureS" inherits="HealBot_Options_SliderTemplate">
<Size><AbsDimension x="123" y="17" /></Size>
<Anchors><Anchor point="TOPLEFT" relativeTo="HealBot_Options_1pxBorders" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="-15" /></Offset></Anchor></Anchors>
<Anchors><Anchor point="TOPLEFT" relativeTo="HealBot_Options_BarFrame" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="-15" /></Offset></Anchor></Anchors>
<Scripts>
<OnLoad>HealBot_Options_val_OnLoad(this,HEALBOT_OPTIONS_SKINTEXTURE,1,14)</OnLoad>
<OnValueChanged>HealBot_Options_BarTextureS_OnValueChanged(this)</OnValueChanged>
@@ -326,13 +346,21 @@
<OnValueChanged>HealBot_Options_BorderThicknessS_OnValueChanged(this)</OnValueChanged>
</Scripts>
</Slider>
<Slider name="HealBot_Options_BarFrameWidthS" inherits="HealBot_Options_SliderTemplate">
<Size><AbsDimension x="123" y="17" /></Size>
<Anchors><Anchor point="TOPLEFT" relativeTo="HealBot_Options_BorderThicknessS" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="-20" /></Offset></Anchor></Anchors>
<Scripts>
<OnLoad>HealBot_Options_val_OnLoad(this,"Frame Width",1,20)</OnLoad>
<OnValueChanged>HealBot_Options_BarFrameWidthS_OnValueChanged(this)</OnValueChanged>
</Scripts>
</Slider>
<!-- BOTTOM ROW 1: Max HP, Min HP, Font Enabled, Font Disabled -->
<StatusBar name="HealBot_MaxHPColorpick" inherits="TextStatusBar">
<Size><AbsDimension x="87" y="18"/></Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_IconSizeS" relativePoint="BOTTOMLEFT">
<Offset><AbsDimension x="-25" y="-30"/></Offset>
<Anchor point="TOPLEFT">
<Offset><AbsDimension x="20" y="-345"/></Offset>
</Anchor>
</Anchors>
<Layers>
@@ -639,10 +667,50 @@
<OnClick>HealBot_SkinColorpick_OnClick("Abort")</OnClick>
</Scripts>
</Button>
<!-- BOTTOM ROW 3: Bar Frame Color -->
<StatusBar name="HealBot_BarFrameColorpick" inherits="TextStatusBar">
<Size><AbsDimension x="87" y="18"/></Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_DebTextColorpick" relativePoint="BOTTOMLEFT">
<Offset><AbsDimension x="0" y="-22"/></Offset>
</Anchor>
</Anchors>
<Layers>
<Layer level="OVERLAY">
<FontString inherits="GameFontNormalSmall" text="Bar Frame">
<Anchors>
<Anchor point="BOTTOM" relativePoint="TOP">
<Offset><AbsDimension x="0" y="2"/></Offset>
</Anchor>
</Anchors>
</FontString>
<FontString inherits="GameFontHighlightSmall" text="Bar Frame">
<Anchors><Anchor point="CENTER"/></Anchors>
</FontString>
</Layer>
</Layers>
<Scripts><OnLoad>this:SetMinMaxValues(0,100); this:SetValue(100);</OnLoad></Scripts>
<BarTexture file="Interface\TargetingFrame\UI-StatusBar"/>
<BarColor r="1" g="1" b="1"/>
</StatusBar>
<Button name="HealBot_BarFrameColorpickb">
<Size><AbsDimension x="87" y="18"/></Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_BarFrameColorpick" relativePoint="TOPLEFT">
<Offset><AbsDimension x="0" y="0"/></Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>this:SetFrameLevel(this:GetParent():GetFrameLevel() + 2)</OnLoad>
<OnClick>HealBot_SkinColorpick_OnClick("BarFrame")</OnClick>
</Scripts>
</Button>
</Frames>
</Frame>
</Frames>
</Frame>
</ScrollChild>
</ScrollFrame>
</Frames>
</Frame>
</Ui>
+3 -1
View File
@@ -60,8 +60,10 @@ Default installation path: `C:\Program Files\World of Warcraft\Interface\AddOns\
* **Feature - HoT Timer Display Modes & Positioning:** Added configurable HoT timer list position dropdown (`Below`, `Above`, `Left`, `Right`) relative to raid frames. Added `Icon Overlay` mode rendering countdown timers directly on health bar HoT icons, and a `Both` mode allowing simultaneous timer list and on-bar icon countdown numbers. Excluded pets from HoT timer lists and overlays. Optimized expiration lookups with O(1) texture-to-spell mappings.
* **Refactor & Feature - Unified Aura & HoT Tracking:** Unified bar icons and HoT timers into a master dictionary (`HealBot_TrackedAuras`) in `HealBot_Data.lua`. Added Weakened Soul, Fear Ward, Abolish Disease, and Abolish Poison to active timer bars with localized client support and debuff-aware pruning.
* **Bug Fix - HoT Tracking Premature Deletion & GUID Resolution:** Resolved issue where synchronous aura scans on spell cast prematurely purged active HoTs before server buff packets arrived. Fixed HoT timer list showing raw GUID strings instead of names by ensuring GUID caches populate immediately on `PLAYER_ENTERING_WORLD` (even when solo) and adding multi-tier name resolution fallbacks. Fixed unit bar icon countdown numbers not rendering by adding explicit overlay frame show triggers and normalized texture lookup fallbacks.
* **Feature - Debuff Visual Overlays & Animated Sprite Sheets:** Added selectable visual styles for Cure / Dispel / Cleanse (CDC) debuff alerts in Options -> Cure (`Whole Bar`, `Frame / Border`, `Glow Overlay`, `Glow + Frame`, `Animated`, `Disabled`). Animated flipbook textures for Poison (dripping slime teardrops), Curse (rising shadow wisps), Disease (creeping roots), and Magic(arcane sigils turning). Integrated lightweight, throttled (15 FPS) UV sprite animation engine directly into `HealBot_OnUpdate` with zero garbage allocation.
* **Feature - Debuff Visual Overlays & Animated Sprite Sheets:** Added selectable visual styles for Cure / Dispel / Cleanse (CDC) debuff alerts in Options -> Cure (`Whole Bar`, `Frame / Border`, `Glow Overlay`, `Glow + Frame`, `Animated`, `Disabled`). Modeled high-readability animated flipbook sprite sheets: Poison (dripping slime teardrops), Curse (tall 64px demonic flame pillars with embers and S-sway), Magic (large 48px rotating Arcane Sigil with outer celestial rings, astrolabe tick bands, and crackling mana lightning forks), and Disease (heavy necrotic border crust with 5 thick throbbing rot tendrils and bursting pustule boils). Integrated lightweight, throttled (15 FPS) UV sprite animation engine directly into `HealBot_OnUpdate` with zero garbage allocation.
* **Feature - Debuff Animation Test Slash Commands:** Added `/hb test <poison|curse|disease|magic|clear>` (and `/hb debuff <type>`) commands to simulate active debuff animations on player and dummy test bars out-of-combat. Automatically activates Animated mode and dummy debuff icons, while guarding state against aura event overwrite until stopped.
* **Feature - Bar Frames (Borders) & Scrollable Skins Menu:** Added separate option in Skins menu to display frames/borders around each unit health bar with configurable width (1-20) and a dedicated color picker. Bar frames adapt to the skin's sharp ("1px Borders", `WHITE8X8`) or fuzzy (default tooltip border, `UI-Tooltip-Border`) style. Wired directly into the CDC debuff overlay engine: when cleanable debuffs trigger with Frame/Border, Glow+Frame, or Animated+Frame mode, the bar frame dynamically adopts the CDC debuff color and returns to the bar frame's regular color when dispelled. Implemented a scrollable container (`UIPanelScrollFrameTemplate`) with mouse wheel support in the Skins options panel to comfortably fit all layout, geometry, and color settings without control overlap.
* **Feature - CDC "Animated + Frame" Overlay Option:** Added "Animated + Frame" display option to the Cure / Dispel (CDC) options panel. Combines the active procedural animated debuff flipbook with a colored debuff border highlighting the bar frame.
**v1.7.7**
+3 -1
View File
@@ -62,7 +62,9 @@ function HealBot_SetTestDebuff(debuffType)
if debuffType then
HealBot_TestDebuff = debuffType;
if HealBot_Config then
HealBot_Config.CDCOverlay = 5; -- Automatically switch to Animated mode
if HealBot_Config.CDCOverlay ~= 5 and HealBot_Config.CDCOverlay ~= 6 then
HealBot_Config.CDCOverlay = 5; -- Automatically switch to Animated mode
end
end
if not HealBot_UnitDebuff then HealBot_UnitDebuff = {} end
HealBot_UnitDebuff["player"] = debuffType;
+89 -13
View File
@@ -2,6 +2,10 @@
-- Status bar rendering, color calculations, button styling, and debuff pulsing
local HealBot_AnimTimer = 0
local HealBot_BarFrame_Backdrop = {
tile = false,
insets = { left = 0, right = 0, top = 0, bottom = 0 }
}
-- HealBot_Action_SetTexture: Internal utility: HealBot_Action_SetTexture
function HealBot_Action_SetTexture(bar, btexture)
@@ -242,8 +246,23 @@ function HealBot_Action_EnableButton(button)
local debuffType = HealBot_UnitDebuff[unit]
local isDead = state.isDead or state.isGhost or (not string.find(unit, "^Test") and UnitIsDeadOrGhost(unit))
local overlayMode = HealBot_Config.CDCOverlay or 1
local skin = HealBot_Config.Current_Skin
local hasBarFrame = (HealBot_Config.bframe and HealBot_Config.bframe[skin] == 1)
local bfr = (HealBot_Config.bframecolr and HealBot_Config.bframecolr[skin]) or 1.0
local bfg = (HealBot_Config.bframecolg and HealBot_Config.bframecolg[skin]) or 1.0
local bfb = (HealBot_Config.bframecolb and HealBot_Config.bframecolb[skin]) or 1.0
local bfa = (HealBot_Config.bframecola and HealBot_Config.bframecola[skin]) or 1.0
if debuffType and not isDead and overlayMode > 1 and overlayMode < 6 then
local alphaBorder = 1.0
local alphaOverlay = 1.0
if not button:IsEnabled() then
local disAlpha = HealBot_Config.bardisa[skin] or 0.4
alphaBorder = disAlpha
alphaOverlay = disAlpha
bfa = bfa * disAlpha
end
if debuffType and not isDead and overlayMode > 1 and overlayMode < 7 then
local color = HealBot_Config.CDCBarColour[debuffType]
local cr, cg, cb = 1, 0, 0
if color then
@@ -253,14 +272,6 @@ function HealBot_Action_EnableButton(button)
button.debuffOverlay:SetFrameLevel(bar:GetFrameLevel() + 2)
button.debuffOverlay:Show()
local alphaBorder = 1.0
local alphaOverlay = 1.0
if not button:IsEnabled() then
local disAlpha = HealBot_Config.bardisa[HealBot_Config.Current_Skin] or 0.4
alphaBorder = disAlpha
alphaOverlay = disAlpha
end
if overlayMode == 2 then
button.isAnimatedDebuff = false
button.debuffOverlay:SetBackdropBorderColor(cr, cg, cb, alphaBorder)
@@ -270,7 +281,11 @@ function HealBot_Action_EnableButton(button)
end
elseif overlayMode == 3 then
button.isAnimatedDebuff = false
button.debuffOverlay:SetBackdropBorderColor(0, 0, 0, 0)
if hasBarFrame then
button.debuffOverlay:SetBackdropBorderColor(bfr, bfg, bfb, bfa)
else
button.debuffOverlay:SetBackdropBorderColor(0, 0, 0, 0)
end
if button.debuffGlow then
local glowTex = HealBot_Config.CDCOverlayTexture or "Interface\\AddOns\\HealBotBlue\\Images\\glow1.tga"
button.debuffGlow:SetTexture(glowTex)
@@ -291,7 +306,37 @@ function HealBot_Action_EnableButton(button)
button.debuffGlow:Show()
end
elseif overlayMode == 5 then -- Animated
button.debuffOverlay:SetBackdropBorderColor(0, 0, 0, 0)
if hasBarFrame then
button.debuffOverlay:SetBackdropBorderColor(bfr, bfg, bfb, bfa)
else
button.debuffOverlay:SetBackdropBorderColor(0, 0, 0, 0)
end
if button.debuffGlow then
local glowTex
if debuffType == HEALBOT_POISON_en then
glowTex = "Interface\\AddOns\\HealBotBlue\\Images\\debuff_poison.tga"
button.isAnimatedDebuff = true
elseif debuffType == HEALBOT_CURSE_en then
glowTex = "Interface\\AddOns\\HealBotBlue\\Images\\debuff_curse.tga"
button.isAnimatedDebuff = true
elseif debuffType == HEALBOT_DISEASE_en then
glowTex = "Interface\\AddOns\\HealBotBlue\\Images\\debuff_disease.tga"
button.isAnimatedDebuff = true
elseif debuffType == HEALBOT_MAGIC_en then
glowTex = "Interface\\AddOns\\HealBotBlue\\Images\\debuff_magic.tga"
button.isAnimatedDebuff = true
else
glowTex = HealBot_Config.CDCOverlayTexture or "Interface\\AddOns\\HealBotBlue\\Images\\glow1.tga"
button.isAnimatedDebuff = false
button.debuffGlow:SetTexCoord(0, 1, 0, 1)
end
button.debuffGlow:SetTexture(glowTex)
button.debuffGlow:SetBlendMode("BLEND")
button.debuffGlow:SetVertexColor(cr, cg, cb, alphaOverlay)
button.debuffGlow:Show()
end
elseif overlayMode == 6 then -- Animated + Frame
button.debuffOverlay:SetBackdropBorderColor(cr, cg, cb, alphaBorder)
if button.debuffGlow then
local glowTex
if debuffType == HEALBOT_POISON_en then
@@ -319,11 +364,17 @@ function HealBot_Action_EnableButton(button)
end
else
button.isAnimatedDebuff = false
button.debuffOverlay:Hide()
if button.debuffGlow then
button.debuffGlow:Hide()
button.debuffGlow:SetTexCoord(0, 1, 0, 1)
end
if hasBarFrame and not isDead then
button.debuffOverlay:SetFrameLevel(bar:GetFrameLevel() + 2)
button.debuffOverlay:SetBackdropBorderColor(bfr, bfg, bfb, bfa)
button.debuffOverlay:Show()
else
button.debuffOverlay:Hide()
end
end
end
@@ -469,7 +520,7 @@ local HealBot_AnimFrame = 0
-- HealBot_Action_UpdateDebuffAnimation: Advances animated overlay frames on active debuffed buttons.
function HealBot_Action_UpdateDebuffAnimation(elapsed)
if not HealBot_Config or HealBot_Config.CDCOverlay ~= 5 then return end
if not HealBot_Config or (HealBot_Config.CDCOverlay ~= 5 and HealBot_Config.CDCOverlay ~= 6) then return end
HealBot_AnimTimer = HealBot_AnimTimer + elapsed
if HealBot_AnimTimer < 0.066 then return end -- ~15 FPS
@@ -515,6 +566,27 @@ function HealBot_Action_ResetSkin()
local fontOutline = (HealBot_Config.bfontoutline and HealBot_Config.bfontoutline[skin]) or 0
local expectedFlags = fontOutline == 1 and "OUTLINE" or ""
local borderStyle = (HealBot_Config.bborder and HealBot_Config.bborder[skin]) or 2
local width = (HealBot_Config.bframewidth and HealBot_Config.bframewidth[skin]) or 10
local edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border"
if borderStyle == 1 then
edgeFile = "Interface\\Buttons\\WHITE8X8"
end
HealBot_BarFrame_Backdrop.edgeFile = edgeFile
HealBot_BarFrame_Backdrop.edgeSize = width
for i = 1, 84 do
local btn = getglobal("HealBot_Action_HealUnit" .. i)
if btn then
if not btn.debuffOverlay then
btn.debuffOverlay = getglobal(btn:GetName() .. "DebuffOverlay")
end
if btn.debuffOverlay then
btn.debuffOverlay:SetBackdrop(HealBot_BarFrame_Backdrop)
end
end
end
if HealBot_Action_OptionsButton and HealBot_Action_OptionsButton:GetFontString() then
HealBot_Action_OptionsButton:GetFontString():SetFont(bfont, btextheight, expectedFlags)
end
@@ -537,8 +609,12 @@ function HealBot_Action_ResetSkin()
HealBot_Action_SetTexture(HealBot_EnTextColorpickin, HealBot_Config.btexture[skin])
HealBot_Action_SetTexture(HealBot_DisTextColorpick, HealBot_Config.btexture[skin])
HealBot_Action_SetTexture(HealBot_DebTextColorpick, HealBot_Config.btexture[skin])
if HealBot_BarFrameColorpick then
HealBot_Action_SetTexture(HealBot_BarFrameColorpick, HealBot_Config.btexture[skin])
end
HealBot_SetSkinColours()
end
HealBot_Action_EnableButtons()
end
-- HealBot_Action_RefreshButtons: Refreshes all active unit buttons.