Minor bugfixes to target restoration, layout, Buff tracking

This commit is contained in:
Bluewhale1337
2026-06-30 18:18:01 +02:00
parent b8b6a57ef8
commit e567c0f394
18 changed files with 389 additions and 194 deletions
+37 -7
View File
@@ -37,7 +37,25 @@ function HealBot_Action_MustHealSome()
end);
end
function HealBot_GetRezSpellForClass()
local _, class = UnitClass("player");
if class == "PRIEST" then return HEALBOT_RESURRECTION;
elseif class == "DRUID" then return HEALBOT_REBIRTH;
elseif class == "PALADIN" then return HEALBOT_REDEMPTION;
elseif class == "SHAMAN" then return HEALBOT_ANCESTRALSPIRIT;
end
return nil;
end
function HealBot_CanHeal(unit)
if UnitIsDeadOrGhost(unit) then
local rezSpell = HealBot_GetRezSpellForClass();
if rezSpell and HealBot_GetHealSpell(unit, rezSpell) then
return true;
end
return false;
end
local SHeal = HealBot_ShouldHeal(unit)
if SHeal then
local spell = HealBot_GetHealSpell(unit,HealBot_Action_SpellPattern("Left"))
@@ -103,6 +121,15 @@ function HealBot_Action_HealUnit_OnClick(this,button)
local decode_button = HealBot_Decode_Button(button);
local pattern = HealBot_Action_SpellPattern(decode_button);
-- Resurrection override on dead target
if UnitIsDeadOrGhost(this.unit) then
local rezSpell = HealBot_GetRezSpellForClass();
if rezSpell then
HealBot_CastSpellOnFriend(rezSpell, this.unit);
return
end
end
-- Buff casting override
if HealBot_Config.BuffWatch == 1 then
local inCombat = UnitAffectingCombat("player")
@@ -174,12 +201,7 @@ function HealBot_Action_OnShow(this)
PlaySound("igAbilityOpen");
end
HealBot_Config.ActionVisible = 1
HealBot_Action:SetBackdropColor(
HealBot_Config.backcolr[HealBot_Config.Current_Skin],
HealBot_Config.backcolg[HealBot_Config.Current_Skin],
HealBot_Config.backcolb[HealBot_Config.Current_Skin],
HealBot_Config.backcola[HealBot_Config.Current_Skin]);
local borderStyle = HealBot_Config.bborder[HealBot_Config.Current_Skin] or 2
local borderStyle = HealBot_Config.bborder[HealBot_Config.Current_Skin] or 2
if borderStyle == 0 then
HealBot_Action:SetBackdropBorderColor(0,0,0,0);
elseif borderStyle == 1 then
@@ -207,11 +229,18 @@ function HealBot_Action_OnShow(this)
HealBot_Config.borcolb[HealBot_Config.Current_Skin],
HealBot_Config.borcola[HealBot_Config.Current_Skin]);
end
HealBot_Action:SetBackdropColor(
HealBot_Config.backcolr[HealBot_Config.Current_Skin],
HealBot_Config.backcolg[HealBot_Config.Current_Skin],
HealBot_Config.backcolb[HealBot_Config.Current_Skin],
HealBot_Config.backcola[HealBot_Config.Current_Skin]);
end
function HealBot_Action_OnHide(this)
HealBot_StopMoving(this);
HealBot_Config.ActionVisible = 0
if not this.ProgrammaticHide then
HealBot_Config.ActionVisible = 0
end
end
function HealBot_Action_OnMouseDown(this,button)
@@ -245,6 +274,7 @@ function HealBot_Action_OnDragStop(this)
end
-- http://www.flexbarforums.com/viewtopic.php?t=66
-- no idea what it was link is dead
function HealBot_Action_OnKey(this,key,state)
local command = GetBindingAction(key);
if command then
+39 -3
View File
@@ -34,6 +34,22 @@ function HealBot_RegisterThis(this)
end
function HealBot_OnUpdate(this, arg1)
if HealBot_TargetRestorePending then
HealBot_TargetRestoreTimer = HealBot_TargetRestoreTimer + arg1;
if HealBot_TargetRestoreTimer >= 0.1 then
local pending = HealBot_TargetRestorePending;
HealBot_TargetRestorePending = nil;
HealBot_TargetRestoreTimer = 0;
if pending.type == "enemy" then
TargetLastEnemy();
elseif pending.type == "friend" then
TargetLastTarget();
elseif pending.type == "clear" then
ClearTarget();
end
end
end
-- Process Dirty Queue for MVC View
if next(HealBot_View_DirtyUnits) ~= nil then
for unitID in pairs(HealBot_View_DirtyUnits) do
@@ -210,10 +226,26 @@ function HealBot_OnEvent_VariablesLoaded(this)
HealBot_InitData();
if not HealBot_PartyFrameHooked then
local origShowPartyFrame = ShowPartyFrame;
ShowPartyFrame = function()
if HealBot_Config.HideParty == 1 then
if HidePartyFrame then HidePartyFrame(); end
elseif origShowPartyFrame then
origShowPartyFrame();
end
end
HealBot_PartyFrameHooked = true;
end
if HealBot_Config.HideParty == 1 and HidePartyFrame then
HidePartyFrame();
end
if class == "PRIEST" or class == "DRUID" or class == "PALADIN" or class == "SHAMAN" then
HealBot_BonusScanner:ScanEquipment();
if HealBot_Config.ActionVisible == 1 then HealBot_Action:Show() end
HealBot_Action_ShowFrame();
this:RegisterEvent("ZONE_CHANGED_NEW_AREA");
this:RegisterEvent("PLAYER_REGEN_DISABLED");
@@ -268,9 +300,13 @@ end
function HealBot_OnEvent_PlayerRegenDisabled(this)
HealBot_RecalcParty();
if (UnitIsDeadOrGhost("player")) or (UnitOnTaxi("player")) then
if HealBot_Config.AutoClose==1 and HealBot_Config.ActionVisible~=0 then HealBot_Action:Hide(); end;
if HealBot_Config.AutoClose==1 and HealBot_Config.ActionVisible~=0 then
HealBot_Action.ProgrammaticHide = true;
HealBot_Action:Hide();
HealBot_Action.ProgrammaticHide = nil;
end;
else
HealBot_Action:Show();
HealBot_Action_ShowFrame();
-- Reapply user settings to override the engine's white default
if HealBot_Config and HealBot_Config.Current_Skin then
+24 -18
View File
@@ -3,6 +3,8 @@
HealBot_CastingSpell = nil;
HealBot_CastingTarget = nil;
HealBot_TargetRestorePending = nil;
HealBot_TargetRestoreTimer = 0;
local HealBot_Health60 = {
["DRUID"] = 3500,
@@ -210,29 +212,26 @@ function HealBot_CheckCasting(unit)
end
function HealBot_CastSpellOnFriend(spell, target)
local old;
local ttype = "other";
if (not spell or not target or not UnitName(target)) then
return;
end
if (UnitCanAttack("player", "target")) then
old = "enemy";
else
old = UnitName("target");
if UnitName("target") ~= UnitName(target) then
TargetUnit(target);
else
ttype = "direct";
end
local targetEnemy = UnitCanAttack("player", "target");
local oldTarget = UnitName("target");
if oldTarget ~= UnitName(target) then
TargetUnit(target);
end
HealBot_StartCasting(spell, target, ttype);
if (old == "enemy") then
TargetLastEnemy();
elseif (old) then
TargetByName(old);
else
ClearTarget();
HealBot_StartCasting(spell, target, "direct");
if targetEnemy then
HealBot_TargetRestorePending = { type = "enemy" };
elseif oldTarget and oldTarget ~= UnitName(target) then
HealBot_TargetRestorePending = { type = "friend" };
elseif not oldTarget then
HealBot_TargetRestorePending = { type = "clear" };
end
HealBot_TargetRestoreTimer = 0;
end
function HealBot_SetItemDefaults(spell)
@@ -388,6 +387,13 @@ end
function HealBot_RecalcParty()
HealBot_Action_PartyChanged();
if HealBot_Action_HealButtons then
for _, button in ipairs(HealBot_Action_HealButtons) do
if button and button.unit then
HealBot_OnEvent_UnitAura(nil, button.unit);
end
end
end
HealBot_Action_RefreshButtons();
end
+3 -1
View File
@@ -11,6 +11,7 @@ HealBot_ConfigDefaults = {
EmergencyHeals = 1,
ActionLocked = 0,
ActionVisible = 1,
HideSolo = 0,
OverHeal = 0.25,
CastNotify = 1,
ChatMessages = {
@@ -175,7 +176,7 @@ HealBot_ConfigDefaults = {
CDCRightText = {[HEALBOT_PRIEST]="None", [HEALBOT_SHAMAN]="None", [HEALBOT_DRUID]="None", [HEALBOT_PALADIN]="None",},
Current_Skin = "Modern Flat",
Skin_ID = 1,
Skins = {HEALBOT_SKINS_STD, "HealBot Party", "HealBot Raid", "Alteric Valley", "Modern Flat"},
Skins = {"Modern Flat", HEALBOT_SKINS_STD, "HealBot Party", "HealBot Raid", "Alteric Valley"},
numcols = {[HEALBOT_SKINS_STD] = 1, ["HealBot Party"] = 1, ["HealBot Raid"] = 4, ["Alteric Valley"] = 2, ["Modern Flat"] = 1},
btexture = {[HEALBOT_SKINS_STD] = 8,["HealBot Party"] = 6, ["HealBot Raid"] = 7, ["Alteric Valley"] = 9, ["Modern Flat"] = 10},
bcspace = {[HEALBOT_SKINS_STD] = 4, ["HealBot Party"] = 4, ["HealBot Raid"] = 2, ["Alteric Valley"] = 2, ["Modern Flat"] = 4},
@@ -224,6 +225,7 @@ HealBot_ConfigDefaults = {
Tooltip_ShowTarget = 1,
Tooltip_Recommend = 1,
TooltipPos = 1,
HideParty = 0,
};
HealBot_Config = {};
+9 -1
View File
@@ -205,7 +205,7 @@ HEALBOT_OPTIONS_TAB_HEALING = "Heilung";
HEALBOT_OPTIONS_TAB_CDC = "Debuffs";
HEALBOT_OPTIONS_TAB_SKIN = "Skin"
HEALBOT_OPTIONS_PANEL_TEXT = "Heilungspanel Optionen:"
HEALBOT_OPTIONS_PANEL_TEXT = "Manabalken Optionen:"
HEALBOT_OPTIONS_BARALPHA = "Leisten Transparenz";
HEALBOT_OPTIONS_BARALPHAINHEAL = "Ankomm.Heilung Transparenz";
HEALBOT_OPTIONS_ACTIONLOCKED = "Fenster fixieren";
@@ -218,6 +218,7 @@ HEALBOT_OPTIONS_QUALITYRANGE = "Exakter 25 Meter Check in Instanzen";
HEALBOT_OPTIONS_INTEGRATECTRA = "Integriere CTRA";
HEALBOT_OPTIONS_TOGGLEALTUSE = "Toggle Alt-key";
HEALBOT_OPTIONS_PROTECTPVP = "Vermeidung des PvP Flags";
HEALBOT_OPTIONS_HIDEPARTY = "Standard-Gruppenfenster ausblenden";
HEALBOT_OPTIONS_HEAL_CHATOPT = "Chat Optionen";
HEALBOT_OPTIONS_SKINTEXT = "Skin"
@@ -320,6 +321,13 @@ HEALBOT_CLASSES_RANGES = "Fernkampf";
HEALBOT_CLASSES_HEALERS = "Heiler";
HEALBOT_CLASSES_CUSTOM = "pers\195\182nlich";
HEALBOT_OPTIONS_MONITORNO = "Keine";
HEALBOT_OPTIONS_MONITORALL = "Alle";
HEALBOT_OPTIONS_MONITORMELEE = "Nahkampf";
HEALBOT_OPTIONS_MONITORRANGE = "Fernkampf";
HEALBOT_OPTIONS_MONITORHEALERS = "Heiler";
HEALBOT_OPTIONS_MONITORCUSTOM = "Eigene";
HEALBOT_OPTIONS_SHOWTOOLTIP = "Zeige Tooltips";
HEALBOT_OPTIONS_SHOWDETTOOLTIP = "Zeige detaillierte Spruchinfos";
HEALBOT_OPTIONS_SHOWUNITTOOLTIP = "Zeige Zielinfos";
+9 -1
View File
@@ -230,7 +230,7 @@ HEALBOT_OPTIONS_TAB_SKIN = "Skin";
HEALBOT_OPTIONS_TAB_BUFF = "Buff";
HEALBOT_OPTIONS_TAB_CHAT = "Chat";
HEALBOT_OPTIONS_PANEL_TEXT = "Healing panel options:"
HEALBOT_OPTIONS_PANEL_TEXT = "Mana bar options:"
HEALBOT_OPTIONS_BARALPHA = "Bar opacity";
HEALBOT_OPTIONS_BARALPHAINHEAL= "Incoming heals opacity";
HEALBOT_OPTIONS_ACTIONLOCKED = "Lock position";
@@ -243,6 +243,7 @@ HEALBOT_OPTIONS_QUALITYRANGE = "Exact 27yard range check in instances";
--HEALBOT_OPTIONS_INTEGRATECTRA = "Integrate CTRA";
HEALBOT_OPTIONS_TOGGLEALTUSE = "Toggle Alt-key";
HEALBOT_OPTIONS_PROTECTPVP = "Avoid accidental PvP flagging";
HEALBOT_OPTIONS_HIDEPARTY = "Hide Default Party Frames";
HEALBOT_OPTIONS_HEAL_CHATOPT = "Chat Options";
HEALBOT_OPTIONS_SKINTEXT = "Use skin"
@@ -358,6 +359,13 @@ HEALBOT_CLASSES_RANGES = "Ranged";
HEALBOT_CLASSES_HEALERS = "Healers";
HEALBOT_CLASSES_CUSTOM = "Custom";
HEALBOT_OPTIONS_MONITORNO = "None";
HEALBOT_OPTIONS_MONITORALL = "All";
HEALBOT_OPTIONS_MONITORMELEE = "Melee";
HEALBOT_OPTIONS_MONITORRANGE = "Ranged";
HEALBOT_OPTIONS_MONITORHEALERS = "Healers";
HEALBOT_OPTIONS_MONITORCUSTOM = "Custom";
HEALBOT_OPTIONS_SHOWTOOLTIP = "Show tooltips";
HEALBOT_OPTIONS_SHOWDETTOOLTIP = "Show detailed spell information";
HEALBOT_OPTIONS_SHOWUNITTOOLTIP = "Show target information";
+9 -1
View File
@@ -188,7 +188,7 @@ HEALBOT_OPTIONS_TAB_CDC = "Cure";
HEALBOT_OPTIONS_TAB_SKIN = "Skin"
HEALBOT_OPTIONS_PANEL_TEXT = "Panneau d'option de soin:"
HEALBOT_OPTIONS_PANEL_TEXT = "Options de barre de mana:"
HEALBOT_OPTIONS_ACTIONLOCKED = "Bloquer la position";
HEALBOT_OPTIONS_GROWUPWARDS = "Monter";
HEALBOT_OPTIONS_AUTOSHOW = "Ouvrir automatiquement";
@@ -200,6 +200,7 @@ HEALBOT_OPTIONS_QUALITYRANGE = "Exact 27yard range check in instances";
HEALBOT_OPTIONS_INTEGRATECTRA = "Intregrer CTRA";
HEALBOT_OPTIONS_TOGGLEALTUSE = "Toggle Alt-key";
HEALBOT_OPTIONS_PROTECTPVP = "Avoid accidental PvP flagging";
HEALBOT_OPTIONS_HIDEPARTY = "Masquer les cadres de groupe par défaut";
HEALBOT_OPTIONS_ITEMS = "Objets";
@@ -259,6 +260,13 @@ HEALBOT_CLASSES_RANGES = "Distances";
HEALBOT_CLASSES_HEALERS = "Soigneurs";
HEALBOT_CLASSES_CUSTOM = "Divers";
HEALBOT_OPTIONS_MONITORNO = "Aucun";
HEALBOT_OPTIONS_MONITORALL = "Tous";
HEALBOT_OPTIONS_MONITORMELEE = "M\195\169l\195\169e";
HEALBOT_OPTIONS_MONITORRANGE = "\195\128 distance";
HEALBOT_OPTIONS_MONITORHEALERS = "Soigneurs";
HEALBOT_OPTIONS_MONITORCUSTOM = "Personnalis\195\169";
HEALBOT_OPTIONS_BARALPHAINHEAL= "Incoming heal opacity"; -- *************** needs French translation ***************
HEALBOT_OPTIONS_CDCBUTTONS = "Curing buttons"; -- *************** needs French translation ***************
+9 -1
View File
@@ -184,7 +184,7 @@ HEALBOT_GREATER_BLESSING_OF_SALVATION = "상급 구원의 축복";
HEALBOT_OPTIONS_TAB_CDC = "치료";
HEALBOT_OPTIONS_TAB_SKIN = "스킨"
HEALBOT_OPTIONS_PANEL_TEXT = "치유 패널 옵션:"
HEALBOT_OPTIONS_PANEL_TEXT = "마나 바 옵션:"
HEALBOT_OPTIONS_BARALPHA = "바 불투명도";
HEALBOT_OPTIONS_BARALPHAINHEAL = "들어오는 치유 불투명도";
HEALBOT_OPTIONS_ACTIONLOCKED = "위치 고정";
@@ -197,6 +197,7 @@ HEALBOT_GREATER_BLESSING_OF_SALVATION = "상급 구원의 축복";
--HEALBOT_OPTIONS_INTEGRATECTRA = "CTRA 연동";
HEALBOT_OPTIONS_TOGGLEALTUSE = "Alt-key 토글";
HEALBOT_OPTIONS_PROTECTPVP = "우발적 PvP 상태 피함";
HEALBOT_OPTIONS_HIDEPARTY = "기본 파티 프레임 숨김";
HEALBOT_OPTIONS_HEAL_CHATOPT = "대화창 옵션";
HEALBOT_OPTIONS_SKINTEXT = "스킨 사용"
@@ -302,6 +303,13 @@ HEALBOT_GREATER_BLESSING_OF_SALVATION = "상급 구원의 축복";
HEALBOT_CLASSES_HEALERS = "힐러들";
HEALBOT_CLASSES_CUSTOM = "사용자";
HEALBOT_OPTIONS_MONITORNO = "없음";
HEALBOT_OPTIONS_MONITORALL = "모두";
HEALBOT_OPTIONS_MONITORMELEE = "근접";
HEALBOT_OPTIONS_MONITORRANGE = "원거리";
HEALBOT_OPTIONS_MONITORHEALERS = "힐러";
HEALBOT_OPTIONS_MONITORCUSTOM = "사용자 정의";
HEALBOT_OPTIONS_SHOWTOOLTIP = "툴팁 표시";
HEALBOT_OPTIONS_SHOWDETTOOLTIP = "주문 정보 표시";
HEALBOT_OPTIONS_SHOWUNITTOOLTIP = "대상 정보 표시";
+6
View File
@@ -2,6 +2,7 @@
-- Split from original HealBot_Options.lua
HealBot_Options_ComboButtons_Button=1;
HealBot_Options_CurrentPanel = 0;
HealBot_ColourObjWaiting = nil
@@ -244,6 +245,8 @@ function HealBot_Options_OnShow(this)
HealBot_Options_AlertLevel:SetValue(HealBot_Config.AlertLevel);
HealBot_Options_AutoShow:SetChecked(HealBot_Config.AutoClose);
HealBot_Options_PanelSounds:SetChecked(HealBot_Config.PanelSounds);
HealBot_Options_ShowManaBars:SetChecked(HealBot_Config.ShowManaBars);
HealBot_Options_ManaBarsHealersOnly:SetChecked(HealBot_Config.ManaBarsHealersOnly);
if HealBot_Config.ActionMouseover == nil then HealBot_Config.ActionMouseover = 1; end
HealBot_Options_ActionMouseover:SetChecked(HealBot_Config.ActionMouseover);
@@ -269,6 +272,8 @@ function HealBot_Options_OnShow(this)
HealBot_Options_ShowTooltipSpellDetail:SetChecked(HealBot_Config.Tooltip_ShowSpellDetail);
HealBot_Options_ShowTooltipInstant:SetChecked(HealBot_Config.Tooltip_Recommend);
HealBot_Options_HideAbort:SetChecked(HealBot_Config.HideAbort);
HealBot_Options_HideParty:SetChecked(HealBot_Config.HideParty);
HealBot_Options_HideSolo:SetChecked(HealBot_Config.HideSolo);
HealBot_WarningSound_OnClick(nil,HealBot_Config.SoundDebuffPlay)
if HealBot_Config.SoundDebuffWarning>0 then
HealBot_WarningSound1:Enable();
@@ -293,6 +298,7 @@ function HealBot_Options_OnShow(this)
HealBot_Options_ExtraSort_Refresh();
HealBot_Options_TooltipPos_Refresh();
HealBot_Options_SetChatMessages();
HealBot_Options_ShowPanel(this.selectedTab or 1);
end
function HealBot_Options_SetSkins()
HealBot_Options_Skins_Refresh()
+4
View File
@@ -9,10 +9,12 @@ function HealBot_Options_BuffWatch_OnClick(self)
else
HealBot_Options_BuffWatchInCombat:Enable()
end
HealBot_RecalcParty();
end
function HealBot_Options_BuffWatchInCombat_OnClick(self)
local frame = self or this
HealBot_Config.BuffWatchInCombat = frame:GetChecked() or 0;
HealBot_RecalcParty();
end
function HealBot_Options_BuffSelf_OnLoad(self)
local frame = self or this
@@ -35,6 +37,7 @@ function HealBot_Options_BuffSelf_OnClick(self)
else
HealBot_Config.BuffWatchSelf[id] = 0
end
HealBot_RecalcParty();
end
function HealBot_Options_Buff_OnLoad(self)
local frame = self or this
@@ -76,6 +79,7 @@ function HealBot_Options_Buff_OnClick()
UIDropDownMenu_SetSelectedID(frame, this.value + 1)
UIDropDownMenu_SetText(text, frame)
HealBot_RecalcParty();
end
function HealBot_Options_SetBuffs()
local myClass = UnitClass("player")
+23 -23
View File
@@ -53,9 +53,9 @@ function HealBot_Options_CDCMonitor_Refresh(onselect)
if not onselect then HealBot_Options_CDCMonitor_Initialize() end -- or wrong menu may be used !
UIDropDownMenu_SetSelectedID(HealBot_Options_CDCMonitor,HealBot_Config.CDCMonitor)
end
function HealBot_Options_CDCMonitor_OnLoad(this)
HealBot_Options_CDCMonitor_Initialize()
UIDropDownMenu_SetWidth(100)
function HealBot_Options_CDCMonitor_OnLoad()
UIDropDownMenu_Initialize(this, HealBot_Options_CDCMonitor_DropDown)
UIDropDownMenu_SetWidth(100, this)
end
function HealBot_Options_CDCMonitor_OnSelect()
HealBot_Config.CDCMonitor = this:GetID()
@@ -73,7 +73,7 @@ function HealBot_Options_CDCMonitor_Reset()
HealBot_CDCInc[HEALBOT_SHAMAN] = 0;
HealBot_CDCInc[HEALBOT_WARLOCK] = 0;
HealBot_CDCInc[HEALBOT_WARRIOR] = 0;
if HealBot_Config.CDCMonitor==1 then
if HealBot_Config.CDCMonitor==2 then
HealBot_CDCInc[HEALBOT_DRUID] = 1;
HealBot_CDCInc[HEALBOT_HUNTER] = 1;
HealBot_CDCInc[HEALBOT_MAGE] = 1;
@@ -83,25 +83,25 @@ function HealBot_Options_CDCMonitor_Reset()
HealBot_CDCInc[HEALBOT_SHAMAN] = 1;
HealBot_CDCInc[HEALBOT_WARLOCK] = 1;
HealBot_CDCInc[HEALBOT_WARRIOR] = 1;
elseif HealBot_Config.CDCMonitor==2 then
HealBot_CDCInc[HEALBOT_DRUID] = 1;
elseif HealBot_Config.CDCMonitor==3 then
HealBot_CDCInc[HEALBOT_HUNTER] = 1;
HealBot_CDCInc[HEALBOT_DRUID] = 1;
elseif HealBot_Config.CDCMonitor==4 then
HealBot_CDCInc[HEALBOT_MAGE] = 1;
HealBot_CDCInc[HEALBOT_HUNTER] = 1;
elseif HealBot_Config.CDCMonitor==5 then
HealBot_CDCInc[HEALBOT_PALADIN] = 1;
HealBot_CDCInc[HEALBOT_MAGE] = 1;
elseif HealBot_Config.CDCMonitor==6 then
HealBot_CDCInc[HEALBOT_PRIEST] = 1;
HealBot_CDCInc[HEALBOT_PALADIN] = 1;
elseif HealBot_Config.CDCMonitor==7 then
HealBot_CDCInc[HEALBOT_ROGUE] = 1;
HealBot_CDCInc[HEALBOT_PRIEST] = 1;
elseif HealBot_Config.CDCMonitor==8 then
HealBot_CDCInc[HEALBOT_SHAMAN] = 1;
HealBot_CDCInc[HEALBOT_ROGUE] = 1;
elseif HealBot_Config.CDCMonitor==9 then
HealBot_CDCInc[HEALBOT_WARLOCK] = 1;
HealBot_CDCInc[HEALBOT_SHAMAN] = 1;
elseif HealBot_Config.CDCMonitor==10 then
HealBot_CDCInc[HEALBOT_WARRIOR] = 1;
HealBot_CDCInc[HEALBOT_WARLOCK] = 1;
elseif HealBot_Config.CDCMonitor==11 then
HealBot_CDCInc[HEALBOT_WARRIOR] = 1;
elseif HealBot_Config.CDCMonitor==12 then
HealBot_CDCInc[HEALBOT_DRUID] = HealBot_Config.EmergIncMelee[HEALBOT_DRUID];
HealBot_CDCInc[HEALBOT_HUNTER] = HealBot_Config.EmergIncMelee[HEALBOT_HUNTER];
HealBot_CDCInc[HEALBOT_MAGE] = HealBot_Config.EmergIncMelee[HEALBOT_MAGE];
@@ -111,7 +111,7 @@ function HealBot_Options_CDCMonitor_Reset()
HealBot_CDCInc[HEALBOT_SHAMAN] = HealBot_Config.EmergIncMelee[HEALBOT_SHAMAN];
HealBot_CDCInc[HEALBOT_WARLOCK] = HealBot_Config.EmergIncMelee[HEALBOT_WARLOCK];
HealBot_CDCInc[HEALBOT_WARRIOR] = HealBot_Config.EmergIncMelee[HEALBOT_WARRIOR];
elseif HealBot_Config.CDCMonitor==12 then
elseif HealBot_Config.CDCMonitor==13 then
HealBot_CDCInc[HEALBOT_DRUID] = HealBot_Config.EmergIncRange[HEALBOT_DRUID];
HealBot_CDCInc[HEALBOT_HUNTER] = HealBot_Config.EmergIncRange[HEALBOT_HUNTER];
HealBot_CDCInc[HEALBOT_MAGE] = HealBot_Config.EmergIncRange[HEALBOT_MAGE];
@@ -121,7 +121,7 @@ function HealBot_Options_CDCMonitor_Reset()
HealBot_CDCInc[HEALBOT_SHAMAN] = HealBot_Config.EmergIncRange[HEALBOT_SHAMAN];
HealBot_CDCInc[HEALBOT_WARLOCK] = HealBot_Config.EmergIncRange[HEALBOT_WARLOCK];
HealBot_CDCInc[HEALBOT_WARRIOR] = HealBot_Config.EmergIncRange[HEALBOT_WARRIOR];
elseif HealBot_Config.CDCMonitor==13 then
elseif HealBot_Config.CDCMonitor==14 then
HealBot_CDCInc[HEALBOT_DRUID] = HealBot_Config.EmergIncHealers[HEALBOT_DRUID];
HealBot_CDCInc[HEALBOT_HUNTER] = HealBot_Config.EmergIncHealers[HEALBOT_HUNTER];
HealBot_CDCInc[HEALBOT_MAGE] = HealBot_Config.EmergIncHealers[HEALBOT_MAGE];
@@ -131,7 +131,7 @@ function HealBot_Options_CDCMonitor_Reset()
HealBot_CDCInc[HEALBOT_SHAMAN] = HealBot_Config.EmergIncHealers[HEALBOT_SHAMAN];
HealBot_CDCInc[HEALBOT_WARLOCK] = HealBot_Config.EmergIncHealers[HEALBOT_WARLOCK];
HealBot_CDCInc[HEALBOT_WARRIOR] = HealBot_Config.EmergIncHealers[HEALBOT_WARRIOR];
elseif HealBot_Config.CDCMonitor==14 then
elseif HealBot_Config.CDCMonitor==15 then
HealBot_CDCInc[HEALBOT_DRUID] = HealBot_Config.EmergIncCustom[HEALBOT_DRUID];
HealBot_CDCInc[HEALBOT_HUNTER] = HealBot_Config.EmergIncCustom[HEALBOT_HUNTER];
HealBot_CDCInc[HEALBOT_MAGE] = HealBot_Config.EmergIncCustom[HEALBOT_MAGE];
@@ -209,13 +209,13 @@ function HealBot_Options_CDCButRight_Refresh(onselect)
set_id = HealBot_Config.Debuff_Right[class];
UIDropDownMenu_SetSelectedID(HealBot_Options_CDCButRight,set_id)
end
function HealBot_Options_CDCButLeft_OnLoad(this)
HealBot_Options_CDCButLeft_Initialize()
UIDropDownMenu_SetWidth(140)
function HealBot_Options_CDCButLeft_OnLoad()
UIDropDownMenu_Initialize(this, HealBot_Options_CDCButLeft_DropDown)
UIDropDownMenu_SetWidth(140, this)
end
function HealBot_Options_CDCButRight_OnLoad(this)
HealBot_Options_CDCButRight_Initialize()
UIDropDownMenu_SetWidth(140)
function HealBot_Options_CDCButRight_OnLoad()
UIDropDownMenu_Initialize(this, HealBot_Options_CDCButRight_DropDown)
UIDropDownMenu_SetWidth(140, this)
end
function HealBot_Options_CDCButLeft_OnSelect()
local class=UnitClass("Player");
+17
View File
@@ -272,3 +272,20 @@ function HealBot_Options_BorderThicknessS_OnValueChanged(this)
getglobal(this:GetName().."Text"):SetText(this.text .. ": " .. this:GetValue());
HealBot_Action_ResetSkin()
end
function HealBot_Options_HideParty_OnLoad(this, text)
getglobal(this:GetName().."Text"):SetText(text);
end
function HealBot_Options_HideParty_OnClick(this)
HealBot_Config.HideParty = this:GetChecked() or 0;
HealBot_Options_TogglePartyFrames();
end
function HealBot_Options_TogglePartyFrames()
if HealBot_Config.HideParty == 1 then
if HidePartyFrame then HidePartyFrame(); end
else
if ShowPartyFrame then ShowPartyFrame(); end
end
end
+115 -88
View File
@@ -6,51 +6,11 @@
<Frames>
<Frame name="HealBot_Options_GenFrame" inherits="OptionFrameBoxTemplate">
<Scripts>
<OnLoad>
this:SetBackdropBorderColor(0.4, 0.4, 0.4);
this:SetBackdropColor(0, 0, 0, 0);
</OnLoad>
</Scripts>
<Size>
<AbsDimension y="115"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="21" y="-35"/>
</Offset>
</Anchor>
<Anchor point="TOPRIGHT">
<Offset>
<AbsDimension x="-21" y="0"/>
</Offset>
</Anchor>
</Anchors>
<Layers>
<Layer level="BACKGROUND">
<FontString name="HealBot_GeneralPanel_Text" text="HEALBOT_OPTIONS_PANEL_TEXT" inherits="GameFontNormalSmall">
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="75" y="-12" />
</Offset>
</Anchor>
</Anchors>
</FontString>
</Layer>
</Layers>
<Frames>
<CheckButton name="HealBot_Options_ActionLocked" inherits="OptionsCheckButtonTemplate">
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="10" y="-25" />
<AbsDimension x="31" y="-40" />
</Offset>
</Anchor>
</Anchors>
@@ -72,7 +32,7 @@
<OnClick>HealBot_Options_GrowUpwards_OnClick(this)</OnClick>
</Scripts>
</CheckButton>
<CheckButton name="HealBot_Options_ShowManaBars" inherits="OptionsCheckButtonTemplate">
<CheckButton name="HealBot_Options_ActionMouseover" inherits="OptionsCheckButtonTemplate">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_GrowUpwards" relativePoint="BOTTOMLEFT">
<Offset>
@@ -81,48 +41,15 @@
</Anchor>
</Anchors>
<Scripts>
<OnLoad>
getglobal(this:GetName().."Text"):SetText("Show Mana Bars");
this:SetChecked(HealBot_Config.ShowManaBars);
</OnLoad>
<OnClick>
if (this:GetChecked()) then
HealBot_Config.ShowManaBars = 1;
else
HealBot_Config.ShowManaBars = 0;
end
HealBot_Action_Refresh();
</OnClick>
</Scripts>
</CheckButton>
<CheckButton name="HealBot_Options_ManaBarsHealersOnly" inherits="OptionsCheckButtonTemplate">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_ShowManaBars" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="20" y="-2" />
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>
getglobal(this:GetName().."Text"):SetText("For Healers Only");
this:SetChecked(HealBot_Config.ManaBarsHealersOnly);
</OnLoad>
<OnClick>
if (this:GetChecked()) then
HealBot_Config.ManaBarsHealersOnly = 1;
else
HealBot_Config.ManaBarsHealersOnly = 0;
end
HealBot_Action_Refresh();
</OnClick>
<OnLoad>HealBot_Options_ActionMouseover_OnLoad(this,"Hovercasting")</OnLoad>
<OnClick>HealBot_Options_ActionMouseover_OnClick(this)</OnClick>
</Scripts>
</CheckButton>
<CheckButton name="HealBot_Options_AutoShow" inherits="OptionsCheckButtonTemplate">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_ActionLocked" relativePoint="TOPLEFT">
<Offset>
<AbsDimension x="125" y="0" />
<AbsDimension x="200" y="0" />
</Offset>
</Anchor>
</Anchors>
@@ -135,7 +62,7 @@
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_GrowUpwards" relativePoint="TOPLEFT">
<Offset>
<AbsDimension x="125" y="0" />
<AbsDimension x="200" y="0" />
</Offset>
</Anchor>
</Anchors>
@@ -144,35 +71,122 @@
<OnClick>HealBot_Options_PanelSounds_OnClick(this)</OnClick>
</Scripts>
</CheckButton>
<CheckButton name="HealBot_Options_ActionMouseover" inherits="OptionsCheckButtonTemplate">
<CheckButton name="HealBot_Options_HideSolo" inherits="OptionsCheckButtonTemplate">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_PanelSounds" relativePoint="BOTTOMLEFT">
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_ActionMouseover" relativePoint="TOPLEFT">
<Offset>
<AbsDimension x="0" y="5" />
<AbsDimension x="200" y="0" />
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_ActionMouseover_OnLoad(this,"Enable Action Bar Mouseover")</OnLoad>
<OnClick>HealBot_Options_ActionMouseover_OnClick(this)</OnClick>
<OnLoad>
getglobal(this:GetName().."Text"):SetText("Hide when Solo");
</OnLoad>
<OnClick>
if (this:GetChecked()) then
HealBot_Config.HideSolo = 1;
else
HealBot_Config.HideSolo = 0;
end
HealBot_Action_ShowFrame();
</OnClick>
</Scripts>
</CheckButton>
<Frame name="HealBot_Options_GenFrame" inherits="OptionFrameBoxTemplate">
<Scripts>
<OnLoad>
this:SetBackdropBorderColor(0.4, 0.4, 0.4);
this:SetBackdropColor(0, 0, 0, 0);
</OnLoad>
</Scripts>
<Size>
<AbsDimension y="70"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="21" y="-135"/>
</Offset>
</Anchor>
<Anchor point="TOPRIGHT">
<Offset>
<AbsDimension x="-21" y="-135"/>
</Offset>
</Anchor>
</Anchors>
<Layers>
<Layer level="BACKGROUND">
<FontString name="HealBot_GeneralPanel_Text" text="HEALBOT_OPTIONS_PANEL_TEXT" inherits="GameFontNormalSmall">
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="130" y="-12" />
</Offset>
</Anchor>
</Anchors>
</FontString>
</Layer>
</Layers>
<Frames>
<CheckButton name="HealBot_Options_ShowManaBars" inherits="OptionsCheckButtonTemplate">
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="10" y="-30" />
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>
getglobal(this:GetName().."Text"):SetText("Show Mana Bars");
</OnLoad>
<OnClick>
if (this:GetChecked()) then
HealBot_Config.ShowManaBars = 1;
else
HealBot_Config.ShowManaBars = 0;
end
HealBot_Action_Refresh();
</OnClick>
</Scripts>
</CheckButton>
<CheckButton name="HealBot_Options_ManaBarsHealersOnly" inherits="OptionsCheckButtonTemplate">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_ShowManaBars" relativePoint="TOPLEFT">
<Offset>
<AbsDimension x="200" y="0" />
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>
getglobal(this:GetName().."Text"):SetText("For Healers Only");
</OnLoad>
<OnClick>
if (this:GetChecked()) then
HealBot_Config.ManaBarsHealersOnly = 1;
else
HealBot_Config.ManaBarsHealersOnly = 0;
end
HealBot_Action_Refresh();
</OnClick>
</Scripts>
</CheckButton>
</Frames>
</Frame>
<CheckButton name="HealBot_Options_HideOptions" inherits="OptionsCheckButtonTemplate">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_ManaBarsHealersOnly" relativePoint="BOTTOMLEFT">
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_GenFrame" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="-20" y="-2" />
<AbsDimension x="10" y="-10" />
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_HideOptions_OnLoad(this,HEALBOT_OPTIONS_HIDEOPTIONS)</OnLoad>
<OnClick>HealBot_Options_HideOptions_OnClick(this)</OnClick>
</Scripts>
</CheckButton>
@@ -215,6 +229,19 @@
<OnClick>HealBot_Options_ProtectPvP_OnClick(this)</OnClick>
</Scripts>
</CheckButton>
<CheckButton name="HealBot_Options_HideParty" inherits="OptionsCheckButtonTemplate">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_ProtectPvP" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="0" y="-2" />
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_HideParty_OnLoad(this,HEALBOT_OPTIONS_HIDEPARTY)</OnLoad>
<OnClick>HealBot_Options_HideParty_OnClick(this)</OnClick>
</Scripts>
</CheckButton>
+9 -9
View File
@@ -111,9 +111,9 @@ function HealBot_Options_EmergencyFClass_Refresh(onselect)
UIDropDownMenu_SetSelectedID(HealBot_Options_EmergencyFClass,HealBot_Config.EmergencyFClass)
end
function HealBot_Options_EmergencyFClass_OnLoad(this)
HealBot_Options_EmergencyFClass_Initialize()
UIDropDownMenu_SetWidth(100)
function HealBot_Options_EmergencyFClass_OnLoad()
UIDropDownMenu_Initialize(this, HealBot_Options_EmergencyFClass_DropDown)
UIDropDownMenu_SetWidth(100, this)
end
function HealBot_Options_EmergencyFClass_OnSelect()
@@ -194,9 +194,9 @@ function HealBot_Options_ExtraSort_Refresh(onselect)
UIDropDownMenu_SetSelectedID(HealBot_Options_ExtraSort,HealBot_Config.ExtraOrder)
end
function HealBot_Options_ExtraSort_OnLoad(this)
HealBot_Options_ExtraSort_Initialize()
UIDropDownMenu_SetWidth(100)
function HealBot_Options_ExtraSort_OnLoad()
UIDropDownMenu_Initialize(this, HealBot_Options_ExtraSort_DropDown)
UIDropDownMenu_SetWidth(100, this)
end
function HealBot_Options_ExtraSort_OnSelect()
@@ -229,9 +229,9 @@ function HealBot_Options_EmergencyFilter_Refresh(onselect)
end
function HealBot_Options_EmergencyFilter_OnLoad(this)
HealBot_Options_EmergencyFilter_Initialize()
UIDropDownMenu_SetWidth(100)
function HealBot_Options_EmergencyFilter_OnLoad()
UIDropDownMenu_Initialize(this, HealBot_Options_EmergencyFilter_DropDown)
UIDropDownMenu_SetWidth(100, this)
end
+3 -3
View File
@@ -114,9 +114,9 @@ function HealBot_Options_Skins_Refresh(onselect)
if not onselect then HealBot_Options_Skins_Initialize() end -- or wrong menu may be used !
UIDropDownMenu_SetSelectedID(HealBot_Options_Skins,HealBot_Config.Skin_ID)
end
function HealBot_Options_Skins_OnLoad(this)
HealBot_Options_Skins_Initialize()
UIDropDownMenu_SetWidth(100)
function HealBot_Options_Skins_OnLoad()
UIDropDownMenu_Initialize(this, HealBot_Options_Skins_DropDown)
UIDropDownMenu_SetWidth(100, this)
end
function HealBot_Options_Skins_OnSelect()
HealBot_Config.Skin_ID = this:GetID()
+4 -4
View File
@@ -65,9 +65,9 @@ function HealBot_Options_TooltipPos_Refresh(onselect)
UIDropDownMenu_SetSelectedID(HealBot_Options_TooltipPos,HealBot_Config.TooltipPos)
end
function HealBot_Options_TooltipPos_OnLoad(this)
HealBot_Options_TooltipPos_Initialize()
UIDropDownMenu_SetWidth(128)
function HealBot_Options_TooltipPos_OnLoad()
UIDropDownMenu_Initialize(this, HealBot_Options_TooltipPos_DropDown)
UIDropDownMenu_SetWidth(128, this)
end
function HealBot_Options_TooltipPos_OnSelect()
@@ -189,7 +189,7 @@ end
HealBot_Options_CurrentPanel = 0;
+22 -2
View File
@@ -737,8 +737,24 @@ function HealBot_Action_PartyChanged()
end
HealBot_Action_SetHeightWidth(OffsetX, MaxOffsetY + bpadding, bwidth);
if HealBot_Config.HideParty == 1 and HidePartyFrame then
HidePartyFrame();
end
end
HealBot_Action_RefreshButtons();
HealBot_Action_ShowFrame();
end
function HealBot_Action_ShowFrame()
if HealBot_Config.ActionVisible == 1 then
if HealBot_Config.HideSolo == 1 and GetNumPartyMembers() == 0 and GetNumRaidMembers() == 0 then
HealBot_Action.ProgrammaticHide = true;
HealBot_Action:Hide();
HealBot_Action.ProgrammaticHide = nil;
else
HealBot_Action:Show();
end
end
end
function HealBot_Action_Reset()
@@ -751,7 +767,9 @@ end
function HealBot_Action_Refresh(unit)
if (UnitIsDeadOrGhost("player")) or (UnitOnTaxi("player")) then
if HealBot_Config.AutoClose == 1 and HealBot_Config.ActionVisible ~= 0 then
HealBot_Action.ProgrammaticHide = true;
HealBot_Action:Hide();
HealBot_Action.ProgrammaticHide = nil;
else
HealBot_Action_RefreshButtons(unit);
end
@@ -760,12 +778,14 @@ function HealBot_Action_Refresh(unit)
HealBot_Action_RefreshButtons(unit);
if not HealBot_IsFighting then
if (HealBot_Action_MustHealSome()) then
HealBot_Action:Show();
HealBot_Action_ShowFrame();
elseif HealBot_AbortButton == 0 then
HealBot_Action:Show();
HealBot_Action_ShowFrame();
elseif (not HealBot_Action_ShouldHealSome()) then
if HealBot_AbortButton == 1 and HealBot_Config.AutoClose == 1 and HealBot_Config.ActionVisible ~= 0 then
HealBot_Action.ProgrammaticHide = true;
HealBot_Action:Hide();
HealBot_Action.ProgrammaticHide = nil;
end
end
end
+19 -4
View File
@@ -18,22 +18,37 @@ Default installation path: `C:\Program Files\World of Warcraft\Interface\AddOns\
* `/hb options` - Toggles the HealBot options panel on and off
* `/hb reset` - Resets the contents of the main HealBot panel
### Option Changes from the original HealBot Continues
### Key Features & Current Functionality
* **MVC & Observer Architecture:** High-performance, reactive engine that updates frames dynamically on state changes, drastically reducing CPU and memory overhead compared to traditional polling.
* **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).
* **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).
* **Mana Bars for Healers:** Enable and position mini-mana status bars next to unit frames, toggleable to display for healer classes only or all classes.
* **Equipment Bonus Integration:** Automatically scans equipped gear (for classes capable of healing) to dynamically scale healing predictions.
* **Curse & Debuff Warning (CDC):** Dynamic visual and audio alerts for cleanable debuffs. Customizable colors based on debuff type (Curse, Poison, Disease, Magic).
* **Highly Customizable Skins:** Fully configure dimensions (width, height), row spacing, column layouts, custom textures, opacity, class-colored frames, and outline of fonts.
### Change Log
**v1.3**
* **General Options Layout & Renaming:** Relabeled "Healing panel options" to "Mana bar options:", moved the "For Healers Only" checkbox side-by-side with "Show Mana Bars", and renamed "Enable mouse over action bar" to "Hovercasting".
* **OnShow Empty Panel Bug Fix:** Solved the rendering issue where the options panel would load empty initially until another tab was clicked.
* **Backdrop Alpha Reset Bug Fix:** Resolved a WoW API client quirk where showing the HealBot frame would reset the background color and alpha channel back to default white/transparent by calling `SetBackdropColor` after `SetBackdrop`.
* **Default Party Frame Toggle:** Added a "Hide Default Party Frames" toggle option (fully localized in English, German, French, and Korean) to hide Blizzard's default party frames. Integrated immediate toggling on joining/leaving groups.
* **Safety Guards & Crash Prevention:** Added safety guards to `HidePartyFrame` and `ShowPartyFrame` calls to prevent nil-value crashes when solo.
* **Checkbox State Initialization Fixes:** Fixed options menu bugs where "Hide when Solo", "Show Mana Bars", and "For Healers Only" checkboxes failed to reflect their saved configuration value when opening the menu.
* **CurrentPanel Nil Comparison Fix:** Fixed a startup Lua comparison crash by initializing `HealBot_Options_CurrentPanel` at the top of the main options file.
* **Monolithic Code Modularization (Options):** Split the massive, single-file options system (`HealBot_Options.xml`/`HealBot_Options.lua`) into 7 dedicated, content-named panel subfiles (`General`, `Spells`, `Healing`, `CDC`, `Skins`, `Buffs`, and `Chat`) to improve codebase modularity and stability.
* **Core Code Decoupling (MVC & Observer Pattern):** Modularized `HealBot.lua` and `HealBot_Action.lua` by decoupling them into dedicated service files: `Range`, `Comms`, `Aura`, `Spells`, `Events` controllers, and `Layout`, `Tooltip` views.
* **Scope Resolution Fix:** Promoted `HealBot_Options_ComboButtons_Button` to global scope in the base options file to resolve a `nil` comparison error when loading spell settings.
* **Global Scoping & Variable Promotion:** Promoted `CalcEquipBonus`, `HealBot_EquipChangeTimer`, `HealValue`, `InitSpells`, and `Delay_RecalcParty` to global scope in `HealBot.lua` to ensure cross-module visibility.
* **CTRA Resurrection Cancel Bug Fix:** Fixed a nil table indexing crash in the CTRA `RESNO` message handler in `HealBot_Controller_Comms.lua`.
* **Lua 5.1 Compatibility Update:** Forwarded observer parameters directly via vararg forwarding (`...`) in `HealBot_Model.lua` to avoid runtime errors with the deprecated `arg` table.
* **Core Options Layout Correction:** Relocated the "Defaults" and "Close" buttons back into the parent options frame's container, ensuring they display consistently at the bottom of all configuration tabs.
* **Skins Grid Alignment:** Fixed layout overlaps on the Skins panel by setting explicit width/height sizes (`123 x 17`) on the opacity sliders and reorganizing all 13 sliders into a clean, uniform 2-column grid.
* **UI Layout & Skins Alignment:** Reorganized all 13 opacity sliders on the Skins panel into a clean, uniform 2-column grid with explicit width/height sizes (`123 x 17`) to resolve layout overlaps. Realigned Chat tab buttons to stay within window bounds and corrected Color Picker anchors.
* **Startup Refresh Optimization:** Resolved initial loading lag where action bars would be missing by forcing an immediate UI refresh (`HealBot_RecalcSpells()`) once spell data loads.
* **UI Layout Fixes:** Fixed slider width constraints in the Skin menu causing layout overlaps. Realigned Chat tab buttons to ensure they do not exceed the window bounds. Fixed Color Picker anchors.
* **Menu Cleanup:** Fixed Options panel checkboxes overlapping due to incorrect vertical spacing offsets.
* **Target Restoration Fix:** Fixed spell interruptions and "You don't have a target" errors when healing by implementing a 0.1-second delayed target restoration using `TargetLastEnemy` and `TargetLastTarget`.
* **Buff Watch Initialization & Options Fix:** Fixed a bug where buff watch failed to display missing buffs on login/UI reload when the player had no active buffs. Enabled immediate buff/aura rescanning when modifying options in the Buff watch configuration tab.
**v1.2.2**
* **White background fix** Fixed issue where white background would persist while alpha channel got changes.