89 Commits

Author SHA1 Message Date
Bluewhale1337 a0b6e2f72d refactor: simplify CDC monitor and emergency filter logic by updating configuration indices and cleaning up unused data structures 2026-09-07 23:45:46 +02:00
Bluewhale1337 2af99cbc2b Update HealBotBlue.toc
Updated #Notes section of .toc file

Signed-off-by: Bluewhale1337 <295648290+Bluewhale1337@users.noreply.github.com>
2026-09-06 19:58:39 +02:00
Bluewhale1337 b0195b30b9 Merge pull request #16 from Bluewhale1337/dev
Dev
2026-09-05 18:43:27 +02:00
Bluewhale1337 2aaa53a9e6 Merge branch 'main' into dev
Signed-off-by: Bluewhale1337 <295648290+Bluewhale1337@users.noreply.github.com>
2026-09-05 18:38:26 +02:00
Bluewhale1337 b64e7070ba Feature: add raid mark display to unit frames
Fix: resolve CDC configuration and color rendering issues
2026-09-05 17:08:58 +02:00
Bluewhale1337 6760e4e43d fix: optimize shapeshift auto-unshift logic by improving cast event handling, reducing spam intervals, and extending state timeout durations 2026-09-02 18:56:05 +02:00
Bluewhale1337 16bc4d95ee refactor: implement reliable shapeshift unshifting with a queued cast system and Nampower integration settings 2026-09-01 18:55:47 +02:00
Bluewhale1337 59ceb3b465 feature: implemented delayed spell casting logic to handle auto-unshift requirements for Druid forms 2026-09-01 11:03:11 +02:00
Bluewhale1337 e05238a5b2 Fix: Removed current form caching as druid to prevent being locked into current form - now querries form on each spellcast via API. Another attempt to resolve CDC colouring issues. 2026-09-01 09:10:38 +02:00
Bluewhale1337 d2642745cb refactor: simplify UnitDebuff parameters and consolidate debuff tracking logic into a single loop 2026-08-30 15:43:03 +02:00
Bluewhale1337 8026e14cde feat: add CDC module toggle to track all debuffs and fix minor aura and casting bug regressions 2026-08-29 11:34:41 +02:00
Bluewhale1337 377c2c31d0 fix: add missing closing StatusBar tag to HealBot_Action XML layout 2026-08-27 22:19:02 +02:00
Bluewhale1337 998a64a83f fix: resolve CDC debuff filtering logic and reorder XML status bar layering for correct visual rendering 2026-08-26 22:01:31 +02:00
Bluewhale1337 cf05b94611 Fix : re-implement automatic class-specific debuff tracking defaults in HealBot_Options_Debuff_Reset 2026-08-25 19:49:20 +02:00
Bluewhale1337 5aab23314a feat: implement automatic default debuff tracking based on player class in HealBot_Options_Debuff_Reset 2026-08-25 17:54:18 +02:00
Bluewhale1337 36fad01424 docs: update 2026-08-25 17:01:56 +02:00
Bluewhale1337 bcd566d80b fix: move icon tracking logic before condition checks to ensure icons are captured correctly 2026-08-25 16:24:55 +02:00
Bluewhale1337 553a5ece36 docs: add release notes for v1.6.4 and v1.6.5 2026-08-25 10:24:23 +02:00
Bluewhale1337 60ef3bc41f Hotfix: replace party recalculation with button refresh and add safety checks to debuff spell configuration - rewerting accidental deletion 2026-08-25 10:23:46 +02:00
Bluewhale1337 50661ac924 Reverted previous class check on debuffs - only dispellable by players class will be displayed + certain mechanical debuffs like debuff from PW:S 2026-08-24 18:25:04 +02:00
Bluewhale1337 9c1f873b48 Fix: removed legacy full ui teardowns of ui on refresh functions with button-specific updates, add CDC toggle logic, and update documentation for mod integrations 2026-08-24 12:52:44 +02:00
Bluewhale1337 6d977f6963 docs: add function-level documentation comments across various source files to improve the readability of codebase 2026-08-24 12:42:23 +02:00
Bluewhale1337 d09e49d26a docs: update 2026-08-24 11:15:33 +02:00
Bluewhale1337 9a033a1045 docs: update changelog with additional addon integrations for SuperWoW and ClassicAPI 2026-08-23 15:24:14 +02:00
Bluewhale1337 6a6a9e3283 Hotfix: implement fast-path update pipeline to optimize mana tracking performance, skipping unnecessary ui re-draws 2026-08-23 15:22:57 +02:00
Bluewhale1337 b3c2b4a096 fix: resolve UI rendering crashes, address unit frame aliasing bugs, and implement automatic debuff tracking with lazy-load identity fetches. 2026-08-22 17:18:48 +02:00
Bluewhale1337 d0e027ec12 added ClassicAPI integration for enhanced distance checking, healing bonuses, and Focus unit support - overrides some functionality of other integrations 2026-08-18 18:11:54 +02:00
Bluewhale1337 dc2f0ca089 Implemented modular external addon integration system for UnitXP, Nampower, and SuperWoW support. 2026-08-17 23:33:20 +02:00
Bluewhale1337 d021441b32 hotfix: resolve UI layering and debuff coloring issues, and update version to 1.6.4 2026-08-17 22:29:53 +02:00
Bluewhale1337 58f593947e Features implementation - added integration support for UnitXP and nampower, expand Options UI. 2026-08-17 20:26:09 +02:00
Bluewhale1337 99997b711a Merge pull request #14 from Bluewhale1337/dev
Dev
2026-08-16 21:33:23 +02:00
Bluewhale1337 496013ae9c Merge branch 'dev' of https://github.com/Bluewhale1337/HealBotBlue into dev 2026-08-09 12:11:57 +02:00
Bluewhale1337 f7443fcdf0 feat: increase icon limit to 10, add customizable icon size, and remove obsolete code 2026-08-09 12:11:29 +02:00
Bluewhale1337 a0d435eb70 Merge pull request #13 from Bluewhale1337/main
Merging minor changes from main to dev to sync up
2026-08-09 10:13:08 +02:00
Bluewhale1337 048970d1b7 chore: bump version to 1.6.3 and add string splitter fallback to changelog 2026-08-07 14:45:18 +02:00
Bluewhale1337 d5dec0f1f0 fix: handle empty or missing delimiters in HealBot_SplitString to prevent errors 2026-08-07 14:43:18 +02:00
Bluewhale1337 ad302f299e Merge pull request #12 from Bluewhale1337/dev
Dev merge
2026-08-05 22:26:36 +02:00
Bluewhale1337 327cd7a08c fix: refine weapon enchant tooltip detection to use the first word of the spell name 2026-08-05 22:25:02 +02:00
Bluewhale1337 2f01ca3f1b feat: improve shaman weapon buff detection by validating specific enchant names via tooltip scanning 2026-08-05 22:18:40 +02:00
Bluewhale1337 45ce2a024f feat: split Raid and Pet toggles and simplify raid bars filter options 2026-08-05 22:02:53 +02:00
Bluewhale1337 2ab7a93a6e Refactor + rewrite: implement independent pet heal toggles and integrate into layout rendering and emergency monitoring logic 2026-08-05 21:53:41 +02:00
Bluewhale1337 7cf0956a84 refactor: remove talent documentation and implement unit filtering logic to exclude group members from raid monitoring when enabled 2026-07-30 18:34:43 +02:00
Bluewhale1337 6c4297c126 Update README.md
info about dev branch adses
2026-07-30 15:40:18 +02:00
Bluewhale1337 4f7a06ad6f Merge pull request #11 from Bluewhale1337/dev
Merge hotfixes to main
2026-07-26 14:11:10 +02:00
Bluewhale1337 178d1184a3 docs: add Talents.md 2026-07-26 13:59:23 +02:00
Bluewhale1337 f1b7e3950f chore: bump version to 1.6.2 in TOC file 2026-07-26 13:48:35 +02:00
Bluewhale1337 faf040997e feat: refactor spell tooltip scanning and update version to 1.6.2 2026-07-24 20:22:49 +02:00
Bluewhale1337 4c9f50770a fix: remove redundant end statement in layout refresh function 2026-07-22 11:19:21 +02:00
Bluewhale1337 ed11046eda Cleaning up some leftovers 2026-07-22 09:55:17 +02:00
Bluewhale1337 d36ad994ea feat: add support for dynamic unit appending during combat and improve layout handling 2026-07-22 09:20:22 +02:00
Bluewhale1337 a3f3d9e4c6 feat: expand unit capacity to 100 buttons and add RAID_ROSTER_UPDATE event handling 2026-07-21 22:46:14 +02:00
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 66172cab45 refactor: replace MODIFIER_STATE_CHANGED event with polling in HealBot_OnUpdate to track modifier keys 2026-07-12 00:37:25 +02:00
37 changed files with 2676 additions and 558 deletions
+37 -3
View File
@@ -15,6 +15,7 @@ HealBot_Delay_RecalcParty=0;
-- Debugging and Error functions moved to HealBot_Controller_Comms.lua -- Debugging and Error functions moved to HealBot_Controller_Comms.lua
-- HealBot_TogglePanel: Toggles visibility of a frame panel.
function HealBot_TogglePanel(panel) function HealBot_TogglePanel(panel)
if (not panel) then return end if (not panel) then return end
if ( panel:IsVisible() ) then if ( panel:IsVisible() ) then
@@ -24,6 +25,7 @@ function HealBot_TogglePanel(panel)
end end
end end
-- HealBot_StartMoving: Initiates frame dragging when unlocked.
function HealBot_StartMoving(frame) function HealBot_StartMoving(frame)
if ( not frame.isMoving ) and ( frame.isLocked ~= 1 ) then if ( not frame.isMoving ) and ( frame.isLocked ~= 1 ) then
frame:StartMoving(); frame:StartMoving();
@@ -31,6 +33,7 @@ function HealBot_StartMoving(frame)
end end
end end
-- HealBot_StopMoving: Stops frame dragging.
function HealBot_StopMoving(frame) function HealBot_StopMoving(frame)
if ( frame.isMoving ) then if ( frame.isMoving ) then
frame:StopMovingOrSizing(); frame:StopMovingOrSizing();
@@ -47,6 +50,7 @@ function HealBot_StopMoving(frame)
end end
-- HealBot_SlashCmd: Handles '/hb' or '/healbot' chat commands.
function HealBot_SlashCmd(cmd) function HealBot_SlashCmd(cmd)
if (cmd=="") then if (cmd=="") then
HealBot_TogglePanel(HealBot_Action); HealBot_TogglePanel(HealBot_Action);
@@ -103,6 +107,7 @@ end
-- HealBot_SendAddonMessage moved to HealBot_Controller_Comms.lua -- HealBot_SendAddonMessage moved to HealBot_Controller_Comms.lua
-- HealBot_TargetName: Retrieves the name of the current target, ignoring enemies.
function HealBot_TargetName() function HealBot_TargetName()
if UnitIsEnemy("target","player") then return nil end if UnitIsEnemy("target","player") then return nil end
-- if not UnitPlayerControlled("target") then return nil end -- if not UnitPlayerControlled("target") then return nil end
@@ -136,14 +141,17 @@ end
-- HealBot_PackBagSlot: Combines bag and slot into a single ID.
function HealBot_PackBagSlot(bag,slot) function HealBot_PackBagSlot(bag,slot)
return bag*100+slot; return bag*100+slot;
end end
-- HealBot_UnpackBagSlot: Extracts bag and slot from a combined ID.
function HealBot_UnpackBagSlot(bagslot) function HealBot_UnpackBagSlot(bagslot)
return math.floor(bagslot/100),math.mod(bagslot,100); return math.floor(bagslot/100),math.mod(bagslot,100);
end end
-- HealBot_GetItemName: Gets item name from bag slot link.
function HealBot_GetItemName(bag,slot) function HealBot_GetItemName(bag,slot)
local link = GetContainerItemLink(bag,slot); local link = GetContainerItemLink(bag,slot);
if not link then return nil end; if not link then return nil end;
@@ -152,6 +160,7 @@ function HealBot_GetItemName(bag,slot)
return item,count; return item,count;
end end
-- HealBot_GetBagSlot: Finds bag slot ID for an item name.
function HealBot_GetBagSlot(item) function HealBot_GetBagSlot(item)
local BagSlot,BestCount; local BagSlot,BestCount;
for bag=0,NUM_BAG_FRAMES do for bag=0,NUM_BAG_FRAMES do
@@ -168,6 +177,7 @@ function HealBot_GetBagSlot(item)
return BagSlot; return BagSlot;
end end
-- HealBot_UseItem: Uses an item from inventory.
function HealBot_UseItem(item) function HealBot_UseItem(item)
local bagslot = HealBot_GetBagSlot(item); local bagslot = HealBot_GetBagSlot(item);
if not bagslot then return end; if not bagslot then return end;
@@ -178,9 +188,24 @@ end
-- Spell parsing and casting functions moved to HealBot_Controller_Spells.lua -- Spell parsing and casting functions moved to HealBot_Controller_Spells.lua
-- HealBot_UnitClass: Returns English class string for a unit.
function HealBot_UnitClass(unit) function HealBot_UnitClass(unit)
local playerClass, englishClass = UnitClass(unit); local locClass, enClass = UnitClass(unit)
return englishClass; if enClass then return string.upper(enClass) end
-- Fallback for Vanilla 1.12 where enClass is nil
if locClass == HEALBOT_DRUID then return "DRUID"
elseif locClass == HEALBOT_HUNTER then return "HUNTER"
elseif locClass == HEALBOT_MAGE then return "MAGE"
elseif locClass == HEALBOT_PALADIN then return "PALADIN"
elseif locClass == HEALBOT_PRIEST then return "PRIEST"
elseif locClass == HEALBOT_ROGUE then return "ROGUE"
elseif locClass == HEALBOT_SHAMAN then return "SHAMAN"
elseif locClass == HEALBOT_WARLOCK then return "WARLOCK"
elseif locClass == HEALBOT_WARRIOR then return "WARRIOR"
end
return locClass
end end
---- HealBot_UnitAffected moved to HealBot_Controller_Aura.lua ---- HealBot_UnitAffected moved to HealBot_Controller_Aura.lua
@@ -197,6 +222,7 @@ end
-- SpiBonus and GetBonus functions moved to HealBot_Controller_Spells.lua -- SpiBonus and GetBonus functions moved to HealBot_Controller_Spells.lua
-- HealBot_FindUnitID: Finds a unit token for a given player name.
function HealBot_FindUnitID(unitname) function HealBot_FindUnitID(unitname)
local text; local text;
for _,unit in ipairs(HealBot_Action_HealGroup) do for _,unit in ipairs(HealBot_Action_HealGroup) do
@@ -219,6 +245,7 @@ function HealBot_FindUnitID(unitname)
return nil; return nil;
end end
-- HealBot_PlaySound: Plays an audio alert based on ID.
function HealBot_PlaySound(id) function HealBot_PlaySound(id)
if id==1 then if id==1 then
PlaySoundFile("Sound\\Doodad\\BellTollTribal.wav"); PlaySoundFile("Sound\\Doodad\\BellTollTribal.wav");
@@ -231,6 +258,7 @@ end
-- HealBot_InitSpells moved to HealBot_Controller_Spells.lua -- HealBot_InitSpells moved to HealBot_Controller_Spells.lua
-- HealBot_InitData: Registers options and basic setup on variables loaded.
function HealBot_InitData() function HealBot_InitData()
HealBot_Skins = HealBot_Config.Skins; HealBot_Skins = HealBot_Config.Skins;
if(CT_RegisterMod) then if(CT_RegisterMod) then
@@ -246,6 +274,7 @@ function HealBot_InitData()
HealBot_Options_Debuff_Reset() HealBot_Options_Debuff_Reset()
end end
-- HealBot_ToggleOptions: Toggles the main options menu.
function HealBot_ToggleOptions() function HealBot_ToggleOptions()
HealBot_TogglePanel(HealBot_Options) HealBot_TogglePanel(HealBot_Options)
end end
@@ -262,6 +291,7 @@ end
do do
local pass = function() end local pass = function() end
local orig = UseAction local orig = UseAction
-- UseAction: Intercepts standard clicks for mouseover support.
function UseAction(slot, checkCursor, onSelf) function UseAction(slot, checkCursor, onSelf)
if HealBot_Config.ActionMouseover == 1 then if HealBot_Config.ActionMouseover == 1 then
local mouseover = HealBot_Action_TooltipUnit local mouseover = HealBot_Action_TooltipUnit
@@ -284,12 +314,16 @@ do
spellName = HealBot_ScanTooltipTextLeft1 and HealBot_ScanTooltipTextLeft1:GetText() spellName = HealBot_ScanTooltipTextLeft1 and HealBot_ScanTooltipTextLeft1:GetText()
end 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 HealBot_AnnounceCast then if spellName and not HealBot_CastFailed then
HealBot_CastingSpell = spellName
HealBot_CastingTarget = mouseover
HealBot_Process_HealValue(spellName, mouseover)
HealBot_AnnounceCast(spellName, mouseover) HealBot_AnnounceCast(spellName, mouseover)
end end
end end
+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>
+6 -3
View File
@@ -1,15 +1,16 @@
## Interface: 11200 ## Interface: 11200
## Title: HealBotBlue ## Title: HealBotBlue
## Version: 1.4.0 ## Version: 1.7.0
## Author: Bluewhale ## Author: Bluewhale
## Notes: Adds panel with skinable bars for healing and decursive ## Notes: Raidframe replacement for healing, decursing, resource tracking and buffing with optional support for SuperWow, ClassicAPI, UnitXP_SP3 and Nampower.
## SavedVariables: HealBot_Config ## SavedVariablesPerCharacter: HealBot_Config
..\..\FrameXML\Fonts.xml ..\..\FrameXML\Fonts.xml
..\..\FrameXML\OptionsFrameTemplates.xml ..\..\FrameXML\OptionsFrameTemplates.xml
..\..\FrameXML\UIPanelTemplates.xml ..\..\FrameXML\UIPanelTemplates.xml
..\..\FrameXML\UIDropDownMenu.xml ..\..\FrameXML\UIDropDownMenu.xml
HealBot_Error.xml HealBot_Error.xml
HealBot_Model.lua HealBot_Model.lua
HealBot_Integrations.lua
HealBot_Controller_Range.lua HealBot_Controller_Range.lua
HealBot_Controller_Comms.lua HealBot_Controller_Comms.lua
HealBot_Controller_Aura.lua HealBot_Controller_Aura.lua
@@ -27,3 +28,5 @@ 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
HealBot_Options_Integrations.xml
+169 -14
View File
@@ -1,9 +1,11 @@
-- Status bar layout functions and tables moved to HealBot_View_Layout.lua -- Status bar layout functions and tables moved to HealBot_View_Layout.lua
-- HealBot_AlwaysHeal: Returns true if healthy units should be shown.
function HealBot_AlwaysHeal() function HealBot_AlwaysHeal()
return HealBot_Config.EnableHealthy==1 return HealBot_Config.EnableHealthy==1
end end
-- HealBot_MayHeal: Checks if unit is eligible for healing UI.
function HealBot_MayHeal(unit) function HealBot_MayHeal(unit)
if not UnitName(unit) or not HealBot_Heals[unit] then return false end if not UnitName(unit) or not HealBot_Heals[unit] then return false end
if unit ~= 'target' then return true end if unit ~= 'target' then return true end
@@ -11,6 +13,7 @@ function HealBot_MayHeal(unit)
return true; return true;
end end
-- HealBot_ShouldHeal: Checks if unit needs immediate healing.
function HealBot_ShouldHeal(unit) function HealBot_ShouldHeal(unit)
if HealBot_UnitDebuff[unit] and not UnitIsDeadOrGhost(unit) then if HealBot_UnitDebuff[unit] and not UnitIsDeadOrGhost(unit) then
if HealBot_Range_Check(unit, 30)==1 then if HealBot_Range_Check(unit, 30)==1 then
@@ -21,22 +24,26 @@ function HealBot_ShouldHeal(unit)
and (UnitHealth(unit)<UnitHealthMax(unit)*HealBot_Config.AlertLevel or HealBot_AlwaysHeal()); and (UnitHealth(unit)<UnitHealthMax(unit)*HealBot_Config.AlertLevel or HealBot_AlwaysHeal());
end end
-- HealBot_Action_ShouldHealSome: Alias for checking if any unit needs healing.
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
-- HealBot_MustHeal: Internal utility: HealBot_MustHeal
function HealBot_MustHeal(unit) function HealBot_MustHeal(unit)
return HealBot_ShouldHeal(unit) and UnitHealth(unit)<UnitHealthMax(unit)*HealBot_Config.AlertLevel return HealBot_ShouldHeal(unit) and UnitHealth(unit)<UnitHealthMax(unit)*HealBot_Config.AlertLevel
end end
-- HealBot_Action_MustHealSome: Checks if emergency healing is required.
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
-- HealBot_GetRezSpellForClass: Internal utility: HealBot_GetRezSpellForClass
function HealBot_GetRezSpellForClass() function HealBot_GetRezSpellForClass()
local _, class = UnitClass("player"); local _, class = UnitClass("player");
if class == "PRIEST" then return HEALBOT_RESURRECTION; if class == "PRIEST" then return HEALBOT_RESURRECTION;
@@ -47,6 +54,7 @@ function HealBot_GetRezSpellForClass()
return nil; return nil;
end end
-- HealBot_CanHeal: Internal utility: HealBot_CanHeal
function HealBot_CanHeal(unit) function HealBot_CanHeal(unit)
if UnitIsDeadOrGhost(unit) then if UnitIsDeadOrGhost(unit) then
local rezSpell = HealBot_GetRezSpellForClass(); local rezSpell = HealBot_GetRezSpellForClass();
@@ -76,6 +84,7 @@ end
-- Refresh and reset functions moved to HealBot_View_Layout.lua -- Refresh and reset functions moved to HealBot_View_Layout.lua
-- HealBot_Action_SpellPattern: Resolves spell string based on click modifiers.
function HealBot_Action_SpellPattern(button) function HealBot_Action_SpellPattern(button)
local combos = HealBot_Config.KeyCombo[UnitClass("player")] local combos = HealBot_Config.KeyCombo[UnitClass("player")]
if not combos then return nil end if not combos then return nil end
@@ -86,6 +95,7 @@ function HealBot_Action_SpellPattern(button)
return combos[press] return combos[press]
end end
-- HealBot_Decode_Button: Decodes click action to spell pattern.
function HealBot_Decode_Button(button) function HealBot_Decode_Button(button)
if button=="RightButton" then if button=="RightButton" then
button="Right"; button="Right";
@@ -105,36 +115,106 @@ end
-- Widget_OnFoo functions -- Widget_OnFoo functions
-------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------
-- HealBot_Action_HealUnit_OnLoad: Internal utility: HealBot_Action_HealUnit_OnLoad
function HealBot_Action_HealUnit_OnLoad(this) function HealBot_Action_HealUnit_OnLoad(this)
this:RegisterForClicks("LeftButtonUp", "RightButtonUp", "MiddleButtonUp", "Button4Up", "Button5Up"); this:RegisterForClicks("LeftButtonUp", "RightButtonUp", "MiddleButtonUp", "Button4Up", "Button5Up");
end end
-- HealBot_Action_HealUnit_OnEnter: Internal utility: HealBot_Action_HealUnit_OnEnter
function HealBot_Action_HealUnit_OnEnter(this) function HealBot_Action_HealUnit_OnEnter(this)
HealBot_Action_ShowTooltip(this); HealBot_Action_ShowTooltip(this);
end end
-- HealBot_Action_HealUnit_OnLeave: Internal utility: HealBot_Action_HealUnit_OnLeave
function HealBot_Action_HealUnit_OnLeave(this) function HealBot_Action_HealUnit_OnLeave(this)
HealBot_Action_HideTooltip(this); HealBot_Action_HideTooltip(this);
end end
--------------------------------------------------------------------------------------------------
-- Puppeteer Utility Ports for Macro and Item Execution
--------------------------------------------------------------------------------------------------
-- HealBot_SplitString: Internal utility: HealBot_SplitString
function HealBot_SplitString(str, delimiter)
local result = {}
if not delimiter or delimiter == "" then
return {str}
end
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
-- HealBot_RunMacroText: Internal utility: HealBot_RunMacroText
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
-- HealBot_RunMacro: Internal utility: HealBot_RunMacro
function HealBot_RunMacro(name)
if GetMacroIndexByName(name) == 0 then return end
local _, _, body = GetMacroInfo(GetMacroIndexByName(name))
HealBot_RunMacroText(body)
end
-- HealBot_GetBagSlotInfo: Internal utility: HealBot_GetBagSlotInfo
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
-- HealBot_FindBagSlot: Internal utility: HealBot_FindBagSlot
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
-- HealBot_UseItem: Uses an item from inventory.
function HealBot_UseItem(itemName)
local bag, slot = HealBot_FindBagSlot(itemName)
if not bag then return false end
UseContainerItem(bag, slot)
return true
end
-- HealBot_Action_HealUnit_OnClick: Click event handler.
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
if UnitIsDeadOrGhost(this.unit) then
local rezSpell = HealBot_GetRezSpellForClass();
if rezSpell then
HealBot_CastSpellOnFriend(rezSpell, this.unit);
return
end
end
-- Buff casting override -- Buff casting override (Spells only)
if HealBot_Config.BuffWatch == 1 then if HealBot_Config.BuffWatch == 1 then
local inCombat = UnitAffectingCombat("player") local inCombat = UnitAffectingCombat("player")
if (not inCombat) or (HealBot_Config.BuffWatchInCombat == 1) then if (not inCombat) or (HealBot_Config.BuffWatchInCombat == 1) then
local myClass = UnitClass("player")
if HealBot_MissingBuffs[this.unit] then if HealBot_MissingBuffs[this.unit] then
local missingBuff = HealBot_MissingBuffs[this.unit] local missingBuff = HealBot_MissingBuffs[this.unit]
if decode_button == "Left" or decode_button == "Right" then if decode_button == "Left" or decode_button == "Right" then
@@ -145,9 +225,72 @@ function HealBot_Action_HealUnit_OnClick(this,button)
end end
end end
-- Special cases for targeting
if string.lower(pattern) == "target" or string.lower(pattern) == "/target" then
TargetUnit(this.unit)
return
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
local rezSpell = HealBot_GetRezSpellForClass();
if rezSpell then
HealBot_CastSpellOnFriend(rezSpell, this.unit);
return
end
end
if HealBot_Spells[pattern] or HealBot_GetSpellId(pattern) then
HealBot_HealUnit(this.unit, pattern);
return
end
-- Priority 3: Named Macros
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); HealBot_HealUnit(this.unit, pattern);
end end
-- HealBot_Action_HealUnitCheck_OnClick: Click event handler.
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
if this:GetChecked() then if this:GetChecked() then
@@ -163,20 +306,24 @@ function HealBot_Action_HealUnitCheck_OnClick(this)
HealBot_Action_PartyChanged(); HealBot_Action_PartyChanged();
end end
-- HealBot_Action_OptionsButton_OnClick: Click event handler.
function HealBot_Action_OptionsButton_OnClick(this) function HealBot_Action_OptionsButton_OnClick(this)
HealBot_TogglePanel(HealBot_Options); HealBot_TogglePanel(HealBot_Options);
end end
-- HealBot_Action_AbortButton_OnClick: Click event handler.
function HealBot_Action_AbortButton_OnClick(this) function HealBot_Action_AbortButton_OnClick(this)
SpellStopCasting(); SpellStopCasting();
end end
local HealBot_CT_RA_UpdateMTs_Old; local HealBot_CT_RA_UpdateMTs_Old;
-- HealBot_CT_RA_UpdateMTs: Internal utility: HealBot_CT_RA_UpdateMTs
function HealBot_CT_RA_UpdateMTs() function HealBot_CT_RA_UpdateMTs()
local value = HealBot_CT_RA_UpdateMTs_Old(); local value = HealBot_CT_RA_UpdateMTs_Old();
return value; return value;
end end
-- HealBot_CT_RaidAssist_DEAD: Internal utility: HealBot_CT_RaidAssist_DEAD
function HealBot_CT_RaidAssist_DEAD() function HealBot_CT_RaidAssist_DEAD()
-- if (type(CT_RA_MemberFrame_OnClick)=="function") then -- if (type(CT_RA_MemberFrame_OnClick)=="function") then
-- HealBot_CT_RA_CustomOnClickFunction_Old = CT_RA_CustomOnClickFunction; -- HealBot_CT_RA_CustomOnClickFunction_Old = CT_RA_CustomOnClickFunction;
@@ -192,10 +339,12 @@ end
-- Frame_OnFoo functions -- Frame_OnFoo functions
-------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------
-- HealBot_Action_OnLoad: Internal utility: HealBot_Action_OnLoad
function HealBot_Action_OnLoad(this) function HealBot_Action_OnLoad(this)
-- HealBot_CT_RaidAssist(); -- HealBot_CT_RaidAssist();
end end
-- HealBot_Action_OnShow: Show event handler.
function HealBot_Action_OnShow(this) function HealBot_Action_OnShow(this)
if HealBot_Config.PanelSounds==1 then if HealBot_Config.PanelSounds==1 then
PlaySound("igAbilityOpen"); PlaySound("igAbilityOpen");
@@ -236,6 +385,7 @@ function HealBot_Action_OnShow(this)
HealBot_Config.backcola[HealBot_Config.Current_Skin]); HealBot_Config.backcola[HealBot_Config.Current_Skin]);
end end
-- HealBot_Action_OnHide: Hide event handler.
function HealBot_Action_OnHide(this) function HealBot_Action_OnHide(this)
HealBot_StopMoving(this); HealBot_StopMoving(this);
if not this.ProgrammaticHide then if not this.ProgrammaticHide then
@@ -243,6 +393,7 @@ function HealBot_Action_OnHide(this)
end end
end end
-- HealBot_Action_OnMouseDown: Internal utility: HealBot_Action_OnMouseDown
function HealBot_Action_OnMouseDown(this,button) function HealBot_Action_OnMouseDown(this,button)
if button~="RightButton" then if button~="RightButton" then
if HealBot_Config.ActionLocked==0 then if HealBot_Config.ActionLocked==0 then
@@ -251,6 +402,7 @@ function HealBot_Action_OnMouseDown(this,button)
end end
end end
-- HealBot_Action_OnMouseUp: Internal utility: HealBot_Action_OnMouseUp
function HealBot_Action_OnMouseUp(this,button) function HealBot_Action_OnMouseUp(this,button)
if button~="RightButton" then if button~="RightButton" then
HealBot_StopMoving(this); HealBot_StopMoving(this);
@@ -259,16 +411,19 @@ function HealBot_Action_OnMouseUp(this,button)
end end
end end
-- HealBot_Action_OnClick: Handles click events on heal buttons.
function HealBot_Action_OnClick(this,button) function HealBot_Action_OnClick(this,button)
-- HealBot_Action_AddDebug("OnClick("..button..")"); -- HealBot_Action_AddDebug("OnClick("..button..")");
end end
-- HealBot_Action_OnDragStart: Internal utility: HealBot_Action_OnDragStart
function HealBot_Action_OnDragStart(this,button) function HealBot_Action_OnDragStart(this,button)
if HealBot_Config.ActionLocked==0 then if HealBot_Config.ActionLocked==0 then
HealBot_StartMoving(this); HealBot_StartMoving(this);
end end
end end
-- HealBot_Action_OnDragStop: Internal utility: HealBot_Action_OnDragStop
function HealBot_Action_OnDragStop(this) function HealBot_Action_OnDragStop(this)
HealBot_StopMoving(this); HealBot_StopMoving(this);
end end
+110 -13
View File
@@ -18,6 +18,20 @@
<OnClick>HealBot_Action_HealUnit_OnClick(this,arg1);</OnClick> <OnClick>HealBot_Action_HealUnit_OnClick(this,arg1);</OnClick>
</Scripts> </Scripts>
<Frames> <Frames>
<StatusBar name="$parentBar2" inherits="HealBot_StatusBar">
<Anchors>
<Anchor point="TOPLEFT" relativePoint="TOPLEFT">
<Offset>
<AbsDimension x="0" y="0"/>
</Offset>
</Anchor>
<Anchor point="TOPRIGHT" relativePoint="TOPRIGHT">
<Offset>
<AbsDimension x="0" y="0"/>
</Offset>
</Anchor>
</Anchors>
</StatusBar>
<StatusBar name="$parentBar" inherits="HealBot_StatusBar"> <StatusBar name="$parentBar" inherits="HealBot_StatusBar">
<Anchors> <Anchors>
<Anchor point="TOPLEFT" relativePoint="TOPLEFT"> <Anchor point="TOPLEFT" relativePoint="TOPLEFT">
@@ -33,6 +47,14 @@
</Anchors> </Anchors>
<Layers> <Layers>
<Layer level="OVERLAY"> <Layer level="OVERLAY">
<Texture name="$parentRaidIcon" file="Interface\TargetingFrame\UI-RaidTargetingIcons" hidden="true">
<Size><AbsDimension x="14" y="14"/></Size>
<Anchors>
<Anchor point="CENTER">
<Offset><AbsDimension x="0" y="0"/></Offset>
</Anchor>
</Anchors>
</Texture>
<Texture name="$parentIcon1" hidden="true"> <Texture name="$parentIcon1" hidden="true">
<Size><AbsDimension x="12" y="12"/></Size> <Size><AbsDimension x="12" y="12"/></Size>
<Anchors> <Anchors>
@@ -73,22 +95,48 @@
</Anchor> </Anchor>
</Anchors> </Anchors>
</Texture> </Texture>
</Layer> <Texture name="$parentIcon6" hidden="true">
</Layers> <Size><AbsDimension x="12" y="12"/></Size>
</StatusBar>
<StatusBar name="$parentBar2" inherits="HealBot_StatusBar">
<Anchors> <Anchors>
<Anchor point="TOPLEFT" relativePoint="TOPLEFT"> <Anchor point="LEFT" relativeTo="$parentIcon5" relativePoint="RIGHT">
<Offset> <Offset><AbsDimension x="1" y="0"/></Offset>
<AbsDimension x="0" y="0"/>
</Offset>
</Anchor>
<Anchor point="TOPRIGHT" relativePoint="TOPRIGHT">
<Offset>
<AbsDimension x="0" y="0"/>
</Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
</Texture>
<Texture name="$parentIcon7" hidden="true">
<Size><AbsDimension x="12" y="12"/></Size>
<Anchors>
<Anchor point="LEFT" relativeTo="$parentIcon6" relativePoint="RIGHT">
<Offset><AbsDimension x="1" y="0"/></Offset>
</Anchor>
</Anchors>
</Texture>
<Texture name="$parentIcon8" hidden="true">
<Size><AbsDimension x="12" y="12"/></Size>
<Anchors>
<Anchor point="LEFT" relativeTo="$parentIcon7" relativePoint="RIGHT">
<Offset><AbsDimension x="1" y="0"/></Offset>
</Anchor>
</Anchors>
</Texture>
<Texture name="$parentIcon9" hidden="true">
<Size><AbsDimension x="12" y="12"/></Size>
<Anchors>
<Anchor point="LEFT" relativeTo="$parentIcon8" relativePoint="RIGHT">
<Offset><AbsDimension x="1" y="0"/></Offset>
</Anchor>
</Anchors>
</Texture>
<Texture name="$parentIcon10" hidden="true">
<Size><AbsDimension x="12" y="12"/></Size>
<Anchors>
<Anchor point="LEFT" relativeTo="$parentIcon9" relativePoint="RIGHT">
<Offset><AbsDimension x="1" y="0"/></Offset>
</Anchor>
</Anchors>
</Texture>
</Layer>
</Layers>
</StatusBar> </StatusBar>
<StatusBar name="$parentBar3" inherits="HealBot_StatusBar" hidden="true"> <StatusBar name="$parentBar3" inherits="HealBot_StatusBar" hidden="true">
<Anchors> <Anchors>
@@ -232,6 +280,15 @@
<Button name="HealBot_Action_HealUnit39" inherits="HealingButtonTemplate" text="Unit not set"/> <Button name="HealBot_Action_HealUnit39" inherits="HealingButtonTemplate" text="Unit not set"/>
<Button name="HealBot_Action_HealUnit40" inherits="HealingButtonTemplate" text="Unit not set"/> <Button name="HealBot_Action_HealUnit40" inherits="HealingButtonTemplate" text="Unit not set"/>
<Button name="HealBot_Action_HealUnit41" inherits="HealingButtonTemplate" text="Unit not set"/> <Button name="HealBot_Action_HealUnit41" inherits="HealingButtonTemplate" text="Unit not set"/>
<Button name="HealBot_Action_HealUnit42" inherits="HealingButtonTemplate" text="Unit not set"/>
<Button name="HealBot_Action_HealUnit43" inherits="HealingButtonTemplate" text="Unit not set"/>
<Button name="HealBot_Action_HealUnit44" inherits="HealingButtonTemplate" text="Unit not set"/>
<Button name="HealBot_Action_HealUnit45" inherits="HealingButtonTemplate" text="Unit not set"/>
<Button name="HealBot_Action_HealUnit46" inherits="HealingButtonTemplate" text="Unit not set"/>
<Button name="HealBot_Action_HealUnit47" inherits="HealingButtonTemplate" text="Unit not set"/>
<Button name="HealBot_Action_HealUnit48" inherits="HealingButtonTemplate" text="Unit not set"/>
<Button name="HealBot_Action_HealUnit49" inherits="HealingButtonTemplate" text="Unit not set"/>
<Button name="HealBot_Action_HealUnit50" inherits="HealingButtonTemplate" text="Unit not set"/>
<Button name="HealBot_Action_HealUnit51" inherits="HealingButtonTemplate2" text="Unit not set"/> <Button name="HealBot_Action_HealUnit51" inherits="HealingButtonTemplate2" text="Unit not set"/>
<Button name="HealBot_Action_HealUnit52" inherits="HealingButtonTemplate2" text="Unit not set"/> <Button name="HealBot_Action_HealUnit52" inherits="HealingButtonTemplate2" text="Unit not set"/>
@@ -243,6 +300,46 @@
<Button name="HealBot_Action_HealUnit58" inherits="HealingButtonTemplate2" text="Unit not set"/> <Button name="HealBot_Action_HealUnit58" inherits="HealingButtonTemplate2" text="Unit not set"/>
<Button name="HealBot_Action_HealUnit59" inherits="HealingButtonTemplate2" text="Unit not set"/> <Button name="HealBot_Action_HealUnit59" inherits="HealingButtonTemplate2" text="Unit not set"/>
<Button name="HealBot_Action_HealUnit60" inherits="HealingButtonTemplate2" text="Unit not set"/> <Button name="HealBot_Action_HealUnit60" inherits="HealingButtonTemplate2" text="Unit not set"/>
<Button name="HealBot_Action_HealUnit61" inherits="HealingButtonTemplate2" text="Unit not set"/>
<Button name="HealBot_Action_HealUnit62" inherits="HealingButtonTemplate2" text="Unit not set"/>
<Button name="HealBot_Action_HealUnit63" inherits="HealingButtonTemplate2" text="Unit not set"/>
<Button name="HealBot_Action_HealUnit64" inherits="HealingButtonTemplate2" text="Unit not set"/>
<Button name="HealBot_Action_HealUnit65" inherits="HealingButtonTemplate2" text="Unit not set"/>
<Button name="HealBot_Action_HealUnit66" inherits="HealingButtonTemplate2" text="Unit not set"/>
<Button name="HealBot_Action_HealUnit67" inherits="HealingButtonTemplate2" text="Unit not set"/>
<Button name="HealBot_Action_HealUnit68" inherits="HealingButtonTemplate2" text="Unit not set"/>
<Button name="HealBot_Action_HealUnit69" inherits="HealingButtonTemplate2" text="Unit not set"/>
<Button name="HealBot_Action_HealUnit70" inherits="HealingButtonTemplate2" text="Unit not set"/>
<Button name="HealBot_Action_HealUnit71" inherits="HealingButtonTemplate2" text="Unit not set"/>
<Button name="HealBot_Action_HealUnit72" inherits="HealingButtonTemplate2" text="Unit not set"/>
<Button name="HealBot_Action_HealUnit73" inherits="HealingButtonTemplate2" text="Unit not set"/>
<Button name="HealBot_Action_HealUnit74" inherits="HealingButtonTemplate2" text="Unit not set"/>
<Button name="HealBot_Action_HealUnit75" inherits="HealingButtonTemplate2" text="Unit not set"/>
<Button name="HealBot_Action_HealUnit76" inherits="HealingButtonTemplate2" text="Unit not set"/>
<Button name="HealBot_Action_HealUnit77" inherits="HealingButtonTemplate2" text="Unit not set"/>
<Button name="HealBot_Action_HealUnit78" inherits="HealingButtonTemplate2" text="Unit not set"/>
<Button name="HealBot_Action_HealUnit79" inherits="HealingButtonTemplate2" text="Unit not set"/>
<Button name="HealBot_Action_HealUnit80" inherits="HealingButtonTemplate2" text="Unit not set"/>
<Button name="HealBot_Action_HealUnit81" inherits="HealingButtonTemplate2" text="Unit not set"/>
<Button name="HealBot_Action_HealUnit82" inherits="HealingButtonTemplate2" text="Unit not set"/>
<Button name="HealBot_Action_HealUnit83" inherits="HealingButtonTemplate2" text="Unit not set"/>
<Button name="HealBot_Action_HealUnit84" inherits="HealingButtonTemplate2" text="Unit not set"/>
<Button name="HealBot_Action_HealUnit85" inherits="HealingButtonTemplate2" text="Unit not set"/>
<Button name="HealBot_Action_HealUnit86" inherits="HealingButtonTemplate2" text="Unit not set"/>
<Button name="HealBot_Action_HealUnit87" inherits="HealingButtonTemplate2" text="Unit not set"/>
<Button name="HealBot_Action_HealUnit88" inherits="HealingButtonTemplate2" text="Unit not set"/>
<Button name="HealBot_Action_HealUnit89" inherits="HealingButtonTemplate2" text="Unit not set"/>
<Button name="HealBot_Action_HealUnit90" inherits="HealingButtonTemplate2" text="Unit not set"/>
<Button name="HealBot_Action_HealUnit91" inherits="HealingButtonTemplate2" text="Unit not set"/>
<Button name="HealBot_Action_HealUnit92" inherits="HealingButtonTemplate2" text="Unit not set"/>
<Button name="HealBot_Action_HealUnit93" inherits="HealingButtonTemplate2" text="Unit not set"/>
<Button name="HealBot_Action_HealUnit94" inherits="HealingButtonTemplate2" text="Unit not set"/>
<Button name="HealBot_Action_HealUnit95" inherits="HealingButtonTemplate2" text="Unit not set"/>
<Button name="HealBot_Action_HealUnit96" inherits="HealingButtonTemplate2" text="Unit not set"/>
<Button name="HealBot_Action_HealUnit97" inherits="HealingButtonTemplate2" text="Unit not set"/>
<Button name="HealBot_Action_HealUnit98" inherits="HealingButtonTemplate2" text="Unit not set"/>
<Button name="HealBot_Action_HealUnit99" inherits="HealingButtonTemplate2" text="Unit not set"/>
<Button name="HealBot_Action_HealUnit100" inherits="HealingButtonTemplate2" text="Unit not set"/>
<Button name="HealBot_Action_Header1" inherits="HealingButtonTemplate4" text="Unit not set"/> <Button name="HealBot_Action_Header1" inherits="HealingButtonTemplate4" text="Unit not set"/>
<Button name="HealBot_Action_Header2" inherits="HealingButtonTemplate4" text="Unit not set"/> <Button name="HealBot_Action_Header2" inherits="HealingButtonTemplate4" text="Unit not set"/>
+10
View File
@@ -50,6 +50,7 @@ HealBot_BonusScanner = {
}; };
} }
-- HealBot_BonusScanner:GetBonus: Internal utility: HealBot_BonusScanner:GetBonus
function HealBot_BonusScanner:GetBonus() function HealBot_BonusScanner:GetBonus()
if(HealBot_BonusScanner.bonuses) then if(HealBot_BonusScanner.bonuses) then
return HealBot_BonusScanner.bonuses; return HealBot_BonusScanner.bonuses;
@@ -58,6 +59,7 @@ function HealBot_BonusScanner:GetBonus()
end end
-- HealBot_BonusScanner_Update: Internal utility: HealBot_BonusScanner_Update
function HealBot_BonusScanner_Update() function HealBot_BonusScanner_Update()
if (HealBot_BonusScanner.IsUpdating) then if (HealBot_BonusScanner.IsUpdating) then
@@ -69,6 +71,7 @@ function HealBot_BonusScanner_Update()
HealBot_BonusScanner.IsUpdating = false; HealBot_BonusScanner.IsUpdating = false;
end end
-- HealBot_BonusScanner:ScanEquipment: Internal utility: HealBot_BonusScanner:ScanEquipment
function HealBot_BonusScanner:ScanEquipment() function HealBot_BonusScanner:ScanEquipment()
local slotid, slotname, hasItem, i; local slotid, slotname, hasItem, i;
@@ -90,6 +93,7 @@ function HealBot_BonusScanner:ScanEquipment()
HealBot_BonusScanner.bonuses = HealBot_BonusScanner.temp.bonuses; HealBot_BonusScanner.bonuses = HealBot_BonusScanner.temp.bonuses;
end end
-- HealBot_BonusScanner:ScanTooltip: Internal utility: HealBot_BonusScanner:ScanTooltip
function HealBot_BonusScanner:ScanTooltip() function HealBot_BonusScanner:ScanTooltip()
local tmpTxt, line; local tmpTxt, line;
local lines = HealBot_BonusTooltip:NumLines(); local lines = HealBot_BonusTooltip:NumLines();
@@ -103,6 +107,7 @@ function HealBot_BonusScanner:ScanTooltip()
end end
end end
-- HealBot_BonusScanner:AddValue: Internal utility: HealBot_BonusScanner:AddValue
function HealBot_BonusScanner:AddValue(effect, value) function HealBot_BonusScanner:AddValue(effect, value)
local i,e; local i,e;
if(type(effect) == "string") then if(type(effect) == "string") then
@@ -126,6 +131,7 @@ function HealBot_BonusScanner:AddValue(effect, value)
end end
end; end;
-- HealBot_BonusScanner:ScanLine: Internal utility: HealBot_BonusScanner:ScanLine
function HealBot_BonusScanner:ScanLine(line) function HealBot_BonusScanner:ScanLine(line)
local tmpStr, found; local tmpStr, found;
if(string.sub(line,0,string.len(HEALBOT_BONUSSCANNER_PREFIX_EQUIP)) == HEALBOT_BONUSSCANNER_PREFIX_EQUIP) then if(string.sub(line,0,string.len(HEALBOT_BONUSSCANNER_PREFIX_EQUIP)) == HEALBOT_BONUSSCANNER_PREFIX_EQUIP) then
@@ -150,6 +156,7 @@ function HealBot_BonusScanner:ScanLine(line)
end end
end; end;
-- HealBot_BonusScanner:CheckPassive: Internal utility: HealBot_BonusScanner:CheckPassive
function HealBot_BonusScanner:CheckPassive(line) function HealBot_BonusScanner:CheckPassive(line)
local i, p, value, found; local i, p, value, found;
@@ -166,6 +173,7 @@ function HealBot_BonusScanner:CheckPassive(line)
end end
end end
-- HealBot_BonusScanner:CheckGeneric: Internal utility: HealBot_BonusScanner:CheckGeneric
function HealBot_BonusScanner:CheckGeneric(line) function HealBot_BonusScanner:CheckGeneric(line)
local value, token, pos, tmpStr, found; local value, token, pos, tmpStr, found;
found = false; found = false;
@@ -199,6 +207,7 @@ function HealBot_BonusScanner:CheckGeneric(line)
return found; return found;
end end
-- HealBot_BonusScanner:CheckToken: Internal utility: HealBot_BonusScanner:CheckToken
function HealBot_BonusScanner:CheckToken(token, value) function HealBot_BonusScanner:CheckToken(token, value)
local i, p, s1, s2; local i, p, s1, s2;
@@ -209,6 +218,7 @@ function HealBot_BonusScanner:CheckToken(token, value)
return false; return false;
end end
-- HealBot_BonusScanner:CheckOther: Internal utility: HealBot_BonusScanner:CheckOther
function HealBot_BonusScanner:CheckOther(line) function HealBot_BonusScanner:CheckOther(line)
local i, p, value, start, found; local i, p, value, start, found;
+139 -23
View File
@@ -2,7 +2,9 @@
-- Handles tracking buffs/debuffs (auras) on group/raid units -- Handles tracking buffs/debuffs (auras) on group/raid units
HealBot_MissingBuffs = {} HealBot_MissingBuffs = {}
local StaticHasBuff = {}
-- HealBot_UnitAffected: Checks if a specific buff/debuff exists on a unit.
function HealBot_UnitAffected(unit, effect) function HealBot_UnitAffected(unit, effect)
if not effect then return nil; end if not effect then return nil; end
local i = 1 local i = 1
@@ -30,14 +32,41 @@ function HealBot_UnitAffected(unit, effect)
return nil; return nil;
end end
-- HealBot_CheckShamanWeaponBuff: Checks for Shaman weapon enchants via API.
function HealBot_CheckShamanWeaponBuff(spellName) function HealBot_CheckShamanWeaponBuff(spellName)
local hasMainHandEnchant, _, _, hasOffHandEnchant = GetWeaponEnchantInfo() local hasMainHandEnchant, _, _, hasOffHandEnchant = GetWeaponEnchantInfo()
if hasMainHandEnchant or hasOffHandEnchant then if not (hasMainHandEnchant or hasOffHandEnchant) then return false end
local firstWord = string.match(spellName, "^(%w+)")
if not firstWord then return false end
HealBot_ScanTooltip:SetOwner(UIParent, "ANCHOR_NONE")
local slots = HealBot_GetTable()
if hasMainHandEnchant then table.insert(slots, 16) end
if hasOffHandEnchant then table.insert(slots, 17) end
for _, slot in ipairs(slots) do
HealBot_ScanTooltip:ClearLines()
HealBot_ScanTooltip:SetInventoryItem("player", slot)
for i = 1, HealBot_ScanTooltip:NumLines() do
local textObj = getglobal("HealBot_ScanTooltipTextLeft" .. i)
if textObj then
local text = textObj:GetText()
if text and string.find(text, firstWord) then
HealBot_ScanTooltip:Hide()
HealBot_ReleaseTable(slots)
return true return true
end end
end
end
end
HealBot_ScanTooltip:Hide()
HealBot_ReleaseTable(slots)
return false return false
end end
-- HealBot_CheckBuffs: Scans unit for missing tracked buffs.
function HealBot_CheckBuffs(unit) function HealBot_CheckBuffs(unit)
if HealBot_Config.BuffWatch ~= 1 then if HealBot_Config.BuffWatch ~= 1 then
HealBot_MissingBuffs[unit] = nil HealBot_MissingBuffs[unit] = nil
@@ -68,7 +97,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 +123,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 +132,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 == HEALBOT_SHAMAN and UnitIsUnit(unit, "player") and string.find(spellName, " Weapon") then
hasIt = HealBot_CheckShamanWeaponBuff(spellName) hasIt = HealBot_CheckShamanWeaponBuff(spellName)
end end
end end
@@ -115,13 +147,6 @@ function HealBot_CheckBuffs(unit)
end end
end end
function HealBot_OnEvent_UnitAura(this, unit)
local DebuffType;
if HealBot_Heals[unit] and unit ~= "target" then
HealBot_UnitIcons[unit] = {}
local iconCount = 0
local HealBot_TrackedHoTs = { local HealBot_TrackedHoTs = {
["Interface\\Icons\\Spell_Holy_Renew"] = true, ["Interface\\Icons\\Spell_Holy_Renew"] = true,
["Interface\\Icons\\Spell_Nature_Rejuvenation"] = true, ["Interface\\Icons\\Spell_Nature_Rejuvenation"] = true,
@@ -130,54 +155,145 @@ function HealBot_OnEvent_UnitAura(this, unit)
["Interface\\Icons\\Spell_Holy_SealOfProtection"] = true, ["Interface\\Icons\\Spell_Holy_SealOfProtection"] = true,
["Interface\\Icons\\Spell_Holy_Excorcism"] = true, ["Interface\\Icons\\Spell_Holy_Excorcism"] = true,
["Interface\\Icons\\btnholyscriptures"] = true, ["Interface\\Icons\\btnholyscriptures"] = true,
["Interface\\Icons\\Spell_Holy_AshesToAshes"] = true,
} }
local HealBot_DebuffTypeMap = nil
-- HealBot_OnEvent_UnitAura: Updates debuff lists and icon textures on aura change.
function HealBot_OnEvent_UnitAura(this, unit)
if not HealBot_DebuffTypeMap then
HealBot_DebuffTypeMap = {
[HEALBOT_DISEASE] = HEALBOT_DISEASE_en,
[HEALBOT_MAGIC] = HEALBOT_MAGIC_en,
[HEALBOT_POISON] = HEALBOT_POISON_en,
[HEALBOT_CURSE] = HEALBOT_CURSE_en
}
end
local DebuffType;
if HealBot_Heals[unit] then
if not HealBot_UnitIcons[unit] then
HealBot_UnitIcons[unit] = {}
end
for j = 1, 10 do
HealBot_UnitIcons[unit][j] = nil
end
local iconCount = 0
local i = 1; local i = 1;
HealBot_UnitDebuff[unit] = nil;
local trackedTextures = {}
while true do while true do
local debuff, tmp, debuff_type = UnitDebuff(unit, i, 1) local debuff, tmp, debuff_type = UnitDebuff(unit, i, 1)
if debuff then if debuff then
if iconCount < 5 then local mapped_type = nil
if debuff_type then
mapped_type = HealBot_DebuffTypeMap[debuff_type] or debuff_type
end
local localizedClass = UnitClass(unit)
local shouldTrack = false
if unit == "target" then
shouldTrack = true
elseif localizedClass and HealBot_CDCInc[localizedClass] == 1 then
shouldTrack = true
elseif not localizedClass or HealBot_CDCInc[localizedClass] == nil then
shouldTrack = true
end
local isDispellable = false
if mapped_type and HealBot_DebuffWatch[mapped_type] then
isDispellable = true
end
if isDispellable or HealBot_Config.CDCShowAllDebuffs == 1 then
if iconCount < 10 and not trackedTextures[debuff] then
iconCount = iconCount + 1 iconCount = iconCount + 1
HealBot_UnitIcons[unit][iconCount] = debuff HealBot_UnitIcons[unit][iconCount] = debuff
trackedTextures[debuff] = true
end end
if HealBot_CDCInc[UnitClass(unit)] == 1 and HealBot_DebuffWatch[debuff_type] == "YES" then end
HealBot_UnitDebuff[unit] = debuff_type
DebuffType = debuff_type; if shouldTrack and isDispellable then
if HealBot_DebuffPriority[debuff_type] then HealBot_UnitDebuff[unit] = mapped_type
DebuffType = mapped_type;
local isPriority = false
if HealBot_DebuffPriority then
for _, pType in ipairs(HealBot_DebuffPriority) do
if pType == mapped_type then
isPriority = true
break
end
end
end
if isPriority then
break break
end end
end end
i = i + 1; i = i + 1;
else else
if i == 1 then HealBot_UnitDebuff[unit] = nil; end
break break
end end
end end
if HealBot_Config.CDCShowAllDebuffs == 1 then
local k = 1
while true do
local debuff = UnitDebuff(unit, k)
if not debuff then break end
if not trackedTextures[debuff] and iconCount < 10 then
iconCount = iconCount + 1
HealBot_UnitIcons[unit][iconCount] = debuff
trackedTextures[debuff] = true
end
k = k + 1
end
end
local b = 1 local b = 1
while true do while true do
local buff = UnitBuff(unit, b) local buff = UnitBuff(unit, b)
if not buff then break end if not buff then break end
if HealBot_TrackedHoTs[buff] and iconCount < 5 then if HealBot_TrackedHoTs[buff] and iconCount < 10 then
iconCount = iconCount + 1 iconCount = iconCount + 1
HealBot_UnitIcons[unit][iconCount] = buff HealBot_UnitIcons[unit][iconCount] = buff
end end
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 < 10 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
local color = HealBot_Config.CDCBarColour[DebuffType]
local r, g, b = 1, 0, 0
if color then
r, g, b = color.R, color.G, color.B
end
UIErrorsFrame:AddMessage(UnitName(unit) .. " suffers from " .. DebuffType, UIErrorsFrame:AddMessage(UnitName(unit) .. " suffers from " .. DebuffType,
HealBot_Config.CDCBarColour[DebuffType].R, r, g, b,
HealBot_Config.CDCBarColour[DebuffType].G,
HealBot_Config.CDCBarColour[DebuffType].B,
1, UIERRORS_HOLD_TIME); 1, UIERRORS_HOLD_TIME);
end end
if HealBot_Config.SoundDebuffWarning == 1 then HealBot_PlaySound(HealBot_Config.SoundDebuffPlay); end if HealBot_Config.SoundDebuffWarning == 1 then HealBot_PlaySound(HealBot_Config.SoundDebuffPlay); end
end end
end end
HealBot_CheckBuffs(unit); -- Check buffs synchronously because tooltip scanning fails in OnUpdate
HealBot_RecalcHeals(unit); HealBot_CheckBuffs(unit)
-- Defer UI updates
HealBot_View_DirtyUnits[unit] = true
end end
end end
+8
View File
@@ -1,6 +1,7 @@
-- HealBot_Controller_Comms.lua -- HealBot_Controller_Comms.lua
-- Handles network sync (addon messaging), errors, and chat debugging -- Handles network sync (addon messaging), errors, and chat debugging
-- HealBot_Get_DebugChan: Internal utility: HealBot_Get_DebugChan
function HealBot_Get_DebugChan() function HealBot_Get_DebugChan()
local index = GetChannelName("HBmsg"); local index = GetChannelName("HBmsg");
if (index > 0) then if (index > 0) then
@@ -10,6 +11,7 @@ function HealBot_Get_DebugChan()
end end
end end
-- HealBot_AddChat: Prints standard messages to default chat frame.
function HealBot_AddChat(msg) function HealBot_AddChat(msg)
local chanid = HealBot_Get_DebugChan(); local chanid = HealBot_Get_DebugChan();
if chanid and HealBot_SpamCnt < 3 then if chanid and HealBot_SpamCnt < 3 then
@@ -28,6 +30,7 @@ function HealBot_AddChat(msg)
end end
end end
-- HealBot_AddDebug: Prints debug messages to internal chat channel.
function HealBot_AddDebug(msg) function HealBot_AddDebug(msg)
local chanid = HealBot_Get_DebugChan(); local chanid = HealBot_Get_DebugChan();
if chanid and HealBot_SpamCnt < 3 then if chanid and HealBot_SpamCnt < 3 then
@@ -44,6 +47,7 @@ function HealBot_AddDebug(msg)
end end
end end
-- HealBot_Report_Error: Formats and prints error logs.
function HealBot_Report_Error(msg) function HealBot_Report_Error(msg)
if HealBot_ErrorCnt < 28 then if HealBot_ErrorCnt < 28 then
HealBot_ErrorCnt = HealBot_ErrorCnt + 1; HealBot_ErrorCnt = HealBot_ErrorCnt + 1;
@@ -52,11 +56,13 @@ function HealBot_Report_Error(msg)
end end
end end
-- HealBot_AddError: Displays error text in the UI frame.
function HealBot_AddError(msg) function HealBot_AddError(msg)
UIErrorsFrame:AddMessage(msg, 1.0, 1.0, 1.0, 1.0, UIERRORS_HOLD_TIME); UIErrorsFrame:AddMessage(msg, 1.0, 1.0, 1.0, 1.0, UIERRORS_HOLD_TIME);
HealBot_AddDebug(msg); HealBot_AddDebug(msg);
end end
-- HealBot_SendAddonMessage: Broadcasts data to party/raid channels.
function HealBot_SendAddonMessage(prefix, text) function HealBot_SendAddonMessage(prefix, text)
if GetNumRaidMembers() > 0 then if GetNumRaidMembers() > 0 then
SendAddonMessage(prefix, text, "RAID") SendAddonMessage(prefix, text, "RAID")
@@ -65,11 +71,13 @@ function HealBot_SendAddonMessage(prefix, text)
end end
end end
-- HealBot_OnEvent_AddonMsg: Parses incoming heal data from other clients.
function HealBot_OnEvent_AddonMsg(this, addon_id, inc_msg, dist_target, sender_id) function HealBot_OnEvent_AddonMsg(this, addon_id, inc_msg, dist_target, sender_id)
if addon_id == HEALBOT_ADDON_ID then if addon_id == HEALBOT_ADDON_ID then
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
+208 -60
View File
@@ -2,11 +2,13 @@
-- Manages WoW Frame events and periodic updates, routing to respective services -- Manages WoW Frame events and periodic updates, routing to respective services
HealBot_View_DirtyUnits = {} HealBot_View_DirtyUnits = {}
HealBot_View_DirtyPower = {}
local HealBot_Timer1, HealsIn_Timer = 0, 0; local HealBot_Timer1, HealsIn_Timer = 0, 0;
HealBot_LastModState = ""
-- HealBot_OnLoad: Registers core events and observers on addon load.
function HealBot_OnLoad(this) function HealBot_OnLoad(this)
this:RegisterEvent("VARIABLES_LOADED"); this:RegisterEvent("VARIABLES_LOADED");
this:RegisterEvent("MODIFIER_STATE_CHANGED");
SLASH_HEALBOT1 = "/healbot"; SLASH_HEALBOT1 = "/healbot";
SLASH_HEALBOT2 = "/hb"; SLASH_HEALBOT2 = "/hb";
@@ -20,7 +22,7 @@ function HealBot_OnLoad(this)
HealBot_View_DirtyUnits[unitID] = true HealBot_View_DirtyUnits[unitID] = true
end) end)
HealBot_Model:RegisterObserver("UNIT_POWER_CHANGED", function(unitID) HealBot_Model:RegisterObserver("UNIT_POWER_CHANGED", function(unitID)
HealBot_View_DirtyUnits[unitID] = true HealBot_View_DirtyPower[unitID] = true
end) end)
HealBot_Model:RegisterObserver("UNIT_AURA_CHANGED", function(unitID) HealBot_Model:RegisterObserver("UNIT_AURA_CHANGED", function(unitID)
HealBot_View_DirtyUnits[unitID] = true HealBot_View_DirtyUnits[unitID] = true
@@ -30,18 +32,35 @@ function HealBot_OnLoad(this)
end) end)
HealBot_Model:RegisterObserver("EQUIPMENT_CHANGED", function(unitID) HealBot_Model:RegisterObserver("EQUIPMENT_CHANGED", function(unitID)
if unitID == "player" then if unitID == "player" then
HealBot_BonusScanner:ScanEquipment() HealBot_EquipChangeTimer = 1
HealBot_CalcEquipBonus = true;
HealBot_RecalcSpells();
end end
end) end)
end end
-- HealBot_RegisterThis: Internal utility: HealBot_RegisterThis
function HealBot_RegisterThis(this) function HealBot_RegisterThis(this)
-- Deprecated / not used -- Deprecated / not used
end end
-- HealBot_OnUpdate: Main loop: processes dirty queues and timers.
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
@@ -58,22 +77,105 @@ function HealBot_OnUpdate(this, arg1)
end end
end end
-- Process Dirty Queue for MVC View if HealBot_PendingShapeshiftCast then
if next(HealBot_View_DirtyUnits) ~= nil then local pendingCast = HealBot_PendingShapeshiftCast
for unitID in pairs(HealBot_View_DirtyUnits) do
HealBot_Action_RefreshButtons(unitID) -- Wait for server to process the unshift before attempting the cast
HealBot_View_DirtyUnits[unitID] = nil if GetTime() >= pendingCast.fireTime then
if not HealBot_GetShapeshiftForm() then
-- Target the unit if necessary before casting
-- Target the unit if necessary before casting
if pendingCast.oldTarget ~= UnitName(pendingCast.target) then
TargetUnit(pendingCast.target)
end
-- 1. Initialize the MVC side effects (AnnounceCast, Incoming Heals) only ONCE
if not pendingCast.started then
pendingCast.started = true
-- Extract base spell
local baseSpell = pendingCast.spell
local parenIndex = string.find(pendingCast.spell, "%(")
if parenIndex then
baseSpell = string.sub(pendingCast.spell, 1, parenIndex - 1)
end
baseSpell = string.gsub(baseSpell, "%s+$", "")
-- Force MVC updates since we guarantee the cast will eventually pierce the server
HealBot_CastFailed = true -- Trigger first attempt immediately
HealBot_CastingSpell = baseSpell
HealBot_CastingTarget = pendingCast.target
HealBot_Process_HealValue(baseSpell, pendingCast.target)
HealBot_AnnounceCast(pendingCast.spell, pendingCast.target)
-- Restore target logic
if pendingCast.targetEnemy then
HealBot_TargetRestorePending = { type = "enemy" }
elseif pendingCast.oldTarget and pendingCast.oldTarget ~= UnitName(pendingCast.target) then
HealBot_TargetRestorePending = { type = "friend" }
elseif not pendingCast.oldTarget then
HealBot_TargetRestorePending = { type = "clear" }
end
HealBot_TargetRestoreTimer = 0
end
-- 2. Spam the cast until the server explicitly accepts it (firing SPELLCAST_START)
if pendingCast.started then
if not pendingCast.nextSpam or GetTime() >= pendingCast.nextSpam then
pendingCast.nextSpam = GetTime() + 0.10
-- Safely suppress UI errors
UIErrorsFrame:UnregisterEvent("UI_ERROR_MESSAGE")
-- Only use HealBot's native cast wrapper
HealBot_CastSpellByName(pendingCast.spell)
if SpellCanTargetUnit(pendingCast.target) then
SpellTargetUnit(pendingCast.target)
elseif SpellIsTargeting() then
SpellTargetUnit(pendingCast.target)
SpellStopTargeting()
end
UIErrorsFrame:RegisterEvent("UI_ERROR_MESSAGE")
end
end
end end
end end
HealBot_Timer1 = HealBot_Timer1 + arg1; -- Failsafe timeout
if HealBot_Timer1 >= 2.5 then if HealBot_PendingShapeshiftCast and GetTime() > pendingCast.expires then
if not HealBot_IsFighting then HealBot_PendingShapeshiftCast = nil
HealsIn_Timer = HealsIn_Timer + 1; HealBot_StopCasting()
if HealsIn_Timer >= 10 then HealBot_RecalcHeals()
HealBot_HealsIn = {}; end
HealBot_Healers = {}; end
HealsIn_Timer = 0;
-- Process Dirty Queue for MVC View
local unitsToRefresh = {}
for unitID in pairs(HealBot_View_DirtyUnits) do
unitsToRefresh[unitID] = true
HealBot_View_DirtyUnits[unitID] = nil
HealBot_View_DirtyPower[unitID] = nil -- No need to do power-only if full refresh is queued
end
for unitID in pairs(unitsToRefresh) do
HealBot_Action_Refresh(unitID)
end
local powerToRefresh = {}
for unitID in pairs(HealBot_View_DirtyPower) do
powerToRefresh[unitID] = true
HealBot_View_DirtyPower[unitID] = nil
end
for unitID in pairs(powerToRefresh) do
HealBot_Action_RefreshPower(unitID)
end
local powerID, _ = next(HealBot_View_DirtyPower)
while powerID do
HealBot_Action_RefreshPower(powerID)
HealBot_View_DirtyPower[powerID] = nil
powerID, _ = next(HealBot_View_DirtyPower)
end end
if HealBot_EquipChangeTimer > 0 then if HealBot_EquipChangeTimer > 0 then
@@ -86,6 +188,18 @@ function HealBot_OnUpdate(this, arg1)
end end
end end
HealBot_Timer1 = HealBot_Timer1 + arg1;
if HealBot_Timer1 >= 2.5 then
if not HealBot_IsFighting then
HealsIn_Timer = HealsIn_Timer + 1;
if HealsIn_Timer >= 10 then
for k in pairs(HealBot_HealsIn) do HealBot_HealsIn[k] = nil end
for k in pairs(HealBot_Healers) do HealBot_Healers[k] = nil end
HealsIn_Timer = 0;
end
if HealBot_SpellsInitFlag > 1 then if HealBot_SpellsInitFlag > 1 then
HealBot_SpellsInitFlag = HealBot_SpellsInitFlag + 1; HealBot_SpellsInitFlag = HealBot_SpellsInitFlag + 1;
if HealBot_SpellsInitFlag > 2 then if HealBot_SpellsInitFlag > 2 then
@@ -117,32 +231,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)
@@ -168,6 +278,23 @@ local HealBot_EventHandlers = {
HealBot_Model:NotifyObservers("ROSTER_CHANGED") HealBot_Model:NotifyObservers("ROSTER_CHANGED")
HealBot_OnEvent_PartyMembersChanged(this) HealBot_OnEvent_PartyMembersChanged(this)
end, end,
["RAID_ROSTER_UPDATE"] = function(this)
for _, unit in ipairs(HealBot_Model.partyMembers) do
HealBot_Model:RefreshUnit(unit)
end
for _, unit in ipairs(HealBot_Model.raidMembers) do
HealBot_Model:RefreshUnit(unit)
end
HealBot_Model:NotifyObservers("ROSTER_CHANGED")
HealBot_OnEvent_PartyMembersChanged(this)
end,
["RAID_TARGET_UPDATE"] = function(this)
if HealBot_Action_UnitButtons then
for unit, _ in pairs(HealBot_Action_UnitButtons) do
HealBot_View_DirtyUnits[unit] = true
end
end
end,
["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")
@@ -178,22 +305,16 @@ local HealBot_EventHandlers = {
end, end,
["VARIABLES_LOADED"] = function(this) ["VARIABLES_LOADED"] = function(this)
HealBot_OnEvent_VariablesLoaded(this) HealBot_OnEvent_VariablesLoaded(this)
end, HealBot_Integrations_Toggle()
["MODIFIER_STATE_CHANGED"] = function(this, arg1, arg2)
if HealBot_Action_TooltipUnit and HealBot_Tooltip:IsVisible() then
HealBot_Action_RefreshTooltip(HealBot_Action_TooltipUnit)
end
end, end,
-- 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,
@@ -203,17 +324,17 @@ local HealBot_EventHandlers = {
HealBot_OnEvent_PlayerEquipmentChanged(this) HealBot_OnEvent_PlayerEquipmentChanged(this)
end, end,
["UNIT_INVENTORY_CHANGED"] = function(this, arg1) ["UNIT_INVENTORY_CHANGED"] = function(this, arg1)
if arg1 ~= "player" then return end
HealBot_Model:NotifyObservers("EQUIPMENT_CHANGED", arg1) HealBot_Model:NotifyObservers("EQUIPMENT_CHANGED", arg1)
HealBot_OnEvent_PlayerEquipmentChanged2(this, arg1) HealBot_OnEvent_PlayerEquipmentChanged2(this, arg1)
end, end,
["PET_BAR_SHOWGRID"] = function(this) HealBot_OnEvent_PartyMembersChanged(this) end,
["PET_BAR_HIDEGRID"] = function(this) HealBot_OnEvent_PartyMembersChanged(this) end,
["UNIT_PET"] = function(this, arg1) HealBot_OnEvent_PartyMembersChanged(this) end, ["UNIT_PET"] = function(this, arg1) HealBot_OnEvent_PartyMembersChanged(this) end,
["SPELLS_CHANGED"] = function(this, arg1) HealBot_OnEvent_SpellsChanged(this, arg1) end, ["SPELLS_CHANGED"] = function(this, arg1) HealBot_OnEvent_SpellsChanged(this, arg1) end,
["UPDATE_SHAPESHIFT_FORM"] = function(this) HealBot_UpdateShapeshiftForm() end, ["UPDATE_SHAPESHIFT_FORM"] = function(this) HealBot_UpdateShapeshiftForm() end,
["UPDATE_SHAPESHIFT_FORMS"] = function(this) HealBot_UpdateShapeshiftForm() end ["UPDATE_SHAPESHIFT_FORMS"] = function(this) HealBot_UpdateShapeshiftForm() end
} }
-- HealBot_OnEvent: Event dispatcher for WoW UI events.
function HealBot_OnEvent(this, event, arg1, arg2, arg3, arg4) function HealBot_OnEvent(this, event, arg1, arg2, arg3, arg4)
local handler = HealBot_EventHandlers[event] local handler = HealBot_EventHandlers[event]
if handler then if handler then
@@ -223,6 +344,7 @@ function HealBot_OnEvent(this, event, arg1, arg2, arg3, arg4)
end end
end end
-- HealBot_OnEvent_VariablesLoaded: Applies config defaults and initializes state.
function HealBot_OnEvent_VariablesLoaded(this) function HealBot_OnEvent_VariablesLoaded(this)
local class = HealBot_UnitClass("player") local class = HealBot_UnitClass("player")
@@ -277,10 +399,10 @@ function HealBot_OnEvent_VariablesLoaded(this)
this:RegisterEvent("PLAYER_REGEN_ENABLED"); this:RegisterEvent("PLAYER_REGEN_ENABLED");
this:RegisterEvent("PLAYER_TARGET_CHANGED"); this:RegisterEvent("PLAYER_TARGET_CHANGED");
this:RegisterEvent("PARTY_MEMBERS_CHANGED"); this:RegisterEvent("PARTY_MEMBERS_CHANGED");
this:RegisterEvent("RAID_ROSTER_UPDATE");
this:RegisterEvent("RAID_TARGET_UPDATE");
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("PET_BAR_HIDEGRID");
this:RegisterEvent("UNIT_PET"); this:RegisterEvent("UNIT_PET");
this:RegisterEvent("UNIT_HEALTH"); this:RegisterEvent("UNIT_HEALTH");
this:RegisterEvent("UNIT_MANA"); this:RegisterEvent("UNIT_MANA");
@@ -292,8 +414,6 @@ 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");
@@ -309,27 +429,30 @@ function HealBot_OnEvent_VariablesLoaded(this)
end end
end end
-- HealBot_OnEvent_UnitHealth: Internal utility: HealBot_OnEvent_UnitHealth
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
end end
-- HealBot_OnEvent_UnitMana: Internal utility: HealBot_OnEvent_UnitMana
function HealBot_OnEvent_UnitMana(this, unit) function HealBot_OnEvent_UnitMana(this, unit)
if (unit ~= "player") then return end if (unit ~= "player") then return end
HealBot_RecalcHeals(); HealBot_RecalcHeals();
end end
-- HealBot_OnEvent_ZoneChanged: Internal utility: HealBot_OnEvent_ZoneChanged
function HealBot_OnEvent_ZoneChanged(this) function HealBot_OnEvent_ZoneChanged(this)
HealBot_ResetRangeScale(); HealBot_ResetRangeScale();
HealBot_Delay_RecalcParty = 1; HealBot_Delay_RecalcParty = 1;
end end
-- HealBot_OnEvent_PlayerRegenDisabled: Internal utility: HealBot_OnEvent_PlayerRegenDisabled
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;
@@ -363,23 +486,36 @@ function HealBot_OnEvent_PlayerRegenDisabled(this)
-- HealBot_RecalcHeals(); -- HealBot_RecalcHeals();
end end
-- HealBot_OnEvent_PlayerRegenEnabled: Internal utility: HealBot_OnEvent_PlayerRegenEnabled
function HealBot_OnEvent_PlayerRegenEnabled(this) function HealBot_OnEvent_PlayerRegenEnabled(this)
HealBot_IsFighting = false; HealBot_IsFighting = false;
HealBot_Delay_RecalcParty = 1; HealBot_Delay_RecalcParty = 1;
end end
-- HealBot_OnEvent_PlayerTargetChanged: Internal utility: HealBot_OnEvent_PlayerTargetChanged
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
-- HealBot_OnEvent_PartyMembersChanged: Internal utility: HealBot_OnEvent_PartyMembersChanged
function HealBot_OnEvent_PartyMembersChanged(this) function HealBot_OnEvent_PartyMembersChanged(this)
HealBot_Model:PreserveStateByGUID()
HealBot_Integrations_PruneNampower()
if HealBot_IsFighting then
HealBot_Action_PartyChanged()
end
HealBot_Delay_RecalcParty = 1; HealBot_Delay_RecalcParty = 1;
end end
-- HealBot_OnEvent_PartyMemberDisable: Internal utility: HealBot_OnEvent_PartyMemberDisable
function HealBot_OnEvent_PartyMemberDisable(this, unit) function HealBot_OnEvent_PartyMemberDisable(this, unit)
HealBot_RecalcHeals(); HealBot_RecalcHeals();
end end
-- HealBot_OnEvent_SystemMsg: Internal utility: HealBot_OnEvent_SystemMsg
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, HEALBOT_HASLEFTRAID); local tmpTest, tmpTest, deserter = string.find(msg, HEALBOT_HASLEFTRAID);
@@ -406,44 +542,36 @@ function HealBot_OnEvent_SystemMsg(this, msg)
end end
end end
-- HealBot_OnEvent_PartyMemberEnable: Internal utility: HealBot_OnEvent_PartyMemberEnable
function HealBot_OnEvent_PartyMemberEnable(this, unit) function HealBot_OnEvent_PartyMemberEnable(this, unit)
HealBot_RecalcHeals(); HealBot_RecalcHeals();
end end
-- HealBot_OnEvent_PlayerEquipmentChanged: Internal utility: HealBot_OnEvent_PlayerEquipmentChanged
function HealBot_OnEvent_PlayerEquipmentChanged(this) function HealBot_OnEvent_PlayerEquipmentChanged(this)
HealBot_EquipChangeTimer = 1; HealBot_EquipChangeTimer = 1;
end end
-- HealBot_OnEvent_PlayerEquipmentChanged2: Internal utility: HealBot_OnEvent_PlayerEquipmentChanged2
function HealBot_OnEvent_PlayerEquipmentChanged2(this, unit) function HealBot_OnEvent_PlayerEquipmentChanged2(this, unit)
if unit == "player" then if unit == "player" then
HealBot_EquipChangeTimer = 1; HealBot_EquipChangeTimer = 1;
end end
end end
-- HealBot_OnEvent_SpellsChanged: Internal utility: HealBot_OnEvent_SpellsChanged
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");
HealBot_SpellsInitFlag = 2; HealBot_SpellsInitFlag = 2;
end end
-- HealBot_OnEvent_TalentsChanged: Internal utility: HealBot_OnEvent_TalentsChanged
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) -- HealBot_OnEvent_PlayerEnteringWorld: Internal utility: HealBot_OnEvent_PlayerEnteringWorld
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 -- Re-apply the refresh hook late in case another addon overrode it during load
@@ -452,8 +580,10 @@ function HealBot_OnEvent_PlayerEnteringWorld(this)
end end
end end
-- HealBot_OnEvent_SpellcastStart: Internal utility: HealBot_OnEvent_SpellcastStart
function HealBot_OnEvent_SpellcastStart(this, spell, duration) function HealBot_OnEvent_SpellcastStart(this, spell, duration)
HealBot_IsCasting = true; HealBot_IsCasting = true;
HealBot_PendingShapeshiftCast = nil;
HealBot_RecalcHeals(); HealBot_RecalcHeals();
HealBot_CheckCasting(); HealBot_CheckCasting();
if spell == HEALBOT_RESURRECTION or spell == HEALBOT_ANCESTRALSPIRIT or spell == HEALBOT_REBIRTH or spell == HEALBOT_REDEMPTION then if spell == HEALBOT_RESURRECTION or spell == HEALBOT_ANCESTRALSPIRIT or spell == HEALBOT_REBIRTH or spell == HEALBOT_REDEMPTION then
@@ -464,8 +594,26 @@ function HealBot_OnEvent_SpellcastStart(this, spell, duration)
end end
end end
function HealBot_OnEvent_SpellcastStop(this) -- HealBot_OnEvent_SpellcastStop: Internal utility: HealBot_OnEvent_SpellcastStop
function HealBot_OnEvent_SpellcastStop(this, eventName)
HealBot_IsCasting = false; HealBot_IsCasting = false;
if eventName == "SPELLCAST_FAILED" or eventName == "SPELLCAST_INTERRUPTED" then
HealBot_CastFailed = true;
if HealBot_PendingShapeshiftCast then
return;
end
end
if HealBot_PendingShapeshiftCast and eventName == "SPELLCAST_STOP" then
if HealBot_CastFailed or not HealBot_PendingShapeshiftCast.started then
-- This STOP is either the trailing event of a failed/interrupted cast,
-- or it is the STOP event from the unshift spell itself.
-- Do not wipe the queue yet!
return;
end
end
HealBot_PendingShapeshiftCast = nil;
HealBot_StopCasting(); HealBot_StopCasting();
HealBot_RecalcHeals(); HealBot_RecalcHeals();
if HealBot_IamRessing then if HealBot_IamRessing then
+18
View File
@@ -3,10 +3,12 @@
local _scale = 0 local _scale = 0
-- HealBot_ResetRangeScale: Resets map range scaling on zone change.
function HealBot_ResetRangeScale() function HealBot_ResetRangeScale()
_scale = 0 _scale = 0
end end
-- HealBot_Range_Check: Checks if unit is in range via map distance or API.
function HealBot_Range_Check(unit, range) function HealBot_Range_Check(unit, range)
local return_val = 0; local return_val = 0;
if not range then if not range then
@@ -14,6 +16,22 @@ function HealBot_Range_Check(unit, range)
end end
if ( unit == "player" ) then if ( unit == "player" ) then
return_val = 1; return_val = 1;
elseif HealBot_Integrations_ClassicAPI_Active and UnitDistanceSquared and UnitInLineOfSight then
local inSight = UnitInLineOfSight("player", unit)
if inSight then
local distSq = UnitDistanceSquared(unit)
if distSq and distSq <= (range * range) then
return_val = 1;
end
end
elseif HealBot_Integrations_UnitXP_Active then
local inSight = UnitXP("inSight", "player", unit)
if inSight then
local dist = UnitXP("distanceBetween", "player", unit, "Gaussian")
if dist and dist <= range then
return_val = 1;
end
end
elseif ( UnitIsVisible(unit) == 1 ) then elseif ( UnitIsVisible(unit) == 1 ) then
local tx, ty = GetPlayerMapPosition(unit) local tx, ty = GetPlayerMapPosition(unit)
local dist local dist
+250 -68
View File
@@ -18,6 +18,7 @@ local HealBot_Health60 = {
["WARRIOR"] = 5000, ["WARRIOR"] = 5000,
} }
-- HealBot_GetSpellName: Internal utility: HealBot_GetSpellName
function HealBot_GetSpellName(id) function HealBot_GetSpellName(id)
if (not id) then if (not id) then
return nil; return nil;
@@ -32,6 +33,7 @@ function HealBot_GetSpellName(id)
return spellName .. " (" .. subSpellName .. ")"; return spellName .. " (" .. subSpellName .. ")";
end end
-- HealBot_GetSpellId: Internal utility: HealBot_GetSpellId
function HealBot_GetSpellId(spell) function HealBot_GetSpellId(spell)
local id, idd = 1, 0; local id, idd = 1, 0;
while true do while true do
@@ -55,6 +57,7 @@ function HealBot_GetSpellId(spell)
end end
end end
-- HealBot_CastSpellByName: Internal utility: HealBot_CastSpellByName
function HealBot_CastSpellByName(spell) function HealBot_CastSpellByName(spell)
if (HealBot_Spells[spell] and HealBot_Spells[spell].BagSlot) then if (HealBot_Spells[spell] and HealBot_Spells[spell].BagSlot) then
HealBot_UseItem(spell); HealBot_UseItem(spell);
@@ -74,6 +77,7 @@ function HealBot_CastSpellByName(spell)
CastSpell(id, BOOKTYPE_SPELL); CastSpell(id, BOOKTYPE_SPELL);
end end
-- HealBot_AnnounceCast: Internal utility: HealBot_AnnounceCast
function HealBot_AnnounceCast(spell, target) function HealBot_AnnounceCast(spell, target)
if not spell or not target then return end if not spell or not target then return end
@@ -127,10 +131,60 @@ function HealBot_AnnounceCast(spell, target)
end end
end end
-- HealBot_Process_HealValue: Internal utility: HealBot_Process_HealValue
function HealBot_Process_HealValue(spell, target)
if HealBot_Spells[spell] and (HealBot_Spells[spell].CastTime or 0) > 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
-- HealBot_StartCasting: Initiates spell cast and broadcasts incoming heal.
function HealBot_StartCasting(spell, target, ttype) function HealBot_StartCasting(spell, target, ttype)
HealBot_CastFailed = false;
-- Extract base spell for internal tracking
local baseSpell = spell
local parenIndex = string.find(spell, " %(")
if parenIndex then
baseSpell = string.sub(spell, 1, parenIndex - 1)
else
parenIndex = string.find(spell, "%(")
if parenIndex then
baseSpell = string.sub(spell, 1, parenIndex - 1)
end
end
HealBot_CastSpellByName(spell); HealBot_CastSpellByName(spell);
HealBot_CastingSpell = spell;
HealBot_CastingTarget = target;
if ( SpellCanTargetUnit(target) ) then if ( SpellCanTargetUnit(target) ) then
SpellTargetUnit(target); SpellTargetUnit(target);
ttype = "fired"; ttype = "fired";
@@ -138,28 +192,40 @@ function HealBot_StartCasting(spell, target, ttype)
SpellTargetUnit(target); SpellTargetUnit(target);
SpellStopTargeting() SpellStopTargeting()
elseif ttype == "direct" then elseif ttype == "direct" then
if ( CheckInteractDistance(target, 4) ) then if ( UnitIsUnit(target, "player") or CheckInteractDistance(target, 4) ) then
ttype = "fired"; ttype = "fired";
end end
end end
HealBot_AnnounceCast(spell, target) if ttype == "fired" and HealBot_Spells[baseSpell] then
if not HealBot_CastFailed then
if ttype == "fired" and HealBot_Spells[spell] then HealBot_CastingSpell = baseSpell;
if HealBot_Spells[spell].CastTime > 1 then HealBot_CastingTarget = target;
HealBot_HealValue = HealBot_Spells[spell].HealsDur; HealBot_Process_HealValue(baseSpell, target);
HealBot_SendAddonMessage(HEALBOT_ADDON_ID, ">> " .. UnitName(target) .. " <<=>> " .. HealBot_HealValue .. " << "); HealBot_AnnounceCast(spell, target);
end
end end
end end
return ttype == "fired"
end
-- HealBot_StopCasting: Internal utility: HealBot_StopCasting
function HealBot_StopCasting() function HealBot_StopCasting()
HealBot_IsCasting = false;
if HealBot_CastingTarget then if HealBot_CastingTarget then
if HealBot_HealsIn[UnitName(HealBot_CastingTarget)] then
if HealBot_HealValue > 0 then if HealBot_HealValue > 0 then
HealBot_SendAddonMessage(HEALBOT_ADDON_ID, ">> " .. UnitName(HealBot_CastingTarget) .. " <<=>> " .. 0 - HealBot_HealValue .. " << "); local uname = UnitName(HealBot_CastingTarget)
HealBot_HealValue = 0; if uname then
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 end
HealBot_RecalcHeals(HealBot_FindUnitID(uname));
end
end
HealBot_HealValue = 0;
end end
end end
HealBot_CastingSpell = nil; HealBot_CastingSpell = nil;
@@ -178,6 +244,7 @@ function HealBot_StopCasting()
bar.txt:SetTextColor(sr, sg, sb, sa); bar.txt:SetTextColor(sr, sg, sb, sa);
end end
-- HealBot_UnitHealth: Internal utility: HealBot_UnitHealth
function HealBot_UnitHealth(unit) function HealBot_UnitHealth(unit)
local Current, Desired = UnitHealth(unit), UnitHealthMax(unit); local Current, Desired = UnitHealth(unit), UnitHealthMax(unit);
if unit == 'target' and Desired == 100 then if unit == 'target' and Desired == 100 then
@@ -192,6 +259,7 @@ function HealBot_UnitHealth(unit)
return Current, Desired; return Current, Desired;
end end
-- HealBot_CheckCasting: Internal utility: HealBot_CheckCasting
function HealBot_CheckCasting(unit) function HealBot_CheckCasting(unit)
if not HealBot_CastingSpell or HealBot_AlwaysHeal() then return nil end if not HealBot_CastingSpell or HealBot_AlwaysHeal() then return nil end
if not HealBot_Spells[HealBot_CastingSpell] then return nil end if not HealBot_Spells[HealBot_CastingSpell] then return nil end
@@ -203,7 +271,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);
@@ -238,6 +306,7 @@ function HealBot_CheckCasting(unit)
end end
end end
-- HealBot_CastSpellOnFriend: Target-safe wrapper for casting spells on allies.
function HealBot_CastSpellOnFriend(spell, target) function HealBot_CastSpellOnFriend(spell, target)
if (not spell or not target or not UnitName(target)) then if (not spell or not target or not UnitName(target)) then
return; return;
@@ -245,8 +314,20 @@ 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 local formCancelled = false
CastShapeshiftForm(HealBot_ActiveShapeshiftStance); if HealBot_UnitClass("player") == "DRUID" and HealBot_Config.AutoUnshift == 1 then
local currentForm = HealBot_GetShapeshiftForm()
if currentForm then
CastShapeshiftForm(currentForm);
formCancelled = true
end
end
if formCancelled then
-- ALWAYS put the cast into the Pending queue so the OnUpdate loop can wait for the server
-- to process the unshift before attempting the cast, otherwise we get "You are in shapeshift form".
HealBot_PendingShapeshiftCast = { spell = spell, target = target, targetEnemy = targetEnemy, oldTarget = oldTarget, fireTime = GetTime() + 0.05, expires = GetTime() + 2.0 }
return;
end end
if oldTarget ~= UnitName(target) then if oldTarget ~= UnitName(target) then
@@ -265,6 +346,7 @@ function HealBot_CastSpellOnFriend(spell, target)
HealBot_TargetRestoreTimer = 0; HealBot_TargetRestoreTimer = 0;
end end
-- HealBot_SetItemDefaults: Internal utility: HealBot_SetItemDefaults
function HealBot_SetItemDefaults(spell) function HealBot_SetItemDefaults(spell)
if not HealBot_Spells[spell].Target then if not HealBot_Spells[spell].Target then
HealBot_Spells[spell].Target = {"player", "party", "pet"}; HealBot_Spells[spell].Target = {"player", "party", "pet"};
@@ -297,10 +379,51 @@ function HealBot_SetItemDefaults(spell)
end end
end end
-- HealBot_SetSpellDefaults: Internal utility: HealBot_SetSpellDefaults
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 end
HealBot_Spells[spell].HealsDur = math.floor(baseHeal + extHeal + realHeal);
end
-- HealBot_AddHeal: Internal utility: HealBot_AddHeal
function HealBot_AddHeal(spell) function HealBot_AddHeal(spell)
HealBot_SetSpellDefaults(spell); HealBot_SetSpellDefaults(spell);
table.foreachi(HealBot_Spells[spell].Target, function (i, val) table.foreachi(HealBot_Spells[spell].Target, function (i, val)
@@ -309,6 +432,7 @@ function HealBot_AddHeal(spell)
HealBot_Spells[spell].BagSlot = HealBot_GetBagSlot(spell); HealBot_Spells[spell].BagSlot = HealBot_GetBagSlot(spell);
end end
-- HealBot_FindHealSpells: Maps best heal ranks to UI buttons.
function HealBot_FindHealSpells() function HealBot_FindHealSpells()
local id = 1; local id = 1;
if HealBot_SpellsInitFlag > 0 then NeedEquipUpdate = 1; return; end if HealBot_SpellsInitFlag > 0 then NeedEquipUpdate = 1; return; end
@@ -378,9 +502,11 @@ function HealBot_FindHealSpells()
HealBot_CalcEquipBonus = false; HealBot_CalcEquipBonus = false;
end end
-- HealBot_CanCastSpell: Internal utility: HealBot_CanCastSpell
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);
@@ -391,31 +517,59 @@ function HealBot_CanCastSpell(spell, unit)
return true; return true;
end end
-- HealBot_GetHealSpell: Resolves spell rank based on health deficit.
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_ActiveShapeshiftStance and HealBot_Config.AutoUnshift ~= 1 then return nil end; if HealBot_GetShapeshiftForm() and HealBot_Config.AutoUnshift ~= 1 then return nil end;
end end
local spell = HealBot_GetSpellName(HealBot_GetSpellId(pattern))
-- Handle Inline Scripts
if string.sub(pattern, 1, 1) == "/" then
return pattern;
end
-- Handle Spells
if HealBot_Spells[pattern] or HealBot_GetSpellId(pattern) then
local spell = HealBot_GetSpellName(HealBot_GetSpellId(pattern)) or pattern
local range = 40; local range = 40;
if HealBot_Spells[spell] then if HealBot_Spells[spell] then
if not HealBot_CanCastSpell(spell, unit) then return nil end; if not HealBot_CanCastSpell(spell, unit) then return nil end;
range = HealBot_Spells[spell].range; range = HealBot_Spells[spell].range or 40;
end end
if HealBot_Range_Check(unit, range) == 0 then return nil end; if HealBot_Range_Check(unit, range) == 0 then return nil end;
return spell; return spell;
end 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
-- HealBot_HealUnit: Main entry point for healing a unit.
function HealBot_HealUnit(unit, pattern) function HealBot_HealUnit(unit, pattern)
HealBot_CastSpellOnFriend(HealBot_GetHealSpell(unit, pattern), unit); HealBot_CastSpellOnFriend(HealBot_GetHealSpell(unit, pattern), unit);
end end
-- HealBot_RecalcHeals: Flags unit for visual refresh.
function HealBot_RecalcHeals(unit) function HealBot_RecalcHeals(unit)
HealBot_Action_Refresh(unit); HealBot_Action_Refresh(unit);
end end
-- HealBot_RecalcParty: Triggers group layout rebuild.
function HealBot_RecalcParty() function HealBot_RecalcParty()
HealBot_Action_PartyChanged(); HealBot_Action_PartyChanged();
if HealBot_Action_HealButtons then if HealBot_Action_HealButtons then
@@ -428,25 +582,56 @@ function HealBot_RecalcParty()
HealBot_Action_RefreshButtons(); HealBot_Action_RefreshButtons();
end end
-- HealBot_RecalcSpells: Recalculates spells and updates layout.
function HealBot_RecalcSpells() function HealBot_RecalcSpells()
HealBot_FindHealSpells(); HealBot_FindHealSpells();
HealBot_RecalcParty(); HealBot_RecalcParty();
end end
-- HealBot_GetTalentRank: Internal utility: HealBot_GetTalentRank
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
-- HealBot_SpiBonus: Internal utility: HealBot_SpiBonus
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
local spiGuideBonus = stat * 0.05;
heals_modifer = heals_modifer + (currRank * spiGuideBonus); heals_modifer = heals_modifer + (currRank * spiGuideBonus);
end
return heals_modifer; return heals_modifer;
end end
-- HealBot_GetBonus: Internal utility: HealBot_GetBonus
function HealBot_GetBonus() function HealBot_GetBonus()
local HealBonus = HealBot_BonusScanner:GetBonus(); local HealBonus = 0;
if HealBot_Integrations_ClassicAPI_Active and GetSpellBonusHealing then
HealBonus = GetSpellBonusHealing() or 0;
else
HealBonus = HealBot_BonusScanner:GetBonus() or 0;
end
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
-- HealBot_InitSpells: Scans spellbook to find available heals.
function HealBot_InitSpells() function HealBot_InitSpells()
local id = 1 local id = 1
local cnt = 0; local cnt = 0;
@@ -465,12 +650,11 @@ 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
-- HealBot_InitGetSpellData: Extracts mana and cast time from spell tooltips.
function HealBot_InitGetSpellData(spell, id, class) function HealBot_InitGetSpellData(spell, id, class)
local i, _mana, _cast, _HealsMin, _HealsMax, _HealsExt, _duration, _range, _shield, _channel; local i, _mana, _cast, _HealsMin, _HealsMax, _HealsExt, _duration, _range, _shield, _channel;
local tooltip = getglobal("HealBot_ScanTooltip"); local tooltip = getglobal("HealBot_ScanTooltip");
@@ -482,47 +666,47 @@ function HealBot_InitGetSpellData(spell, id, class)
HealBot_ScanTooltip:SetOwner(HealBot_ScanTooltip, "ANCHOR_NONE") HealBot_ScanTooltip:SetOwner(HealBot_ScanTooltip, "ANCHOR_NONE")
HealBot_ScanTooltip:SetSpell(id, BOOKTYPE_SPELL); HealBot_ScanTooltip:SetSpell(id, BOOKTYPE_SPELL);
tmpText = getglobal("HealBot_ScanTooltipTextLeft2"); _mana = 0;
if (tmpText:GetText()) then _range = 40;
line = tmpText:GetText();
tmpTest, tmpTest, _mana = string.find(line, HEALBOT_TOOLTIP_MANA);
else
HealBot_Report_Error("================================");
HealBot_Report_Error("ERROR: HealBot_ScanTooltip is lost");
HealBot_Report_Error("ERROR: If BonusScanner is used, try disabling BonusScanner");
end
tmpText = getglobal("HealBot_ScanTooltipTextRight2");
if (tmpText:GetText()) then
line = tmpText:GetText();
tmpTest, tmpTest, _range = string.find(line, HEALBOT_TOOLTIP_RANGE);
else
HealBot_Report_Error("================================");
HealBot_Report_Error("ERROR: HealBot_ScanTooltip is lost");
HealBot_Report_Error("ERROR: If BonusScanner is used, try disabling BonusScanner");
end
tmpText = getglobal("HealBot_ScanTooltipTextLeft3");
_cast = nil;
if (tmpText:GetText()) then
line = tmpText:GetText();
if (line == HEALBOT_TOOLTIP_INSTANT_CAST) then
_cast = 0; _cast = 0;
elseif line == HEALBOT_TOOLTIP_CHANNELED then line = nil;
for lineNum = 2, 6 do
local lText = getglobal("HealBot_ScanTooltipTextLeft"..lineNum);
if lText and lText:IsVisible() and lText:GetText() then
local txt = lText:GetText();
local t1, t2, match;
t1, t2, match = string.find(txt, HEALBOT_TOOLTIP_MANA);
if match then _mana = match; end
if txt == HEALBOT_TOOLTIP_INSTANT_CAST or txt == "Instant" then
_cast = 0;
elseif txt == HEALBOT_TOOLTIP_CHANNELED then
_cast = 0; _cast = 0;
elseif (tmpText) then
tmpTest, tmpTest, _cast = string.find(line, HEALBOT_TOOLTIP_CAST_TIME);
end
else else
HealBot_Report_Error("================================"); t1, t2, match = string.find(txt, HEALBOT_TOOLTIP_CAST_TIME);
HealBot_Report_Error("ERROR: HealBot_ScanTooltip is lost"); if match then _cast = match; end
HealBot_Report_Error("ERROR: If BonusScanner is used, try disabling BonusScanner"); end
t1, t2, match = string.find(txt, HEALBOT_TOOLTIP_RANGE);
if match then _range = match; end
if not string.find(txt, HEALBOT_TOOLTIP_MANA) and txt ~= HEALBOT_TOOLTIP_INSTANT_CAST and txt ~= "Instant" and txt ~= HEALBOT_TOOLTIP_CHANNELED and not string.find(txt, HEALBOT_TOOLTIP_CAST_TIME) and not string.find(txt, HEALBOT_TOOLTIP_RANGE) then
if not line then line = txt; end
end
end
local rText = getglobal("HealBot_ScanTooltipTextRight"..lineNum);
if rText and rText:IsVisible() and rText:GetText() then
local txt = rText:GetText();
local t1, t2, match;
t1, t2, match = string.find(txt, HEALBOT_TOOLTIP_RANGE);
if match then _range = match; end
end
end end
tmpText = getglobal("HealBot_ScanTooltipTextLeft4");
tmpTest = nil; tmpTest = nil;
if (tmpText:GetText()) then if line then
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, HEALBOT_SPELL_PATTERN_SHIELD); tmpTest, tmpTest, _HealsMin, _shield = string.find(line, HEALBOT_SPELL_PATTERN_SHIELD);
@@ -660,6 +844,7 @@ function HealBot_InitGetSpellData(spell, id, class)
end end
end end
-- HealBot_Generic_Patten: Internal utility: HealBot_Generic_Patten
function HealBot_Generic_Patten(matchStr, matchPattern) function HealBot_Generic_Patten(matchStr, matchPattern)
local tmpTest, _HealsMin, _HealsMax, _HealsExt, _duration local tmpTest, _HealsMin, _HealsMax, _HealsExt, _duration
tmpTest, tmpTest, _HealsMin, _HealsMax = string.find(matchStr, matchPattern); tmpTest, tmpTest, _HealsMin, _HealsMax = string.find(matchStr, matchPattern);
@@ -672,12 +857,12 @@ function HealBot_Generic_Patten(matchStr, matchPattern)
return tmpTest, _HealsMin, _HealsMax; return tmpTest, _HealsMin, _HealsMax;
end end
HealBot_ActiveShapeshiftStance = nil; -- HealBot_UpdateShapeshiftForm: Called on UPDATE_SHAPESHIFT_FORM
function HealBot_UpdateShapeshiftForm() function HealBot_UpdateShapeshiftForm()
HealBot_ActiveShapeshiftStance = HealBot_GetShapeshiftForm(); -- Deprecated
end end
-- HealBot_GetShapeshiftForm: Detects active druid form to prevent invalid casts.
function HealBot_GetShapeshiftForm() function HealBot_GetShapeshiftForm()
local forms = GetNumShapeshiftForms(); local forms = GetNumShapeshiftForms();
if forms then if forms then
@@ -685,12 +870,9 @@ function HealBot_GetShapeshiftForm()
for i=1,forms do for i=1,forms do
local icon,name,active = GetShapeshiftFormInfo(i); local icon,name,active = GetShapeshiftFormInfo(i);
if active then 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; return i;
end end
end end
end end
end
return nil; return nil;
end end
+59 -24
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,
@@ -13,8 +27,9 @@ HealBot_ConfigDefaults = {
ActionVisible = 1, ActionVisible = 1,
HideSolo = 0, HideSolo = 0,
OverHeal = 0.25, OverHeal = 0.25,
CastNotify = 1, UpdateFreq = 0.5,
AutoUnshift = 1, AutoUnshift = 1,
Integrations_Nampower_Active = true,
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" },
@@ -35,14 +50,14 @@ HealBot_ConfigDefaults = {
ShowDebuffWarning = 0, ShowDebuffWarning = 0,
SoundDebuffWarning = 0, SoundDebuffWarning = 0,
SoundDebuffPlay = 1, SoundDebuffPlay = 1,
CDCMonitor = 1, CDCMonitor = 2,
PanelAnchorX = -1, PanelAnchorX = -1,
PanelAnchorY = -1, PanelAnchorY = -1,
CDCBarColour = { CDCBarColour = {
[HEALBOT_DISEASE_en] = { R = 0.1, G = 0.05, B = 0.2, }, [HEALBOT_DISEASE_en] = { R = 0.55, G = 0.19, B = 0.70, }, -- Bright Purple
[HEALBOT_MAGIC_en] = { R = 0.05, G = 0.05, B = 0.1, }, [HEALBOT_MAGIC_en] = { R = 0.01, G = 0.30, B = 0.90, }, -- Bright Blue
[HEALBOT_POISON_en] = { R = 0.05, G = 0.2, B = 0.1, }, [HEALBOT_POISON_en] = { R = 0.12, G = 0.46, B = 0.24, }, -- Bright Green
[HEALBOT_CURSE_en] = { R = 0.2, G = 0.05, B = 0.05, }, [HEALBOT_CURSE_en] = { R = 0.83, G = 0.01, B = 0.01, }, -- Bright Red
}, },
Debuff_Left = { Debuff_Left = {
@@ -181,7 +196,17 @@ HealBot_ConfigDefaults = {
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},
@@ -222,6 +247,7 @@ HealBot_ConfigDefaults = {
bpadding = {[HEALBOT_SKINS_STD] = 10, ["HealBot Party"] = 10, ["HealBot Raid"] = 10, ["Alteric Valley"] = 10, ["Modern Flat"] = 10}, bpadding = {[HEALBOT_SKINS_STD] = 10, ["HealBot Party"] = 10, ["HealBot Raid"] = 10, ["Alteric Valley"] = 10, ["Modern Flat"] = 10},
bboffset = {[HEALBOT_SKINS_STD] = 16, ["HealBot Party"] = 16, ["HealBot Raid"] = 16, ["Alteric Valley"] = 16, ["Modern Flat"] = 3}, bboffset = {[HEALBOT_SKINS_STD] = 16, ["HealBot Party"] = 16, ["HealBot Raid"] = 16, ["Alteric Valley"] = 16, ["Modern Flat"] = 3},
bfontoutline = {[HEALBOT_SKINS_STD] = 0, ["HealBot Party"] = 0, ["HealBot Raid"] = 0, ["Alteric Valley"] = 0, ["Modern Flat"] = 1}, bfontoutline = {[HEALBOT_SKINS_STD] = 0, ["HealBot Party"] = 0, ["HealBot Raid"] = 0, ["Alteric Valley"] = 0, ["Modern Flat"] = 1},
biconsize = {[HEALBOT_SKINS_STD] = 12, ["HealBot Party"] = 12, ["HealBot Raid"] = 12, ["Alteric Valley"] = 12, ["Modern Flat"] = 12},
ShowTooltip = 1, ShowTooltip = 1,
ShowManaBars = 0, ShowManaBars = 0,
ManaBarsHealersOnly = 0, ManaBarsHealersOnly = 0,
@@ -230,15 +256,14 @@ HealBot_ConfigDefaults = {
Tooltip_Recommend = 1, Tooltip_Recommend = 1,
TooltipPos = 1, TooltipPos = 1,
HideParty = 0, HideParty = 0,
HealBot_Integrations_UnitXP = 0,
HealBot_Integrations_Nampower = 0,
HealBot_Integrations_SuperWoW = 0,
HealBot_Integrations_ClassicAPI = 0,
}; };
HealBot_Config = {}; HealBot_Config = {};
--HealBot_EmergIncMelee = {};
--HealBot_EmergIncRange = {};
--HealBot_EmergIncHealers = {};
--HealBot_EmergIncCustom = {};
--HealBot_KeyCombo = {};
HealBot_HealsIn = {}; HealBot_HealsIn = {};
HealBot_Healers = {}; HealBot_Healers = {};
HealBot_UnitDebuff = {}; HealBot_UnitDebuff = {};
@@ -250,18 +275,6 @@ HEALBOT_ADDON_ID="HealBot_Heals"
HealBot_AbortButton=1; HealBot_AbortButton=1;
HealBot_Groups = {
["ITEMS"] = {
HEALBOT_BANDAGES,
HEALBOT_HEALING_POTIONS,
HEALBOT_HEALTHSTONES,
},
["PALADIN"] = {
HEALBOT_HOLY_LIGHT,
HEALBOT_FLASH_OF_LIGHT,
},
}
HealBot_Spells = { HealBot_Spells = {
-- Cast = secs until effect starts -- Cast = secs until effect starts
-- Channel = secs until caster available -- Channel = secs until caster available
@@ -545,7 +558,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 = {};
@@ -559,3 +572,25 @@ HealBot_SpamCnt=0;
HealBot_Action_TooltipUnit=nil; HealBot_Action_TooltipUnit=nil;
HealBot_Ressing = {}; HealBot_Ressing = {};
HealBot_IamRessing = false; HealBot_IamRessing = false;
-- Table Recycling Pool
local tablePool = {}
-- HealBot_GetTable: Internal utility: HealBot_GetTable
function HealBot_GetTable()
local t = table.remove(tablePool)
if not t then
t = {}
end
return t
end
-- HealBot_ReleaseTable: Internal utility: HealBot_ReleaseTable
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
+6
View File
@@ -1,7 +1,9 @@
-- HealBot_Errors_OnLoad: Internal utility: HealBot_Errors_OnLoad
function HealBot_Errors_OnLoad(this) function HealBot_Errors_OnLoad(this)
-- do nothing -- do nothing
end end
-- HealBot_Errors_OnShow: Show event handler.
function HealBot_Errors_OnShow(this) function HealBot_Errors_OnShow(this)
local client = getglobal("HealBot_Error_Clientx") local client = getglobal("HealBot_Error_Clientx")
client:SetText("Client="..GetLocale()) client:SetText("Client="..GetLocale())
@@ -9,6 +11,7 @@ function HealBot_Errors_OnShow(this)
HealBot_Error_Classx:SetText("Player class="..HealBot_UnitClass("player")) HealBot_Error_Classx:SetText("Player class="..HealBot_UnitClass("player"))
end end
-- HealBot_Errors_OnHide: Hide event handler.
function HealBot_Errors_OnHide(this) function HealBot_Errors_OnHide(this)
local errtext; local errtext;
HealBot_StopMoving(this); HealBot_StopMoving(this);
@@ -19,14 +22,17 @@ function HealBot_Errors_OnHide(this)
HealBot_ErrorCnt=0; HealBot_ErrorCnt=0;
end end
-- HealBot_Errors_OnDragStart: Internal utility: HealBot_Errors_OnDragStart
function HealBot_Errors_OnDragStart(this,arg1) function HealBot_Errors_OnDragStart(this,arg1)
HealBot_StartMoving(this); HealBot_StartMoving(this);
end end
-- HealBot_Errors_OnDragStop: Internal utility: HealBot_Errors_OnDragStop
function HealBot_Errors_OnDragStop(this) function HealBot_Errors_OnDragStop(this)
HealBot_StopMoving(this); HealBot_StopMoving(this);
end end
-- HealBot_ErrorsIn: Internal utility: HealBot_ErrorsIn
function HealBot_ErrorsIn(msg,id) function HealBot_ErrorsIn(msg,id)
local errtext = getglobal("HealBot_Error"..id); local errtext = getglobal("HealBot_Error"..id);
errtext:SetText(msg) errtext:SetText(msg)
+125
View File
@@ -0,0 +1,125 @@
HealBot_Integrations_UnitXP_Active = false;
HealBot_Integrations_Nampower_Active = false;
HealBot_Integrations_SuperWoW_Active = false;
HealBot_Integrations_ClassicAPI_Active = false;
-- HealBot_GetUnitGUID: Internal utility: HealBot_GetUnitGUID
function HealBot_GetUnitGUID(unit)
if not unit then return nil end
if HealBot_Integrations_ClassicAPI_Active and UnitGUID then
return UnitGUID(unit)
elseif HealBot_Integrations_SuperWoW_Active and GetUnitGUID then
return GetUnitGUID(unit)
end
return nil
end
-- HealBot_Integrations_Toggle: Enables or disables external addon APIs on load/click.
function HealBot_Integrations_Toggle()
-- UnitXP
if HealBot_Config.HealBot_Integrations_UnitXP == 1 and UnitXP ~= nil then
HealBot_Integrations_UnitXP_Active = true;
HealBot_AddDebug("UnitXP Integration: ENABLED");
else
HealBot_Integrations_UnitXP_Active = false;
HealBot_AddDebug("UnitXP Integration: DISABLED");
end
-- nampower
if HealBot_Config.HealBot_Integrations_Nampower == 1 then
HealBot_Integrations_Nampower_Active = true;
HealBot_AddDebug("nampower Integration: ENABLED");
if not HealBot_NampowerFrame then
HealBot_Nampower_Auras = {}
HealBot_NampowerFrame = CreateFrame("Frame")
HealBot_NampowerFrame:RegisterEvent("AURA_CAST_ON_SELF")
HealBot_NampowerFrame:RegisterEvent("AURA_CAST_ON_OTHER")
HealBot_NampowerFrame:SetScript("OnEvent", function()
if not HealBot_Integrations_Nampower_Active then return end
local spellID, caster, target, _, _, _, _, duration = arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8
if not caster or not target or duration <= 0 then return end
local spellName = GetSpellRecField(spellID, "name")
if not spellName then return end
if not HealBot_Nampower_Auras[target] then
HealBot_Nampower_Auras[target] = {}
end
local expirationTime = GetTime() + (duration / 1000)
HealBot_Nampower_Auras[target][spellName] = expirationTime
local unitID = HealBot_Model:GetUnitIDByName(target)
if unitID then
HealBot_OnEvent_UnitAura(nil, unitID)
end
end)
end
else
HealBot_Integrations_Nampower_Active = false;
HealBot_AddDebug("nampower Integration: DISABLED");
if HealBot_Nampower_Auras then
for k in pairs(HealBot_Nampower_Auras) do
HealBot_Nampower_Auras[k] = nil
end
end
end
function HealBot_Integrations_PruneNampower()
if not HealBot_Integrations_Nampower_Active or not HealBot_Nampower_Auras then return end
local currentTime = GetTime()
for targetName, auras in pairs(HealBot_Nampower_Auras) do
-- Check if target is still in the raid/party
if not HealBot_Model:GetUnitIDByName(targetName) then
HealBot_Nampower_Auras[targetName] = nil
else
-- Prune expired auras
local hasAuras = false
for spellName, expiration in pairs(auras) do
if currentTime > expiration then
auras[spellName] = nil
else
hasAuras = true
end
end
if not hasAuras then
HealBot_Nampower_Auras[targetName] = nil
end
end
end
end
-- SuperWoW
if HealBot_Config.HealBot_Integrations_SuperWoW == 1 and UnitExists ~= nil then
-- We can check if GetUnitGUID exists as a quick SuperWoW test, or UnitExists returns 2 args
-- Actually SuperWoW adds SpellInfo, or we can just rely on GetUnitGUID if it exists in the environment
if GetUnitGUID or (type(UnitExists) == "function") then
-- If the client actually supports GUID tracking via SuperWoW (or a similar mod)
HealBot_Integrations_SuperWoW_Active = true;
HealBot_AddDebug("SuperWoW Integration: ENABLED");
else
HealBot_Integrations_SuperWoW_Active = false;
HealBot_AddDebug("SuperWoW Integration: DISABLED (Mod Not Found)");
end
else
HealBot_Integrations_SuperWoW_Active = false;
HealBot_AddDebug("SuperWoW Integration: DISABLED");
end
-- ClassicAPI
if HealBot_Config.HealBot_Integrations_ClassicAPI == 1 then
if UnitGUID then
HealBot_Integrations_ClassicAPI_Active = true;
HealBot_AddDebug("ClassicAPI Integration: ENABLED");
else
HealBot_Integrations_ClassicAPI_Active = false;
HealBot_AddDebug("ClassicAPI Integration: DISABLED (Mod Not Found)");
end
else
HealBot_Integrations_ClassicAPI_Active = false;
HealBot_AddDebug("ClassicAPI Integration: DISABLED");
end
end
+6 -3
View File
@@ -1,4 +1,4 @@
HEALBOT_VERSION = "1.4"; HEALBOT_VERSION = GetAddOnMetadata("HealBotBlue", "Version");
------------- -------------
-- ENGLISH -- -- ENGLISH --
@@ -310,6 +310,7 @@ HEALBOT_OPTIONS_CDCLEFT = "Alt+Left";
HEALBOT_OPTIONS_CDCRIGHT = "Alt+Right"; HEALBOT_OPTIONS_CDCRIGHT = "Alt+Right";
HEALBOT_OPTIONS_CDCBARS = "Healthbar colours"; HEALBOT_OPTIONS_CDCBARS = "Healthbar colours";
HEALBOT_OPTIONS_CDCCLASS = "Monitor classes"; HEALBOT_OPTIONS_CDCCLASS = "Monitor classes";
HEALBOT_OPTIONS_CDCSHOWALLDEBUFFS = "Track All Debuffs";
HEALBOT_OPTIONS_CDCWARNINGS = "Debuff warnings"; HEALBOT_OPTIONS_CDCWARNINGS = "Debuff warnings";
HEALBOT_OPTIONS_USEBUTTONS = "Define spells"; HEALBOT_OPTIONS_USEBUTTONS = "Define spells";
HEALBOT_OPTIONS_CDC = "Cure/Dispel/Cleanse for"; HEALBOT_OPTIONS_CDC = "Cure/Dispel/Cleanse for";
@@ -320,12 +321,14 @@ HEALBOT_OPTIONS_SOUND2 = "Sound 2"
HEALBOT_OPTIONS_SOUND3 = "Sound 3" HEALBOT_OPTIONS_SOUND3 = "Sound 3"
HEALBOT_OPTIONS_HEAL_BUTTONS = "Healing bars"; HEALBOT_OPTIONS_HEAL_BUTTONS = "Healing bars";
HEALBOT_OPTIONS_EMERGFILTER = "Show extra bars for"; HEALBOT_OPTIONS_EMERGFILTER = "Show raid 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";
HEALBOT_OPTIONS_PETHEALS = "Pets";
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"
+111 -2
View File
@@ -15,6 +15,7 @@ function HealBot_UIDropDownMenu_SetSelectedID(frame, id, useValue)
end end
end end
-- HealBot_UIDropDownMenu_SetSelectedValue: Internal utility: HealBot_UIDropDownMenu_SetSelectedValue
function HealBot_UIDropDownMenu_SetSelectedValue(frame, value, useValue) function HealBot_UIDropDownMenu_SetSelectedValue(frame, value, useValue)
local wasNil = false local wasNil = false
if not UIDROPDOWNMENU_OPEN_MENU then if not UIDROPDOWNMENU_OPEN_MENU then
@@ -35,7 +36,11 @@ HealBot_Model = {
partyMembers = {}, partyMembers = {},
raidMembers = {}, raidMembers = {},
playerPet = nil, playerPet = nil,
target = nil target = nil,
-- Integration maps
unitGUIDs = {}, -- unit -> GUID
guidUnits = {} -- GUID -> unit
} }
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
@@ -51,6 +56,7 @@ HealBot_Model = {
-- "EQUIPMENT_CHANGED" -- "EQUIPMENT_CHANGED"
-- "INCOMING_HEAL_CHANGED" -- "INCOMING_HEAL_CHANGED"
-- HealBot_Model:RegisterObserver: Registers an observer callback for an event.
function HealBot_Model:RegisterObserver(event, callback) function HealBot_Model:RegisterObserver(event, callback)
if not self.observers[event] then if not self.observers[event] then
self.observers[event] = {} self.observers[event] = {}
@@ -58,6 +64,7 @@ function HealBot_Model:RegisterObserver(event, callback)
table.insert(self.observers[event], callback) table.insert(self.observers[event], callback)
end end
-- HealBot_Model:NotifyObservers: Fires all registered callbacks for an event.
function HealBot_Model:NotifyObservers(event, unitID, arg1, arg2) function HealBot_Model:NotifyObservers(event, unitID, arg1, arg2)
if self.observers[event] then if self.observers[event] then
local len = table.getn(self.observers[event]) local len = table.getn(self.observers[event])
@@ -71,6 +78,7 @@ end
-- Model Initialization -- Model Initialization
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
-- HealBot_Model:Initialize: Pre-allocates the unit state dictionary.
function HealBot_Model:Initialize() function HealBot_Model:Initialize()
self:InitUnitState("player") self:InitUnitState("player")
self:InitUnitState("target") self:InitUnitState("target")
@@ -89,6 +97,7 @@ function HealBot_Model:Initialize()
end end
end end
-- HealBot_Model:InitUnitState: Internal utility: HealBot_Model:InitUnitState
function HealBot_Model:InitUnitState(unit) function HealBot_Model:InitUnitState(unit)
if not self.units[unit] then if not self.units[unit] then
self.units[unit] = { self.units[unit] = {
@@ -131,18 +140,118 @@ function HealBot_Model:UpdateUnitIdentity(unit)
if not self.units[unit] then return false end if not self.units[unit] then return false end
local oldName = self.units[unit].name local oldName = self.units[unit].name
local oldEnglishClass = self.units[unit].englishClass
local name = UnitName(unit) local name = UnitName(unit)
local _, englishClass = UnitClass(unit) local _, englishClass = UnitClass(unit)
if oldName ~= name then if oldName ~= name or oldEnglishClass ~= englishClass then
self.units[unit].name = name self.units[unit].name = name
self.units[unit].englishClass = englishClass self.units[unit].englishClass = englishClass
self.units[unit].class = UnitClass(unit) self.units[unit].class = UnitClass(unit)
if (HealBot_Integrations_SuperWoW_Active or HealBot_Integrations_ClassicAPI_Active) and HealBot_GetUnitGUID then
local guid = HealBot_GetUnitGUID(unit)
if guid and guid ~= "0" and guid ~= "0x0000000000000000" then
self.unitGUIDs[unit] = guid
self.guidUnits[guid] = unit
end
end
return true -- Identity changed return true -- Identity changed
end end
return false return false
end end
-- HealBot_Model:GetUnitByGUID: Internal utility: HealBot_Model:GetUnitByGUID
function HealBot_Model:GetUnitByGUID(guid)
if not guid then return nil end
return self.guidUnits[guid]
end
-- HealBot_Model:GetUnitIDByName: Looks up a group unit token by player name.
function HealBot_Model:GetUnitIDByName(name)
if not name then return nil end
for unit, data in pairs(self.units) do
if data.name == name then return unit end
end
return nil
end
-- HealBot_Model:PreserveStateByGUID: Preserves icon and debuff state when group indices shift during combat.
function HealBot_Model:PreserveStateByGUID()
if not (HealBot_Integrations_SuperWoW_Active or HealBot_Integrations_ClassicAPI_Active) or not HealBot_GetUnitGUID then return end
local oldGUIDs = {}
for unit, guid in pairs(self.unitGUIDs) do
if string.find(unit, "^party") or string.find(unit, "^raid") or unit == "player" or unit == "pet" then
oldGUIDs[unit] = guid
end
end
local newUnitForGUID = {}
-- Scan the new roster
for _, unit in ipairs(self.partyMembers) do
local guid = HealBot_GetUnitGUID(unit)
if guid and guid ~= "0" and guid ~= "0x0000000000000000" then
newUnitForGUID[guid] = unit
self.unitGUIDs[unit] = guid
self.guidUnits[guid] = unit
end
end
for _, unit in ipairs(self.raidMembers) do
local guid = HealBot_GetUnitGUID(unit)
if guid and guid ~= "0" and guid ~= "0x0000000000000000" then
newUnitForGUID[guid] = unit
self.unitGUIDs[unit] = guid
self.guidUnits[guid] = unit
end
end
local stateSwaps = {}
local iconSwaps = {}
local missingBuffSwaps = {}
local debuffSwaps = {}
for oldUnit, guid in pairs(oldGUIDs) do
local newUnit = newUnitForGUID[guid]
if newUnit and newUnit ~= oldUnit then
stateSwaps[newUnit] = self.units[oldUnit]
-- Preserve external global tables if they exist
if HealBot_UnitIcons and HealBot_UnitIcons[oldUnit] then
iconSwaps[newUnit] = HealBot_UnitIcons[oldUnit]
end
if HealBot_MissingBuffs and HealBot_MissingBuffs[oldUnit] ~= nil then
missingBuffSwaps[newUnit] = HealBot_MissingBuffs[oldUnit]
end
if HealBot_UnitDebuff and HealBot_UnitDebuff[oldUnit] ~= nil then
debuffSwaps[newUnit] = HealBot_UnitDebuff[oldUnit]
end
end
end
for targetUnit, stateData in pairs(stateSwaps) do
-- Deep copy to prevent memory aliasing
self.units[targetUnit] = {}
for k, v in pairs(stateData) do
self.units[targetUnit][k] = v
end
self.units[targetUnit].icons = {}
if HealBot_UnitIcons and iconSwaps[targetUnit] then
if not HealBot_UnitIcons[targetUnit] then HealBot_UnitIcons[targetUnit] = {} end
for j=1, 10 do
HealBot_UnitIcons[targetUnit][j] = iconSwaps[targetUnit][j]
end
end
if HealBot_MissingBuffs then
HealBot_MissingBuffs[targetUnit] = missingBuffSwaps[targetUnit]
end
if HealBot_UnitDebuff then
HealBot_UnitDebuff[targetUnit] = debuffSwaps[targetUnit]
end
end
end
-- Updates health/maxHealth values. Returns true if changed. -- Updates health/maxHealth values. Returns true if changed.
function HealBot_Model:UpdateUnitHealth(unit) function HealBot_Model:UpdateUnitHealth(unit)
if not self.units[unit] then return false end if not self.units[unit] then return false end
+28 -6
View File
@@ -7,6 +7,14 @@ HealBot_Options_CurrentPanel = 0;
HealBot_ColourObjWaiting = nil HealBot_ColourObjWaiting = nil
HealBot_Options_EmergencyFilter_List = { HealBot_Options_EmergencyFilter_List = {
HEALBOT_OPTIONS_MONITORALL,
HEALBOT_OPTIONS_MONITORMELEE,
HEALBOT_OPTIONS_MONITORRANGE,
HEALBOT_OPTIONS_MONITORHEALERS,
HEALBOT_OPTIONS_MONITORCUSTOM,
}
HealBot_Options_CDCMonitor_List = {
HEALBOT_OPTIONS_MONITORNO, HEALBOT_OPTIONS_MONITORNO,
HEALBOT_OPTIONS_MONITORALL, HEALBOT_OPTIONS_MONITORALL,
HEALBOT_DRUID, HEALBOT_DRUID,
@@ -18,17 +26,14 @@ HealBot_Options_EmergencyFilter_List = {
HEALBOT_SHAMAN, HEALBOT_SHAMAN,
HEALBOT_WARLOCK, HEALBOT_WARLOCK,
HEALBOT_WARRIOR, HEALBOT_WARRIOR,
HEALBOT_OPTIONS_PETS,
HEALBOT_OPTIONS_MONITORMELEE,
HEALBOT_OPTIONS_MONITORRANGE,
HEALBOT_OPTIONS_MONITORHEALERS,
HEALBOT_OPTIONS_MONITORCUSTOM,
} }
-- HealBot_Options_AddDebug: UI handler for AddDebug options panel.
function HealBot_Options_AddDebug(msg) function HealBot_Options_AddDebug(msg)
HealBot_AddDebug("Options: " .. msg); HealBot_AddDebug("Options: " .. msg);
end end
-- HealBot_Options_Pct_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_Pct_OnLoad(this,text) function HealBot_Options_Pct_OnLoad(this,text)
this.text = text; this.text = text;
getglobal(this:GetName().."Text"):SetText(text); getglobal(this:GetName().."Text"):SetText(text);
@@ -38,6 +43,7 @@ function HealBot_Options_Pct_OnLoad(this,text)
this:SetValueStep(0.01); this:SetValueStep(0.01);
end end
-- HealBot_Options_Pct_OnLoad_MinMax: UI handler for MinMax options panel.
function HealBot_Options_Pct_OnLoad_MinMax(this,text,Min,Max) function HealBot_Options_Pct_OnLoad_MinMax(this,text,Min,Max)
this.text = text; this.text = text;
local MinTxt,MaxTxt local MinTxt,MaxTxt
@@ -52,6 +58,7 @@ function HealBot_Options_Pct_OnLoad_MinMax(this,text,Min,Max)
this:SetValueStep(0.01); this:SetValueStep(0.01);
end end
-- HealBot_Options_val_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_val_OnLoad(this,text,Min,Max) function HealBot_Options_val_OnLoad(this,text,Min,Max)
this.text = text; this.text = text;
@@ -62,6 +69,7 @@ function HealBot_Options_val_OnLoad(this,text,Min,Max)
this:SetValueStep(1); this:SetValueStep(1);
end end
-- HealBot_Options_Pct_OnValueChanged: UI handler for OnValueChanged options panel.
function HealBot_Options_Pct_OnValueChanged(this) function HealBot_Options_Pct_OnValueChanged(this)
local pct = math.floor(this:GetValue()*100+0.5); local pct = math.floor(this:GetValue()*100+0.5);
getglobal(this:GetName().."Text"):SetText(this.text .. " (" .. pct .. "%)"); getglobal(this:GetName().."Text"):SetText(this.text .. " (" .. pct .. "%)");
@@ -117,10 +125,12 @@ end
-- HealBot_Options_CastNotify_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_CastNotify_OnLoad(this,text) function HealBot_Options_CastNotify_OnLoad(this,text)
getglobal(this:GetName().."Text"):SetText(text); getglobal(this:GetName().."Text"):SetText(text);
end end
-- HealBot_Options_CastNotify_OnClick: UI handler for OnClick options panel.
function HealBot_Options_CastNotify_OnClick(this,id) function HealBot_Options_CastNotify_OnClick(this,id)
-- CastNotify UI elements were removed and replaced by Custom Chat Messages -- CastNotify UI elements were removed and replaced by Custom Chat Messages
end end
@@ -158,6 +168,7 @@ end
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
-- HealBot_Returned_Colours: Internal utility: HealBot_Returned_Colours
function HealBot_Returned_Colours() function HealBot_Returned_Colours()
local A = OpacitySliderFrame:GetValue(); local A = OpacitySliderFrame:GetValue();
A = ((0-A)+1); A = ((0-A)+1);
@@ -199,6 +210,7 @@ function HealBot_Returned_Colours()
HealBot_SetSkinColours() HealBot_SetSkinColours()
HealBot_SetCDCBarColours() HealBot_SetCDCBarColours()
end end
-- HealBot_UseColourPick: Internal utility: HealBot_UseColourPick
function HealBot_UseColourPick(R, G, B, A) function HealBot_UseColourPick(R, G, B, A)
if ColorPickerFrame:IsVisible() then if ColorPickerFrame:IsVisible() then
ColorPickerFrame:Hide(); ColorPickerFrame:Hide();
@@ -219,6 +231,7 @@ function HealBot_UseColourPick(R, G, B, A)
end end
return ColorPickerFrame:GetColorRGB(); return ColorPickerFrame:GetColorRGB();
end end
-- HealBot_Options_Defaults_OnClick: UI handler for OnClick options panel.
function HealBot_Options_Defaults_OnClick(this) function HealBot_Options_Defaults_OnClick(this)
HealBot_Options_CastNotify_OnClick(nil,0); HealBot_Options_CastNotify_OnClick(nil,0);
-- HealBot_Config = HealBot_ConfigDefaults; -- HealBot_Config = HealBot_ConfigDefaults;
@@ -230,15 +243,17 @@ function HealBot_Options_Defaults_OnClick(this)
HealBot_Action_Reset(); HealBot_Action_Reset();
HealBot_Config.ActionVisible = HealBot_Action:IsVisible(); HealBot_Config.ActionVisible = HealBot_Action:IsVisible();
end end
-- HealBot_Options_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_OnLoad(this) function HealBot_Options_OnLoad(this)
table.insert(UISpecialFrames,this:GetName()); table.insert(UISpecialFrames,this:GetName());
-- Tabs -- Tabs
PanelTemplates_SetNumTabs(this,7); PanelTemplates_SetNumTabs(this,9);
this.selectedTab = 1; this.selectedTab = 1;
PanelTemplates_UpdateTabs(this); PanelTemplates_UpdateTabs(this);
HealBot_Options_ShowPanel(this.selectedTab); HealBot_Options_ShowPanel(this.selectedTab);
end end
-- HealBot_Options_OnShow: UI handler for OnShow options panel.
function HealBot_Options_OnShow(this) function HealBot_Options_OnShow(this)
HealBot_Skins = HealBot_Config.Skins; HealBot_Skins = HealBot_Config.Skins;
HealBot_Options_SetSkins() HealBot_Options_SetSkins()
@@ -306,14 +321,20 @@ function HealBot_Options_OnShow(this)
HealBot_Options_SetChatMessages(); HealBot_Options_SetChatMessages();
HealBot_Options_ShowPanel(this.selectedTab or 1); HealBot_Options_ShowPanel(this.selectedTab or 1);
end end
-- HealBot_Options_SetSkins: UI handler for SetSkins options panel.
function HealBot_Options_SetSkins() function HealBot_Options_SetSkins()
HealBot_Options_Skins_Refresh() HealBot_Options_Skins_Refresh()
HealBot_Options_BarAlpha:SetValue(HealBot_Config.Barcola[HealBot_Config.Current_Skin]); HealBot_Options_BarAlpha:SetValue(HealBot_Config.Barcola[HealBot_Config.Current_Skin]);
HealBot_Options_BarAlphaInHeal:SetValue(HealBot_Config.BarcolaInHeal[HealBot_Config.Current_Skin]); HealBot_Options_BarAlphaInHeal:SetValue(HealBot_Config.BarcolaInHeal[HealBot_Config.Current_Skin]);
HealBot_Options_BarTextureS:SetValue(HealBot_Config.btexture[HealBot_Config.Current_Skin]) HealBot_Options_BarTextureS:SetValue(HealBot_Config.btexture[HealBot_Config.Current_Skin])
HealBot_Options_BarHeightS:SetValue(HealBot_Config.bheight[HealBot_Config.Current_Skin]) HealBot_Options_BarHeightS:SetValue(HealBot_Config.bheight[HealBot_Config.Current_Skin])
HealBot_Options_AbortBarSize:SetValue(HealBot_Config.abortsize[HealBot_Config.Current_Skin])
HealBot_Options_FontHeight:SetValue(HealBot_Config.btextheight[HealBot_Config.Current_Skin])
HealBot_Options_IconSizeS:SetValue(HealBot_Config.biconsize[HealBot_Config.Current_Skin] or 12)
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)
@@ -340,6 +361,7 @@ function HealBot_Options_SetSkins()
HealBot_Options_DeleteSkin:Enable(); HealBot_Options_DeleteSkin:Enable();
end end
end end
-- HealBot_Options_ShowPanel: UI handler for ShowPanel options panel.
function HealBot_Options_ShowPanel(id) function HealBot_Options_ShowPanel(id)
if HealBot_Options_CurrentPanel>0 then if HealBot_Options_CurrentPanel>0 then
local panel = getglobal("HealBot_Options_Panel"..HealBot_Options_CurrentPanel); local panel = getglobal("HealBot_Options_Panel"..HealBot_Options_CurrentPanel);
+9 -22
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="540" y="455"/>
</Size> </Size>
<Anchors> <Anchors>
<Anchor point="CENTER"> <Anchor point="CENTER">
@@ -121,7 +121,7 @@
<Texture name="HealBot_Options_Header" <Texture name="HealBot_Options_Header"
file="Interface\DialogFrame\UI-DialogBox-Header"> file="Interface\DialogFrame\UI-DialogBox-Header">
<Size> <Size>
<AbsDimension x="400" y="64"/> <AbsDimension x="450" y="64"/>
</Size> </Size>
<Anchors> <Anchors>
<Anchor point="TOP"> <Anchor point="TOP">
@@ -206,38 +206,25 @@
</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>
<Button name="HealBot_Options_CloseButton" inherits="UIPanelButtonTemplate" text="HEALBOT_OPTIONS_CLOSE"> <Button name="HealBot_OptionsTab9" inherits="HealBot_Options_Tab" id="9" text="Extras">
<Size>
<AbsDimension x="80" y="22"/>
</Size>
<Anchors> <Anchors>
<Anchor point="BOTTOM" relativePoint="BOTTOM"> <Anchor point="LEFT" relativeTo="HealBot_OptionsTab8" relativePoint="RIGHT">
<Offset> <Offset>
<AbsDimension x="50" y="15"/> <AbsDimension x="-14" y="0" />
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </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>
+86
View File
@@ -0,0 +1,86 @@
-- HealBot_Options_AutoSwap_OnClick: UI handler for OnClick options panel.
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
-- HealBot_Options_Auto_Initialize: UI handler for Initialize options panel.
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
-- HealBot_Options_Auto_OnSelect: UI handler for OnSelect options panel.
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
-- HealBot_Options_Auto_OnShow: UI handler for OnShow options panel.
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>
+13 -5
View File
@@ -1,6 +1,7 @@
-- HealBot Options panel file: HealBot_Options_Buffs.lua -- HealBot Options panel file: HealBot_Options_Buffs.lua
-- Split from original HealBot_Options.lua -- Split from original HealBot_Options.lua
-- HealBot_Options_BuffWatch_OnClick: UI handler for OnClick options panel.
function HealBot_Options_BuffWatch_OnClick(self) function HealBot_Options_BuffWatch_OnClick(self)
local frame = self or this local frame = self or this
HealBot_Config.BuffWatch = frame:GetChecked() or 0; HealBot_Config.BuffWatch = frame:GetChecked() or 0;
@@ -9,13 +10,15 @@ function HealBot_Options_BuffWatch_OnClick(self)
else else
HealBot_Options_BuffWatchInCombat:Enable() HealBot_Options_BuffWatchInCombat:Enable()
end end
HealBot_RecalcParty(); HealBot_Action_RefreshButtons(nil);
end end
-- HealBot_Options_BuffWatchInCombat_OnClick: UI handler for OnClick options panel.
function HealBot_Options_BuffWatchInCombat_OnClick(self) function HealBot_Options_BuffWatchInCombat_OnClick(self)
local frame = self or this local frame = self or this
HealBot_Config.BuffWatchInCombat = frame:GetChecked() or 0; HealBot_Config.BuffWatchInCombat = frame:GetChecked() or 0;
HealBot_RecalcParty(); HealBot_Action_RefreshButtons(nil);
end end
-- HealBot_Options_BuffSelf_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_BuffSelf_OnLoad(self) function HealBot_Options_BuffSelf_OnLoad(self)
local frame = self or this local frame = self or this
getglobal(this:GetName().."Text"):SetText("Self Only") getglobal(this:GetName().."Text"):SetText("Self Only")
@@ -27,6 +30,7 @@ function HealBot_Options_BuffSelf_OnLoad(self)
this:SetChecked(nil) this:SetChecked(nil)
end end
end end
-- HealBot_Options_BuffSelf_OnClick: UI handler for OnClick options panel.
function HealBot_Options_BuffSelf_OnClick(self) function HealBot_Options_BuffSelf_OnClick(self)
local frame = self or this local frame = self or this
local id = this:GetID() local id = this:GetID()
@@ -38,13 +42,15 @@ function HealBot_Options_BuffSelf_OnClick(self)
else else
HealBot_Config.BuffWatchSelf[id] = 0 HealBot_Config.BuffWatchSelf[id] = 0
end end
HealBot_RecalcParty(); HealBot_Action_RefreshButtons(nil);
end end
-- HealBot_Options_Buff_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_Buff_OnLoad(self) function HealBot_Options_Buff_OnLoad(self)
local frame = self or this local frame = self or this
UIDropDownMenu_Initialize(frame, HealBot_Options_Buff_Initialize) UIDropDownMenu_Initialize(frame, HealBot_Options_Buff_Initialize)
UIDropDownMenu_SetWidth(110, frame) UIDropDownMenu_SetWidth(110, frame)
end end
-- HealBot_Options_Buff_Initialize: UI handler for Initialize options panel.
function HealBot_Options_Buff_Initialize() function HealBot_Options_Buff_Initialize()
local myClass = UnitClass("player") local myClass = UnitClass("player")
local info local info
@@ -63,6 +69,7 @@ function HealBot_Options_Buff_Initialize()
end end
end end
end end
-- HealBot_Options_Buff_OnClick: UI handler for OnClick options panel.
function HealBot_Options_Buff_OnClick() function HealBot_Options_Buff_OnClick()
local frameName = UIDROPDOWNMENU_OPEN_MENU local frameName = UIDROPDOWNMENU_OPEN_MENU
local frame = getglobal(frameName) local frame = getglobal(frameName)
@@ -80,8 +87,9 @@ function HealBot_Options_Buff_OnClick()
HealBot_UIDropDownMenu_SetSelectedID(frame, this.value + 1) HealBot_UIDropDownMenu_SetSelectedID(frame, this.value + 1)
UIDropDownMenu_SetText(text, frame) UIDropDownMenu_SetText(text, frame)
HealBot_RecalcParty(); HealBot_Action_RefreshButtons(nil);
end end
-- HealBot_Options_SetBuffs: UI handler for SetBuffs options panel.
function HealBot_Options_SetBuffs() function HealBot_Options_SetBuffs()
local myClass = UnitClass("player") local myClass = UnitClass("player")
if HealBot_Options_BuffWatch then if HealBot_Options_BuffWatch then
@@ -105,7 +113,7 @@ function HealBot_Options_SetBuffs()
HealBot_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_Buff" .. i .. "Self")
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
local isSelf = (HealBot_Config.BuffWatchSelf[i] == 1) local isSelf = (HealBot_Config.BuffWatchSelf[i] == 1)
+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>
+77 -28
View File
@@ -1,15 +1,19 @@
-- HealBot Options panel file: HealBot_Options_CDC.lua -- HealBot Options panel file: HealBot_Options_CDC.lua
-- Split from original HealBot_Options.lua -- Split from original HealBot_Options.lua
-- HealBot_Options_ShowDebuffWarning_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_ShowDebuffWarning_OnLoad(this,text) function HealBot_Options_ShowDebuffWarning_OnLoad(this,text)
getglobal(this:GetName().."Text"):SetText(text); getglobal(this:GetName().."Text"):SetText(text);
end end
-- HealBot_Options_ShowDebuffWarning_OnClick: UI handler for OnClick options panel.
function HealBot_Options_ShowDebuffWarning_OnClick(this) function HealBot_Options_ShowDebuffWarning_OnClick(this)
HealBot_Config.ShowDebuffWarning = this:GetChecked() or 0; HealBot_Config.ShowDebuffWarning = this:GetChecked() or 0;
end end
-- HealBot_Options_SoundDebuffWarning_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_SoundDebuffWarning_OnLoad(this,text) function HealBot_Options_SoundDebuffWarning_OnLoad(this,text)
getglobal(this:GetName().."Text"):SetText(text); getglobal(this:GetName().."Text"):SetText(text);
end end
-- HealBot_Options_SoundDebuffWarning_OnClick: UI handler for OnClick options panel.
function HealBot_Options_SoundDebuffWarning_OnClick(this) function HealBot_Options_SoundDebuffWarning_OnClick(this)
HealBot_Config.SoundDebuffWarning = this:GetChecked() or 0; HealBot_Config.SoundDebuffWarning = this:GetChecked() or 0;
if HealBot_Config.SoundDebuffWarning==0 then if HealBot_Config.SoundDebuffWarning==0 then
@@ -22,9 +26,11 @@ function HealBot_Options_SoundDebuffWarning_OnClick(this)
HealBot_WarningSound3:Enable(); HealBot_WarningSound3:Enable();
end end
end end
-- HealBot_WarningSound_OnLoad: Internal utility: HealBot_WarningSound_OnLoad
function HealBot_WarningSound_OnLoad(this,text) function HealBot_WarningSound_OnLoad(this,text)
getglobal(this:GetName().."Text"):SetText(text); getglobal(this:GetName().."Text"):SetText(text);
end end
-- HealBot_WarningSound_OnClick: Click event handler.
function HealBot_WarningSound_OnClick(this,id) function HealBot_WarningSound_OnClick(this,id)
if HealBot_Config.SoundDebuffPlay>0 then if HealBot_Config.SoundDebuffPlay>0 then
getglobal("HealBot_WarningSound"..HealBot_Config.SoundDebuffPlay):SetChecked(nil); getglobal("HealBot_WarningSound"..HealBot_Config.SoundDebuffPlay):SetChecked(nil);
@@ -37,6 +43,7 @@ function HealBot_WarningSound_OnClick(this,id)
end end
end end
end end
-- HealBot_Options_CDCMonitor_DropDown: UI handler for DropDown options panel.
function HealBot_Options_CDCMonitor_DropDown() function HealBot_Options_CDCMonitor_DropDown()
for i=1, getn(HealBot_Options_EmergencyFilter_List), 1 do for i=1, getn(HealBot_Options_EmergencyFilter_List), 1 do
local info = {}; local info = {};
@@ -45,23 +52,28 @@ function HealBot_Options_CDCMonitor_DropDown()
UIDropDownMenu_AddButton(info); UIDropDownMenu_AddButton(info);
end end
end end
-- HealBot_Options_CDCMonitor_Initialize: UI handler for Initialize options panel.
function HealBot_Options_CDCMonitor_Initialize() function HealBot_Options_CDCMonitor_Initialize()
UIDropDownMenu_Initialize(HealBot_Options_CDCMonitor,HealBot_Options_CDCMonitor_DropDown) UIDropDownMenu_Initialize(HealBot_Options_CDCMonitor,HealBot_Options_CDCMonitor_DropDown)
end end
-- HealBot_Options_CDCMonitor_Refresh: UI handler for Refresh options panel.
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 !
HealBot_UIDropDownMenu_SetSelectedID(HealBot_Options_CDCMonitor,HealBot_Config.CDCMonitor) HealBot_UIDropDownMenu_SetSelectedID(HealBot_Options_CDCMonitor,HealBot_Config.CDCMonitor)
end end
-- HealBot_Options_CDCMonitor_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_CDCMonitor_OnLoad() function HealBot_Options_CDCMonitor_OnLoad()
UIDropDownMenu_Initialize(this, HealBot_Options_CDCMonitor_DropDown) UIDropDownMenu_Initialize(this, HealBot_Options_CDCMonitor_DropDown)
UIDropDownMenu_SetWidth(100, this) UIDropDownMenu_SetWidth(100, this)
end end
-- HealBot_Options_CDCMonitor_OnSelect: UI handler for OnSelect options panel.
function HealBot_Options_CDCMonitor_OnSelect() function HealBot_Options_CDCMonitor_OnSelect()
HealBot_Config.CDCMonitor = this:GetID() HealBot_Config.CDCMonitor = this:GetID()
HealBot_Options_CDCMonitor_Refresh(true) HealBot_Options_CDCMonitor_Refresh(true)
HealBot_Options_CDCMonitor_Reset() HealBot_Options_CDCMonitor_Reset()
end end
-- HealBot_Options_CDCMonitor_Reset: UI handler for Reset options panel.
function HealBot_Options_CDCMonitor_Reset() function HealBot_Options_CDCMonitor_Reset()
HealBot_CDCInc[HEALBOT_DRUID] = 0; HealBot_CDCInc[HEALBOT_DRUID] = 0;
@@ -73,7 +85,7 @@ function HealBot_Options_CDCMonitor_Reset()
HealBot_CDCInc[HEALBOT_SHAMAN] = 0; HealBot_CDCInc[HEALBOT_SHAMAN] = 0;
HealBot_CDCInc[HEALBOT_WARLOCK] = 0; HealBot_CDCInc[HEALBOT_WARLOCK] = 0;
HealBot_CDCInc[HEALBOT_WARRIOR] = 0; HealBot_CDCInc[HEALBOT_WARRIOR] = 0;
if HealBot_Config.CDCMonitor==2 then if HealBot_Config.CDCMonitor==1 then
HealBot_CDCInc[HEALBOT_DRUID] = 1; HealBot_CDCInc[HEALBOT_DRUID] = 1;
HealBot_CDCInc[HEALBOT_HUNTER] = 1; HealBot_CDCInc[HEALBOT_HUNTER] = 1;
HealBot_CDCInc[HEALBOT_MAGE] = 1; HealBot_CDCInc[HEALBOT_MAGE] = 1;
@@ -83,25 +95,7 @@ function HealBot_Options_CDCMonitor_Reset()
HealBot_CDCInc[HEALBOT_SHAMAN] = 1; HealBot_CDCInc[HEALBOT_SHAMAN] = 1;
HealBot_CDCInc[HEALBOT_WARLOCK] = 1; HealBot_CDCInc[HEALBOT_WARLOCK] = 1;
HealBot_CDCInc[HEALBOT_WARRIOR] = 1; HealBot_CDCInc[HEALBOT_WARRIOR] = 1;
elseif HealBot_Config.CDCMonitor==3 then elseif HealBot_Config.CDCMonitor==2 then
HealBot_CDCInc[HEALBOT_DRUID] = 1;
elseif HealBot_Config.CDCMonitor==4 then
HealBot_CDCInc[HEALBOT_HUNTER] = 1;
elseif HealBot_Config.CDCMonitor==5 then
HealBot_CDCInc[HEALBOT_MAGE] = 1;
elseif HealBot_Config.CDCMonitor==6 then
HealBot_CDCInc[HEALBOT_PALADIN] = 1;
elseif HealBot_Config.CDCMonitor==7 then
HealBot_CDCInc[HEALBOT_PRIEST] = 1;
elseif HealBot_Config.CDCMonitor==8 then
HealBot_CDCInc[HEALBOT_ROGUE] = 1;
elseif HealBot_Config.CDCMonitor==9 then
HealBot_CDCInc[HEALBOT_SHAMAN] = 1;
elseif HealBot_Config.CDCMonitor==10 then
HealBot_CDCInc[HEALBOT_WARLOCK] = 1;
elseif HealBot_Config.CDCMonitor==11 then
HealBot_CDCInc[HEALBOT_WARRIOR] = 1;
elseif HealBot_Config.CDCMonitor==12 then
HealBot_CDCInc[HEALBOT_DRUID] = HealBot_Config.EmergIncMelee[HEALBOT_DRUID]; HealBot_CDCInc[HEALBOT_DRUID] = HealBot_Config.EmergIncMelee[HEALBOT_DRUID];
HealBot_CDCInc[HEALBOT_HUNTER] = HealBot_Config.EmergIncMelee[HEALBOT_HUNTER]; HealBot_CDCInc[HEALBOT_HUNTER] = HealBot_Config.EmergIncMelee[HEALBOT_HUNTER];
HealBot_CDCInc[HEALBOT_MAGE] = HealBot_Config.EmergIncMelee[HEALBOT_MAGE]; HealBot_CDCInc[HEALBOT_MAGE] = HealBot_Config.EmergIncMelee[HEALBOT_MAGE];
@@ -111,7 +105,7 @@ function HealBot_Options_CDCMonitor_Reset()
HealBot_CDCInc[HEALBOT_SHAMAN] = HealBot_Config.EmergIncMelee[HEALBOT_SHAMAN]; HealBot_CDCInc[HEALBOT_SHAMAN] = HealBot_Config.EmergIncMelee[HEALBOT_SHAMAN];
HealBot_CDCInc[HEALBOT_WARLOCK] = HealBot_Config.EmergIncMelee[HEALBOT_WARLOCK]; HealBot_CDCInc[HEALBOT_WARLOCK] = HealBot_Config.EmergIncMelee[HEALBOT_WARLOCK];
HealBot_CDCInc[HEALBOT_WARRIOR] = HealBot_Config.EmergIncMelee[HEALBOT_WARRIOR]; HealBot_CDCInc[HEALBOT_WARRIOR] = HealBot_Config.EmergIncMelee[HEALBOT_WARRIOR];
elseif HealBot_Config.CDCMonitor==13 then elseif HealBot_Config.CDCMonitor==3 then
HealBot_CDCInc[HEALBOT_DRUID] = HealBot_Config.EmergIncRange[HEALBOT_DRUID]; HealBot_CDCInc[HEALBOT_DRUID] = HealBot_Config.EmergIncRange[HEALBOT_DRUID];
HealBot_CDCInc[HEALBOT_HUNTER] = HealBot_Config.EmergIncRange[HEALBOT_HUNTER]; HealBot_CDCInc[HEALBOT_HUNTER] = HealBot_Config.EmergIncRange[HEALBOT_HUNTER];
HealBot_CDCInc[HEALBOT_MAGE] = HealBot_Config.EmergIncRange[HEALBOT_MAGE]; HealBot_CDCInc[HEALBOT_MAGE] = HealBot_Config.EmergIncRange[HEALBOT_MAGE];
@@ -121,7 +115,7 @@ function HealBot_Options_CDCMonitor_Reset()
HealBot_CDCInc[HEALBOT_SHAMAN] = HealBot_Config.EmergIncRange[HEALBOT_SHAMAN]; HealBot_CDCInc[HEALBOT_SHAMAN] = HealBot_Config.EmergIncRange[HEALBOT_SHAMAN];
HealBot_CDCInc[HEALBOT_WARLOCK] = HealBot_Config.EmergIncRange[HEALBOT_WARLOCK]; HealBot_CDCInc[HEALBOT_WARLOCK] = HealBot_Config.EmergIncRange[HEALBOT_WARLOCK];
HealBot_CDCInc[HEALBOT_WARRIOR] = HealBot_Config.EmergIncRange[HEALBOT_WARRIOR]; HealBot_CDCInc[HEALBOT_WARRIOR] = HealBot_Config.EmergIncRange[HEALBOT_WARRIOR];
elseif HealBot_Config.CDCMonitor==14 then elseif HealBot_Config.CDCMonitor==4 then
HealBot_CDCInc[HEALBOT_DRUID] = HealBot_Config.EmergIncHealers[HEALBOT_DRUID]; HealBot_CDCInc[HEALBOT_DRUID] = HealBot_Config.EmergIncHealers[HEALBOT_DRUID];
HealBot_CDCInc[HEALBOT_HUNTER] = HealBot_Config.EmergIncHealers[HEALBOT_HUNTER]; HealBot_CDCInc[HEALBOT_HUNTER] = HealBot_Config.EmergIncHealers[HEALBOT_HUNTER];
HealBot_CDCInc[HEALBOT_MAGE] = HealBot_Config.EmergIncHealers[HEALBOT_MAGE]; HealBot_CDCInc[HEALBOT_MAGE] = HealBot_Config.EmergIncHealers[HEALBOT_MAGE];
@@ -131,7 +125,7 @@ function HealBot_Options_CDCMonitor_Reset()
HealBot_CDCInc[HEALBOT_SHAMAN] = HealBot_Config.EmergIncHealers[HEALBOT_SHAMAN]; HealBot_CDCInc[HEALBOT_SHAMAN] = HealBot_Config.EmergIncHealers[HEALBOT_SHAMAN];
HealBot_CDCInc[HEALBOT_WARLOCK] = HealBot_Config.EmergIncHealers[HEALBOT_WARLOCK]; HealBot_CDCInc[HEALBOT_WARLOCK] = HealBot_Config.EmergIncHealers[HEALBOT_WARLOCK];
HealBot_CDCInc[HEALBOT_WARRIOR] = HealBot_Config.EmergIncHealers[HEALBOT_WARRIOR]; HealBot_CDCInc[HEALBOT_WARRIOR] = HealBot_Config.EmergIncHealers[HEALBOT_WARRIOR];
elseif HealBot_Config.CDCMonitor==15 then elseif HealBot_Config.CDCMonitor==5 then
HealBot_CDCInc[HEALBOT_DRUID] = HealBot_Config.EmergIncCustom[HEALBOT_DRUID]; HealBot_CDCInc[HEALBOT_DRUID] = HealBot_Config.EmergIncCustom[HEALBOT_DRUID];
HealBot_CDCInc[HEALBOT_HUNTER] = HealBot_Config.EmergIncCustom[HEALBOT_HUNTER]; HealBot_CDCInc[HEALBOT_HUNTER] = HealBot_Config.EmergIncCustom[HEALBOT_HUNTER];
HealBot_CDCInc[HEALBOT_MAGE] = HealBot_Config.EmergIncCustom[HEALBOT_MAGE]; HealBot_CDCInc[HEALBOT_MAGE] = HealBot_Config.EmergIncCustom[HEALBOT_MAGE];
@@ -145,10 +139,34 @@ function HealBot_Options_CDCMonitor_Reset()
HealBot_Action_PartyChanged() HealBot_Action_PartyChanged()
end end
-- HealBot_Options_GetDebuffSpells_List: UI handler for List options panel.
function HealBot_Options_GetDebuffSpells_List(class) function HealBot_Options_GetDebuffSpells_List(class)
local DebuffSpells = HealBot_Debuff_Spells[class]; local DebuffSpells = HealBot_Debuff_Spells[class];
return DebuffSpells; return DebuffSpells;
end end
-- HealBot_Options_CDCShowAllDebuffs_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_CDCShowAllDebuffs_OnLoad(this,text)
getglobal(this:GetName().."Text"):SetText(text);
if HealBot_Config.CDCShowAllDebuffs == nil then HealBot_Config.CDCShowAllDebuffs = 0; end
if HealBot_Config.CDCShowAllDebuffs == 1 then
this:SetChecked(1);
else
this:SetChecked(0);
end
end
-- HealBot_Options_CDCShowAllDebuffs_OnClick: UI handler for OnClick options panel.
function HealBot_Options_CDCShowAllDebuffs_OnClick(this)
if this:GetChecked() then
HealBot_Config.CDCShowAllDebuffs = 1;
else
HealBot_Config.CDCShowAllDebuffs = 0;
end
HealBot_RecalcParty();
end
-- HealBot_Options_CDCButLeft_DropDown: UI handler for DropDown options panel.
function HealBot_Options_CDCButLeft_DropDown() function HealBot_Options_CDCButLeft_DropDown()
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
@@ -169,6 +187,7 @@ function HealBot_Options_CDCButLeft_DropDown()
end end
end end
end end
-- HealBot_Options_CDCButRight_DropDown: UI handler for DropDown options panel.
function HealBot_Options_CDCButRight_DropDown() function HealBot_Options_CDCButRight_DropDown()
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
@@ -189,12 +208,15 @@ function HealBot_Options_CDCButRight_DropDown()
end end
end end
end end
-- HealBot_Options_CDCButLeft_Initialize: UI handler for Initialize options panel.
function HealBot_Options_CDCButLeft_Initialize() function HealBot_Options_CDCButLeft_Initialize()
UIDropDownMenu_Initialize(HealBot_Options_CDCButLeft,HealBot_Options_CDCButLeft_DropDown) UIDropDownMenu_Initialize(HealBot_Options_CDCButLeft,HealBot_Options_CDCButLeft_DropDown)
end end
-- HealBot_Options_CDCButRight_Initialize: UI handler for Initialize options panel.
function HealBot_Options_CDCButRight_Initialize() function HealBot_Options_CDCButRight_Initialize()
UIDropDownMenu_Initialize(HealBot_Options_CDCButRight,HealBot_Options_CDCButRight_DropDown) UIDropDownMenu_Initialize(HealBot_Options_CDCButRight,HealBot_Options_CDCButRight_DropDown)
end end
-- HealBot_Options_CDCButLeft_Refresh: UI handler for Refresh options panel.
function HealBot_Options_CDCButLeft_Refresh(onselect) function HealBot_Options_CDCButLeft_Refresh(onselect)
local set_id=1; local set_id=1;
local class=UnitClass("Player"); local class=UnitClass("Player");
@@ -202,6 +224,7 @@ function HealBot_Options_CDCButLeft_Refresh(onselect)
set_id = HealBot_Config.Debuff_Left[class]; set_id = HealBot_Config.Debuff_Left[class];
HealBot_UIDropDownMenu_SetSelectedID(HealBot_Options_CDCButLeft,set_id) HealBot_UIDropDownMenu_SetSelectedID(HealBot_Options_CDCButLeft,set_id)
end end
-- HealBot_Options_CDCButRight_Refresh: UI handler for Refresh options panel.
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");
@@ -209,14 +232,18 @@ function HealBot_Options_CDCButRight_Refresh(onselect)
set_id = HealBot_Config.Debuff_Right[class]; set_id = HealBot_Config.Debuff_Right[class];
HealBot_UIDropDownMenu_SetSelectedID(HealBot_Options_CDCButRight,set_id) HealBot_UIDropDownMenu_SetSelectedID(HealBot_Options_CDCButRight,set_id)
end end
-- HealBot_Options_CDCButLeft_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_CDCButLeft_OnLoad() function HealBot_Options_CDCButLeft_OnLoad()
UIDropDownMenu_Initialize(this, HealBot_Options_CDCButLeft_DropDown) UIDropDownMenu_Initialize(this, HealBot_Options_CDCButLeft_DropDown)
UIDropDownMenu_SetWidth(140, this) UIDropDownMenu_SetWidth(140, this)
end end
-- HealBot_Options_CDCButRight_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_CDCButRight_OnLoad() function HealBot_Options_CDCButRight_OnLoad()
UIDropDownMenu_Initialize(this, HealBot_Options_CDCButRight_DropDown) UIDropDownMenu_Initialize(this, HealBot_Options_CDCButRight_DropDown)
UIDropDownMenu_SetWidth(140, this) UIDropDownMenu_SetWidth(140, this)
end end
-- HealBot_Options_CDCButLeft_OnSelect: UI handler for OnSelect options panel.
function HealBot_Options_CDCButLeft_OnSelect() function HealBot_Options_CDCButLeft_OnSelect()
local class=UnitClass("Player"); local class=UnitClass("Player");
HealBot_Config.Debuff_Left[class] = this:GetID(); HealBot_Config.Debuff_Left[class] = this:GetID();
@@ -228,6 +255,7 @@ function HealBot_Options_CDCButLeft_OnSelect()
HealBot_DebuffPriority = HealBot_Debuff_Types[HealBot_Options_CDCButLeftText:GetText()]; HealBot_DebuffPriority = HealBot_Debuff_Types[HealBot_Options_CDCButLeftText:GetText()];
HealBot_Options_Debuff_Reset() HealBot_Options_Debuff_Reset()
end end
-- HealBot_Options_CDCButRight_OnSelect: UI handler for OnSelect options panel.
function HealBot_Options_CDCButRight_OnSelect() function HealBot_Options_CDCButRight_OnSelect()
local class=UnitClass("Player"); local class=UnitClass("Player");
HealBot_Config.Debuff_Right[class] = this:GetID(); HealBot_Config.Debuff_Right[class] = this:GetID();
@@ -238,33 +266,54 @@ function HealBot_Options_CDCButRight_OnSelect()
end end
HealBot_Options_Debuff_Reset() HealBot_Options_Debuff_Reset()
end end
-- HealBot_Options_CDC_SetCombo: UI handler for SetCombo options panel.
function HealBot_Options_CDC_SetCombo(spell, button, class) function HealBot_Options_CDC_SetCombo(spell, button, class)
local combo = HealBot_Config.KeyCombo[class] local combo = HealBot_Config.KeyCombo[class]
combo["Alt"..button] = spell combo["Alt"..button] = spell
HealBot_Options_KeyCombo_Change() HealBot_Options_KeyCombo_Change()
end end
-- HealBot_Options_Debuff_Reset: Restores default debuff tracking options.
function HealBot_Options_Debuff_Reset() 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
HealBot_DebuffWatch = {[HEALBOT_DISEASE_en]=false, [HEALBOT_MAGIC_en]=false, [HEALBOT_POISON_en]=false, [HEALBOT_CURSE_en]=false }
-- Automatically track all curable debuffs out of the box
if classEN == "PRIEST" then
HealBot_DebuffWatch[HEALBOT_MAGIC_en] = true
HealBot_DebuffWatch[HEALBOT_DISEASE_en] = true
elseif classEN == "DRUID" then
HealBot_DebuffWatch[HEALBOT_CURSE_en] = true
HealBot_DebuffWatch[HEALBOT_POISON_en] = true
elseif classEN == "PALADIN" then
HealBot_DebuffWatch[HEALBOT_MAGIC_en] = true
HealBot_DebuffWatch[HEALBOT_POISON_en] = true
HealBot_DebuffWatch[HEALBOT_DISEASE_en] = true
elseif classEN == "SHAMAN" then
HealBot_DebuffWatch[HEALBOT_POISON_en] = true
HealBot_DebuffWatch[HEALBOT_DISEASE_en] = true
end
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" } if spell and spell ~= "None" and HealBot_Debuff_Types[spell] 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 and spell ~= "None" and HealBot_Debuff_Types[spell] 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
end end
-- HealBot_Colorpick_OnClick: Opens color picker for debuff colors.
function HealBot_Colorpick_OnClick(CDCType) function HealBot_Colorpick_OnClick(CDCType)
HealBot_ColourObjWaiting=CDCType; HealBot_ColourObjWaiting=CDCType;
HealBot_UseColourPick(HealBot_Config.CDCBarColour[CDCType].R,HealBot_Config.CDCBarColour[CDCType].G,HealBot_Config.CDCBarColour[CDCType].B, nil) HealBot_UseColourPick(HealBot_Config.CDCBarColour[CDCType].R,HealBot_Config.CDCBarColour[CDCType].G,HealBot_Config.CDCBarColour[CDCType].B, nil)
end end
-- HealBot_SetCDCBarColours: Internal utility: HealBot_SetCDCBarColours
function HealBot_SetCDCBarColours() function HealBot_SetCDCBarColours()
HealBot_DiseaseColorpick:SetStatusBarColor(HealBot_Config.CDCBarColour[HEALBOT_DISEASE_en].R, HealBot_DiseaseColorpick:SetStatusBarColor(HealBot_Config.CDCBarColour[HEALBOT_DISEASE_en].R,
HealBot_Config.CDCBarColour[HEALBOT_DISEASE_en].G, HealBot_Config.CDCBarColour[HEALBOT_DISEASE_en].G,
+38 -24
View File
@@ -7,9 +7,9 @@
<Frame name="HealBot_Options_CDCMonitor" inherits="UIDropDownMenuTemplate" id="1"> <Frame name="HealBot_Options_CDCMonitor" inherits="UIDropDownMenuTemplate" id="1">
<Anchors> <Anchors>
<Anchor point="TOPLEFT"> <Anchor point="TOP">
<Offset> <Offset>
<AbsDimension x="170" y="-30" /> <AbsDimension x="-20" y="-30" />
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -31,6 +31,20 @@
</Scripts> </Scripts>
</Frame> </Frame>
<CheckButton name="HealBot_Options_CDCShowAllDebuffs" inherits="OptionsCheckButtonTemplate">
<Anchors>
<Anchor point="LEFT" relativeTo="HealBot_Options_CDCMonitor" relativePoint="RIGHT">
<Offset>
<AbsDimension x="-15" y="3" />
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_CDCShowAllDebuffs_OnLoad(this,HEALBOT_OPTIONS_CDCSHOWALLDEBUFFS)</OnLoad>
<OnClick>HealBot_Options_CDCShowAllDebuffs_OnClick(this)</OnClick>
</Scripts>
</CheckButton>
<Frame name="HealBot_Options_CureDispelCleanse" inherits="OptionFrameBoxTemplate"> <Frame name="HealBot_Options_CureDispelCleanse" inherits="OptionFrameBoxTemplate">
<Scripts> <Scripts>
<OnLoad> <OnLoad>
@@ -57,9 +71,9 @@
<Layer level="BACKGROUND"> <Layer level="BACKGROUND">
<FontString name="HealBot_CDCBut_Text" text="HEALBOT_OPTIONS_CDCBUTTONS" inherits="GameFontNormalSmall"> <FontString name="HealBot_CDCBut_Text" text="HEALBOT_OPTIONS_CDCBUTTONS" inherits="GameFontNormalSmall">
<Anchors> <Anchors>
<Anchor point="TOPLEFT"> <Anchor point="TOP">
<Offset> <Offset>
<AbsDimension x="105" y="-12" /> <AbsDimension x="0" y="-12" />
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -71,7 +85,7 @@
<Anchors> <Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_CureDispelCleanse" relativePoint="TOPLEFT"> <Anchor point="TOPLEFT" relativeTo="HealBot_Options_CureDispelCleanse" relativePoint="TOPLEFT">
<Offset> <Offset>
<AbsDimension x="100" y="-35" /> <AbsDimension x="150" y="-35" />
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -81,7 +95,7 @@
<Anchors> <Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_CureDispelCleanse" relativePoint="TOPLEFT"> <Anchor point="TOPLEFT" relativeTo="HealBot_Options_CureDispelCleanse" relativePoint="TOPLEFT">
<Offset> <Offset>
<AbsDimension x="40" y="-42"/> <AbsDimension x="70" y="-42"/>
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -98,7 +112,7 @@
<Anchors> <Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_CureDispelCleanse" relativePoint="TOPLEFT"> <Anchor point="TOPLEFT" relativeTo="HealBot_Options_CureDispelCleanse" relativePoint="TOPLEFT">
<Offset> <Offset>
<AbsDimension x="100" y="-67" /> <AbsDimension x="150" y="-67" />
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -108,7 +122,7 @@
<Anchors> <Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_CureDispelCleanse" relativePoint="TOPLEFT"> <Anchor point="TOPLEFT" relativeTo="HealBot_Options_CureDispelCleanse" relativePoint="TOPLEFT">
<Offset> <Offset>
<AbsDimension x="40" y="-74"/> <AbsDimension x="70" y="-74"/>
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -148,9 +162,9 @@
<Layer level="BACKGROUND"> <Layer level="BACKGROUND">
<FontString name="HealBot_CDCCol_Text" text="HEALBOT_OPTIONS_CDCBARS" inherits="GameFontNormalSmall"> <FontString name="HealBot_CDCCol_Text" text="HEALBOT_OPTIONS_CDCBARS" inherits="GameFontNormalSmall">
<Anchors> <Anchors>
<Anchor point="TOPLEFT"> <Anchor point="TOP">
<Offset> <Offset>
<AbsDimension x="98" y="-12" /> <AbsDimension x="0" y="-12" />
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -163,9 +177,9 @@
<AbsDimension x="130" y="20"/> <AbsDimension x="130" y="20"/>
</Size> </Size>
<Anchors> <Anchors>
<Anchor point="BOTTOM" relativeTo="HealBot_Options_CureDispelCleanseCol" relativePoint="TOPLEFT"> <Anchor point="TOPLEFT" relativeTo="HealBot_Options_CureDispelCleanseCol" relativePoint="TOPLEFT">
<Offset> <Offset>
<AbsDimension x="81" y="-55"/> <AbsDimension x="70" y="-35"/>
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -178,9 +192,9 @@
<AbsDimension x="130" y="20"/> <AbsDimension x="130" y="20"/>
</Size> </Size>
<Anchors> <Anchors>
<Anchor point="BOTTOM" relativeTo="HealBot_Options_CureDispelCleanseCol" relativePoint="TOPLEFT"> <Anchor point="TOPLEFT" relativeTo="HealBot_Options_CureDispelCleanseCol" relativePoint="TOPLEFT">
<Offset> <Offset>
<AbsDimension x="81" y="-55"/> <AbsDimension x="70" y="-35"/>
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -255,9 +269,9 @@
<AbsDimension x="130" y="20"/> <AbsDimension x="130" y="20"/>
</Size> </Size>
<Anchors> <Anchors>
<Anchor point="BOTTOM" relativeTo="HealBot_DiseaseColorpick" relativePoint="TOPLEFT"> <Anchor point="TOPLEFT" relativeTo="HealBot_Options_CureDispelCleanseCol" relativePoint="TOPLEFT">
<Offset> <Offset>
<AbsDimension x="65" y="-45"/> <AbsDimension x="70" y="-65"/>
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -270,9 +284,9 @@
<AbsDimension x="130" y="20"/> <AbsDimension x="130" y="20"/>
</Size> </Size>
<Anchors> <Anchors>
<Anchor point="BOTTOM" relativeTo="HealBot_DiseaseColorpick" relativePoint="TOPLEFT"> <Anchor point="TOPLEFT" relativeTo="HealBot_Options_CureDispelCleanseCol" relativePoint="TOPLEFT">
<Offset> <Offset>
<AbsDimension x="65" y="-45"/> <AbsDimension x="70" y="-65"/>
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -368,9 +382,9 @@
<Layer level="BACKGROUND"> <Layer level="BACKGROUND">
<FontString name="HealBot_CDCWarn_Text" text="HEALBOT_OPTIONS_CDCWARNINGS" inherits="GameFontNormalSmall"> <FontString name="HealBot_CDCWarn_Text" text="HEALBOT_OPTIONS_CDCWARNINGS" inherits="GameFontNormalSmall">
<Anchors> <Anchors>
<Anchor point="TOPLEFT"> <Anchor point="TOP">
<Offset> <Offset>
<AbsDimension x="98" y="-12" /> <AbsDimension x="0" y="-12" />
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -380,9 +394,9 @@
</Frame> </Frame>
<CheckButton name="HealBot_Options_ShowDebuffWarning" inherits="OptionsCheckButtonTemplate"> <CheckButton name="HealBot_Options_ShowDebuffWarning" inherits="OptionsCheckButtonTemplate">
<Anchors> <Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_CureDispelCleanseWarn" relativePoint="BOTTOMLEFT"> <Anchor point="TOPLEFT" relativeTo="HealBot_Options_CureDispelCleanseWarn" relativePoint="TOPLEFT">
<Offset> <Offset>
<AbsDimension x="25" y="90" /> <AbsDimension x="70" y="-35" />
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -407,9 +421,9 @@
<CheckButton name="HealBot_WarningSound1" inherits="SendMailRadioButtonTemplate" id="1"> <CheckButton name="HealBot_WarningSound1" inherits="SendMailRadioButtonTemplate" id="1">
<Anchors> <Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_SoundDebuffWarning" relativePoint="TOPLEFT"> <Anchor point="TOPLEFT" relativeTo="HealBot_Options_SoundDebuffWarning" relativePoint="BOTTOMLEFT">
<Offset> <Offset>
<AbsDimension x="25" y="-30"/> <AbsDimension x="25" y="-5"/>
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
+2
View File
@@ -1,6 +1,7 @@
-- 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
-- HealBot_Options_ChatMsg_Channel_OnClick: UI handler for OnClick options panel.
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
@@ -26,6 +27,7 @@ function HealBot_Options_ChatMsg_Channel_OnClick(id, buttonFrame)
buttonFrame:SetText(nextChan) buttonFrame:SetText(nextChan)
end end
-- HealBot_Options_SetChatMessages: UI handler for SetChatMessages options panel.
function HealBot_Options_SetChatMessages() function HealBot_Options_SetChatMessages()
if not HealBot_Config.ChatMessages then if not HealBot_Config.ChatMessages then
HealBot_Config.ChatMessages = {} HealBot_Config.ChatMessages = {}
+46 -2
View File
@@ -1,70 +1,91 @@
-- HealBot Options panel file: HealBot_Options_General.lua -- HealBot Options panel file: HealBot_Options_General.lua
-- Split from original HealBot_Options.lua -- Split from original HealBot_Options.lua
-- HealBot_Options_ShowHeaders_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_ShowHeaders_OnLoad(this) function HealBot_Options_ShowHeaders_OnLoad(this)
getglobal(this:GetName().."Text"):SetText(HEALBOT_OPTIONS_SHOWHEADERS); getglobal(this:GetName().."Text"):SetText(HEALBOT_OPTIONS_SHOWHEADERS);
end end
-- HealBot_Options_ShowHeaders_OnClick: UI handler for OnClick options panel.
function HealBot_Options_ShowHeaders_OnClick(this) function HealBot_Options_ShowHeaders_OnClick(this)
local isChecked = this:GetChecked() local isChecked = this:GetChecked()
HealBot_Config.ShowHeader[HealBot_Config.Current_Skin] = isChecked and 1 or 0; HealBot_Config.ShowHeader[HealBot_Config.Current_Skin] = isChecked and 1 or 0;
HealBot_Action_ResetSkin() HealBot_Action_ResetSkin()
end end
-- HealBot_Options_BarTextureS_OnValueChanged: UI handler for OnValueChanged options panel.
function HealBot_Options_BarTextureS_OnValueChanged(this) function HealBot_Options_BarTextureS_OnValueChanged(this)
HealBot_Config.btexture[HealBot_Config.Current_Skin] = this:GetValue(); HealBot_Config.btexture[HealBot_Config.Current_Skin] = this:GetValue();
getglobal(this:GetName().."Text"):SetText(this.text .. ": " .. this:GetValue()); getglobal(this:GetName().."Text"):SetText(this.text .. ": " .. this:GetValue());
HealBot_Action_ResetSkin() HealBot_Action_ResetSkin()
end end
-- HealBot_Options_BarHeightS_OnValueChanged: UI handler for OnValueChanged options panel.
function HealBot_Options_BarHeightS_OnValueChanged(this) function HealBot_Options_BarHeightS_OnValueChanged(this)
HealBot_Config.bheight[HealBot_Config.Current_Skin] = this:GetValue(); HealBot_Config.bheight[HealBot_Config.Current_Skin] = this:GetValue();
getglobal(this:GetName().."Text"):SetText(this.text .. ": " .. this:GetValue()); getglobal(this:GetName().."Text"):SetText(this.text .. ": " .. this:GetValue());
HealBot_Action_ResetSkin() HealBot_Action_ResetSkin()
end end
-- HealBot_Options_BarWidthS_OnValueChanged: UI handler for OnValueChanged options panel.
function HealBot_Options_BarWidthS_OnValueChanged(this) function HealBot_Options_BarWidthS_OnValueChanged(this)
HealBot_Config.bwidth[HealBot_Config.Current_Skin] = this:GetValue(); HealBot_Config.bwidth[HealBot_Config.Current_Skin] = this:GetValue();
getglobal(this:GetName().."Text"):SetText(this.text .. ": " .. this:GetValue()); getglobal(this:GetName().."Text"):SetText(this.text .. ": " .. this:GetValue());
HealBot_Action_ResetSkin() HealBot_Action_ResetSkin()
end end
-- HealBot_Options_BarNumColsS_OnValueChanged: UI handler for OnValueChanged options panel.
function HealBot_Options_BarNumColsS_OnValueChanged(this) function HealBot_Options_BarNumColsS_OnValueChanged(this)
HealBot_Config.numcols[HealBot_Config.Current_Skin] = this:GetValue(); HealBot_Config.numcols[HealBot_Config.Current_Skin] = this:GetValue();
getglobal(this:GetName().."Text"):SetText(this.text .. ": " .. this:GetValue()); getglobal(this:GetName().."Text"):SetText(this.text .. ": " .. this:GetValue());
HealBot_Action_ResetSkin() HealBot_Action_ResetSkin()
end end
-- HealBot_Options_BarBRSpaceS_OnValueChanged: UI handler for OnValueChanged options panel.
function HealBot_Options_BarBRSpaceS_OnValueChanged(this) function HealBot_Options_BarBRSpaceS_OnValueChanged(this)
HealBot_Config.brspace[HealBot_Config.Current_Skin] = this:GetValue(); HealBot_Config.brspace[HealBot_Config.Current_Skin] = this:GetValue();
getglobal(this:GetName().."Text"):SetText(this.text .. ": " .. this:GetValue()); getglobal(this:GetName().."Text"):SetText(this.text .. ": " .. this:GetValue());
HealBot_Action_ResetSkin() HealBot_Action_ResetSkin()
end end
-- HealBot_Options_BarBCSpaceS_OnValueChanged: UI handler for OnValueChanged options panel.
function HealBot_Options_BarBCSpaceS_OnValueChanged(this) function HealBot_Options_BarBCSpaceS_OnValueChanged(this)
HealBot_Config.bcspace[HealBot_Config.Current_Skin] = this:GetValue(); HealBot_Config.bcspace[HealBot_Config.Current_Skin] = this:GetValue();
getglobal(this:GetName().."Text"):SetText(this.text .. ": " .. this:GetValue()); getglobal(this:GetName().."Text"):SetText(this.text .. ": " .. this:GetValue());
HealBot_Action_ResetSkin() HealBot_Action_ResetSkin()
end end
-- HealBot_Options_FontHeight_OnValueChanged: UI handler for OnValueChanged options panel.
function HealBot_Options_FontHeight_OnValueChanged(this) function HealBot_Options_FontHeight_OnValueChanged(this)
HealBot_Config.btextheight[HealBot_Config.Current_Skin] = this:GetValue(); HealBot_Config.btextheight[HealBot_Config.Current_Skin] = this:GetValue();
getglobal(this:GetName().."Text"):SetText(this.text .. ": " .. this:GetValue()); getglobal(this:GetName().."Text"):SetText(this.text .. ": " .. this:GetValue());
HealBot_Action_ResetSkin() HealBot_Action_ResetSkin()
end end
-- HealBot_Options_IconSizeS_OnValueChanged: UI handler for OnValueChanged options panel.
function HealBot_Options_IconSizeS_OnValueChanged(this)
HealBot_Config.biconsize[HealBot_Config.Current_Skin] = this:GetValue();
getglobal(this:GetName().."Text"):SetText(this.text .. ": " .. this:GetValue());
HealBot_Action_ResetSkin()
end
-- HealBot_Options_AbortBarSize_OnValueChanged: UI handler for OnValueChanged options panel.
function HealBot_Options_AbortBarSize_OnValueChanged(this) function HealBot_Options_AbortBarSize_OnValueChanged(this)
HealBot_Config.abortsize[HealBot_Config.Current_Skin] = this:GetValue(); HealBot_Config.abortsize[HealBot_Config.Current_Skin] = this:GetValue();
getglobal(this:GetName().."Text"):SetText(this.text .. ": " .. this:GetValue()); getglobal(this:GetName().."Text"):SetText(this.text .. ": " .. this:GetValue());
HealBot_Action_ResetSkin() HealBot_Action_ResetSkin()
end end
-- HealBot_Options_ActionAlpha_OnValueChanged: UI handler for OnValueChanged options panel.
function HealBot_Options_ActionAlpha_OnValueChanged(this) function HealBot_Options_ActionAlpha_OnValueChanged(this)
HealBot_Config.backcola[HealBot_Config.Current_Skin] = HealBot_Options_Pct_OnValueChanged(this); HealBot_Config.backcola[HealBot_Config.Current_Skin] = HealBot_Options_Pct_OnValueChanged(this);
HealBot_Action_ResetSkin() HealBot_Action_ResetSkin()
end end
-- HealBot_Options_BarAlpha_OnValueChanged: UI handler for OnValueChanged options panel.
function HealBot_Options_BarAlpha_OnValueChanged(this) function HealBot_Options_BarAlpha_OnValueChanged(this)
HealBot_Config.Barcola[HealBot_Config.Current_Skin] = HealBot_Options_Pct_OnValueChanged(this); HealBot_Config.Barcola[HealBot_Config.Current_Skin] = HealBot_Options_Pct_OnValueChanged(this);
HealBot_Action_ResetSkin() HealBot_Action_ResetSkin()
end end
-- HealBot_Options_BarAlphaInHeal_OnValueChanged: UI handler for OnValueChanged options panel.
function HealBot_Options_BarAlphaInHeal_OnValueChanged(this) function HealBot_Options_BarAlphaInHeal_OnValueChanged(this)
HealBot_Config.BarcolaInHeal[HealBot_Config.Current_Skin] = HealBot_Options_Pct_OnValueChanged(this); HealBot_Config.BarcolaInHeal[HealBot_Config.Current_Skin] = HealBot_Options_Pct_OnValueChanged(this);
HealBot_Action_ResetSkin() HealBot_Action_ResetSkin()
end end
-- HealBot_Options_BarAlphaDis_OnValueChanged: UI handler for OnValueChanged options panel.
function HealBot_Options_BarAlphaDis_OnValueChanged(this) function HealBot_Options_BarAlphaDis_OnValueChanged(this)
HealBot_Config.bardisa[HealBot_Config.Current_Skin] = HealBot_Options_Pct_OnValueChanged(this); HealBot_Config.bardisa[HealBot_Config.Current_Skin] = HealBot_Options_Pct_OnValueChanged(this);
HealBot_Action_ResetSkin() HealBot_Action_ResetSkin()
end end
-- HealBot_SkinColorpick_OnClick: Opens color picker for skin customization.
function HealBot_SkinColorpick_OnClick(SkinType) function HealBot_SkinColorpick_OnClick(SkinType)
HealBot_ColourObjWaiting=SkinType; HealBot_ColourObjWaiting=SkinType;
@@ -100,6 +121,7 @@ function HealBot_SkinColorpick_OnClick(SkinType)
HealBot_Config.babortcola[HealBot_Config.Current_Skin]) HealBot_Config.babortcola[HealBot_Config.Current_Skin])
end end
end end
-- HealBot_SetSkinColours: Applies skin configuration to UI elements.
function HealBot_SetSkinColours() function HealBot_SetSkinColours()
-- Cache the current skin configuration for performance and readability -- Cache the current skin configuration for performance and readability
local skin = HealBot_Config.Current_Skin local skin = HealBot_Config.Current_Skin
@@ -197,76 +219,95 @@ function HealBot_SetSkinColours()
HealBot_Action_PartyChanged() HealBot_Action_PartyChanged()
end end
-- HealBot_Options_AlertLevel_OnValueChanged: UI handler for OnValueChanged options panel.
function HealBot_Options_AlertLevel_OnValueChanged(this) function HealBot_Options_AlertLevel_OnValueChanged(this)
HealBot_Config.AlertLevel = HealBot_Options_Pct_OnValueChanged(this); HealBot_Config.AlertLevel = HealBot_Options_Pct_OnValueChanged(this);
HealBot_Action_Refresh(); HealBot_Action_Refresh();
end end
-- HealBot_Options_AutoShow_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_AutoShow_OnLoad(this) function HealBot_Options_AutoShow_OnLoad(this)
getglobal(this:GetName().."Text"):SetText(HEALBOT_OPTIONS_AUTOSHOW); getglobal(this:GetName().."Text"):SetText(HEALBOT_OPTIONS_AUTOSHOW);
end end
-- HealBot_Options_AutoShow_OnClick: UI handler for OnClick options panel.
function HealBot_Options_AutoShow_OnClick(this) function HealBot_Options_AutoShow_OnClick(this)
HealBot_Config.AutoClose = this:GetChecked() or 0; HealBot_Config.AutoClose = this:GetChecked() or 0;
HealBot_Action_Refresh(); HealBot_Action_Refresh();
end end
-- HealBot_Options_PanelSounds_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_PanelSounds_OnLoad(this) function HealBot_Options_PanelSounds_OnLoad(this)
getglobal(this:GetName().."Text"):SetText(HEALBOT_OPTIONS_PANELSOUNDS); getglobal(this:GetName().."Text"):SetText(HEALBOT_OPTIONS_PANELSOUNDS);
end end
-- HealBot_Options_PanelSounds_OnClick: UI handler for OnClick options panel.
function HealBot_Options_PanelSounds_OnClick(this) function HealBot_Options_PanelSounds_OnClick(this)
HealBot_Config.PanelSounds = this:GetChecked() or 0; HealBot_Config.PanelSounds = this:GetChecked() or 0;
end end
-- HealBot_Options_ActionMouseover_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_ActionMouseover_OnLoad(this, text) function HealBot_Options_ActionMouseover_OnLoad(this, text)
getglobal(this:GetName().."Text"):SetText(text); getglobal(this:GetName().."Text"):SetText(text);
end end
-- HealBot_Options_ActionMouseover_OnClick: UI handler for OnClick options panel.
function HealBot_Options_ActionMouseover_OnClick(this) function HealBot_Options_ActionMouseover_OnClick(this)
HealBot_Config.ActionMouseover = this:GetChecked() or 0; HealBot_Config.ActionMouseover = this:GetChecked() or 0;
end end
-- HealBot_Options_ActionLocked_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_ActionLocked_OnLoad(this) function HealBot_Options_ActionLocked_OnLoad(this)
getglobal(this:GetName().."Text"):SetText(HEALBOT_OPTIONS_ACTIONLOCKED); getglobal(this:GetName().."Text"):SetText(HEALBOT_OPTIONS_ACTIONLOCKED);
end end
-- HealBot_Options_ActionLocked_OnClick: UI handler for OnClick options panel.
function HealBot_Options_ActionLocked_OnClick(this) function HealBot_Options_ActionLocked_OnClick(this)
HealBot_Config.ActionLocked = this:GetChecked() or 0; HealBot_Config.ActionLocked = this:GetChecked() or 0;
end end
-- HealBot_Options_HideOptions_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_HideOptions_OnLoad(this,text) function HealBot_Options_HideOptions_OnLoad(this,text)
getglobal(this:GetName().."Text"):SetText(text); getglobal(this:GetName().."Text"):SetText(text);
end end
-- HealBot_Options_HideOptions_OnClick: UI handler for OnClick options panel.
function HealBot_Options_HideOptions_OnClick(this) function HealBot_Options_HideOptions_OnClick(this)
HealBot_Config.HideOptions = this:GetChecked() or 0; HealBot_Config.HideOptions = this:GetChecked() or 0;
HealBot_Action_PartyChanged(); HealBot_Action_PartyChanged();
end end
-- HealBot_Options_HideAbort_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_HideAbort_OnLoad(this,text) function HealBot_Options_HideAbort_OnLoad(this,text)
getglobal(this:GetName().."Text"):SetText(text); getglobal(this:GetName().."Text"):SetText(text);
end end
-- HealBot_Options_HideAbort_OnClick: UI handler for OnClick options panel.
function HealBot_Options_HideAbort_OnClick(this) function HealBot_Options_HideAbort_OnClick(this)
HealBot_Config.HideAbort = this:GetChecked() or 0; HealBot_Config.HideAbort = this:GetChecked() or 0;
HealBot_Action_PartyChanged(); HealBot_Action_PartyChanged();
end end
-- HealBot_Options_GrowUpwards_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_GrowUpwards_OnLoad(this,text) function HealBot_Options_GrowUpwards_OnLoad(this,text)
getglobal(this:GetName().."Text"):SetText(text); getglobal(this:GetName().."Text"):SetText(text);
end end
-- HealBot_Options_GrowUpwards_OnClick: UI handler for OnClick options panel.
function HealBot_Options_GrowUpwards_OnClick(this) function HealBot_Options_GrowUpwards_OnClick(this)
HealBot_Config.GrowUpwards = this:GetChecked() or 0; HealBot_Config.GrowUpwards = this:GetChecked() or 0;
HealBot_Action_PartyChanged(); HealBot_Action_PartyChanged();
end end
-- HealBot_Options_QualityRange_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_QualityRange_OnLoad(this,text) function HealBot_Options_QualityRange_OnLoad(this,text)
getglobal(this:GetName().."Text"):SetText(text); getglobal(this:GetName().."Text"):SetText(text);
end end
-- HealBot_Options_QualityRange_OnClick: UI handler for OnClick options panel.
function HealBot_Options_QualityRange_OnClick(this) function HealBot_Options_QualityRange_OnClick(this)
HealBot_Config.QualityRange = this:GetChecked() or 0; HealBot_Config.QualityRange = this:GetChecked() or 0;
HealBot_Action_PartyChanged();
end end
-- HealBot_Options_ProtectPvP_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_ProtectPvP_OnLoad(this,text) function HealBot_Options_ProtectPvP_OnLoad(this,text)
getglobal(this:GetName().."Text"):SetText(text); getglobal(this:GetName().."Text"):SetText(text);
end end
-- HealBot_Options_ProtectPvP_OnClick: UI handler for OnClick options panel.
function HealBot_Options_ProtectPvP_OnClick(this) function HealBot_Options_ProtectPvP_OnClick(this)
HealBot_Config.ProtectPvP = this:GetChecked() or 0; HealBot_Config.ProtectPvP = this:GetChecked() or 0;
HealBot_Action_Refresh();
end end
-- HealBot_Options_FramePaddingS_OnValueChanged: UI handler for OnValueChanged options panel.
function HealBot_Options_FramePaddingS_OnValueChanged(this) function HealBot_Options_FramePaddingS_OnValueChanged(this)
if not HealBot_Config.bpadding then HealBot_Config.bpadding = {} end if not HealBot_Config.bpadding then HealBot_Config.bpadding = {} end
HealBot_Config.bpadding[HealBot_Config.Current_Skin] = this:GetValue(); HealBot_Config.bpadding[HealBot_Config.Current_Skin] = this:GetValue();
getglobal(this:GetName().."Text"):SetText(this.text .. ": " .. this:GetValue()); getglobal(this:GetName().."Text"):SetText(this.text .. ": " .. this:GetValue());
HealBot_Action_ResetSkin() HealBot_Action_ResetSkin()
end end
-- HealBot_Options_BorderThicknessS_OnValueChanged: UI handler for OnValueChanged options panel.
function HealBot_Options_BorderThicknessS_OnValueChanged(this) function HealBot_Options_BorderThicknessS_OnValueChanged(this)
if not HealBot_Config.bboffset then HealBot_Config.bboffset = {} end if not HealBot_Config.bboffset then HealBot_Config.bboffset = {} end
HealBot_Config.bboffset[HealBot_Config.Current_Skin] = this:GetValue(); HealBot_Config.bboffset[HealBot_Config.Current_Skin] = this:GetValue();
@@ -274,15 +315,18 @@ function HealBot_Options_BorderThicknessS_OnValueChanged(this)
HealBot_Action_ResetSkin() HealBot_Action_ResetSkin()
end end
-- HealBot_Options_HideParty_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_HideParty_OnLoad(this, text) function HealBot_Options_HideParty_OnLoad(this, text)
getglobal(this:GetName().."Text"):SetText(text); getglobal(this:GetName().."Text"):SetText(text);
end end
-- HealBot_Options_HideParty_OnClick: UI handler for OnClick options panel.
function HealBot_Options_HideParty_OnClick(this) function HealBot_Options_HideParty_OnClick(this)
HealBot_Config.HideParty = this:GetChecked() or 0; HealBot_Config.HideParty = this:GetChecked() or 0;
HealBot_Options_TogglePartyFrames(); HealBot_Options_TogglePartyFrames();
end end
-- HealBot_Options_TogglePartyFrames: UI handler for TogglePartyFrames options panel.
function HealBot_Options_TogglePartyFrames() function HealBot_Options_TogglePartyFrames()
if HealBot_Config.HideParty == 1 then if HealBot_Config.HideParty == 1 then
if HidePartyFrame then HidePartyFrame(); end if HidePartyFrame then HidePartyFrame(); end
+32 -2
View File
@@ -265,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>
+47 -38
View File
@@ -1,44 +1,65 @@
-- HealBot Options panel file: HealBot_Options_Healing.lua -- HealBot Options panel file: HealBot_Options_Healing.lua
-- Split from original HealBot_Options.lua -- Split from original HealBot_Options.lua
-- HealBot_Options_GroupHeals_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_GroupHeals_OnLoad(this,text) function HealBot_Options_GroupHeals_OnLoad(this,text)
this.text = text this.text = text
getglobal(this:GetName().."Text"):SetText(text); getglobal(this:GetName().."Text"):SetText(text);
end end
-- HealBot_Options_GroupHeals_OnClick: UI handler for OnClick options panel.
function HealBot_Options_GroupHeals_OnClick(this) function HealBot_Options_GroupHeals_OnClick(this)
HealBot_Config.GroupHeals = this:GetChecked() or 0; HealBot_Config.GroupHeals = this:GetChecked() or 0;
HealBot_RecalcParty(); HealBot_RecalcParty();
end end
-- HealBot_Options_TankHeals_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_TankHeals_OnLoad(this,text) function HealBot_Options_TankHeals_OnLoad(this,text)
this.text = text this.text = text
getglobal(this:GetName().."Text"):SetText(text); getglobal(this:GetName().."Text"):SetText(text);
end end
-- HealBot_Options_TankHeals_OnClick: UI handler for OnClick options panel.
function HealBot_Options_TankHeals_OnClick(this) function HealBot_Options_TankHeals_OnClick(this)
HealBot_Config.TankHeals = this:GetChecked() or 0; HealBot_Config.TankHeals = this:GetChecked() or 0;
HealBot_RecalcParty(); HealBot_RecalcParty();
end end
-- HealBot_Options_TargetHeals_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_TargetHeals_OnLoad(this,text) function HealBot_Options_TargetHeals_OnLoad(this,text)
this.text = text this.text = text
getglobal(this:GetName().."Text"):SetText(text); getglobal(this:GetName().."Text"):SetText(text);
end end
-- HealBot_Options_TargetHeals_OnClick: UI handler for OnClick options panel.
function HealBot_Options_TargetHeals_OnClick(this) function HealBot_Options_TargetHeals_OnClick(this)
HealBot_Config.TargetHeals = this:GetChecked() or 0; HealBot_Config.TargetHeals = this:GetChecked() or 0;
HealBot_RecalcParty(); HealBot_RecalcParty();
end end
-- HealBot_Options_EmergencyHeals_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_EmergencyHeals_OnLoad(this,text) function HealBot_Options_EmergencyHeals_OnLoad(this,text)
this.text = text this.text = text
getglobal(this:GetName().."Text"):SetText(text); getglobal(this:GetName().."Text"):SetText(text);
end end
-- HealBot_Options_EmergencyHeals_OnClick: UI handler for OnClick options panel.
function HealBot_Options_EmergencyHeals_OnClick(this) function HealBot_Options_EmergencyHeals_OnClick(this)
HealBot_Config.EmergencyHeals = this:GetChecked() or 0; HealBot_Config.EmergencyHeals = this:GetChecked() or 0;
HealBot_RecalcParty(); HealBot_RecalcParty();
end end
-- HealBot_Options_PetHeals_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_PetHeals_OnLoad(this,text)
this.text = text
getglobal(this:GetName().."Text"):SetText(text);
end
-- HealBot_Options_PetHeals_OnClick: UI handler for OnClick options panel.
function HealBot_Options_PetHeals_OnClick(this)
HealBot_Config.PetHeals = this:GetChecked() or 0;
HealBot_RecalcParty();
end
-- HealBot_Options_OverHeal_OnValueChanged: UI handler for OnValueChanged options panel.
function HealBot_Options_OverHeal_OnValueChanged(this) function HealBot_Options_OverHeal_OnValueChanged(this)
HealBot_Config.OverHeal = HealBot_Options_Pct_OnValueChanged(this); HealBot_Config.OverHeal = HealBot_Options_Pct_OnValueChanged(this);
end end
-- HealBot_Options_EFClass_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_EFClass_OnLoad(this,text) function HealBot_Options_EFClass_OnLoad(this,text)
getglobal(this:GetName().."Text"):SetText(text); getglobal(this:GetName().."Text"):SetText(text);
end end
-- HealBot_Options_EFClass_OnClick: UI handler for OnClick options panel.
function HealBot_Options_EFClass_OnClick(this) function HealBot_Options_EFClass_OnClick(this)
if HealBot_Config.EmergencyFClass==1 then if HealBot_Config.EmergencyFClass==1 then
HealBot_Config.EmergIncMelee[HEALBOT_DRUID] = HealBot_Options_EFClassDruid:GetChecked() or 0; HealBot_Config.EmergIncMelee[HEALBOT_DRUID] = HealBot_Options_EFClassDruid:GetChecked() or 0;
@@ -81,7 +102,7 @@ function HealBot_Options_EFClass_OnClick(this)
HealBot_Config.EmergIncCustom[HEALBOT_WARLOCK] = HealBot_Options_EFClassWarlock:GetChecked() or 0; HealBot_Config.EmergIncCustom[HEALBOT_WARLOCK] = HealBot_Options_EFClassWarlock:GetChecked() or 0;
HealBot_Config.EmergIncCustom[HEALBOT_WARRIOR] = HealBot_Options_EFClassWarrior:GetChecked() or 0; HealBot_Config.EmergIncCustom[HEALBOT_WARRIOR] = HealBot_Options_EFClassWarrior:GetChecked() or 0;
end end
if HealBot_Config.EmergIncMonitor>10 then if HealBot_Config.EmergIncMonitor > 1 then
HealBot_Action_PartyChanged(); HealBot_Action_PartyChanged();
end end
end end
@@ -92,6 +113,7 @@ HealBot_Options_HealthText_List = {
"Health Deficit", "Health Deficit",
} }
-- HealBot_Options_HealthText_DropDown: UI handler for DropDown options panel.
function HealBot_Options_HealthText_DropDown() function HealBot_Options_HealthText_DropDown()
for i=1, getn(HealBot_Options_HealthText_List), 1 do for i=1, getn(HealBot_Options_HealthText_List), 1 do
local info = {}; local info = {};
@@ -101,11 +123,13 @@ function HealBot_Options_HealthText_DropDown()
end end
end end
-- HealBot_Options_HealthText_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_HealthText_OnLoad(this) function HealBot_Options_HealthText_OnLoad(this)
UIDropDownMenu_Initialize(this, HealBot_Options_HealthText_DropDown); UIDropDownMenu_Initialize(this, HealBot_Options_HealthText_DropDown);
UIDropDownMenu_SetWidth(110, this); UIDropDownMenu_SetWidth(110, this);
end end
-- HealBot_Options_HealthText_OnSelect: UI handler for OnSelect options panel.
function HealBot_Options_HealthText_OnSelect() function HealBot_Options_HealthText_OnSelect()
HealBot_Config.ShowHealthText = this:GetID() - 1; HealBot_Config.ShowHealthText = this:GetID() - 1;
HealBot_UIDropDownMenu_SetSelectedID(HealBot_Options_HealthText, this:GetID()) HealBot_UIDropDownMenu_SetSelectedID(HealBot_Options_HealthText, this:GetID())
@@ -119,6 +143,7 @@ local HealBot_Options_EmergencyFClass_List = {
HEALBOT_CLASSES_CUSTOM, HEALBOT_CLASSES_CUSTOM,
} }
-- HealBot_Options_EmergencyFClass_DropDown: UI handler for DropDown options panel.
function HealBot_Options_EmergencyFClass_DropDown() function HealBot_Options_EmergencyFClass_DropDown()
for i=1, getn(HealBot_Options_EmergencyFClass_List), 1 do for i=1, getn(HealBot_Options_EmergencyFClass_List), 1 do
local info = {}; local info = {};
@@ -128,27 +153,32 @@ function HealBot_Options_EmergencyFClass_DropDown()
end end
end end
-- HealBot_Options_EmergencyFClass_Initialize: UI handler for Initialize options panel.
function HealBot_Options_EmergencyFClass_Initialize() function HealBot_Options_EmergencyFClass_Initialize()
UIDropDownMenu_Initialize(HealBot_Options_EmergencyFClass,HealBot_Options_EmergencyFClass_DropDown) UIDropDownMenu_Initialize(HealBot_Options_EmergencyFClass,HealBot_Options_EmergencyFClass_DropDown)
end end
-- HealBot_Options_EmergencyFClass_Refresh: UI handler for Refresh options panel.
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 !
HealBot_UIDropDownMenu_SetSelectedID(HealBot_Options_EmergencyFClass,HealBot_Config.EmergencyFClass) HealBot_UIDropDownMenu_SetSelectedID(HealBot_Options_EmergencyFClass,HealBot_Config.EmergencyFClass)
end end
-- HealBot_Options_EmergencyFClass_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_EmergencyFClass_OnLoad() function HealBot_Options_EmergencyFClass_OnLoad()
UIDropDownMenu_Initialize(this, HealBot_Options_EmergencyFClass_DropDown) UIDropDownMenu_Initialize(this, HealBot_Options_EmergencyFClass_DropDown)
UIDropDownMenu_SetWidth(100, this) UIDropDownMenu_SetWidth(100, this)
end end
-- HealBot_Options_EmergencyFClass_OnSelect: UI handler for OnSelect options panel.
function HealBot_Options_EmergencyFClass_OnSelect() function HealBot_Options_EmergencyFClass_OnSelect()
HealBot_Config.EmergencyFClass = this:GetID() HealBot_Config.EmergencyFClass = this:GetID()
HealBot_Options_EmergencyFClass_Refresh(true) HealBot_Options_EmergencyFClass_Refresh(true)
HealBot_Options_EFClass_Reset() HealBot_Options_EFClass_Reset()
end end
-- HealBot_Options_EFClass_Reset: UI handler for Reset options panel.
function HealBot_Options_EFClass_Reset() function HealBot_Options_EFClass_Reset()
if HealBot_Config.EmergencyFClass==1 then if HealBot_Config.EmergencyFClass==1 then
HealBot_Options_EFClassDruid:SetChecked(HealBot_Config.EmergIncMelee[HEALBOT_DRUID]); HealBot_Options_EFClassDruid:SetChecked(HealBot_Config.EmergIncMelee[HEALBOT_DRUID]);
@@ -202,6 +232,7 @@ local HealBot_Options_ExtraSort_List = {
HEALBOT_SORTBY_MAXHEALTH, HEALBOT_SORTBY_MAXHEALTH,
} }
-- HealBot_Options_ExtraSort_DropDown: UI handler for DropDown options panel.
function HealBot_Options_ExtraSort_DropDown() function HealBot_Options_ExtraSort_DropDown()
for i=1, getn(HealBot_Options_ExtraSort_List), 1 do for i=1, getn(HealBot_Options_ExtraSort_List), 1 do
local info = {}; local info = {};
@@ -211,21 +242,25 @@ function HealBot_Options_ExtraSort_DropDown()
end end
end end
-- HealBot_Options_ExtraSort_Initialize: UI handler for Initialize options panel.
function HealBot_Options_ExtraSort_Initialize() function HealBot_Options_ExtraSort_Initialize()
UIDropDownMenu_Initialize(HealBot_Options_ExtraSort,HealBot_Options_ExtraSort_DropDown) UIDropDownMenu_Initialize(HealBot_Options_ExtraSort,HealBot_Options_ExtraSort_DropDown)
end end
-- HealBot_Options_ExtraSort_Refresh: UI handler for Refresh options panel.
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 !
HealBot_UIDropDownMenu_SetSelectedID(HealBot_Options_ExtraSort,HealBot_Config.ExtraOrder) HealBot_UIDropDownMenu_SetSelectedID(HealBot_Options_ExtraSort,HealBot_Config.ExtraOrder)
end end
-- HealBot_Options_ExtraSort_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_ExtraSort_OnLoad() function HealBot_Options_ExtraSort_OnLoad()
UIDropDownMenu_Initialize(this, HealBot_Options_ExtraSort_DropDown) UIDropDownMenu_Initialize(this, HealBot_Options_ExtraSort_DropDown)
UIDropDownMenu_SetWidth(100, this) UIDropDownMenu_SetWidth(100, this)
end end
-- HealBot_Options_ExtraSort_OnSelect: UI handler for OnSelect options panel.
function HealBot_Options_ExtraSort_OnSelect() function HealBot_Options_ExtraSort_OnSelect()
HealBot_Config.ExtraOrder = this:GetID() HealBot_Config.ExtraOrder = this:GetID()
HealBot_Options_ExtraSort_Refresh(true) HealBot_Options_ExtraSort_Refresh(true)
@@ -234,6 +269,7 @@ end
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
-- HealBot_Options_EmergencyFilter_DropDown: UI handler for DropDown options panel.
function HealBot_Options_EmergencyFilter_DropDown() function HealBot_Options_EmergencyFilter_DropDown()
for i=1, getn(HealBot_Options_EmergencyFilter_List), 1 do for i=1, getn(HealBot_Options_EmergencyFilter_List), 1 do
local info = {}; local info = {};
@@ -244,11 +280,13 @@ function HealBot_Options_EmergencyFilter_DropDown()
end end
-- HealBot_Options_EmergencyFilter_Initialize: UI handler for Initialize options panel.
function HealBot_Options_EmergencyFilter_Initialize() function HealBot_Options_EmergencyFilter_Initialize()
UIDropDownMenu_Initialize(HealBot_Options_EmergencyFilter,HealBot_Options_EmergencyFilter_DropDown) UIDropDownMenu_Initialize(HealBot_Options_EmergencyFilter,HealBot_Options_EmergencyFilter_DropDown)
end end
-- HealBot_Options_EmergencyFilter_Refresh: UI handler for Refresh options panel.
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 !
@@ -256,18 +294,21 @@ function HealBot_Options_EmergencyFilter_Refresh(onselect)
end end
-- HealBot_Options_EmergencyFilter_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_EmergencyFilter_OnLoad() function HealBot_Options_EmergencyFilter_OnLoad()
UIDropDownMenu_Initialize(this, HealBot_Options_EmergencyFilter_DropDown) UIDropDownMenu_Initialize(this, HealBot_Options_EmergencyFilter_DropDown)
UIDropDownMenu_SetWidth(100, this) UIDropDownMenu_SetWidth(100, this)
end end
-- HealBot_Options_EmergencyFilter_OnSelect: UI handler for OnSelect options panel.
function HealBot_Options_EmergencyFilter_OnSelect() function HealBot_Options_EmergencyFilter_OnSelect()
HealBot_Config.EmergIncMonitor = this:GetID() HealBot_Config.EmergIncMonitor = this:GetID()
HealBot_Options_EmergencyFilter_Refresh(true) HealBot_Options_EmergencyFilter_Refresh(true)
HealBot_Options_EmergencyFilter_Reset() HealBot_Options_EmergencyFilter_Reset()
end end
-- HealBot_Options_EmergencyFilter_Reset: UI handler for Reset options panel.
function HealBot_Options_EmergencyFilter_Reset() function HealBot_Options_EmergencyFilter_Reset()
HealBot_EmergInc[HEALBOT_DRUID] = 0; HealBot_EmergInc[HEALBOT_DRUID] = 0;
@@ -279,7 +320,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==2 then if HealBot_Config.EmergIncMonitor==1 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;
@@ -289,27 +330,7 @@ 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==3 then elseif HealBot_Config.EmergIncMonitor==2 then
HealBot_EmergInc[HEALBOT_DRUID] = 1;
elseif HealBot_Config.EmergIncMonitor==4 then
HealBot_EmergInc[HEALBOT_HUNTER] = 1;
elseif HealBot_Config.EmergIncMonitor==5 then
HealBot_EmergInc[HEALBOT_MAGE] = 1;
elseif HealBot_Config.EmergIncMonitor==6 then
HealBot_EmergInc[HEALBOT_PALADIN] = 1;
elseif HealBot_Config.EmergIncMonitor==7 then
HealBot_EmergInc[HEALBOT_PRIEST] = 1;
elseif HealBot_Config.EmergIncMonitor==8 then
HealBot_EmergInc[HEALBOT_ROGUE] = 1;
elseif HealBot_Config.EmergIncMonitor==9 then
HealBot_EmergInc[HEALBOT_SHAMAN] = 1;
elseif HealBot_Config.EmergIncMonitor==10 then
HealBot_EmergInc[HEALBOT_WARLOCK] = 1;
elseif HealBot_Config.EmergIncMonitor==11 then
HealBot_EmergInc[HEALBOT_WARRIOR] = 1;
elseif HealBot_Config.EmergIncMonitor==12 then
-- Pets: no player classes enabled (handled separately in layout)
elseif HealBot_Config.EmergIncMonitor==13 then
HealBot_EmergInc[HEALBOT_DRUID] = HealBot_Config.EmergIncMelee[HEALBOT_DRUID]; HealBot_EmergInc[HEALBOT_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];
@@ -319,7 +340,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==14 then elseif HealBot_Config.EmergIncMonitor==3 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];
@@ -329,7 +350,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==15 then elseif HealBot_Config.EmergIncMonitor==4 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];
@@ -339,7 +360,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==16 then elseif HealBot_Config.EmergIncMonitor==5 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];
@@ -353,15 +374,3 @@ function HealBot_Options_EmergencyFilter_Reset()
HealBot_Action_PartyChanged() HealBot_Action_PartyChanged()
end end
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
+14 -1
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>
@@ -95,6 +95,19 @@
<OnClick>HealBot_Options_EmergencyHeals_OnClick(this)</OnClick> <OnClick>HealBot_Options_EmergencyHeals_OnClick(this)</OnClick>
</Scripts> </Scripts>
</CheckButton> </CheckButton>
<CheckButton name="HealBot_Options_PetHeals" inherits="OptionsCheckButtonTemplate">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_GroupHeals" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="244" y="5" />
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_PetHeals_OnLoad(this,HEALBOT_OPTIONS_PETHEALS)</OnLoad>
<OnClick>HealBot_Options_PetHeals_OnClick(this)</OnClick>
</Scripts>
</CheckButton>
</Frames> </Frames>
</Frame> </Frame>
+7
View File
@@ -0,0 +1,7 @@
-- HealBot_Options_Integrations_OnShow: UI handler for OnShow options panel.
function HealBot_Options_Integrations_OnShow(this)
HealBot_Options_Integrations_UnitXP:SetChecked(HealBot_Config.HealBot_Integrations_UnitXP);
HealBot_Options_Integrations_Nampower:SetChecked(HealBot_Config.HealBot_Integrations_Nampower);
HealBot_Options_Integrations_SuperWoW:SetChecked(HealBot_Config.HealBot_Integrations_SuperWoW);
HealBot_Options_Integrations_ClassicAPI:SetChecked(HealBot_Config.HealBot_Integrations_ClassicAPI);
end
+105
View File
@@ -0,0 +1,105 @@
<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_Integrations.lua" />
<Frame name="HealBot_Options_Panel9" hidden="true" parent="HealBot_Options" setAllPoints="true">
<Frames>
<CheckButton name="HealBot_Options_Integrations_UnitXP" inherits="OptionsCheckButtonTemplate">
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="31" y="-40"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>
getglobal(this:GetName().."Text"):SetText("Enable UnitXP_SP3 Integration (Distance/LoS)");
</OnLoad>
<OnClick>
HealBot_Config.HealBot_Integrations_UnitXP = this:GetChecked() and 1 or 0;
HealBot_Integrations_Toggle();
</OnClick>
</Scripts>
</CheckButton>
<CheckButton name="HealBot_Options_Integrations_Nampower" inherits="OptionsCheckButtonTemplate">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_Integrations_UnitXP" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="0" y="5"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>
getglobal(this:GetName().."Text"):SetText("Enable nampower Integration (Buffs/Heals/Queueing)");
</OnLoad>
<OnClick>
HealBot_Config.HealBot_Integrations_Nampower = this:GetChecked() and 1 or 0;
HealBot_Integrations_Toggle();
</OnClick>
</Scripts>
</CheckButton>
<CheckButton name="HealBot_Options_Integrations_SuperWoW" inherits="OptionsCheckButtonTemplate">
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="31" y="-145"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>
getglobal(this:GetName().."Text"):SetText("Enable SuperWoW Integration (GUID Tracking)");
</OnLoad>
<OnClick>
HealBot_Config.HealBot_Integrations_SuperWoW = this:GetChecked() and 1 or 0;
HealBot_Integrations_Toggle();
</OnClick>
</Scripts>
</CheckButton>
<CheckButton name="HealBot_Options_Integrations_ClassicAPI" inherits="OptionsCheckButtonTemplate">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_Integrations_SuperWoW" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="0" y="5"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>
getglobal(this:GetName().."Text"):SetText("Enable ClassicAPI Integration (+Healing/Focus/Distance)");
</OnLoad>
<OnClick>
HealBot_Config.HealBot_Integrations_ClassicAPI = this:GetChecked() and 1 or 0;
HealBot_Integrations_Toggle();
</OnClick>
</Scripts>
</CheckButton>
</Frames>
<Layers>
<Layer level="ARTWORK">
<FontString name="HealBot_Options_Integrations_NampowerInfo" inherits="GameFontHighlightSmall" justifyH="LEFT" justifyV="TOP" text="Note: For the 1-click Shapeshift auto-unshift to work smoothly, you must ENABLE 'Retry server rejected spells' in Nampower ENABLE Queue Instant Cast Spells and Queue Cast Time Spells.">
<Size x="330" y="30"/>
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="65" y="-95"/>
</Offset>
</Anchor>
</Anchors>
<Color r="0.7" g="0.7" b="0.7"/>
</FontString>
</Layer>
</Layers>
<Scripts>
<OnShow>
HealBot_Options_Integrations_OnShow(this);
</OnShow>
</Scripts>
</Frame>
</Ui>
+32
View File
@@ -1,6 +1,25 @@
-- 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
-- HealBot_Options_BarMaxRowsS_OnValueChanged: UI handler for OnValueChanged options panel.
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
-- HealBot_Options_GridOrientation_OnClick: UI handler for OnClick options panel.
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
-- HealBot_Options_NewSkin_OnTextChanged: UI handler for OnTextChanged options panel.
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
@@ -9,8 +28,13 @@ function HealBot_Options_NewSkin_OnTextChanged(this)
HealBot_Options_NewSkinb:Disable(); HealBot_Options_NewSkinb:Disable();
end end
end end
-- HealBot_Options_NewSkinb_OnClick: UI handler for OnClick options panel.
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]
@@ -53,9 +77,12 @@ function HealBot_Options_NewSkinb_OnClick(this)
HealBot_Options_SetSkins() HealBot_Options_SetSkins()
HealBot_Options_NewSkin:SetText("") HealBot_Options_NewSkin:SetText("")
end end
-- HealBot_Options_DeleteSkin_OnClick: UI handler for OnClick options panel.
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
@@ -98,6 +125,7 @@ function HealBot_Options_DeleteSkin_OnClick(this)
HealBot_Options_SetSkins() HealBot_Options_SetSkins()
end end
end end
-- HealBot_Options_Skins_DropDown: UI handler for DropDown options panel.
function HealBot_Options_Skins_DropDown() function HealBot_Options_Skins_DropDown()
for i=1, getn(HealBot_Skins), 1 do for i=1, getn(HealBot_Skins), 1 do
local info = {}; local info = {};
@@ -106,18 +134,22 @@ function HealBot_Options_Skins_DropDown()
UIDropDownMenu_AddButton(info); UIDropDownMenu_AddButton(info);
end end
end end
-- HealBot_Options_Skins_Initialize: UI handler for Initialize options panel.
function HealBot_Options_Skins_Initialize() function HealBot_Options_Skins_Initialize()
UIDropDownMenu_Initialize(HealBot_Options_Skins,HealBot_Options_Skins_DropDown) UIDropDownMenu_Initialize(HealBot_Options_Skins,HealBot_Options_Skins_DropDown)
end end
-- HealBot_Options_Skins_Refresh: UI handler for Refresh options panel.
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 !
HealBot_UIDropDownMenu_SetSelectedID(HealBot_Options_Skins,HealBot_Config.Skin_ID) HealBot_UIDropDownMenu_SetSelectedID(HealBot_Options_Skins,HealBot_Config.Skin_ID)
end end
-- HealBot_Options_Skins_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_Skins_OnLoad() function HealBot_Options_Skins_OnLoad()
UIDropDownMenu_Initialize(this, HealBot_Options_Skins_DropDown) UIDropDownMenu_Initialize(this, HealBot_Options_Skins_DropDown)
UIDropDownMenu_SetWidth(100, this) UIDropDownMenu_SetWidth(100, this)
end end
-- HealBot_Options_Skins_OnSelect: UI handler for OnSelect options panel.
function HealBot_Options_Skins_OnSelect() function HealBot_Options_Skins_OnSelect()
HealBot_Config.Skin_ID = this:GetID() HealBot_Config.Skin_ID = this:GetID()
HealBot_Options_Skins_Refresh(true) HealBot_Options_Skins_Refresh(true)
+71 -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>
@@ -374,6 +360,72 @@
<OnValueChanged>HealBot_Options_FontHeight_OnValueChanged(this)</OnValueChanged> <OnValueChanged>HealBot_Options_FontHeight_OnValueChanged(this)</OnValueChanged>
</Scripts> </Scripts>
</Slider> </Slider>
<Slider name="HealBot_Options_IconSizeS" inherits="HealBot_Options_SliderTemplate">
<Size>
<AbsDimension x="123" y="17" />
</Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_FontHeight" relativePoint="TOPRIGHT">
<Offset>
<AbsDimension x="10" y="0" />
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_val_OnLoad(this,"Icon size",5,30)</OnLoad>
<OnValueChanged>HealBot_Options_IconSizeS_OnValueChanged(this)</OnValueChanged>
</Scripts>
</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>
+25 -15
View File
@@ -1,9 +1,11 @@
-- HealBot Options panel file: HealBot_Options_Spells.lua -- HealBot Options panel file: HealBot_Options_Spells.lua
-- Split from original HealBot_Options.lua -- Split from original HealBot_Options.lua
-- HealBot_ComboButtons_Button_OnLoad: UI handler for dropdown combo box.
function HealBot_ComboButtons_Button_OnLoad(this,text) function HealBot_ComboButtons_Button_OnLoad(this,text)
getglobal(this:GetName().."Text"):SetText(text); getglobal(this:GetName().."Text"):SetText(text);
end end
-- HealBot_ComboButtons_Button_OnClick: Click event handler.
function HealBot_ComboButtons_Button_OnClick(this,id) function HealBot_ComboButtons_Button_OnClick(this,id)
if HealBot_Options_ComboButtons_Button>0 then if HealBot_Options_ComboButtons_Button>0 then
getglobal("HealBot_ComboButtons_Button"..HealBot_Options_ComboButtons_Button):SetChecked(nil); getglobal("HealBot_ComboButtons_Button"..HealBot_Options_ComboButtons_Button):SetChecked(nil);
@@ -14,27 +16,35 @@ function HealBot_ComboButtons_Button_OnClick(this,id)
end end
HealBot_Options_ComboClass_Text() HealBot_Options_ComboClass_Text()
end end
-- HealBot_Options_ShowTooltip_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_ShowTooltip_OnLoad(this,text) function HealBot_Options_ShowTooltip_OnLoad(this,text)
getglobal(this:GetName().."Text"):SetText(text); getglobal(this:GetName().."Text"):SetText(text);
end end
-- HealBot_Options_ShowTooltip_OnClick: UI handler for OnClick options panel.
function HealBot_Options_ShowTooltip_OnClick(this) function HealBot_Options_ShowTooltip_OnClick(this)
HealBot_Config.ShowTooltip = this:GetChecked() or 0; HealBot_Config.ShowTooltip = this:GetChecked() or 0;
end end
-- HealBot_Options_ShowTooltipTarget_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_ShowTooltipTarget_OnLoad(this,text) function HealBot_Options_ShowTooltipTarget_OnLoad(this,text)
getglobal(this:GetName().."Text"):SetText(text); getglobal(this:GetName().."Text"):SetText(text);
end end
-- HealBot_Options_ShowTooltipTarget_OnClick: UI handler for OnClick options panel.
function HealBot_Options_ShowTooltipTarget_OnClick(this) function HealBot_Options_ShowTooltipTarget_OnClick(this)
HealBot_Config.Tooltip_ShowTarget = this:GetChecked() or 0; HealBot_Config.Tooltip_ShowTarget = this:GetChecked() or 0;
end end
-- HealBot_Options_ShowTooltipSpellDetail_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_ShowTooltipSpellDetail_OnLoad(this,text) function HealBot_Options_ShowTooltipSpellDetail_OnLoad(this,text)
getglobal(this:GetName().."Text"):SetText(text); getglobal(this:GetName().."Text"):SetText(text);
end end
-- HealBot_Options_ShowTooltipSpellDetail_OnClick: UI handler for OnClick options panel.
function HealBot_Options_ShowTooltipSpellDetail_OnClick(this) function HealBot_Options_ShowTooltipSpellDetail_OnClick(this)
HealBot_Config.Tooltip_ShowSpellDetail = this:GetChecked() or 0; HealBot_Config.Tooltip_ShowSpellDetail = this:GetChecked() or 0;
end end
-- HealBot_Options_ShowTooltipInstant_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_ShowTooltipInstant_OnLoad(this,text) function HealBot_Options_ShowTooltipInstant_OnLoad(this,text)
getglobal(this:GetName().."Text"):SetText(text); getglobal(this:GetName().."Text"):SetText(text);
end end
-- HealBot_Options_ShowTooltipInstant_OnClick: UI handler for OnClick options panel.
function HealBot_Options_ShowTooltipInstant_OnClick(this) function HealBot_Options_ShowTooltipInstant_OnClick(this)
HealBot_Config.Tooltip_Recommend = this:GetChecked() or 0; HealBot_Config.Tooltip_Recommend = this:GetChecked() or 0;
end end
@@ -46,6 +56,7 @@ local HealBot_Options_TooltipPos_List = {
HEALBOT_TOOLTIP_POSBELOW, HEALBOT_TOOLTIP_POSBELOW,
} }
-- HealBot_Options_TooltipPos_DropDown: UI handler for DropDown options panel.
function HealBot_Options_TooltipPos_DropDown() function HealBot_Options_TooltipPos_DropDown()
for i=1, getn(HealBot_Options_TooltipPos_List), 1 do for i=1, getn(HealBot_Options_TooltipPos_List), 1 do
local info = {}; local info = {};
@@ -55,21 +66,25 @@ function HealBot_Options_TooltipPos_DropDown()
end end
end end
-- HealBot_Options_TooltipPos_Initialize: UI handler for Initialize options panel.
function HealBot_Options_TooltipPos_Initialize() function HealBot_Options_TooltipPos_Initialize()
UIDropDownMenu_Initialize(HealBot_Options_TooltipPos,HealBot_Options_TooltipPos_DropDown) UIDropDownMenu_Initialize(HealBot_Options_TooltipPos,HealBot_Options_TooltipPos_DropDown)
end end
-- HealBot_Options_TooltipPos_Refresh: UI handler for Refresh options panel.
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 !
HealBot_UIDropDownMenu_SetSelectedID(HealBot_Options_TooltipPos,HealBot_Config.TooltipPos) HealBot_UIDropDownMenu_SetSelectedID(HealBot_Options_TooltipPos,HealBot_Config.TooltipPos)
end end
-- HealBot_Options_TooltipPos_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_TooltipPos_OnLoad() function HealBot_Options_TooltipPos_OnLoad()
UIDropDownMenu_Initialize(this, HealBot_Options_TooltipPos_DropDown) UIDropDownMenu_Initialize(this, HealBot_Options_TooltipPos_DropDown)
UIDropDownMenu_SetWidth(128, this) UIDropDownMenu_SetWidth(128, this)
end end
-- HealBot_Options_TooltipPos_OnSelect: UI handler for OnSelect options panel.
function HealBot_Options_TooltipPos_OnSelect() function HealBot_Options_TooltipPos_OnSelect()
HealBot_Config.TooltipPos = this:GetID() HealBot_Config.TooltipPos = this:GetID()
HealBot_Options_TooltipPos_Refresh(true) HealBot_Options_TooltipPos_Refresh(true)
@@ -91,6 +106,7 @@ local HealBot_Options_ComboClass_List = {
-- HealBot_Options_ComboClass_Text: UI handler for Text options panel.
function HealBot_Options_ComboClass_Text() function HealBot_Options_ComboClass_Text()
local class=UnitClass("Player"); local class=UnitClass("Player");
local combo = HealBot_Config.KeyCombo[class] local combo = HealBot_Config.KeyCombo[class]
@@ -108,6 +124,7 @@ end
-- HealBot_Options_ComboClass_Button: UI handler for Button options panel.
function HealBot_Options_ComboClass_Button() function HealBot_Options_ComboClass_Button()
local button = "Left" local button = "Left"
if HealBot_Options_ComboButtons_Button==2 then button = "Middle"; end if HealBot_Options_ComboButtons_Button==2 then button = "Middle"; end
@@ -128,10 +145,12 @@ ColorPickerFrame.func = HealBot_Returned_Colours
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
-- HealBot_Options_EditBox_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_EditBox_OnLoad(this,text) function HealBot_Options_EditBox_OnLoad(this,text)
getglobal(this:GetName().."Text"):SetText(text); getglobal(this:GetName().."Text"):SetText(text);
end end
-- HealBot_Options_Click_OnTextChanged: UI handler for OnTextChanged options panel.
function HealBot_Options_Click_OnTextChanged(this) function HealBot_Options_Click_OnTextChanged(this)
local class=UnitClass("Player"); local class=UnitClass("Player");
if not HealBot_Config.KeyCombo[class] then HealBot_Config.KeyCombo[class] = {} end if not HealBot_Config.KeyCombo[class] then HealBot_Config.KeyCombo[class] = {} end
@@ -141,6 +160,7 @@ function HealBot_Options_Click_OnTextChanged(this)
HealBot_Options_KeyCombo_Change() HealBot_Options_KeyCombo_Change()
end end
-- HealBot_Options_Shift_OnTextChanged: UI handler for OnTextChanged options panel.
function HealBot_Options_Shift_OnTextChanged(this) function HealBot_Options_Shift_OnTextChanged(this)
local class=UnitClass("Player"); local class=UnitClass("Player");
if not HealBot_Config.KeyCombo[class] then HealBot_Config.KeyCombo[class] = {} end if not HealBot_Config.KeyCombo[class] then HealBot_Config.KeyCombo[class] = {} end
@@ -150,6 +170,7 @@ function HealBot_Options_Shift_OnTextChanged(this)
HealBot_Options_KeyCombo_Change() HealBot_Options_KeyCombo_Change()
end end
-- HealBot_Options_Ctrl_OnTextChanged: UI handler for OnTextChanged options panel.
function HealBot_Options_Ctrl_OnTextChanged(this) function HealBot_Options_Ctrl_OnTextChanged(this)
local class=UnitClass("Player"); local class=UnitClass("Player");
if not HealBot_Config.KeyCombo[class] then HealBot_Config.KeyCombo[class] = {} end if not HealBot_Config.KeyCombo[class] then HealBot_Config.KeyCombo[class] = {} end
@@ -159,6 +180,7 @@ function HealBot_Options_Ctrl_OnTextChanged(this)
HealBot_Options_KeyCombo_Change() HealBot_Options_KeyCombo_Change()
end end
-- HealBot_Options_ShiftCtrl_OnTextChanged: UI handler for OnTextChanged options panel.
function HealBot_Options_ShiftCtrl_OnTextChanged(this) function HealBot_Options_ShiftCtrl_OnTextChanged(this)
local class=UnitClass("Player"); local class=UnitClass("Player");
if not HealBot_Config.KeyCombo[class] then HealBot_Config.KeyCombo[class] = {} end if not HealBot_Config.KeyCombo[class] then HealBot_Config.KeyCombo[class] = {} end
@@ -168,32 +190,20 @@ function HealBot_Options_ShiftCtrl_OnTextChanged(this)
HealBot_Options_KeyCombo_Change() HealBot_Options_KeyCombo_Change()
end end
-- HealBot_Options_KeyCombo_Change: Applies binding combo updates.
function HealBot_Options_KeyCombo_Change() function HealBot_Options_KeyCombo_Change()
local class=UnitClass("Player"); local class=UnitClass("Player");
HealBot_Config.KeyCombo[class]=HealBot_Config.KeyCombo[class]; HealBot_Config.KeyCombo[class]=HealBot_Config.KeyCombo[class];
end end
-- HealBot_Options_EnableHealthy_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_EnableHealthy_OnLoad(this,text) function HealBot_Options_EnableHealthy_OnLoad(this,text)
getglobal(this:GetName().."Text"):SetText(text); getglobal(this:GetName().."Text"):SetText(text);
end end
-- HealBot_Options_EnableHealthy_OnClick: UI handler for OnClick options panel.
function HealBot_Options_EnableHealthy_OnClick(this) function HealBot_Options_EnableHealthy_OnClick(this)
HealBot_Config.EnableHealthy = this:GetChecked() or 0; HealBot_Config.EnableHealthy = this:GetChecked() or 0;
HealBot_Action_EnableButtons(); HealBot_Action_EnableButtons();
end end
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- Chat Custom Messages UI Logic
--------------------------------------------------------------------------------
+432 -96
View File
@@ -13,9 +13,11 @@ HealBot_Action_HealGroup = {
}; };
HealBot_Action_HealTarget = {}; HealBot_Action_HealTarget = {};
HealBot_Action_HealFocus = {};
HealBot_Action_HealButtons = {}; HealBot_Action_HealButtons = {};
HealBot_Action_UnitButtons = {}; HealBot_Action_UnitButtons = {};
-- HealBot_Action_SetTexture: Internal utility: HealBot_Action_SetTexture
function HealBot_Action_SetTexture(bar, btexture) function HealBot_Action_SetTexture(bar, btexture)
if not bar then return end if not bar then return end
if btexture == 10 then if btexture == 10 then
@@ -25,26 +27,18 @@ function HealBot_Action_SetTexture(bar, btexture)
end end
end end
-- HealBot_HealthColor: Computes health bar RGBA based on debuffs and class.
function HealBot_HealthColor(unit, hlth, maxhlth) function HealBot_HealthColor(unit, hlth, maxhlth)
if HealBot_UnitDebuff[unit] then local cached_debuff = HealBot_UnitDebuff[unit]
local debuff, tmp, debuff_type = UnitDebuff(unit, 1, 1) if cached_debuff then
if not debuff then local color = HealBot_Config.CDCBarColour[cached_debuff]
HealBot_UnitDebuff[unit] = nil; if color then
HealBot_UnitDebuff[unit .. "_debuff_texture"] = nil local dr = color.R
else local dg = color.G
local dr = HealBot_Config.CDCBarColour[debuff_type].R local db = color.B
local dg = HealBot_Config.CDCBarColour[debuff_type].G
local db = HealBot_Config.CDCBarColour[debuff_type].B
if HealBot_Config.btexture[HealBot_Config.Current_Skin] == 10 then
dr = dr * 4
dg = dg * 4
db = db * 4
if dr > 1 then dr = 1 end
if dg > 1 then dg = 1 end
if db > 1 then db = 1 end
end
return dr, dg, db, HealBot_Config.Barcola[HealBot_Config.Current_Skin]; return dr, dg, db, HealBot_Config.Barcola[HealBot_Config.Current_Skin];
end end
return dr, dg, db, HealBot_Config.Barcola[HealBot_Config.Current_Skin];
end end
local text = UnitName(unit); local text = UnitName(unit);
@@ -70,13 +64,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
end elseif colorMode == 2 and string.find(unit, "pet") then
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
@@ -86,29 +80,46 @@ function HealBot_HealthColor(unit, hlth, maxhlth)
return r, g, b, a; return r, g, b, a;
end end
-- HealBot_Action_HealthBar: Internal utility: HealBot_Action_HealthBar
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
-- HealBot_Action_HealthBar2: Internal utility: HealBot_Action_HealthBar2
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
-- HealBot_Action_EnableButton: Updates a button's health, color, text, and debuffs.
function HealBot_Action_EnableButton(button) function HealBot_Action_EnableButton(button)
local unit = button.unit; local unit = button.unit;
local state = HealBot_Model.units[unit] local state = HealBot_Model.units[unit]
if not state then return end if not state then return end
if not state.englishClass then
HealBot_Model:UpdateUnitIdentity(unit)
end
local hlth = state.health local hlth = state.health
local maxhlth = state.maxHealth local maxhlth = state.maxHealth
local name = state.name local name = state.name
if not name then name = UnitName(unit) end -- fallback if not name then name = UnitName(unit) end -- fallback
if not name or name == "Unknown" then
button:Hide()
return
end
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];
@@ -175,7 +186,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
@@ -241,25 +252,41 @@ function HealBot_Action_EnableButton(button)
bar.txt:SetFont(fontName, fontHeight, "") bar.txt:SetFont(fontName, fontHeight, "")
end end
for i = 1, 5 do local iconSize = HealBot_Config.biconsize[HealBot_Config.Current_Skin] or 12
for i = 1, 10 do
local icon = getglobal(button:GetName() .. "BarIcon" .. i) local icon = getglobal(button:GetName() .. "BarIcon" .. i)
if icon then if icon then
if HealBot_UnitIcons and HealBot_UnitIcons[unit] and HealBot_UnitIcons[unit][i] then if HealBot_UnitIcons and HealBot_UnitIcons[unit] and HealBot_UnitIcons[unit][i] then
icon:SetTexture(HealBot_UnitIcons[unit][i]) icon:SetTexture(HealBot_UnitIcons[unit][i])
icon:SetWidth(iconSize)
icon:SetHeight(iconSize)
icon:Show() icon:Show()
else else
icon:Hide() icon:Hide()
end end
end end
end end
local raidIcon = getglobal(button:GetName() .. "BarRaidIcon")
if raidIcon then
local index = GetRaidTargetIndex(unit)
if index then
SetRaidTargetIconTexture(raidIcon, index)
raidIcon:Show()
else
raidIcon:Hide()
end
end
end end
-- HealBot_Action_EnableButtons: Internal utility: HealBot_Action_EnableButtons
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
-- HealBot_Action_RefreshButton: Calls EnableButton if unit is valid.
function HealBot_Action_RefreshButton(button) function HealBot_Action_RefreshButton(button)
if not button then return end if not button then return end
local unit = button.unit; local unit = button.unit;
@@ -268,6 +295,7 @@ function HealBot_Action_RefreshButton(button)
end end
end end
-- HealBot_Action_ResetSkin: Internal utility: HealBot_Action_ResetSkin
function HealBot_Action_ResetSkin() function HealBot_Action_ResetSkin()
HealBot_Action_PartyChanged() HealBot_Action_PartyChanged()
if HealBot_Options:IsVisible() then if HealBot_Options:IsVisible() then
@@ -283,18 +311,36 @@ function HealBot_Action_ResetSkin()
end end
end end
-- HealBot_Action_RefreshButtons: Refreshes all active unit buttons.
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
-- HealBot_Action_RefreshPower: Fast path: updates only mana bar textures.
function HealBot_Action_RefreshPower(unit)
if not unit or not HealBot_Action_UnitButtons[unit] then return end
local state = HealBot_Model.units[unit]
if not state then return end
for index, button in pairs(HealBot_Action_UnitButtons[unit]) do
if not button.bar3 then button.bar3 = getglobal(button:GetName() .. "Bar3") end
local bar3 = button.bar3
if bar3 and bar3:IsVisible() then
bar3:SetMinMaxValues(0, state.maxMana)
bar3:SetValue(state.mana)
end
end
end
-- HealBot_Action_PositionButton: Positions a button element within the grid.
function HealBot_Action_PositionButton(button, OsetX, OsetY, bwidth, bheight, checked, header) function HealBot_Action_PositionButton(button, OsetX, OsetY, bwidth, bheight, checked, header)
local brspace = HealBot_Config.brspace[HealBot_Config.Current_Skin] or 3; local brspace = HealBot_Config.brspace[HealBot_Config.Current_Skin] or 3;
if header then if header then
@@ -330,6 +376,43 @@ function HealBot_Action_PositionButton(button, OsetX, OsetY, bwidth, bheight, ch
return OsetY; return OsetY;
end end
-- HealBot_Action_PositionButtonHorizontal: Internal utility: HealBot_Action_PositionButtonHorizontal
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
-- HealBot_Action_SetHeightWidth: Resizes the main panel frame to fit content.
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);
@@ -355,6 +438,7 @@ function HealBot_Action_SetHeightWidth(width, height, bwidth)
HealBot_Action:SetWidth(width + bwidth + bpadding) HealBot_Action:SetWidth(width + bwidth + bpadding)
end end
-- HealBot_Action_SetHealButton: Assigns a unit string to a grid button slot.
function HealBot_Action_SetHealButton(index, unit) function HealBot_Action_SetHealButton(index, unit)
if not index then if not index then
HealBot_Action_HealButtons = {}; HealBot_Action_HealButtons = {};
@@ -362,6 +446,7 @@ function HealBot_Action_SetHealButton(index, unit)
return nil return nil
end end
local button = getglobal("HealBot_Action_HealUnit" .. index); local button = getglobal("HealBot_Action_HealUnit" .. index);
if not button then return nil end
button.unit = unit; button.unit = unit;
if unit then if unit then
table.insert(HealBot_Action_HealButtons, button); table.insert(HealBot_Action_HealButtons, button);
@@ -373,12 +458,42 @@ function HealBot_Action_SetHealButton(index, unit)
return button; return button;
end end
-- HealBot_Action_PartyChanged: Rebuilds the entire grid layout based on roster.
function HealBot_Action_PartyChanged() function HealBot_Action_PartyChanged()
if not HealBot_IsFighting then if HealBot_IsFighting then
HealBot_Action_AppendNewUnits()
return
end
local numBars = 0; local numBars = 0;
local numHeaders = 0; local numHeaders = 0;
local TempMaxH = 0; local TempMaxH = 0;
local HeaderPos = {}; local HeaderPos = HealBot_GetTable();
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);
@@ -401,10 +516,7 @@ function HealBot_Action_PartyChanged()
local checked_end = 0; local checked_end = 0;
headerno = 0; headerno = 0;
for j = 1, 41 do for j = 1, 100 do
HealBot_Action_SetHealButton(j, nil);
end
for j = 51, 60 do
HealBot_Action_SetHealButton(j, nil); HealBot_Action_SetHealButton(j, nil);
end end
HealBot_Action_SetHealButton(); HealBot_Action_SetHealButton();
@@ -520,17 +632,43 @@ function HealBot_Action_PartyChanged()
numHeaders = numHeaders + 1; numHeaders = numHeaders + 1;
end end
-- Focus
local FocusValid = numBars;
if HealBot_Integrations_ClassicAPI_Active and FocusUnit then
if HealBot_Config.ShowHeader[HealBot_Config.Current_Skin] == 1 then
HeaderPos[i + 1] = "Focus"
end
if HealBot_MayHeal("focus") then
i = i + 1;
h = h + 1;
if h < 61 then
HealBot_Action_SetHealButton(h, "focus");
local check = getglobal("HealBot_Action_HealUnit" .. h .. "Check");
check:SetChecked(0);
check.unit = "focus";
check:Show();
else
HealBot_Action_SetHealButton(i, "focus");
end
numBars = numBars + 1;
end
end
if numBars > FocusValid and HealBot_Config.ShowHeader[HealBot_Config.Current_Skin] == 1 then
numBars = numBars + 1;
numHeaders = numHeaders + 1;
end
last = last + 40 last = last + 40
local ExtraValid = numBars; local ExtraValid = numBars;
if HealBot_Config.EmergencyHeals == 1 then if HealBot_Config.EmergencyHeals == 1 then
local order = {}; local order = HealBot_GetTable();
local units = {}; local units = HealBot_GetTable();
if HealBot_Config.ShowHeader[HealBot_Config.Current_Skin] == 1 and HealBot_Config.ExtraOrder == 1 then if HealBot_Config.ShowHeader[HealBot_Config.Current_Skin] == 1 and HealBot_Config.ExtraOrder == 1 then
HeaderPos[i + 1] = HEALBOT_OPTIONS_EMERGENCYHEALS HeaderPos[i + 1] = HEALBOT_OPTIONS_EMERGENCYHEALS
numBars = numBars + 1; numBars = numBars + 1;
numHeaders = numHeaders + 1; numHeaders = numHeaders + 1;
end end
if HealBot_Config.EmergIncMonitor == 2 then if HealBot_Config.EmergIncMonitor == 1 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;
@@ -563,6 +701,9 @@ function HealBot_Action_PartyChanged()
else else
for _, unit in ipairs(HealBot_Action_HealGroup) do for _, unit in ipairs(HealBot_Action_HealGroup) do
if not HealBot_Action_UnitButtons[unit] and HealBot_MayHeal(unit) then if not HealBot_Action_UnitButtons[unit] and HealBot_MayHeal(unit) then
local name = UnitName(unit) or "not known"
local class = UnitClass(unit) or "not known"
local subgroup = 1
if HealBot_Config.ExtraOrder == 1 then if HealBot_Config.ExtraOrder == 1 then
order[unit] = name; order[unit] = name;
elseif HealBot_Config.ExtraOrder == 2 then elseif HealBot_Config.ExtraOrder == 2 then
@@ -578,50 +719,7 @@ 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
@@ -661,6 +759,9 @@ function HealBot_Action_PartyChanged()
else else
for _, unit in ipairs(HealBot_Action_HealGroup) do for _, unit in ipairs(HealBot_Action_HealGroup) do
if not HealBot_Action_UnitButtons[unit] and HealBot_MayHeal(unit) then if not HealBot_Action_UnitButtons[unit] and HealBot_MayHeal(unit) then
local name = UnitName(unit) or "not known"
local class = UnitClass(unit) or "not known"
local subgroup = 1
if HealBot_Config.ExtraOrder == 1 then if HealBot_Config.ExtraOrder == 1 then
order[unit] = name; order[unit] = name;
elseif HealBot_Config.ExtraOrder == 2 then elseif HealBot_Config.ExtraOrder == 2 then
@@ -685,7 +786,6 @@ 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 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; local name, rank, subgroup, level, class, fileName, zone, online, isDead;
@@ -695,8 +795,13 @@ function HealBot_Action_PartyChanged()
elseif string.sub(units[j], 1, 4) == "raid" then elseif string.sub(units[j], 1, 4) == "raid" then
ownerIndex = tonumber(string.sub(units[j], 5)); ownerIndex = tonumber(string.sub(units[j], 5));
end end
if ownerIndex then if ownerIndex then
name, rank, subgroup, level, class, fileName, zone, online, isDead = GetRaidRosterInfo(ownerIndex); name, rank, subgroup, level, class, fileName, zone, online, isDead = GetRaidRosterInfo(ownerIndex);
else
name = UnitName(units[j]) or "not known";
class = UnitClass(units[j]) or "not known";
subgroup = 1;
end end
if string.sub(units[j], 1, 7) == "raidpet" or string.sub(units[j], 1, 8) == "partypet" or units[j] == "pet" then if string.sub(units[j], 1, 7) == "raidpet" or string.sub(units[j], 1, 8) == "partypet" or units[j] == "pet" then
@@ -728,18 +833,59 @@ function HealBot_Action_PartyChanged()
if i == last then break end if i == last then break end
end end
end end
end
if numBars == ExtraValid + 1 and HealBot_Config.ShowHeader[HealBot_Config.Current_Skin] == 1 then if numBars == ExtraValid + 1 and HealBot_Config.ShowHeader[HealBot_Config.Current_Skin] == 1 then
HeaderPos[i + 1] = nil; HeaderPos[i + 1] = nil;
numBars = numBars - 1; numBars = numBars - 1;
end end
last = last + 40
local PetsValid = numBars;
if HealBot_Config.PetHeals == 1 then
if HealBot_Config.ShowHeader[HealBot_Config.Current_Skin] == 1 then
HeaderPos[i + 1] = HEALBOT_OPTIONS_PETHEALS
numBars = numBars + 1;
numHeaders = numHeaders + 1;
end
if GetNumRaidMembers() > 0 then
for j = 1, 40 do
local unit = "raidpet" .. j;
if not HealBot_Action_UnitButtons[unit] and HealBot_MayHeal(unit) then
i = i + 1;
HealBot_Action_SetHealButton(i, unit);
numBars = numBars + 1;
end
if i == last then break 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
i = i + 1;
HealBot_Action_SetHealButton(i, unit);
numBars = numBars + 1;
end
if i == last then break end
end
end
HealBot_ReleaseTable(order);
HealBot_ReleaseTable(units);
end
if numBars == PetsValid + 1 and HealBot_Config.ShowHeader[HealBot_Config.Current_Skin] == 1 then
HeaderPos[PetsValid + 1] = nil;
numBars = numBars - 1;
numHeaders = numHeaders - 1;
end
local bpadding = (HealBot_Config.bpadding and HealBot_Config.bpadding[HealBot_Config.Current_Skin]) or 10 local bpadding = (HealBot_Config.bpadding and HealBot_Config.bpadding[HealBot_Config.Current_Skin]) or 10
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
@@ -747,33 +893,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];
if orientation == 1 then
OffsetY = HealBot_Action_PositionButton(nil, OffsetX, OffsetY, bwidth, bheight, checked, header); OffsetY = HealBot_Action_PositionButton(nil, OffsetX, OffsetY, bwidth, bheight, checked, header);
if h == math.ceil((numBars) / cols) and z < numBars then if h == limit and z < numBars then
h = 0; h = 0;
if MaxOffsetY < OffsetY then MaxOffsetY = OffsetY; end if MaxOffsetY < OffsetY then MaxOffsetY = OffsetY; end
OffsetY = bpadding; OffsetY = bpadding;
OffsetX = OffsetX + bwidth + bcspace; OffsetX = OffsetX + bwidth + bcspace;
end 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
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
if orientation == 1 then
OffsetY = HealBot_Action_PositionButton(button, OffsetX, OffsetY, bwidth, bheight, checked, nil); OffsetY = HealBot_Action_PositionButton(button, OffsetX, OffsetY, bwidth, bheight, checked, nil);
if h == math.ceil((numBars) / cols) and z < numBars then if h == limit and z < numBars then
h = 0; h = 0;
if MaxOffsetY < OffsetY then MaxOffsetY = OffsetY; end if MaxOffsetY < OffsetY then MaxOffsetY = OffsetY; end
OffsetY = bpadding; OffsetY = bpadding;
OffsetX = OffsetX + bwidth + bcspace; OffsetX = OffsetX + bwidth + bcspace;
end 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
z = z + 1; z = z + 1;
h = h + 1; h = h + 1;
local bar = HealBot_Action_HealthBar(button); local bar = HealBot_Action_HealthBar(button);
@@ -787,9 +964,29 @@ 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 orientation == 1 then
if MaxOffsetY < OffsetY then MaxOffsetY = OffsetY; end 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
HealBot_Grid_LastI = i;
HealBot_Grid_LastH = h;
HealBot_Grid_LastZ = z;
HealBot_Grid_OffsetX = OffsetX;
HealBot_Grid_OffsetY = OffsetY;
HealBot_Grid_MaxOffsetX = MaxOffsetX;
HealBot_Grid_MaxOffsetY = MaxOffsetY;
HealBot_Grid_Limit = limit;
HealBot_Grid_NumBars = numBars;
if HealBot_Config.HideOptions == 1 then if HealBot_Config.HideOptions == 1 then
HealBot_Action_OptionsButton:Hide(); HealBot_Action_OptionsButton:Hide();
@@ -835,11 +1032,12 @@ function HealBot_Action_PartyChanged()
if HealBot_Config.HideParty == 1 and HidePartyFrame then if HealBot_Config.HideParty == 1 and HidePartyFrame then
HidePartyFrame(); HidePartyFrame();
end end
end
HealBot_Action_RefreshButtons(); HealBot_Action_RefreshButtons();
HealBot_ReleaseTable(HeaderPos);
HealBot_Action_ShowFrame(); HealBot_Action_ShowFrame();
end end
-- HealBot_Action_ShowFrame: Internal utility: HealBot_Action_ShowFrame
function HealBot_Action_ShowFrame() function HealBot_Action_ShowFrame()
if HealBot_Config.ActionVisible == 1 then if HealBot_Config.ActionVisible == 1 then
if HealBot_Config.HideSolo == 1 and GetNumPartyMembers() == 0 and GetNumRaidMembers() == 0 then if HealBot_Config.HideSolo == 1 and GetNumPartyMembers() == 0 and GetNumRaidMembers() == 0 then
@@ -852,13 +1050,16 @@ function HealBot_Action_ShowFrame()
end end
end end
-- HealBot_Action_Reset: Resets action panel position and rebuilds layout.
function HealBot_Action_Reset() function HealBot_Action_Reset()
HealBot_Action:ClearAllPoints(); HealBot_Action:ClearAllPoints();
HealBot_Action:SetPoint("TOP", "MinimapCluster", "BOTTOM", 7, 10); HealBot_Action:SetPoint("TOP", "MinimapCluster", "BOTTOM", 7, 10);
HealBot_Action_HealTarget = {}; HealBot_Action_HealTarget = {};
HealBot_Action_HealFocus = {};
HealBot_Action_PartyChanged(); HealBot_Action_PartyChanged();
end end
-- HealBot_Action_Refresh: Alias for refreshing a unit button.
function HealBot_Action_Refresh(unit) function HealBot_Action_Refresh(unit)
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
@@ -885,3 +1086,138 @@ function HealBot_Action_Refresh(unit)
end end
end end
end end
-- HealBot_Action_AppendUnit: Internal utility: HealBot_Action_AppendUnit
function HealBot_Action_AppendUnit(unit)
if not HealBot_Grid_LastI then return end
if HealBot_Grid_LastI >= 100 then return end
HealBot_Grid_LastI = HealBot_Grid_LastI + 1
HealBot_Grid_NumBars = HealBot_Grid_NumBars + 1
local button = HealBot_Action_SetHealButton(HealBot_Grid_LastI, unit)
if not button then return end
local orientation = (HealBot_Config.GridOrientation and HealBot_Config.GridOrientation[HealBot_Config.Current_Skin]) or 1
local bwidth = (HealBot_Config.bwidth and HealBot_Config.bwidth[HealBot_Config.Current_Skin]) or 85
local bheight = (HealBot_Config.bheight and HealBot_Config.bheight[HealBot_Config.Current_Skin]) or 18
local bcspace = (HealBot_Config.bcspace and HealBot_Config.bcspace[HealBot_Config.Current_Skin]) or 3
local brspace = (HealBot_Config.brspace and HealBot_Config.brspace[HealBot_Config.Current_Skin]) or 3
local bpadding = (HealBot_Config.bpadding and HealBot_Config.bpadding[HealBot_Config.Current_Skin]) or 10
if orientation == 1 then
HealBot_Grid_OffsetY = HealBot_Action_PositionButton(button, HealBot_Grid_OffsetX, HealBot_Grid_OffsetY, bwidth, bheight, false, nil)
if HealBot_Grid_LastH == HealBot_Grid_Limit then
HealBot_Grid_LastH = 0
if HealBot_Grid_MaxOffsetY < HealBot_Grid_OffsetY then HealBot_Grid_MaxOffsetY = HealBot_Grid_OffsetY end
HealBot_Grid_OffsetY = bpadding
HealBot_Grid_OffsetX = HealBot_Grid_OffsetX + bwidth + bcspace
end
else
HealBot_Grid_OffsetX = HealBot_Action_PositionButtonHorizontal(button, HealBot_Grid_OffsetX, HealBot_Grid_OffsetY, bwidth, bheight, false, nil)
if HealBot_Grid_LastH == HealBot_Grid_Limit then
HealBot_Grid_LastH = 0
if HealBot_Grid_MaxOffsetX < HealBot_Grid_OffsetX then HealBot_Grid_MaxOffsetX = HealBot_Grid_OffsetX end
HealBot_Grid_OffsetX = bpadding
HealBot_Grid_OffsetY = HealBot_Grid_OffsetY + bheight + brspace
end
end
HealBot_Grid_LastH = HealBot_Grid_LastH + 1
HealBot_Grid_LastZ = HealBot_Grid_LastZ + 1
local bar = HealBot_Action_HealthBar(button)
local bar2 = HealBot_Action_HealthBar2(button)
bar.txt = getglobal(bar:GetName() .. "_text")
bar:SetHeight(bheight)
local btexture = (HealBot_Config.btexture and HealBot_Config.btexture[HealBot_Config.Current_Skin]) or 5
HealBot_Action_SetTexture(bar, btexture)
local btextheight = (HealBot_Config.btextheight and HealBot_Config.btextheight[HealBot_Config.Current_Skin]) or 10
bar.txt:SetTextHeight(btextheight)
bar2:SetHeight(bheight)
HealBot_Action_SetTexture(bar2, btexture)
local totalOffsetX = HealBot_Grid_OffsetX
local totalOffsetY = HealBot_Grid_OffsetY
if orientation == 1 then
if HealBot_Grid_MaxOffsetY < totalOffsetY then HealBot_Grid_MaxOffsetY = totalOffsetY end
totalOffsetY = HealBot_Grid_MaxOffsetY
else
if HealBot_Grid_MaxOffsetX < totalOffsetX then HealBot_Grid_MaxOffsetX = totalOffsetX end
totalOffsetX = HealBot_Grid_MaxOffsetX
totalOffsetY = totalOffsetY + bheight + brspace
end
HealBot_Action_SetHeightWidth(totalOffsetX, totalOffsetY + bpadding, bwidth)
end
-- HealBot_Action_AppendNewUnits: Internal utility: HealBot_Action_AppendNewUnits
function HealBot_Action_AppendNewUnits()
if not HealBot_Grid_LastI then return end
local unitsToCheck = {}
-- Gather units based on config, similar to PartyChanged
if HealBot_Config.GroupHeals == 1 then
for _, unit in ipairs(HealBot_Action_HealGroup) do
table.insert(unitsToCheck, unit)
end
end
if HealBot_Config.TankHeals == 1 and GetNumRaidMembers() > 0 and CT_RA_MainTanks then
for j = 1, 10 do
if CT_RA_MainTanks[j] then
for k = 1, GetNumRaidMembers() do
local unit = "raid" .. k
local skip = false
if UnitInParty(unit) and HealBot_Config.GroupHeals == 1 and not UnitIsUnit(unit, "player") then
skip = true
end
if not skip and UnitName(unit) == CT_RA_MainTanks[j] then
table.insert(unitsToCheck, unit)
end
end
end
end
end
if HealBot_Config.TargetHeals == 1 then
for _, unit in ipairs(HealBot_Action_HealTarget) do
table.insert(unitsToCheck, unit)
end
table.insert(unitsToCheck, "target")
end
if HealBot_Config.EmergencyHeals == 1 then
if GetNumRaidMembers() > 0 then
for j = 1, 40 do
local unit = "raid" .. j
if not (UnitInParty(unit) and HealBot_Config.GroupHeals == 1) then
table.insert(unitsToCheck, unit)
end
end
else
for j = 1, 4 do
table.insert(unitsToCheck, "party" .. j)
end
table.insert(unitsToCheck, "player")
end
end
if HealBot_Config.PetHeals == 1 then
if GetNumRaidMembers() > 0 then
for j = 1, 40 do
table.insert(unitsToCheck, "raidpet" .. j)
end
else
for j = 1, 4 do
table.insert(unitsToCheck, "partypet" .. j)
end
table.insert(unitsToCheck, "pet")
end
end
for _, unit in ipairs(unitsToCheck) do
if not HealBot_Action_UnitButtons[unit] and HealBot_MayHeal(unit) then
HealBot_Action_AppendUnit(unit)
end
end
end
+40 -10
View File
@@ -3,6 +3,18 @@
HealBot_Action_TooltipUnit = nil HealBot_Action_TooltipUnit = nil
-- HealBot_Tooltip_GetSpellColor: Internal utility: HealBot_Tooltip_GetSpellColor
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
-- HealBot_Action_RefreshTooltip: Builds and displays spell tooltip on hover.
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 +45,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
@@ -129,6 +151,7 @@ function HealBot_Action_RefreshTooltip(unit)
HealBot_Tooltip:Show(); HealBot_Tooltip:Show();
end end
-- HealBot_Action_Tooltip_SpellInfo: Internal utility: HealBot_Action_Tooltip_SpellInfo
function HealBot_Action_Tooltip_SpellInfo(spell,linenum) function HealBot_Action_Tooltip_SpellInfo(spell,linenum)
local text local text
if HealBot_Spells[spell] then if HealBot_Spells[spell] then
@@ -164,6 +187,7 @@ function HealBot_Action_Tooltip_SpellInfo(spell,linenum)
return linenum return linenum
end end
-- HealBot_Action_Tooltip_SpellSummary: Internal utility: HealBot_Action_Tooltip_SpellSummary
function HealBot_Action_Tooltip_SpellSummary(spell) function HealBot_Action_Tooltip_SpellSummary(spell)
local ret_val = " "; local ret_val = " ";
if HealBot_Spells[spell] then if HealBot_Spells[spell] then
@@ -191,6 +215,7 @@ function HealBot_Action_Tooltip_SpellSummary(spell)
return ret_val return ret_val
end end
-- HealBot_Action_Tooltip_CheckForInstant: Internal utility: HealBot_Action_Tooltip_CheckForInstant
function HealBot_Action_Tooltip_CheckForInstant(unit,spell,upd,linenum,check) function HealBot_Action_Tooltip_CheckForInstant(unit,spell,upd,linenum,check)
if HealBot_Spells[spell] then if HealBot_Spells[spell] then
if HealBot_Spells[spell].CastTime == 0 then if HealBot_Spells[spell].CastTime == 0 then
@@ -209,6 +234,7 @@ function HealBot_Action_Tooltip_CheckForInstant(unit,spell,upd,linenum,check)
return check+1,linenum; return check+1,linenum;
end end
-- HealBot_Action_Tooltip_SetLineLeft: Internal utility: HealBot_Action_Tooltip_SetLineLeft
function HealBot_Action_Tooltip_SetLineLeft(Text,R,G,B,linenum) function HealBot_Action_Tooltip_SetLineLeft(Text,R,G,B,linenum)
local txtL = getglobal("HealBot_TooltipTextL" .. linenum) local txtL = getglobal("HealBot_TooltipTextL" .. linenum)
txtL:SetTextColor(R,G,B) txtL:SetTextColor(R,G,B)
@@ -216,6 +242,7 @@ function HealBot_Action_Tooltip_SetLineLeft(Text,R,G,B,linenum)
txtL:Show() txtL:Show()
end end
-- HealBot_Action_Tooltip_SetLineRight: Internal utility: HealBot_Action_Tooltip_SetLineRight
function HealBot_Action_Tooltip_SetLineRight(Text,R,G,B,linenum) function HealBot_Action_Tooltip_SetLineRight(Text,R,G,B,linenum)
local txtR = getglobal("HealBot_TooltipTextR" .. linenum) local txtR = getglobal("HealBot_TooltipTextR" .. linenum)
txtR:SetTextColor(R,G,B) txtR:SetTextColor(R,G,B)
@@ -223,6 +250,7 @@ function HealBot_Action_Tooltip_SetLineRight(Text,R,G,B,linenum)
txtR:Show() txtR:Show()
end end
-- HealBot_Action_Tooltip_ClearLines: Internal utility: HealBot_Action_Tooltip_ClearLines
function HealBot_Action_Tooltip_ClearLines() function HealBot_Action_Tooltip_ClearLines()
for j=1,30 do for j=1,30 do
local txtL = getglobal("HealBot_TooltipTextL" .. j) local txtL = getglobal("HealBot_TooltipTextL" .. j)
@@ -234,6 +262,7 @@ function HealBot_Action_Tooltip_ClearLines()
end end
end end
-- HealBot_Action_ShowTooltip: Internal utility: HealBot_Action_ShowTooltip
function HealBot_Action_ShowTooltip(this) function HealBot_Action_ShowTooltip(this)
if HealBot_Config.ShowTooltip==0 then return end if HealBot_Config.ShowTooltip==0 then return end
if not this.unit then return end; if not this.unit then return end;
@@ -243,6 +272,7 @@ function HealBot_Action_ShowTooltip(this)
HealBot_Action_RefreshTooltip(this.unit); HealBot_Action_RefreshTooltip(this.unit);
end end
-- HealBot_Action_HideTooltip: Internal utility: HealBot_Action_HideTooltip
function HealBot_Action_HideTooltip(this) function HealBot_Action_HideTooltip(this)
if HealBot_Config.ShowTooltip==0 then return end if HealBot_Config.ShowTooltip==0 then return end
HealBot_Tooltip:Hide(); HealBot_Tooltip:Hide();
+85 -4
View File
@@ -1,10 +1,14 @@
**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. ### Development version
There is dev branch available, it might be slightly more unstabl but most of time it does have more features present. It's only merged into main when major feature set is implemented and stabilised.
### 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,24 +23,101 @@ 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.
* **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. * **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). * **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. * **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.
* **Additional Mods Integration:** Navigate to 'Extras' tab in Options to optionally enable integrations with `UnitXP_SP3` (for ultra-precise 3D range and Line of Sight checks), `nampower` (for accurate real-time heal/buff tracking), `SuperWoW` (for robust GUID-based state tracking), and `ClassicAPI` (for native +Healing bonuses and fast 3D distance checks).
### To be implemented
- **Strategy Pattern / Code Tree Splits:** Migrate heavy mod integrations (like Nampower aura tracking and SuperWoW UI rendering) into isolated code trees (e.g., `HealBot_Model_SuperWoW.lua`). This will allow dynamic overwriting of global functions at startup, eliminating the CPU overhead of running `if integration then` branch checks inside high-frequency update loops on Vanilla clients.
### Known issues ### 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. To be fixed next release * **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.7.0**
* **Feature - Raid Marks** - Added tracking and display of raid marks on unit frames.
* **External Addon Integrations** - Added a new 'Extras' tab in Options to optionally enable integrations with `UnitXP_SP3` (for ultra-precise 3D range and Line of Sight checks), `nampower` (for accurate real-time heal/buff tracking), `SuperWoW` (for robust GUID-based state tracking), and `ClassicAPI` (for native +Healing bonuses and fast 3D distance checks).
* **UI Layout** - Widened the Options UI and neatly centered elements to accommodate the new integrations tab.
* **Bug Fix - Rendering Crash** - Fixed a critical UI issue where unrecognized debuff types would crash the rendering loop, causing unit frames to disappear.
* **Bug Fix - Missing Group Frames** - Fixed a layout initialization bug where the group unit array was accidentally cleared, causing the panel to draw 0 bars and shrink to a floating "Options" button.
* **Bug Fix - Target State Aliasing** - Fixed a bug in `PreserveStateByGUID` where targeting a party member caused their frame to alias the target's state table in memory. This previously caused party frames to adopt enemy mob names and lose their class colors when changing targets.
* **Bug Fix - Group Aliasing** - Fixed a bug where roster updates caused frames to share memory references, causing the UI to display the same player across multiple group slots.
* **Bug Fix - Slow Client Init** - Fixed missing class colors after `/reload` by adding lazy-load identity fetches directly into the render pipeline for when `UnitClass` data is delayed by the server.
* **Bug Fix - Debuff Tracking** - HealBot now automatically tracks all curable debuffs for the player's class out of the box. Previously, users had to manually assign a cure spell to a click binding to enable CDC debuff tracking.
* **Bug Fix - CDC Filter** - Fixed an issue where the CDC module displayed all debuffs instead of filtering for dispellable ones, restoring proper health bar coloring.
* **Bug Fix - UnitClass Localization** - Added a fallback mapping for the Vanilla `UnitClass` API to always return the uppercase English class string. This fixes a bug where default options (like Debuff tracking) failed to initialize.
* **Feature - Shapeshift Spell Queue** - Built a native spell queue system for Druid auto-unshifting. Bypasses the "Cannot cast while shapeshifted" error and server lag when AutoUnshift is enabled, firing the heal seamlessly the exact millisecond the form is dropped. Now completely unified to use the standard casting API for maximum reliability across all client setups.
* **Bug Fix - CDC Config List** - Fixed an uninitialized dropdown list array that prevented the CDC class monitor configuration from saving correctly.
* **Bug Fix - Color Picker Accuracy** - Removed an undocumented multiplier hack on default textures that was artificially brightening debuff bar colors and overriding the user's selected colors from the color picker.
**v1.6.5**
* **Performance Update - Mana Tracking** - Added a fast-path redraw pipeline for unit power changes. This optimization prevents full frame redraws when players naturally regenerate or consume mana, resolving severe FPS drops in 40-man raids while tracking mana.
**v1.6.4**
* **Bug Fix - UI Opacity** - Fixed a rendering layering bug where incoming heals drew on top of actual health, causing the semi-transparent incoming heal bar to wash out the solid health bar.
* **Bug Fix - CDC Colors** - Fixed health bar debuff coloring (CDC) by stopping `HealBot_HealthColor` from incorrectly querying debuffs directly, relying instead on cached debuff types.
**v1.6.3**
* **Hotfix string splitter** - added falback for string splitter if the the string is empty or nil.
* **UI Update - Icon Limit** - Increased maximum tracked buffs/debuffs per unit from 5 to 10.
* **UI Update - Customizable icon size** - Added an option to change size of HoT icons (default to 12px).
* **Cleanup** - Removed dead code `HealBot_Groups` table.
* **Bug Fix - Buff Watch Self** - Fixed an issue where the "Self Only" toggle for watched buffs failed to load visually across sessions.
**v1.6.2**
* **Hotfix - raid and party frames** - if getNumRaidMembers() > 0 wrapper around extra bars stopped from displaying all frames blocked from displaying Extras\Raid.
* **UI Update - Raid & Pets Split** - Split the "Raid / Extra" toggle into separate "Raid" and "Pets" toggles. Simplified the raid bars filter dropdown to core options (All, Melee, Ranged, Heals, Custom).
**v1.6.1**
* **Feature - CDC Module** - Added a new toggle in the CDC options to track all debuffs. When enabled, non-dispellable debuff icons will appear on the unit frame. Bar coloring continues to only highlight dispellable debuffs to prevent visual clutter.
* **Hotfix - XML Layering** - Reverted `bar` and `bar2` element order in `HealBot_Action.xml`. The incoming heals bar was rendering on top of the health bar, causing debuff colors to be obscured and creating visual opacity issues.
* **Hotfix - Debuff Bar Coloring** - Restored the `showDispellable` parameter to `UnitDebuff` in the aura scanning loop so the Vanilla client correctly returns the debuff type string required for bar coloring.
* **Hotfix - Shapeshift / ShaguTweaks Interaction** - Fixed a Lua error (`attempt to compare number with nil`) in `HealBot_Process_HealValue` caused by missing `CastTime` values when external addons like ShaguTweaks trigger auto-unshift or intercept casts.
* **Hotfix - pet frames** - With class colours toggled extra frames for player pets were given some classy mint colour.
* **Hotfi - raidframes in combat** - Modfied how frames behave when player leaves during combat.
**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** **v1.4**
* **Extra Frame support for pets and familiars added:** Togglable from healing tab - Extra frames option selected & pets selected from dropdown. * **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. * **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.