From e567c0f3949261c0544bff8f380c79a3b664c216 Mon Sep 17 00:00:00 2001 From: Bluewhale1337 <295648290+Bluewhale1337@users.noreply.github.com> Date: Tue, 30 Jun 2026 18:18:01 +0200 Subject: [PATCH] Minor bugfixes to target restoration, layout, Buff tracking --- HealBot_Action.lua | 48 ++++++-- HealBot_Controller_Events.lua | 42 ++++++- HealBot_Controller_Spells.lua | 42 ++++--- HealBot_Data.lua | 4 +- HealBot_Localization.de.lua | 10 +- HealBot_Localization.en.lua | 62 ++++++----- HealBot_Localization.fr.lua | 10 +- HealBot_Localization.kr.lua | 10 +- HealBot_Options.lua | 6 + HealBot_Options_Buffs.lua | 4 + HealBot_Options_CDC.lua | 46 ++++---- HealBot_Options_General.lua | 17 +++ HealBot_Options_General.xml | 203 +++++++++++++++++++--------------- HealBot_Options_Healing.lua | 18 +-- HealBot_Options_Skins.lua | 6 +- HealBot_Options_Spells.lua | 8 +- HealBot_View_Layout.lua | 24 +++- README.md | 23 +++- 18 files changed, 389 insertions(+), 194 deletions(-) diff --git a/HealBot_Action.lua b/HealBot_Action.lua index 94b8297..052a0c6 100644 --- a/HealBot_Action.lua +++ b/HealBot_Action.lua @@ -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 @@ -262,5 +292,5 @@ end - - + + diff --git a/HealBot_Controller_Events.lua b/HealBot_Controller_Events.lua index bbe67f1..f6078c3 100644 --- a/HealBot_Controller_Events.lua +++ b/HealBot_Controller_Events.lua @@ -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 @@ -209,11 +225,27 @@ function HealBot_OnEvent_VariablesLoaded(this) end 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 diff --git a/HealBot_Controller_Spells.lua b/HealBot_Controller_Spells.lua index 08116dc..c1225bd 100644 --- a/HealBot_Controller_Spells.lua +++ b/HealBot_Controller_Spells.lua @@ -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 diff --git a/HealBot_Data.lua b/HealBot_Data.lua index d6696d8..262bba0 100644 --- a/HealBot_Data.lua +++ b/HealBot_Data.lua @@ -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 = {}; diff --git a/HealBot_Localization.de.lua b/HealBot_Localization.de.lua index edbbfb6..e02cdf0 100644 --- a/HealBot_Localization.de.lua +++ b/HealBot_Localization.de.lua @@ -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"; diff --git a/HealBot_Localization.en.lua b/HealBot_Localization.en.lua index 59c2f57..c38609f 100644 --- a/HealBot_Localization.en.lua +++ b/HealBot_Localization.en.lua @@ -67,10 +67,10 @@ HEALBOT_REJUVENATION = "Rejuvenation"; HEALBOT_PRAYER_OF_HEALING = "Prayer of Healing"; HEALBOT_CHAIN_HEAL = "Chain Heal"; -HEALBOT_ROCKBITER_WEAPON = "Rockbiter Weapon"; -HEALBOT_FLAMETONGUE_WEAPON = "Flametongue Weapon"; -HEALBOT_FROSTBRAND_WEAPON = "Frostbrand Weapon"; -HEALBOT_WINDFURY_WEAPON = "Windfury Weapon"; +HEALBOT_ROCKBITER_WEAPON = "Rockbiter Weapon"; +HEALBOT_FLAMETONGUE_WEAPON = "Flametongue Weapon"; +HEALBOT_FROSTBRAND_WEAPON = "Frostbrand Weapon"; +HEALBOT_WINDFURY_WEAPON = "Windfury Weapon"; HEALBOT_POWER_WORD_FORTITUDE = "Power Word: Fortitude"; HEALBOT_MARK_OF_THE_WILD = "Mark of the Wild"; HEALBOT_GIFT_OF_THE_WILD = "Gift of the Wild"; @@ -110,27 +110,27 @@ HEALBOT_DISPEL_MAGIC = "Dispel Magic"; HEALBOT_DISEASE = "Disease"; HEALBOT_MAGIC = "Magic"; HEALBOT_CURSE = "Curse"; -HEALBOT_POISON = "Poison"; -HEALBOT_DISEASE_en = "Disease"; -- Do NOT localize this value. -HEALBOT_MAGIC_en = "Magic"; -- Do NOT localize this value. -HEALBOT_CURSE_en = "Curse"; -- Do NOT localize this value. -HEALBOT_POISON_en = "Poison"; -- Do NOT localize this value. - -HEALBOT_RANK_1 = " (Rank 1)"; -HEALBOT_RANK_2 = " (Rank 2)"; -HEALBOT_RANK_3 = " (Rank 3)"; -HEALBOT_RANK_4 = " (Rank 4)"; -HEALBOT_RANK_5 = " (Rank 5)"; -HEALBOT_RANK_6 = " (Rank 6)"; -HEALBOT_RANK_7 = " (Rank 7)"; -HEALBOT_RANK_8 = " (Rank 8)"; -HEALBOT_RANK_9 = " (Rank 9)"; -HEALBOT_RANK_10 = " (Rank 10)"; -HEALBOT_RANK_11 = " (Rank 11)"; - -HEALBOT_LIBRARY_INCHEAL = "Increases healing done by spells and effects by up to (%d+)%."; -HEALBOT_LIBRARY_INCDAMHEAL = "Increases damage and healing done by magical spells and effects by up to (%d+)%."; - +HEALBOT_POISON = "Poison"; +HEALBOT_DISEASE_en = "Disease"; -- Do NOT localize this value. +HEALBOT_MAGIC_en = "Magic"; -- Do NOT localize this value. +HEALBOT_CURSE_en = "Curse"; -- Do NOT localize this value. +HEALBOT_POISON_en = "Poison"; -- Do NOT localize this value. + +HEALBOT_RANK_1 = " (Rank 1)"; +HEALBOT_RANK_2 = " (Rank 2)"; +HEALBOT_RANK_3 = " (Rank 3)"; +HEALBOT_RANK_4 = " (Rank 4)"; +HEALBOT_RANK_5 = " (Rank 5)"; +HEALBOT_RANK_6 = " (Rank 6)"; +HEALBOT_RANK_7 = " (Rank 7)"; +HEALBOT_RANK_8 = " (Rank 8)"; +HEALBOT_RANK_9 = " (Rank 9)"; +HEALBOT_RANK_10 = " (Rank 10)"; +HEALBOT_RANK_11 = " (Rank 11)"; + +HEALBOT_LIBRARY_INCHEAL = "Increases healing done by spells and effects by up to (%d+)%."; +HEALBOT_LIBRARY_INCDAMHEAL = "Increases damage and healing done by magical spells and effects by up to (%d+)%."; + HB_BONUSSCANNER_NAMES = { HEAL = "Healing", }; @@ -167,7 +167,7 @@ HEALBOT_BUFF_FIRST_AID = "Interface\\Icons\\Spell_Holy_Heal"; HEALBOT_BUFF_POWER_WORD_SHIELD = "Interface\\Icons\\Spell_Holy_PowerWordShield"; HEALBOT_BUFF_REJUVENATION = "Interface\\Icons\\Spell_Nature_Rejuvenation"; HEALBOT_BUFF_REGROWTH = "Interface\\Icons\\Spell_Nature_ResistNature"; -HEALBOT_BUFF_RENEW = "Interface\\Icons\\Spell_Holy_Renew"; +HEALBOT_BUFF_RENEW = "Interface\\Icons\\Spell_Holy_Renew"; HEALBOT_BUFF_FEAR_WARD = "Interface\\Icons\\Spell_Holy_Excorcism"; HEALBOT_DEBUFF_WEAKENED_SOUL = "Interface\\Icons\\Spell_Holy_AshesToAshes"; HEALBOT_DEBUFF_RECENTLY_BANDAGED = "Interface\\Icons\\INV_Misc_Bandage_08"; @@ -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"; diff --git a/HealBot_Localization.fr.lua b/HealBot_Localization.fr.lua index 52d6440..6d591e7 100644 --- a/HealBot_Localization.fr.lua +++ b/HealBot_Localization.fr.lua @@ -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 *************** diff --git a/HealBot_Localization.kr.lua b/HealBot_Localization.kr.lua index a840e19..a564c0b 100644 --- a/HealBot_Localization.kr.lua +++ b/HealBot_Localization.kr.lua @@ -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 = "대상 정보 표시"; diff --git a/HealBot_Options.lua b/HealBot_Options.lua index 7c8ffd9..d599b52 100644 --- a/HealBot_Options.lua +++ b/HealBot_Options.lua @@ -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() diff --git a/HealBot_Options_Buffs.lua b/HealBot_Options_Buffs.lua index f779fe7..2be1da1 100644 --- a/HealBot_Options_Buffs.lua +++ b/HealBot_Options_Buffs.lua @@ -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") diff --git a/HealBot_Options_CDC.lua b/HealBot_Options_CDC.lua index 974185f..3fbffd9 100644 --- a/HealBot_Options_CDC.lua +++ b/HealBot_Options_CDC.lua @@ -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"); diff --git a/HealBot_Options_General.lua b/HealBot_Options_General.lua index 3e43f92..15b1f2c 100644 --- a/HealBot_Options_General.lua +++ b/HealBot_Options_General.lua @@ -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 diff --git a/HealBot_Options_General.xml b/HealBot_Options_General.xml index 410831c..9ac7bca 100644 --- a/HealBot_Options_General.xml +++ b/HealBot_Options_General.xml @@ -6,51 +6,11 @@ - - - - this:SetBackdropBorderColor(0.4, 0.4, 0.4); - this:SetBackdropColor(0, 0, 0, 0); - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -72,7 +32,7 @@ HealBot_Options_GrowUpwards_OnClick(this) - + @@ -81,48 +41,15 @@ - - getglobal(this:GetName().."Text"):SetText("Show Mana Bars"); - this:SetChecked(HealBot_Config.ShowManaBars); - - - if (this:GetChecked()) then - HealBot_Config.ShowManaBars = 1; - else - HealBot_Config.ShowManaBars = 0; - end - HealBot_Action_Refresh(); - - - - - - - - - - - - - - getglobal(this:GetName().."Text"):SetText("For Healers Only"); - this:SetChecked(HealBot_Config.ManaBarsHealersOnly); - - - if (this:GetChecked()) then - HealBot_Config.ManaBarsHealersOnly = 1; - else - HealBot_Config.ManaBarsHealersOnly = 0; - end - HealBot_Action_Refresh(); - + HealBot_Options_ActionMouseover_OnLoad(this,"Hovercasting") + HealBot_Options_ActionMouseover_OnClick(this) - + @@ -135,7 +62,7 @@ - + @@ -144,35 +71,122 @@ HealBot_Options_PanelSounds_OnClick(this) - + - + - + - HealBot_Options_ActionMouseover_OnLoad(this,"Enable Action Bar Mouseover") - HealBot_Options_ActionMouseover_OnClick(this) + + getglobal(this:GetName().."Text"):SetText("Hide when Solo"); + + + if (this:GetChecked()) then + HealBot_Config.HideSolo = 1; + else + HealBot_Config.HideSolo = 0; + end + HealBot_Action_ShowFrame(); + + + + + this:SetBackdropBorderColor(0.4, 0.4, 0.4); + this:SetBackdropColor(0, 0, 0, 0); + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + getglobal(this:GetName().."Text"):SetText("Show Mana Bars"); + + + if (this:GetChecked()) then + HealBot_Config.ShowManaBars = 1; + else + HealBot_Config.ShowManaBars = 0; + end + HealBot_Action_Refresh(); + + + + + + + + + + + + + + getglobal(this:GetName().."Text"):SetText("For Healers Only"); + + + if (this:GetChecked()) then + HealBot_Config.ManaBarsHealersOnly = 1; + else + HealBot_Config.ManaBarsHealersOnly = 0; + end + HealBot_Action_Refresh(); + + + - - + - + HealBot_Options_HideOptions_OnLoad(this,HEALBOT_OPTIONS_HIDEOPTIONS) - HealBot_Options_HideOptions_OnClick(this) @@ -215,6 +229,19 @@ HealBot_Options_ProtectPvP_OnClick(this) + + + + + + + + + + HealBot_Options_HideParty_OnLoad(this,HEALBOT_OPTIONS_HIDEPARTY) + HealBot_Options_HideParty_OnClick(this) + + diff --git a/HealBot_Options_Healing.lua b/HealBot_Options_Healing.lua index a1d457f..b923c58 100644 --- a/HealBot_Options_Healing.lua +++ b/HealBot_Options_Healing.lua @@ -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 diff --git a/HealBot_Options_Skins.lua b/HealBot_Options_Skins.lua index d8e4832..02c685a 100644 --- a/HealBot_Options_Skins.lua +++ b/HealBot_Options_Skins.lua @@ -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() diff --git a/HealBot_Options_Spells.lua b/HealBot_Options_Spells.lua index e877905..f98a668 100644 --- a/HealBot_Options_Spells.lua +++ b/HealBot_Options_Spells.lua @@ -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; + diff --git a/HealBot_View_Layout.lua b/HealBot_View_Layout.lua index 9b5c415..b0896fd 100644 --- a/HealBot_View_Layout.lua +++ b/HealBot_View_Layout.lua @@ -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 diff --git a/README.md b/README.md index a8bb016..3031869 100644 --- a/README.md +++ b/README.md @@ -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.