From 42715fba47b9ccb574eccd9a1ffe6df83bd12ebe Mon Sep 17 00:00:00 2001 From: Bluewhale1337 <295648290+Bluewhale1337@users.noreply.github.com> Date: Fri, 3 Jul 2026 11:55:42 +0200 Subject: [PATCH 1/9] Added pet frames support --- HealBot_Controller_Events.lua | 2 ++ HealBot_Localization.de.lua | 2 +- HealBot_Localization.en.lua | 9 +---- HealBot_Localization.fr.lua | 2 +- HealBot_Localization.kr.lua | 2 +- HealBot_Options.lua | 1 + HealBot_Options_Healing.lua | 30 ++++++++-------- HealBot_View_Layout.lua | 66 +++++++++++++++++++++++++++++++++-- 8 files changed, 86 insertions(+), 28 deletions(-) diff --git a/HealBot_Controller_Events.lua b/HealBot_Controller_Events.lua index f6078c3..943aa2d 100644 --- a/HealBot_Controller_Events.lua +++ b/HealBot_Controller_Events.lua @@ -186,6 +186,7 @@ local HealBot_EventHandlers = { ["UNIT_INVENTORY_CHANGED"] = function(this, arg1) HealBot_OnEvent_PlayerEquipmentChanged2(this, arg1) end, ["PET_BAR_SHOWGRID"] = function(this) HealBot_OnEvent_PartyMembersChanged(this) end, ["PET_BAR_HIDEGRID"] = function(this) HealBot_OnEvent_PartyMembersChanged(this) end, + ["UNIT_PET"] = function(this, arg1) HealBot_OnEvent_PartyMembersChanged(this) end, ["SPELLS_CHANGED"] = function(this, arg1) HealBot_OnEvent_SpellsChanged(this, arg1) end } @@ -256,6 +257,7 @@ function HealBot_OnEvent_VariablesLoaded(this) this:RegisterEvent("PARTY_MEMBER_ENABLE"); this:RegisterEvent("PET_BAR_SHOWGRID"); this:RegisterEvent("PET_BAR_HIDEGRID"); + this:RegisterEvent("UNIT_PET"); this:RegisterEvent("UNIT_HEALTH"); this:RegisterEvent("UNIT_MANA"); this:RegisterEvent("UNIT_RAGE"); diff --git a/HealBot_Localization.de.lua b/HealBot_Localization.de.lua index e02cdf0..560f05a 100644 --- a/HealBot_Localization.de.lua +++ b/HealBot_Localization.de.lua @@ -327,6 +327,7 @@ HEALBOT_OPTIONS_MONITORMELEE = "Nahkampf"; HEALBOT_OPTIONS_MONITORRANGE = "Fernkampf"; HEALBOT_OPTIONS_MONITORHEALERS = "Heiler"; HEALBOT_OPTIONS_MONITORCUSTOM = "Eigene"; +HEALBOT_OPTIONS_PETS = "Begleiter"; HEALBOT_OPTIONS_SHOWTOOLTIP = "Zeige Tooltips"; HEALBOT_OPTIONS_SHOWDETTOOLTIP = "Zeige detaillierte Spruchinfos"; @@ -352,7 +353,6 @@ HEALBOT_WORDS_SEC = "Sek"; HEALBOT_WORDS_TO = "zu"; HEALBOT_WORDS_CAST = "Zauber" HEALBOT_WORDS_FOR = "f\195\188r"; - end diff --git a/HealBot_Localization.en.lua b/HealBot_Localization.en.lua index 6d81d92..209a639 100644 --- a/HealBot_Localization.en.lua +++ b/HealBot_Localization.en.lua @@ -365,6 +365,7 @@ HEALBOT_OPTIONS_MONITORMELEE = "Melee"; HEALBOT_OPTIONS_MONITORRANGE = "Ranged"; HEALBOT_OPTIONS_MONITORHEALERS = "Healers"; HEALBOT_OPTIONS_MONITORCUSTOM = "Custom"; +HEALBOT_OPTIONS_PETS = "Pets"; HEALBOT_OPTIONS_SHOWTOOLTIP = "Show tooltips"; HEALBOT_OPTIONS_SHOWDETTOOLTIP = "Show detailed spell information"; @@ -385,11 +386,3 @@ HEALBOT_WORDS_SEC = "sec"; HEALBOT_WORDS_TO = "to"; HEALBOT_WORDS_CAST = "Cast" HEALBOT_WORDS_FOR = "for"; - - - - - - - - diff --git a/HealBot_Localization.fr.lua b/HealBot_Localization.fr.lua index 6d591e7..ab27dfc 100644 --- a/HealBot_Localization.fr.lua +++ b/HealBot_Localization.fr.lua @@ -266,6 +266,7 @@ 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_PETS = "Familiers"; HEALBOT_OPTIONS_BARALPHAINHEAL= "Incoming heal opacity"; -- *************** needs French translation *************** @@ -333,7 +334,6 @@ HEALBOT_WORDS_SEC = "sec"; -- *************** needs translati HEALBOT_WORDS_TO = "to"; -- *************** needs translation *************** HEALBOT_WORDS_CAST = "Cast" -- *************** needs translation *************** HEALBOT_WORDS_FOR = "for"; -- *************** needs translation *************** - end diff --git a/HealBot_Localization.kr.lua b/HealBot_Localization.kr.lua index a564c0b..60852b8 100644 --- a/HealBot_Localization.kr.lua +++ b/HealBot_Localization.kr.lua @@ -309,6 +309,7 @@ HEALBOT_GREATER_BLESSING_OF_SALVATION = "상급 구원의 축복"; HEALBOT_OPTIONS_MONITORRANGE = "원거리"; HEALBOT_OPTIONS_MONITORHEALERS = "힐러"; HEALBOT_OPTIONS_MONITORCUSTOM = "사용자 정의"; + HEALBOT_OPTIONS_PETS = "소환수"; HEALBOT_OPTIONS_SHOWTOOLTIP = "툴팁 표시"; HEALBOT_OPTIONS_SHOWDETTOOLTIP = "주문 정보 표시"; @@ -329,7 +330,6 @@ HEALBOT_GREATER_BLESSING_OF_SALVATION = "상급 구원의 축복"; HEALBOT_WORDS_TO = "~"; HEALBOT_WORDS_CAST = "시전" HEALBOT_WORDS_FOR = "for"; - end diff --git a/HealBot_Options.lua b/HealBot_Options.lua index d599b52..48d7f5e 100644 --- a/HealBot_Options.lua +++ b/HealBot_Options.lua @@ -18,6 +18,7 @@ HealBot_Options_EmergencyFilter_List = { HEALBOT_SHAMAN, HEALBOT_WARLOCK, HEALBOT_WARRIOR, + HEALBOT_OPTIONS_PETS, HEALBOT_OPTIONS_MONITORMELEE, HEALBOT_OPTIONS_MONITORRANGE, HEALBOT_OPTIONS_MONITORHEALERS, diff --git a/HealBot_Options_Healing.lua b/HealBot_Options_Healing.lua index b923c58..dc3db60 100644 --- a/HealBot_Options_Healing.lua +++ b/HealBot_Options_Healing.lua @@ -252,7 +252,7 @@ function HealBot_Options_EmergencyFilter_Reset() HealBot_EmergInc[HEALBOT_SHAMAN] = 0; HealBot_EmergInc[HEALBOT_WARLOCK] = 0; HealBot_EmergInc[HEALBOT_WARRIOR] = 0; - if HealBot_Config.EmergIncMonitor==1 then + if HealBot_Config.EmergIncMonitor==2 then HealBot_EmergInc[HEALBOT_DRUID] = 1; HealBot_EmergInc[HEALBOT_HUNTER] = 1; HealBot_EmergInc[HEALBOT_MAGE] = 1; @@ -262,25 +262,27 @@ function HealBot_Options_EmergencyFilter_Reset() HealBot_EmergInc[HEALBOT_SHAMAN] = 1; HealBot_EmergInc[HEALBOT_WARLOCK] = 1; HealBot_EmergInc[HEALBOT_WARRIOR] = 1; - elseif HealBot_Config.EmergIncMonitor==2 then - HealBot_EmergInc[HEALBOT_DRUID] = 1; elseif HealBot_Config.EmergIncMonitor==3 then - HealBot_EmergInc[HEALBOT_HUNTER] = 1; + HealBot_EmergInc[HEALBOT_DRUID] = 1; elseif HealBot_Config.EmergIncMonitor==4 then - HealBot_EmergInc[HEALBOT_MAGE] = 1; + HealBot_EmergInc[HEALBOT_HUNTER] = 1; elseif HealBot_Config.EmergIncMonitor==5 then - HealBot_EmergInc[HEALBOT_PALADIN] = 1; + HealBot_EmergInc[HEALBOT_MAGE] = 1; elseif HealBot_Config.EmergIncMonitor==6 then - HealBot_EmergInc[HEALBOT_PRIEST] = 1; + HealBot_EmergInc[HEALBOT_PALADIN] = 1; elseif HealBot_Config.EmergIncMonitor==7 then - HealBot_EmergInc[HEALBOT_ROGUE] = 1; + HealBot_EmergInc[HEALBOT_PRIEST] = 1; elseif HealBot_Config.EmergIncMonitor==8 then - HealBot_EmergInc[HEALBOT_SHAMAN] = 1; + HealBot_EmergInc[HEALBOT_ROGUE] = 1; elseif HealBot_Config.EmergIncMonitor==9 then - HealBot_EmergInc[HEALBOT_WARLOCK] = 1; + HealBot_EmergInc[HEALBOT_SHAMAN] = 1; elseif HealBot_Config.EmergIncMonitor==10 then - HealBot_EmergInc[HEALBOT_WARRIOR] = 1; + HealBot_EmergInc[HEALBOT_WARLOCK] = 1; elseif HealBot_Config.EmergIncMonitor==11 then + HealBot_EmergInc[HEALBOT_WARRIOR] = 1; + elseif HealBot_Config.EmergIncMonitor==12 then + -- Pets: no player classes enabled (handled separately in layout) + elseif HealBot_Config.EmergIncMonitor==13 then HealBot_EmergInc[HEALBOT_DRUID] = HealBot_Config.EmergIncMelee[HEALBOT_DRUID]; HealBot_EmergInc[HEALBOT_HUNTER] = HealBot_Config.EmergIncMelee[HEALBOT_HUNTER]; HealBot_EmergInc[HEALBOT_MAGE] = HealBot_Config.EmergIncMelee[HEALBOT_MAGE]; @@ -290,7 +292,7 @@ function HealBot_Options_EmergencyFilter_Reset() HealBot_EmergInc[HEALBOT_SHAMAN] = HealBot_Config.EmergIncMelee[HEALBOT_SHAMAN]; HealBot_EmergInc[HEALBOT_WARLOCK] = HealBot_Config.EmergIncMelee[HEALBOT_WARLOCK]; HealBot_EmergInc[HEALBOT_WARRIOR] = HealBot_Config.EmergIncMelee[HEALBOT_WARRIOR]; - elseif HealBot_Config.EmergIncMonitor==12 then + elseif HealBot_Config.EmergIncMonitor==14 then HealBot_EmergInc[HEALBOT_DRUID] = HealBot_Config.EmergIncRange[HEALBOT_DRUID]; HealBot_EmergInc[HEALBOT_HUNTER] = HealBot_Config.EmergIncRange[HEALBOT_HUNTER]; HealBot_EmergInc[HEALBOT_MAGE] = HealBot_Config.EmergIncRange[HEALBOT_MAGE]; @@ -300,7 +302,7 @@ function HealBot_Options_EmergencyFilter_Reset() HealBot_EmergInc[HEALBOT_SHAMAN] = HealBot_Config.EmergIncRange[HEALBOT_SHAMAN]; HealBot_EmergInc[HEALBOT_WARLOCK] = HealBot_Config.EmergIncRange[HEALBOT_WARLOCK]; HealBot_EmergInc[HEALBOT_WARRIOR] = HealBot_Config.EmergIncRange[HEALBOT_WARRIOR]; - elseif HealBot_Config.EmergIncMonitor==13 then + elseif HealBot_Config.EmergIncMonitor==15 then HealBot_EmergInc[HEALBOT_DRUID] = HealBot_Config.EmergIncHealers[HEALBOT_DRUID]; HealBot_EmergInc[HEALBOT_HUNTER] = HealBot_Config.EmergIncHealers[HEALBOT_HUNTER]; HealBot_EmergInc[HEALBOT_MAGE] = HealBot_Config.EmergIncHealers[HEALBOT_MAGE]; @@ -310,7 +312,7 @@ function HealBot_Options_EmergencyFilter_Reset() HealBot_EmergInc[HEALBOT_SHAMAN] = HealBot_Config.EmergIncHealers[HEALBOT_SHAMAN]; HealBot_EmergInc[HEALBOT_WARLOCK] = HealBot_Config.EmergIncHealers[HEALBOT_WARLOCK]; HealBot_EmergInc[HEALBOT_WARRIOR] = HealBot_Config.EmergIncHealers[HEALBOT_WARRIOR]; - elseif HealBot_Config.EmergIncMonitor==14 then + elseif HealBot_Config.EmergIncMonitor==16 then HealBot_EmergInc[HEALBOT_DRUID] = HealBot_Config.EmergIncCustom[HEALBOT_DRUID]; HealBot_EmergInc[HEALBOT_HUNTER] = HealBot_Config.EmergIncCustom[HEALBOT_HUNTER]; HealBot_EmergInc[HEALBOT_MAGE] = HealBot_Config.EmergIncCustom[HEALBOT_MAGE]; diff --git a/HealBot_View_Layout.lua b/HealBot_View_Layout.lua index b0896fd..ebcc433 100644 --- a/HealBot_View_Layout.lua +++ b/HealBot_View_Layout.lua @@ -495,7 +495,7 @@ function HealBot_Action_PartyChanged() numBars = numBars + 1; numHeaders = numHeaders + 1; end - if HealBot_Config.EmergIncMonitor == 1 then + if HealBot_Config.EmergIncMonitor == 2 then if GetNumRaidMembers() > 0 then for j = 1, 40 do local PossibleEmerg = 1; @@ -543,6 +543,50 @@ function HealBot_Action_PartyChanged() end end end + elseif HealBot_Config.EmergIncMonitor == 12 then + if GetNumRaidMembers() > 0 then + for j = 1, 40 do + local unit = "raidpet" .. j; + if not HealBot_Action_UnitButtons[unit] and HealBot_MayHeal(unit) then + local ownerIndex = j; + local name = UnitName(unit) or "Pet"; + local _, _, subgroup = GetRaidRosterInfo(ownerIndex); + subgroup = subgroup or 1; + + if HealBot_Config.ExtraOrder == 1 then + order[unit] = name; + elseif HealBot_Config.ExtraOrder == 2 then + order[unit] = HEALBOT_OPTIONS_PETS; + elseif HealBot_Config.ExtraOrder == 3 then + order[unit] = subgroup; + else + order[unit] = 0 - UnitHealthMax(unit); + if UnitHealthMax(unit) > TempMaxH then TempMaxH = UnitHealthMax(unit); end + end + table.insert(units, unit); + numBars = numBars + 1; + end + end + else + local petUnits = { "pet", "partypet1", "partypet2", "partypet3", "partypet4" }; + for _, unit in ipairs(petUnits) do + if not HealBot_Action_UnitButtons[unit] and HealBot_MayHeal(unit) then + local name = UnitName(unit) or "Pet"; + if HealBot_Config.ExtraOrder == 1 then + order[unit] = name; + elseif HealBot_Config.ExtraOrder == 2 then + order[unit] = HEALBOT_OPTIONS_PETS; + elseif HealBot_Config.ExtraOrder == 3 then + order[unit] = 1; + else + order[unit] = 0 - UnitHealthMax(unit); + if UnitHealthMax(unit) > TempMaxH then TempMaxH = UnitHealthMax(unit); end + end + table.insert(units, unit); + numBars = numBars + 1; + end + end + end else if GetNumRaidMembers() > 0 then for j = 1, 40 do @@ -606,10 +650,26 @@ function HealBot_Action_PartyChanged() local TempSort = "init" TempMaxH = math.ceil(TempMaxH / 1000) * 1000; - if GetNumRaidMembers() > 0 then + if GetNumRaidMembers() > 0 or HealBot_Config.EmergIncMonitor == 12 then for j = 1, 40 do if not units[j] then break end - local name, rank, subgroup, level, class, fileName, zone, online, isDead = GetRaidRosterInfo(string.sub(units[j], 5)); + local name, rank, subgroup, level, class, fileName, zone, online, isDead; + local ownerIndex = nil; + if string.sub(units[j], 1, 7) == "raidpet" then + ownerIndex = tonumber(string.sub(units[j], 8)); + elseif string.sub(units[j], 1, 4) == "raid" then + ownerIndex = tonumber(string.sub(units[j], 5)); + end + if ownerIndex then + name, rank, subgroup, level, class, fileName, zone, online, isDead = GetRaidRosterInfo(ownerIndex); + end + + if string.sub(units[j], 1, 7) == "raidpet" or string.sub(units[j], 1, 8) == "partypet" or units[j] == "pet" then + name = UnitName(units[j]) or "Pet"; + class = HEALBOT_OPTIONS_PETS; + subgroup = subgroup or 1; + end + if HealBot_Config.ShowHeader[HealBot_Config.Current_Skin] == 1 and HealBot_Config.ExtraOrder == 2 and TempSort ~= class then TempSort = class HeaderPos[i + 1] = class From 0c8b687f53082c9c35950fefafbb557c696a77ec Mon Sep 17 00:00:00 2001 From: Bluewhale1337 <295648290+Bluewhale1337@users.noreply.github.com> Date: Fri, 3 Jul 2026 12:37:20 +0200 Subject: [PATCH 2/9] Implement EQUIPMENT_CHANGED observer pattern and update project to v1.4.0 --- HealBotBlue.toc | 2 +- HealBot_Controller_Events.lua | 17 +++++++++++++++-- HealBot_Localization.en.lua | 2 +- README.md | 5 ++++- 4 files changed, 21 insertions(+), 5 deletions(-) diff --git a/HealBotBlue.toc b/HealBotBlue.toc index eafa611..4d8e139 100644 --- a/HealBotBlue.toc +++ b/HealBotBlue.toc @@ -1,6 +1,6 @@ ## Interface: 11200 ## Title: HealBotBlue -## Version: 1.3.1 +## Version: 1.4.0 ## Author: Bluewhale ## Notes: Adds panel with skinable bars for healing and decursive ## SavedVariables: HealBot_Config diff --git a/HealBot_Controller_Events.lua b/HealBot_Controller_Events.lua index 943aa2d..2f8157a 100644 --- a/HealBot_Controller_Events.lua +++ b/HealBot_Controller_Events.lua @@ -27,6 +27,13 @@ function HealBot_OnLoad(this) HealBot_Model:RegisterObserver("ROSTER_CHANGED", function() Delay_RecalcParty = 1 end) + HealBot_Model:RegisterObserver("EQUIPMENT_CHANGED", function(unitID) + if unitID == "player" then + HealBot_BonusScanner:ScanEquipment() + CalcEquipBonus = true; + HealBot_RecalcSpells(); + end + end) end function HealBot_RegisterThis(this) @@ -182,8 +189,14 @@ local HealBot_EventHandlers = { ["PARTY_MEMBER_ENABLE"] = function(this, arg1) HealBot_OnEvent_PartyMemberEnable(this, arg1) end, ["CHAT_MSG_SYSTEM"] = function(this, arg1) HealBot_OnEvent_SystemMsg(this, arg1) end, ["ZONE_CHANGED_NEW_AREA"] = function(this) HealBot_OnEvent_ZoneChanged(this) end, - ["UPDATE_INVENTORY_ALERTS"] = function(this) HealBot_OnEvent_PlayerEquipmentChanged(this) end, - ["UNIT_INVENTORY_CHANGED"] = function(this, arg1) HealBot_OnEvent_PlayerEquipmentChanged2(this, arg1) end, + ["UPDATE_INVENTORY_ALERTS"] = function(this) + HealBot_Model:NotifyObservers("EQUIPMENT_CHANGED", "player") + HealBot_OnEvent_PlayerEquipmentChanged(this) + end, + ["UNIT_INVENTORY_CHANGED"] = function(this, arg1) + HealBot_Model:NotifyObservers("EQUIPMENT_CHANGED", arg1) + HealBot_OnEvent_PlayerEquipmentChanged2(this, arg1) + end, ["PET_BAR_SHOWGRID"] = function(this) HealBot_OnEvent_PartyMembersChanged(this) end, ["PET_BAR_HIDEGRID"] = function(this) HealBot_OnEvent_PartyMembersChanged(this) end, ["UNIT_PET"] = function(this, arg1) HealBot_OnEvent_PartyMembersChanged(this) end, diff --git a/HealBot_Localization.en.lua b/HealBot_Localization.en.lua index 209a639..eb3ee61 100644 --- a/HealBot_Localization.en.lua +++ b/HealBot_Localization.en.lua @@ -1,4 +1,4 @@ -HEALBOT_VERSION = "1.3.1"; +HEALBOT_VERSION = "1.4"; ------------- -- ENGLISH -- diff --git a/README.md b/README.md index 904faff..9646804 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,10 @@ Default installation path: `C:\Program Files\World of Warcraft\Interface\AddOns\ ### Change Log -**1.3.1** +**v1.4** +* **Extra Frame support for pets and familiars added** Togglable from healing tab - Extra frames option selected & pets selected from dropdown. + +**v1.3.1** * **Hotfix: missing helper function restored** Fixed issue with lua error for druids. **v1.3** From cb1ba1ab7551da97621125512046d31d22210040 Mon Sep 17 00:00:00 2001 From: Bluewhale1337 <295648290+Bluewhale1337@users.noreply.github.com> Date: Sat, 4 Jul 2026 09:41:06 +0200 Subject: [PATCH 3/9] Implement auto-unshifting for druid shapeshift forms and add status command --- HealBot.lua | 15 +++++++++++++++ HealBot_Controller_Events.lua | 12 +++++++++++- HealBot_Controller_Spells.lua | 19 +++++++++++++++++-- HealBot_Data.lua | 1 + 4 files changed, 44 insertions(+), 3 deletions(-) diff --git a/HealBot.lua b/HealBot.lua index 06a2533..4dde5cc 100644 --- a/HealBot.lua +++ b/HealBot.lua @@ -56,6 +56,21 @@ function HealBot_SlashCmd(cmd) HealBot_TogglePanel(HealBot_Options); return end + if (cmd=="forms" or cmd=="form") then + local forms = GetNumShapeshiftForms(); + if forms and forms > 0 then + HealBot_AddChat("HealBot: Available shapeshift forms:"); + for i=1,forms do + local icon, name, active = GetShapeshiftFormInfo(i); + local actStr = "false" + if active then actStr = "true" end + HealBot_AddChat(" Form " .. i .. ": " .. (name or "nil") .. " | Icon: " .. (icon or "nil") .. " | Active: " .. actStr); + end + else + HealBot_AddChat("HealBot: No shapeshift forms found."); + end + return + end if (cmd=="reset" or cmd=="recalc" or cmd=="defaults") then InitSpells=2; diff --git a/HealBot_Controller_Events.lua b/HealBot_Controller_Events.lua index 2f8157a..0bfde31 100644 --- a/HealBot_Controller_Events.lua +++ b/HealBot_Controller_Events.lua @@ -170,6 +170,9 @@ local HealBot_EventHandlers = { ["PLAYER_ENTERING_WORLD"] = function(this) HealBot_Model:RefreshUnit("player") HealBot_Model:RefreshUnit("pet") + if HealBot_UnitClass("player") == "DRUID" then + HealBot_UpdateShapeshiftForm() + end HealBot_OnEvent_PlayerEnteringWorld(this) end, ["VARIABLES_LOADED"] = function(this) @@ -200,7 +203,9 @@ local HealBot_EventHandlers = { ["PET_BAR_SHOWGRID"] = function(this) HealBot_OnEvent_PartyMembersChanged(this) end, ["PET_BAR_HIDEGRID"] = function(this) HealBot_OnEvent_PartyMembersChanged(this) end, ["UNIT_PET"] = function(this, arg1) HealBot_OnEvent_PartyMembersChanged(this) end, - ["SPELLS_CHANGED"] = function(this, arg1) HealBot_OnEvent_SpellsChanged(this, arg1) end + ["SPELLS_CHANGED"] = function(this, arg1) HealBot_OnEvent_SpellsChanged(this, arg1) end, + ["UPDATE_SHAPESHIFT_FORM"] = function(this) HealBot_UpdateShapeshiftForm() end, + ["UPDATE_SHAPESHIFT_FORMS"] = function(this) HealBot_UpdateShapeshiftForm() end } function HealBot_OnEvent(this, event, arg1, arg2, arg3, arg4) @@ -289,6 +294,11 @@ function HealBot_OnEvent_VariablesLoaded(this) this:RegisterEvent("CHAT_MSG_ADDON"); this:RegisterEvent("CHAT_MSG_SYSTEM"); this:RegisterEvent("PLAYER_ENTERING_WORLD"); + if class == "DRUID" then + this:RegisterEvent("UPDATE_SHAPESHIFT_FORM"); + this:RegisterEvent("UPDATE_SHAPESHIFT_FORMS"); + HealBot_UpdateShapeshiftForm(); + end InitSpells = 2; end end diff --git a/HealBot_Controller_Spells.lua b/HealBot_Controller_Spells.lua index 44a00e3..9d72877 100644 --- a/HealBot_Controller_Spells.lua +++ b/HealBot_Controller_Spells.lua @@ -218,6 +218,10 @@ function HealBot_CastSpellOnFriend(spell, target) local targetEnemy = UnitCanAttack("player", "target"); local oldTarget = UnitName("target"); + if HealBot_UnitClass("player") == "DRUID" and HealBot_ActiveShapeshiftStance and HealBot_Config.AutoUnshift == 1 then + CastShapeshiftForm(HealBot_ActiveShapeshiftStance); + end + if oldTarget ~= UnitName(target) then TargetUnit(target); end @@ -365,7 +369,7 @@ function HealBot_GetHealSpell(unit, pattern) if UnitOnTaxi("player") then return nil end; if HealBot_Config.ProtectPvP == 1 and UnitIsPVP(unit) and not UnitIsPVP("player") then return nil end if HealBot_UnitClass("player") == "DRUID" then - if HealBot_GetShapeshiftForm() then return nil end; + if HealBot_ActiveShapeshiftStance and HealBot_Config.AutoUnshift ~= 1 then return nil end; end local spell = HealBot_GetSpellName(HealBot_GetSpellId(pattern)) local range = 40; @@ -641,13 +645,24 @@ function HealBot_Generic_Patten(matchStr, matchPattern) return tmpTest, _HealsMin, _HealsMax; end +HealBot_ActiveShapeshiftStance = nil; + +function HealBot_UpdateShapeshiftForm() + HealBot_ActiveShapeshiftStance = HealBot_GetShapeshiftForm(); +end + function HealBot_GetShapeshiftForm() local forms = GetNumShapeshiftForms(); if forms then local i; for i=1,forms do local icon,name,active = GetShapeshiftFormInfo(i); - if active and not string.find(icon,"HumanoidForm") then return i; end + if active then + local icon_lower = string.lower(icon); + if not string.find(icon_lower, "humanoidform") and not string.find(icon_lower, "treeoflife") and not string.find(icon_lower, "stoneclawtotem") then + return i; + end + end end end return nil; diff --git a/HealBot_Data.lua b/HealBot_Data.lua index 262bba0..6c525e3 100644 --- a/HealBot_Data.lua +++ b/HealBot_Data.lua @@ -14,6 +14,7 @@ HealBot_ConfigDefaults = { HideSolo = 0, OverHeal = 0.25, CastNotify = 1, + AutoUnshift = 1, ChatMessages = { [1] = { Spell = "None", Message = "Casting #Spell# on #Target#", Channel = "None" }, [2] = { Spell = "None", Message = "Casting #Spell# on #Target#", Channel = "None" }, From 4c7cfbde8eb50ceffaca9eadd6ce8490aea4f25d Mon Sep 17 00:00:00 2001 From: Bluewhale1337 <295648290+Bluewhale1337@users.noreply.github.com> Date: Sat, 4 Jul 2026 14:47:22 +0200 Subject: [PATCH 4/9] add null checks when toggling HealBot options panels to prevent errors --- HealBot_Options.lua | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/HealBot_Options.lua b/HealBot_Options.lua index 48d7f5e..82b1f4f 100644 --- a/HealBot_Options.lua +++ b/HealBot_Options.lua @@ -336,10 +336,16 @@ function HealBot_Options_SetSkins() end function HealBot_Options_ShowPanel(id) if HealBot_Options_CurrentPanel>0 then - getglobal("HealBot_Options_Panel"..HealBot_Options_CurrentPanel):Hide(); + local panel = getglobal("HealBot_Options_Panel"..HealBot_Options_CurrentPanel); + if panel then + panel:Hide(); + end end HealBot_Options_CurrentPanel = id; if HealBot_Options_CurrentPanel>0 then - getglobal("HealBot_Options_Panel"..HealBot_Options_CurrentPanel):Show(); + local panel = getglobal("HealBot_Options_Panel"..HealBot_Options_CurrentPanel); + if panel then + panel:Show(); + end end end From becb2ddfdb65f0f5ddbc669f570bb7d4cf7db268 Mon Sep 17 00:00:00 2001 From: Bluewhale1337 <295648290+Bluewhale1337@users.noreply.github.com> Date: Fri, 10 Jul 2026 17:08:50 +0200 Subject: [PATCH 5/9] Feat: added customizable unit frame health text and support for non-mana resource tracking --- HealBot_Data.lua | 3 +++ HealBot_Options.lua | 5 ++++ HealBot_Options_General.xml | 26 +++++++++++++++++-- HealBot_Options_Healing.lua | 27 ++++++++++++++++++++ HealBot_Options_Healing.xml | 30 +++++++++++++++++++++- HealBot_View_Layout.lua | 51 +++++++++++++++++++++++++++++++------ README.md | 6 +++++ 7 files changed, 137 insertions(+), 11 deletions(-) diff --git a/HealBot_Data.lua b/HealBot_Data.lua index 6c525e3..0f58f29 100644 --- a/HealBot_Data.lua +++ b/HealBot_Data.lua @@ -25,6 +25,7 @@ HealBot_ConfigDefaults = { HideOptions = 0, HideAbort = 1, ShowTooltip = 1, + ShowHealthText = 0, GrowUpwards = 0, ProtectPvP = 1, QualityRange = 0, @@ -172,7 +173,9 @@ HealBot_ConfigDefaults = { }, }, EnableHealthy = 0, + ShowNonManaBars = 0, ActionVisible = 0, + ActionMouseover = 1, CDCLeftText = {[HEALBOT_PRIEST]="None", [HEALBOT_SHAMAN]="None", [HEALBOT_DRUID]="None", [HEALBOT_PALADIN]="None",}, CDCRightText = {[HEALBOT_PRIEST]="None", [HEALBOT_SHAMAN]="None", [HEALBOT_DRUID]="None", [HEALBOT_PALADIN]="None",}, Current_Skin = "Modern Flat", diff --git a/HealBot_Options.lua b/HealBot_Options.lua index 8245415..0a30e9c 100644 --- a/HealBot_Options.lua +++ b/HealBot_Options.lua @@ -248,6 +248,8 @@ function HealBot_Options_OnShow(this) HealBot_Options_PanelSounds:SetChecked(HealBot_Config.PanelSounds); HealBot_Options_ShowManaBars:SetChecked(HealBot_Config.ShowManaBars); HealBot_Options_ManaBarsHealersOnly:SetChecked(HealBot_Config.ManaBarsHealersOnly); + if HealBot_Config.ShowNonManaBars == nil then HealBot_Config.ShowNonManaBars = 0; end + HealBot_Options_ShowNonManaBars:SetChecked(HealBot_Config.ShowNonManaBars); if HealBot_Config.ActionMouseover == nil then HealBot_Config.ActionMouseover = 1; end HealBot_Options_ActionMouseover:SetChecked(HealBot_Config.ActionMouseover); @@ -261,6 +263,9 @@ function HealBot_Options_OnShow(this) HealBot_Options_TargetHeals:SetChecked(HealBot_Config.TargetHeals); HealBot_Options_EmergencyHeals:SetChecked(HealBot_Config.EmergencyHeals); HealBot_Options_OverHeal:SetValue(HealBot_Config.OverHeal); + if HealBot_Config.ShowHealthText == nil then HealBot_Config.ShowHealthText = 0; end + HealBot_UIDropDownMenu_SetSelectedID(HealBot_Options_HealthText, HealBot_Config.ShowHealthText + 1); + UIDropDownMenu_SetText(HealBot_Options_HealthText_List[HealBot_Config.ShowHealthText + 1], HealBot_Options_HealthText); HealBot_Options_CastNotify_OnClick(nil,HealBot_Config.CastNotify); HealBot_Options_SetBuffs(); HealBot_Options_HideOptions:SetChecked(HealBot_Config.HideOptions); diff --git a/HealBot_Options_General.xml b/HealBot_Options_General.xml index 9ac7bca..0193047 100644 --- a/HealBot_Options_General.xml +++ b/HealBot_Options_General.xml @@ -102,7 +102,7 @@ - + @@ -156,7 +156,7 @@ - + @@ -174,6 +174,28 @@ + + + + + + + + + + + getglobal(this:GetName().."Text"):SetText("Track Non-Mana Resources"); + + + if (this:GetChecked()) then + HealBot_Config.ShowNonManaBars = 1; + else + HealBot_Config.ShowNonManaBars = 0; + end + HealBot_Action_Refresh(); + + + diff --git a/HealBot_Options_Healing.lua b/HealBot_Options_Healing.lua index 708ccea..ce20d92 100644 --- a/HealBot_Options_Healing.lua +++ b/HealBot_Options_Healing.lua @@ -85,6 +85,33 @@ function HealBot_Options_EFClass_OnClick(this) HealBot_Action_PartyChanged(); end end +HealBot_Options_HealthText_List = { + "Name Only", + "Health Percentage", + "Real Health", + "Health Deficit", +} + +function HealBot_Options_HealthText_DropDown() + for i=1, getn(HealBot_Options_HealthText_List), 1 do + local info = {}; + info.text = HealBot_Options_HealthText_List[i]; + info.func = HealBot_Options_HealthText_OnSelect; + UIDropDownMenu_AddButton(info); + end +end + +function HealBot_Options_HealthText_OnLoad(this) + UIDropDownMenu_Initialize(this, HealBot_Options_HealthText_DropDown); + UIDropDownMenu_SetWidth(110, this); +end + +function HealBot_Options_HealthText_OnSelect() + HealBot_Config.ShowHealthText = this:GetID() - 1; + HealBot_UIDropDownMenu_SetSelectedID(HealBot_Options_HealthText, this:GetID()) + HealBot_Action_RefreshButtons(); +end + local HealBot_Options_EmergencyFClass_List = { HEALBOT_CLASSES_MELEE, HEALBOT_CLASSES_RANGES, diff --git a/HealBot_Options_Healing.xml b/HealBot_Options_Healing.xml index c2a5b4f..007a5c3 100644 --- a/HealBot_Options_Healing.xml +++ b/HealBot_Options_Healing.xml @@ -183,6 +183,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + HealBot_Options_HealthText_OnLoad(this) + + + + @@ -196,7 +224,7 @@ - + diff --git a/HealBot_View_Layout.lua b/HealBot_View_Layout.lua index ebcc433..9884ca8 100644 --- a/HealBot_View_Layout.lua +++ b/HealBot_View_Layout.lua @@ -132,16 +132,25 @@ function HealBot_Action_EnableButton(button) local pt = state.powerType local showMana = false - if HealBot_Config.ShowManaBars == 1 and state.maxMana > 0 and pt == 0 then - if HealBot_Config.ManaBarsHealersOnly == 1 then - if isHealer then showMana = true end - else + local pr, pg, pb = 0, 0, 1 -- Default Blue for Mana + + if HealBot_Config.ShowManaBars == 1 and state.maxMana > 0 then + if pt == 0 then + if HealBot_Config.ManaBarsHealersOnly == 1 then + if isHealer then showMana = true end + else + showMana = true + end + elseif HealBot_Config.ShowNonManaBars == 1 then showMana = true + if pt == 1 then pr, pg, pb = 1, 0, 0 -- Rage (Red) + elseif pt == 3 then pr, pg, pb = 1, 1, 0 -- Energy (Yellow) + elseif pt == 2 then pr, pg, pb = 1, 0.5, 0 -- Focus (Orange) + end end end if showMana then - local pr, pg, pb = 0, 0, 1 if bar3 then bar3:SetMinMaxValues(0, state.maxMana) bar3:SetValue(state.mana) @@ -193,10 +202,36 @@ function HealBot_Action_EnableButton(button) bar:SetStatusBarColor(r, g, b, HealBot_Config.bardisa[HealBot_Config.Current_Skin]); bar2:SetStatusBarColor(r, g, b, HealBot_Config.bardisa[HealBot_Config.Current_Skin]); end - if string.len(name) > textlen then - name = string.sub(name, 1, textlen - 3) .. '...'; + local healthTextOpt = HealBot_Config.ShowHealthText or 0 + local displayText = name + if healthTextOpt == 1 then + local pct = 0 + if maxhlth > 0 then pct = math.floor((hlth / maxhlth) * 100) end + displayText = name .. " - " .. pct .. "%" + elseif healthTextOpt == 2 then + displayText = name .. " - " .. hlth .. "/" .. maxhlth + elseif healthTextOpt == 3 then + local deficit = maxhlth - hlth + if deficit > 0 then + displayText = name .. " - -" .. deficit + end end - bar.txt:SetText(name); + + if string.len(displayText) > textlen then + if healthTextOpt > 0 then + -- If we have numbers, just truncate the name part so the numbers still show. + -- Find where " - " starts. + local dashIndex = string.find(displayText, " %- ") + if dashIndex then + local numbersPart = string.sub(displayText, dashIndex) + local namePart = string.sub(name, 1, math.max(1, textlen - string.len(numbersPart) - 3)) .. "..." + displayText = namePart .. numbersPart + end + else + displayText = string.sub(name, 1, textlen - 3) .. '...'; + end + end + bar.txt:SetText(displayText); bar.txt:SetTextColor(sr, sg, sb, sa); local fontName, fontHeight, fontFlags = bar.txt:GetFont() local fontOutline = HealBot_Config.bfontoutline[HealBot_Config.Current_Skin] or 0 diff --git a/README.md b/README.md index 1570314..0eb1f5a 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,12 @@ Default installation path: `C:\Program Files\World of Warcraft\Interface\AddOns\ ### Change Log +**v1.4** +* **Extra Frame support for pets and familiars added:** Togglable from healing tab - Extra frames option selected & pets selected from dropdown. +* **Customizable Health Text:** Added a new dropdown in the Healing Options tab that allows users to choose how health text is displayed on unit frames (`Name Only`, `Health Percentage`, `Real Health`, or `Health Deficit`). Includes a smart truncation algorithm to preserve critical health numbers even if the unit name is too long. +* **Non-Mana Resource Tracking:** Added a new toggle in the General Options tab to track secondary resources (Energy, Rage, Focus) for non-mana classes. Bars are dynamically color-coded based on the resource type. +* **Dropdown UI Initialization Fix:** Resolved a Vanilla API bug where dropdown menus sharing an ID (like the new Health Text dropdown) would temporarily inherit text from previously loaded dropdowns (e.g., "Modern Flat"). + **1.3.3** * **Chat Panel Refactor:** Completely replaced the spell selection dropdowns in the Chat tab with manual text input boxes, allowing users to type exact spell names (with or without ranks) directly, matching the behavior of the key-bindings configuration. Fixed a string matching bug caused by Vanilla WoW's hidden trailing spaces when comparing spell names, ensuring that both rankless (e.g. `Flash Heal`) and ranked inputs trigger correctly. From 86e0e0b18a584c92d7958dedf131bff7bb5e5d44 Mon Sep 17 00:00:00 2001 From: Bluewhale1337 <295648290+Bluewhale1337@users.noreply.github.com> Date: Fri, 10 Jul 2026 23:13:48 +0200 Subject: [PATCH 6/9] Refactor: rename global variables and constants with HealBot prefix and register MODIFIER_STATE_CHANGED event --- HealBot.lua | 598 +++++++++++++++++----------------- HealBot_BonusScanner.lua | 28 +- HealBot_Controller_Events.lua | 46 +-- HealBot_Controller_Spells.lua | 70 ++-- HealBot_Localization.de.lua | 62 ++-- HealBot_Localization.en.lua | 68 ++-- HealBot_Localization.fr.lua | 62 ++-- HealBot_Localization.kr.lua | 64 ++-- README.md | 2 + 9 files changed, 504 insertions(+), 496 deletions(-) diff --git a/HealBot.lua b/HealBot.lua index 4dde5cc..b26eae9 100644 --- a/HealBot.lua +++ b/HealBot.lua @@ -1,300 +1,300 @@ ---[[ - - HealBot Contined - -]] - --- local _scale=0; -- moved to HealBot_Controller_Range.lua -CalcEquipBonus=false; -HealBot_EquipChangeTimer = 0; -HealValue=0; -InitSpells=1; -local DebugDebuff=false; -Delay_RecalcParty=0; - - --- Debugging and Error functions moved to HealBot_Controller_Comms.lua - -function HealBot_TogglePanel(panel) - if (not panel) then return end - if ( panel:IsVisible() ) then - HideUIPanel(panel); - else - ShowUIPanel(panel); - end -end - -function HealBot_StartMoving(frame) - if ( not frame.isMoving ) and ( frame.isLocked ~= 1 ) then - frame:StartMoving(); - frame.isMoving = true; - end -end - -function HealBot_StopMoving(frame) - if ( frame.isMoving ) then - frame:StopMovingOrSizing(); - frame.isMoving = false; - end - if HealBot_Config.GrowUpwards==1 then - local left,bottom = HealBot_Action:GetLeft(),HealBot_Action:GetBottom(); - if left and bottom then - HealBot_Config.PanelAnchorX=left; - HealBot_Config.PanelAnchorY=bottom; - end --- HealBot_AddDebug("Pos X="..HealBot_Config.PanelAnchorX.." Pos Y="..HealBot_Config.PanelAnchorY) - end - -end - -function HealBot_SlashCmd(cmd) - if (cmd=="") then - HealBot_TogglePanel(HealBot_Action); - return - end - if (cmd=="options" or cmd=="opt" or cmd=="config" or cmd=="cfg") then - HealBot_TogglePanel(HealBot_Options); - return - end - if (cmd=="forms" or cmd=="form") then - local forms = GetNumShapeshiftForms(); - if forms and forms > 0 then - HealBot_AddChat("HealBot: Available shapeshift forms:"); - for i=1,forms do - local icon, name, active = GetShapeshiftFormInfo(i); - local actStr = "false" - if active then actStr = "true" end - HealBot_AddChat(" Form " .. i .. ": " .. (name or "nil") .. " | Icon: " .. (icon or "nil") .. " | Active: " .. actStr); - end - else - HealBot_AddChat("HealBot: No shapeshift forms found."); - end - return - end - - if (cmd=="reset" or cmd=="recalc" or cmd=="defaults") then - InitSpells=2; - HealBot_Options_Defaults_OnClick(HealBot_Options_Defaults); - return - end - if (cmd=="ui") then - ReloadUI(); - return; - end - if (cmd=="init") then - HealBot_RegisterThis(this); - end - if (cmd=="x") then - InitSpells=2; - NeedEquipUpdate=1 - HealBot_RecalcSpells(); - return; - end - if (cmd=="ver") then - local text=UnitName("player"); - HealBot_SendAddonMessage( "HealBot", ">> RequestVersion <<=>> "..text.." <<=>> nil <<" ); - return; - end - if (cmd=="chan") then - HealBot_AddDebug( "Channel active" ); - return; - end -end - --- HealBot_SendAddonMessage moved to HealBot_Controller_Comms.lua - -function HealBot_TargetName() - if UnitIsEnemy("target","player") then return nil end --- if not UnitPlayerControlled("target") then return nil end - if (UnitIsPlayer("target")) then - if UnitIsUnit("target","player") then return "player" end - if (UnitInParty("target")) then - for i=1,4 do - if UnitIsUnit("target","party"..i) then return "party"..i end - end - end - if (UnitInRaid("target")) then - for i=1,40 do - if UnitIsUnit("target","raid"..i) then return "raid"..i end - end - end - else - if UnitIsUnit("target","pet") then return "pet" end - if (UnitInParty("player")) then - for i=1,4 do - if UnitIsUnit("target","partypet"..i) then return "partypet"..i end - end - end - if (UnitInRaid("player")) then - for i=1,40 do - if UnitIsUnit("target","raidpet"..i) then return "raidpet"..i end - end - end - end - return nil -end - - - -function HealBot_PackBagSlot(bag,slot) - return bag*100+slot; -end - -function HealBot_UnpackBagSlot(bagslot) - return math.floor(bagslot/100),math.mod(bagslot,100); -end - -function HealBot_GetItemName(bag,slot) - local link = GetContainerItemLink(bag,slot); - if not link then return nil end; - local _,_,item = string.find(link,"%[(.*)%]"); - local _,count = GetContainerItemInfo(bag,slot); - return item,count; -end - -function HealBot_GetBagSlot(item) - local BagSlot,BestCount; - for bag=0,NUM_BAG_FRAMES do - for slot=1,GetContainerNumSlots(bag) do - local bagitem,count = HealBot_GetItemName(bag,slot); - if (item==bagitem) then - if not BestCount or BestCount>count then - BagSlot = HealBot_PackBagSlot(bag,slot); - BestCount = count; - end - end - end - end - return BagSlot; -end - -function HealBot_UseItem(item) - local bagslot = HealBot_GetBagSlot(item); - if not bagslot then return end; - local bag,slot = HealBot_UnpackBagSlot(bagslot); - local Link = GetContainerItemLink(bag,slot); - UseContainerItem(bag,slot); -end - --- Spell parsing and casting functions moved to HealBot_Controller_Spells.lua - -function HealBot_UnitClass(unit) - local playerClass, englishClass = UnitClass(unit); - return englishClass; -end - ----- HealBot_UnitAffected moved to HealBot_Controller_Aura.lua --- safer to use GameTooltip:SetUnitBuff and read the lines in the tooltip ... --- maybe make an additional GameTooltip frame if possible ? - --- Spell parsing, default setup, finding, casting, and recalculating functions moved to HealBot_Controller_Spells.lua - --------------------------------------------------------------------------------------------------- --- OnFoo functions --------------------------------------------------------------------------------------------------- - --- Event loop handlers and event dispatcher moved to HealBot_Controller_Events.lua - --- SpiBonus and GetBonus functions moved to HealBot_Controller_Spells.lua - -function HealBot_FindUnitID(unitname) - local text; - for _,unit in ipairs(HealBot_Action_HealGroup) do - text = UnitName(unit); - if text then - if text==unitname then - return unit; - end - end - end - for i=1,40 do - local unit = "raid"..i; - text = UnitName(unit); - if text then - if text==unitname then - return unit; - end - end - end - return nil; -end - -function HealBot_PlaySound(id) - if id==1 then - PlaySoundFile("Sound\\Doodad\\BellTollTribal.wav"); - elseif id==2 then - PlaySoundFile("Sound\\Spells\\Thorns.wav"); - elseif id==3 then - PlaySoundFile("Sound\\Doodad\\BellTollNightElf.wav"); - end -end - --- HealBot_InitSpells moved to HealBot_Controller_Spells.lua - -function HealBot_InitData() - HealBot_Skins = HealBot_Config.Skins; - if(CT_RegisterMod) then - CT_RegisterMod(HEALBOT_ADDON,"HealBot Options",5,"Interface\\AddOns\\HealBotBlue\\Images\\HealBot","Opens HealBot Options","off",nil,HealBot_ToggleOptions); - end - --- remove after 1.126 - local tmp=HealBot_Config.ShowHeader[HealBot_Config.Current_Skin] or 0 - HealBot_Config.ShowHeader[HealBot_Config.Current_Skin]=tmp - - HealBot_Options_CDCMonitor_Reset() - HealBot_Options_EmergencyFilter_Reset() - HealBot_Options_Debuff_Reset() -end - -function HealBot_ToggleOptions() - HealBot_TogglePanel(HealBot_Options) -end - --- HealBot_InitGetSpellData and HealBot_Generic_Patten moved to HealBot_Controller_Spells.lua - --- HealBot_Get_DebugChan moved to HealBot_Controller_Comms.lua - --- HealBot_Range_Check moved to HealBot_Controller_Range.lua - --------------------------------------------------------------------------------- --- Native Action Bar Hovercasting (Mouseover Hook) --------------------------------------------------------------------------------- -do - local pass = function() end - local orig = UseAction - function UseAction(slot, checkCursor, onSelf) - if HealBot_Config.ActionMouseover == 1 then - local mouseover = HealBot_Action_TooltipUnit - if mouseover and mouseover ~= 'target' then - local _PlaySound = PlaySound - local target = UnitName("target") - - PlaySound = pass - ClearTarget() - PlaySound = _PlaySound - - do - local autoSelfCast = GetCVar("autoSelfCast") - SetCVar("autoSelfCast", "0") -- Ensure disabled - orig(slot, checkCursor, onSelf) - if autoSelfCast then - SetCVar("autoSelfCast", autoSelfCast) - end - end - - SpellTargetUnit(mouseover) - - if target then - PlaySound = pass - TargetLastTarget() - PlaySound = _PlaySound - end - - return - end - end - orig(slot, checkCursor, onSelf) - end -end - +--[[ + + HealBot Contined + +]] + +-- local _scale=0; -- moved to HealBot_Controller_Range.lua +HealBot_CalcEquipBonus=false; +HealBot_EquipChangeTimer = 0; +HealBot_HealValue=0; +HealBot_SpellsInitFlag=1; +local DebugDebuff=false; +HealBot_Delay_RecalcParty=0; + + +-- Debugging and Error functions moved to HealBot_Controller_Comms.lua + +function HealBot_TogglePanel(panel) + if (not panel) then return end + if ( panel:IsVisible() ) then + HideUIPanel(panel); + else + ShowUIPanel(panel); + end +end + +function HealBot_StartMoving(frame) + if ( not frame.isMoving ) and ( frame.isLocked ~= 1 ) then + frame:StartMoving(); + frame.isMoving = true; + end +end + +function HealBot_StopMoving(frame) + if ( frame.isMoving ) then + frame:StopMovingOrSizing(); + frame.isMoving = false; + end + if HealBot_Config.GrowUpwards==1 then + local left,bottom = HealBot_Action:GetLeft(),HealBot_Action:GetBottom(); + if left and bottom then + HealBot_Config.PanelAnchorX=left; + HealBot_Config.PanelAnchorY=bottom; + end +-- HealBot_AddDebug("Pos X="..HealBot_Config.PanelAnchorX.." Pos Y="..HealBot_Config.PanelAnchorY) + end + +end + +function HealBot_SlashCmd(cmd) + if (cmd=="") then + HealBot_TogglePanel(HealBot_Action); + return + end + if (cmd=="options" or cmd=="opt" or cmd=="config" or cmd=="cfg") then + HealBot_TogglePanel(HealBot_Options); + return + end + if (cmd=="forms" or cmd=="form") then + local forms = GetNumShapeshiftForms(); + if forms and forms > 0 then + HealBot_AddChat("HealBot: Available shapeshift forms:"); + for i=1,forms do + local icon, name, active = GetShapeshiftFormInfo(i); + local actStr = "false" + if active then actStr = "true" end + HealBot_AddChat(" Form " .. i .. ": " .. (name or "nil") .. " | Icon: " .. (icon or "nil") .. " | Active: " .. actStr); + end + else + HealBot_AddChat("HealBot: No shapeshift forms found."); + end + return + end + + if (cmd=="reset" or cmd=="recalc" or cmd=="defaults") then + HealBot_SpellsInitFlag=2; + HealBot_Options_Defaults_OnClick(HealBot_Options_Defaults); + return + end + if (cmd=="ui") then + ReloadUI(); + return; + end + if (cmd=="init") then + HealBot_RegisterThis(this); + end + if (cmd=="x") then + HealBot_SpellsInitFlag=2; + NeedEquipUpdate=1 + HealBot_RecalcSpells(); + return; + end + if (cmd=="ver") then + local text=UnitName("player"); + HealBot_SendAddonMessage( "HealBot", ">> RequestVersion <<=>> "..text.." <<=>> nil <<" ); + return; + end + if (cmd=="chan") then + HealBot_AddDebug( "Channel active" ); + return; + end +end + +-- HealBot_SendAddonMessage moved to HealBot_Controller_Comms.lua + +function HealBot_TargetName() + if UnitIsEnemy("target","player") then return nil end +-- if not UnitPlayerControlled("target") then return nil end + if (UnitIsPlayer("target")) then + if UnitIsUnit("target","player") then return "player" end + if (UnitInParty("target")) then + for i=1,4 do + if UnitIsUnit("target","party"..i) then return "party"..i end + end + end + if (UnitInRaid("target")) then + for i=1,40 do + if UnitIsUnit("target","raid"..i) then return "raid"..i end + end + end + else + if UnitIsUnit("target","pet") then return "pet" end + if (UnitInParty("player")) then + for i=1,4 do + if UnitIsUnit("target","partypet"..i) then return "partypet"..i end + end + end + if (UnitInRaid("player")) then + for i=1,40 do + if UnitIsUnit("target","raidpet"..i) then return "raidpet"..i end + end + end + end + return nil +end + + + +function HealBot_PackBagSlot(bag,slot) + return bag*100+slot; +end + +function HealBot_UnpackBagSlot(bagslot) + return math.floor(bagslot/100),math.mod(bagslot,100); +end + +function HealBot_GetItemName(bag,slot) + local link = GetContainerItemLink(bag,slot); + if not link then return nil end; + local _,_,item = string.find(link,"%[(.*)%]"); + local _,count = GetContainerItemInfo(bag,slot); + return item,count; +end + +function HealBot_GetBagSlot(item) + local BagSlot,BestCount; + for bag=0,NUM_BAG_FRAMES do + for slot=1,GetContainerNumSlots(bag) do + local bagitem,count = HealBot_GetItemName(bag,slot); + if (item==bagitem) then + if not BestCount or BestCount>count then + BagSlot = HealBot_PackBagSlot(bag,slot); + BestCount = count; + end + end + end + end + return BagSlot; +end + +function HealBot_UseItem(item) + local bagslot = HealBot_GetBagSlot(item); + if not bagslot then return end; + local bag,slot = HealBot_UnpackBagSlot(bagslot); + local Link = GetContainerItemLink(bag,slot); + UseContainerItem(bag,slot); +end + +-- Spell parsing and casting functions moved to HealBot_Controller_Spells.lua + +function HealBot_UnitClass(unit) + local playerClass, englishClass = UnitClass(unit); + return englishClass; +end + +---- HealBot_UnitAffected moved to HealBot_Controller_Aura.lua +-- safer to use GameTooltip:SetUnitBuff and read the lines in the tooltip ... +-- maybe make an additional GameTooltip frame if possible ? + +-- Spell parsing, default setup, finding, casting, and recalculating functions moved to HealBot_Controller_Spells.lua + +-------------------------------------------------------------------------------------------------- +-- OnFoo functions +-------------------------------------------------------------------------------------------------- + +-- Event loop handlers and event dispatcher moved to HealBot_Controller_Events.lua + +-- SpiBonus and GetBonus functions moved to HealBot_Controller_Spells.lua + +function HealBot_FindUnitID(unitname) + local text; + for _,unit in ipairs(HealBot_Action_HealGroup) do + text = UnitName(unit); + if text then + if text==unitname then + return unit; + end + end + end + for i=1,40 do + local unit = "raid"..i; + text = UnitName(unit); + if text then + if text==unitname then + return unit; + end + end + end + return nil; +end + +function HealBot_PlaySound(id) + if id==1 then + PlaySoundFile("Sound\\Doodad\\BellTollTribal.wav"); + elseif id==2 then + PlaySoundFile("Sound\\Spells\\Thorns.wav"); + elseif id==3 then + PlaySoundFile("Sound\\Doodad\\BellTollNightElf.wav"); + end +end + +-- HealBot_InitSpells moved to HealBot_Controller_Spells.lua + +function HealBot_InitData() + HealBot_Skins = HealBot_Config.Skins; + if(CT_RegisterMod) then + CT_RegisterMod(HEALBOT_ADDON,"HealBot Options",5,"Interface\\AddOns\\HealBotBlue\\Images\\HealBot","Opens HealBot Options","off",nil,HealBot_ToggleOptions); + end + +-- remove after 1.126 + local tmp=HealBot_Config.ShowHeader[HealBot_Config.Current_Skin] or 0 + HealBot_Config.ShowHeader[HealBot_Config.Current_Skin]=tmp + + HealBot_Options_CDCMonitor_Reset() + HealBot_Options_EmergencyFilter_Reset() + HealBot_Options_Debuff_Reset() +end + +function HealBot_ToggleOptions() + HealBot_TogglePanel(HealBot_Options) +end + +-- HealBot_InitGetSpellData and HealBot_Generic_Patten moved to HealBot_Controller_Spells.lua + +-- HealBot_Get_DebugChan moved to HealBot_Controller_Comms.lua + +-- HealBot_Range_Check moved to HealBot_Controller_Range.lua + +-------------------------------------------------------------------------------- +-- Native Action Bar Hovercasting (Mouseover Hook) +-------------------------------------------------------------------------------- +do + local pass = function() end + local orig = UseAction + function UseAction(slot, checkCursor, onSelf) + if HealBot_Config.ActionMouseover == 1 then + local mouseover = HealBot_Action_TooltipUnit + if mouseover and mouseover ~= 'target' then + local _PlaySound = PlaySound + local target = UnitName("target") + + PlaySound = pass + ClearTarget() + PlaySound = _PlaySound + + do + local autoSelfCast = GetCVar("autoSelfCast") + SetCVar("autoSelfCast", "0") -- Ensure disabled + orig(slot, checkCursor, onSelf) + if autoSelfCast then + SetCVar("autoSelfCast", autoSelfCast) + end + end + + SpellTargetUnit(mouseover) + + if target then + PlaySound = pass + TargetLastTarget() + PlaySound = _PlaySound + end + + return + end + end + orig(slot, checkCursor, onSelf) + end +end + diff --git a/HealBot_BonusScanner.lua b/HealBot_BonusScanner.lua index ce1e08e..4cfbd9b 100644 --- a/HealBot_BonusScanner.lua +++ b/HealBot_BonusScanner.lua @@ -6,9 +6,9 @@ -- http://www.curse-gaming.com/mod.php?addid=2384 -------------------------------------------------- -HB_BONUSSCANNER_PATTERN_SETNAME = "^(.*) %(%d/%d%)$"; -HB_BONUSSCANNER_PATTERN_GENERIC_PREFIX = "^%+(%d+)%%?(.*)$"; -HB_BONUSSCANNER_PATTERN_GENERIC_SUFFIX = "^(.*)%+(%d+)%%?$"; +HEALBOT_BONUSSCANNER_PATTERN_SETNAME = "^(.*) %(%d/%d%)$"; +HEALBOT_BONUSSCANNER_PATTERN_GENERIC_PREFIX = "^%+(%d+)%%?(.*)$"; +HEALBOT_BONUSSCANNER_PATTERN_GENERIC_SUFFIX = "^(.*)%+(%d+)%%?$"; HealBot_BonusScanner = { bonuses = 0; @@ -128,17 +128,17 @@ end; function HealBot_BonusScanner:ScanLine(line) local tmpStr, found; - if(string.sub(line,0,string.len(HB_BONUSSCANNER_PREFIX_EQUIP)) == HB_BONUSSCANNER_PREFIX_EQUIP) then - tmpStr = string.sub(line,string.len(HB_BONUSSCANNER_PREFIX_EQUIP)+1); + if(string.sub(line,0,string.len(HEALBOT_BONUSSCANNER_PREFIX_EQUIP)) == HEALBOT_BONUSSCANNER_PREFIX_EQUIP) then + tmpStr = string.sub(line,string.len(HEALBOT_BONUSSCANNER_PREFIX_EQUIP)+1); HealBot_BonusScanner:CheckPassive(tmpStr); - elseif(string.sub(line,0,string.len(HB_BONUSSCANNER_PREFIX_SET)) == HB_BONUSSCANNER_PREFIX_SET + elseif(string.sub(line,0,string.len(HEALBOT_BONUSSCANNER_PREFIX_SET)) == HEALBOT_BONUSSCANNER_PREFIX_SET and HealBot_BonusScanner.temp.set ~= "" and not HealBot_BonusScanner.temp.sets[HealBot_BonusScanner.temp.set]) then - tmpStr = string.sub(line,string.len(HB_BONUSSCANNER_PREFIX_SET)+1); + tmpStr = string.sub(line,string.len(HEALBOT_BONUSSCANNER_PREFIX_SET)+1); HealBot_BonusScanner.temp.slot = "Set"; HealBot_BonusScanner:CheckPassive(tmpStr); else - _, _, tmpStr = string.find(line, HB_BONUSSCANNER_PATTERN_SETNAME); + _, _, tmpStr = string.find(line, HEALBOT_BONUSSCANNER_PATTERN_SETNAME); if(tmpStr) then HealBot_BonusScanner.temp.set = tmpStr; else @@ -154,7 +154,7 @@ function HealBot_BonusScanner:CheckPassive(line) local i, p, value, found; found = nil; - for i,p in HB_BONUSSCANNER_PATTERNS_PASSIVE do + for i,p in HEALBOT_BONUSSCANNER_PATTERNS_PASSIVE do _, _, value = string.find(line, "^" .. p.pattern); if(value) then HealBot_BonusScanner:AddValue(p.effect, value) @@ -183,9 +183,9 @@ function HealBot_BonusScanner:CheckGeneric(line) tmpStr = string.gsub( tmpStr, "%s+$", "" ); tmpStr = string.gsub( tmpStr, "%.$", "" ); - _, _, value, token = string.find(tmpStr, HB_BONUSSCANNER_PATTERN_GENERIC_PREFIX); + _, _, value, token = string.find(tmpStr, HEALBOT_BONUSSCANNER_PATTERN_GENERIC_PREFIX); if(not value) then - _, _, token, value = string.find(tmpStr, HB_BONUSSCANNER_PATTERN_GENERIC_SUFFIX); + _, _, token, value = string.find(tmpStr, HEALBOT_BONUSSCANNER_PATTERN_GENERIC_SUFFIX); end if(token and value) then token = string.gsub( token, "^%s+", "" ); @@ -202,8 +202,8 @@ end function HealBot_BonusScanner:CheckToken(token, value) local i, p, s1, s2; - if(HB_BONUSSCANNER_PATTERNS_GENERIC_LOOKUP[token]) then - HealBot_BonusScanner:AddValue(HB_BONUSSCANNER_PATTERNS_GENERIC_LOOKUP[token], value); + if(HEALBOT_BONUSSCANNER_PATTERNS_GENERIC_LOOKUP[token]) then + HealBot_BonusScanner:AddValue(HEALBOT_BONUSSCANNER_PATTERNS_GENERIC_LOOKUP[token], value); return true; end return false; @@ -212,7 +212,7 @@ end function HealBot_BonusScanner:CheckOther(line) local i, p, value, start, found; - for i,p in HB_BONUSSCANNER_PATTERNS_OTHER do + for i,p in HEALBOT_BONUSSCANNER_PATTERNS_OTHER do start, _, value = string.find(line, "^" .. p.pattern); if(start) then if(p.value) then diff --git a/HealBot_Controller_Events.lua b/HealBot_Controller_Events.lua index 3e0be1e..f294ee2 100644 --- a/HealBot_Controller_Events.lua +++ b/HealBot_Controller_Events.lua @@ -6,6 +6,7 @@ local HealBot_Timer1, HealsIn_Timer = 0, 0; function HealBot_OnLoad(this) this:RegisterEvent("VARIABLES_LOADED"); + this:RegisterEvent("MODIFIER_STATE_CHANGED"); SLASH_HEALBOT1 = "/healbot"; SLASH_HEALBOT2 = "/hb"; @@ -25,12 +26,12 @@ function HealBot_OnLoad(this) HealBot_View_DirtyUnits[unitID] = true end) HealBot_Model:RegisterObserver("ROSTER_CHANGED", function() - Delay_RecalcParty = 1 + HealBot_Delay_RecalcParty = 1 end) HealBot_Model:RegisterObserver("EQUIPMENT_CHANGED", function(unitID) if unitID == "player" then HealBot_BonusScanner:ScanEquipment() - CalcEquipBonus = true; + HealBot_CalcEquipBonus = true; HealBot_RecalcSpells(); end end) @@ -80,23 +81,23 @@ function HealBot_OnUpdate(this, arg1) if HealBot_EquipChangeTimer <= 0 then HealBot_EquipChangeTimer = 0 HealBot_BonusScanner:ScanEquipment() - CalcEquipBonus = true; + HealBot_CalcEquipBonus = true; HealBot_RecalcSpells(); end end - if InitSpells > 1 then - InitSpells = InitSpells + 1; - if InitSpells > 2 then + if HealBot_SpellsInitFlag > 1 then + HealBot_SpellsInitFlag = HealBot_SpellsInitFlag + 1; + if HealBot_SpellsInitFlag > 2 then local cnt = HealBot_InitSpells(); - InitSpells = 0; + HealBot_SpellsInitFlag = 0; HealBot_RecalcSpells(); end end - if Delay_RecalcParty > 0 then - Delay_RecalcParty = Delay_RecalcParty + 1 - if Delay_RecalcParty > 1 then - Delay_RecalcParty = 0; + if HealBot_Delay_RecalcParty > 0 then + HealBot_Delay_RecalcParty = HealBot_Delay_RecalcParty + 1 + if HealBot_Delay_RecalcParty > 1 then + HealBot_Delay_RecalcParty = 0; HealBot_RecalcParty(); end end @@ -178,6 +179,11 @@ local HealBot_EventHandlers = { ["VARIABLES_LOADED"] = function(this) HealBot_OnEvent_VariablesLoaded(this) end, + ["MODIFIER_STATE_CHANGED"] = function(this, arg1, arg2) + if HealBot_Action_TooltipUnit and HealBot_Tooltip:IsVisible() then + HealBot_Action_RefreshTooltip(HealBot_Action_TooltipUnit) + end + end, -- Legacy pass-throughs ["CHAT_MSG_ADDON"] = function(this, arg1, arg2, arg3, arg4) HealBot_OnEvent_AddonMsg(this, arg1, arg2, arg3, arg4) end, ["SPELLCAST_START"] = function(this, arg1, arg2) HealBot_OnEvent_SpellcastStart(this, arg1, arg2) end, @@ -299,7 +305,7 @@ function HealBot_OnEvent_VariablesLoaded(this) this:RegisterEvent("UPDATE_SHAPESHIFT_FORMS"); HealBot_UpdateShapeshiftForm(); end - InitSpells = 2; + HealBot_SpellsInitFlag = 2; end end @@ -319,7 +325,7 @@ end function HealBot_OnEvent_ZoneChanged(this) HealBot_ResetRangeScale(); - Delay_RecalcParty = 1; + HealBot_Delay_RecalcParty = 1; end function HealBot_OnEvent_PlayerRegenDisabled(this) @@ -359,7 +365,7 @@ end function HealBot_OnEvent_PlayerRegenEnabled(this) HealBot_IsFighting = false; - Delay_RecalcParty = 1; + HealBot_Delay_RecalcParty = 1; end function HealBot_OnEvent_PlayerTargetChanged(this) @@ -367,7 +373,7 @@ function HealBot_OnEvent_PlayerTargetChanged(this) end function HealBot_OnEvent_PartyMembersChanged(this) - Delay_RecalcParty = 1; + HealBot_Delay_RecalcParty = 1; end function HealBot_OnEvent_PartyMemberDisable(this, unit) @@ -376,9 +382,9 @@ end function HealBot_OnEvent_SystemMsg(this, msg) if type(msg) == "string" then - local tmpTest, tmpTest, deserter = string.find(msg, HB_HASLEFTRAID); + local tmpTest, tmpTest, deserter = string.find(msg, HEALBOT_HASLEFTRAID); if not deserter then - local tmpTest, tmpTest, deserter = string.find(msg, HB_HASLEFTPARTY); + local tmpTest, tmpTest, deserter = string.find(msg, HEALBOT_HASLEFTPARTY); end if deserter then if (HealBot_Healers[deserter]) then @@ -394,8 +400,8 @@ function HealBot_OnEvent_SystemMsg(this, msg) end end end - elseif msg == HB_YOULEAVETHEGROUP or msg == HB_YOULEAVETHERAID then - Delay_RecalcParty = 1; + elseif msg == HEALBOT_YOULEAVETHEGROUP or msg == HEALBOT_YOULEAVETHERAID then + HealBot_Delay_RecalcParty = 1; end end end @@ -417,7 +423,7 @@ end function HealBot_OnEvent_SpellsChanged(this, arg1) if arg1 then return; end HealBot_AddDebug("HB: SpellsChanged"); - InitSpells = 2; + HealBot_SpellsInitFlag = 2; end function HealBot_OnEvent_TalentsChanged(this, arg1) diff --git a/HealBot_Controller_Spells.lua b/HealBot_Controller_Spells.lua index db425aa..3c4f285 100644 --- a/HealBot_Controller_Spells.lua +++ b/HealBot_Controller_Spells.lua @@ -133,8 +133,8 @@ function HealBot_StartCasting(spell, target, ttype) end if ttype == "fired" and HealBot_Spells[spell] then if HealBot_Spells[spell].CastTime > 1 then - HealValue = HealBot_Spells[spell].HealsDur; - HealBot_SendAddonMessage(HEALBOT_ADDON_ID, ">> " .. UnitName(target) .. " <<=>> " .. HealValue .. " << "); + HealBot_HealValue = HealBot_Spells[spell].HealsDur; + HealBot_SendAddonMessage(HEALBOT_ADDON_ID, ">> " .. UnitName(target) .. " <<=>> " .. HealBot_HealValue .. " << "); end end end @@ -142,9 +142,9 @@ end function HealBot_StopCasting() if HealBot_CastingTarget then if HealBot_HealsIn[UnitName(HealBot_CastingTarget)] then - if HealValue > 0 then - HealBot_SendAddonMessage(HEALBOT_ADDON_ID, ">> " .. UnitName(HealBot_CastingTarget) .. " <<=>> " .. 0 - HealValue .. " << "); - HealValue = 0; + if HealBot_HealValue > 0 then + HealBot_SendAddonMessage(HEALBOT_ADDON_ID, ">> " .. UnitName(HealBot_CastingTarget) .. " <<=>> " .. 0 - HealBot_HealValue .. " << "); + HealBot_HealValue = 0; end end end @@ -297,13 +297,13 @@ end function HealBot_FindHealSpells() local id = 1; - if InitSpells > 0 then NeedEquipUpdate = 1; return; end + if HealBot_SpellsInitFlag > 0 then NeedEquipUpdate = 1; return; end HealBot_Heals = { player = {}, pet = {}, party = {} }; table.foreach(HealBot_CurrentSpells, function (index, spell) if (HealBot_Spells[spell]) then - if CalcEquipBonus then + if HealBot_CalcEquipBonus then local healingbonus_penalty = 1; if HealBot_Spells[spell].Level < 20 then healingbonus_penalty = (1 - ((20 - HealBot_Spells[spell].Level) * 0.0375)); @@ -358,10 +358,10 @@ function HealBot_FindHealSpells() HealBot_Heals["raidpet" .. i] = HealBot_Heals.party; end - if CalcEquipBonus then + if HealBot_CalcEquipBonus then HealBot_AddDebug("...Done Equip Bonus:" .. RealHealing); end - CalcEquipBonus = false; + HealBot_CalcEquipBonus = false; end function HealBot_CanCastSpell(spell, unit) @@ -471,7 +471,7 @@ function HealBot_InitGetSpellData(spell, id, class) tmpText = getglobal("HealBot_ScanTooltipTextLeft2"); if (tmpText:GetText()) then line = tmpText:GetText(); - tmpTest, tmpTest, _mana = string.find(line, HB_TOOLTIP_MANA); + tmpTest, tmpTest, _mana = string.find(line, HEALBOT_TOOLTIP_MANA); else HealBot_Report_Error("================================"); HealBot_Report_Error("ERROR: HealBot_ScanTooltip is lost"); @@ -481,7 +481,7 @@ function HealBot_InitGetSpellData(spell, id, class) tmpText = getglobal("HealBot_ScanTooltipTextRight2"); if (tmpText:GetText()) then line = tmpText:GetText(); - tmpTest, tmpTest, _range = string.find(line, HB_TOOLTIP_RANGE); + tmpTest, tmpTest, _range = string.find(line, HEALBOT_TOOLTIP_RANGE); else HealBot_Report_Error("================================"); HealBot_Report_Error("ERROR: HealBot_ScanTooltip is lost"); @@ -492,12 +492,12 @@ function HealBot_InitGetSpellData(spell, id, class) _cast = nil; if (tmpText:GetText()) then line = tmpText:GetText(); - if (line == HB_TOOLTIP_INSTANT_CAST) then + if (line == HEALBOT_TOOLTIP_INSTANT_CAST) then _cast = 0; - elseif line == HB_TOOLTIP_CHANNELED then + elseif line == HEALBOT_TOOLTIP_CHANNELED then _cast = 0; elseif (tmpText) then - tmpTest, tmpTest, _cast = string.find(line, HB_TOOLTIP_CAST_TIME); + tmpTest, tmpTest, _cast = string.find(line, HEALBOT_TOOLTIP_CAST_TIME); end else HealBot_Report_Error("================================"); @@ -511,58 +511,58 @@ function HealBot_InitGetSpellData(spell, id, class) line = tmpText:GetText(); if class == "PRIEST" then if string.sub(spell, 1, 14) == string.sub(HEALBOT_POWER_WORD_SHIELD, 1, 14) then - tmpTest, tmpTest, _HealsMin, _shield = string.find(line, HB_SPELL_PATTERN_SHIELD); + tmpTest, tmpTest, _HealsMin, _shield = string.find(line, HEALBOT_SPELL_PATTERN_SHIELD); _HealsExt = 0; _HealsMax = _HealsMin; elseif string.sub(spell, 1, 4) == string.sub(HEALBOT_RENEW, 1, 4) then - tmpTest, tmpTest, _HealsExt, tmpTest, _duration = string.find(line, HB_SPELL_PATTERN_RENEW); + tmpTest, tmpTest, _HealsExt, tmpTest, _duration = string.find(line, HEALBOT_SPELL_PATTERN_RENEW); _HealsMin = 0; _HealsMax = 0; if (_HealsExt == nil) then - tmpTest, tmpTest, _HealsExt, _duration = string.find(line, HB_SPELL_PATTERN_RENEW1); + tmpTest, tmpTest, _HealsExt, _duration = string.find(line, HEALBOT_SPELL_PATTERN_RENEW1); end if (_HealsExt == nil) then - tmpTest, tmpTest, _duration, _HealsExt = string.find(line, HB_SPELL_PATTERN_RENEW2); + tmpTest, tmpTest, _duration, _HealsExt = string.find(line, HEALBOT_SPELL_PATTERN_RENEW2); end if (_HealsExt == nil) then - tmpTest, tmpTest, _duration, _HealsExt = string.find(line, HB_SPELL_PATTERN_RENEW3); + tmpTest, tmpTest, _duration, _HealsExt = string.find(line, HEALBOT_SPELL_PATTERN_RENEW3); end elseif string.sub(spell, 1, 9) == string.sub(HEALBOT_LESSER_HEAL, 1, 9) then - tmpTest, _HealsMin, _HealsMax = HealBot_Generic_Patten(line, HB_SPELL_PATTERN_LESSER_HEAL); + tmpTest, _HealsMin, _HealsMax = HealBot_Generic_Patten(line, HEALBOT_SPELL_PATTERN_LESSER_HEAL); elseif string.sub(spell, 1, 9) == string.sub(HEALBOT_GREATER_HEAL, 1, 9) then - tmpTest, _HealsMin, _HealsMax = HealBot_Generic_Patten(line, HB_SPELL_PATTERN_GREATER_HEAL); + tmpTest, _HealsMin, _HealsMax = HealBot_Generic_Patten(line, HEALBOT_SPELL_PATTERN_GREATER_HEAL); elseif string.sub(spell, 1, 9) == string.sub(HEALBOT_FLASH_HEAL, 1, 9) then - tmpTest, _HealsMin, _HealsMax = HealBot_Generic_Patten(line, HB_SPELL_PATTERN_FLASH_HEAL); + tmpTest, _HealsMin, _HealsMax = HealBot_Generic_Patten(line, HEALBOT_SPELL_PATTERN_FLASH_HEAL); elseif string.sub(spell, 1, 4) == string.sub(HEALBOT_HEAL, 1, 4) then - tmpTest, _HealsMin, _HealsMax = HealBot_Generic_Patten(line, HB_SPELL_PATTERN_HEAL); + tmpTest, _HealsMin, _HealsMax = HealBot_Generic_Patten(line, HEALBOT_SPELL_PATTERN_HEAL); end elseif class == "DRUID" then if string.sub(spell, 1, 6) == string.sub(HEALBOT_REGROWTH, 1, 6) then - tmpTest, tmpTest, _HealsMin, _HealsMax, _HealsExt = string.find(line, HB_SPELL_PATTERN_REGROWTH); + tmpTest, tmpTest, _HealsMin, _HealsMax, _HealsExt = string.find(line, HEALBOT_SPELL_PATTERN_REGROWTH); if (tmpTest == nil) then - tmpTest, tmpTest, _HealsMin, _HealsMax, tmpTest, _HealsExt = string.find(line, HB_SPELL_PATTERN_REGROWTH1); + tmpTest, tmpTest, _HealsMin, _HealsMax, tmpTest, _HealsExt = string.find(line, HEALBOT_SPELL_PATTERN_REGROWTH1); end elseif string.sub(spell, 1, 9) == string.sub(HEALBOT_REJUVENATION, 1, 9) then - tmpTest, tmpTest, _HealsExt, _duration = string.find(line, HB_SPELL_PATTERN_REJUVENATION); + tmpTest, tmpTest, _HealsExt, _duration = string.find(line, HEALBOT_SPELL_PATTERN_REJUVENATION); _HealsMin = 0; _HealsMax = 0; if (_HealsExt == nil) then - tmpTest, tmpTest, _HealsExt, tmpTest, _duration = string.find(line, HB_SPELL_PATTERN_REJUVENATION1); + tmpTest, tmpTest, _HealsExt, tmpTest, _duration = string.find(line, HEALBOT_SPELL_PATTERN_REJUVENATION1); end elseif string.sub(spell, 1, 7) == string.sub(HEALBOT_HEALING_TOUCH, 1, 7) then - tmpTest, _HealsMin, _HealsMax = HealBot_Generic_Patten(line, HB_SPELL_PATTERN_HEALING_TOUCH); + tmpTest, _HealsMin, _HealsMax = HealBot_Generic_Patten(line, HEALBOT_SPELL_PATTERN_HEALING_TOUCH); end elseif class == "PALADIN" then if string.sub(spell, 1, 9) == string.sub(HEALBOT_HOLY_LIGHT, 1, 9) then - tmpTest, _HealsMin, _HealsMax = HealBot_Generic_Patten(line, HB_SPELL_PATTERN_HOLY_LIGHT); + tmpTest, _HealsMin, _HealsMax = HealBot_Generic_Patten(line, HEALBOT_SPELL_PATTERN_HOLY_LIGHT); elseif string.sub(spell, 1, 9) == string.sub(HEALBOT_FLASH_OF_LIGHT, 1, 9) then - tmpTest, _HealsMin, _HealsMax = HealBot_Generic_Patten(line, HB_SPELL_PATTERN_FLASH_OF_LIGHT); + tmpTest, _HealsMin, _HealsMax = HealBot_Generic_Patten(line, HEALBOT_SPELL_PATTERN_FLASH_OF_LIGHT); end elseif class == "SHAMAN" then if string.sub(spell, 1, 9) == string.sub(HEALBOT_HEALING_WAVE, 1, 9) then - tmpTest, _HealsMin, _HealsMax = HealBot_Generic_Patten(line, HB_SPELL_PATTERN_HEALING_WAVE); + tmpTest, _HealsMin, _HealsMax = HealBot_Generic_Patten(line, HEALBOT_SPELL_PATTERN_HEALING_WAVE); elseif string.sub(spell, 1, 9) == string.sub(HEALBOT_LESSER_HEALING_WAVE, 1, 9) then - tmpTest, _HealsMin, _HealsMax = HealBot_Generic_Patten(line, HB_SPELL_PATTERN_LESSER_HEALING_WAVE); + tmpTest, _HealsMin, _HealsMax = HealBot_Generic_Patten(line, HEALBOT_SPELL_PATTERN_LESSER_HEALING_WAVE); end end else @@ -578,7 +578,7 @@ function HealBot_InitGetSpellData(spell, id, class) if HealBot_ScanTooltipTextLeft2:GetText() then HealBot_Report_Error("ERROR: Tooltip = >> " .. HealBot_ScanTooltipTextLeft2:GetText() .. " <<"); end - HealBot_Report_Error("ERROR: Patten = >> " .. HB_TOOLTIP_MANA .. " <<"); + HealBot_Report_Error("ERROR: Patten = >> " .. HEALBOT_TOOLTIP_MANA .. " <<"); end if (_range == nil) then HealBot_Report_Error("================================"); @@ -587,7 +587,7 @@ function HealBot_InitGetSpellData(spell, id, class) if HealBot_ScanTooltipTextRight2:GetText() then HealBot_Report_Error("ERROR: Tooltip = >> " .. HealBot_ScanTooltipTextRight2:GetText() .. " <<"); end - HealBot_Report_Error("ERROR: Patten = >> " .. HB_TOOLTIP_RANGE .. " <<"); + HealBot_Report_Error("ERROR: Patten = >> " .. HEALBOT_TOOLTIP_RANGE .. " <<"); end if (_cast == nil) then HealBot_Report_Error("================================"); @@ -596,7 +596,7 @@ function HealBot_InitGetSpellData(spell, id, class) if HealBot_ScanTooltipTextLeft3:GetText() then HealBot_Report_Error("ERROR: Tooltip = >> " .. HealBot_ScanTooltipTextLeft3:GetText() .. " <<"); end - HealBot_Report_Error("ERROR: Patten = >> " .. HB_TOOLTIP_CAST_TIME .. " <<"); + HealBot_Report_Error("ERROR: Patten = >> " .. HEALBOT_TOOLTIP_CAST_TIME .. " <<"); end if (tmpTest == nil) then HealBot_Report_Error("================================"); diff --git a/HealBot_Localization.de.lua b/HealBot_Localization.de.lua index 560f05a..aaf38ea 100644 --- a/HealBot_Localization.de.lua +++ b/HealBot_Localization.de.lua @@ -113,25 +113,25 @@ HEALBOT_RANK_11 = " (Rang 11)"; HEALBOT_LIBRARY_INCHEAL = "Erh\195\182ht durch Zauber und Effekte verursachte Heilung um bis zu (%d+)%."; HEALBOT_LIBRARY_INCDAMHEAL = "Erh\195\182ht durch Zauber und magische Effekte zugef\195\188gten Schaden und Heilung um bis zu (%d+)%."; -HB_BONUSSCANNER_NAMES = { +HEALBOT_BONUSSCANNER_NAMES = { HEAL = "Heilung", } -HB_BONUSSCANNER_PREFIX_EQUIP = "Anlegen: "; -HB_BONUSSCANNER_PREFIX_SET = "Set: "; +HEALBOT_BONUSSCANNER_PREFIX_EQUIP = "Anlegen: "; +HEALBOT_BONUSSCANNER_PREFIX_SET = "Set: "; -HB_BONUSSCANNER_PATTERNS_PASSIVE = { +HEALBOT_BONUSSCANNER_PATTERNS_PASSIVE = { { pattern = "Erh\195\182ht durch Zauber und magische Effekte zugef\195\188gten Schaden und Heilung um bis zu (%d+)%.", effect = {"HEAL","DMG"} }, { pattern = "Erh\195\182ht durch Zauber und Effekte verursachte Heilung um bis zu (%d+)%.", effect = "HEAL" }, { pattern = "Erh\195\182ht die durch Zauber und Effekte verursachte Heilung um bis zu (%d+)%.", effect = "HEAL" }, }; -HB_BONUSSCANNER_PATTERNS_GENERIC_LOOKUP = { +HEALBOT_BONUSSCANNER_PATTERNS_GENERIC_LOOKUP = { ["Heilzauber"] = "HEAL", ["Heilung und Zauberschaden"] = {"HEAL","DMG"}, }; -HB_BONUSSCANNER_PATTERNS_OTHER = { +HEALBOT_BONUSSCANNER_PATTERNS_OTHER = { { pattern = "Zandalarianisches Siegel des Mojo", effect = {"DMG", "HEAL"}, value = 18 }, { pattern = "Zandalarianisches Siegel der Inneren Ruhe", effect = "HEAL", value = 33 }, @@ -154,32 +154,32 @@ HEALBOT_DEBUFF_WEAKENED_SOUL = "Interface\\Icons\\Spell_Holy_AshesToAshes"; HEALBOT_DEBUFF_RECENTLY_BANDAGED = "Interface\\Icons\\INV_Misc_Bandage_08"; -HB_SPELL_PATTERN_LESSER_HEAL = "Euer Ziel um (%d+) bis (%d+) Punkt%(e%) heilen"; -HB_SPELL_PATTERN_HEAL = "Euer Ziel um (%d+) bis (%d+) Punkt%(e%) heilen"; -HB_SPELL_PATTERN_GREATER_HEAL = "Ein langsam zu wirkender Zauber, der ein einzelnes Ziel um (%d+) bis (%d+) Punkt%(e%) heilt"; -HB_SPELL_PATTERN_FLASH_HEAL = "Heilt ein befreundetes Ziel um (%d+) bis (%d+) Punkt%(e%)"; -HB_SPELL_PATTERN_RENEW2 = "Heilt das Ziel (%d+) Sek. lang um (%d+) bis (%d+) Schadenspunk"; -HB_SPELL_PATTERN_RENEW3 = "Heilt das Ziel (%d+) Sek. lang um (%d+) Schadenspunk"; -HB_SPELL_PATTERN_SHIELD = "absorbiert dabei (%d+) Punkt%(e%) Schaden. H\195\164lt (%d+) Sek"; -HB_SPELL_PATTERN_HEALING_TOUCH = "Heilt ein befreundetes Ziel um (%d+) bis (%d+) Punkt%(e%)"; -HB_SPELL_PATTERN_REGROWTH = "Heilt ein befreundetes Ziel um (%d+) bis (%d+) und \195\188ber (%d+) Sek%. um weitere (%d+)"; -HB_SPELL_PATTERN_REGROWTH1 = "Heilt ein befreundetes Ziel um (%d+) bis (%d+) und \195\188ber (%d+) Sek%. um weitere (%d+) bis (%d+)"; -HB_SPELL_PATTERN_HOLY_LIGHT = "Heilt ein befreundetes Ziel um (%d+) bis (%d+) Punkt%(e%)"; -HB_SPELL_PATTERN_FLASH_OF_LIGHT = "Heilt ein befreundetes Ziel um (%d+) bis (%d+) Punkt%(e%)"; -HB_SPELL_PATTERN_HEALING_WAVE = "Heilt ein befreundetes Ziel um (%d+) bis (%d+) Punkt%(e%)"; -HB_SPELL_PATTERN_LESSER_HEALING_WAVE = "Heilt ein befreundetes Ziel um (%d+) bis (%d+) Punkt%(e%)"; -HB_SPELL_PATTERN_REJUVENATION = "Heilt das Ziel von (%d+) \195\188ber (%d+) Sek"; -HB_SPELL_PATTERN_REJUVENATION1 = "Heilt das Ziel von (%d+) bis (%d+) \195\188ber (%d+) Sek"; +HEALBOT_SPELL_PATTERN_LESSER_HEAL = "Euer Ziel um (%d+) bis (%d+) Punkt%(e%) heilen"; +HEALBOT_SPELL_PATTERN_HEAL = "Euer Ziel um (%d+) bis (%d+) Punkt%(e%) heilen"; +HEALBOT_SPELL_PATTERN_GREATER_HEAL = "Ein langsam zu wirkender Zauber, der ein einzelnes Ziel um (%d+) bis (%d+) Punkt%(e%) heilt"; +HEALBOT_SPELL_PATTERN_FLASH_HEAL = "Heilt ein befreundetes Ziel um (%d+) bis (%d+) Punkt%(e%)"; +HEALBOT_SPELL_PATTERN_RENEW2 = "Heilt das Ziel (%d+) Sek. lang um (%d+) bis (%d+) Schadenspunk"; +HEALBOT_SPELL_PATTERN_RENEW3 = "Heilt das Ziel (%d+) Sek. lang um (%d+) Schadenspunk"; +HEALBOT_SPELL_PATTERN_SHIELD = "absorbiert dabei (%d+) Punkt%(e%) Schaden. H\195\164lt (%d+) Sek"; +HEALBOT_SPELL_PATTERN_HEALING_TOUCH = "Heilt ein befreundetes Ziel um (%d+) bis (%d+) Punkt%(e%)"; +HEALBOT_SPELL_PATTERN_REGROWTH = "Heilt ein befreundetes Ziel um (%d+) bis (%d+) und \195\188ber (%d+) Sek%. um weitere (%d+)"; +HEALBOT_SPELL_PATTERN_REGROWTH1 = "Heilt ein befreundetes Ziel um (%d+) bis (%d+) und \195\188ber (%d+) Sek%. um weitere (%d+) bis (%d+)"; +HEALBOT_SPELL_PATTERN_HOLY_LIGHT = "Heilt ein befreundetes Ziel um (%d+) bis (%d+) Punkt%(e%)"; +HEALBOT_SPELL_PATTERN_FLASH_OF_LIGHT = "Heilt ein befreundetes Ziel um (%d+) bis (%d+) Punkt%(e%)"; +HEALBOT_SPELL_PATTERN_HEALING_WAVE = "Heilt ein befreundetes Ziel um (%d+) bis (%d+) Punkt%(e%)"; +HEALBOT_SPELL_PATTERN_LESSER_HEALING_WAVE = "Heilt ein befreundetes Ziel um (%d+) bis (%d+) Punkt%(e%)"; +HEALBOT_SPELL_PATTERN_REJUVENATION = "Heilt das Ziel von (%d+) \195\188ber (%d+) Sek"; +HEALBOT_SPELL_PATTERN_REJUVENATION1 = "Heilt das Ziel von (%d+) bis (%d+) \195\188ber (%d+) Sek"; -HB_TOOLTIP_MANA = "^(%d+) Mana$"; -HB_TOOLTIP_RANGE = "(%d+) m"; -HB_TOOLTIP_INSTANT_CAST = "Spontanzauber"; -HB_TOOLTIP_CAST_TIME = "(%d+.?%d*) Sek"; -HB_TOOLTIP_CHANNELED = "Abgebrochen"; -HB_HASLEFTRAID = "^([^%s]+) hat die \195\131\197\147berfallgruppe verlassen%.$"; -HB_HASLEFTPARTY = "^([^%s]+) hat die Gruppe verlassen"; -HB_YOULEAVETHEGROUP = "Du hast die Gruppe verlassen" -HB_YOULEAVETHERAID = "Du hast den Schlachtzug verlassen" +HEALBOT_TOOLTIP_MANA = "^(%d+) Mana$"; +HEALBOT_TOOLTIP_RANGE = "(%d+) m"; +HEALBOT_TOOLTIP_INSTANT_CAST = "Spontanzauber"; +HEALBOT_TOOLTIP_CAST_TIME = "(%d+.?%d*) Sek"; +HEALBOT_TOOLTIP_CHANNELED = "Abgebrochen"; +HEALBOT_HASLEFTRAID = "^([^%s]+) hat die \195\131\197\147berfallgruppe verlassen%.$"; +HEALBOT_HASLEFTPARTY = "^([^%s]+) hat die Gruppe verlassen"; +HEALBOT_YOULEAVETHEGROUP = "Du hast die Gruppe verlassen" +HEALBOT_YOULEAVETHERAID = "Du hast den Schlachtzug verlassen" ----------------- -- Translation -- diff --git a/HealBot_Localization.en.lua b/HealBot_Localization.en.lua index eb3ee61..117b106 100644 --- a/HealBot_Localization.en.lua +++ b/HealBot_Localization.en.lua @@ -131,19 +131,19 @@ 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 = { +HEALBOT_BONUSSCANNER_NAMES = { HEAL = "Healing", }; -HB_BONUSSCANNER_PREFIX_EQUIP = "Equip: "; -HB_BONUSSCANNER_PREFIX_SET = "Set: "; +HEALBOT_BONUSSCANNER_PREFIX_EQUIP = "Equip: "; +HEALBOT_BONUSSCANNER_PREFIX_SET = "Set: "; -HB_BONUSSCANNER_PATTERNS_PASSIVE = { +HEALBOT_BONUSSCANNER_PATTERNS_PASSIVE = { { pattern = "Increases healing done by spells and effects by up to (%d+)%.", effect = "HEAL" }, { pattern = "Increases damage and healing done by magical spells and effects by up to (%d+)%.", effect = {"HEAL", "DMG"} }, }; -HB_BONUSSCANNER_PATTERNS_GENERIC_LOOKUP = { +HEALBOT_BONUSSCANNER_PATTERNS_GENERIC_LOOKUP = { ["Healing Spells"] = "HEAL", ["Increases Healing"] = "HEAL", ["Healing and Spell Damage"] = {"HEAL", "DMG"}, @@ -151,7 +151,7 @@ HB_BONUSSCANNER_PATTERNS_GENERIC_LOOKUP = { ["Spell Damage and Healing"] = {"HEAL", "DMG"}, }; -HB_BONUSSCANNER_PATTERNS_OTHER = { +HEALBOT_BONUSSCANNER_PATTERNS_OTHER = { { pattern = "Zandalar Signet of Mojo", effect = {"DMG", "HEAL"}, value = 18 }, { pattern = "Zandalar Signet of Serenity", effect = "HEAL", value = 33 }, @@ -173,35 +173,35 @@ HEALBOT_DEBUFF_WEAKENED_SOUL = "Interface\\Icons\\Spell_Holy_AshesToAshes"; HEALBOT_DEBUFF_RECENTLY_BANDAGED = "Interface\\Icons\\INV_Misc_Bandage_08"; -HB_SPELL_PATTERN_LESSER_HEAL = "Heal your target for (%d+) to (%d+)"; -HB_SPELL_PATTERN_HEAL = "Heal your target for (%d+) to (%d+)"; -HB_SPELL_PATTERN_GREATER_HEAL = "A slow casting spell that heals a single target for (%d+) to (%d+)"; -HB_SPELL_PATTERN_FLASH_HEAL = "Heals a friendly target for (%d+) to (%d+)"; -HB_SPELL_PATTERN_RENEW = "Heals the target of (%d+) to (%d+) damage over (%d+) sec"; -HB_SPELL_PATTERN_RENEW1 = "Heals the target of (%d+) damage over (%d+) sec"; -HB_SPELL_PATTERN_RENEW2 = "Not needed for en"; -HB_SPELL_PATTERN_RENEW3 = "Not needed for en"; -HB_SPELL_PATTERN_SHIELD = "absorbing (%d+) damage. Lasts (%d+) sec."; -HB_SPELL_PATTERN_HEALING_TOUCH = "Heals a friendly target for (%d+) to (%d+)"; -HB_SPELL_PATTERN_REGROWTH = "Heals a friendly target for (%d+) to (%d+) and another (%d+) over (%d+) sec"; -HB_SPELL_PATTERN_REGROWTH1 = "Heals a friendly target for (%d+) to (%d+) and another (%d+) to (%d+) over (%d+) sec"; -HB_SPELL_PATTERN_HOLY_LIGHT = "Heals a friendly target for (%d+) to (%d+)"; -HB_SPELL_PATTERN_FLASH_OF_LIGHT = "Heals a friendly target for (%d+) to (%d+)"; -HB_SPELL_PATTERN_HEALING_WAVE = "Heals a friendly target for (%d+) to (%d+)"; -HB_SPELL_PATTERN_LESSER_HEALING_WAVE = "Heals a friendly target for (%d+) to (%d+)"; -HB_SPELL_PATTERN_REJUVENATION = "Heals the target for (%d+) over (%d+) sec"; -HB_SPELL_PATTERN_REJUVENATION1 = "Heals the target for (%d+) to (%d+) over (%d+) sec"; -HB_SPELL_PATTERN_MEND_PET = "Heals your pet (%d+) health every second while you focus. Lasts (%d+) sec"; +HEALBOT_SPELL_PATTERN_LESSER_HEAL = "Heal your target for (%d+) to (%d+)"; +HEALBOT_SPELL_PATTERN_HEAL = "Heal your target for (%d+) to (%d+)"; +HEALBOT_SPELL_PATTERN_GREATER_HEAL = "A slow casting spell that heals a single target for (%d+) to (%d+)"; +HEALBOT_SPELL_PATTERN_FLASH_HEAL = "Heals a friendly target for (%d+) to (%d+)"; +HEALBOT_SPELL_PATTERN_RENEW = "Heals the target of (%d+) to (%d+) damage over (%d+) sec"; +HEALBOT_SPELL_PATTERN_RENEW1 = "Heals the target of (%d+) damage over (%d+) sec"; +HEALBOT_SPELL_PATTERN_RENEW2 = "Not needed for en"; +HEALBOT_SPELL_PATTERN_RENEW3 = "Not needed for en"; +HEALBOT_SPELL_PATTERN_SHIELD = "absorbing (%d+) damage. Lasts (%d+) sec."; +HEALBOT_SPELL_PATTERN_HEALING_TOUCH = "Heals a friendly target for (%d+) to (%d+)"; +HEALBOT_SPELL_PATTERN_REGROWTH = "Heals a friendly target for (%d+) to (%d+) and another (%d+) over (%d+) sec"; +HEALBOT_SPELL_PATTERN_REGROWTH1 = "Heals a friendly target for (%d+) to (%d+) and another (%d+) to (%d+) over (%d+) sec"; +HEALBOT_SPELL_PATTERN_HOLY_LIGHT = "Heals a friendly target for (%d+) to (%d+)"; +HEALBOT_SPELL_PATTERN_FLASH_OF_LIGHT = "Heals a friendly target for (%d+) to (%d+)"; +HEALBOT_SPELL_PATTERN_HEALING_WAVE = "Heals a friendly target for (%d+) to (%d+)"; +HEALBOT_SPELL_PATTERN_LESSER_HEALING_WAVE = "Heals a friendly target for (%d+) to (%d+)"; +HEALBOT_SPELL_PATTERN_REJUVENATION = "Heals the target for (%d+) over (%d+) sec"; +HEALBOT_SPELL_PATTERN_REJUVENATION1 = "Heals the target for (%d+) to (%d+) over (%d+) sec"; +HEALBOT_SPELL_PATTERN_MEND_PET = "Heals your pet (%d+) health every second while you focus. Lasts (%d+) sec"; -HB_TOOLTIP_MANA = "^(%d+) Mana$"; -HB_TOOLTIP_RANGE = "(%d+) yd range"; -HB_TOOLTIP_INSTANT_CAST = "Instant cast"; -HB_TOOLTIP_CAST_TIME = "(%d+.?%d*) sec cast"; -HB_TOOLTIP_CHANNELED = "Channeled"; -HB_HASLEFTRAID = "^([^%s]+) has left the raid group$"; -HB_HASLEFTPARTY = "^([^%s]+) leaves the party$"; -HB_YOULEAVETHEGROUP = "You leave the group." -HB_YOULEAVETHERAID = "You have left the raid group" +HEALBOT_TOOLTIP_MANA = "^(%d+) Mana$"; +HEALBOT_TOOLTIP_RANGE = "(%d+) yd range"; +HEALBOT_TOOLTIP_INSTANT_CAST = "Instant cast"; +HEALBOT_TOOLTIP_CAST_TIME = "(%d+.?%d*) sec cast"; +HEALBOT_TOOLTIP_CHANNELED = "Channeled"; +HEALBOT_HASLEFTRAID = "^([^%s]+) has left the raid group$"; +HEALBOT_HASLEFTPARTY = "^([^%s]+) leaves the party$"; +HEALBOT_YOULEAVETHEGROUP = "You leave the group." +HEALBOT_YOULEAVETHERAID = "You have left the raid group" ----------------- diff --git a/HealBot_Localization.fr.lua b/HealBot_Localization.fr.lua index ab27dfc..599b70e 100644 --- a/HealBot_Localization.fr.lua +++ b/HealBot_Localization.fr.lua @@ -112,14 +112,14 @@ HEALBOT_RANK_11 = " (Rang 11)"; HEALBOT_LIBRARY_INCHEAL = "Increases healing done by spells and effects by up to (%d+)%."; -- *************** needs French translation *************** HEALBOT_LIBRARY_INCDAMHEAL = "Increases damage and healing done by magical spells and effects by up to (%d+)%."; -- *************** needs French translation *************** -HB_BONUSSCANNER_NAMES = { +HEALBOT_BONUSSCANNER_NAMES = { HEAL = "Soins", }; -HB_BONUSSCANNER_PREFIX_EQUIP = "Equip\195\169 : "; -HB_BONUSSCANNER_PREFIX_SET = "Complet : "; +HEALBOT_BONUSSCANNER_PREFIX_EQUIP = "Equip\195\169 : "; +HEALBOT_BONUSSCANNER_PREFIX_SET = "Complet : "; -HB_BONUSSCANNER_PATTERNS_PASSIVE = { +HEALBOT_BONUSSCANNER_PATTERNS_PASSIVE = { { pattern = "Augmente les effets des sorts de soins de (%d+)% au maximum.", effect = "HEAL" }, { pattern = "Augmente les soins prodigu\195\169s par les sorts et effets de (%d+)% au maximum.", effect = "HEAL"}, { pattern = "Augmente les d\195\169g\195\162ts et les soins prodigu\195\169s par les sortsfalseles effets magiques de (%d+)% au maximum.", effect = "HEAL" }, @@ -127,39 +127,39 @@ HB_BONUSSCANNER_PATTERNS_PASSIVE = { }; -HB_BONUSSCANNER_PATTERNS_GENERIC_LOOKUP = { +HEALBOT_BONUSSCANNER_PATTERNS_GENERIC_LOOKUP = { ["Sorts de Soins"] = "HEAL", ["D\195\169g\195\162ts et soins "] = {"HEAL", "DMG"}, }; -HB_SPELL_PATTERN_LESSER_HEAL = "Soigne la cible de (%d+) \195\160 (%d+) points de vie"; -HB_SPELL_PATTERN_HEAL = "Soigne la cible de (%d+) \195\160 (%d+) points de vie"; -HB_SPELL_PATTERN_GREATER_HEAL = "Une longue incantation qui rend (%d+) \195\160 (%d+) points de vie \195\160 une cible unique"; -HB_SPELL_PATTERN_FLASH_HEAL = "Rend (%d+) \195\160 (%d+) points de vie"; -HB_SPELL_PATTERN_RENEW = "Rend (%d+) \195\160 (%d+) points de vie \195\160 la cible en (%d+) sec"; -HB_SPELL_PATTERN_RENEW1 = "Rend (%d+) points de vie \195\160 la cible en (%d+) sec"; -HB_SPELL_PATTERN_HEALING_TOUCH = "Rend (%d+) \195\160 (%d+) points de vie"; -HB_SPELL_PATTERN_REGROWTH = "Soigne une cible amie pour (%d+) \195\160 (%d+) puis pour (%d+) points suppl.+mentaires pendant (%d+) sec"; -HB_SPELL_PATTERN_REGROWTH1 = "Soigne une cible amie pour (%d+) \195\160 (%d+) puis pour (%d+) \195\160 (%d+) points suppl.+mentaires pendant (%d+) sec"; -HB_SPELL_PATTERN_HOLY_LIGHT = "Rend (%d+) \195\160 (%d+) points de vie"; -HB_SPELL_PATTERN_FLASH_OF_LIGHT = "Rend (%d+) \195\160 (%d+) points de vie"; -HB_SPELL_PATTERN_HEALING_WAVE = "Rend (%d+) \195\160 (%d+) points de vie"; -HB_SPELL_PATTERN_LESSER_HEALING_WAVE = "Rend (%d+) \195\160 (%d+) points de vie"; -HB_SPELL_PATTERN_REJUVENATION = "Soigne la cible de (%d+) durant (%d+) sec"; -HB_SPELL_PATTERN_REJUVENATION1 = "Soigne la cible de (%d+) a (%d+) durant (%d+) sec"; -HB_SPELL_PATTERN_SHIELD = "absorbe (%d+) points de d\195\169g\195\162ts. Dure (%d+) sec"; -HB_SPELL_PATTERN_MEND_PET = "Soigne votre compagnon de (%d+) points de vie chaques secondes que vous le ciblez. Dure (%d+) sec" +HEALBOT_SPELL_PATTERN_LESSER_HEAL = "Soigne la cible de (%d+) \195\160 (%d+) points de vie"; +HEALBOT_SPELL_PATTERN_HEAL = "Soigne la cible de (%d+) \195\160 (%d+) points de vie"; +HEALBOT_SPELL_PATTERN_GREATER_HEAL = "Une longue incantation qui rend (%d+) \195\160 (%d+) points de vie \195\160 une cible unique"; +HEALBOT_SPELL_PATTERN_FLASH_HEAL = "Rend (%d+) \195\160 (%d+) points de vie"; +HEALBOT_SPELL_PATTERN_RENEW = "Rend (%d+) \195\160 (%d+) points de vie \195\160 la cible en (%d+) sec"; +HEALBOT_SPELL_PATTERN_RENEW1 = "Rend (%d+) points de vie \195\160 la cible en (%d+) sec"; +HEALBOT_SPELL_PATTERN_HEALING_TOUCH = "Rend (%d+) \195\160 (%d+) points de vie"; +HEALBOT_SPELL_PATTERN_REGROWTH = "Soigne une cible amie pour (%d+) \195\160 (%d+) puis pour (%d+) points suppl.+mentaires pendant (%d+) sec"; +HEALBOT_SPELL_PATTERN_REGROWTH1 = "Soigne une cible amie pour (%d+) \195\160 (%d+) puis pour (%d+) \195\160 (%d+) points suppl.+mentaires pendant (%d+) sec"; +HEALBOT_SPELL_PATTERN_HOLY_LIGHT = "Rend (%d+) \195\160 (%d+) points de vie"; +HEALBOT_SPELL_PATTERN_FLASH_OF_LIGHT = "Rend (%d+) \195\160 (%d+) points de vie"; +HEALBOT_SPELL_PATTERN_HEALING_WAVE = "Rend (%d+) \195\160 (%d+) points de vie"; +HEALBOT_SPELL_PATTERN_LESSER_HEALING_WAVE = "Rend (%d+) \195\160 (%d+) points de vie"; +HEALBOT_SPELL_PATTERN_REJUVENATION = "Soigne la cible de (%d+) durant (%d+) sec"; +HEALBOT_SPELL_PATTERN_REJUVENATION1 = "Soigne la cible de (%d+) a (%d+) durant (%d+) sec"; +HEALBOT_SPELL_PATTERN_SHIELD = "absorbe (%d+) points de d\195\169g\195\162ts. Dure (%d+) sec"; +HEALBOT_SPELL_PATTERN_MEND_PET = "Soigne votre compagnon de (%d+) points de vie chaques secondes que vous le ciblez. Dure (%d+) sec" -HB_TOOLTIP_MANA = "^Mana : (%d+)$"; -HB_TOOLTIP_INSTANT_CAST = 'Incantation imm\195\169diate'; -HB_TOOLTIP_CAST_TIME = '(%d+.?%d*) sec'; +HEALBOT_TOOLTIP_MANA = "^Mana : (%d+)$"; +HEALBOT_TOOLTIP_INSTANT_CAST = 'Incantation imm\195\169diate'; +HEALBOT_TOOLTIP_CAST_TIME = '(%d+.?%d*) sec'; -HB_TOOLTIP_RANGE = "de (%d+) m" -HB_TOOLTIP_CHANNELED = "Focaliser" -HB_HASLEFTRAID = "^([^%s]+) a quitt\195\131\194\169 le groupe de raid$"; -HB_HASLEFTPARTY = "^([^%s]+) has left the party$"; -- *************** needs French translation *************** -HB_YOULEAVETHEGROUP = "You leave the group" -- *************** needs translation *************** -HB_YOULEAVETHERAID = "You have left the raid group" -- *************** needs translation *************** +HEALBOT_TOOLTIP_RANGE = "de (%d+) m" +HEALBOT_TOOLTIP_CHANNELED = "Focaliser" +HEALBOT_HASLEFTRAID = "^([^%s]+) a quitt\195\131\194\169 le groupe de raid$"; +HEALBOT_HASLEFTPARTY = "^([^%s]+) has left the party$"; -- *************** needs French translation *************** +HEALBOT_YOULEAVETHEGROUP = "You leave the group" -- *************** needs translation *************** +HEALBOT_YOULEAVETHERAID = "You have left the raid group" -- *************** needs translation *************** ----------------- -- Translation -- diff --git a/HealBot_Localization.kr.lua b/HealBot_Localization.kr.lua index 60852b8..5a1e153 100644 --- a/HealBot_Localization.kr.lua +++ b/HealBot_Localization.kr.lua @@ -97,20 +97,20 @@ HEALBOT_GREATER_BLESSING_OF_SALVATION = "상급 구원의 축복"; HEALBOT_LIBRARY_INCHEAL = "모든 주문 및 효과에 의한 치유량이 최대 (%d+)만큼 증가합니다%."; HEALBOT_LIBRARY_INCDAMHEAL = "모든 주문 및 효과에 의한 피해와 치유량이 최대 (%d+)만큼 증가합니다%."; - HB_BONUSSCANNER_NAMES = { + HEALBOT_BONUSSCANNER_NAMES = { HEAL = "치유량", }; - HB_BONUSSCANNER_PREFIX_EQUIP = "착용 효과: "; - HB_BONUSSCANNER_PREFIX_SET = "세트 효과: "; + HEALBOT_BONUSSCANNER_PREFIX_EQUIP = "착용 효과: "; + HEALBOT_BONUSSCANNER_PREFIX_SET = "세트 효과: "; - HB_BONUSSCANNER_PATTERNS_PASSIVE = { + HEALBOT_BONUSSCANNER_PATTERNS_PASSIVE = { { pattern = "모든 주문 및 효과에 의한 치유량이 최대 (%d+)만큼 증가합니다%.", effect = "HEAL" }, { pattern = "주문과 효과에 의한 치유량이 최대 (%d+)만큼 증가합니다%.", effect = "HEAL" }, { pattern = "모든 주문 및 효과에 의한 피해와 치유량이 최대 (%d+)만큼 증가합니다%.", effect = {"HEAL", "DMG"} }, }; - HB_BONUSSCANNER_PATTERNS_GENERIC_LOOKUP = { + HEALBOT_BONUSSCANNER_PATTERNS_GENERIC_LOOKUP = { ["치유 주문"] = "HEAL", ["치유량 증가"] = "HEAL", ["치유 효과 증가"] = "HEAL", @@ -120,7 +120,7 @@ HEALBOT_GREATER_BLESSING_OF_SALVATION = "상급 구원의 축복"; ["치유 및 공격 주문 위력"] = {"HEAL", "DMG"}, }; - HB_BONUSSCANNER_PATTERNS_OTHER = { + HEALBOT_BONUSSCANNER_PATTERNS_OTHER = { { pattern = "잔달라 모조의 인장", effect = {"DMG", "HEAL"}, value = 18 }, { pattern = "잔달라 평온의 인장", effect = "HEAL", value = 33 }, @@ -132,33 +132,33 @@ HEALBOT_GREATER_BLESSING_OF_SALVATION = "상급 구원의 축복"; { pattern = "반짝이는 마나 오일", effect = { "MANAREG", "HEAL"}, value = {12, 25} }, }; - HB_SPELL_PATTERN_LESSER_HEAL = "대상의 생명력을 (%d+)~(%d+)만큼 회복시킵니다"; - HB_SPELL_PATTERN_HEAL = "대상의 생명력을 (%d+)~(%d+)만큼 회복시킵니다"; - HB_SPELL_PATTERN_GREATER_HEAL = "대상의 생명력을 (%d+)~(%d+)만큼 회복시킵니다"; - HB_SPELL_PATTERN_FLASH_HEAL = "대상의 생명력을 (%d+)~(%d+)만큼 회복시킵니다"; - HB_SPELL_PATTERN_RENEW = "(%d+)초에 걸쳐 대상의 생명력을 총 (%d+)~(%d+)만큼 회복시킵니다"; - HB_SPELL_PATTERN_RENEW1 = "(%d+)초에 걸쳐 대상의 생명력을 총 (%d+)만큼 회복시킵니다"; - HB_SPELL_PATTERN_SHIELD = "(%d+)의 피해를 흡수합니다. (%d+)초 동안 지속됩니다."; - HB_SPELL_PATTERN_HEALING_TOUCH = "대상의 생명력을 (%d+)~(%d+)만큼 회복시킵니다"; - HB_SPELL_PATTERN_REGROWTH = "대상의 생명력을 (%d+)~(%d+)만큼 회복시키고 추가로 (%d+)초에 걸쳐 총 (%d+)의 생명력을 회복시킵니다"; - HB_SPELL_PATTERN_REGROWTH1 = "대상의 생명력을 (%d+)~(%d+)만큼 회복시키고 추가로 (%d+)초에 걸쳐 총 (%d+)~(%d+)의 생명력을 회복시킵니다"; - HB_SPELL_PATTERN_HOLY_LIGHT = "대상의 생명력을 (%d+)~(%d+)만큼 회복시킵니다"; - HB_SPELL_PATTERN_FLASH_OF_LIGHT = "대상의 생명력을 (%d+)~(%d+)만큼 회복시킵니다"; - HB_SPELL_PATTERN_HEALING_WAVE = "대상의 생명력을 (%d+)~(%d+)만큼 회복시킵니다"; - HB_SPELL_PATTERN_LESSER_HEALING_WAVE = "대상의 생명력을 (%d+)~(%d+)만큼 회복시킵니다"; - HB_SPELL_PATTERN_REJUVENATION = "(%d+)에 걸쳐 (%d+)의 생명력을 회복시킵니다"; - HB_SPELL_PATTERN_REJUVENATION1 = "(%d+)에 걸쳐 (%d+)~(%d+)의 생명력을 회복시킵니다"; - HB_SPELL_PATTERN_MEND_PET = "야수에 정신을 집중하는 동안 매초마다 (%d+)의 생명력을 치료합니다"; + HEALBOT_SPELL_PATTERN_LESSER_HEAL = "대상의 생명력을 (%d+)~(%d+)만큼 회복시킵니다"; + HEALBOT_SPELL_PATTERN_HEAL = "대상의 생명력을 (%d+)~(%d+)만큼 회복시킵니다"; + HEALBOT_SPELL_PATTERN_GREATER_HEAL = "대상의 생명력을 (%d+)~(%d+)만큼 회복시킵니다"; + HEALBOT_SPELL_PATTERN_FLASH_HEAL = "대상의 생명력을 (%d+)~(%d+)만큼 회복시킵니다"; + HEALBOT_SPELL_PATTERN_RENEW = "(%d+)초에 걸쳐 대상의 생명력을 총 (%d+)~(%d+)만큼 회복시킵니다"; + HEALBOT_SPELL_PATTERN_RENEW1 = "(%d+)초에 걸쳐 대상의 생명력을 총 (%d+)만큼 회복시킵니다"; + HEALBOT_SPELL_PATTERN_SHIELD = "(%d+)의 피해를 흡수합니다. (%d+)초 동안 지속됩니다."; + HEALBOT_SPELL_PATTERN_HEALING_TOUCH = "대상의 생명력을 (%d+)~(%d+)만큼 회복시킵니다"; + HEALBOT_SPELL_PATTERN_REGROWTH = "대상의 생명력을 (%d+)~(%d+)만큼 회복시키고 추가로 (%d+)초에 걸쳐 총 (%d+)의 생명력을 회복시킵니다"; + HEALBOT_SPELL_PATTERN_REGROWTH1 = "대상의 생명력을 (%d+)~(%d+)만큼 회복시키고 추가로 (%d+)초에 걸쳐 총 (%d+)~(%d+)의 생명력을 회복시킵니다"; + HEALBOT_SPELL_PATTERN_HOLY_LIGHT = "대상의 생명력을 (%d+)~(%d+)만큼 회복시킵니다"; + HEALBOT_SPELL_PATTERN_FLASH_OF_LIGHT = "대상의 생명력을 (%d+)~(%d+)만큼 회복시킵니다"; + HEALBOT_SPELL_PATTERN_HEALING_WAVE = "대상의 생명력을 (%d+)~(%d+)만큼 회복시킵니다"; + HEALBOT_SPELL_PATTERN_LESSER_HEALING_WAVE = "대상의 생명력을 (%d+)~(%d+)만큼 회복시킵니다"; + HEALBOT_SPELL_PATTERN_REJUVENATION = "(%d+)에 걸쳐 (%d+)의 생명력을 회복시킵니다"; + HEALBOT_SPELL_PATTERN_REJUVENATION1 = "(%d+)에 걸쳐 (%d+)~(%d+)의 생명력을 회복시킵니다"; + HEALBOT_SPELL_PATTERN_MEND_PET = "야수에 정신을 집중하는 동안 매초마다 (%d+)의 생명력을 치료합니다"; - HB_TOOLTIP_MANA = "^마나 (%d+)$"; - HB_TOOLTIP_RANGE = "(%d+)미터"; - HB_TOOLTIP_INSTANT_CAST = "즉시 시전"; - HB_TOOLTIP_CAST_TIME = "(%d+.?%d*)초"; - HB_TOOLTIP_CHANNELED = "채널링"; - HB_HASLEFTRAID = "^([^%s]+)님이 공격대를 떠났습니다$"; - HB_HASLEFTPARTY = "^([^%s]+)님이 파티를 떠났습니다$"; - HB_YOULEAVETHEGROUP = "당신은 파티를 떠났습니다" - HB_YOULEAVETHERAID = "공격대를 떠났습니다" + HEALBOT_TOOLTIP_MANA = "^마나 (%d+)$"; + HEALBOT_TOOLTIP_RANGE = "(%d+)미터"; + HEALBOT_TOOLTIP_INSTANT_CAST = "즉시 시전"; + HEALBOT_TOOLTIP_CAST_TIME = "(%d+.?%d*)초"; + HEALBOT_TOOLTIP_CHANNELED = "채널링"; + HEALBOT_HASLEFTRAID = "^([^%s]+)님이 공격대를 떠났습니다$"; + HEALBOT_HASLEFTPARTY = "^([^%s]+)님이 파티를 떠났습니다$"; + HEALBOT_YOULEAVETHEGROUP = "당신은 파티를 떠났습니다" + HEALBOT_YOULEAVETHERAID = "공격대를 떠났습니다" ----------------- -- Translation -- diff --git a/README.md b/README.md index 0eb1f5a..71feba3 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,8 @@ Default installation path: `C:\Program Files\World of Warcraft\Interface\AddOns\ * **Customizable Health Text:** Added a new dropdown in the Healing Options tab that allows users to choose how health text is displayed on unit frames (`Name Only`, `Health Percentage`, `Real Health`, or `Health Deficit`). Includes a smart truncation algorithm to preserve critical health numbers even if the unit name is too long. * **Non-Mana Resource Tracking:** Added a new toggle in the General Options tab to track secondary resources (Energy, Rage, Focus) for non-mana classes. Bars are dynamically color-coded based on the resource type. * **Dropdown UI Initialization Fix:** Resolved a Vanilla API bug where dropdown menus sharing an ID (like the new Health Text dropdown) would temporarily inherit text from previously loaded dropdowns (e.g., "Modern Flat"). +* **Dynamic Modifier Tooltips:** Fixed a bug where the spell tooltip would not dynamically update its spells when pressing modifier keys (Shift/Ctrl/Alt) while hovering over a unit frame. Registered the `MODIFIER_STATE_CHANGED` event to instantly refresh the tooltip. +* **Global Variable Namespace Refactoring:** Executed a codebase-wide refactoring to encapsulate all floating global variables inside the `HealBot_` or `HEALBOT_` namespace. This prevents HealBot from silently shadowing other addons or the native WoW API, ensuring strict adherence to Vanilla Lua best practices. (Also resolved a namespace collision with `InitSpells`). **1.3.3** From a1aa1a4c1dfa3abaf9655ae2c74fa7fa71a93891 Mon Sep 17 00:00:00 2001 From: Bluewhale1337 <295648290+Bluewhale1337@users.noreply.github.com> Date: Sat, 11 Jul 2026 11:06:27 +0200 Subject: [PATCH 7/9] feat: add spell cast announcements with target validation for resurrections and added announcements for hoovercasting (mousover frames) --- HealBot.lua | 12 ++++++++++ HealBot_Controller_Spells.lua | 42 +++++++++++++++++++++++------------ 2 files changed, 40 insertions(+), 14 deletions(-) diff --git a/HealBot.lua b/HealBot.lua index b26eae9..62360c5 100644 --- a/HealBot.lua +++ b/HealBot.lua @@ -276,10 +276,22 @@ do do local autoSelfCast = GetCVar("autoSelfCast") SetCVar("autoSelfCast", "0") -- Ensure disabled + + local spellName = nil + if not GetActionText(slot) then + HealBot_ScanTooltip:SetOwner(HealBot_ScanTooltip, "ANCHOR_NONE") + HealBot_ScanTooltip:SetAction(slot) + spellName = HealBot_ScanTooltipTextLeft1 and HealBot_ScanTooltipTextLeft1:GetText() + end + orig(slot, checkCursor, onSelf) if autoSelfCast then SetCVar("autoSelfCast", autoSelfCast) end + + if spellName and HealBot_AnnounceCast then + HealBot_AnnounceCast(spellName, mouseover) + end end SpellTargetUnit(mouseover) diff --git a/HealBot_Controller_Spells.lua b/HealBot_Controller_Spells.lua index 3c4f285..1677da2 100644 --- a/HealBot_Controller_Spells.lua +++ b/HealBot_Controller_Spells.lua @@ -74,20 +74,14 @@ function HealBot_CastSpellByName(spell) CastSpell(id, BOOKTYPE_SPELL); end -function HealBot_StartCasting(spell, target, ttype) - HealBot_CastSpellByName(spell); - HealBot_CastingSpell = spell; - HealBot_CastingTarget = target; - if ( SpellCanTargetUnit(target) ) then - SpellTargetUnit(target); - ttype = "fired"; - elseif SpellIsTargeting() then - SpellTargetUnit(target); - SpellStopTargeting() - elseif ttype == "direct" then - if ( CheckInteractDistance(target, 4) ) then - ttype = "fired"; - end +function HealBot_AnnounceCast(spell, target) + if not spell or not target then return end + + if UnitIsDeadOrGhost(target) then + local spellLower = string.lower(spell) + if not (string.find(spellLower, "resurrection") or string.find(spellLower, "ancestral spirit") or string.find(spellLower, "redemption") or string.find(spellLower, "rebirth")) then + return + end end if HealBot_Config.ChatMessages then @@ -131,6 +125,26 @@ function HealBot_StartCasting(spell, target, ttype) end end end +end + +function HealBot_StartCasting(spell, target, ttype) + HealBot_CastSpellByName(spell); + HealBot_CastingSpell = spell; + HealBot_CastingTarget = target; + if ( SpellCanTargetUnit(target) ) then + SpellTargetUnit(target); + ttype = "fired"; + elseif SpellIsTargeting() then + SpellTargetUnit(target); + SpellStopTargeting() + elseif ttype == "direct" then + if ( CheckInteractDistance(target, 4) ) then + ttype = "fired"; + end + end + + HealBot_AnnounceCast(spell, target) + if ttype == "fired" and HealBot_Spells[spell] then if HealBot_Spells[spell].CastTime > 1 then HealBot_HealValue = HealBot_Spells[spell].HealsDur; From 4678236cc0bf0f6dd1e2dc8dba7e0a878958d7d9 Mon Sep 17 00:00:00 2001 From: Bluewhale1337 <295648290+Bluewhale1337@users.noreply.github.com> Date: Sat, 11 Jul 2026 15:21:28 +0200 Subject: [PATCH 8/9] feat: add Enlighten spell support and update localization files --- HealBot_Controller_Aura.lua | 1 + HealBot_Data.lua | 1 + HealBot_Localization.de.lua | 3 +++ HealBot_Localization.en.lua | 1 + HealBot_Localization.fr.lua | 3 +++ HealBot_Localization.kr.lua | 3 +++ 6 files changed, 12 insertions(+) diff --git a/HealBot_Controller_Aura.lua b/HealBot_Controller_Aura.lua index 0172e3c..b527d95 100644 --- a/HealBot_Controller_Aura.lua +++ b/HealBot_Controller_Aura.lua @@ -129,6 +129,7 @@ function HealBot_OnEvent_UnitAura(this, unit) ["Interface\\Icons\\Spell_Holy_PowerWordShield"] = true, ["Interface\\Icons\\Spell_Holy_SealOfProtection"] = true, ["Interface\\Icons\\Spell_Holy_Excorcism"] = true, + ["Interface\\Icons\\btnholyscriptures"] = true, } local i = 1; diff --git a/HealBot_Data.lua b/HealBot_Data.lua index 0f58f29..d41f83d 100644 --- a/HealBot_Data.lua +++ b/HealBot_Data.lua @@ -514,6 +514,7 @@ HealBot_Buff_Spells = { HEALBOT_PRAYER_OF_SHADOW_PROTECTION, HEALBOT_INNER_FIRE, HEALBOT_FEAR_WARD, + HEALBOT_ENLIGHTEN, }, [HEALBOT_MAGE] = { HEALBOT_ARCANE_INTELLECT, diff --git a/HealBot_Localization.de.lua b/HealBot_Localization.de.lua index aaf38ea..80cea1b 100644 --- a/HealBot_Localization.de.lua +++ b/HealBot_Localization.de.lua @@ -70,6 +70,9 @@ HEALBOT_LESSER_HEAL = "Geringes Heilen"; HEALBOT_LESSER_HEALING_WAVE = "Geringe Welle der Heilung"; HEALBOT_MEND_PET = "Tier Heilen"; HEALBOT_POWER_WORD_SHIELD = "Machtwort: Schild"; +HEALBOT_INNER_FIRE = "Inneres Feuer"; +HEALBOT_FEAR_WARD = "Furchtzauberschutz"; +HEALBOT_ENLIGHTEN = "Enlighten"; HEALBOT_REGROWTH = "Nachwachsen"; HEALBOT_RENEW = "Erneuerung"; HEALBOT_REJUVENATION = "Verj\195\188ngung"; diff --git a/HealBot_Localization.en.lua b/HealBot_Localization.en.lua index 117b106..e979c13 100644 --- a/HealBot_Localization.en.lua +++ b/HealBot_Localization.en.lua @@ -93,6 +93,7 @@ HEALBOT_THORNS = "Thorns"; HEALBOT_OMEN_OF_CLARITY = "Omen of Clarity"; HEALBOT_INNER_FIRE = "Inner Fire"; HEALBOT_FEAR_WARD = "Fear Ward"; +HEALBOT_ENLIGHTEN = "Enlighten"; HEALBOT_RESURRECTION = "Resurrection"; HEALBOT_REDEMPTION = "Redemption"; diff --git a/HealBot_Localization.fr.lua b/HealBot_Localization.fr.lua index 599b70e..f53e386 100644 --- a/HealBot_Localization.fr.lua +++ b/HealBot_Localization.fr.lua @@ -61,6 +61,9 @@ HEALBOT_FLASH_HEAL = "Soins rapides"; HEALBOT_FLASH_OF_LIGHT = "Eclair lumineux"; HEALBOT_HOLY_SHOCK = "Holy Shock"; HEALBOT_GREATER_HEAL = "Soins sup\195\169rieurs"; +HEALBOT_INNER_FIRE = "Feu int\195\169rieur"; +HEALBOT_FEAR_WARD = "Gardien de peur"; +HEALBOT_ENLIGHTEN = "Enlighten"; HEALBOT_HEALING_TOUCH = "Toucher gu\195\169risseur"; HEALBOT_HEAL = "Soins"; HEALBOT_HEALING_WAVE = "Vague de soins"; diff --git a/HealBot_Localization.kr.lua b/HealBot_Localization.kr.lua index 5a1e153..765ff36 100644 --- a/HealBot_Localization.kr.lua +++ b/HealBot_Localization.kr.lua @@ -61,6 +61,9 @@ HEALBOT_PRAYER_OF_HEALING = "치유의 기원"; HEALBOT_CHAIN_HEAL = "연쇄 치유"; HEALBOT_POWER_WORD_FORTITUDE = "신의 권능: 인내"; +HEALBOT_INNER_FIRE = "내면의 열정"; +HEALBOT_FEAR_WARD = "공포의 결계"; +HEALBOT_ENLIGHTEN = "Enlighten"; HEALBOT_MARK_OF_THE_WILD = "야생의 징표"; HEALBOT_GREATER_BLESSING_OF_SALVATION = "상급 구원의 축복"; From eec5745dbba9e501ee608d4b8136367c344d9ffa Mon Sep 17 00:00:00 2001 From: Bluewhale1337 <295648290+Bluewhale1337@users.noreply.github.com> Date: Sun, 12 Jul 2026 00:20:04 +0200 Subject: [PATCH 9/9] Update of readme --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 71feba3..e5f6c42 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,9 @@ Default installation path: `C:\Program Files\World of Warcraft\Interface\AddOns\ * **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). +* **Pet & Familiar Frames:** Dedicated, toggleable frames for tracking and healing player pets. +* **Customizable Health Text:** Dynamic unit health display (Name Only, Percentage, Real Health, or Health Deficit). +* **Non-Mana Resource Tracking:** Track Rage, Energy, and Focus for non-mana classes. * **Highly Customizable Skins:** Fully configure dimensions (width, height), row spacing, column layouts, custom textures, opacity, class-colored frames, and outline of fonts. ### Known issues @@ -41,6 +44,8 @@ Default installation path: `C:\Program Files\World of Warcraft\Interface\AddOns\ * **Dropdown UI Initialization Fix:** Resolved a Vanilla API bug where dropdown menus sharing an ID (like the new Health Text dropdown) would temporarily inherit text from previously loaded dropdowns (e.g., "Modern Flat"). * **Dynamic Modifier Tooltips:** Fixed a bug where the spell tooltip would not dynamically update its spells when pressing modifier keys (Shift/Ctrl/Alt) while hovering over a unit frame. Registered the `MODIFIER_STATE_CHANGED` event to instantly refresh the tooltip. * **Global Variable Namespace Refactoring:** Executed a codebase-wide refactoring to encapsulate all floating global variables inside the `HealBot_` or `HEALBOT_` namespace. This prevents HealBot from silently shadowing other addons or the native WoW API, ensuring strict adherence to Vanilla Lua best practices. (Also resolved a namespace collision with `InitSpells`). +* **Chat Announcements & Mouseover Casts:** Chat announcements are now correctly fired when using native Hovercasting (Mouseover). Additionally, added safety checks to prevent spamming chat announcements when accidentally clicking on a dead player (unless casting a resurrection spell). +* **New Priest Buff (Enlighten):** Added the custom "Enlighten" buff to Priest trackable buffs, complete with the `btnholyscriptures` icon on unit frames. **1.3.3**