54 Commits

Author SHA1 Message Date
Bluewhale1337 caa3a03bc3 Merge pull request #10 from Bluewhale1337/dev
hotfix: add pet frame color support and update documentation with lat…
2026-07-21 19:02:19 +02:00
Bluewhale1337 2b1ccb03c5 hotfix: add pet frame color support and update documentation with latest feature set 2026-07-21 19:01:34 +02:00
Bluewhale1337 5340eb253a Merge pull request #9 from Bluewhale1337/dev
Merge pull request #8 from Bluewhale1337/main
2026-07-21 13:52:32 +02:00
Bluewhale1337 bbff4a461c Merge branch 'dev' of https://github.com/Bluewhale1337/HealBotBlue into dev 2026-07-21 13:51:55 +02:00
Bluewhale1337 40ad96ae07 bump version to 1.6.0 in HealBotBlue.toc 2026-07-21 13:51:51 +02:00
Bluewhale1337 611f584b8d docs: update version to v1.6 in changelog 2026-07-21 13:50:07 +02:00
Bluewhale1337 5f015c89e5 Merge branch 'main' of https://github.com/Bluewhale1337/HealBotBlue 2026-07-21 13:48:03 +02:00
Bluewhale1337 e20c5baf74 docs: remove redundant trailing space in README version history 2026-07-21 13:48:00 +02:00
Bluewhale1337 9fd6f47946 Merge pull request #8 from Bluewhale1337/main
Hotfix merge
2026-07-21 13:44:13 +02:00
Bluewhale1337 1f339a8da5 Merge branch 'dev' into main
Signed-off-by: Bluewhale1337 <295648290+Bluewhale1337@users.noreply.github.com>
2026-07-21 13:40:02 +02:00
Bluewhale1337 00f9c3d485 fix(ui): center text, fix menu overlap, relabel extra to raid (hotfix 1.5.1) 2026-07-21 13:28:55 +02:00
Bluewhale1337 41e4a15075 feat: read version dynamically from TOC file 2026-07-21 13:26:43 +02:00
Bluewhale1337 026d4093aa refactor: optimize event processing, move global UI buttons, and reorganize options layout 2026-07-21 11:21:35 +02:00
Bluewhale1337 db07c467a3 chore: dynamically fetch version from add-on metadata instead of hardcoding 2026-07-21 09:31:55 +02:00
Bluewhale1337 c47d17f790 feat: implement auto-swap profile system and add safety null checks for skin configuration data 2026-07-21 09:29:44 +02:00
Bluewhale1337 dd9f9886b4 feat: implement automatic skin swapping based on group size and add horizontal grid layout options 2026-07-21 09:02:33 +02:00
Bluewhale1337 85ad55c1cb perf: optimize CPU and memory usage via boolean state tracking, event filtering, and per-character SavedVariables. 2026-07-20 23:22:15 +02:00
Bluewhale1337 441a45150f feat: add Spell_Holy_AshesToAshes icon and implement debuff tracking loop in UnitAura handler 2026-07-20 18:13:47 +02:00
Bluewhale1337 0b610adaab Merge pull request #7 from Bluewhale1337/Bluewhale1337-patch-1
Update README.md
2026-07-20 08:12:21 +02:00
Bluewhale1337 609e2cc87b Update README.md
Fixed formatting

Signed-off-by: Bluewhale1337 <295648290+Bluewhale1337@users.noreply.github.com>
2026-07-20 08:12:07 +02:00
Bluewhale1337 12838ff250 Update HealBot_Localization.en.lua
in-game displayed version update
2026-07-19 22:43:28 +02:00
Bluewhale1337 e6ad9e7506 perf: eliminate remaining GC spikes by preventing layout rebuilds on combat toggle and zeroing hot-loop table allocations 2026-07-18 23:43:35 +02:00
Bluewhale1337 9f08b356e1 docs: append v1.5.1 changelog detailing memory, mana, and buff tracking fixes 2026-07-18 23:39:07 +02:00
Bluewhale1337 3845ada15f fix: remove artificial mana check to allow 0-mana cost buffs and fix tooltips disappearing instead of turning red 2026-07-18 23:37:51 +02:00
Bluewhale1337 826bf64eda fix: resolve Self Only buff tracking failing on raid frames by replacing direct unit string comparisons with UnitIsUnit 2026-07-18 23:34:20 +02:00
Bluewhale1337 8854cd3caa docs: add release notes for v1.4.2 to README.md 2026-07-18 23:26:14 +02:00
Bluewhale1337 c8a5e4f0eb perf: eliminate string allocation GC spikes in healthbar refreshing and remove full UI rebuilds on target change 2026-07-18 13:35:59 +02:00
Bluewhale1337 2d75406d88 Merge pull request #6 from Bluewhale1337/dev
Merge pull request #5 from Bluewhale1337/main
2026-07-18 12:40:48 +02:00
Bluewhale1337 2e35be6516 Merge pull request #5 from Bluewhale1337/main
Hotfix merge to dev
2026-07-18 12:40:18 +02:00
Bluewhale1337 07a9c3a93d Merge branch 'dev' into main
Signed-off-by: Bluewhale1337 <295648290+Bluewhale1337@users.noreply.github.com>
2026-07-18 12:40:04 +02:00
Bluewhale1337 c8e62fe80e docs: restore v1.4.2 changelog entry 2026-07-18 12:36:38 +02:00
Bluewhale1337 1334fc09bf perf: replace table.foreach with pairs loops to avoid GC spikes during combat 2026-07-18 12:27:51 +02:00
Bluewhale1337 ce594af5fa fix: memory leak in UnitAura and bump version to 1.4.2 2026-07-18 10:47:28 +02:00
Bluewhale1337 f1c5d6a8d1 Features: Expand action handling to support inline scripts, macros, and items while adding dynamic tooltip mana colorization and table memory management. 2026-07-15 14:56:03 +02:00
Bluewhale1337 0186fc1d93 Merge pull request #4 from Bluewhale1337/dev
Merging dev changes to main 1.4.1
2026-07-12 20:21:49 +02:00
Bluewhale1337 ff97414bb1 feat: implement robust spell failure detection, talent-based healing calculations, and improved incoming heal synchronization. 2026-07-12 19:44:50 +02:00
Bluewhale1337 d0d6a39fb9 feat: implement talent-based dynamic spell healing calculations for Druid, Priest, and Paladin classes 2026-07-12 15:44:44 +02:00
Bluewhale1337 4209b05ca0 Merge pull request #3 from Bluewhale1337/dev
Dev branch changes merged to main
2026-07-12 00:51:45 +02:00
Bluewhale1337 66172cab45 refactor: replace MODIFIER_STATE_CHANGED event with polling in HealBot_OnUpdate to track modifier keys 2026-07-12 00:37:25 +02:00
Bluewhale1337 eec5745dbb Update of readme 2026-07-12 00:20:04 +02:00
Bluewhale1337 4678236cc0 feat: add Enlighten spell support and update localization files 2026-07-11 15:21:28 +02:00
Bluewhale1337 a1aa1a4c1d feat: add spell cast announcements with target validation for resurrections and added announcements for hoovercasting (mousover frames) 2026-07-11 11:06:27 +02:00
Bluewhale1337 86e0e0b18a Refactor: rename global variables and constants with HealBot prefix and register MODIFIER_STATE_CHANGED event 2026-07-10 23:13:48 +02:00
Bluewhale1337 becb2ddfdb Feat: added customizable unit frame health text and support for non-mana resource tracking 2026-07-10 17:08:50 +02:00
Bluewhale1337 7eb07d724e Merge branch 'main' into dev - applying hotfixes 2026-07-10 16:06:16 +02:00
Bluewhale1337 2e8e57f5c4 Merge branch 'main' of https://github.com/Bluewhale1337/HealBotBlue 2026-07-10 15:54:42 +02:00
Bluewhale1337 f8c6c3493b Refactor + Horfixes: replace UIDropDownMenu calls with wrapper functions and redesign chat option UI to support spell-based configuration. 2026-07-10 15:54:36 +02:00
Bluewhale1337 01a8e3bc6c Update README.md
Known issues section added
2026-07-09 08:13:34 +02:00
Bluewhale1337 c50bcd54f3 Hotfix - prevent legacy UIDropDownMenu crashes by patching refresh and selection functions 2026-07-06 22:15:41 +02:00
Bluewhale1337 4c7cfbde8e add null checks when toggling HealBot options panels to prevent errors 2026-07-04 14:47:22 +02:00
Bluewhale1337 cb1ba1ab75 Implement auto-unshifting for druid shapeshift forms and add status command 2026-07-04 09:41:06 +02:00
Bluewhale1337 0c8b687f53 Implement EQUIPMENT_CHANGED observer pattern and update project to v1.4.0 2026-07-03 12:37:20 +02:00
Bluewhale1337 42715fba47 Added pet frames support 2026-07-03 11:55:42 +02:00
Bluewhale1337 6fe02c1a16 Merge pull request #1 from Bluewhale1337/main
Propagate hotfixes
2026-07-02 12:05:41 +02:00
34 changed files with 2064 additions and 945 deletions
+37 -6
View File
@@ -5,12 +5,12 @@
]] ]]
-- local _scale=0; -- moved to HealBot_Controller_Range.lua -- local _scale=0; -- moved to HealBot_Controller_Range.lua
CalcEquipBonus=false; HealBot_CalcEquipBonus=false;
HealBot_EquipChangeTimer = 0; HealBot_EquipChangeTimer = 0;
HealValue=0; HealBot_HealValue=0;
InitSpells=1; HealBot_SpellsInitFlag=1;
local DebugDebuff=false; local DebugDebuff=false;
Delay_RecalcParty=0; HealBot_Delay_RecalcParty=0;
-- Debugging and Error functions moved to HealBot_Controller_Comms.lua -- Debugging and Error functions moved to HealBot_Controller_Comms.lua
@@ -56,9 +56,24 @@ function HealBot_SlashCmd(cmd)
HealBot_TogglePanel(HealBot_Options); HealBot_TogglePanel(HealBot_Options);
return return
end 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 if (cmd=="reset" or cmd=="recalc" or cmd=="defaults") then
InitSpells=2; HealBot_SpellsInitFlag=2;
HealBot_Options_Defaults_OnClick(HealBot_Options_Defaults); HealBot_Options_Defaults_OnClick(HealBot_Options_Defaults);
return return
end end
@@ -70,7 +85,7 @@ function HealBot_SlashCmd(cmd)
HealBot_RegisterThis(this); HealBot_RegisterThis(this);
end end
if (cmd=="x") then if (cmd=="x") then
InitSpells=2; HealBot_SpellsInitFlag=2;
NeedEquipUpdate=1 NeedEquipUpdate=1
HealBot_RecalcSpells(); HealBot_RecalcSpells();
return; return;
@@ -261,10 +276,26 @@ do
do do
local autoSelfCast = GetCVar("autoSelfCast") local autoSelfCast = GetCVar("autoSelfCast")
SetCVar("autoSelfCast", "0") -- Ensure disabled 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
HealBot_CastFailed = false
orig(slot, checkCursor, onSelf) orig(slot, checkCursor, onSelf)
if autoSelfCast then if autoSelfCast then
SetCVar("autoSelfCast", autoSelfCast) SetCVar("autoSelfCast", autoSelfCast)
end end
if spellName and not HealBot_CastFailed then
HealBot_CastingSpell = spellName
HealBot_CastingTarget = mouseover
HealBot_Process_HealValue(spellName, mouseover)
HealBot_AnnounceCast(spellName, mouseover)
end
end end
SpellTargetUnit(mouseover) SpellTargetUnit(mouseover)
+1 -1
View File
@@ -18,7 +18,7 @@
<FontString name="$parent_text" inherits="GameFontNormalSmall"> <FontString name="$parent_text" inherits="GameFontNormalSmall">
<Anchors> <Anchors>
<Anchor point="CENTER"> <Anchor point="CENTER">
<Offset> <AbsDimension y="1"/> </Offset> <Offset> <AbsDimension y="0"/> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
</FontString> </FontString>
+3 -2
View File
@@ -1,9 +1,9 @@
## Interface: 11200 ## Interface: 11200
## Title: HealBotBlue ## Title: HealBotBlue
## Version: 1.3.1 ## Version: 1.6.0
## Author: Bluewhale ## Author: Bluewhale
## Notes: Adds panel with skinable bars for healing and decursive ## Notes: Adds panel with skinable bars for healing and decursive
## SavedVariables: HealBot_Config ## SavedVariablesPerCharacter: HealBot_Config
..\..\FrameXML\Fonts.xml ..\..\FrameXML\Fonts.xml
..\..\FrameXML\OptionsFrameTemplates.xml ..\..\FrameXML\OptionsFrameTemplates.xml
..\..\FrameXML\UIPanelTemplates.xml ..\..\FrameXML\UIPanelTemplates.xml
@@ -27,3 +27,4 @@ HealBot_Options_CDC.xml
HealBot_Options_Skins.xml HealBot_Options_Skins.xml
HealBot_Options_Buffs.xml HealBot_Options_Buffs.xml
HealBot_Options_Chat.xml HealBot_Options_Chat.xml
HealBot_Options_Auto.xml
+134 -21
View File
@@ -22,9 +22,9 @@ function HealBot_ShouldHeal(unit)
end end
function HealBot_Action_ShouldHealSome() function HealBot_Action_ShouldHealSome()
return table.foreach(HealBot_Action_HealButtons, function (index,button) for index, button in pairs(HealBot_Action_HealButtons) do
if (HealBot_ShouldHeal(button.unit)) then return button.unit; end if (HealBot_ShouldHeal(button.unit)) then return button.unit; end
end); end
end end
function HealBot_MustHeal(unit) function HealBot_MustHeal(unit)
@@ -32,9 +32,9 @@ function HealBot_MustHeal(unit)
end end
function HealBot_Action_MustHealSome() function HealBot_Action_MustHealSome()
return table.foreach(HealBot_Action_HealButtons, function (index,button) for index, button in pairs(HealBot_Action_HealButtons) do
if (HealBot_MustHeal(button.unit)) then return button.unit; end if (HealBot_MustHeal(button.unit)) then return button.unit; end
end); end
end end
function HealBot_GetRezSpellForClass() function HealBot_GetRezSpellForClass()
@@ -117,11 +117,107 @@ function HealBot_Action_HealUnit_OnLeave(this)
HealBot_Action_HideTooltip(this); HealBot_Action_HideTooltip(this);
end end
--------------------------------------------------------------------------------------------------
-- Puppeteer Utility Ports for Macro and Item Execution
--------------------------------------------------------------------------------------------------
function HealBot_SplitString(str, delimiter)
local result = {}
local start_pos = 1
while true do
local end_pos = string.find(str, delimiter, start_pos, true)
if not end_pos then
table.insert(result, string.sub(str, start_pos))
break
end
table.insert(result, string.sub(str, start_pos, end_pos - 1))
start_pos = end_pos + string.len(delimiter)
end
return result
end
function HealBot_RunMacroText(body)
local commands = HealBot_SplitString(body, "\n")
for i = 1, table.getn(commands) do
ChatFrameEditBox:SetText(commands[i])
ChatEdit_SendText(ChatFrameEditBox)
end
end
function HealBot_RunMacro(name)
if GetMacroIndexByName(name) == 0 then return end
local _, _, body = GetMacroInfo(GetMacroIndexByName(name))
HealBot_RunMacroText(body)
end
function HealBot_GetBagSlotInfo(bag, slot)
local link = GetContainerItemLink(bag, slot)
if not link then return end
local _, _, name = string.find(link, "%[(.*)%]")
local _, count = GetContainerItemInfo(bag, slot)
return name, count
end
function HealBot_FindBagSlot(itemName)
local bestBag, bestSlot, lowestStackSize
for bag = 0, NUM_BAG_FRAMES do
for slot = 1, GetContainerNumSlots(bag) do
local name, count = HealBot_GetBagSlotInfo(bag, slot)
if itemName == name then
if not lowestStackSize or lowestStackSize > count then
bestBag = bag
bestSlot = slot
lowestStackSize = count
end
end
end
end
return bestBag, bestSlot
end
function HealBot_UseItem(itemName)
local bag, slot = HealBot_FindBagSlot(itemName)
if not bag then return false end
UseContainerItem(bag, slot)
return true
end
function HealBot_Action_HealUnit_OnClick(this,button) function HealBot_Action_HealUnit_OnClick(this,button)
local decode_button = HealBot_Decode_Button(button); local decode_button = HealBot_Decode_Button(button);
local pattern = HealBot_Action_SpellPattern(decode_button); local pattern = HealBot_Action_SpellPattern(decode_button);
-- Resurrection override on dead target if not pattern then return end
-- Buff casting override (Spells only)
if HealBot_Config.BuffWatch == 1 then
local inCombat = UnitAffectingCombat("player")
if (not inCombat) or (HealBot_Config.BuffWatchInCombat == 1) then
if HealBot_MissingBuffs[this.unit] then
local missingBuff = HealBot_MissingBuffs[this.unit]
if decode_button == "Left" or decode_button == "Right" then
HealBot_CastSpellOnFriend(missingBuff, this.unit)
return
end
end
end
end
-- Priority 1: Inline Scripts (starts with /)
if string.sub(pattern, 1, 1) == "/" then
local oldTarget = nil
if UnitExists("target") then oldTarget = UnitName("target") end
TargetUnit(this.unit)
HealBot_RunMacroText(pattern)
if oldTarget then
TargetByName(oldTarget)
else
ClearTarget()
end
return
end
-- Priority 2: Spells
-- Resurrection override on dead target first
if UnitIsDeadOrGhost(this.unit) then if UnitIsDeadOrGhost(this.unit) then
local rezSpell = HealBot_GetRezSpellForClass(); local rezSpell = HealBot_GetRezSpellForClass();
if rezSpell then if rezSpell then
@@ -130,23 +226,40 @@ function HealBot_Action_HealUnit_OnClick(this,button)
end end
end end
-- Buff casting override if HealBot_Spells[pattern] or HealBot_GetSpellId(pattern) then
if HealBot_Config.BuffWatch == 1 then HealBot_HealUnit(this.unit, pattern);
local inCombat = UnitAffectingCombat("player") return
if (not inCombat) or (HealBot_Config.BuffWatchInCombat == 1) then end
local myClass = UnitClass("player")
if HealBot_MissingBuffs[this.unit] then
local missingBuff = HealBot_MissingBuffs[this.unit]
if decode_button == "Left" or decode_button == "Right" then
HealBot_CastSpellOnFriend(missingBuff, this.unit)
return
end
end
end
end
HealBot_HealUnit(this.unit,pattern); -- Priority 3: Named Macros
end if GetMacroIndexByName(pattern) ~= 0 then
local oldTarget = nil
if UnitExists("target") then oldTarget = UnitName("target") end
TargetUnit(this.unit)
HealBot_RunMacro(pattern)
if oldTarget then
TargetByName(oldTarget)
else
ClearTarget()
end
return
end
-- Priority 4: Items
local bag, slot = HealBot_FindBagSlot(pattern)
if bag then
local oldTarget = nil
if UnitExists("target") then oldTarget = UnitName("target") end
TargetUnit(this.unit)
UseContainerItem(bag, slot)
if SpellIsTargeting() then SpellTargetUnit(this.unit) end
if oldTarget then TargetByName(oldTarget) else ClearTarget() end
return
end
-- Fallback attempt
HealBot_HealUnit(this.unit, pattern);
end
function HealBot_Action_HealUnitCheck_OnClick(this) function HealBot_Action_HealUnitCheck_OnClick(this)
if not this.unit then return end if not this.unit then return end
+14 -14
View File
@@ -6,9 +6,9 @@
-- http://www.curse-gaming.com/mod.php?addid=2384 -- http://www.curse-gaming.com/mod.php?addid=2384
-------------------------------------------------- --------------------------------------------------
HB_BONUSSCANNER_PATTERN_SETNAME = "^(.*) %(%d/%d%)$"; HEALBOT_BONUSSCANNER_PATTERN_SETNAME = "^(.*) %(%d/%d%)$";
HB_BONUSSCANNER_PATTERN_GENERIC_PREFIX = "^%+(%d+)%%?(.*)$"; HEALBOT_BONUSSCANNER_PATTERN_GENERIC_PREFIX = "^%+(%d+)%%?(.*)$";
HB_BONUSSCANNER_PATTERN_GENERIC_SUFFIX = "^(.*)%+(%d+)%%?$"; HEALBOT_BONUSSCANNER_PATTERN_GENERIC_SUFFIX = "^(.*)%+(%d+)%%?$";
HealBot_BonusScanner = { HealBot_BonusScanner = {
bonuses = 0; bonuses = 0;
@@ -128,17 +128,17 @@ end;
function HealBot_BonusScanner:ScanLine(line) function HealBot_BonusScanner:ScanLine(line)
local tmpStr, found; local tmpStr, found;
if(string.sub(line,0,string.len(HB_BONUSSCANNER_PREFIX_EQUIP)) == HB_BONUSSCANNER_PREFIX_EQUIP) then if(string.sub(line,0,string.len(HEALBOT_BONUSSCANNER_PREFIX_EQUIP)) == HEALBOT_BONUSSCANNER_PREFIX_EQUIP) then
tmpStr = string.sub(line,string.len(HB_BONUSSCANNER_PREFIX_EQUIP)+1); tmpStr = string.sub(line,string.len(HEALBOT_BONUSSCANNER_PREFIX_EQUIP)+1);
HealBot_BonusScanner:CheckPassive(tmpStr); 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 HealBot_BonusScanner.temp.set ~= ""
and not HealBot_BonusScanner.temp.sets[HealBot_BonusScanner.temp.set]) then 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.temp.slot = "Set";
HealBot_BonusScanner:CheckPassive(tmpStr); HealBot_BonusScanner:CheckPassive(tmpStr);
else else
_, _, tmpStr = string.find(line, HB_BONUSSCANNER_PATTERN_SETNAME); _, _, tmpStr = string.find(line, HEALBOT_BONUSSCANNER_PATTERN_SETNAME);
if(tmpStr) then if(tmpStr) then
HealBot_BonusScanner.temp.set = tmpStr; HealBot_BonusScanner.temp.set = tmpStr;
else else
@@ -154,7 +154,7 @@ function HealBot_BonusScanner:CheckPassive(line)
local i, p, value, found; local i, p, value, found;
found = nil; 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); _, _, value = string.find(line, "^" .. p.pattern);
if(value) then if(value) then
HealBot_BonusScanner:AddValue(p.effect, value) HealBot_BonusScanner:AddValue(p.effect, value)
@@ -183,9 +183,9 @@ function HealBot_BonusScanner:CheckGeneric(line)
tmpStr = string.gsub( tmpStr, "%s+$", "" ); tmpStr = string.gsub( tmpStr, "%s+$", "" );
tmpStr = string.gsub( tmpStr, "%.$", "" ); 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 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 end
if(token and value) then if(token and value) then
token = string.gsub( token, "^%s+", "" ); token = string.gsub( token, "^%s+", "" );
@@ -202,8 +202,8 @@ end
function HealBot_BonusScanner:CheckToken(token, value) function HealBot_BonusScanner:CheckToken(token, value)
local i, p, s1, s2; local i, p, s1, s2;
if(HB_BONUSSCANNER_PATTERNS_GENERIC_LOOKUP[token]) then if(HEALBOT_BONUSSCANNER_PATTERNS_GENERIC_LOOKUP[token]) then
HealBot_BonusScanner:AddValue(HB_BONUSSCANNER_PATTERNS_GENERIC_LOOKUP[token], value); HealBot_BonusScanner:AddValue(HEALBOT_BONUSSCANNER_PATTERNS_GENERIC_LOOKUP[token], value);
return true; return true;
end end
return false; return false;
@@ -212,7 +212,7 @@ end
function HealBot_BonusScanner:CheckOther(line) function HealBot_BonusScanner:CheckOther(line)
local i, p, value, start, found; 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); start, _, value = string.find(line, "^" .. p.pattern);
if(start) then if(start) then
if(p.value) then if(p.value) then
+36 -15
View File
@@ -2,6 +2,7 @@
-- Handles tracking buffs/debuffs (auras) on group/raid units -- Handles tracking buffs/debuffs (auras) on group/raid units
HealBot_MissingBuffs = {} HealBot_MissingBuffs = {}
local StaticHasBuff = {}
function HealBot_UnitAffected(unit, effect) function HealBot_UnitAffected(unit, effect)
if not effect then return nil; end if not effect then return nil; end
@@ -68,7 +69,10 @@ function HealBot_CheckBuffs(unit)
} }
-- Gather buffs on unit -- Gather buffs on unit
local hasBuff = {} local hasBuff = StaticHasBuff
for k in pairs(hasBuff) do
hasBuff[k] = nil
end
local i = 1 local i = 1
while true do while true do
local buffTexture = UnitBuff(unit, i) local buffTexture = UnitBuff(unit, i)
@@ -91,7 +95,7 @@ function HealBot_CheckBuffs(unit)
local val = HealBot_Config.BuffDropDowns[myClass][j] local val = HealBot_Config.BuffDropDowns[myClass][j]
if val and val > 0 then if val and val > 0 then
local isSelfOnly = (HealBot_Config.BuffWatchSelf and HealBot_Config.BuffWatchSelf[j] == 1) local isSelfOnly = (HealBot_Config.BuffWatchSelf and HealBot_Config.BuffWatchSelf[j] == 1)
if not (isSelfOnly and unit ~= "player") then if not (isSelfOnly and not UnitIsUnit(unit, "player")) then
local spellName = HealBot_Buff_Spells[myClass][val] local spellName = HealBot_Buff_Spells[myClass][val]
local hasIt = hasBuff[spellName] local hasIt = hasBuff[spellName]
@@ -100,7 +104,7 @@ function HealBot_CheckBuffs(unit)
end end
if not hasIt then if not hasIt then
if myClass == "SHAMAN" and unit == "player" and string.find(spellName, " Weapon") then if myClass == "SHAMAN" and UnitIsUnit(unit, "player") and string.find(spellName, " Weapon") then
hasIt = HealBot_CheckShamanWeaponBuff(spellName) hasIt = HealBot_CheckShamanWeaponBuff(spellName)
end end
end end
@@ -115,22 +119,28 @@ function HealBot_CheckBuffs(unit)
end end
end end
local HealBot_TrackedHoTs = {
["Interface\\Icons\\Spell_Holy_Renew"] = true,
["Interface\\Icons\\Spell_Nature_Rejuvenation"] = true,
["Interface\\Icons\\Spell_Nature_ResistNature"] = true,
["Interface\\Icons\\Spell_Holy_PowerWordShield"] = true,
["Interface\\Icons\\Spell_Holy_SealOfProtection"] = true,
["Interface\\Icons\\Spell_Holy_Excorcism"] = true,
["Interface\\Icons\\btnholyscriptures"] = true,
["Interface\\Icons\\Spell_Holy_AshesToAshes"] = true,
}
function HealBot_OnEvent_UnitAura(this, unit) function HealBot_OnEvent_UnitAura(this, unit)
local DebuffType; local DebuffType;
if HealBot_Heals[unit] and unit ~= "target" then if HealBot_Heals[unit] and unit ~= "target" then
HealBot_UnitIcons[unit] = {} if not HealBot_UnitIcons[unit] then
HealBot_UnitIcons[unit] = {}
end
for j = 1, 5 do
HealBot_UnitIcons[unit][j] = nil
end
local iconCount = 0 local iconCount = 0
local HealBot_TrackedHoTs = {
["Interface\\Icons\\Spell_Holy_Renew"] = true,
["Interface\\Icons\\Spell_Nature_Rejuvenation"] = true,
["Interface\\Icons\\Spell_Nature_ResistNature"] = true,
["Interface\\Icons\\Spell_Holy_PowerWordShield"] = true,
["Interface\\Icons\\Spell_Holy_SealOfProtection"] = true,
["Interface\\Icons\\Spell_Holy_Excorcism"] = true,
}
local i = 1; local i = 1;
while true do while true do
local debuff, tmp, debuff_type = UnitDebuff(unit, i, 1) local debuff, tmp, debuff_type = UnitDebuff(unit, i, 1)
@@ -139,7 +149,7 @@ function HealBot_OnEvent_UnitAura(this, unit)
iconCount = iconCount + 1 iconCount = iconCount + 1
HealBot_UnitIcons[unit][iconCount] = debuff HealBot_UnitIcons[unit][iconCount] = debuff
end end
if HealBot_CDCInc[UnitClass(unit)] == 1 and HealBot_DebuffWatch[debuff_type] == "YES" then if HealBot_CDCInc[UnitClass(unit)] == 1 and HealBot_DebuffWatch[debuff_type] then
HealBot_UnitDebuff[unit] = debuff_type HealBot_UnitDebuff[unit] = debuff_type
DebuffType = debuff_type; DebuffType = debuff_type;
if HealBot_DebuffPriority[debuff_type] then if HealBot_DebuffPriority[debuff_type] then
@@ -164,6 +174,17 @@ function HealBot_OnEvent_UnitAura(this, unit)
b = b + 1 b = b + 1
end end
local d = 1
while true do
local debuff = UnitDebuff(unit, d)
if not debuff then break end
if HealBot_TrackedHoTs[debuff] and iconCount < 5 then
iconCount = iconCount + 1
HealBot_UnitIcons[unit][iconCount] = debuff
end
d = d + 1
end
if HealBot_UnitDebuff[unit] then if HealBot_UnitDebuff[unit] then
if DebuffType and HealBot_Range_Check(unit, 27) == 1 then if DebuffType and HealBot_Range_Check(unit, 27) == 1 then
if HealBot_Config.ShowDebuffWarning == 1 then if HealBot_Config.ShowDebuffWarning == 1 then
+1
View File
@@ -70,6 +70,7 @@ function HealBot_OnEvent_AddonMsg(this, addon_id, inc_msg, dist_target, sender_i
local tmpTest, unitname, heal_val local tmpTest, unitname, heal_val
tmpTest, tmpTest, unitname, heal_val = string.find(inc_msg, ">> (%a+) <<=>> (.%d+) <<" ); tmpTest, tmpTest, unitname, heal_val = string.find(inc_msg, ">> (%a+) <<=>> (.%d+) <<" );
if heal_val then if heal_val then
if sender_id == UnitName("player") then return end
if not HealBot_HealsIn[unitname] then if not HealBot_HealsIn[unitname] then
HealBot_HealsIn[unitname] = 0; HealBot_HealsIn[unitname] = 0;
end end
+100 -73
View File
@@ -3,6 +3,7 @@
HealBot_View_DirtyUnits = {} HealBot_View_DirtyUnits = {}
local HealBot_Timer1, HealsIn_Timer = 0, 0; local HealBot_Timer1, HealsIn_Timer = 0, 0;
HealBot_LastModState = ""
function HealBot_OnLoad(this) function HealBot_OnLoad(this)
this:RegisterEvent("VARIABLES_LOADED"); this:RegisterEvent("VARIABLES_LOADED");
@@ -25,7 +26,12 @@ function HealBot_OnLoad(this)
HealBot_View_DirtyUnits[unitID] = true HealBot_View_DirtyUnits[unitID] = true
end) end)
HealBot_Model:RegisterObserver("ROSTER_CHANGED", function() 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_EquipChangeTimer = 1
end
end) end)
end end
@@ -34,6 +40,23 @@ function HealBot_RegisterThis(this)
end end
function HealBot_OnUpdate(this, arg1) function HealBot_OnUpdate(this, arg1)
if HealBot_Action_TooltipUnit and HealBot_Tooltip:IsVisible() then
local s = IsShiftKeyDown() and true or false
local c = IsControlKeyDown() and true or false
local a = IsAltKeyDown() and true or false
if HealBot_LastModS ~= s or HealBot_LastModC ~= c or HealBot_LastModA ~= a then
HealBot_LastModS = s
HealBot_LastModC = c
HealBot_LastModA = a
HealBot_Action_RefreshTooltip(HealBot_Action_TooltipUnit)
end
else
HealBot_LastModS = false
HealBot_LastModC = false
HealBot_LastModA = false
end
if HealBot_TargetRestorePending then if HealBot_TargetRestorePending then
HealBot_TargetRestoreTimer = HealBot_TargetRestoreTimer + arg1; HealBot_TargetRestoreTimer = HealBot_TargetRestoreTimer + arg1;
if HealBot_TargetRestoreTimer >= 0.1 then if HealBot_TargetRestoreTimer >= 0.1 then
@@ -51,10 +74,20 @@ function HealBot_OnUpdate(this, arg1)
end end
-- Process Dirty Queue for MVC View -- Process Dirty Queue for MVC View
if next(HealBot_View_DirtyUnits) ~= nil then local unitID, _ = next(HealBot_View_DirtyUnits)
for unitID in pairs(HealBot_View_DirtyUnits) do while unitID do
HealBot_Action_RefreshButtons(unitID) HealBot_Action_RefreshButtons(unitID)
HealBot_View_DirtyUnits[unitID] = nil HealBot_View_DirtyUnits[unitID] = nil
unitID, _ = next(HealBot_View_DirtyUnits)
end
if HealBot_EquipChangeTimer > 0 then
HealBot_EquipChangeTimer = HealBot_EquipChangeTimer - arg1
if HealBot_EquipChangeTimer <= 0 then
HealBot_EquipChangeTimer = 0
HealBot_BonusScanner:ScanEquipment()
HealBot_CalcEquipBonus = true;
HealBot_RecalcSpells();
end end
end end
@@ -63,33 +96,25 @@ function HealBot_OnUpdate(this, arg1)
if not HealBot_IsFighting then if not HealBot_IsFighting then
HealsIn_Timer = HealsIn_Timer + 1; HealsIn_Timer = HealsIn_Timer + 1;
if HealsIn_Timer >= 10 then if HealsIn_Timer >= 10 then
HealBot_HealsIn = {}; for k in pairs(HealBot_HealsIn) do HealBot_HealsIn[k] = nil end
HealBot_Healers = {}; for k in pairs(HealBot_Healers) do HealBot_Healers[k] = nil end
HealsIn_Timer = 0; HealsIn_Timer = 0;
end end
if HealBot_EquipChangeTimer > 0 then
HealBot_EquipChangeTimer = HealBot_EquipChangeTimer - arg1
if HealBot_EquipChangeTimer <= 0 then
HealBot_EquipChangeTimer = 0
HealBot_BonusScanner:ScanEquipment()
CalcEquipBonus = true;
HealBot_RecalcSpells();
end
end
if InitSpells > 1 then
InitSpells = InitSpells + 1; if HealBot_SpellsInitFlag > 1 then
if InitSpells > 2 then HealBot_SpellsInitFlag = HealBot_SpellsInitFlag + 1;
if HealBot_SpellsInitFlag > 2 then
local cnt = HealBot_InitSpells(); local cnt = HealBot_InitSpells();
InitSpells = 0; HealBot_SpellsInitFlag = 0;
HealBot_RecalcSpells(); HealBot_RecalcSpells();
end end
end end
if Delay_RecalcParty > 0 then if HealBot_Delay_RecalcParty > 0 then
Delay_RecalcParty = Delay_RecalcParty + 1 HealBot_Delay_RecalcParty = HealBot_Delay_RecalcParty + 1
if Delay_RecalcParty > 1 then if HealBot_Delay_RecalcParty > 1 then
Delay_RecalcParty = 0; HealBot_Delay_RecalcParty = 0;
HealBot_RecalcParty(); HealBot_RecalcParty();
end end
end end
@@ -109,32 +134,28 @@ local HealBot_EventHandlers = {
HealBot_OnEvent_UnitHealth(this, arg1) HealBot_OnEvent_UnitHealth(this, arg1)
end, end,
["UNIT_MANA"] = function(this, arg1) ["UNIT_MANA"] = function(this, arg1)
if arg1 ~= "player" and HealBot_Config.ShowManaBars == 0 then return end
if HealBot_Model:UpdateUnitPower(arg1) then if HealBot_Model:UpdateUnitPower(arg1) then
HealBot_Model:NotifyObservers("UNIT_POWER_CHANGED", arg1) HealBot_Model:NotifyObservers("UNIT_POWER_CHANGED", arg1)
end end
if (arg1 == "player") then HealBot_RecalcHeals(); end
HealBot_Action_RefreshButtons(arg1);
end, end,
["UNIT_RAGE"] = function(this, arg1) ["UNIT_RAGE"] = function(this, arg1)
if arg1 ~= "player" and HealBot_Config.ShowManaBars == 0 then return end
if HealBot_Model:UpdateUnitPower(arg1) then if HealBot_Model:UpdateUnitPower(arg1) then
HealBot_Model:NotifyObservers("UNIT_POWER_CHANGED", arg1) HealBot_Model:NotifyObservers("UNIT_POWER_CHANGED", arg1)
end end
if (arg1 == "player") then HealBot_RecalcHeals(); end
HealBot_Action_RefreshButtons(arg1);
end, end,
["UNIT_ENERGY"] = function(this, arg1) ["UNIT_ENERGY"] = function(this, arg1)
if arg1 ~= "player" and HealBot_Config.ShowManaBars == 0 then return end
if HealBot_Model:UpdateUnitPower(arg1) then if HealBot_Model:UpdateUnitPower(arg1) then
HealBot_Model:NotifyObservers("UNIT_POWER_CHANGED", arg1) HealBot_Model:NotifyObservers("UNIT_POWER_CHANGED", arg1)
end end
if (arg1 == "player") then HealBot_RecalcHeals(); end
HealBot_Action_RefreshButtons(arg1);
end, end,
["UNIT_DISPLAYPOWER"] = function(this, arg1) ["UNIT_DISPLAYPOWER"] = function(this, arg1)
if arg1 ~= "player" and HealBot_Config.ShowManaBars == 0 then return end
if HealBot_Model:UpdateUnitPower(arg1) then if HealBot_Model:UpdateUnitPower(arg1) then
HealBot_Model:NotifyObservers("UNIT_POWER_CHANGED", arg1) HealBot_Model:NotifyObservers("UNIT_POWER_CHANGED", arg1)
end end
if (arg1 == "player") then HealBot_RecalcHeals(); end
HealBot_Action_RefreshButtons(arg1);
end, end,
["UNIT_AURA"] = function(this, arg1) ["UNIT_AURA"] = function(this, arg1)
HealBot_Model:MarkAuraChanged(arg1) HealBot_Model:MarkAuraChanged(arg1)
@@ -163,6 +184,9 @@ local HealBot_EventHandlers = {
["PLAYER_ENTERING_WORLD"] = function(this) ["PLAYER_ENTERING_WORLD"] = function(this)
HealBot_Model:RefreshUnit("player") HealBot_Model:RefreshUnit("player")
HealBot_Model:RefreshUnit("pet") HealBot_Model:RefreshUnit("pet")
if HealBot_UnitClass("player") == "DRUID" then
HealBot_UpdateShapeshiftForm()
end
HealBot_OnEvent_PlayerEnteringWorld(this) HealBot_OnEvent_PlayerEnteringWorld(this)
end, end,
["VARIABLES_LOADED"] = function(this) ["VARIABLES_LOADED"] = function(this)
@@ -171,22 +195,28 @@ local HealBot_EventHandlers = {
-- Legacy pass-throughs -- Legacy pass-throughs
["CHAT_MSG_ADDON"] = function(this, arg1, arg2, arg3, arg4) HealBot_OnEvent_AddonMsg(this, arg1, arg2, arg3, arg4) end, ["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, ["SPELLCAST_START"] = function(this, arg1, arg2) HealBot_OnEvent_SpellcastStart(this, arg1, arg2) end,
["SPELLCAST_STOP"] = function(this) HealBot_OnEvent_SpellcastStop(this) end, ["SPELLCAST_STOP"] = function(this) HealBot_OnEvent_SpellcastStop(this, "SPELLCAST_STOP") end,
["SPELLCAST_INTERRUPTED"] = function(this) HealBot_OnEvent_SpellcastStop(this) end, ["SPELLCAST_INTERRUPTED"] = function(this) HealBot_OnEvent_SpellcastStop(this, "SPELLCAST_INTERRUPTED") end,
["SPELLCAST_FAILED"] = function(this) HealBot_OnEvent_SpellcastStop(this) end, ["SPELLCAST_FAILED"] = function(this) HealBot_OnEvent_SpellcastStop(this, "SPELLCAST_FAILED") end,
["PLAYER_REGEN_DISABLED"] = function(this) HealBot_OnEvent_PlayerRegenDisabled(this) end, ["PLAYER_REGEN_DISABLED"] = function(this) HealBot_OnEvent_PlayerRegenDisabled(this) end,
["PLAYER_REGEN_ENABLED"] = function(this) HealBot_OnEvent_PlayerRegenEnabled(this) end, ["PLAYER_REGEN_ENABLED"] = function(this) HealBot_OnEvent_PlayerRegenEnabled(this) end,
["BAG_UPDATE_COOLDOWN"] = function(this, arg1) HealBot_OnEvent_BagUpdateCooldown(this, arg1) end,
["BAG_UPDATE"] = function(this, arg1) HealBot_OnEvent_BagUpdate(this, arg1) end,
["PARTY_MEMBER_DISABLE"] = function(this, arg1) HealBot_OnEvent_PartyMemberDisable(this, arg1) end, ["PARTY_MEMBER_DISABLE"] = function(this, arg1) HealBot_OnEvent_PartyMemberDisable(this, arg1) end,
["PARTY_MEMBER_ENABLE"] = function(this, arg1) HealBot_OnEvent_PartyMemberEnable(this, arg1) end, ["PARTY_MEMBER_ENABLE"] = function(this, arg1) HealBot_OnEvent_PartyMemberEnable(this, arg1) end,
["CHAT_MSG_SYSTEM"] = function(this, arg1) HealBot_OnEvent_SystemMsg(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, ["ZONE_CHANGED_NEW_AREA"] = function(this) HealBot_OnEvent_ZoneChanged(this) end,
["UPDATE_INVENTORY_ALERTS"] = function(this) HealBot_OnEvent_PlayerEquipmentChanged(this) end, ["UPDATE_INVENTORY_ALERTS"] = function(this)
["UNIT_INVENTORY_CHANGED"] = function(this, arg1) HealBot_OnEvent_PlayerEquipmentChanged2(this, arg1) end, HealBot_Model:NotifyObservers("EQUIPMENT_CHANGED", "player")
["PET_BAR_SHOWGRID"] = function(this) HealBot_OnEvent_PartyMembersChanged(this) end, HealBot_OnEvent_PlayerEquipmentChanged(this)
["PET_BAR_HIDEGRID"] = function(this) HealBot_OnEvent_PartyMembersChanged(this) end, end,
["SPELLS_CHANGED"] = function(this, arg1) HealBot_OnEvent_SpellsChanged(this, arg1) end ["UNIT_INVENTORY_CHANGED"] = function(this, arg1)
if arg1 ~= "player" then return end
HealBot_Model:NotifyObservers("EQUIPMENT_CHANGED", arg1)
HealBot_OnEvent_PlayerEquipmentChanged2(this, arg1)
end,
["UNIT_PET"] = function(this, arg1) HealBot_OnEvent_PartyMembersChanged(this) 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) function HealBot_OnEvent(this, event, arg1, arg2, arg3, arg4)
@@ -254,8 +284,7 @@ function HealBot_OnEvent_VariablesLoaded(this)
this:RegisterEvent("PARTY_MEMBERS_CHANGED"); this:RegisterEvent("PARTY_MEMBERS_CHANGED");
this:RegisterEvent("PARTY_MEMBER_DISABLE"); this:RegisterEvent("PARTY_MEMBER_DISABLE");
this:RegisterEvent("PARTY_MEMBER_ENABLE"); this:RegisterEvent("PARTY_MEMBER_ENABLE");
this:RegisterEvent("PET_BAR_SHOWGRID"); this:RegisterEvent("UNIT_PET");
this:RegisterEvent("PET_BAR_HIDEGRID");
this:RegisterEvent("UNIT_HEALTH"); this:RegisterEvent("UNIT_HEALTH");
this:RegisterEvent("UNIT_MANA"); this:RegisterEvent("UNIT_MANA");
this:RegisterEvent("UNIT_RAGE"); this:RegisterEvent("UNIT_RAGE");
@@ -266,22 +295,24 @@ function HealBot_OnEvent_VariablesLoaded(this)
this:RegisterEvent("SPELLCAST_STOP"); this:RegisterEvent("SPELLCAST_STOP");
this:RegisterEvent("SPELLCAST_INTERRUPTED"); this:RegisterEvent("SPELLCAST_INTERRUPTED");
this:RegisterEvent("SPELLCAST_FAILED"); this:RegisterEvent("SPELLCAST_FAILED");
this:RegisterEvent("BAG_UPDATE");
this:RegisterEvent("BAG_UPDATE_COOLDOWN");
this:RegisterEvent("UNIT_AURA"); this:RegisterEvent("UNIT_AURA");
this:RegisterEvent("UPDATE_INVENTORY_ALERTS"); this:RegisterEvent("UPDATE_INVENTORY_ALERTS");
this:RegisterEvent("UNIT_INVENTORY_CHANGED"); this:RegisterEvent("UNIT_INVENTORY_CHANGED");
this:RegisterEvent("CHAT_MSG_ADDON"); this:RegisterEvent("CHAT_MSG_ADDON");
this:RegisterEvent("CHAT_MSG_SYSTEM"); this:RegisterEvent("CHAT_MSG_SYSTEM");
this:RegisterEvent("PLAYER_ENTERING_WORLD"); this:RegisterEvent("PLAYER_ENTERING_WORLD");
InitSpells = 2; if class == "DRUID" then
this:RegisterEvent("UPDATE_SHAPESHIFT_FORM");
this:RegisterEvent("UPDATE_SHAPESHIFT_FORMS");
HealBot_UpdateShapeshiftForm();
end
HealBot_SpellsInitFlag = 2;
end end
end end
function HealBot_OnEvent_UnitHealth(this, unit) function HealBot_OnEvent_UnitHealth(this, unit)
if (not HealBot_Heals[unit]) then return end if (not HealBot_Heals[unit]) then return end
HealBot_CheckCasting(unit); HealBot_CheckCasting(unit);
HealBot_RecalcHeals(unit);
if unit == HealBot_Action_TooltipUnit then if unit == HealBot_Action_TooltipUnit then
HealBot_Action_RefreshTooltip(HealBot_Action_TooltipUnit); HealBot_Action_RefreshTooltip(HealBot_Action_TooltipUnit);
end end
@@ -294,11 +325,11 @@ end
function HealBot_OnEvent_ZoneChanged(this) function HealBot_OnEvent_ZoneChanged(this)
HealBot_ResetRangeScale(); HealBot_ResetRangeScale();
Delay_RecalcParty = 1; HealBot_Delay_RecalcParty = 1;
end end
function HealBot_OnEvent_PlayerRegenDisabled(this) function HealBot_OnEvent_PlayerRegenDisabled(this)
HealBot_RecalcParty(); -- Removed HealBot_RecalcParty();
if (UnitIsDeadOrGhost("player")) or (UnitOnTaxi("player")) then if (UnitIsDeadOrGhost("player")) or (UnitOnTaxi("player")) then
if HealBot_Config.AutoClose==1 and HealBot_Config.ActionVisible~=0 then if HealBot_Config.AutoClose==1 and HealBot_Config.ActionVisible~=0 then
HealBot_Action.ProgrammaticHide = true; HealBot_Action.ProgrammaticHide = true;
@@ -334,15 +365,18 @@ end
function HealBot_OnEvent_PlayerRegenEnabled(this) function HealBot_OnEvent_PlayerRegenEnabled(this)
HealBot_IsFighting = false; HealBot_IsFighting = false;
Delay_RecalcParty = 1; -- Removed HealBot_Delay_RecalcParty = 1;
end end
function HealBot_OnEvent_PlayerTargetChanged(this) function HealBot_OnEvent_PlayerTargetChanged(this)
HealBot_RecalcParty(); if HealBot_Action_UnitButtons and HealBot_Action_UnitButtons["target"] then
HealBot_View_DirtyUnits["target"] = true
HealBot_OnEvent_UnitAura(nil, "target");
end
end end
function HealBot_OnEvent_PartyMembersChanged(this) function HealBot_OnEvent_PartyMembersChanged(this)
Delay_RecalcParty = 1; HealBot_Delay_RecalcParty = 1;
end end
function HealBot_OnEvent_PartyMemberDisable(this, unit) function HealBot_OnEvent_PartyMemberDisable(this, unit)
@@ -351,9 +385,9 @@ end
function HealBot_OnEvent_SystemMsg(this, msg) function HealBot_OnEvent_SystemMsg(this, msg)
if type(msg) == "string" then 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 if not deserter then
local tmpTest, tmpTest, deserter = string.find(msg, HB_HASLEFTPARTY); local tmpTest, tmpTest, deserter = string.find(msg, HEALBOT_HASLEFTPARTY);
end end
if deserter then if deserter then
if (HealBot_Healers[deserter]) then if (HealBot_Healers[deserter]) then
@@ -369,8 +403,8 @@ function HealBot_OnEvent_SystemMsg(this, msg)
end end
end end
end end
elseif msg == HB_YOULEAVETHEGROUP or msg == HB_YOULEAVETHERAID then elseif msg == HEALBOT_YOULEAVETHEGROUP or msg == HEALBOT_YOULEAVETHERAID then
Delay_RecalcParty = 1; HealBot_Delay_RecalcParty = 1;
end end
end end
end end
@@ -392,29 +426,19 @@ end
function HealBot_OnEvent_SpellsChanged(this, arg1) function HealBot_OnEvent_SpellsChanged(this, arg1)
if arg1 then return; end if arg1 then return; end
HealBot_AddDebug("HB: SpellsChanged"); HealBot_AddDebug("HB: SpellsChanged");
InitSpells = 2; HealBot_SpellsInitFlag = 2;
end end
function HealBot_OnEvent_TalentsChanged(this, arg1) function HealBot_OnEvent_TalentsChanged(this, arg1)
HealBot_AddDebug("HB: TalentsChanged"); HealBot_AddDebug("HB: TalentsChanged");
end end
function HealBot_OnEvent_BagUpdate(this, bag)
if HealBot_EquipChangeTimer == 0 then
HealBot_RecalcSpells();
end
end
function HealBot_OnEvent_BagUpdateCooldown(this, bag)
if not bag then
bag = "undef"
elseif HealBot_EquipChangeTimer == 0 then
HealBot_RecalcSpells();
end
end
function HealBot_OnEvent_PlayerEnteringWorld(this) function HealBot_OnEvent_PlayerEnteringWorld(this)
HealBot_IsFighting = false; HealBot_IsFighting = false;
-- Re-apply the refresh hook late in case another addon overrode it during load
if HealBot_ApplyRefreshHook then
HealBot_ApplyRefreshHook()
end
end end
function HealBot_OnEvent_SpellcastStart(this, spell, duration) function HealBot_OnEvent_SpellcastStart(this, spell, duration)
@@ -429,8 +453,11 @@ function HealBot_OnEvent_SpellcastStart(this, spell, duration)
end end
end end
function HealBot_OnEvent_SpellcastStop(this) function HealBot_OnEvent_SpellcastStop(this, eventName)
HealBot_IsCasting = false; HealBot_IsCasting = false;
if eventName == "SPELLCAST_FAILED" then
HealBot_CastFailed = true;
end
HealBot_StopCasting(); HealBot_StopCasting();
HealBot_RecalcHeals(); HealBot_RecalcHeals();
if HealBot_IamRessing then if HealBot_IamRessing then
+240 -72
View File
@@ -74,20 +74,14 @@ function HealBot_CastSpellByName(spell)
CastSpell(id, BOOKTYPE_SPELL); CastSpell(id, BOOKTYPE_SPELL);
end end
function HealBot_StartCasting(spell, target, ttype) function HealBot_AnnounceCast(spell, target)
HealBot_CastSpellByName(spell); if not spell or not target then return end
HealBot_CastingSpell = spell;
HealBot_CastingTarget = target; if UnitIsDeadOrGhost(target) then
if ( SpellCanTargetUnit(target) ) then local spellLower = string.lower(spell)
SpellTargetUnit(target); if not (string.find(spellLower, "resurrection") or string.find(spellLower, "ancestral spirit") or string.find(spellLower, "redemption") or string.find(spellLower, "rebirth")) then
ttype = "fired"; return
elseif SpellIsTargeting() then end
SpellTargetUnit(target);
SpellStopTargeting()
elseif ttype == "direct" then
if ( CheckInteractDistance(target, 4) ) then
ttype = "fired";
end
end end
if HealBot_Config.ChatMessages then if HealBot_Config.ChatMessages then
@@ -95,13 +89,26 @@ function HealBot_StartCasting(spell, target, ttype)
if target == "target" then tName = HealBot_TargetName() or "target" else tName = UnitName(target) end if target == "target" then tName = HealBot_TargetName() or "target" else tName = UnitName(target) end
if not tName then tName = target end if not tName then tName = target end
local baseSpell = spell local baseSpell = spell
local parenIndex = string.find(spell, "%(") local parenIndex = string.find(spell, " %(")
if parenIndex then if parenIndex then
baseSpell = string.sub(spell, 1, parenIndex - 1) baseSpell = string.sub(spell, 1, parenIndex - 1)
else
parenIndex = string.find(spell, "%(")
if parenIndex then
baseSpell = string.sub(spell, 1, parenIndex - 1)
end
end end
-- Strip trailing spaces from base spell
baseSpell = string.gsub(baseSpell, "%s+$", "")
for i = 1, 5 do for i = 1, 5 do
local msgConf = HealBot_Config.ChatMessages[i] local msgConf = HealBot_Config.ChatMessages[i]
if msgConf and msgConf.Spell == baseSpell and msgConf.Channel ~= "None" then local configSpell = msgConf and msgConf.Spell or ""
-- Strip trailing spaces from config spell just in case
configSpell = string.gsub(configSpell, "%s+$", "")
if msgConf and configSpell ~= "" and msgConf.Channel ~= "None" and (configSpell == spell or configSpell == baseSpell) then
local msg = msgConf.Message or "" local msg = msgConf.Message or ""
msg = string.gsub(msg, "#Spell#", spell) msg = string.gsub(msg, "#Spell#", spell)
msg = string.gsub(msg, "#Target#", tName) msg = string.gsub(msg, "#Target#", tName)
@@ -118,21 +125,84 @@ function HealBot_StartCasting(spell, target, ttype)
end end
end end
end end
end
function HealBot_Process_HealValue(spell, target)
if HealBot_Spells[spell] and HealBot_Spells[spell].CastTime > 1 then
HealBot_HealValue = HealBot_Spells[spell].HealsDur;
-- Apply dynamic Preservation bonus
if HEALBOT_REGROWTH and string.find(spell, HEALBOT_REGROWTH) then
local presRank = HealBot_GetTalentRank("Preservation")
if presRank > 0 then
local hasRejuv = false
for i=1,32 do
local buff = UnitBuff(target, i)
if not buff then break end
if string.find(buff, "Spell_Nature_Rejuvenation") then
hasRejuv = true
break
end
end
if hasRejuv then
local extHeal = HealBot_Spells[spell].HealsExt or 0
local bonus = extHeal * (presRank * 0.10)
HealBot_HealValue = HealBot_HealValue + math.floor(bonus)
end
end
end
local uname = UnitName(target)
if uname then
HealBot_SendAddonMessage(HEALBOT_ADDON_ID, ">> " .. uname .. " <<=>> " .. HealBot_HealValue .. " << ");
if not HealBot_HealsIn[uname] then
HealBot_HealsIn[uname] = 0;
end
HealBot_HealsIn[uname] = HealBot_HealsIn[uname] + HealBot_HealValue;
HealBot_RecalcHeals(HealBot_FindUnitID(uname));
end
end
end
function HealBot_StartCasting(spell, target, ttype)
HealBot_CastFailed = false;
HealBot_CastSpellByName(spell);
if ( SpellCanTargetUnit(target) ) then
SpellTargetUnit(target);
ttype = "fired";
elseif SpellIsTargeting() then
SpellTargetUnit(target);
SpellStopTargeting()
elseif ttype == "direct" then
if ( UnitIsUnit(target, "player") or CheckInteractDistance(target, 4) ) then
ttype = "fired";
end
end
if ttype == "fired" and HealBot_Spells[spell] then if ttype == "fired" and HealBot_Spells[spell] then
if HealBot_Spells[spell].CastTime > 1 then if not HealBot_CastFailed then
HealValue = HealBot_Spells[spell].HealsDur; HealBot_CastingSpell = spell;
HealBot_SendAddonMessage(HEALBOT_ADDON_ID, ">> " .. UnitName(target) .. " <<=>> " .. HealValue .. " << "); HealBot_CastingTarget = target;
HealBot_Process_HealValue(spell, target);
HealBot_AnnounceCast(spell, target);
end end
end end
end end
function HealBot_StopCasting() function HealBot_StopCasting()
if HealBot_CastingTarget then if HealBot_CastingTarget then
if HealBot_HealsIn[UnitName(HealBot_CastingTarget)] then if HealBot_HealValue > 0 then
if HealValue > 0 then local uname = UnitName(HealBot_CastingTarget)
HealBot_SendAddonMessage(HEALBOT_ADDON_ID, ">> " .. UnitName(HealBot_CastingTarget) .. " <<=>> " .. 0 - HealValue .. " << "); if uname then
HealValue = 0; HealBot_SendAddonMessage(HEALBOT_ADDON_ID, ">> " .. uname .. " <<=>> " .. 0 - HealBot_HealValue .. " << ");
if HealBot_HealsIn[uname] then
HealBot_HealsIn[uname] = HealBot_HealsIn[uname] - HealBot_HealValue;
if HealBot_HealsIn[uname] < 0 then
HealBot_HealsIn[uname] = 0;
end
HealBot_RecalcHeals(HealBot_FindUnitID(uname));
end
end end
HealBot_HealValue = 0;
end end
end end
HealBot_CastingSpell = nil; HealBot_CastingSpell = nil;
@@ -176,7 +246,7 @@ function HealBot_CheckCasting(unit)
local ag = HealBot_Config.babortcolg[HealBot_Config.Current_Skin] or 0.1; local ag = HealBot_Config.babortcolg[HealBot_Config.Current_Skin] or 0.1;
local ab = HealBot_Config.babortcolb[HealBot_Config.Current_Skin] or 0.5; local ab = HealBot_Config.babortcolb[HealBot_Config.Current_Skin] or 0.5;
local aa = HealBot_Config.babortcola[HealBot_Config.Current_Skin] or 1; local aa = HealBot_Config.babortcola[HealBot_Config.Current_Skin] or 1;
bar.txt = getglobal(bar:GetName() .. "_text"); if not bar.txt then bar.txt = getglobal(bar:GetName() .. "_text") end
if HealBot_IsCasting == false and HealBot_AbortButton == 0 then if HealBot_IsCasting == false and HealBot_AbortButton == 0 then
bar:SetStatusBarColor(ar, ag, ab, 0); bar:SetStatusBarColor(ar, ag, ab, 0);
@@ -218,6 +288,10 @@ function HealBot_CastSpellOnFriend(spell, target)
local targetEnemy = UnitCanAttack("player", "target"); local targetEnemy = UnitCanAttack("player", "target");
local oldTarget = UnitName("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 if oldTarget ~= UnitName(target) then
TargetUnit(target); TargetUnit(target);
end end
@@ -267,7 +341,46 @@ function HealBot_SetItemDefaults(spell)
end end
function HealBot_SetSpellDefaults(spell) function HealBot_SetSpellDefaults(spell)
HealBot_Spells[spell].HealsDur = math.floor((HealBot_Spells[spell].HealsCast + HealBot_Spells[spell].HealsExt) + HealBot_Spells[spell].RealHealing); local baseHeal = HealBot_Spells[spell].HealsCast or 0
local extHeal = HealBot_Spells[spell].HealsExt or 0
local realHeal = HealBot_Spells[spell].RealHealing or 0
local _, class = UnitClass("player")
if class == "DRUID" then
local giftRank = HealBot_GetTalentRank("Gift of Nature")
local genRank = HealBot_GetTalentRank("Genesis")
local mult = 1 + (giftRank * 0.02)
baseHeal = baseHeal * mult
extHeal = extHeal * mult
realHeal = realHeal * mult
if genRank > 0 then
extHeal = extHeal * (1 + (genRank * 0.05))
end
elseif class == "PRIEST" then
local spiritRank = HealBot_GetTalentRank("Spiritual Healing")
local mult = 1 + (spiritRank * 0.06)
baseHeal = baseHeal * mult
extHeal = extHeal * mult
realHeal = realHeal * mult
if HEALBOT_RENEW and string.find(spell, HEALBOT_RENEW) then
local renewRank = HealBot_GetTalentRank("Improved Renew")
extHeal = extHeal * (1 + (renewRank * 0.05))
end
elseif class == "PALADIN" then
local hlRank = HealBot_GetTalentRank("Healing Light")
if (HEALBOT_HOLY_LIGHT and string.find(spell, HEALBOT_HOLY_LIGHT)) or
(HEALBOT_FLASH_OF_LIGHT and string.find(spell, HEALBOT_FLASH_OF_LIGHT)) or
(HEALBOT_HOLY_SHOCK and string.find(spell, HEALBOT_HOLY_SHOCK)) then
local mult = 1 + (hlRank * 0.04)
baseHeal = baseHeal * mult
realHeal = realHeal * mult
end
end
HealBot_Spells[spell].HealsDur = math.floor(baseHeal + extHeal + realHeal);
end end
function HealBot_AddHeal(spell) function HealBot_AddHeal(spell)
@@ -280,13 +393,13 @@ end
function HealBot_FindHealSpells() function HealBot_FindHealSpells()
local id = 1; 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 = {} }; HealBot_Heals = { player = {}, pet = {}, party = {} };
table.foreach(HealBot_CurrentSpells, function (index, spell) table.foreach(HealBot_CurrentSpells, function (index, spell)
if (HealBot_Spells[spell]) then if (HealBot_Spells[spell]) then
if CalcEquipBonus then if HealBot_CalcEquipBonus then
local healingbonus_penalty = 1; local healingbonus_penalty = 1;
if HealBot_Spells[spell].Level < 20 then if HealBot_Spells[spell].Level < 20 then
healingbonus_penalty = (1 - ((20 - HealBot_Spells[spell].Level) * 0.0375)); healingbonus_penalty = (1 - ((20 - HealBot_Spells[spell].Level) * 0.0375));
@@ -341,15 +454,16 @@ function HealBot_FindHealSpells()
HealBot_Heals["raidpet" .. i] = HealBot_Heals.party; HealBot_Heals["raidpet" .. i] = HealBot_Heals.party;
end end
if CalcEquipBonus then if HealBot_CalcEquipBonus then
HealBot_AddDebug("...Done Equip Bonus:" .. RealHealing); HealBot_AddDebug("...Done Equip Bonus:" .. RealHealing);
end end
CalcEquipBonus = false; HealBot_CalcEquipBonus = false;
end end
function HealBot_CanCastSpell(spell, unit) function HealBot_CanCastSpell(spell, unit)
local this = HealBot_Spells[spell]; local this = HealBot_Spells[spell];
if this.Mana > UnitMana("player") then return false end; -- Removed manual mana check so WoW can properly handle 0-cost buffs (Clearcasting/Inner Focus)
-- and so tooltips can render in red instead of disappearing.
if this.BagSlot then if this.BagSlot then
local bag, slot = HealBot_UnpackBagSlot(this.BagSlot); local bag, slot = HealBot_UnpackBagSlot(this.BagSlot);
local start, duration, enable = GetContainerItemCooldown(bag, slot); local start, duration, enable = GetContainerItemCooldown(bag, slot);
@@ -362,19 +476,43 @@ end
function HealBot_GetHealSpell(unit, pattern) function HealBot_GetHealSpell(unit, pattern)
if (not UnitName(unit)) then return nil end; if (not UnitName(unit)) then return nil end;
if not pattern then return nil end;
if UnitOnTaxi("player") then return nil end; 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_Config.ProtectPvP == 1 and UnitIsPVP(unit) and not UnitIsPVP("player") then return nil end
if HealBot_UnitClass("player") == "DRUID" then 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 end
local spell = HealBot_GetSpellName(HealBot_GetSpellId(pattern))
local range = 40; -- Handle Inline Scripts
if HealBot_Spells[spell] then if string.sub(pattern, 1, 1) == "/" then
if not HealBot_CanCastSpell(spell, unit) then return nil end; return pattern;
range = HealBot_Spells[spell].range;
end end
if HealBot_Range_Check(unit, range) == 0 then return nil end;
return spell; -- Handle Spells
if HealBot_Spells[pattern] or HealBot_GetSpellId(pattern) then
local spell = HealBot_GetSpellName(HealBot_GetSpellId(pattern)) or pattern
local range = 40;
if HealBot_Spells[spell] then
if not HealBot_CanCastSpell(spell, unit) then return nil end;
range = HealBot_Spells[spell].range or 40;
end
if HealBot_Range_Check(unit, range) == 0 then return nil end;
return spell;
end
-- Handle Named Macros
if GetMacroIndexByName(pattern) ~= 0 then
return pattern;
end
-- Handle Items
local bag, slot = HealBot_FindBagSlot(pattern)
if bag then
-- optionally check item range, but skipping for now as it's complex in vanilla
return pattern;
end
return nil;
end end
function HealBot_HealUnit(unit, pattern) function HealBot_HealUnit(unit, pattern)
@@ -402,17 +540,38 @@ function HealBot_RecalcSpells()
HealBot_RecalcParty(); HealBot_RecalcParty();
end end
function HealBot_GetTalentRank(talentName)
for t = 1, GetNumTalentTabs() do
for i = 1, GetNumTalents(t) do
local nameTalent, icon, tier, column, currRank, maxRank = GetTalentInfo(t, i);
if nameTalent == talentName then
return currRank;
end
end
end
return 0;
end
function HealBot_SpiBonus(spell) function HealBot_SpiBonus(spell)
local heals_modifer = 0; local heals_modifer = 0;
local base, stat, posBuff, negBuff = UnitStat("player", 5); local base, stat, posBuff, negBuff = UnitStat("player", 5);
nameTalent, icon, tier, column, currRank, maxRank = GetTalentInfo(2, 14); -- Spiritual guidance local currRank = HealBot_GetTalentRank("Spiritual Guidance")
spiGuideBonus = stat * 0.05; if currRank > 0 then
heals_modifer = heals_modifer + (currRank * spiGuideBonus); local spiGuideBonus = stat * 0.05;
heals_modifer = heals_modifer + (currRank * spiGuideBonus);
end
return heals_modifer; return heals_modifer;
end end
function HealBot_GetBonus() function HealBot_GetBonus()
local HealBonus = HealBot_BonusScanner:GetBonus(); local HealBonus = HealBot_BonusScanner:GetBonus() or 0;
if UnitClass("player") == "PALADIN" then
local ironRank = HealBot_GetTalentRank("Ironclad")
if ironRank > 0 then
local base, effectiveArmor = UnitArmor("player")
HealBonus = HealBonus + (effectiveArmor * (ironRank * 0.01))
end
end
return HealBonus; return HealBonus;
end end
@@ -434,9 +593,7 @@ function HealBot_InitSpells()
end end
id = id + 1; id = id + 1;
end end
if class == "PRIEST" or class == "DRUID" or class == "PALADIN" or class == "SHAMAN" then
HealBot_AddChat("Initiated HealBot_CurrentSpells with " .. cnt .. " Spells");
end
return cnt; return cnt;
end end
@@ -454,7 +611,7 @@ function HealBot_InitGetSpellData(spell, id, class)
tmpText = getglobal("HealBot_ScanTooltipTextLeft2"); tmpText = getglobal("HealBot_ScanTooltipTextLeft2");
if (tmpText:GetText()) then if (tmpText:GetText()) then
line = tmpText:GetText(); line = tmpText:GetText();
tmpTest, tmpTest, _mana = string.find(line, HB_TOOLTIP_MANA); tmpTest, tmpTest, _mana = string.find(line, HEALBOT_TOOLTIP_MANA);
else else
HealBot_Report_Error("================================"); HealBot_Report_Error("================================");
HealBot_Report_Error("ERROR: HealBot_ScanTooltip is lost"); HealBot_Report_Error("ERROR: HealBot_ScanTooltip is lost");
@@ -464,7 +621,7 @@ function HealBot_InitGetSpellData(spell, id, class)
tmpText = getglobal("HealBot_ScanTooltipTextRight2"); tmpText = getglobal("HealBot_ScanTooltipTextRight2");
if (tmpText:GetText()) then if (tmpText:GetText()) then
line = tmpText:GetText(); line = tmpText:GetText();
tmpTest, tmpTest, _range = string.find(line, HB_TOOLTIP_RANGE); tmpTest, tmpTest, _range = string.find(line, HEALBOT_TOOLTIP_RANGE);
else else
HealBot_Report_Error("================================"); HealBot_Report_Error("================================");
HealBot_Report_Error("ERROR: HealBot_ScanTooltip is lost"); HealBot_Report_Error("ERROR: HealBot_ScanTooltip is lost");
@@ -475,12 +632,12 @@ function HealBot_InitGetSpellData(spell, id, class)
_cast = nil; _cast = nil;
if (tmpText:GetText()) then if (tmpText:GetText()) then
line = tmpText:GetText(); line = tmpText:GetText();
if (line == HB_TOOLTIP_INSTANT_CAST) then if (line == HEALBOT_TOOLTIP_INSTANT_CAST) then
_cast = 0; _cast = 0;
elseif line == HB_TOOLTIP_CHANNELED then elseif line == HEALBOT_TOOLTIP_CHANNELED then
_cast = 0; _cast = 0;
elseif (tmpText) then elseif (tmpText) then
tmpTest, tmpTest, _cast = string.find(line, HB_TOOLTIP_CAST_TIME); tmpTest, tmpTest, _cast = string.find(line, HEALBOT_TOOLTIP_CAST_TIME);
end end
else else
HealBot_Report_Error("================================"); HealBot_Report_Error("================================");
@@ -494,58 +651,58 @@ function HealBot_InitGetSpellData(spell, id, class)
line = tmpText:GetText(); line = tmpText:GetText();
if class == "PRIEST" then if class == "PRIEST" then
if string.sub(spell, 1, 14) == string.sub(HEALBOT_POWER_WORD_SHIELD, 1, 14) 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; _HealsExt = 0;
_HealsMax = _HealsMin; _HealsMax = _HealsMin;
elseif string.sub(spell, 1, 4) == string.sub(HEALBOT_RENEW, 1, 4) then 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; _HealsMin = 0;
_HealsMax = 0; _HealsMax = 0;
if (_HealsExt == nil) then 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 end
if (_HealsExt == nil) then 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 end
if (_HealsExt == nil) then 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 end
elseif string.sub(spell, 1, 9) == string.sub(HEALBOT_LESSER_HEAL, 1, 9) then 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 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 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 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 end
elseif class == "DRUID" then elseif class == "DRUID" then
if string.sub(spell, 1, 6) == string.sub(HEALBOT_REGROWTH, 1, 6) 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 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 end
elseif string.sub(spell, 1, 9) == string.sub(HEALBOT_REJUVENATION, 1, 9) then 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; _HealsMin = 0;
_HealsMax = 0; _HealsMax = 0;
if (_HealsExt == nil) then 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 end
elseif string.sub(spell, 1, 7) == string.sub(HEALBOT_HEALING_TOUCH, 1, 7) then 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 end
elseif class == "PALADIN" then elseif class == "PALADIN" then
if string.sub(spell, 1, 9) == string.sub(HEALBOT_HOLY_LIGHT, 1, 9) 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 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 end
elseif class == "SHAMAN" then elseif class == "SHAMAN" then
if string.sub(spell, 1, 9) == string.sub(HEALBOT_HEALING_WAVE, 1, 9) 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 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
end end
else else
@@ -561,7 +718,7 @@ function HealBot_InitGetSpellData(spell, id, class)
if HealBot_ScanTooltipTextLeft2:GetText() then if HealBot_ScanTooltipTextLeft2:GetText() then
HealBot_Report_Error("ERROR: Tooltip = >> " .. HealBot_ScanTooltipTextLeft2:GetText() .. " <<"); HealBot_Report_Error("ERROR: Tooltip = >> " .. HealBot_ScanTooltipTextLeft2:GetText() .. " <<");
end end
HealBot_Report_Error("ERROR: Patten = >> " .. HB_TOOLTIP_MANA .. " <<"); HealBot_Report_Error("ERROR: Patten = >> " .. HEALBOT_TOOLTIP_MANA .. " <<");
end end
if (_range == nil) then if (_range == nil) then
HealBot_Report_Error("================================"); HealBot_Report_Error("================================");
@@ -570,7 +727,7 @@ function HealBot_InitGetSpellData(spell, id, class)
if HealBot_ScanTooltipTextRight2:GetText() then if HealBot_ScanTooltipTextRight2:GetText() then
HealBot_Report_Error("ERROR: Tooltip = >> " .. HealBot_ScanTooltipTextRight2:GetText() .. " <<"); HealBot_Report_Error("ERROR: Tooltip = >> " .. HealBot_ScanTooltipTextRight2:GetText() .. " <<");
end end
HealBot_Report_Error("ERROR: Patten = >> " .. HB_TOOLTIP_RANGE .. " <<"); HealBot_Report_Error("ERROR: Patten = >> " .. HEALBOT_TOOLTIP_RANGE .. " <<");
end end
if (_cast == nil) then if (_cast == nil) then
HealBot_Report_Error("================================"); HealBot_Report_Error("================================");
@@ -579,7 +736,7 @@ function HealBot_InitGetSpellData(spell, id, class)
if HealBot_ScanTooltipTextLeft3:GetText() then if HealBot_ScanTooltipTextLeft3:GetText() then
HealBot_Report_Error("ERROR: Tooltip = >> " .. HealBot_ScanTooltipTextLeft3:GetText() .. " <<"); HealBot_Report_Error("ERROR: Tooltip = >> " .. HealBot_ScanTooltipTextLeft3:GetText() .. " <<");
end end
HealBot_Report_Error("ERROR: Patten = >> " .. HB_TOOLTIP_CAST_TIME .. " <<"); HealBot_Report_Error("ERROR: Patten = >> " .. HEALBOT_TOOLTIP_CAST_TIME .. " <<");
end end
if (tmpTest == nil) then if (tmpTest == nil) then
HealBot_Report_Error("================================"); HealBot_Report_Error("================================");
@@ -641,13 +798,24 @@ function HealBot_Generic_Patten(matchStr, matchPattern)
return tmpTest, _HealsMin, _HealsMax; return tmpTest, _HealsMin, _HealsMax;
end end
HealBot_ActiveShapeshiftStance = nil;
function HealBot_UpdateShapeshiftForm()
HealBot_ActiveShapeshiftStance = HealBot_GetShapeshiftForm();
end
function HealBot_GetShapeshiftForm() function HealBot_GetShapeshiftForm()
local forms = GetNumShapeshiftForms(); local forms = GetNumShapeshiftForms();
if forms then if forms then
local i; local i;
for i=1,forms do for i=1,forms do
local icon,name,active = GetShapeshiftFormInfo(i); 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
end end
return nil; return nil;
+50 -1
View File
@@ -2,6 +2,20 @@ HealBot_ConfigDefaults = {
ShowManaBars=0, ShowManaBars=0,
ManaBarsHealersOnly=0, ManaBarsHealersOnly=0,
Version = HEALBOT_VERSION, Version = HEALBOT_VERSION,
AutoSwap_Enabled = 0,
AutoSwap_Profiles = {
[1] = HEALBOT_SKINS_STD,
[2] = HEALBOT_SKINS_STD,
[3] = HEALBOT_SKINS_STD,
[4] = HEALBOT_SKINS_STD,
[5] = HEALBOT_SKINS_STD,
},
bmaxrows = {
[HEALBOT_SKINS_STD] = 0,
},
GridOrientation = {
[HEALBOT_SKINS_STD] = 1,
},
AlertLevel = 0.95, AlertLevel = 0.95,
AutoClose = 1, AutoClose = 1,
PanelSounds = 1, PanelSounds = 1,
@@ -14,6 +28,7 @@ HealBot_ConfigDefaults = {
HideSolo = 0, HideSolo = 0,
OverHeal = 0.25, OverHeal = 0.25,
CastNotify = 1, CastNotify = 1,
AutoUnshift = 1,
ChatMessages = { ChatMessages = {
[1] = { Spell = "None", Message = "Casting #Spell# on #Target#", Channel = "None" }, [1] = { Spell = "None", Message = "Casting #Spell# on #Target#", Channel = "None" },
[2] = { Spell = "None", Message = "Casting #Spell# on #Target#", Channel = "None" }, [2] = { Spell = "None", Message = "Casting #Spell# on #Target#", Channel = "None" },
@@ -24,6 +39,7 @@ HealBot_ConfigDefaults = {
HideOptions = 0, HideOptions = 0,
HideAbort = 1, HideAbort = 1,
ShowTooltip = 1, ShowTooltip = 1,
ShowHealthText = 0,
GrowUpwards = 0, GrowUpwards = 0,
ProtectPvP = 1, ProtectPvP = 1,
QualityRange = 0, QualityRange = 0,
@@ -171,13 +187,25 @@ HealBot_ConfigDefaults = {
}, },
}, },
EnableHealthy = 0, EnableHealthy = 0,
ShowNonManaBars = 0,
ActionVisible = 0, ActionVisible = 0,
ActionMouseover = 1,
CDCLeftText = {[HEALBOT_PRIEST]="None", [HEALBOT_SHAMAN]="None", [HEALBOT_DRUID]="None", [HEALBOT_PALADIN]="None",}, 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",}, CDCRightText = {[HEALBOT_PRIEST]="None", [HEALBOT_SHAMAN]="None", [HEALBOT_DRUID]="None", [HEALBOT_PALADIN]="None",},
Current_Skin = "Modern Flat", Current_Skin = "Modern Flat",
Skin_ID = 1, Skin_ID = 1,
Skins = {"Modern Flat", HEALBOT_SKINS_STD, "HealBot Party", "HealBot Raid", "Alteric Valley"}, Skins = {"Modern Flat", HEALBOT_SKINS_STD, "HealBot Party", "HealBot Raid", "Alteric Valley"},
AutoSwap_Enabled = 0,
AutoSwap_Profiles = {
[1] = "Modern Flat", -- Solo
[2] = "HealBot Party", -- Party (2-5)
[3] = "HealBot Raid", -- Raid 15 (6-15)
[4] = "HealBot Raid", -- Raid 25 (16-25)
[5] = "HealBot Raid", -- Raid 40 (26-40)
},
numcols = {[HEALBOT_SKINS_STD] = 1, ["HealBot Party"] = 1, ["HealBot Raid"] = 4, ["Alteric Valley"] = 2, ["Modern Flat"] = 1}, numcols = {[HEALBOT_SKINS_STD] = 1, ["HealBot Party"] = 1, ["HealBot Raid"] = 4, ["Alteric Valley"] = 2, ["Modern Flat"] = 1},
bmaxrows = {[HEALBOT_SKINS_STD] = 0, ["HealBot Party"] = 0, ["HealBot Raid"] = 0, ["Alteric Valley"] = 0, ["Modern Flat"] = 0},
GridOrientation = {[HEALBOT_SKINS_STD] = 1, ["HealBot Party"] = 1, ["HealBot Raid"] = 1, ["Alteric Valley"] = 1, ["Modern Flat"] = 1},
btexture = {[HEALBOT_SKINS_STD] = 8,["HealBot Party"] = 6, ["HealBot Raid"] = 7, ["Alteric Valley"] = 9, ["Modern Flat"] = 10}, btexture = {[HEALBOT_SKINS_STD] = 8,["HealBot Party"] = 6, ["HealBot Raid"] = 7, ["Alteric Valley"] = 9, ["Modern Flat"] = 10},
bcspace = {[HEALBOT_SKINS_STD] = 4, ["HealBot Party"] = 4, ["HealBot Raid"] = 2, ["Alteric Valley"] = 2, ["Modern Flat"] = 4}, bcspace = {[HEALBOT_SKINS_STD] = 4, ["HealBot Party"] = 4, ["HealBot Raid"] = 2, ["Alteric Valley"] = 2, ["Modern Flat"] = 4},
brspace = {[HEALBOT_SKINS_STD] = 1, ["HealBot Party"] = 2, ["HealBot Raid"] = 2, ["Alteric Valley"] = 1, ["Modern Flat"] = 2}, brspace = {[HEALBOT_SKINS_STD] = 1, ["HealBot Party"] = 2, ["HealBot Raid"] = 2, ["Alteric Valley"] = 1, ["Modern Flat"] = 2},
@@ -510,6 +538,7 @@ HealBot_Buff_Spells = {
HEALBOT_PRAYER_OF_SHADOW_PROTECTION, HEALBOT_PRAYER_OF_SHADOW_PROTECTION,
HEALBOT_INNER_FIRE, HEALBOT_INNER_FIRE,
HEALBOT_FEAR_WARD, HEALBOT_FEAR_WARD,
HEALBOT_ENLIGHTEN,
}, },
[HEALBOT_MAGE] = { [HEALBOT_MAGE] = {
HEALBOT_ARCANE_INTELLECT, HEALBOT_ARCANE_INTELLECT,
@@ -540,7 +569,7 @@ HealBot_Debuff_Types = {
HealBot_IsFighting = false; HealBot_IsFighting = false;
HealBot_DebuffPriority = {"none"}; HealBot_DebuffPriority = {"none"};
HealBot_DebuffWatch = {[HEALBOT_DISEASE_en]="NO", [HEALBOT_MAGIC_en]="NO", [HEALBOT_POISON_en]="NO", [HEALBOT_CURSE_en]="NO"}; HealBot_DebuffWatch = {[HEALBOT_DISEASE_en]=false, [HEALBOT_MAGIC_en]=false, [HEALBOT_POISON_en]=false, [HEALBOT_CURSE_en]=false};
HealBot_Heals = {}; HealBot_Heals = {};
@@ -554,3 +583,23 @@ HealBot_SpamCnt=0;
HealBot_Action_TooltipUnit=nil; HealBot_Action_TooltipUnit=nil;
HealBot_Ressing = {}; HealBot_Ressing = {};
HealBot_IamRessing = false; HealBot_IamRessing = false;
-- Table Recycling Pool (Puppeteer-inspired)
local tablePool = {}
function HealBot_GetTable()
local t = table.remove(tablePool)
if not t then
t = {}
end
return t
end
function HealBot_ReleaseTable(t)
if type(t) == "table" then
for k in pairs(t) do
t[k] = nil
end
table.insert(tablePool, t)
end
end
+35 -32
View File
@@ -70,6 +70,9 @@ HEALBOT_LESSER_HEAL = "Geringes Heilen";
HEALBOT_LESSER_HEALING_WAVE = "Geringe Welle der Heilung"; HEALBOT_LESSER_HEALING_WAVE = "Geringe Welle der Heilung";
HEALBOT_MEND_PET = "Tier Heilen"; HEALBOT_MEND_PET = "Tier Heilen";
HEALBOT_POWER_WORD_SHIELD = "Machtwort: Schild"; HEALBOT_POWER_WORD_SHIELD = "Machtwort: Schild";
HEALBOT_INNER_FIRE = "Inneres Feuer";
HEALBOT_FEAR_WARD = "Furchtzauberschutz";
HEALBOT_ENLIGHTEN = "Enlighten";
HEALBOT_REGROWTH = "Nachwachsen"; HEALBOT_REGROWTH = "Nachwachsen";
HEALBOT_RENEW = "Erneuerung"; HEALBOT_RENEW = "Erneuerung";
HEALBOT_REJUVENATION = "Verj\195\188ngung"; HEALBOT_REJUVENATION = "Verj\195\188ngung";
@@ -113,25 +116,25 @@ HEALBOT_RANK_11 = " (Rang 11)";
HEALBOT_LIBRARY_INCHEAL = "Erh\195\182ht durch Zauber und Effekte verursachte Heilung um bis zu (%d+)%."; 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+)%."; 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", HEAL = "Heilung",
} }
HB_BONUSSCANNER_PREFIX_EQUIP = "Anlegen: "; HEALBOT_BONUSSCANNER_PREFIX_EQUIP = "Anlegen: ";
HB_BONUSSCANNER_PREFIX_SET = "Set: "; 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 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 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" }, { 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", ["Heilzauber"] = "HEAL",
["Heilung und Zauberschaden"] = {"HEAL","DMG"}, ["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 des Mojo", effect = {"DMG", "HEAL"}, value = 18 },
{ pattern = "Zandalarianisches Siegel der Inneren Ruhe", effect = "HEAL", value = 33 }, { pattern = "Zandalarianisches Siegel der Inneren Ruhe", effect = "HEAL", value = 33 },
@@ -154,32 +157,32 @@ HEALBOT_DEBUFF_WEAKENED_SOUL = "Interface\\Icons\\Spell_Holy_AshesToAshes";
HEALBOT_DEBUFF_RECENTLY_BANDAGED = "Interface\\Icons\\INV_Misc_Bandage_08"; HEALBOT_DEBUFF_RECENTLY_BANDAGED = "Interface\\Icons\\INV_Misc_Bandage_08";
HB_SPELL_PATTERN_LESSER_HEAL = "Euer Ziel um (%d+) bis (%d+) Punkt%(e%) heilen"; HEALBOT_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"; HEALBOT_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"; HEALBOT_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%)"; HEALBOT_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"; HEALBOT_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"; HEALBOT_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"; HEALBOT_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%)"; HEALBOT_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+)"; HEALBOT_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+)"; HEALBOT_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%)"; HEALBOT_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%)"; HEALBOT_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%)"; HEALBOT_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%)"; HEALBOT_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"; HEALBOT_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_REJUVENATION1 = "Heilt das Ziel von (%d+) bis (%d+) \195\188ber (%d+) Sek";
HB_TOOLTIP_MANA = "^(%d+) Mana$"; HEALBOT_TOOLTIP_MANA = "^(%d+) Mana$";
HB_TOOLTIP_RANGE = "(%d+) m"; HEALBOT_TOOLTIP_RANGE = "(%d+) m";
HB_TOOLTIP_INSTANT_CAST = "Spontanzauber"; HEALBOT_TOOLTIP_INSTANT_CAST = "Spontanzauber";
HB_TOOLTIP_CAST_TIME = "(%d+.?%d*) Sek"; HEALBOT_TOOLTIP_CAST_TIME = "(%d+.?%d*) Sek";
HB_TOOLTIP_CHANNELED = "Abgebrochen"; HEALBOT_TOOLTIP_CHANNELED = "Abgebrochen";
HB_HASLEFTRAID = "^([^%s]+) hat die \195\131\197\147berfallgruppe verlassen%.$"; HEALBOT_HASLEFTRAID = "^([^%s]+) hat die \195\131\197\147berfallgruppe verlassen%.$";
HB_HASLEFTPARTY = "^([^%s]+) hat die Gruppe verlassen"; HEALBOT_HASLEFTPARTY = "^([^%s]+) hat die Gruppe verlassen";
HB_YOULEAVETHEGROUP = "Du hast die Gruppe verlassen" HEALBOT_YOULEAVETHEGROUP = "Du hast die Gruppe verlassen"
HB_YOULEAVETHERAID = "Du hast den Schlachtzug verlassen" HEALBOT_YOULEAVETHERAID = "Du hast den Schlachtzug verlassen"
----------------- -----------------
-- Translation -- -- Translation --
@@ -327,6 +330,7 @@ HEALBOT_OPTIONS_MONITORMELEE = "Nahkampf";
HEALBOT_OPTIONS_MONITORRANGE = "Fernkampf"; HEALBOT_OPTIONS_MONITORRANGE = "Fernkampf";
HEALBOT_OPTIONS_MONITORHEALERS = "Heiler"; HEALBOT_OPTIONS_MONITORHEALERS = "Heiler";
HEALBOT_OPTIONS_MONITORCUSTOM = "Eigene"; HEALBOT_OPTIONS_MONITORCUSTOM = "Eigene";
HEALBOT_OPTIONS_PETS = "Begleiter";
HEALBOT_OPTIONS_SHOWTOOLTIP = "Zeige Tooltips"; HEALBOT_OPTIONS_SHOWTOOLTIP = "Zeige Tooltips";
HEALBOT_OPTIONS_SHOWDETTOOLTIP = "Zeige detaillierte Spruchinfos"; HEALBOT_OPTIONS_SHOWDETTOOLTIP = "Zeige detaillierte Spruchinfos";
@@ -352,7 +356,6 @@ HEALBOT_WORDS_SEC = "Sek";
HEALBOT_WORDS_TO = "zu"; HEALBOT_WORDS_TO = "zu";
HEALBOT_WORDS_CAST = "Zauber" HEALBOT_WORDS_CAST = "Zauber"
HEALBOT_WORDS_FOR = "f\195\188r"; HEALBOT_WORDS_FOR = "f\195\188r";
end end
+39 -44
View File
@@ -1,4 +1,4 @@
HEALBOT_VERSION = "1.3.1"; HEALBOT_VERSION = GetAddOnMetadata("HealBotBlue", "Version");
------------- -------------
-- ENGLISH -- -- ENGLISH --
@@ -93,6 +93,7 @@ HEALBOT_THORNS = "Thorns";
HEALBOT_OMEN_OF_CLARITY = "Omen of Clarity"; HEALBOT_OMEN_OF_CLARITY = "Omen of Clarity";
HEALBOT_INNER_FIRE = "Inner Fire"; HEALBOT_INNER_FIRE = "Inner Fire";
HEALBOT_FEAR_WARD = "Fear Ward"; HEALBOT_FEAR_WARD = "Fear Ward";
HEALBOT_ENLIGHTEN = "Enlighten";
HEALBOT_RESURRECTION = "Resurrection"; HEALBOT_RESURRECTION = "Resurrection";
HEALBOT_REDEMPTION = "Redemption"; HEALBOT_REDEMPTION = "Redemption";
@@ -131,19 +132,19 @@ HEALBOT_RANK_11 = " (Rank 11)";
HEALBOT_LIBRARY_INCHEAL = "Increases healing done by spells and effects by up to (%d+)%."; HEALBOT_LIBRARY_INCHEAL = "Increases healing done by spells and effects by up to (%d+)%.";
HEALBOT_LIBRARY_INCDAMHEAL = "Increases damage and healing done by magical spells and effects by up to (%d+)%."; HEALBOT_LIBRARY_INCDAMHEAL = "Increases damage and healing done by magical spells and effects by up to (%d+)%.";
HB_BONUSSCANNER_NAMES = { HEALBOT_BONUSSCANNER_NAMES = {
HEAL = "Healing", HEAL = "Healing",
}; };
HB_BONUSSCANNER_PREFIX_EQUIP = "Equip: "; HEALBOT_BONUSSCANNER_PREFIX_EQUIP = "Equip: ";
HB_BONUSSCANNER_PREFIX_SET = "Set: "; 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 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"} }, { 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", ["Healing Spells"] = "HEAL",
["Increases Healing"] = "HEAL", ["Increases Healing"] = "HEAL",
["Healing and Spell Damage"] = {"HEAL", "DMG"}, ["Healing and Spell Damage"] = {"HEAL", "DMG"},
@@ -151,7 +152,7 @@ HB_BONUSSCANNER_PATTERNS_GENERIC_LOOKUP = {
["Spell Damage and Healing"] = {"HEAL", "DMG"}, ["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 Mojo", effect = {"DMG", "HEAL"}, value = 18 },
{ pattern = "Zandalar Signet of Serenity", effect = "HEAL", value = 33 }, { pattern = "Zandalar Signet of Serenity", effect = "HEAL", value = 33 },
@@ -173,35 +174,35 @@ HEALBOT_DEBUFF_WEAKENED_SOUL = "Interface\\Icons\\Spell_Holy_AshesToAshes";
HEALBOT_DEBUFF_RECENTLY_BANDAGED = "Interface\\Icons\\INV_Misc_Bandage_08"; HEALBOT_DEBUFF_RECENTLY_BANDAGED = "Interface\\Icons\\INV_Misc_Bandage_08";
HB_SPELL_PATTERN_LESSER_HEAL = "Heal your target for (%d+) to (%d+)"; HEALBOT_SPELL_PATTERN_LESSER_HEAL = "Heal your target for (%d+) to (%d+)";
HB_SPELL_PATTERN_HEAL = "Heal your target for (%d+) to (%d+)"; HEALBOT_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+)"; HEALBOT_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+)"; HEALBOT_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"; HEALBOT_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"; HEALBOT_SPELL_PATTERN_RENEW1 = "Heals the target of (%d+) damage over (%d+) sec";
HB_SPELL_PATTERN_RENEW2 = "Not needed for en"; HEALBOT_SPELL_PATTERN_RENEW2 = "Not needed for en";
HB_SPELL_PATTERN_RENEW3 = "Not needed for en"; HEALBOT_SPELL_PATTERN_RENEW3 = "Not needed for en";
HB_SPELL_PATTERN_SHIELD = "absorbing (%d+) damage. Lasts (%d+) sec."; HEALBOT_SPELL_PATTERN_SHIELD = "absorbing (%d+) damage. Lasts (%d+) sec.";
HB_SPELL_PATTERN_HEALING_TOUCH = "Heals a friendly target for (%d+) to (%d+)"; HEALBOT_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"; HEALBOT_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"; HEALBOT_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+)"; HEALBOT_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+)"; HEALBOT_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+)"; HEALBOT_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+)"; HEALBOT_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"; HEALBOT_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"; HEALBOT_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_MEND_PET = "Heals your pet (%d+) health every second while you focus. Lasts (%d+) sec";
HB_TOOLTIP_MANA = "^(%d+) Mana$"; HEALBOT_TOOLTIP_MANA = "^(%d+) Mana$";
HB_TOOLTIP_RANGE = "(%d+) yd range"; HEALBOT_TOOLTIP_RANGE = "(%d+) yd range";
HB_TOOLTIP_INSTANT_CAST = "Instant cast"; HEALBOT_TOOLTIP_INSTANT_CAST = "Instant cast";
HB_TOOLTIP_CAST_TIME = "(%d+.?%d*) sec cast"; HEALBOT_TOOLTIP_CAST_TIME = "(%d+.?%d*) sec cast";
HB_TOOLTIP_CHANNELED = "Channeled"; HEALBOT_TOOLTIP_CHANNELED = "Channeled";
HB_HASLEFTRAID = "^([^%s]+) has left the raid group$"; HEALBOT_HASLEFTRAID = "^([^%s]+) has left the raid group$";
HB_HASLEFTPARTY = "^([^%s]+) leaves the party$"; HEALBOT_HASLEFTPARTY = "^([^%s]+) leaves the party$";
HB_YOULEAVETHEGROUP = "You leave the group." HEALBOT_YOULEAVETHEGROUP = "You leave the group."
HB_YOULEAVETHERAID = "You have left the raid group" HEALBOT_YOULEAVETHERAID = "You have left the raid group"
----------------- -----------------
@@ -322,9 +323,10 @@ HEALBOT_OPTIONS_HEAL_BUTTONS = "Healing bars";
HEALBOT_OPTIONS_EMERGFILTER = "Show extra bars for"; HEALBOT_OPTIONS_EMERGFILTER = "Show extra bars for";
HEALBOT_OPTIONS_GROUPHEALS = "Group"; HEALBOT_OPTIONS_GROUPHEALS = "Group";
HEALBOT_OPTIONS_GROUPHEALS_LABEL = "Group Only";
HEALBOT_OPTIONS_TANKHEALS = "Main tanks"; HEALBOT_OPTIONS_TANKHEALS = "Main tanks";
HEALBOT_OPTIONS_TARGETHEALS = "Targets"; HEALBOT_OPTIONS_TARGETHEALS = "Targets";
HEALBOT_OPTIONS_EMERGENCYHEALS= "Extra"; HEALBOT_OPTIONS_EMERGENCYHEALS= "Raid / Extra";
HEALBOT_OPTIONS_HEALLEVEL = "Healing Level"; HEALBOT_OPTIONS_HEALLEVEL = "Healing Level";
HEALBOT_OPTIONS_ALERTLEVEL = "Alert Level"; HEALBOT_OPTIONS_ALERTLEVEL = "Alert Level";
HEALBOT_OPTIONS_OVERHEAL = "Show Abort button when overhealing" HEALBOT_OPTIONS_OVERHEAL = "Show Abort button when overhealing"
@@ -365,6 +367,7 @@ HEALBOT_OPTIONS_MONITORMELEE = "Melee";
HEALBOT_OPTIONS_MONITORRANGE = "Ranged"; HEALBOT_OPTIONS_MONITORRANGE = "Ranged";
HEALBOT_OPTIONS_MONITORHEALERS = "Healers"; HEALBOT_OPTIONS_MONITORHEALERS = "Healers";
HEALBOT_OPTIONS_MONITORCUSTOM = "Custom"; HEALBOT_OPTIONS_MONITORCUSTOM = "Custom";
HEALBOT_OPTIONS_PETS = "Pets";
HEALBOT_OPTIONS_SHOWTOOLTIP = "Show tooltips"; HEALBOT_OPTIONS_SHOWTOOLTIP = "Show tooltips";
HEALBOT_OPTIONS_SHOWDETTOOLTIP = "Show detailed spell information"; HEALBOT_OPTIONS_SHOWDETTOOLTIP = "Show detailed spell information";
@@ -385,11 +388,3 @@ HEALBOT_WORDS_SEC = "sec";
HEALBOT_WORDS_TO = "to"; HEALBOT_WORDS_TO = "to";
HEALBOT_WORDS_CAST = "Cast" HEALBOT_WORDS_CAST = "Cast"
HEALBOT_WORDS_FOR = "for"; HEALBOT_WORDS_FOR = "for";
+35 -32
View File
@@ -61,6 +61,9 @@ HEALBOT_FLASH_HEAL = "Soins rapides";
HEALBOT_FLASH_OF_LIGHT = "Eclair lumineux"; HEALBOT_FLASH_OF_LIGHT = "Eclair lumineux";
HEALBOT_HOLY_SHOCK = "Holy Shock"; HEALBOT_HOLY_SHOCK = "Holy Shock";
HEALBOT_GREATER_HEAL = "Soins sup\195\169rieurs"; 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_HEALING_TOUCH = "Toucher gu\195\169risseur";
HEALBOT_HEAL = "Soins"; HEALBOT_HEAL = "Soins";
HEALBOT_HEALING_WAVE = "Vague de soins"; HEALBOT_HEALING_WAVE = "Vague de soins";
@@ -112,14 +115,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_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 *************** 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", HEAL = "Soins",
}; };
HB_BONUSSCANNER_PREFIX_EQUIP = "Equip\195\169 : "; HEALBOT_BONUSSCANNER_PREFIX_EQUIP = "Equip\195\169 : ";
HB_BONUSSCANNER_PREFIX_SET = "Complet : "; 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 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 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" }, { 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 +130,39 @@ HB_BONUSSCANNER_PATTERNS_PASSIVE = {
}; };
HB_BONUSSCANNER_PATTERNS_GENERIC_LOOKUP = { HEALBOT_BONUSSCANNER_PATTERNS_GENERIC_LOOKUP = {
["Sorts de Soins"] = "HEAL", ["Sorts de Soins"] = "HEAL",
["D\195\169g\195\162ts et soins "] = {"HEAL", "DMG"}, ["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"; HEALBOT_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"; HEALBOT_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"; HEALBOT_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"; HEALBOT_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"; HEALBOT_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"; HEALBOT_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"; HEALBOT_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"; HEALBOT_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"; 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";
HB_SPELL_PATTERN_HOLY_LIGHT = "Rend (%d+) \195\160 (%d+) points de vie"; HEALBOT_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"; HEALBOT_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"; HEALBOT_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"; HEALBOT_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"; HEALBOT_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"; HEALBOT_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"; HEALBOT_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_MEND_PET = "Soigne votre compagnon de (%d+) points de vie chaques secondes que vous le ciblez. Dure (%d+) sec"
HB_TOOLTIP_MANA = "^Mana : (%d+)$"; HEALBOT_TOOLTIP_MANA = "^Mana : (%d+)$";
HB_TOOLTIP_INSTANT_CAST = 'Incantation imm\195\169diate'; HEALBOT_TOOLTIP_INSTANT_CAST = 'Incantation imm\195\169diate';
HB_TOOLTIP_CAST_TIME = '(%d+.?%d*) sec'; HEALBOT_TOOLTIP_CAST_TIME = '(%d+.?%d*) sec';
HB_TOOLTIP_RANGE = "de (%d+) m" HEALBOT_TOOLTIP_RANGE = "de (%d+) m"
HB_TOOLTIP_CHANNELED = "Focaliser" HEALBOT_TOOLTIP_CHANNELED = "Focaliser"
HB_HASLEFTRAID = "^([^%s]+) a quitt\195\131\194\169 le groupe de raid$"; HEALBOT_HASLEFTRAID = "^([^%s]+) a quitt\195\131\194\169 le groupe de raid$";
HB_HASLEFTPARTY = "^([^%s]+) has left the party$"; -- *************** needs French translation *************** HEALBOT_HASLEFTPARTY = "^([^%s]+) has left the party$"; -- *************** needs French translation ***************
HB_YOULEAVETHEGROUP = "You leave the group" -- *************** needs translation *************** HEALBOT_YOULEAVETHEGROUP = "You leave the group" -- *************** needs translation ***************
HB_YOULEAVETHERAID = "You have left the raid group" -- *************** needs translation *************** HEALBOT_YOULEAVETHERAID = "You have left the raid group" -- *************** needs translation ***************
----------------- -----------------
-- Translation -- -- Translation --
@@ -266,6 +269,7 @@ HEALBOT_OPTIONS_MONITORMELEE = "M\195\169l\195\169e";
HEALBOT_OPTIONS_MONITORRANGE = "\195\128 distance"; HEALBOT_OPTIONS_MONITORRANGE = "\195\128 distance";
HEALBOT_OPTIONS_MONITORHEALERS = "Soigneurs"; HEALBOT_OPTIONS_MONITORHEALERS = "Soigneurs";
HEALBOT_OPTIONS_MONITORCUSTOM = "Personnalis\195\169"; HEALBOT_OPTIONS_MONITORCUSTOM = "Personnalis\195\169";
HEALBOT_OPTIONS_PETS = "Familiers";
HEALBOT_OPTIONS_BARALPHAINHEAL= "Incoming heal opacity"; -- *************** needs French translation *************** HEALBOT_OPTIONS_BARALPHAINHEAL= "Incoming heal opacity"; -- *************** needs French translation ***************
@@ -333,7 +337,6 @@ HEALBOT_WORDS_SEC = "sec"; -- *************** needs translati
HEALBOT_WORDS_TO = "to"; -- *************** needs translation *************** HEALBOT_WORDS_TO = "to"; -- *************** needs translation ***************
HEALBOT_WORDS_CAST = "Cast" -- *************** needs translation *************** HEALBOT_WORDS_CAST = "Cast" -- *************** needs translation ***************
HEALBOT_WORDS_FOR = "for"; -- *************** needs translation *************** HEALBOT_WORDS_FOR = "for"; -- *************** needs translation ***************
end end
+36 -33
View File
@@ -61,6 +61,9 @@ HEALBOT_PRAYER_OF_HEALING = "치유의 기원";
HEALBOT_CHAIN_HEAL = "연쇄 치유"; HEALBOT_CHAIN_HEAL = "연쇄 치유";
HEALBOT_POWER_WORD_FORTITUDE = "신의 권능: 인내"; HEALBOT_POWER_WORD_FORTITUDE = "신의 권능: 인내";
HEALBOT_INNER_FIRE = "내면의 열정";
HEALBOT_FEAR_WARD = "공포의 결계";
HEALBOT_ENLIGHTEN = "Enlighten";
HEALBOT_MARK_OF_THE_WILD = "야생의 징표"; HEALBOT_MARK_OF_THE_WILD = "야생의 징표";
HEALBOT_GREATER_BLESSING_OF_SALVATION = "상급 구원의 축복"; HEALBOT_GREATER_BLESSING_OF_SALVATION = "상급 구원의 축복";
@@ -97,20 +100,20 @@ HEALBOT_GREATER_BLESSING_OF_SALVATION = "상급 구원의 축복";
HEALBOT_LIBRARY_INCHEAL = "모든 주문 및 효과에 의한 치유량이 최대 (%d+)만큼 증가합니다%."; HEALBOT_LIBRARY_INCHEAL = "모든 주문 및 효과에 의한 치유량이 최대 (%d+)만큼 증가합니다%.";
HEALBOT_LIBRARY_INCDAMHEAL = "모든 주문 및 효과에 의한 피해와 치유량이 최대 (%d+)만큼 증가합니다%."; HEALBOT_LIBRARY_INCDAMHEAL = "모든 주문 및 효과에 의한 피해와 치유량이 최대 (%d+)만큼 증가합니다%.";
HB_BONUSSCANNER_NAMES = { HEALBOT_BONUSSCANNER_NAMES = {
HEAL = "치유량", HEAL = "치유량",
}; };
HB_BONUSSCANNER_PREFIX_EQUIP = "착용 효과: "; HEALBOT_BONUSSCANNER_PREFIX_EQUIP = "착용 효과: ";
HB_BONUSSCANNER_PREFIX_SET = "세트 효과: "; HEALBOT_BONUSSCANNER_PREFIX_SET = "세트 효과: ";
HB_BONUSSCANNER_PATTERNS_PASSIVE = { HEALBOT_BONUSSCANNER_PATTERNS_PASSIVE = {
{ pattern = "모든 주문 및 효과에 의한 치유량이 최대 (%d+)만큼 증가합니다%.", effect = "HEAL" }, { pattern = "모든 주문 및 효과에 의한 치유량이 최대 (%d+)만큼 증가합니다%.", effect = "HEAL" },
{ pattern = "주문과 효과에 의한 치유량이 최대 (%d+)만큼 증가합니다%.", effect = "HEAL" }, { pattern = "주문과 효과에 의한 치유량이 최대 (%d+)만큼 증가합니다%.", effect = "HEAL" },
{ pattern = "모든 주문 및 효과에 의한 피해와 치유량이 최대 (%d+)만큼 증가합니다%.", effect = {"HEAL", "DMG"} }, { pattern = "모든 주문 및 효과에 의한 피해와 치유량이 최대 (%d+)만큼 증가합니다%.", effect = {"HEAL", "DMG"} },
}; };
HB_BONUSSCANNER_PATTERNS_GENERIC_LOOKUP = { HEALBOT_BONUSSCANNER_PATTERNS_GENERIC_LOOKUP = {
["치유 주문"] = "HEAL", ["치유 주문"] = "HEAL",
["치유량 증가"] = "HEAL", ["치유량 증가"] = "HEAL",
["치유 효과 증가"] = "HEAL", ["치유 효과 증가"] = "HEAL",
@@ -120,7 +123,7 @@ HEALBOT_GREATER_BLESSING_OF_SALVATION = "상급 구원의 축복";
["치유 및 공격 주문 위력"] = {"HEAL", "DMG"}, ["치유 및 공격 주문 위력"] = {"HEAL", "DMG"},
}; };
HB_BONUSSCANNER_PATTERNS_OTHER = { HEALBOT_BONUSSCANNER_PATTERNS_OTHER = {
{ pattern = "잔달라 모조의 인장", effect = {"DMG", "HEAL"}, value = 18 }, { pattern = "잔달라 모조의 인장", effect = {"DMG", "HEAL"}, value = 18 },
{ pattern = "잔달라 평온의 인장", effect = "HEAL", value = 33 }, { pattern = "잔달라 평온의 인장", effect = "HEAL", value = 33 },
@@ -132,33 +135,33 @@ HEALBOT_GREATER_BLESSING_OF_SALVATION = "상급 구원의 축복";
{ pattern = "반짝이는 마나 오일", effect = { "MANAREG", "HEAL"}, value = {12, 25} }, { pattern = "반짝이는 마나 오일", effect = { "MANAREG", "HEAL"}, value = {12, 25} },
}; };
HB_SPELL_PATTERN_LESSER_HEAL = "대상의 생명력을 (%d+)~(%d+)만큼 회복시킵니다"; HEALBOT_SPELL_PATTERN_LESSER_HEAL = "대상의 생명력을 (%d+)~(%d+)만큼 회복시킵니다";
HB_SPELL_PATTERN_HEAL = "대상의 생명력을 (%d+)~(%d+)만큼 회복시킵니다"; HEALBOT_SPELL_PATTERN_HEAL = "대상의 생명력을 (%d+)~(%d+)만큼 회복시킵니다";
HB_SPELL_PATTERN_GREATER_HEAL = "대상의 생명력을 (%d+)~(%d+)만큼 회복시킵니다"; HEALBOT_SPELL_PATTERN_GREATER_HEAL = "대상의 생명력을 (%d+)~(%d+)만큼 회복시킵니다";
HB_SPELL_PATTERN_FLASH_HEAL = "대상의 생명력을 (%d+)~(%d+)만큼 회복시킵니다"; HEALBOT_SPELL_PATTERN_FLASH_HEAL = "대상의 생명력을 (%d+)~(%d+)만큼 회복시킵니다";
HB_SPELL_PATTERN_RENEW = "(%d+)초에 걸쳐 대상의 생명력을 총 (%d+)~(%d+)만큼 회복시킵니다"; HEALBOT_SPELL_PATTERN_RENEW = "(%d+)초에 걸쳐 대상의 생명력을 총 (%d+)~(%d+)만큼 회복시킵니다";
HB_SPELL_PATTERN_RENEW1 = "(%d+)초에 걸쳐 대상의 생명력을 총 (%d+)만큼 회복시킵니다"; HEALBOT_SPELL_PATTERN_RENEW1 = "(%d+)초에 걸쳐 대상의 생명력을 총 (%d+)만큼 회복시킵니다";
HB_SPELL_PATTERN_SHIELD = "(%d+)의 피해를 흡수합니다. (%d+)초 동안 지속됩니다."; HEALBOT_SPELL_PATTERN_SHIELD = "(%d+)의 피해를 흡수합니다. (%d+)초 동안 지속됩니다.";
HB_SPELL_PATTERN_HEALING_TOUCH = "대상의 생명력을 (%d+)~(%d+)만큼 회복시킵니다"; HEALBOT_SPELL_PATTERN_HEALING_TOUCH = "대상의 생명력을 (%d+)~(%d+)만큼 회복시킵니다";
HB_SPELL_PATTERN_REGROWTH = "대상의 생명력을 (%d+)~(%d+)만큼 회복시키고 추가로 (%d+)초에 걸쳐 총 (%d+)의 생명력을 회복시킵니다"; HEALBOT_SPELL_PATTERN_REGROWTH = "대상의 생명력을 (%d+)~(%d+)만큼 회복시키고 추가로 (%d+)초에 걸쳐 총 (%d+)의 생명력을 회복시킵니다";
HB_SPELL_PATTERN_REGROWTH1 = "대상의 생명력을 (%d+)~(%d+)만큼 회복시키고 추가로 (%d+)초에 걸쳐 총 (%d+)~(%d+)의 생명력을 회복시킵니다"; HEALBOT_SPELL_PATTERN_REGROWTH1 = "대상의 생명력을 (%d+)~(%d+)만큼 회복시키고 추가로 (%d+)초에 걸쳐 총 (%d+)~(%d+)의 생명력을 회복시킵니다";
HB_SPELL_PATTERN_HOLY_LIGHT = "대상의 생명력을 (%d+)~(%d+)만큼 회복시킵니다"; HEALBOT_SPELL_PATTERN_HOLY_LIGHT = "대상의 생명력을 (%d+)~(%d+)만큼 회복시킵니다";
HB_SPELL_PATTERN_FLASH_OF_LIGHT = "대상의 생명력을 (%d+)~(%d+)만큼 회복시킵니다"; HEALBOT_SPELL_PATTERN_FLASH_OF_LIGHT = "대상의 생명력을 (%d+)~(%d+)만큼 회복시킵니다";
HB_SPELL_PATTERN_HEALING_WAVE = "대상의 생명력을 (%d+)~(%d+)만큼 회복시킵니다"; HEALBOT_SPELL_PATTERN_HEALING_WAVE = "대상의 생명력을 (%d+)~(%d+)만큼 회복시킵니다";
HB_SPELL_PATTERN_LESSER_HEALING_WAVE = "대상의 생명력을 (%d+)~(%d+)만큼 회복시킵니다"; HEALBOT_SPELL_PATTERN_LESSER_HEALING_WAVE = "대상의 생명력을 (%d+)~(%d+)만큼 회복시킵니다";
HB_SPELL_PATTERN_REJUVENATION = "(%d+)에 걸쳐 (%d+)의 생명력을 회복시킵니다"; HEALBOT_SPELL_PATTERN_REJUVENATION = "(%d+)에 걸쳐 (%d+)의 생명력을 회복시킵니다";
HB_SPELL_PATTERN_REJUVENATION1 = "(%d+)에 걸쳐 (%d+)~(%d+)의 생명력을 회복시킵니다"; HEALBOT_SPELL_PATTERN_REJUVENATION1 = "(%d+)에 걸쳐 (%d+)~(%d+)의 생명력을 회복시킵니다";
HB_SPELL_PATTERN_MEND_PET = "야수에 정신을 집중하는 동안 매초마다 (%d+)의 생명력을 치료합니다"; HEALBOT_SPELL_PATTERN_MEND_PET = "야수에 정신을 집중하는 동안 매초마다 (%d+)의 생명력을 치료합니다";
HB_TOOLTIP_MANA = "^마나 (%d+)$"; HEALBOT_TOOLTIP_MANA = "^마나 (%d+)$";
HB_TOOLTIP_RANGE = "(%d+)미터"; HEALBOT_TOOLTIP_RANGE = "(%d+)미터";
HB_TOOLTIP_INSTANT_CAST = "즉시 시전"; HEALBOT_TOOLTIP_INSTANT_CAST = "즉시 시전";
HB_TOOLTIP_CAST_TIME = "(%d+.?%d*)초"; HEALBOT_TOOLTIP_CAST_TIME = "(%d+.?%d*)초";
HB_TOOLTIP_CHANNELED = "채널링"; HEALBOT_TOOLTIP_CHANNELED = "채널링";
HB_HASLEFTRAID = "^([^%s]+)님이 공격대를 떠났습니다$"; HEALBOT_HASLEFTRAID = "^([^%s]+)님이 공격대를 떠났습니다$";
HB_HASLEFTPARTY = "^([^%s]+)님이 파티를 떠났습니다$"; HEALBOT_HASLEFTPARTY = "^([^%s]+)님이 파티를 떠났습니다$";
HB_YOULEAVETHEGROUP = "당신은 파티를 떠났습니다" HEALBOT_YOULEAVETHEGROUP = "당신은 파티를 떠났습니다"
HB_YOULEAVETHERAID = "공격대를 떠났습니다" HEALBOT_YOULEAVETHERAID = "공격대를 떠났습니다"
----------------- -----------------
-- Translation -- -- Translation --
@@ -309,6 +312,7 @@ HEALBOT_GREATER_BLESSING_OF_SALVATION = "상급 구원의 축복";
HEALBOT_OPTIONS_MONITORRANGE = "원거리"; HEALBOT_OPTIONS_MONITORRANGE = "원거리";
HEALBOT_OPTIONS_MONITORHEALERS = "힐러"; HEALBOT_OPTIONS_MONITORHEALERS = "힐러";
HEALBOT_OPTIONS_MONITORCUSTOM = "사용자 정의"; HEALBOT_OPTIONS_MONITORCUSTOM = "사용자 정의";
HEALBOT_OPTIONS_PETS = "소환수";
HEALBOT_OPTIONS_SHOWTOOLTIP = "툴팁 표시"; HEALBOT_OPTIONS_SHOWTOOLTIP = "툴팁 표시";
HEALBOT_OPTIONS_SHOWDETTOOLTIP = "주문 정보 표시"; HEALBOT_OPTIONS_SHOWDETTOOLTIP = "주문 정보 표시";
@@ -329,7 +333,6 @@ HEALBOT_GREATER_BLESSING_OF_SALVATION = "상급 구원의 축복";
HEALBOT_WORDS_TO = "~"; HEALBOT_WORDS_TO = "~";
HEALBOT_WORDS_CAST = "시전" HEALBOT_WORDS_CAST = "시전"
HEALBOT_WORDS_FOR = "for"; HEALBOT_WORDS_FOR = "for";
end end
+26
View File
@@ -1,6 +1,32 @@
-- HealBot_Model.lua -- HealBot_Model.lua
-- Centralized Data Store and Observer System for HealBotBlue -- Centralized Data Store and Observer System for HealBotBlue
-- Safe local wrappers to prevent native UIDropDownMenu concatenation crashes
-- when setting selected values on closed dropdowns during initialization.
function HealBot_UIDropDownMenu_SetSelectedID(frame, id, useValue)
local wasNil = false
if not UIDROPDOWNMENU_OPEN_MENU then
UIDROPDOWNMENU_OPEN_MENU = "DropDownList1"
wasNil = true
end
UIDropDownMenu_SetSelectedID(frame, id, useValue)
if wasNil then
UIDROPDOWNMENU_OPEN_MENU = nil
end
end
function HealBot_UIDropDownMenu_SetSelectedValue(frame, value, useValue)
local wasNil = false
if not UIDROPDOWNMENU_OPEN_MENU then
UIDROPDOWNMENU_OPEN_MENU = "DropDownList1"
wasNil = true
end
UIDropDownMenu_SetSelectedValue(frame, value, useValue)
if wasNil then
UIDROPDOWNMENU_OPEN_MENU = nil
end
end
HealBot_Model = { HealBot_Model = {
observers = {}, observers = {},
units = {}, units = {},
+19 -4
View File
@@ -18,6 +18,7 @@ HealBot_Options_EmergencyFilter_List = {
HEALBOT_SHAMAN, HEALBOT_SHAMAN,
HEALBOT_WARLOCK, HEALBOT_WARLOCK,
HEALBOT_WARRIOR, HEALBOT_WARRIOR,
HEALBOT_OPTIONS_PETS,
HEALBOT_OPTIONS_MONITORMELEE, HEALBOT_OPTIONS_MONITORMELEE,
HEALBOT_OPTIONS_MONITORRANGE, HEALBOT_OPTIONS_MONITORRANGE,
HEALBOT_OPTIONS_MONITORHEALERS, HEALBOT_OPTIONS_MONITORHEALERS,
@@ -233,7 +234,7 @@ function HealBot_Options_OnLoad(this)
table.insert(UISpecialFrames,this:GetName()); table.insert(UISpecialFrames,this:GetName());
-- Tabs -- Tabs
PanelTemplates_SetNumTabs(this,7); PanelTemplates_SetNumTabs(this,8);
this.selectedTab = 1; this.selectedTab = 1;
PanelTemplates_UpdateTabs(this); PanelTemplates_UpdateTabs(this);
HealBot_Options_ShowPanel(this.selectedTab); HealBot_Options_ShowPanel(this.selectedTab);
@@ -247,6 +248,8 @@ function HealBot_Options_OnShow(this)
HealBot_Options_PanelSounds:SetChecked(HealBot_Config.PanelSounds); HealBot_Options_PanelSounds:SetChecked(HealBot_Config.PanelSounds);
HealBot_Options_ShowManaBars:SetChecked(HealBot_Config.ShowManaBars); HealBot_Options_ShowManaBars:SetChecked(HealBot_Config.ShowManaBars);
HealBot_Options_ManaBarsHealersOnly:SetChecked(HealBot_Config.ManaBarsHealersOnly); 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 if HealBot_Config.ActionMouseover == nil then HealBot_Config.ActionMouseover = 1; end
HealBot_Options_ActionMouseover:SetChecked(HealBot_Config.ActionMouseover); HealBot_Options_ActionMouseover:SetChecked(HealBot_Config.ActionMouseover);
@@ -260,6 +263,9 @@ function HealBot_Options_OnShow(this)
HealBot_Options_TargetHeals:SetChecked(HealBot_Config.TargetHeals); HealBot_Options_TargetHeals:SetChecked(HealBot_Config.TargetHeals);
HealBot_Options_EmergencyHeals:SetChecked(HealBot_Config.EmergencyHeals); HealBot_Options_EmergencyHeals:SetChecked(HealBot_Config.EmergencyHeals);
HealBot_Options_OverHeal:SetValue(HealBot_Config.OverHeal); 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_CastNotify_OnClick(nil,HealBot_Config.CastNotify);
HealBot_Options_SetBuffs(); HealBot_Options_SetBuffs();
HealBot_Options_HideOptions:SetChecked(HealBot_Config.HideOptions); HealBot_Options_HideOptions:SetChecked(HealBot_Config.HideOptions);
@@ -308,6 +314,8 @@ function HealBot_Options_SetSkins()
HealBot_Options_BarHeightS:SetValue(HealBot_Config.bheight[HealBot_Config.Current_Skin]) HealBot_Options_BarHeightS:SetValue(HealBot_Config.bheight[HealBot_Config.Current_Skin])
HealBot_Options_BarWidthS:SetValue(HealBot_Config.bwidth[HealBot_Config.Current_Skin]) HealBot_Options_BarWidthS:SetValue(HealBot_Config.bwidth[HealBot_Config.Current_Skin])
HealBot_Options_BarNumColsS:SetValue(HealBot_Config.numcols[HealBot_Config.Current_Skin]) HealBot_Options_BarNumColsS:SetValue(HealBot_Config.numcols[HealBot_Config.Current_Skin])
HealBot_Options_BarMaxRowsS:SetValue((HealBot_Config.bmaxrows and HealBot_Config.bmaxrows[HealBot_Config.Current_Skin]) or 0)
HealBot_Options_GridOrientation:SetChecked(((HealBot_Config.GridOrientation and HealBot_Config.GridOrientation[HealBot_Config.Current_Skin]) == 2) and 1 or nil)
HealBot_Options_BarBRSpaceS:SetValue(HealBot_Config.brspace[HealBot_Config.Current_Skin]) HealBot_Options_BarBRSpaceS:SetValue(HealBot_Config.brspace[HealBot_Config.Current_Skin])
HealBot_Options_BarBCSpaceS:SetValue(HealBot_Config.bcspace[HealBot_Config.Current_Skin]) HealBot_Options_BarBCSpaceS:SetValue(HealBot_Config.bcspace[HealBot_Config.Current_Skin])
HealBot_Options_FramePaddingS:SetValue((HealBot_Config.bpadding and HealBot_Config.bpadding[HealBot_Config.Current_Skin]) or 10) HealBot_Options_FramePaddingS:SetValue((HealBot_Config.bpadding and HealBot_Config.bpadding[HealBot_Config.Current_Skin]) or 10)
@@ -315,7 +323,8 @@ function HealBot_Options_SetSkins()
HealBot_Options_FontHeight:SetValue(HealBot_Config.btextheight[HealBot_Config.Current_Skin]) HealBot_Options_FontHeight:SetValue(HealBot_Config.btextheight[HealBot_Config.Current_Skin])
HealBot_Options_BarAlphaDis:SetValue(HealBot_Config.bardisa[HealBot_Config.Current_Skin]) HealBot_Options_BarAlphaDis:SetValue(HealBot_Config.bardisa[HealBot_Config.Current_Skin])
HealBot_Options_AbortBarSize:SetValue(HealBot_Config.abortsize[HealBot_Config.Current_Skin]) HealBot_Options_AbortBarSize:SetValue(HealBot_Config.abortsize[HealBot_Config.Current_Skin])
HealBot_Options_ShowHeaders:SetChecked(HealBot_Config.ShowHeader[HealBot_Config.Current_Skin] or 0) local isShowHeaders = (HealBot_Config.ShowHeader[HealBot_Config.Current_Skin] == 1)
HealBot_Options_ShowHeaders:SetChecked(isShowHeaders and 1 or nil)
local isColorMode = (HealBot_Config.bcolormode[HealBot_Config.Current_Skin] == 2) local isColorMode = (HealBot_Config.bcolormode[HealBot_Config.Current_Skin] == 2)
HealBot_Options_BarColorMode:SetChecked(isColorMode and 1 or nil) HealBot_Options_BarColorMode:SetChecked(isColorMode and 1 or nil)
@@ -335,10 +344,16 @@ function HealBot_Options_SetSkins()
end end
function HealBot_Options_ShowPanel(id) function HealBot_Options_ShowPanel(id)
if HealBot_Options_CurrentPanel>0 then 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 end
HealBot_Options_CurrentPanel = id; HealBot_Options_CurrentPanel = id;
if HealBot_Options_CurrentPanel>0 then 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
end end
+5 -27
View File
@@ -94,7 +94,7 @@
<Frame name="HealBot_Options" toplevel="true" frameStrata="DIALOG" <Frame name="HealBot_Options" toplevel="true" frameStrata="DIALOG"
movable="true" parent="UIParent" enableMouse="true" hidden="true"> movable="true" parent="UIParent" enableMouse="true" hidden="true">
<Size> <Size>
<AbsDimension x="420" y="455"/> <AbsDimension x="480" y="455"/>
</Size> </Size>
<Anchors> <Anchors>
<Anchor point="CENTER"> <Anchor point="CENTER">
@@ -206,38 +206,16 @@
</Anchor> </Anchor>
</Anchors> </Anchors>
</Button> </Button>
<Button name="HealBot_Options_Defaults" inherits="UIPanelButtonTemplate" text="HEALBOT_OPTIONS_DEFAULTS"> <Button name="HealBot_OptionsTab8" inherits="HealBot_Options_Tab" id="8" text="Auto">
<Size>
<AbsDimension x="80" y="22"/>
</Size>
<Anchors> <Anchors>
<Anchor point="BOTTOM" relativePoint="BOTTOM"> <Anchor point="LEFT" relativeTo="HealBot_OptionsTab7" relativePoint="RIGHT">
<Offset> <Offset>
<AbsDimension x="-50" y="15"/> <AbsDimension x="-14" y="0" />
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
<Scripts>
<OnClick>HealBot_Options_Defaults_OnClick(this)</OnClick>
</Scripts>
</Button>
<Button name="HealBot_Options_CloseButton" inherits="UIPanelButtonTemplate" text="HEALBOT_OPTIONS_CLOSE">
<Size>
<AbsDimension x="80" y="22"/>
</Size>
<Anchors>
<Anchor point="BOTTOM" relativePoint="BOTTOM">
<Offset>
<AbsDimension x="50" y="15"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnClick>
HideUIPanel(this:GetParent());
</OnClick>
</Scripts>
</Button> </Button>
</Frames> </Frames>
<Scripts> <Scripts>
<OnLoad>HealBot_Options_OnLoad(this);</OnLoad> <OnLoad>HealBot_Options_OnLoad(this);</OnLoad>
+82
View File
@@ -0,0 +1,82 @@
function HealBot_Options_AutoSwap_OnClick(this)
if this:GetChecked() then
HealBot_Config.AutoSwap_Enabled = 1
else
HealBot_Config.AutoSwap_Enabled = 0
end
HealBot_Action_PartyChanged()
end
function HealBot_Options_Auto_Initialize()
local dropdownName = UIDROPDOWNMENU_OPEN_MENU
if not dropdownName then return end
local dropdownFrame = getglobal(dropdownName)
if not dropdownFrame then return end
local id = dropdownFrame:GetID()
if not id then return end
for i=1, getn(HealBot_Config.Skins), 1 do
local info = {}
info.text = HealBot_Config.Skins[i]
info.func = HealBot_Options_Auto_OnSelect
info.value = id
if not HealBot_Config.AutoSwap_Profiles then HealBot_Config.AutoSwap_Profiles = {} end
if HealBot_Config.AutoSwap_Profiles[id] == HealBot_Config.Skins[i] then
info.checked = 1
else
info.checked = nil
end
UIDropDownMenu_AddButton(info)
end
end
function HealBot_Options_Auto_OnSelect()
local skin = this:GetText()
local id = this.value
if not id or not skin then return end
if not HealBot_Config.AutoSwap_Profiles then HealBot_Config.AutoSwap_Profiles = {} end
HealBot_Config.AutoSwap_Profiles[id] = skin
local dropdowns = {
"HealBot_Options_Auto_Solo",
"HealBot_Options_Auto_Party",
"HealBot_Options_Auto_Raid15",
"HealBot_Options_Auto_Raid25",
"HealBot_Options_Auto_Raid40"
}
local dropdownName = dropdowns[id]
local dropdownFrame = getglobal(dropdownName)
HealBot_UIDropDownMenu_SetSelectedValue(dropdownFrame, skin)
UIDropDownMenu_SetText(skin, dropdownFrame)
HealBot_Action_PartyChanged()
end
function HealBot_Options_Auto_OnShow(this)
if HealBot_Config.AutoSwap_Enabled == 1 then
HealBot_Options_AutoSwap:SetChecked(1)
else
HealBot_Options_AutoSwap:SetChecked(nil)
end
local dropdowns = {
"HealBot_Options_Auto_Solo",
"HealBot_Options_Auto_Party",
"HealBot_Options_Auto_Raid15",
"HealBot_Options_Auto_Raid25",
"HealBot_Options_Auto_Raid40"
}
for id, name in ipairs(dropdowns) do
local dropdownFrame = getglobal(name)
if dropdownFrame then
UIDropDownMenu_SetWidth(150, dropdownFrame)
if not HealBot_Config.AutoSwap_Profiles then HealBot_Config.AutoSwap_Profiles = {} end
local skin = HealBot_Config.AutoSwap_Profiles[id]
if skin then
HealBot_UIDropDownMenu_SetSelectedValue(dropdownFrame, skin)
UIDropDownMenu_SetText(skin, dropdownFrame)
end
end
end
end
+152
View File
@@ -0,0 +1,152 @@
<Ui xmlns="http://www.blizzard.com/wow/ui/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.blizzard.com/wow/ui/ ..\FrameXML\UI.xsd">
<Script file="HealBot_Options_Auto.lua" />
<Frame name="HealBot_Options_Panel8" parent="HealBot_Options" hidden="true" setAllPoints="true">
<Frames>
<CheckButton name="HealBot_Options_AutoSwap" inherits="OptionsCheckButtonTemplate">
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="25" y="-30" />
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>
getglobal(this:GetName().."Text"):SetText("Enable Auto-Swap");
</OnLoad>
<OnClick>
HealBot_Options_AutoSwap_OnClick(this);
</OnClick>
</Scripts>
</CheckButton>
<Frame name="HealBot_Options_Auto_Solo" inherits="UIDropDownMenuTemplate" id="1">
<Layers>
<Layer level="BACKGROUND">
<FontString name="$parentLabel" text="Solo Skin:" inherits="GameFontNormalSmall">
<Anchors>
<Anchor point="TOPLEFT">
<Offset><AbsDimension x="-10" y="15" /></Offset>
</Anchor>
</Anchors>
</FontString>
</Layer>
</Layers>
<Anchors>
<Anchor point="TOPLEFT">
<Offset><AbsDimension x="30" y="-80" /></Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>
UIDropDownMenu_Initialize(this, HealBot_Options_Auto_Initialize);
</OnLoad>
</Scripts>
</Frame>
<Frame name="HealBot_Options_Auto_Party" inherits="UIDropDownMenuTemplate" id="2">
<Layers>
<Layer level="BACKGROUND">
<FontString name="$parentLabel" text="Party Skin:" inherits="GameFontNormalSmall">
<Anchors>
<Anchor point="TOPLEFT">
<Offset><AbsDimension x="-10" y="15" /></Offset>
</Anchor>
</Anchors>
</FontString>
</Layer>
</Layers>
<Anchors>
<Anchor point="TOPLEFT">
<Offset><AbsDimension x="30" y="-130" /></Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>
UIDropDownMenu_Initialize(this, HealBot_Options_Auto_Initialize);
</OnLoad>
</Scripts>
</Frame>
<Frame name="HealBot_Options_Auto_Raid15" inherits="UIDropDownMenuTemplate" id="3">
<Layers>
<Layer level="BACKGROUND">
<FontString name="$parentLabel" text="Raid 15 Skin:" inherits="GameFontNormalSmall">
<Anchors>
<Anchor point="TOPLEFT">
<Offset><AbsDimension x="-10" y="15" /></Offset>
</Anchor>
</Anchors>
</FontString>
</Layer>
</Layers>
<Anchors>
<Anchor point="TOPLEFT">
<Offset><AbsDimension x="30" y="-180" /></Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>
UIDropDownMenu_Initialize(this, HealBot_Options_Auto_Initialize);
</OnLoad>
</Scripts>
</Frame>
<Frame name="HealBot_Options_Auto_Raid25" inherits="UIDropDownMenuTemplate" id="4">
<Layers>
<Layer level="BACKGROUND">
<FontString name="$parentLabel" text="Raid 25 Skin:" inherits="GameFontNormalSmall">
<Anchors>
<Anchor point="TOPLEFT">
<Offset><AbsDimension x="-10" y="15" /></Offset>
</Anchor>
</Anchors>
</FontString>
</Layer>
</Layers>
<Anchors>
<Anchor point="TOPLEFT">
<Offset><AbsDimension x="30" y="-230" /></Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>
UIDropDownMenu_Initialize(this, HealBot_Options_Auto_Initialize);
</OnLoad>
</Scripts>
</Frame>
<Frame name="HealBot_Options_Auto_Raid40" inherits="UIDropDownMenuTemplate" id="5">
<Layers>
<Layer level="BACKGROUND">
<FontString name="$parentLabel" text="Raid 40 Skin:" inherits="GameFontNormalSmall">
<Anchors>
<Anchor point="TOPLEFT">
<Offset><AbsDimension x="-10" y="15" /></Offset>
</Anchor>
</Anchors>
</FontString>
</Layer>
</Layers>
<Anchors>
<Anchor point="TOPLEFT">
<Offset><AbsDimension x="30" y="-280" /></Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>
UIDropDownMenu_Initialize(this, HealBot_Options_Auto_Initialize);
</OnLoad>
</Scripts>
</Frame>
</Frames>
<Scripts>
<OnShow>
HealBot_Options_Auto_OnShow(this);
</OnShow>
</Scripts>
</Frame>
</Ui>
+8 -6
View File
@@ -21,9 +21,10 @@ function HealBot_Options_BuffSelf_OnLoad(self)
getglobal(this:GetName().."Text"):SetText("Self Only") getglobal(this:GetName().."Text"):SetText("Self Only")
local id = this:GetID() local id = this:GetID()
if HealBot_Config.BuffWatchSelf and HealBot_Config.BuffWatchSelf[id] then if HealBot_Config.BuffWatchSelf and HealBot_Config.BuffWatchSelf[id] then
this:SetChecked(HealBot_Config.BuffWatchSelf[id]) local isSelf = (HealBot_Config.BuffWatchSelf[id] == 1)
this:SetChecked(isSelf and 1 or nil)
else else
this:SetChecked(0) this:SetChecked(nil)
end end
end end
function HealBot_Options_BuffSelf_OnClick(self) function HealBot_Options_BuffSelf_OnClick(self)
@@ -77,7 +78,7 @@ function HealBot_Options_Buff_OnClick()
text = HealBot_Buff_Spells[myClass][this.value] text = HealBot_Buff_Spells[myClass][this.value]
end end
UIDropDownMenu_SetSelectedID(frame, this.value + 1) HealBot_UIDropDownMenu_SetSelectedID(frame, this.value + 1)
UIDropDownMenu_SetText(text, frame) UIDropDownMenu_SetText(text, frame)
HealBot_RecalcParty(); HealBot_RecalcParty();
end end
@@ -101,15 +102,16 @@ function HealBot_Options_SetBuffs()
if dropDown then if dropDown then
local val = HealBot_Config.BuffDropDowns[myClass][i] or 0 local val = HealBot_Config.BuffDropDowns[myClass][i] or 0
UIDropDownMenu_Initialize(dropDown, HealBot_Options_Buff_Initialize) UIDropDownMenu_Initialize(dropDown, HealBot_Options_Buff_Initialize)
UIDropDownMenu_SetSelectedID(dropDown, val + 1) HealBot_UIDropDownMenu_SetSelectedID(dropDown, val + 1)
end end
local selfCheck = getglobal("HealBot_Options_BuffSelf" .. i) local selfCheck = getglobal("HealBot_Options_BuffSelf" .. i)
if selfCheck then if selfCheck then
if HealBot_Config.BuffWatchSelf and HealBot_Config.BuffWatchSelf[i] then if HealBot_Config.BuffWatchSelf and HealBot_Config.BuffWatchSelf[i] then
selfCheck:SetChecked(HealBot_Config.BuffWatchSelf[i]) local isSelf = (HealBot_Config.BuffWatchSelf[i] == 1)
selfCheck:SetChecked(isSelf and 1 or nil)
else else
selfCheck:SetChecked(0) selfCheck:SetChecked(nil)
end end
end end
end end
+6 -6
View File
@@ -123,7 +123,7 @@
<Anchors> <Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_Buff1" relativePoint="BOTTOMLEFT"> <Anchor point="TOPLEFT" relativeTo="HealBot_Options_Buff1" relativePoint="BOTTOMLEFT">
<Offset> <Offset>
<AbsDimension x="0" y="-20" /> <AbsDimension x="0" y="-35" />
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -160,7 +160,7 @@
<Anchors> <Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_Buff2" relativePoint="BOTTOMLEFT"> <Anchor point="TOPLEFT" relativeTo="HealBot_Options_Buff2" relativePoint="BOTTOMLEFT">
<Offset> <Offset>
<AbsDimension x="0" y="-20" /> <AbsDimension x="0" y="-35" />
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -197,7 +197,7 @@
<Anchors> <Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_Buff3" relativePoint="BOTTOMLEFT"> <Anchor point="TOPLEFT" relativeTo="HealBot_Options_Buff3" relativePoint="BOTTOMLEFT">
<Offset> <Offset>
<AbsDimension x="0" y="-20" /> <AbsDimension x="0" y="-35" />
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -271,7 +271,7 @@
<Anchors> <Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_Buff5" relativePoint="BOTTOMLEFT"> <Anchor point="TOPLEFT" relativeTo="HealBot_Options_Buff5" relativePoint="BOTTOMLEFT">
<Offset> <Offset>
<AbsDimension x="0" y="-20" /> <AbsDimension x="0" y="-35" />
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -308,7 +308,7 @@
<Anchors> <Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_Buff6" relativePoint="BOTTOMLEFT"> <Anchor point="TOPLEFT" relativeTo="HealBot_Options_Buff6" relativePoint="BOTTOMLEFT">
<Offset> <Offset>
<AbsDimension x="0" y="-20" /> <AbsDimension x="0" y="-35" />
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -345,7 +345,7 @@
<Anchors> <Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_Buff7" relativePoint="BOTTOMLEFT"> <Anchor point="TOPLEFT" relativeTo="HealBot_Options_Buff7" relativePoint="BOTTOMLEFT">
<Offset> <Offset>
<AbsDimension x="0" y="-20" /> <AbsDimension x="0" y="-35" />
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
+6 -6
View File
@@ -51,7 +51,7 @@ end
function HealBot_Options_CDCMonitor_Refresh(onselect) function HealBot_Options_CDCMonitor_Refresh(onselect)
if not HealBot_Config.CDCMonitor then return end if not HealBot_Config.CDCMonitor then return end
if not onselect then HealBot_Options_CDCMonitor_Initialize() end -- or wrong menu may be used ! if not onselect then HealBot_Options_CDCMonitor_Initialize() end -- or wrong menu may be used !
UIDropDownMenu_SetSelectedID(HealBot_Options_CDCMonitor,HealBot_Config.CDCMonitor) HealBot_UIDropDownMenu_SetSelectedID(HealBot_Options_CDCMonitor,HealBot_Config.CDCMonitor)
end end
function HealBot_Options_CDCMonitor_OnLoad() function HealBot_Options_CDCMonitor_OnLoad()
UIDropDownMenu_Initialize(this, HealBot_Options_CDCMonitor_DropDown) UIDropDownMenu_Initialize(this, HealBot_Options_CDCMonitor_DropDown)
@@ -200,14 +200,14 @@ function HealBot_Options_CDCButLeft_Refresh(onselect)
local class=UnitClass("Player"); local class=UnitClass("Player");
if not onselect then HealBot_Options_CDCButLeft_Initialize() end if not onselect then HealBot_Options_CDCButLeft_Initialize() end
set_id = HealBot_Config.Debuff_Left[class]; set_id = HealBot_Config.Debuff_Left[class];
UIDropDownMenu_SetSelectedID(HealBot_Options_CDCButLeft,set_id) HealBot_UIDropDownMenu_SetSelectedID(HealBot_Options_CDCButLeft,set_id)
end end
function HealBot_Options_CDCButRight_Refresh(onselect) function HealBot_Options_CDCButRight_Refresh(onselect)
local set_id; local set_id;
local class=UnitClass("Player"); local class=UnitClass("Player");
if not onselect then HealBot_Options_CDCButRight_Initialize() end if not onselect then HealBot_Options_CDCButRight_Initialize() end
set_id = HealBot_Config.Debuff_Right[class]; set_id = HealBot_Config.Debuff_Right[class];
UIDropDownMenu_SetSelectedID(HealBot_Options_CDCButRight,set_id) HealBot_UIDropDownMenu_SetSelectedID(HealBot_Options_CDCButRight,set_id)
end end
function HealBot_Options_CDCButLeft_OnLoad() function HealBot_Options_CDCButLeft_OnLoad()
UIDropDownMenu_Initialize(this, HealBot_Options_CDCButLeft_DropDown) UIDropDownMenu_Initialize(this, HealBot_Options_CDCButLeft_DropDown)
@@ -247,16 +247,16 @@ function HealBot_Options_Debuff_Reset()
local classEN=HealBot_UnitClass("player") local classEN=HealBot_UnitClass("player")
if classEN=="PRIEST" or classEN=="DRUID" or classEN=="PALADIN" or classEN=="SHAMAN" then if classEN=="PRIEST" or classEN=="DRUID" or classEN=="PALADIN" or classEN=="SHAMAN" then
local spell = HealBot_Config.CDCLeftText[UnitClass("player")]; local spell = HealBot_Config.CDCLeftText[UnitClass("player")];
HealBot_DebuffWatch = {[HEALBOT_DISEASE_en]="NO", [HEALBOT_MAGIC_en]="NO", [HEALBOT_POISON_en]="NO", [HEALBOT_CURSE_en]="NO" } HealBot_DebuffWatch = {[HEALBOT_DISEASE_en]=false, [HEALBOT_MAGIC_en]=false, [HEALBOT_POISON_en]=false, [HEALBOT_CURSE_en]=false }
if spell ~= "None" then if spell ~= "None" then
table.foreach(HealBot_Debuff_Types[spell], function (index,debuff) table.foreach(HealBot_Debuff_Types[spell], function (index,debuff)
HealBot_DebuffWatch[debuff]="YES"; HealBot_DebuffWatch[debuff]=true;
end) end)
end end
spell = HealBot_Config.CDCRightText[UnitClass("player")]; spell = HealBot_Config.CDCRightText[UnitClass("player")];
if spell ~= "None" then if spell ~= "None" then
table.foreach(HealBot_Debuff_Types[spell], function (index,debuff) table.foreach(HealBot_Debuff_Types[spell], function (index,debuff)
HealBot_DebuffWatch[debuff]="YES"; HealBot_DebuffWatch[debuff]=true;
end) end)
end end
end end
+13 -70
View File
@@ -1,69 +1,10 @@
-- HealBot Options panel file: HealBot_Options_Chat.lua -- HealBot Options panel file: HealBot_Options_Chat.lua
-- Split from original HealBot_Options.lua -- Split from original HealBot_Options.lua
local HealBot_PlayerSpells = nil
function HealBot_GetPlayerSpells()
if HealBot_PlayerSpells then return HealBot_PlayerSpells end
local spellSet = {}
local i = 1
while true do
local spellName, spellRank = GetSpellName(i, BOOKTYPE_SPELL)
if not spellName then
break
end
spellSet[spellName] = true
i = i + 1
end
local sortedSpells = {}
for k, _ in pairs(spellSet) do
table.insert(sortedSpells, k)
end
table.sort(sortedSpells)
HealBot_PlayerSpells = sortedSpells
return sortedSpells
end
function HealBot_Options_ChatMsg_Spell_Initialize()
local info
info = { text = "None", func = HealBot_Options_ChatMsg_Spell_OnClick, value = "None" }
UIDropDownMenu_AddButton(info)
local spells = HealBot_GetPlayerSpells()
for _, spellName in ipairs(spells) do
info = {
text = spellName,
func = HealBot_Options_ChatMsg_Spell_OnClick,
value = spellName
}
UIDropDownMenu_AddButton(info)
end
end
function HealBot_Options_ChatMsg_Spell_OnClick()
local frameName = UIDROPDOWNMENU_OPEN_MENU
local frame = getglobal(frameName)
local id = frame:GetID()
if not HealBot_Config.ChatMessages then HealBot_Config.ChatMessages = {} end
if not HealBot_Config.ChatMessages[id] then
HealBot_Config.ChatMessages[id] = { Spell = "None", Message = "Casting #Spell# on #Target#", Channel = "None" }
end
HealBot_Config.ChatMessages[id].Spell = this.value
local text = this.value
if text == "None" then text = "None" end
UIDropDownMenu_SetSelectedValue(frame, this.value)
UIDropDownMenu_SetText(text, frame)
end
function HealBot_Options_ChatMsg_Channel_OnClick(id, buttonFrame) function HealBot_Options_ChatMsg_Channel_OnClick(id, buttonFrame)
if not HealBot_Config.ChatMessages then HealBot_Config.ChatMessages = {} end if not HealBot_Config.ChatMessages then HealBot_Config.ChatMessages = {} end
if not HealBot_Config.ChatMessages[id] then if not HealBot_Config.ChatMessages[id] then
HealBot_Config.ChatMessages[id] = { Spell = "None", Message = "Casting #Spell# on #Target#", Channel = "None" } HealBot_Config.ChatMessages[id] = { Spell = "", Message = "Casting #Spell# on #Target#", Channel = "None" }
end end
local current = HealBot_Config.ChatMessages[id].Channel local current = HealBot_Config.ChatMessages[id].Channel
@@ -91,24 +32,26 @@ function HealBot_Options_SetChatMessages()
end end
for i = 1, 5 do for i = 1, 5 do
if not HealBot_Config.ChatMessages[i] then if not HealBot_Config.ChatMessages[i] then
HealBot_Config.ChatMessages[i] = { Spell = "None", Message = "Casting #Spell# on #Target#", Channel = "None" } HealBot_Config.ChatMessages[i] = { Spell = "", Message = "Casting #Spell# on #Target#", Channel = "None" }
end end
end end
for i = 1, 5 do for i = 1, 5 do
local msgConfig = HealBot_Config.ChatMessages[i] local msgConfig = HealBot_Config.ChatMessages[i]
if msgConfig then if msgConfig then
local dropDown = getglobal("HealBot_Options_ChatMsg"..i) local spellEdit = getglobal("HealBot_Options_ChatMsg"..i.."_Spell")
local editBox = getglobal("HealBot_Options_ChatMsg"..i.."_Text") local textEdit = getglobal("HealBot_Options_ChatMsg"..i.."_Text")
local chanButton = getglobal("HealBot_Options_ChatMsg"..i.."_Channel") local chanButton = getglobal("HealBot_Options_ChatMsg"..i.."_Channel")
if dropDown then if spellEdit then
UIDropDownMenu_Initialize(dropDown, HealBot_Options_ChatMsg_Spell_Initialize) if msgConfig.Spell == "None" then
UIDropDownMenu_SetSelectedValue(dropDown, msgConfig.Spell) spellEdit:SetText("")
UIDropDownMenu_SetWidth(110, dropDown) msgConfig.Spell = ""
UIDropDownMenu_SetText(msgConfig.Spell, dropDown) else
spellEdit:SetText(msgConfig.Spell or "")
end
end end
if editBox then if textEdit then
editBox:SetText(msgConfig.Message or "") textEdit:SetText(msgConfig.Message or "")
end end
if chanButton then if chanButton then
chanButton:SetText(msgConfig.Channel or "None") chanButton:SetText(msgConfig.Channel or "None")
+142 -93
View File
@@ -5,23 +5,50 @@
<Frame name="HealBot_Options_Panel7" parent="HealBot_Options" hidden="true" setAllPoints="true"> <Frame name="HealBot_Options_Panel7" parent="HealBot_Options" hidden="true" setAllPoints="true">
<Frames> <Frames>
<!-- Chat Message 1 --> <!-- Chat Message 1 -->
<Frame name="HealBot_Options_ChatMsg1" inherits="UIDropDownMenuTemplate" id="1"> <EditBox name="HealBot_Options_ChatMsg1_Spell" inherits="InputBoxTemplate" autoFocus="false">
<Size>
<AbsDimension x="130" y="20"/>
</Size>
<Anchors> <Anchors>
<Anchor point="TOPLEFT"> <Anchor point="TOPLEFT">
<Offset> <Offset>
<AbsDimension x="0" y="-30" /> <AbsDimension x="25" y="-30" />
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
</Frame> <Scripts>
<EditBox name="HealBot_Options_ChatMsg1_Text" inherits="InputBoxTemplate" autoFocus="false"> <OnTextChanged>
if HealBot_Config.ChatMessages then
HealBot_Config.ChatMessages[1].Spell = this:GetText();
end
</OnTextChanged>
</Scripts>
</EditBox>
<Button name="HealBot_Options_ChatMsg1_Channel" inherits="UIPanelButtonTemplate" text="None">
<Size> <Size>
<AbsDimension x="200" y="20"/> <AbsDimension x="80" y="22"/>
</Size> </Size>
<Anchors> <Anchors>
<Anchor point="LEFT" relativeTo="HealBot_Options_ChatMsg1" relativePoint="RIGHT"> <Anchor point="LEFT" relativeTo="HealBot_Options_ChatMsg1_Spell" relativePoint="RIGHT">
<Offset> <Offset>
<AbsDimension x="0" y="2"/> <AbsDimension x="15" y="0"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnClick>
HealBot_Options_ChatMsg_Channel_OnClick(1, this);
</OnClick>
</Scripts>
</Button>
<EditBox name="HealBot_Options_ChatMsg1_Text" inherits="InputBoxTemplate" autoFocus="false">
<Size>
<AbsDimension x="300" y="20"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_ChatMsg1_Spell" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="0" y="-5"/>
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -33,41 +60,51 @@
</OnTextChanged> </OnTextChanged>
</Scripts> </Scripts>
</EditBox> </EditBox>
<Button name="HealBot_Options_ChatMsg1_Channel" inherits="UIPanelButtonTemplate" text="None"> <!-- Chat Message 2 -->
<EditBox name="HealBot_Options_ChatMsg2_Spell" inherits="InputBoxTemplate" autoFocus="false">
<Size>
<AbsDimension x="130" y="20"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="25" y="-90" />
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnTextChanged>
if HealBot_Config.ChatMessages then
HealBot_Config.ChatMessages[2].Spell = this:GetText();
end
</OnTextChanged>
</Scripts>
</EditBox>
<Button name="HealBot_Options_ChatMsg2_Channel" inherits="UIPanelButtonTemplate" text="None">
<Size> <Size>
<AbsDimension x="80" y="22"/> <AbsDimension x="80" y="22"/>
</Size> </Size>
<Anchors> <Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_ChatMsg1_Text" relativePoint="BOTTOMLEFT"> <Anchor point="LEFT" relativeTo="HealBot_Options_ChatMsg2_Spell" relativePoint="RIGHT">
<Offset> <Offset>
<AbsDimension x="0" y="-5"/> <AbsDimension x="15" y="0"/>
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
<Scripts> <Scripts>
<OnClick> <OnClick>
HealBot_Options_ChatMsg_Channel_OnClick(1, this); HealBot_Options_ChatMsg_Channel_OnClick(2, this);
</OnClick> </OnClick>
</Scripts> </Scripts>
</Button> </Button>
<!-- Chat Message 2 -->
<Frame name="HealBot_Options_ChatMsg2" inherits="UIDropDownMenuTemplate" id="2">
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="0" y="-90" />
</Offset>
</Anchor>
</Anchors>
</Frame>
<EditBox name="HealBot_Options_ChatMsg2_Text" inherits="InputBoxTemplate" autoFocus="false"> <EditBox name="HealBot_Options_ChatMsg2_Text" inherits="InputBoxTemplate" autoFocus="false">
<Size> <Size>
<AbsDimension x="200" y="20"/> <AbsDimension x="300" y="20"/>
</Size> </Size>
<Anchors> <Anchors>
<Anchor point="LEFT" relativeTo="HealBot_Options_ChatMsg2" relativePoint="RIGHT"> <Anchor point="TOPLEFT" relativeTo="HealBot_Options_ChatMsg2_Spell" relativePoint="BOTTOMLEFT">
<Offset> <Offset>
<AbsDimension x="0" y="2"/> <AbsDimension x="0" y="-5"/>
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -79,41 +116,51 @@
</OnTextChanged> </OnTextChanged>
</Scripts> </Scripts>
</EditBox> </EditBox>
<Button name="HealBot_Options_ChatMsg2_Channel" inherits="UIPanelButtonTemplate" text="None"> <!-- Chat Message 3 -->
<EditBox name="HealBot_Options_ChatMsg3_Spell" inherits="InputBoxTemplate" autoFocus="false">
<Size>
<AbsDimension x="130" y="20"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="25" y="-150" />
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnTextChanged>
if HealBot_Config.ChatMessages then
HealBot_Config.ChatMessages[3].Spell = this:GetText();
end
</OnTextChanged>
</Scripts>
</EditBox>
<Button name="HealBot_Options_ChatMsg3_Channel" inherits="UIPanelButtonTemplate" text="None">
<Size> <Size>
<AbsDimension x="80" y="22"/> <AbsDimension x="80" y="22"/>
</Size> </Size>
<Anchors> <Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_ChatMsg2_Text" relativePoint="BOTTOMLEFT"> <Anchor point="LEFT" relativeTo="HealBot_Options_ChatMsg3_Spell" relativePoint="RIGHT">
<Offset> <Offset>
<AbsDimension x="0" y="-5"/> <AbsDimension x="15" y="0"/>
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
<Scripts> <Scripts>
<OnClick> <OnClick>
HealBot_Options_ChatMsg_Channel_OnClick(2, this); HealBot_Options_ChatMsg_Channel_OnClick(3, this);
</OnClick> </OnClick>
</Scripts> </Scripts>
</Button> </Button>
<!-- Chat Message 3 -->
<Frame name="HealBot_Options_ChatMsg3" inherits="UIDropDownMenuTemplate" id="3">
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="0" y="-150" />
</Offset>
</Anchor>
</Anchors>
</Frame>
<EditBox name="HealBot_Options_ChatMsg3_Text" inherits="InputBoxTemplate" autoFocus="false"> <EditBox name="HealBot_Options_ChatMsg3_Text" inherits="InputBoxTemplate" autoFocus="false">
<Size> <Size>
<AbsDimension x="200" y="20"/> <AbsDimension x="300" y="20"/>
</Size> </Size>
<Anchors> <Anchors>
<Anchor point="LEFT" relativeTo="HealBot_Options_ChatMsg3" relativePoint="RIGHT"> <Anchor point="TOPLEFT" relativeTo="HealBot_Options_ChatMsg3_Spell" relativePoint="BOTTOMLEFT">
<Offset> <Offset>
<AbsDimension x="0" y="2"/> <AbsDimension x="0" y="-5"/>
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -125,41 +172,51 @@
</OnTextChanged> </OnTextChanged>
</Scripts> </Scripts>
</EditBox> </EditBox>
<Button name="HealBot_Options_ChatMsg3_Channel" inherits="UIPanelButtonTemplate" text="None"> <!-- Chat Message 4 -->
<EditBox name="HealBot_Options_ChatMsg4_Spell" inherits="InputBoxTemplate" autoFocus="false">
<Size>
<AbsDimension x="130" y="20"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="25" y="-210" />
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnTextChanged>
if HealBot_Config.ChatMessages then
HealBot_Config.ChatMessages[4].Spell = this:GetText();
end
</OnTextChanged>
</Scripts>
</EditBox>
<Button name="HealBot_Options_ChatMsg4_Channel" inherits="UIPanelButtonTemplate" text="None">
<Size> <Size>
<AbsDimension x="80" y="22"/> <AbsDimension x="80" y="22"/>
</Size> </Size>
<Anchors> <Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_ChatMsg3_Text" relativePoint="BOTTOMLEFT"> <Anchor point="LEFT" relativeTo="HealBot_Options_ChatMsg4_Spell" relativePoint="RIGHT">
<Offset> <Offset>
<AbsDimension x="0" y="-5"/> <AbsDimension x="15" y="0"/>
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
<Scripts> <Scripts>
<OnClick> <OnClick>
HealBot_Options_ChatMsg_Channel_OnClick(3, this); HealBot_Options_ChatMsg_Channel_OnClick(4, this);
</OnClick> </OnClick>
</Scripts> </Scripts>
</Button> </Button>
<!-- Chat Message 4 -->
<Frame name="HealBot_Options_ChatMsg4" inherits="UIDropDownMenuTemplate" id="4">
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="0" y="-210" />
</Offset>
</Anchor>
</Anchors>
</Frame>
<EditBox name="HealBot_Options_ChatMsg4_Text" inherits="InputBoxTemplate" autoFocus="false"> <EditBox name="HealBot_Options_ChatMsg4_Text" inherits="InputBoxTemplate" autoFocus="false">
<Size> <Size>
<AbsDimension x="200" y="20"/> <AbsDimension x="300" y="20"/>
</Size> </Size>
<Anchors> <Anchors>
<Anchor point="LEFT" relativeTo="HealBot_Options_ChatMsg4" relativePoint="RIGHT"> <Anchor point="TOPLEFT" relativeTo="HealBot_Options_ChatMsg4_Spell" relativePoint="BOTTOMLEFT">
<Offset> <Offset>
<AbsDimension x="0" y="2"/> <AbsDimension x="0" y="-5"/>
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -171,41 +228,51 @@
</OnTextChanged> </OnTextChanged>
</Scripts> </Scripts>
</EditBox> </EditBox>
<Button name="HealBot_Options_ChatMsg4_Channel" inherits="UIPanelButtonTemplate" text="None"> <!-- Chat Message 5 -->
<EditBox name="HealBot_Options_ChatMsg5_Spell" inherits="InputBoxTemplate" autoFocus="false">
<Size>
<AbsDimension x="130" y="20"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="25" y="-270" />
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnTextChanged>
if HealBot_Config.ChatMessages then
HealBot_Config.ChatMessages[5].Spell = this:GetText();
end
</OnTextChanged>
</Scripts>
</EditBox>
<Button name="HealBot_Options_ChatMsg5_Channel" inherits="UIPanelButtonTemplate" text="None">
<Size> <Size>
<AbsDimension x="80" y="22"/> <AbsDimension x="80" y="22"/>
</Size> </Size>
<Anchors> <Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_ChatMsg4_Text" relativePoint="BOTTOMLEFT"> <Anchor point="LEFT" relativeTo="HealBot_Options_ChatMsg5_Spell" relativePoint="RIGHT">
<Offset> <Offset>
<AbsDimension x="0" y="-5"/> <AbsDimension x="15" y="0"/>
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
<Scripts> <Scripts>
<OnClick> <OnClick>
HealBot_Options_ChatMsg_Channel_OnClick(4, this); HealBot_Options_ChatMsg_Channel_OnClick(5, this);
</OnClick> </OnClick>
</Scripts> </Scripts>
</Button> </Button>
<!-- Chat Message 5 -->
<Frame name="HealBot_Options_ChatMsg5" inherits="UIDropDownMenuTemplate" id="5">
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="0" y="-270" />
</Offset>
</Anchor>
</Anchors>
</Frame>
<EditBox name="HealBot_Options_ChatMsg5_Text" inherits="InputBoxTemplate" autoFocus="false"> <EditBox name="HealBot_Options_ChatMsg5_Text" inherits="InputBoxTemplate" autoFocus="false">
<Size> <Size>
<AbsDimension x="200" y="20"/> <AbsDimension x="300" y="20"/>
</Size> </Size>
<Anchors> <Anchors>
<Anchor point="LEFT" relativeTo="HealBot_Options_ChatMsg5" relativePoint="RIGHT"> <Anchor point="TOPLEFT" relativeTo="HealBot_Options_ChatMsg5_Spell" relativePoint="BOTTOMLEFT">
<Offset> <Offset>
<AbsDimension x="0" y="2"/> <AbsDimension x="0" y="-5"/>
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -217,24 +284,6 @@
</OnTextChanged> </OnTextChanged>
</Scripts> </Scripts>
</EditBox> </EditBox>
<Button name="HealBot_Options_ChatMsg5_Channel" inherits="UIPanelButtonTemplate" text="None">
<Size>
<AbsDimension x="80" y="22"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_ChatMsg5_Text" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="0" y="-5"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnClick>
HealBot_Options_ChatMsg_Channel_OnClick(5, this);
</OnClick>
</Scripts>
</Button>
</Frames> </Frames>
</Frame> </Frame>
</Ui> </Ui>
+2 -1
View File
@@ -5,7 +5,8 @@ function HealBot_Options_ShowHeaders_OnLoad(this)
getglobal(this:GetName().."Text"):SetText(HEALBOT_OPTIONS_SHOWHEADERS); getglobal(this:GetName().."Text"):SetText(HEALBOT_OPTIONS_SHOWHEADERS);
end end
function HealBot_Options_ShowHeaders_OnClick(this) function HealBot_Options_ShowHeaders_OnClick(this)
HealBot_Config.ShowHeader[HealBot_Config.Current_Skin] = this:GetChecked(); local isChecked = this:GetChecked()
HealBot_Config.ShowHeader[HealBot_Config.Current_Skin] = isChecked and 1 or 0;
HealBot_Action_ResetSkin() HealBot_Action_ResetSkin()
end end
function HealBot_Options_BarTextureS_OnValueChanged(this) function HealBot_Options_BarTextureS_OnValueChanged(this)
+56 -4
View File
@@ -102,7 +102,7 @@
</OnLoad> </OnLoad>
</Scripts> </Scripts>
<Size> <Size>
<AbsDimension y="70"/> <AbsDimension y="95"/>
</Size> </Size>
<Anchors> <Anchors>
<Anchor point="TOPLEFT"> <Anchor point="TOPLEFT">
@@ -156,7 +156,7 @@
<Anchors> <Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_ShowManaBars" relativePoint="TOPLEFT"> <Anchor point="TOPLEFT" relativeTo="HealBot_Options_ShowManaBars" relativePoint="TOPLEFT">
<Offset> <Offset>
<AbsDimension x="200" y="0" /> <AbsDimension x="180" y="0" />
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -174,6 +174,28 @@
</OnClick> </OnClick>
</Scripts> </Scripts>
</CheckButton> </CheckButton>
<CheckButton name="HealBot_Options_ShowNonManaBars" inherits="OptionsCheckButtonTemplate">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_ShowManaBars" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="0" y="-2" />
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>
getglobal(this:GetName().."Text"):SetText("Track Non-Mana Resources");
</OnLoad>
<OnClick>
if (this:GetChecked()) then
HealBot_Config.ShowNonManaBars = 1;
else
HealBot_Config.ShowNonManaBars = 0;
end
HealBot_Action_Refresh();
</OnClick>
</Scripts>
</CheckButton>
</Frames> </Frames>
</Frame> </Frame>
@@ -243,8 +265,38 @@
</Scripts> </Scripts>
</CheckButton> </CheckButton>
<Button name="HealBot_Options_Defaults" inherits="UIPanelButtonTemplate" text="HEALBOT_OPTIONS_DEFAULTS">
<Size>
<AbsDimension x="80" y="22"/>
</Size>
<Anchors>
<Anchor point="BOTTOM" relativePoint="BOTTOM">
<Offset>
<AbsDimension x="-50" y="15"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnClick>HealBot_Options_Defaults_OnClick(this)</OnClick>
</Scripts>
</Button>
<Button name="HealBot_Options_CloseButton" inherits="UIPanelButtonTemplate" text="HEALBOT_OPTIONS_CLOSE">
<Size>
<AbsDimension x="80" y="22"/>
</Size>
<Anchors>
<Anchor point="BOTTOM" relativePoint="BOTTOM">
<Offset>
<AbsDimension x="50" y="15"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnClick>
HideUIPanel(this:GetParent():GetParent());
</OnClick>
</Scripts>
</Button>
</Frames> </Frames>
</Frame> </Frame>
+46 -17
View File
@@ -85,6 +85,33 @@ function HealBot_Options_EFClass_OnClick(this)
HealBot_Action_PartyChanged(); HealBot_Action_PartyChanged();
end end
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 = { local HealBot_Options_EmergencyFClass_List = {
HEALBOT_CLASSES_MELEE, HEALBOT_CLASSES_MELEE,
HEALBOT_CLASSES_RANGES, HEALBOT_CLASSES_RANGES,
@@ -108,7 +135,7 @@ end
function HealBot_Options_EmergencyFClass_Refresh(onselect) function HealBot_Options_EmergencyFClass_Refresh(onselect)
if not HealBot_Config.EmergencyFClass then return end if not HealBot_Config.EmergencyFClass then return end
if not onselect then HealBot_Options_EmergencyFClass_Initialize() end -- or wrong menu may be used ! if not onselect then HealBot_Options_EmergencyFClass_Initialize() end -- or wrong menu may be used !
UIDropDownMenu_SetSelectedID(HealBot_Options_EmergencyFClass,HealBot_Config.EmergencyFClass) HealBot_UIDropDownMenu_SetSelectedID(HealBot_Options_EmergencyFClass,HealBot_Config.EmergencyFClass)
end end
function HealBot_Options_EmergencyFClass_OnLoad() function HealBot_Options_EmergencyFClass_OnLoad()
@@ -191,7 +218,7 @@ end
function HealBot_Options_ExtraSort_Refresh(onselect) function HealBot_Options_ExtraSort_Refresh(onselect)
if not HealBot_Config.ExtraOrder then return end if not HealBot_Config.ExtraOrder then return end
if not onselect then HealBot_Options_ExtraSort_Initialize() end -- or wrong menu may be used ! if not onselect then HealBot_Options_ExtraSort_Initialize() end -- or wrong menu may be used !
UIDropDownMenu_SetSelectedID(HealBot_Options_ExtraSort,HealBot_Config.ExtraOrder) HealBot_UIDropDownMenu_SetSelectedID(HealBot_Options_ExtraSort,HealBot_Config.ExtraOrder)
end end
function HealBot_Options_ExtraSort_OnLoad() function HealBot_Options_ExtraSort_OnLoad()
@@ -225,7 +252,7 @@ end
function HealBot_Options_EmergencyFilter_Refresh(onselect) function HealBot_Options_EmergencyFilter_Refresh(onselect)
if not HealBot_Config.EmergIncMonitor then return end if not HealBot_Config.EmergIncMonitor then return end
if not onselect then HealBot_Options_EmergencyFilter_Initialize() end -- or wrong menu may be used ! if not onselect then HealBot_Options_EmergencyFilter_Initialize() end -- or wrong menu may be used !
UIDropDownMenu_SetSelectedID(HealBot_Options_EmergencyFilter,HealBot_Config.EmergIncMonitor) HealBot_UIDropDownMenu_SetSelectedID(HealBot_Options_EmergencyFilter,HealBot_Config.EmergIncMonitor)
end end
@@ -252,7 +279,7 @@ function HealBot_Options_EmergencyFilter_Reset()
HealBot_EmergInc[HEALBOT_SHAMAN] = 0; HealBot_EmergInc[HEALBOT_SHAMAN] = 0;
HealBot_EmergInc[HEALBOT_WARLOCK] = 0; HealBot_EmergInc[HEALBOT_WARLOCK] = 0;
HealBot_EmergInc[HEALBOT_WARRIOR] = 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_DRUID] = 1;
HealBot_EmergInc[HEALBOT_HUNTER] = 1; HealBot_EmergInc[HEALBOT_HUNTER] = 1;
HealBot_EmergInc[HEALBOT_MAGE] = 1; HealBot_EmergInc[HEALBOT_MAGE] = 1;
@@ -262,25 +289,27 @@ function HealBot_Options_EmergencyFilter_Reset()
HealBot_EmergInc[HEALBOT_SHAMAN] = 1; HealBot_EmergInc[HEALBOT_SHAMAN] = 1;
HealBot_EmergInc[HEALBOT_WARLOCK] = 1; HealBot_EmergInc[HEALBOT_WARLOCK] = 1;
HealBot_EmergInc[HEALBOT_WARRIOR] = 1; HealBot_EmergInc[HEALBOT_WARRIOR] = 1;
elseif HealBot_Config.EmergIncMonitor==2 then
HealBot_EmergInc[HEALBOT_DRUID] = 1;
elseif HealBot_Config.EmergIncMonitor==3 then elseif HealBot_Config.EmergIncMonitor==3 then
HealBot_EmergInc[HEALBOT_HUNTER] = 1; HealBot_EmergInc[HEALBOT_DRUID] = 1;
elseif HealBot_Config.EmergIncMonitor==4 then elseif HealBot_Config.EmergIncMonitor==4 then
HealBot_EmergInc[HEALBOT_MAGE] = 1; HealBot_EmergInc[HEALBOT_HUNTER] = 1;
elseif HealBot_Config.EmergIncMonitor==5 then elseif HealBot_Config.EmergIncMonitor==5 then
HealBot_EmergInc[HEALBOT_PALADIN] = 1; HealBot_EmergInc[HEALBOT_MAGE] = 1;
elseif HealBot_Config.EmergIncMonitor==6 then elseif HealBot_Config.EmergIncMonitor==6 then
HealBot_EmergInc[HEALBOT_PRIEST] = 1; HealBot_EmergInc[HEALBOT_PALADIN] = 1;
elseif HealBot_Config.EmergIncMonitor==7 then elseif HealBot_Config.EmergIncMonitor==7 then
HealBot_EmergInc[HEALBOT_ROGUE] = 1; HealBot_EmergInc[HEALBOT_PRIEST] = 1;
elseif HealBot_Config.EmergIncMonitor==8 then elseif HealBot_Config.EmergIncMonitor==8 then
HealBot_EmergInc[HEALBOT_SHAMAN] = 1; HealBot_EmergInc[HEALBOT_ROGUE] = 1;
elseif HealBot_Config.EmergIncMonitor==9 then elseif HealBot_Config.EmergIncMonitor==9 then
HealBot_EmergInc[HEALBOT_WARLOCK] = 1; HealBot_EmergInc[HEALBOT_SHAMAN] = 1;
elseif HealBot_Config.EmergIncMonitor==10 then elseif HealBot_Config.EmergIncMonitor==10 then
HealBot_EmergInc[HEALBOT_WARRIOR] = 1; HealBot_EmergInc[HEALBOT_WARLOCK] = 1;
elseif HealBot_Config.EmergIncMonitor==11 then 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_DRUID] = HealBot_Config.EmergIncMelee[HEALBOT_DRUID];
HealBot_EmergInc[HEALBOT_HUNTER] = HealBot_Config.EmergIncMelee[HEALBOT_HUNTER]; HealBot_EmergInc[HEALBOT_HUNTER] = HealBot_Config.EmergIncMelee[HEALBOT_HUNTER];
HealBot_EmergInc[HEALBOT_MAGE] = HealBot_Config.EmergIncMelee[HEALBOT_MAGE]; HealBot_EmergInc[HEALBOT_MAGE] = HealBot_Config.EmergIncMelee[HEALBOT_MAGE];
@@ -290,7 +319,7 @@ function HealBot_Options_EmergencyFilter_Reset()
HealBot_EmergInc[HEALBOT_SHAMAN] = HealBot_Config.EmergIncMelee[HEALBOT_SHAMAN]; HealBot_EmergInc[HEALBOT_SHAMAN] = HealBot_Config.EmergIncMelee[HEALBOT_SHAMAN];
HealBot_EmergInc[HEALBOT_WARLOCK] = HealBot_Config.EmergIncMelee[HEALBOT_WARLOCK]; HealBot_EmergInc[HEALBOT_WARLOCK] = HealBot_Config.EmergIncMelee[HEALBOT_WARLOCK];
HealBot_EmergInc[HEALBOT_WARRIOR] = HealBot_Config.EmergIncMelee[HEALBOT_WARRIOR]; 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_DRUID] = HealBot_Config.EmergIncRange[HEALBOT_DRUID];
HealBot_EmergInc[HEALBOT_HUNTER] = HealBot_Config.EmergIncRange[HEALBOT_HUNTER]; HealBot_EmergInc[HEALBOT_HUNTER] = HealBot_Config.EmergIncRange[HEALBOT_HUNTER];
HealBot_EmergInc[HEALBOT_MAGE] = HealBot_Config.EmergIncRange[HEALBOT_MAGE]; HealBot_EmergInc[HEALBOT_MAGE] = HealBot_Config.EmergIncRange[HEALBOT_MAGE];
@@ -300,7 +329,7 @@ function HealBot_Options_EmergencyFilter_Reset()
HealBot_EmergInc[HEALBOT_SHAMAN] = HealBot_Config.EmergIncRange[HEALBOT_SHAMAN]; HealBot_EmergInc[HEALBOT_SHAMAN] = HealBot_Config.EmergIncRange[HEALBOT_SHAMAN];
HealBot_EmergInc[HEALBOT_WARLOCK] = HealBot_Config.EmergIncRange[HEALBOT_WARLOCK]; HealBot_EmergInc[HEALBOT_WARLOCK] = HealBot_Config.EmergIncRange[HEALBOT_WARLOCK];
HealBot_EmergInc[HEALBOT_WARRIOR] = HealBot_Config.EmergIncRange[HEALBOT_WARRIOR]; 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_DRUID] = HealBot_Config.EmergIncHealers[HEALBOT_DRUID];
HealBot_EmergInc[HEALBOT_HUNTER] = HealBot_Config.EmergIncHealers[HEALBOT_HUNTER]; HealBot_EmergInc[HEALBOT_HUNTER] = HealBot_Config.EmergIncHealers[HEALBOT_HUNTER];
HealBot_EmergInc[HEALBOT_MAGE] = HealBot_Config.EmergIncHealers[HEALBOT_MAGE]; HealBot_EmergInc[HEALBOT_MAGE] = HealBot_Config.EmergIncHealers[HEALBOT_MAGE];
@@ -310,7 +339,7 @@ function HealBot_Options_EmergencyFilter_Reset()
HealBot_EmergInc[HEALBOT_SHAMAN] = HealBot_Config.EmergIncHealers[HEALBOT_SHAMAN]; HealBot_EmergInc[HEALBOT_SHAMAN] = HealBot_Config.EmergIncHealers[HEALBOT_SHAMAN];
HealBot_EmergInc[HEALBOT_WARLOCK] = HealBot_Config.EmergIncHealers[HEALBOT_WARLOCK]; HealBot_EmergInc[HEALBOT_WARLOCK] = HealBot_Config.EmergIncHealers[HEALBOT_WARLOCK];
HealBot_EmergInc[HEALBOT_WARRIOR] = HealBot_Config.EmergIncHealers[HEALBOT_WARRIOR]; 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_DRUID] = HealBot_Config.EmergIncCustom[HEALBOT_DRUID];
HealBot_EmergInc[HEALBOT_HUNTER] = HealBot_Config.EmergIncCustom[HEALBOT_HUNTER]; HealBot_EmergInc[HEALBOT_HUNTER] = HealBot_Config.EmergIncCustom[HEALBOT_HUNTER];
HealBot_EmergInc[HEALBOT_MAGE] = HealBot_Config.EmergIncCustom[HEALBOT_MAGE]; HealBot_EmergInc[HEALBOT_MAGE] = HealBot_Config.EmergIncCustom[HEALBOT_MAGE];
+30 -2
View File
@@ -52,7 +52,7 @@
</Anchor> </Anchor>
</Anchors> </Anchors>
<Scripts> <Scripts>
<OnLoad>HealBot_Options_GroupHeals_OnLoad(this,HEALBOT_OPTIONS_GROUPHEALS)</OnLoad> <OnLoad>HealBot_Options_GroupHeals_OnLoad(this,HEALBOT_OPTIONS_GROUPHEALS_LABEL)</OnLoad>
<OnClick>HealBot_Options_GroupHeals_OnClick(this)</OnClick> <OnClick>HealBot_Options_GroupHeals_OnClick(this)</OnClick>
</Scripts> </Scripts>
</CheckButton> </CheckButton>
@@ -183,6 +183,34 @@
</Scripts> </Scripts>
</Frame> </Frame>
<Frame name="HealBot_Options_HealthText" inherits="UIDropDownMenuTemplate" id="1">
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="155" y="-271" />
</Offset>
</Anchor>
</Anchors>
<Layers>
<Layer level="OVERLAY">
<FontString inherits="GameFontNormalSmall" text="Health Text">
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="-110" y="-7"/>
</Offset>
</Anchor>
</Anchors>
</FontString>
</Layer>
</Layers>
<Scripts>
<OnLoad>
HealBot_Options_HealthText_OnLoad(this)
</OnLoad>
</Scripts>
</Frame>
<Frame name="HealBot_Options_EmergLFrame" inherits="OptionFrameBoxTemplate"> <Frame name="HealBot_Options_EmergLFrame" inherits="OptionFrameBoxTemplate">
<Scripts> <Scripts>
<OnLoad> <OnLoad>
@@ -196,7 +224,7 @@
<Anchors> <Anchors>
<Anchor point="TOPLEFT"> <Anchor point="TOPLEFT">
<Offset> <Offset>
<AbsDimension x="21" y="-275"/> <AbsDimension x="21" y="-308"/>
</Offset> </Offset>
</Anchor> </Anchor>
<Anchor point="TOPRIGHT"> <Anchor point="TOPRIGHT">
+23 -1
View File
@@ -1,6 +1,22 @@
-- HealBot Options panel file: HealBot_Options_Skins.lua -- HealBot Options panel file: HealBot_Options_Skins.lua
-- Split from original HealBot_Options.lua -- Split from original HealBot_Options.lua
function HealBot_Options_BarMaxRowsS_OnValueChanged(this)
if not HealBot_Config.bmaxrows then HealBot_Config.bmaxrows = {} end
HealBot_Config.bmaxrows[HealBot_Config.Current_Skin] = this:GetValue()
HealBot_Action_PartyChanged()
end
function HealBot_Options_GridOrientation_OnClick(this)
if not HealBot_Config.GridOrientation then HealBot_Config.GridOrientation = {} end
if this:GetChecked() then
HealBot_Config.GridOrientation[HealBot_Config.Current_Skin] = 2 -- Horizontal
else
HealBot_Config.GridOrientation[HealBot_Config.Current_Skin] = 1 -- Vertical
end
HealBot_Action_PartyChanged()
end
function HealBot_Options_NewSkin_OnTextChanged(this) function HealBot_Options_NewSkin_OnTextChanged(this)
local text= this:GetText() local text= this:GetText()
if string.len(text)>0 then if string.len(text)>0 then
@@ -11,6 +27,10 @@ function HealBot_Options_NewSkin_OnTextChanged(this)
end end
function HealBot_Options_NewSkinb_OnClick(this) function HealBot_Options_NewSkinb_OnClick(this)
HealBot_Config.numcols[HealBot_Options_NewSkin:GetText()] = HealBot_Config.numcols[HealBot_Config.Current_Skin] HealBot_Config.numcols[HealBot_Options_NewSkin:GetText()] = HealBot_Config.numcols[HealBot_Config.Current_Skin]
if not HealBot_Config.bmaxrows then HealBot_Config.bmaxrows = {} end
if not HealBot_Config.GridOrientation then HealBot_Config.GridOrientation = {} end
HealBot_Config.bmaxrows[HealBot_Options_NewSkin:GetText()] = HealBot_Config.bmaxrows[HealBot_Config.Current_Skin] or 0
HealBot_Config.GridOrientation[HealBot_Options_NewSkin:GetText()] = HealBot_Config.GridOrientation[HealBot_Config.Current_Skin] or 1
HealBot_Config.btexture[HealBot_Options_NewSkin:GetText()] = HealBot_Config.btexture[HealBot_Config.Current_Skin] HealBot_Config.btexture[HealBot_Options_NewSkin:GetText()] = HealBot_Config.btexture[HealBot_Config.Current_Skin]
HealBot_Config.bcspace[HealBot_Options_NewSkin:GetText()] = HealBot_Config.bcspace[HealBot_Config.Current_Skin] HealBot_Config.bcspace[HealBot_Options_NewSkin:GetText()] = HealBot_Config.bcspace[HealBot_Config.Current_Skin]
HealBot_Config.brspace[HealBot_Options_NewSkin:GetText()] = HealBot_Config.brspace[HealBot_Config.Current_Skin] HealBot_Config.brspace[HealBot_Options_NewSkin:GetText()] = HealBot_Config.brspace[HealBot_Config.Current_Skin]
@@ -56,6 +76,8 @@ end
function HealBot_Options_DeleteSkin_OnClick(this) function HealBot_Options_DeleteSkin_OnClick(this)
if HealBot_Config.Current_Skin~=HEALBOT_SKINS_STD then if HealBot_Config.Current_Skin~=HEALBOT_SKINS_STD then
HealBot_Config.numcols[HealBot_Options_SkinsText:GetText()] = nil HealBot_Config.numcols[HealBot_Options_SkinsText:GetText()] = nil
if HealBot_Config.bmaxrows then HealBot_Config.bmaxrows[HealBot_Options_SkinsText:GetText()] = nil end
if HealBot_Config.GridOrientation then HealBot_Config.GridOrientation[HealBot_Options_SkinsText:GetText()] = nil end
HealBot_Config.btexture[HealBot_Options_SkinsText:GetText()] = nil HealBot_Config.btexture[HealBot_Options_SkinsText:GetText()] = nil
HealBot_Config.bcspace[HealBot_Options_SkinsText:GetText()] = nil HealBot_Config.bcspace[HealBot_Options_SkinsText:GetText()] = nil
HealBot_Config.brspace[HealBot_Options_SkinsText:GetText()] = nil HealBot_Config.brspace[HealBot_Options_SkinsText:GetText()] = nil
@@ -112,7 +134,7 @@ end
function HealBot_Options_Skins_Refresh(onselect) function HealBot_Options_Skins_Refresh(onselect)
if not HealBot_Config.Skin_ID then return end if not HealBot_Config.Skin_ID then return end
if not onselect then HealBot_Options_Skins_Initialize() end -- or wrong menu may be used ! if not onselect then HealBot_Options_Skins_Initialize() end -- or wrong menu may be used !
UIDropDownMenu_SetSelectedID(HealBot_Options_Skins,HealBot_Config.Skin_ID) HealBot_UIDropDownMenu_SetSelectedID(HealBot_Options_Skins,HealBot_Config.Skin_ID)
end end
function HealBot_Options_Skins_OnLoad() function HealBot_Options_Skins_OnLoad()
UIDropDownMenu_Initialize(this, HealBot_Options_Skins_DropDown) UIDropDownMenu_Initialize(this, HealBot_Options_Skins_DropDown)
+55 -19
View File
@@ -266,9 +266,9 @@
<AbsDimension x="123" y="17" /> <AbsDimension x="123" y="17" />
</Size> </Size>
<Anchors> <Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_BarBRSpaceS" relativePoint="TOPLEFT"> <Anchor point="TOPLEFT" relativeTo="HealBot_Options_BarBCSpaceS" relativePoint="TOPRIGHT">
<Offset> <Offset>
<AbsDimension x="0" y="-35" /> <AbsDimension x="10" y="0" />
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -277,28 +277,14 @@
<OnValueChanged>HealBot_Options_FramePaddingS_OnValueChanged(this)</OnValueChanged> <OnValueChanged>HealBot_Options_FramePaddingS_OnValueChanged(this)</OnValueChanged>
</Scripts> </Scripts>
</Slider> </Slider>
<Slider name="HealBot_Options_BorderThicknessS" inherits="HealBot_Options_SliderTemplate">
<Size>
<AbsDimension x="123" y="17" />
</Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_FramePaddingS" relativePoint="TOPRIGHT">
<Offset>
<AbsDimension x="10" y="0" />
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_val_OnLoad(this,"Solid Border",1,10)</OnLoad>
<OnValueChanged>HealBot_Options_BorderThicknessS_OnValueChanged(this)</OnValueChanged>
</Scripts>
</Slider>
<Slider name="HealBot_Options_BarAlpha" inherits="HealBot_Options_SliderTemplate"> <Slider name="HealBot_Options_BarAlpha" inherits="HealBot_Options_SliderTemplate">
<Size> <Size>
<AbsDimension x="123" y="17" /> <AbsDimension x="123" y="17" />
</Size> </Size>
<Anchors> <Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_FramePaddingS" relativePoint="TOPLEFT"> <Anchor point="TOPLEFT" relativeTo="HealBot_Options_BarBRSpaceS" relativePoint="TOPLEFT">
<Offset> <Offset>
<AbsDimension x="0" y="-35" /> <AbsDimension x="0" y="-35" />
</Offset> </Offset>
@@ -375,6 +361,56 @@
</Scripts> </Scripts>
</Slider> </Slider>
<Slider name="HealBot_Options_BorderThicknessS" inherits="HealBot_Options_SliderTemplate">
<Size>
<AbsDimension x="123" y="17" />
</Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_BarAlphaInHeal" relativePoint="TOPRIGHT">
<Offset>
<AbsDimension x="10" y="0" />
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_val_OnLoad(this,"Solid Border",1,10)</OnLoad>
<OnValueChanged>HealBot_Options_BorderThicknessS_OnValueChanged(this)</OnValueChanged>
</Scripts>
</Slider>
<Slider name="HealBot_Options_BarMaxRowsS" inherits="HealBot_Options_SliderTemplate">
<Size>
<AbsDimension x="123" y="17" />
</Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_AbortBarSize" relativePoint="TOPRIGHT">
<Offset>
<AbsDimension x="10" y="0" />
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_val_OnLoad(this,"Max Rows",0,40)</OnLoad>
<OnValueChanged>HealBot_Options_BarMaxRowsS_OnValueChanged(this)</OnValueChanged>
</Scripts>
</Slider>
<CheckButton name="HealBot_Options_GridOrientation" inherits="OptionsCheckButtonTemplate">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_BarMaxRowsS" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="-5" y="-10" />
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>
getglobal(this:GetName().."Text"):SetText("Horizontal Grid");
</OnLoad>
<OnClick>
HealBot_Options_GridOrientation_OnClick(this);
</OnClick>
</Scripts>
</CheckButton>
<Button name="HealBot_EnTextColorpickb"> <Button name="HealBot_EnTextColorpickb">
<Size> <Size>
<AbsDimension x="87" y="20"/> <AbsDimension x="87" y="20"/>
+1 -1
View File
@@ -62,7 +62,7 @@ end
function HealBot_Options_TooltipPos_Refresh(onselect) function HealBot_Options_TooltipPos_Refresh(onselect)
if not HealBot_Config.TooltipPos then return end if not HealBot_Config.TooltipPos then return end
if not onselect then HealBot_Options_TooltipPos_Initialize() end -- or wrong menu may be used ! if not onselect then HealBot_Options_TooltipPos_Initialize() end -- or wrong menu may be used !
UIDropDownMenu_SetSelectedID(HealBot_Options_TooltipPos,HealBot_Config.TooltipPos) HealBot_UIDropDownMenu_SetSelectedID(HealBot_Options_TooltipPos,HealBot_Config.TooltipPos)
end end
function HealBot_Options_TooltipPos_OnLoad() function HealBot_Options_TooltipPos_OnLoad()
+253 -48
View File
@@ -70,13 +70,13 @@ function HealBot_HealthColor(unit, hlth, maxhlth)
end end
local colorMode = HealBot_Config.bcolormode[HealBot_Config.Current_Skin] or 1 local colorMode = HealBot_Config.bcolormode[HealBot_Config.Current_Skin] or 1
if colorMode == 2 and HealBot_Model and HealBot_Model.units[unit] and HealBot_Model.units[unit].englishClass then if colorMode == 2 and HealBot_Model and HealBot_Model.units[unit] and HealBot_Model.units[unit].englishClass and RAID_CLASS_COLORS and RAID_CLASS_COLORS[HealBot_Model.units[unit].englishClass] then
local engClass = HealBot_Model.units[unit].englishClass local engClass = HealBot_Model.units[unit].englishClass
if RAID_CLASS_COLORS and RAID_CLASS_COLORS[engClass] then r = RAID_CLASS_COLORS[engClass].r
r = RAID_CLASS_COLORS[engClass].r g = RAID_CLASS_COLORS[engClass].g
g = RAID_CLASS_COLORS[engClass].g b = RAID_CLASS_COLORS[engClass].b
b = RAID_CLASS_COLORS[engClass].b elseif colorMode == 2 and string.find(unit, "pet") then
end r, g, b = 0.4, 0.9, 0.6 -- Mint color
else else
if pct >= 0.98 then r = 0.0; end if pct >= 0.98 then r = 0.0; end
if pct < 0.98 and pct >= 0.65 then r = 2.94 - (pct * 3); end if pct < 0.98 and pct >= 0.65 then r = 2.94 - (pct * 3); end
@@ -87,13 +87,17 @@ function HealBot_HealthColor(unit, hlth, maxhlth)
end end
function HealBot_Action_HealthBar(button) function HealBot_Action_HealthBar(button)
local name = button:GetName(); if not button.bar then
return getglobal(name .. "Bar"); button.bar = getglobal(button:GetName() .. "Bar")
end
return button.bar;
end end
function HealBot_Action_HealthBar2(button) function HealBot_Action_HealthBar2(button)
local name = button:GetName(); if not button.bar2 then
return getglobal(name .. "Bar2"); button.bar2 = getglobal(button:GetName() .. "Bar2")
end
return button.bar2;
end end
function HealBot_Action_EnableButton(button) function HealBot_Action_EnableButton(button)
@@ -108,7 +112,8 @@ function HealBot_Action_EnableButton(button)
local bar = HealBot_Action_HealthBar(button); local bar = HealBot_Action_HealthBar(button);
local bar2 = HealBot_Action_HealthBar2(button); local bar2 = HealBot_Action_HealthBar2(button);
local bar3 = getglobal(button:GetName() .. "Bar3"); if not button.bar3 then button.bar3 = getglobal(button:GetName() .. "Bar3") end
local bar3 = button.bar3;
local btexture = HealBot_Config.btexture[HealBot_Config.Current_Skin]; local btexture = HealBot_Config.btexture[HealBot_Config.Current_Skin];
local bheight = HealBot_Config.bheight[HealBot_Config.Current_Skin]; local bheight = HealBot_Config.bheight[HealBot_Config.Current_Skin];
local sr = HealBot_Config.btextenabledcolr[HealBot_Config.Current_Skin]; local sr = HealBot_Config.btextenabledcolr[HealBot_Config.Current_Skin];
@@ -132,16 +137,25 @@ function HealBot_Action_EnableButton(button)
local pt = state.powerType local pt = state.powerType
local showMana = false local showMana = false
if HealBot_Config.ShowManaBars == 1 and state.maxMana > 0 and pt == 0 then local pr, pg, pb = 0, 0, 1 -- Default Blue for Mana
if HealBot_Config.ManaBarsHealersOnly == 1 then
if isHealer then showMana = true end if HealBot_Config.ShowManaBars == 1 and state.maxMana > 0 then
else 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 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
end end
if showMana then if showMana then
local pr, pg, pb = 0, 0, 1
if bar3 then if bar3 then
bar3:SetMinMaxValues(0, state.maxMana) bar3:SetMinMaxValues(0, state.maxMana)
bar3:SetValue(state.mana) bar3:SetValue(state.mana)
@@ -166,7 +180,7 @@ function HealBot_Action_EnableButton(button)
else else
bar2:SetValue(0); bar2:SetValue(0);
end end
bar.txt = getglobal(bar:GetName() .. "_text"); if not bar.txt then bar.txt = getglobal(bar:GetName() .. "_text") end
if (not HealBot_IsCasting and (HealBot_CanHeal(unit) or HealBot_MissingBuffs[unit])) then if (not HealBot_IsCasting and (HealBot_CanHeal(unit) or HealBot_MissingBuffs[unit])) then
button:Enable(); button:Enable();
if HealBot_UnitDebuff[unit] then if HealBot_UnitDebuff[unit] then
@@ -193,10 +207,36 @@ function HealBot_Action_EnableButton(button)
bar:SetStatusBarColor(r, g, b, HealBot_Config.bardisa[HealBot_Config.Current_Skin]); bar:SetStatusBarColor(r, g, b, HealBot_Config.bardisa[HealBot_Config.Current_Skin]);
bar2:SetStatusBarColor(r, g, b, HealBot_Config.bardisa[HealBot_Config.Current_Skin]); bar2:SetStatusBarColor(r, g, b, HealBot_Config.bardisa[HealBot_Config.Current_Skin]);
end end
if string.len(name) > textlen then local healthTextOpt = HealBot_Config.ShowHealthText or 0
name = string.sub(name, 1, textlen - 3) .. '...'; 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 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); bar.txt:SetTextColor(sr, sg, sb, sa);
local fontName, fontHeight, fontFlags = bar.txt:GetFont() local fontName, fontHeight, fontFlags = bar.txt:GetFont()
local fontOutline = HealBot_Config.bfontoutline[HealBot_Config.Current_Skin] or 0 local fontOutline = HealBot_Config.bfontoutline[HealBot_Config.Current_Skin] or 0
@@ -220,9 +260,9 @@ function HealBot_Action_EnableButton(button)
end end
function HealBot_Action_EnableButtons() function HealBot_Action_EnableButtons()
table.foreach(HealBot_Action_HealButtons, function (index, button) for index, button in pairs(HealBot_Action_HealButtons) do
HealBot_Action_EnableButton(button); HealBot_Action_EnableButton(button)
end); end
end end
function HealBot_Action_RefreshButton(button) function HealBot_Action_RefreshButton(button)
@@ -250,13 +290,13 @@ end
function HealBot_Action_RefreshButtons(unit) function HealBot_Action_RefreshButtons(unit)
if unit and HealBot_Action_UnitButtons[unit] then if unit and HealBot_Action_UnitButtons[unit] then
table.foreach(HealBot_Action_UnitButtons[unit], function (index, button) for index, button in pairs(HealBot_Action_UnitButtons[unit]) do
HealBot_Action_RefreshButton(button); HealBot_Action_RefreshButton(button)
end); end
else else
table.foreach(HealBot_Action_HealButtons, function (index, button) for index, button in pairs(HealBot_Action_HealButtons) do
HealBot_Action_RefreshButton(button); HealBot_Action_RefreshButton(button)
end); end
end end
end end
@@ -295,6 +335,41 @@ function HealBot_Action_PositionButton(button, OsetX, OsetY, bwidth, bheight, ch
return OsetY; return OsetY;
end end
function HealBot_Action_PositionButtonHorizontal(button, OsetX, OsetY, bwidth, bheight, checked, header)
local bcspace = HealBot_Config.bcspace[HealBot_Config.Current_Skin] or 3;
if header then
headerno = headerno + 1;
local headerobj = getglobal("HealBot_Action_Header" .. headerno);
headerobj:SetText(header)
headerobj:Show();
headerobj:ClearAllPoints();
headerobj:SetHeight(bheight);
headerobj:SetWidth(bwidth);
headerobj:SetPoint("TOPLEFT", "HealBot_Action", "TOPLEFT", OsetX, -OsetY);
headerobj:Disable();
OsetX = OsetX + bwidth + bcspace;
else
local unit = button.unit;
button:SetText(" ");
if (HealBot_MayHeal(unit)) then
button:Show();
button:ClearAllPoints();
button:SetHeight(bheight);
if checked then
button:SetWidth(bwidth - 14);
button:SetPoint("TOPLEFT", "HealBot_Action", "TOPLEFT", OsetX + 14, -OsetY);
else
button:SetWidth(bwidth);
button:SetPoint("TOPLEFT", "HealBot_Action", "TOPLEFT", OsetX, -OsetY);
end
OsetX = OsetX + bwidth + bcspace;
else
button:Hide();
end
end
return OsetX;
end
function HealBot_Action_SetHeightWidth(width, height, bwidth) function HealBot_Action_SetHeightWidth(width, height, bwidth)
if HealBot_ActionHeight then if HealBot_ActionHeight then
HealBot_Action:SetHeight(HealBot_ActionHeight); HealBot_Action:SetHeight(HealBot_ActionHeight);
@@ -345,6 +420,31 @@ function HealBot_Action_PartyChanged()
local TempMaxH = 0; local TempMaxH = 0;
local HeaderPos = {}; local HeaderPos = {};
if HealBot_Config.AutoSwap_Enabled == 1 then
local totalMembers = GetNumRaidMembers()
if totalMembers == 0 then totalMembers = GetNumPartyMembers() end
local threshold = 1
if totalMembers == 0 then
threshold = 1 -- Solo
elseif totalMembers > 0 and totalMembers <= 5 then
threshold = 2 -- Party
elseif totalMembers > 5 and totalMembers <= 15 then
threshold = 3 -- Raid15
elseif totalMembers > 15 and totalMembers <= 25 then
threshold = 4 -- Raid25
else
threshold = 5 -- Raid40
end
if not HealBot_Config.AutoSwap_Profiles then HealBot_Config.AutoSwap_Profiles = {} end
local swapSkin = HealBot_Config.AutoSwap_Profiles[threshold]
if swapSkin and swapSkin ~= HealBot_Config.Current_Skin then
HealBot_Config.Current_Skin = swapSkin
HealBot_Options_SetSkins()
end
end
for j = 1, 15 do for j = 1, 15 do
local headerobj = getglobal("HealBot_Action_Header" .. j); local headerobj = getglobal("HealBot_Action_Header" .. j);
headerobj:SetText(" ") headerobj:SetText(" ")
@@ -495,7 +595,7 @@ function HealBot_Action_PartyChanged()
numBars = numBars + 1; numBars = numBars + 1;
numHeaders = numHeaders + 1; numHeaders = numHeaders + 1;
end end
if HealBot_Config.EmergIncMonitor == 1 then if HealBot_Config.EmergIncMonitor == 2 then
if GetNumRaidMembers() > 0 then if GetNumRaidMembers() > 0 then
for j = 1, 40 do for j = 1, 40 do
local PossibleEmerg = 1; local PossibleEmerg = 1;
@@ -543,6 +643,50 @@ function HealBot_Action_PartyChanged()
end end
end 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 else
if GetNumRaidMembers() > 0 then if GetNumRaidMembers() > 0 then
for j = 1, 40 do for j = 1, 40 do
@@ -606,10 +750,26 @@ function HealBot_Action_PartyChanged()
local TempSort = "init" local TempSort = "init"
TempMaxH = math.ceil(TempMaxH / 1000) * 1000; TempMaxH = math.ceil(TempMaxH / 1000) * 1000;
if GetNumRaidMembers() > 0 then if GetNumRaidMembers() > 0 or HealBot_Config.EmergIncMonitor == 12 then
for j = 1, 40 do for j = 1, 40 do
if not units[j] then break end 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 if HealBot_Config.ShowHeader[HealBot_Config.Current_Skin] == 1 and HealBot_Config.ExtraOrder == 2 and TempSort ~= class then
TempSort = class TempSort = class
HeaderPos[i + 1] = class HeaderPos[i + 1] = class
@@ -643,8 +803,12 @@ function HealBot_Action_PartyChanged()
local OffsetY = bpadding; local OffsetY = bpadding;
local OffsetX = bpadding; local OffsetX = bpadding;
local MaxOffsetY = 0; local MaxOffsetY = 0;
local MaxOffsetX = 0;
if cols > (numBars - numHeaders) then local maxRows = (HealBot_Config.bmaxrows and HealBot_Config.bmaxrows[HealBot_Config.Current_Skin]) or 0
local orientation = (HealBot_Config.GridOrientation and HealBot_Config.GridOrientation[HealBot_Config.Current_Skin]) or 1
if cols > (numBars - numHeaders) and maxRows == 0 then
cols = numBars - numHeaders; cols = numBars - numHeaders;
end end
if cols <= 0 then cols = 1 end if cols <= 0 then cols = 1 end
@@ -652,33 +816,64 @@ function HealBot_Action_PartyChanged()
local h = 1; local h = 1;
local i = 0; local i = 0;
local z = 1; local z = 1;
local brspace = HealBot_Config.brspace[HealBot_Config.Current_Skin] or 3;
local bcspace = HealBot_Config.bcspace[HealBot_Config.Current_Skin] or 3;
table.foreach(HealBot_Action_HealButtons, function (index, button) local limit = math.ceil((numBars) / cols)
if orientation == 1 and maxRows > 0 then
limit = maxRows
elseif orientation == 2 then
limit = cols
end
for index, button in pairs(HealBot_Action_HealButtons) do
i = i + 1; i = i + 1;
local checked = false; local checked = false;
local header; local header;
if HeaderPos[i] then if HeaderPos[i] then
header = HeaderPos[i]; header = HeaderPos[i];
OffsetY = HealBot_Action_PositionButton(nil, OffsetX, OffsetY, bwidth, bheight, checked, header); if orientation == 1 then
if h == math.ceil((numBars) / cols) and z < numBars then OffsetY = HealBot_Action_PositionButton(nil, OffsetX, OffsetY, bwidth, bheight, checked, header);
h = 0; if h == limit and z < numBars then
if MaxOffsetY < OffsetY then MaxOffsetY = OffsetY; end h = 0;
OffsetY = bpadding; if MaxOffsetY < OffsetY then MaxOffsetY = OffsetY; end
OffsetX = OffsetX + bwidth + bcspace; OffsetY = bpadding;
OffsetX = OffsetX + bwidth + bcspace;
end
else
OffsetX = HealBot_Action_PositionButtonHorizontal(nil, OffsetX, OffsetY, bwidth, bheight, checked, header);
if h == limit and z < numBars then
h = 0;
if MaxOffsetX < OffsetX then MaxOffsetX = OffsetX; end
OffsetX = bpadding;
OffsetY = OffsetY + bheight + brspace;
end
end end
h = h + 1; h = h + 1;
z = z + 1; z = z + 1;
end end
if checked_start <= i and checked_end >= i then checked = true; end if checked_start <= i and checked_end >= i then checked = true; end
OffsetY = HealBot_Action_PositionButton(button, OffsetX, OffsetY, bwidth, bheight, checked, nil);
if h == math.ceil((numBars) / cols) and z < numBars then if orientation == 1 then
h = 0; OffsetY = HealBot_Action_PositionButton(button, OffsetX, OffsetY, bwidth, bheight, checked, nil);
if MaxOffsetY < OffsetY then MaxOffsetY = OffsetY; end if h == limit and z < numBars then
OffsetY = bpadding; h = 0;
OffsetX = OffsetX + bwidth + bcspace; if MaxOffsetY < OffsetY then MaxOffsetY = OffsetY; end
OffsetY = bpadding;
OffsetX = OffsetX + bwidth + bcspace;
end
else
OffsetX = HealBot_Action_PositionButtonHorizontal(button, OffsetX, OffsetY, bwidth, bheight, checked, nil);
if h == limit and z < numBars then
h = 0;
if MaxOffsetX < OffsetX then MaxOffsetX = OffsetX; end
OffsetX = bpadding;
OffsetY = OffsetY + bheight + brspace;
end
end end
z = z + 1; z = z + 1;
h = h + 1; h = h + 1;
local bar = HealBot_Action_HealthBar(button); local bar = HealBot_Action_HealthBar(button);
@@ -692,9 +887,19 @@ function HealBot_Action_PartyChanged()
bar:SetScale(barScale); bar:SetScale(barScale);
bar2:SetHeight(bheight); bar2:SetHeight(bheight);
HealBot_Action_SetTexture(bar2, btexture); HealBot_Action_SetTexture(bar2, btexture);
end); end
if MaxOffsetY < OffsetY then MaxOffsetY = OffsetY; end if orientation == 1 then
if MaxOffsetY < OffsetY then MaxOffsetY = OffsetY; end
else
if MaxOffsetX < OffsetX then MaxOffsetX = OffsetX; end
-- In horizontal mode, OffsetY represents the active row. We need to measure total height.
MaxOffsetY = OffsetY + bheight + brspace
OffsetX = MaxOffsetX
if numBars > 0 then
OffsetX = OffsetX - bwidth - bcspace
end
end
if HealBot_Config.HideOptions == 1 then if HealBot_Config.HideOptions == 1 then
HealBot_Action_OptionsButton:Hide(); HealBot_Action_OptionsButton:Hide();
+30 -10
View File
@@ -3,6 +3,16 @@
HealBot_Action_TooltipUnit = nil HealBot_Action_TooltipUnit = nil
function HealBot_Tooltip_GetSpellColor(spell)
local r, g, b = 1, 1, 0 -- default yellow
if spell and HealBot_Spells and HealBot_Spells[spell] and HealBot_Spells[spell].Mana then
if UnitMana("player") < HealBot_Spells[spell].Mana then
r, g, b = 1, 0, 0 -- red if not enough mana
end
end
return r, g, b
end
function HealBot_Action_RefreshTooltip(unit) function HealBot_Action_RefreshTooltip(unit)
if HealBot_Config.ShowTooltip==0 then return end if HealBot_Config.ShowTooltip==0 then return end
if not unit then unit = HealBot_Action_TooltipUnit end if not unit then unit = HealBot_Action_TooltipUnit end
@@ -33,53 +43,63 @@ function HealBot_Action_RefreshTooltip(unit)
if HealBot_Config.Tooltip_ShowSpellDetail==1 then if HealBot_Config.Tooltip_ShowSpellDetail==1 then
if spellLeft then if spellLeft then
linenum=linenum+2 linenum=linenum+2
HealBot_Action_Tooltip_SetLineLeft(HEALBOT_OPTIONS_BUTTONLEFT.." "..HEALBOT_OPTIONS_COMBOBUTTON..": "..spellLeft,1,1,0,linenum) local sr, sg, sb = HealBot_Tooltip_GetSpellColor(spellLeft)
HealBot_Action_Tooltip_SetLineLeft(HEALBOT_OPTIONS_BUTTONLEFT.." "..HEALBOT_OPTIONS_COMBOBUTTON..": "..spellLeft,sr,sg,sb,linenum)
linenum=HealBot_Action_Tooltip_SpellInfo(spellLeft,linenum); linenum=HealBot_Action_Tooltip_SpellInfo(spellLeft,linenum);
end end
if spellMiddle then if spellMiddle then
linenum=linenum+2 linenum=linenum+2
HealBot_Action_Tooltip_SetLineLeft(HEALBOT_OPTIONS_BUTTONMIDDLE.." "..HEALBOT_OPTIONS_COMBOBUTTON..": "..spellMiddle,1,1,0,linenum) local sr, sg, sb = HealBot_Tooltip_GetSpellColor(spellMiddle)
HealBot_Action_Tooltip_SetLineLeft(HEALBOT_OPTIONS_BUTTONMIDDLE.." "..HEALBOT_OPTIONS_COMBOBUTTON..": "..spellMiddle,sr,sg,sb,linenum)
linenum=HealBot_Action_Tooltip_SpellInfo(spellMiddle,linenum); linenum=HealBot_Action_Tooltip_SpellInfo(spellMiddle,linenum);
end end
if spellRight then if spellRight then
linenum=linenum+2 linenum=linenum+2
HealBot_Action_Tooltip_SetLineLeft(HEALBOT_OPTIONS_BUTTONRIGHT.." "..HEALBOT_OPTIONS_COMBOBUTTON..": "..spellRight,1,1,0,linenum) local sr, sg, sb = HealBot_Tooltip_GetSpellColor(spellRight)
HealBot_Action_Tooltip_SetLineLeft(HEALBOT_OPTIONS_BUTTONRIGHT.." "..HEALBOT_OPTIONS_COMBOBUTTON..": "..spellRight,sr,sg,sb,linenum)
linenum=HealBot_Action_Tooltip_SpellInfo(spellRight,linenum); linenum=HealBot_Action_Tooltip_SpellInfo(spellRight,linenum);
end end
if spellButton4 then if spellButton4 then
linenum=linenum+2 linenum=linenum+2
HealBot_Action_Tooltip_SetLineLeft(HEALBOT_OPTIONS_BUTTON4.." "..HEALBOT_OPTIONS_COMBOBUTTON..": "..spellButton4,1,1,0,linenum) local sr, sg, sb = HealBot_Tooltip_GetSpellColor(spellButton4)
HealBot_Action_Tooltip_SetLineLeft(HEALBOT_OPTIONS_BUTTON4.." "..HEALBOT_OPTIONS_COMBOBUTTON..": "..spellButton4,sr,sg,sb,linenum)
linenum=HealBot_Action_Tooltip_SpellInfo(spellButton4,linenum); linenum=HealBot_Action_Tooltip_SpellInfo(spellButton4,linenum);
end end
if spellButton5 then if spellButton5 then
linenum=linenum+2 linenum=linenum+2
HealBot_Action_Tooltip_SetLineLeft(HEALBOT_OPTIONS_BUTTON5.." "..HEALBOT_OPTIONS_COMBOBUTTON..": "..spellButton5,1,1,0,linenum) local sr, sg, sb = HealBot_Tooltip_GetSpellColor(spellButton5)
HealBot_Action_Tooltip_SetLineLeft(HEALBOT_OPTIONS_BUTTON5.." "..HEALBOT_OPTIONS_COMBOBUTTON..": "..spellButton5,sr,sg,sb,linenum)
linenum=HealBot_Action_Tooltip_SpellInfo(spellButton5,linenum); linenum=HealBot_Action_Tooltip_SpellInfo(spellButton5,linenum);
end end
else else
if spellLeft then if spellLeft then
linenum=linenum+1 linenum=linenum+1
HealBot_Action_Tooltip_SetLineLeft(HEALBOT_OPTIONS_BUTTONLEFT..":",1,1,0,linenum) local sr, sg, sb = HealBot_Tooltip_GetSpellColor(spellLeft)
HealBot_Action_Tooltip_SetLineLeft(HEALBOT_OPTIONS_BUTTONLEFT..":",sr,sg,sb,linenum)
HealBot_Action_Tooltip_SetLineRight(HealBot_Action_Tooltip_SpellSummary(spellLeft),1,1,1,linenum) HealBot_Action_Tooltip_SetLineRight(HealBot_Action_Tooltip_SpellSummary(spellLeft),1,1,1,linenum)
end end
if spellMiddle then if spellMiddle then
linenum=linenum+1 linenum=linenum+1
HealBot_Action_Tooltip_SetLineLeft(HEALBOT_OPTIONS_BUTTONMIDDLE..":",1,1,0,linenum) local sr, sg, sb = HealBot_Tooltip_GetSpellColor(spellMiddle)
HealBot_Action_Tooltip_SetLineLeft(HEALBOT_OPTIONS_BUTTONMIDDLE..":",sr,sg,sb,linenum)
HealBot_Action_Tooltip_SetLineRight(HealBot_Action_Tooltip_SpellSummary(spellMiddle),1,1,1,linenum) HealBot_Action_Tooltip_SetLineRight(HealBot_Action_Tooltip_SpellSummary(spellMiddle),1,1,1,linenum)
end end
if spellRight then if spellRight then
linenum=linenum+1 linenum=linenum+1
HealBot_Action_Tooltip_SetLineLeft(HEALBOT_OPTIONS_BUTTONRIGHT..":",1,1,0,linenum) local sr, sg, sb = HealBot_Tooltip_GetSpellColor(spellRight)
HealBot_Action_Tooltip_SetLineLeft(HEALBOT_OPTIONS_BUTTONRIGHT..":",sr,sg,sb,linenum)
HealBot_Action_Tooltip_SetLineRight(HealBot_Action_Tooltip_SpellSummary(spellRight),1,1,1,linenum) HealBot_Action_Tooltip_SetLineRight(HealBot_Action_Tooltip_SpellSummary(spellRight),1,1,1,linenum)
end end
if spellButton4 then if spellButton4 then
linenum=linenum+1 linenum=linenum+1
HealBot_Action_Tooltip_SetLineLeft(HEALBOT_OPTIONS_BUTTON4..":",1,1,0,linenum) local sr, sg, sb = HealBot_Tooltip_GetSpellColor(spellButton4)
HealBot_Action_Tooltip_SetLineLeft(HEALBOT_OPTIONS_BUTTON4..":",sr,sg,sb,linenum)
HealBot_Action_Tooltip_SetLineRight(HealBot_Action_Tooltip_SpellSummary(spellButton4),1,1,1,linenum) HealBot_Action_Tooltip_SetLineRight(HealBot_Action_Tooltip_SpellSummary(spellButton4),1,1,1,linenum)
end end
if spellButton5 then if spellButton5 then
linenum=linenum+1 linenum=linenum+1
HealBot_Action_Tooltip_SetLineLeft(HEALBOT_OPTIONS_BUTTON5..":",1,1,0,linenum) local sr, sg, sb = HealBot_Tooltip_GetSpellColor(spellButton5)
HealBot_Action_Tooltip_SetLineLeft(HEALBOT_OPTIONS_BUTTON5..":",sr,sg,sb,linenum)
HealBot_Action_Tooltip_SetLineRight(HealBot_Action_Tooltip_SpellSummary(spellButton5),1,1,1,linenum) HealBot_Action_Tooltip_SetLineRight(HealBot_Action_Tooltip_SpellSummary(spellButton5),1,1,1,linenum)
end end
end end
+68 -4
View File
@@ -1,10 +1,11 @@
**HealBotBlue** **HealBotBlue**
By Bluewhale. By Bluewhale.
> **NOTE:** For HealBot to work correctly, the **Selfcast** feature in WoW options needs to be disabled.
Original HealBot, while being a staple healing addon in Wrath and later expansions, was in its infancy during Vanilla WoW. It was a memory and CPU hog that ate up resources, featured a clunky UI, and offered limited functions. To fix all of the above while still using it as a base framework, I refactored the entire codebase. The monolithic code structure was split to follow a more modern approach (MVC design pattern), making it more stable and easily editable. Additionally, the inefficient AURA scanning was replaced with lightweight (Observer Pattern) reactive programming. It now updates only what is necessary when a trigger fires, rather than performing clumsy, continuous scans of a 40-man raid. By doing so, I managed to throttle down CPU and memory usage significantly, placing it on par with modern addons. Additional functionalities are being added over time to provide a holistic, healer-centered raid frame. Original HealBot, while being a staple healing addon in Wrath and later expansions, was in its infancy during Vanilla WoW. It was a memory and CPU hog that ate up resources, featured a clunky UI, and offered limited functions. To fix all of the above while still using it as a base framework, I refactored the entire codebase. The monolithic code structure was split to follow a more modern approach (MVC design pattern), making it more stable and easily editable. Additionally, the inefficient AURA scanning was replaced with lightweight (Observer Pattern) reactive programming. It now updates only what is necessary when a trigger fires, rather than performing clumsy, continuous scans of a 40-man raid. By doing so, I managed to throttle down CPU and memory usage significantly, placing it on par with modern addons. Additional functionalities are being added over time to provide a holistic, healer-centered raid frame.
> **Performance First:** The raidframe is not library reliant - unlike popular raidframe replacement addons it doesn't rely at all on external frameworks. While this makes my work a bit harder this allows complete control over garbage collection and CPU use which makes it multiple times more stable and lightweight.
> **NOTE:** For HealBot to work correctly, the **Selfcast** feature in WoW options needs to be disabled.
### Reporting Errors ### Reporting Errors
Major errors will pop up a frame with error information. Take a screenshot and post comments. Major errors will pop up a frame with error information. Take a screenshot and post comments.
@@ -19,17 +20,80 @@ Default installation path: `C:\Program Files\World of Warcraft\Interface\AddOns\
* `/hb reset` - Resets the contents of the main HealBot panel * `/hb reset` - Resets the contents of the main HealBot panel
### Key Features & Current Functionality ### Key Features & Current Functionality
* **MVC & Observer Architecture:** High-performance, reactive engine that updates frames dynamically on state changes, drastically reducing CPU and memory overhead compared to traditional polling. * **MVC & Observer Architecture:** High-performance, reactive engine that updates frames dynamically on state changes, drastically reducing CPU and memory overhead. Features memory recycling pool and event loop decoupling for zero-stutter combat.
* **Native Hovercasting (Mouseover):** Cast configured spells on hovered unit frames using keybinds directly from your action bars, without losing your current target. (Toggleable in Options -> General). * **Native Hovercasting (Mouseover):** Cast configured spells on hovered unit frames using keybinds directly from your action bars, without losing your current target. (Toggleable in Options -> General).
* **Macro, Item, & Script Bindings:** Bind named macros, inventory items, and scripts directly to mouse clicks. Supports implicit `@mouseover` targeting natively.
* **Zero-Latency Self-Heals:** Incoming heals for the local player process instantly with zero latency, independent of network lag.
* **Talent-Based Calculations & Equipment Bonus:** Dynamic spell healing calculations for Druid, Priest, and Paladin based on talents, and automatically scans equipped gear to scale healing predictions - currently only TurtleWoW patch 1.18 supported.
* **Modifier-Aware Tooltips:** Tooltips dynamically update to show exact bound actions (Shift/Ctrl/Alt) and required mana costs (turns red if insufficient mana).
* **Blizzard Party Frame Toggle:** Toggle to automatically hide Blizzard's default party frames when in a group in favor of HealBot's layouts. * **Blizzard Party Frame Toggle:** Toggle to automatically hide Blizzard's default party frames when in a group in favor of HealBot's layouts.
* **HoT & Buff Tracking:** Intelligently track active HoTs and buffs directly on the grid frames with custom icons (e.g., Renew, Rejuvenation, Regrowth, Fear Ward). * **HoT & Buff Tracking:** Intelligently track active HoTs and buffs directly on the grid frames with custom icons (e.g., Renew, Rejuvenation, Regrowth, Fear Ward).
* **Mana Bars for Healers:** Enable and position mini-mana status bars next to unit frames, toggleable to display for healer classes only or all classes. * **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). * **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. * **Highly Customizable Skins:** Fully configure dimensions (width, height), row spacing, column layouts, custom textures, opacity, class-colored frames, and outline of fonts.
### To be implemented
- **GUID-based frame mapping:** Migrate internal state to use lightweight GUID tracking to resolve bugs when targets switch or duplicate names appear (e.g., enemy mobs, warlock pets).
- **Mod Integration Optimization:** Add conditional SuperWoW/UnitXP SP3 integration to reduce GC spikes and improve frame rendering accuracy.
### Known issues
* **New spell rank bug** you may experience lua error spaming your chat frame after learning new healing spells. /reload will clear the issue.
### Change Log ### Change Log
**v1.6.1**
* **Hotfix** - With class colours toggled extra frames for player pets were given some classy mint colour.
**v1.6**
* **Event Loop Decoupling:** Ripped out redundant synchronous UI redraws that were bypassed by the new MVC architecture. High-frequency events (mana regen, health ticks) now fully rely on the `HealBot_OnUpdate` dirty queue, severely reducing CPU bottlenecks.
* **Combat UI Optimizations:** Removed unnecessary full spell recalculations when dropping combat, preventing client stutter after every mob kill.
* **Memory Optimization:** Fixed severe Lua garbage collection spikes during UI reloads by preventing full party layout rebuilds on `PLAYER_TARGET_CHANGED`, and cached dynamic string concatenations directly to unit frames to eliminate memory leakage on high frequency UI refreshes.
* **Mana Validation Fix:** Removed artificial spell mana gating, fixing an issue where low-mana spells disappeared from tooltips and couldn't be cast. WoW's native mana validation now correctly processes 0-cost buffs (e.g. Clearcasting, Inner Focus) while turning low-mana tooltip spells red.
* **Self-Buff Tracking:** Fixed a bug where "Self Only" buff tracking incorrectly excluded the player when represented by party or raid frames instead of the standard "player" unit ID.
* **Settings Persistence Fix:** Changed `SavedVariables` to `SavedVariablesPerCharacter` in TOC so configurations correctly load unique per character instead of account-wide.
* **CPU Optimization:** Added early exit logic to resource tracking events (Mana, Rage, Energy) to stop background polling on party/raid members when "Show Mana Bars" is toggled off. Also removed excessive triggers (`BAG_UPDATE`, `PET_BAR_SHOWGRID`) and filtered `UNIT_INVENTORY_CHANGED` to only process the player, eliminating massive CPU spikes and unnecessary UI layout rebuilds during looting, item cooldowns, or when other players change gear.
* **OnUpdate GC Spike Fix:** Rewrote the modifier polling logic inside `HealBot_OnUpdate` to use boolean state tracking instead of dynamic string concatenation, eliminating a major source of garbage collection bloat while hovering over unit frames.
* **Aura Scanning Optimization:** Refactored Debuff tracking (`HealBot_DebuffWatch`) to use native boolean values (`true`/`false`) instead of string comparisons (`"YES"`/`"NO"`). This improves performance inside the continuous aura scanning loops.
**v1.5**
* **Macro, Item, and Script Bindings:** Support for binding named macros, inventory items, and inline scripts (e.g. `/target`) directly to mouse clicks in the Spells tab. All of these now natively support implicit `@mouseover` targeting on the unit frame you click, without losing your current target.
* **Modifier-Aware Tooltips & Resource Costs:** The tooltip dynamically updates to show exactly what action is bound when holding down Shift, Ctrl, or Alt over a frame. Spells also show their required mana cost, turning red if you do not have enough mana to cast them.
* **Memory Recycling Pool:** Added a local table recycling pool in the data layer to greatly reduce Lua garbage collection (GC) spikes, improving overall client frame rates during intense combat.
**v1.4.2**
* **Memory Optimization:** Fixed a significant memory leak where tracking tables were being repeatedly allocated every tick during aura scanning, and replaced `table.foreach` with pairs loops to avoid GC spikes during combat.
**v1.4.1**
* **Talent-based Healing Calculations:** Implemented dynamic spell healing calculations for Druid, Priest, and Paladin classes based on talents.
* **Modifier Key Polling:** Replaced MODIFIER_STATE_CHANGED event with polling in HealBot_OnUpdate to track modifier keys reliably.
* **Incoming Heals Fix:** Fixed a bug where incoming heals failed to broadcast or show on the UI due to synchronous GCD fails and `CheckInteractDistance` limitations in the 1.12 API.
* **Hovercast Incoming Heals:** Added full support for processing and displaying incoming heals when using action bar hovercasting.
* **Zero-latency Self-Heals:** Incoming heals for the local player now process instantly with zero latency and no network reliance, ensuring they function even when playing solo.
**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").
* **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**
* **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.
* **Chat Layout Stack:** Restructured the Chat Options XML layout to correctly stack the inputs into neat rows, preventing horizontal overlap and providing more space for typing long announce messages.
* **UI Persistence Bug Fixes:** Fixed a Vanilla WoW API quirk where unchecking the "Show Headers" or "Self Only" (Buffs) checkboxes caused the UI to either visually re-check itself or overwrite the setting with defaults upon a `/reload`.
**1.3.2**
* **UIDropDownMenu Fixes:** Resolved native client crash (`UIDROPDOWNMENU_OPEN_MENU` nil concatenation) when setting values on closed dropdowns.
**1.3.1** **1.3.1**
* **Hotfix: missing helper function restored** Fixed issue with lua error for druids. * **Hotfix: missing helper function restored** Fixed issue with lua error for druids.