63 Commits
Author SHA1 Message Date
Bluewhale1337 f404ec71d7 feat: initialize HealBotBlue addon with core controller, options, locales, and view components 2026-11-09 23:29:50 +01:00
Bluewhale1337 d9f256733b refactor: restructure codebase into Controller, Model, View, Integrations, and Locales directories 2026-11-09 21:54:00 +01:00
Bluewhale1337 0653904659 feat: add test debuff simulation commands and unit handling 2026-11-09 21:05:05 +01:00
Bluewhale1337 7ee3ee2c13 docs: add v1.7.Unreleased changelog entries to README 2026-11-09 19:18:08 +01:00
Bluewhale1337 610063be7e Merge branch 'dev' of https://github.com/Bluewhale1337/HealBotBlue into dev 2026-11-09 19:15:56 +01:00
Bluewhale1337 54ae2aa202 Merge pull request #26 from Bluewhale1337/main
fix: replace Lua 5.1 length operators with table.getn for Vanilla 1.1…
2026-11-09 19:11:17 +01:00
Bluewhale1337 17306aff34 Merge branch 'dev' into main
Signed-off-by: Bluewhale1337 <295648290+Bluewhale1337@users.noreply.github.com>
2026-11-09 19:11:01 +01:00
Bluewhale1337 243cb0cf5f chore: bump version to 1.7.8dev and update changelog for unreleased changes 2026-11-09 19:08:49 +01:00
Bluewhale1337 d89cf5b1c3 fix: replace Lua 5.1 length operators with table.getn for Vanilla 1.12 compatibility and bump version to 1.7.7 2026-11-08 23:34:39 +01:00
Bluewhale1337 155172fff3 docs: update README with HoT timer integration and dynamic skin swapping details 2026-11-08 16:56:00 +01:00
Bluewhale1337 f1919ca9a9 feat: add debuff visual indicators, overlays, and improve range checking logic 2026-11-08 16:52:11 +01:00
Bluewhale1337 fca88016f2 refactor: remove Spirit of Zanza from Divine Spirit aura tracking and bump version to 1.7.7 2026-11-05 22:33:46 +01:00
Bluewhale1337 cc2d6830e5 feat: add Spirit of Zanza aura tracking and fix bar text font height handling 2026-11-05 18:46:44 +01:00
Bluewhale1337 7fdf76eff8 fix: HoT timer tracking premature deletion of auta_Cast_ON even
fixed guid cache
fixed .show() call on overlay visible
2026-11-05 17:37:46 +01:00
Bluewhale1337 5ec9bde8dd Merge pull request #25 from Bluewhale1337/main
Merging patch 1.7.6 into dev branch
2026-11-05 10:52:11 +01:00
Bluewhale1337 18eff88f7b Update README.md
fixing accidental leak of dev readme into main branch

Signed-off-by: Bluewhale1337 <295648290+Bluewhale1337@users.noreply.github.com>
2026-11-05 10:47:04 +01:00
Bluewhale1337 31f7c6fe2b Merge branch 'dev' into main
Signed-off-by: Bluewhale1337 <295648290+Bluewhale1337@users.noreply.github.com>
2026-11-05 10:44:58 +01:00
Bluewhale1337 de9454e85f docs: update version to v1.7.7 in readme changelog 2026-11-05 10:13:55 +01:00
Bluewhale1337 c3f8cdb4ed Feature set: expand class support and improve buff tracking logic 2026-11-04 17:41:52 +01:00
Bluewhale1337 5a77b2298d refactor: improve Nampower aura tracking and GUID management integration 2026-11-02 17:13:37 +01:00
Bluewhale1337 7b8c0251fc fix: dropdown syntax + converted to named click handlers 2026-10-21 22:33:01 +02:00
Bluewhale1337 71b92fe1a6 refactor: unify aura and hoT tracking into a single master dictionary with localized support 2026-10-15 14:19:10 +02:00
Bluewhale1337 3ed13b97f4 fix: bump addon version to 1.7.6 in TOC file 2026-10-14 17:57:39 +02:00
Bluewhale1337 aea1f734ca fix: resolve raid class coloring, identity cache, and player range detection issues 2026-10-14 17:55:30 +02:00
Bluewhale1337 8624a192b6 Merge pull request #24 from Bluewhale1337/dev
Dev
2026-10-10 16:48:06 +02:00
Bluewhale1337 d949b7489a refactor: adjust UI layouts and templates across options XML files 2026-10-10 15:45:29 +02:00
Bluewhale1337 962f2a46aa refactor: update UI layout and formatting in HealBot options XML files and README 2026-10-10 13:26:13 +02:00
Bluewhale1337 eed71fa070 refactor: update skin options UI layout and add font styling to action buttons and headers 2026-10-10 12:51:07 +02:00
Bluewhale1337 2baf535aa2 Merge branch 'dev' of https://github.com/Bluewhale1337/HealBotBlue into dev 2026-10-10 12:25:32 +02:00
Bluewhale1337 4694db4f90 feat: add max/min HP bar color configuration and font selection options to skins 2026-10-10 12:25:28 +02:00
Bluewhale1337 076475442c Merge pull request #23 from Bluewhale1337/main
merging hotfixes from main
2026-10-10 12:19:46 +02:00
Bluewhale1337 d5ecdc6c76 gperf: optimize lookups by caching talent ranks, spell IDs, and unit IDs 2026-10-10 11:41:53 +02:00
Bluewhale1337 42ff023a54 refactor: update UI layout positioning and fix pet class color override logic 2026-10-09 21:48:46 +02:00
Bluewhale1337 8050561733 Chanes: add test mode bars and options for UI testing and layout configuration 2026-10-08 16:16:19 +02:00
Bluewhale1337 8b85b6ca57 refactor: replace standard UnitClass calls with HealBot_UnitClass helper function 2026-10-07 21:30:35 +02:00
Bluewhale1337 d222cd942c fix: update HoT Timers integration note to only reference Nampower 2026-10-05 00:02:17 +02:00
Bluewhale1337 b298ad7047 refactor: update HoT timer integration requirements to remove SuperWoW and ClassicAPI references 2026-10-04 23:58:17 +02:00
Bluewhale1337 94f8c2a843 Merge pull request #22 from Bluewhale1337/dev
Dev
2026-10-04 23:51:53 +02:00
Bluewhale1337 b3e18bfd64 docs: update README with HoT timer tracking details and changelog refinements 2026-10-04 23:49:30 +02:00
Bluewhale1337 6acfa36d8d docs: update README with recent HoT tracking, bug fixes, and performance improvements 2026-10-04 21:16:14 +02:00
Bluewhale1337 97df6c9a98 feat: add Nampower integration for player HoT timers display for active auras 2026-10-04 19:24:34 +02:00
Bluewhale1337 2a0d607bcd fix: improve performance and safety with null checks and talent rank caching 2026-10-04 17:54:00 +02:00
Bluewhale1337 526a4f1b9b docs: update README changelog with recent performance and bug fixes 2026-10-02 12:51:31 +02:00
Bluewhale1337 032c7571af perf: optimize spell and unit ID lookups with caching and fix range cache memory leaks 2026-10-02 12:17:29 +02:00
Bluewhale1337 f4ba0d983d feat: add /hb debug command for local chat logging 2026-10-02 11:02:45 +02:00
Bluewhale1337 62b93b74e2 fix: correct French translation for Mage 2026-10-02 10:42:02 +02:00
Bluewhale1337 820f23c3f2 perf: optimize performance by caching aura tooltips and range checks while reducing redundant layout updates 2026-10-02 08:48:26 +02:00
Bluewhale1337 59e3701d79 perf: pre-allocate raid unit tokens to optimize HealBot_FindUnitID performance 2026-10-01 22:27:41 +02:00
Bluewhale1337 ee11884976 Merge pull request #21 from Bluewhale1337/dev
Dev
2026-09-24 22:34:31 +02:00
Bluewhale1337 eb7cbc52f2 refactor: mark all unit buttons dirty instead of calling HealBot_Action_Refresh 2026-09-24 22:31:24 +02:00
Bluewhale1337 1edb4b22bb fix: correct BuffWatchSelf UI element lookup and document the fix in README 2026-09-24 21:38:19 +02:00
Bluewhale1337 5e33429dee feat: add support for group-wide healing spell tracking and communication 2026-09-16 11:10:55 +02:00
Bluewhale1337 55bc6f1ea0 Fix: optimize execution performance and memory usage via caching and table reuse 2026-09-16 10:24:33 +02:00
Bluewhale1337 7f4d4be827 Fix: add pooling to rest of the tables out there 2026-09-13 20:39:46 +02:00
Bluewhale1337 029235a733 Merge branch 'dev' of https://github.com/Bluewhale1337/HealBotBlue into dev 2026-09-13 20:10:11 +02:00
Bluewhale1337 7beff1c4ca Fix: expand table pooling across modules to reduce garbage collection 2026-09-13 20:09:46 +02:00
Bluewhale1337 4e8d5d8426 Merge pull request #20 from Bluewhale1337/dev
Dev
2026-09-13 12:58:54 +02:00
Bluewhale1337 b40135a386 Merge branch 'main' into dev
Signed-off-by: Bluewhale1337 <295648290+Bluewhale1337@users.noreply.github.com>
2026-09-13 12:58:40 +02:00
Bluewhale1337 4caaa85634 Merge branch 'main' of https://github.com/Bluewhale1337/HealBotBlue 2026-09-12 12:26:16 +02:00
Bluewhale1337 8894700b0a fix: return nil instead of index when excluding forms from unshifting 2026-09-12 12:26:13 +02:00
Bluewhale1337 2958bc8e94 Update README.md
removed accidently added dev branch changelog from main
2026-09-11 08:16:52 +02:00
Bluewhale1337 4486682568 Update README.md
More fixes of broken formating

Signed-off-by: Bluewhale1337 <295648290+Bluewhale1337@users.noreply.github.com>
2026-09-09 20:51:09 +02:00
Bluewhale1337 27231aaf99 Update README.md
Signed-off-by: Bluewhale1337 <295648290+Bluewhale1337@users.noreply.github.com>
2026-09-09 20:50:36 +02:00
59 changed files with 9779 additions and 7228 deletions
@@ -1,3 +1,4 @@
local HealBot_Buff_Equivalents = nil
-- HealBot_Controller_Aura.lua -- HealBot_Controller_Aura.lua
-- Handles tracking buffs/debuffs (auras) on group/raid units -- Handles tracking buffs/debuffs (auras) on group/raid units
@@ -6,6 +7,7 @@ local StaticHasBuff = {}
-- HealBot_UnitAffected: Checks if a specific buff/debuff exists on a unit. -- HealBot_UnitAffected: Checks if a specific buff/debuff exists on a unit.
function HealBot_UnitAffected(unit, effect) function HealBot_UnitAffected(unit, effect)
if string.find(unit, "^Test") then return nil; end
if not effect then return nil; end if not effect then return nil; end
local i = 1 local i = 1
while true do while true do
@@ -41,6 +43,7 @@ function HealBot_CheckShamanWeaponBuff(spellName)
if not firstWord then return false end if not firstWord then return false end
HealBot_ScanTooltip:SetOwner(UIParent, "ANCHOR_NONE") HealBot_ScanTooltip:SetOwner(UIParent, "ANCHOR_NONE")
if not HealBot_ScanTooltip_Lines then HealBot_ScanTooltip_Lines = {} end
local slots = HealBot_GetTable() local slots = HealBot_GetTable()
if hasMainHandEnchant then table.insert(slots, 16) end if hasMainHandEnchant then table.insert(slots, 16) end
if hasOffHandEnchant then table.insert(slots, 17) end if hasOffHandEnchant then table.insert(slots, 17) end
@@ -49,7 +52,11 @@ function HealBot_CheckShamanWeaponBuff(spellName)
HealBot_ScanTooltip:ClearLines() HealBot_ScanTooltip:ClearLines()
HealBot_ScanTooltip:SetInventoryItem("player", slot) HealBot_ScanTooltip:SetInventoryItem("player", slot)
for i = 1, HealBot_ScanTooltip:NumLines() do for i = 1, HealBot_ScanTooltip:NumLines() do
local textObj = getglobal("HealBot_ScanTooltipTextLeft" .. i) local textObj = HealBot_ScanTooltip_Lines[i]
if not textObj then
textObj = getglobal("HealBot_ScanTooltipTextLeft" .. i)
HealBot_ScanTooltip_Lines[i] = textObj
end
if textObj then if textObj then
local text = textObj:GetText() local text = textObj:GetText()
if text and string.find(text, firstWord) then if text and string.find(text, firstWord) then
@@ -68,6 +75,7 @@ end
-- HealBot_CheckBuffs: Scans unit for missing tracked buffs. -- HealBot_CheckBuffs: Scans unit for missing tracked buffs.
function HealBot_CheckBuffs(unit) function HealBot_CheckBuffs(unit)
if string.find(unit, "^Test") then return end
if HealBot_Config.BuffWatch ~= 1 then if HealBot_Config.BuffWatch ~= 1 then
HealBot_MissingBuffs[unit] = nil HealBot_MissingBuffs[unit] = nil
return return
@@ -87,14 +95,52 @@ function HealBot_CheckBuffs(unit)
return return
end end
-- Group Buff Equivalents if not HealBot_Buff_Equivalents then
local HealBot_Buff_Equivalents = { HealBot_Buff_Equivalents = {
[HEALBOT_POWER_WORD_FORTITUDE] = HEALBOT_PRAYER_OF_FORTITUDE, -- Priest Fortitude
[HEALBOT_DIVINE_SPIRIT] = HEALBOT_PRAYER_OF_SPIRIT, [HEALBOT_POWER_WORD_FORTITUDE] = { HEALBOT_PRAYER_OF_FORTITUDE },
[HEALBOT_SHADOW_PROTECTION] = HEALBOT_PRAYER_OF_SHADOW_PROTECTION, [HEALBOT_PRAYER_OF_FORTITUDE] = { HEALBOT_POWER_WORD_FORTITUDE },
[HEALBOT_ARCANE_INTELLECT] = HEALBOT_ARCANE_BRILLIANCE, -- Priest Spirit
[HEALBOT_MARK_OF_THE_WILD] = HEALBOT_GIFT_OF_THE_WILD, [HEALBOT_DIVINE_SPIRIT] = { HEALBOT_PRAYER_OF_SPIRIT },
[HEALBOT_PRAYER_OF_SPIRIT] = { HEALBOT_DIVINE_SPIRIT },
-- Priest Shadow Protection
[HEALBOT_SHADOW_PROTECTION] = { HEALBOT_PRAYER_OF_SHADOW_PROTECTION },
[HEALBOT_PRAYER_OF_SHADOW_PROTECTION] = { HEALBOT_SHADOW_PROTECTION },
-- Mage Intellect
[HEALBOT_ARCANE_INTELLECT] = { HEALBOT_ARCANE_BRILLIANCE },
[HEALBOT_ARCANE_BRILLIANCE] = { HEALBOT_ARCANE_INTELLECT },
-- Mage Armors
[HEALBOT_FROST_ARMOR] = { HEALBOT_ICE_ARMOR },
[HEALBOT_ICE_ARMOR] = { HEALBOT_FROST_ARMOR },
-- Druid MotW
[HEALBOT_MARK_OF_THE_WILD] = { HEALBOT_GIFT_OF_THE_WILD },
[HEALBOT_GIFT_OF_THE_WILD] = { HEALBOT_MARK_OF_THE_WILD },
-- Paladin Kings
[HEALBOT_BLESSING_OF_KINGS] = { HEALBOT_GREATER_BLESSING_OF_KINGS },
[HEALBOT_GREATER_BLESSING_OF_KINGS] = { HEALBOT_BLESSING_OF_KINGS },
-- Paladin Might
[HEALBOT_BLESSING_OF_MIGHT] = { HEALBOT_GREATER_BLESSING_OF_MIGHT },
[HEALBOT_GREATER_BLESSING_OF_MIGHT] = { HEALBOT_BLESSING_OF_MIGHT },
-- Paladin Wisdom
[HEALBOT_BLESSING_OF_WISDOM] = { HEALBOT_GREATER_BLESSING_OF_WISDOM },
[HEALBOT_GREATER_BLESSING_OF_WISDOM] = { HEALBOT_BLESSING_OF_WISDOM },
-- Paladin Salvation
[HEALBOT_BLESSING_OF_SALVATION] = { HEALBOT_GREATER_BLESSING_OF_SALVATION },
[HEALBOT_GREATER_BLESSING_OF_SALVATION] = { HEALBOT_BLESSING_OF_SALVATION },
-- Paladin Light
[HEALBOT_BLESSING_OF_LIGHT] = { HEALBOT_GREATER_BLESSING_OF_LIGHT },
[HEALBOT_GREATER_BLESSING_OF_LIGHT] = { HEALBOT_BLESSING_OF_LIGHT },
-- Paladin Sanctuary
[HEALBOT_BLESSING_OF_SANCTUARY] = { HEALBOT_GREATER_BLESSING_OF_SANCTUARY },
[HEALBOT_GREATER_BLESSING_OF_SANCTUARY] = { HEALBOT_BLESSING_OF_SANCTUARY },
-- Warlock Armors
[HEALBOT_DEMON_SKIN] = { HEALBOT_DEMON_ARMOR },
[HEALBOT_DEMON_ARMOR] = { HEALBOT_DEMON_SKIN },
-- Warlock Invisibility
[HEALBOT_DETECT_LESSER_INVISIBILITY] = { HEALBOT_DETECT_INVISIBILITY },
[HEALBOT_DETECT_INVISIBILITY] = { HEALBOT_DETECT_LESSER_INVISIBILITY },
} }
end
-- Gather buffs on unit -- Gather buffs on unit
local hasBuff = StaticHasBuff local hasBuff = StaticHasBuff
@@ -102,13 +148,25 @@ function HealBot_CheckBuffs(unit)
hasBuff[k] = nil hasBuff[k] = nil
end end
local i = 1 local i = 1
if not HealBot_TextureToName then HealBot_TextureToName = {} end
while true do while true do
local buffTexture = UnitBuff(unit, i) local buffTexture = UnitBuff(unit, i)
if not buffTexture then break end if not buffTexture then break end
local buffName = HealBot_TextureToName[buffTexture]
if buffName == nil then
HealBot_ScanTooltip:SetOwner(UIParent, "ANCHOR_NONE") HealBot_ScanTooltip:SetOwner(UIParent, "ANCHOR_NONE")
HealBot_ScanTooltip:ClearLines() HealBot_ScanTooltip:ClearLines()
HealBot_ScanTooltip:SetUnitBuff(unit, i) HealBot_ScanTooltip:SetUnitBuff(unit, i)
local buffName = HealBot_ScanTooltipTextLeft1:GetText() local textObj = HealBot_ScanTooltipTextLeft1
if textObj then
buffName = textObj:GetText()
end
if buffName then
HealBot_TextureToName[buffTexture] = buffName
end
end
if buffName then if buffName then
hasBuff[buffName] = true hasBuff[buffName] = true
end end
@@ -122,13 +180,17 @@ function HealBot_CheckBuffs(unit)
for j = 1, 8 do for j = 1, 8 do
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)
if not (isSelfOnly and not UnitIsUnit(unit, "player")) then
local spellName = HealBot_Buff_Spells[myClass][val] local spellName = HealBot_Buff_Spells[myClass][val]
local isSelfOnly = (HealBot_Config.BuffWatchSelf and HealBot_Config.BuffWatchSelf[j] == 1) or (HealBot_SelfOnly_Buffs and HealBot_SelfOnly_Buffs[spellName])
if not (isSelfOnly and not UnitIsUnit(unit, "player")) then
local hasIt = hasBuff[spellName] local hasIt = hasBuff[spellName]
if not hasIt and HealBot_Buff_Equivalents[spellName] then if not hasIt and HealBot_Buff_Equivalents[spellName] then
hasIt = hasBuff[HealBot_Buff_Equivalents[spellName]] for _, equiv in ipairs(HealBot_Buff_Equivalents[spellName]) do
if hasBuff[equiv] then
hasIt = true
break
end
end
end end
if not hasIt then if not hasIt then
@@ -147,22 +209,12 @@ function HealBot_CheckBuffs(unit)
end end
end end
local HealBot_TrackedHoTs = {
["Interface\\Icons\\Spell_Holy_Renew"] = true,
["Interface\\Icons\\Spell_Nature_Rejuvenation"] = true,
["Interface\\Icons\\Spell_Nature_ResistNature"] = true,
["Interface\\Icons\\Spell_Holy_PowerWordShield"] = true,
["Interface\\Icons\\Spell_Holy_SealOfProtection"] = true,
["Interface\\Icons\\Spell_Holy_Excorcism"] = true,
["Interface\\Icons\\btnholyscriptures"] = true,
["Interface\\Icons\\Spell_Holy_AshesToAshes"] = true,
}
local HealBot_DebuffTypeMap = nil local HealBot_DebuffTypeMap = nil
local HealBot_AuraWarningPlayed = {} local HealBot_AuraWarningPlayed = {}
-- HealBot_OnEvent_UnitAura: Updates debuff lists and icon textures on aura change. -- HealBot_OnEvent_UnitAura: Updates debuff lists and icon textures on aura change.
function HealBot_OnEvent_UnitAura(this, unit) function HealBot_OnEvent_UnitAura(this, unit)
if string.find(unit, "^Test") then return end
if not HealBot_DebuffTypeMap then if not HealBot_DebuffTypeMap then
HealBot_DebuffTypeMap = { HealBot_DebuffTypeMap = {
[HEALBOT_DISEASE] = HEALBOT_DISEASE_en, [HEALBOT_DISEASE] = HEALBOT_DISEASE_en,
@@ -170,6 +222,9 @@ function HealBot_OnEvent_UnitAura(this, unit)
[HEALBOT_POISON] = HEALBOT_POISON_en, [HEALBOT_POISON] = HEALBOT_POISON_en,
[HEALBOT_CURSE] = HEALBOT_CURSE_en [HEALBOT_CURSE] = HEALBOT_CURSE_en
} }
if HealBot_Init_TrackedAuras then
HealBot_Init_TrackedAuras()
end
end end
local DebuffType; local DebuffType;
@@ -184,7 +239,7 @@ function HealBot_OnEvent_UnitAura(this, unit)
local iconCount = 0 local iconCount = 0
local i = 1; local i = 1;
HealBot_UnitDebuff[unit] = nil; HealBot_UnitDebuff[unit] = nil;
local trackedTextures = {} local trackedTextures = HealBot_GetTable()
while true do while true do
local debuff, tmp, debuff_type = UnitDebuff(unit, i, 1) local debuff, tmp, debuff_type = UnitDebuff(unit, i, 1)
@@ -255,10 +310,12 @@ function HealBot_OnEvent_UnitAura(this, unit)
end end
local b = 1 local b = 1
local activeBuffs = HealBot_GetTable()
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 < 10 then activeBuffs[buff] = true
if HealBot_TrackedAura_Textures and HealBot_TrackedAura_Textures[buff] and iconCount < 10 then
iconCount = iconCount + 1 iconCount = iconCount + 1
HealBot_UnitIcons[unit][iconCount] = buff HealBot_UnitIcons[unit][iconCount] = buff
end end
@@ -266,16 +323,51 @@ function HealBot_OnEvent_UnitAura(this, unit)
end end
local d = 1 local d = 1
local activeDebuffs = HealBot_GetTable()
while true do while true do
local debuff = UnitDebuff(unit, d) local debuff = UnitDebuff(unit, d)
if not debuff then break end if not debuff then break end
if HealBot_TrackedHoTs[debuff] and iconCount < 10 then activeDebuffs[debuff] = true
if HealBot_TrackedAura_Textures and HealBot_TrackedAura_Textures[debuff] and iconCount < 10 then
iconCount = iconCount + 1 iconCount = iconCount + 1
HealBot_UnitIcons[unit][iconCount] = debuff HealBot_UnitIcons[unit][iconCount] = debuff
end end
d = d + 1 d = d + 1
end end
if HealBot_Integrations_Nampower_Active and HealBot_Nampower_Auras then
local guid = HealBot_GetUnitGUID and HealBot_GetUnitGUID(unit)
if guid then
if not HealBot_Nampower_NameCache then HealBot_Nampower_NameCache = HealBot_GetTable() end
local uName = UnitName(unit)
if uName then
HealBot_Nampower_NameCache[guid] = uName
HealBot_Nampower_NameCache[string.lower(guid)] = uName
end
if HealBot_Model and HealBot_Model.guidUnits then
HealBot_Model.guidUnits[guid] = unit
HealBot_Model.guidUnits[string.lower(guid)] = unit
HealBot_Model.unitGUIDs[unit] = guid
end
end
end
HealBot_ReleaseTable(activeBuffs)
HealBot_ReleaseTable(activeDebuffs)
if HealBot_TestDebuff and unit == "player" then
HealBot_UnitDebuff[unit] = HealBot_TestDebuff
if not HealBot_UnitIcons[unit] then HealBot_UnitIcons[unit] = {} end
if not HealBot_UnitIcons[unit][1] then
local testIcons = {
[HEALBOT_POISON_en] = "Interface\\Icons\\Spell_Nature_NullifyPoison",
[HEALBOT_CURSE_en] = "Interface\\Icons\\Spell_Shadow_GatherShadows",
[HEALBOT_DISEASE_en] = "Interface\\Icons\\Spell_Nature_NullifyDisease",
[HEALBOT_MAGIC_en] = "Interface\\Icons\\Spell_Holy_DispelMagic",
}
HealBot_UnitIcons[unit][1] = testIcons[HealBot_TestDebuff]
end
end
if HealBot_UnitDebuff[unit] then if HealBot_UnitDebuff[unit] then
if DebuffType and HealBot_Range_Check(unit, 40) == 1 then if DebuffType and HealBot_Range_Check(unit, 40) == 1 then
if HealBot_AuraWarningPlayed[unit] ~= DebuffType then if HealBot_AuraWarningPlayed[unit] ~= DebuffType then
@@ -301,5 +393,6 @@ function HealBot_OnEvent_UnitAura(this, unit)
-- Defer UI updates -- Defer UI updates
HealBot_View_DirtyUnits[unit] = true HealBot_View_DirtyUnits[unit] = true
HealBot_ReleaseTable(trackedTextures)
end end
end end
+424
View File
@@ -0,0 +1,424 @@
-- HealBot_Controller_Casting.lua
-- Combat casting engine, target-safe wrappers, casting state, and shapeshift handling
HealBot_CastingSpell = nil;
HealBot_CastingTarget = nil;
HealBot_CastingGroupMembers = nil;
HealBot_TargetRestorePending = nil;
HealBot_TargetRestoreTimer = 0;
local HealBot_Health60 = {
["DRUID"] = 3500,
["MAGE"] = 2500,
["HUNTER"] = 3500,
["PALADIN"] = 4000,
["PRIEST"] = 2500,
["ROGUE"] = 3500,
["SHAMAN"] = 3800,
["WARLOCK"] = 3500,
["WARRIOR"] = 5000,
}
-- HealBot_CastSpellByName: Internal utility: HealBot_CastSpellByName
function HealBot_CastSpellByName(spell)
if (HealBot_Spells[spell] and HealBot_Spells[spell].BagSlot) then
HealBot_UseItem(spell);
return;
end
local id;
if not HealBot_Spells[spell] then
id = HealBot_GetSpellId(spell);
elseif HealBot_Spells[spell].id then
id = HealBot_Spells[spell].id
else
id = HealBot_GetSpellId(spell);
end
if (not id) then
return;
end
CastSpell(id, BOOKTYPE_SPELL);
end
-- HealBot_AnnounceCast: Internal utility: HealBot_AnnounceCast
function HealBot_AnnounceCast(spell, target)
if not spell or not target then return end
if UnitIsDeadOrGhost(target) then
local spellLower = string.lower(spell)
if not (string.find(spellLower, "resurrection") or string.find(spellLower, "ancestral spirit") or string.find(spellLower, "redemption") or string.find(spellLower, "rebirth")) then
return
end
end
if HealBot_Config.ChatMessages then
local tName = target
if target == "target" then tName = HealBot_TargetName() or "target" else tName = UnitName(target) end
if not tName then tName = target end
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
-- Strip trailing spaces from base spell
baseSpell = string.gsub(baseSpell, "%s+$", "")
for i = 1, 5 do
local msgConf = HealBot_Config.ChatMessages[i]
local configSpell = msgConf and msgConf.Spell or ""
-- Strip trailing spaces from config spell just in case
configSpell = string.gsub(configSpell, "%s+$", "")
if msgConf and configSpell ~= "" and msgConf.Channel ~= "None" and (configSpell == spell or configSpell == baseSpell) then
local msg = msgConf.Message or ""
msg = string.gsub(msg, "#Spell#", spell)
msg = string.gsub(msg, "#Target#", tName)
local chan = msgConf.Channel
if chan == "Say" then
SendChatMessage(msg, "SAY")
elseif chan == "Party" and GetNumPartyMembers() > 0 then
SendChatMessage(msg, "PARTY")
elseif chan == "Raid" and GetNumRaidMembers() > 0 then
SendChatMessage(msg, "RAID")
elseif chan == "Whisper" and UnitIsPlayer(target) then
SendChatMessage(msg, "WHISPER", nil, tName)
end
end
end
end
end
-- HealBot_StartCasting: Initiates spell cast and broadcasts incoming heal.
function HealBot_StartCasting(spell, target, ttype)
HealBot_CastFailed = false;
HealBot_CastSpellByName(spell);
if ( SpellCanTargetUnit(target) ) then
SpellTargetUnit(target);
ttype = "fired";
elseif SpellIsTargeting() then
SpellTargetUnit(target);
SpellStopTargeting()
elseif ttype == "direct" then
if ( UnitIsUnit(target, "player") or CheckInteractDistance(target, 4) ) then
ttype = "fired";
end
end
if ttype == "fired" and HealBot_Spells[spell] then
if not HealBot_CastFailed then
HealBot_CastingSpell = spell;
HealBot_CastingTarget = target;
HealBot_Process_HealValue(spell, target);
HealBot_AnnounceCast(spell, target);
end
end
return ttype == "fired"
end
-- HealBot_StopCasting: Internal utility: HealBot_StopCasting
function HealBot_StopCasting()
HealBot_IsCasting = false;
if HealBot_CastingTarget then
if HealBot_HealValue > 0 then
local uname = UnitName(HealBot_CastingTarget)
if uname then
if HealBot_CastingGroupMembers and table.getn(HealBot_CastingGroupMembers) > 1 then
HealBot_SendAddonMessage("HealComm", "GrpHealstop");
for _, memberName in ipairs(HealBot_CastingGroupMembers) do
HealBot_SendAddonMessage(HEALBOT_ADDON_ID, ">> " .. memberName .. " <<=>> " .. 0 - HealBot_HealValue .. " << ")
if HealBot_HealsIn[memberName] then
HealBot_HealsIn[memberName] = HealBot_HealsIn[memberName] - HealBot_HealValue;
if HealBot_HealsIn[memberName] < 0 then HealBot_HealsIn[memberName] = 0; end
HealBot_RecalcHeals(HealBot_FindUnitID(memberName));
end
end
else
HealBot_SendAddonMessage("HealComm", "Healstop");
HealBot_SendAddonMessage(HEALBOT_ADDON_ID, ">> " .. uname .. " <<=>> " .. 0 - HealBot_HealValue .. " << ");
if HealBot_HealsIn[uname] then
HealBot_HealsIn[uname] = HealBot_HealsIn[uname] - HealBot_HealValue;
if HealBot_HealsIn[uname] < 0 then HealBot_HealsIn[uname] = 0; end
HealBot_RecalcHeals(HealBot_FindUnitID(uname));
end
end
end
HealBot_HealValue = 0;
end
end
HealBot_CastingSpell = nil;
HealBot_CastingTarget = nil;
local bar = HealBot_Action_HealthBar(HealBot_Action_AbortButton);
local ar = HealBot_Config.babortcolr[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 aa = HealBot_Config.babortcola[HealBot_Config.Current_Skin] or 1;
if not bar.txt then bar.txt = getglobal(bar:GetName() .. "_text") end
bar:SetStatusBarColor(ar, ag, ab, 0);
local sr = HealBot_Config.btextdisbledcolr[HealBot_Config.Current_Skin];
local sg = HealBot_Config.btextdisbledcolg[HealBot_Config.Current_Skin];
local sb = HealBot_Config.btextdisbledcolb[HealBot_Config.Current_Skin];
local sa = HealBot_Config.btextdisbledcola[HealBot_Config.Current_Skin];
bar.txt:SetTextColor(sr, sg, sb, sa);
end
-- HealBot_UnitHealth: Internal utility: HealBot_UnitHealth
function HealBot_UnitHealth(unit)
local Current, Desired = UnitHealth(unit), UnitHealthMax(unit);
if unit == 'target' and Desired == 100 then
local class, level = HealBot_UnitClass(unit), UnitLevel(unit);
if HealBot_Health60[class] and level > 0 then
Desired = math.floor(HealBot_Health60[class] / 60 * level + 0.5)
else
Desired = UnitHealthMax('player');
end
Current = Desired / 100 * Current;
end
return Current, Desired;
end
-- HealBot_CheckCasting: Internal utility: HealBot_CheckCasting
function HealBot_CheckCasting(unit)
if not HealBot_CastingSpell or HealBot_AlwaysHeal() then return nil end
if not HealBot_Spells[HealBot_CastingSpell] then return nil end
if not unit then unit = HealBot_CastingTarget end
if unit ~= HealBot_CastingTarget then return nil end
local bar = HealBot_Action_HealthBar(HealBot_Action_AbortButton);
local ar = HealBot_Config.babortcolr[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 aa = HealBot_Config.babortcola[HealBot_Config.Current_Skin] or 1;
if not bar.txt then bar.txt = getglobal(bar:GetName() .. "_text") end
if HealBot_IsCasting == false and HealBot_AbortButton == 0 then
bar:SetStatusBarColor(ar, ag, ab, 0);
local sr = HealBot_Config.btextdisbledcolr[HealBot_Config.Current_Skin];
local sg = HealBot_Config.btextdisbledcolg[HealBot_Config.Current_Skin];
local sb = HealBot_Config.btextdisbledcolb[HealBot_Config.Current_Skin];
local sa = HealBot_Config.btextdisbledcola[HealBot_Config.Current_Skin];
bar.txt:SetTextColor(sr, sg, sb, sa);
return nil
end
local Current, Desired = HealBot_UnitHealth(unit)
local Needed = Desired - Current;
Needed = Needed * (1 + (HealBot_Config.OverHeal * 4));
if Needed < 0 then Needed = 0 end
if (Needed > HealBot_Spells[HealBot_CastingSpell].HealsDur) then
local sr = HealBot_Config.btextdisbledcolr[HealBot_Config.Current_Skin];
local sg = HealBot_Config.btextdisbledcolg[HealBot_Config.Current_Skin];
local sb = HealBot_Config.btextdisbledcolb[HealBot_Config.Current_Skin];
local sa = HealBot_Config.btextdisbledcola[HealBot_Config.Current_Skin];
bar.txt:SetTextColor(sr, sg, sb, sa);
bar:SetStatusBarColor(ar, ag, ab, 0);
return nil
elseif HealBot_AbortButton == 1 and HealBot_IsCasting == true then
bar:SetStatusBarColor(ar, ag, ab, aa);
local sr = HealBot_Config.btextenabledcolr[HealBot_Config.Current_Skin];
local sg = HealBot_Config.btextenabledcolg[HealBot_Config.Current_Skin];
local sb = HealBot_Config.btextenabledcolb[HealBot_Config.Current_Skin];
local sa = HealBot_Config.btextenabledcola[HealBot_Config.Current_Skin];
if not bar.txt then bar.txt = getglobal(bar:GetName() .. "_text") end
bar.txt:SetTextColor(sr, sg, sb, sa);
end
end
-- HealBot_CastSpellOnFriend: Target-safe wrapper for casting spells on allies.
function HealBot_CastSpellOnFriend(spell, target)
if (not spell or not target or not UnitName(target)) then
return;
end
local targetEnemy = UnitCanAttack("player", "target");
local oldTarget = UnitName("target");
local formCancelled = false
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".
if not HealBot_PendingShapeshiftCast then HealBot_PendingShapeshiftCast = {} end
HealBot_PendingShapeshiftCast.spell = spell
HealBot_PendingShapeshiftCast.target = target
HealBot_PendingShapeshiftCast.targetEnemy = targetEnemy
HealBot_PendingShapeshiftCast.oldTarget = oldTarget
HealBot_PendingShapeshiftCast.fireTime = GetTime() + 0.05
HealBot_PendingShapeshiftCast.expires = GetTime() + 2.0
HealBot_PendingShapeshiftCast.started = nil
HealBot_PendingShapeshiftCast.nextSpam = nil
return;
end
if oldTarget ~= UnitName(target) then
TargetUnit(target);
end
HealBot_StartCasting(spell, target, "direct");
if targetEnemy then
HealBot_TargetRestorePending = "enemy";
elseif oldTarget and oldTarget ~= UnitName(target) then
HealBot_TargetRestorePending = "friend";
elseif not oldTarget then
HealBot_TargetRestorePending = "clear";
end
HealBot_TargetRestoreTimer = 0;
end
-- HealBot_CanCastSpell: Internal utility: HealBot_CanCastSpell
function HealBot_CanCastSpell(spell, unit)
local this = HealBot_Spells[spell];
-- 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
local bag, slot = HealBot_UnpackBagSlot(this.BagSlot);
local start, duration, enable = GetContainerItemCooldown(bag, slot);
if (start > 0 and duration > 0 and enable > 0) then
return false;
end
end
return true;
end
-- HealBot_GetHealSpell: Resolves spell rank based on health deficit.
function HealBot_GetHealSpell(unit, pattern)
if not string.find(unit, "^Test") then
if (not UnitName(unit)) then return nil end;
end
if not pattern then return nil end;
if UnitOnTaxi("player") then return nil end;
if not string.find(unit, "^Test") then
if HealBot_Config.ProtectPvP == 1 and UnitIsPVP(unit) and not UnitIsPVP("player") then return nil end
end
if HealBot_UnitClass("player") == "DRUID" then
if HealBot_GetShapeshiftForm() and HealBot_Config.AutoUnshift ~= 1 then return nil end;
end
-- Handle Inline Scripts
if string.sub(pattern, 1, 1) == "/" then
if HealBot_Range_Check(unit, 40) == 0 then return nil end;
return pattern;
end
-- Handle Special Targeting Pattern
if string.lower(pattern) == "target" then
if HealBot_Range_Check(unit, 40) == 0 then return nil end;
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;
if HealBot_Spells[spell] then
if not HealBot_CanCastSpell(spell, unit) then return nil end;
range = HealBot_Spells[spell].Range or HealBot_Spells[spell].range or 40;
else
local parenIdx = string.find(spell, "%s*%(")
if parenIdx then
local baseSpell = string.sub(spell, 1, parenIdx - 1)
baseSpell = string.gsub(baseSpell, "%s+$", "")
if HealBot_Spells[baseSpell] then
if not HealBot_CanCastSpell(baseSpell, unit) then return nil end;
range = HealBot_Spells[baseSpell].Range or HealBot_Spells[baseSpell].range or 40;
end
end
end
if HealBot_Range_Check(unit, range) == 0 then return nil end;
return spell;
end
-- Handle Named Macros
if GetMacroIndexByName(pattern) ~= 0 then
if HealBot_Range_Check(unit, 40) == 0 then return nil end;
return pattern;
end
-- Handle Items
local bag, slot = HealBot_FindBagSlot(pattern)
if bag then
local range = 40;
if HealBot_Spells[pattern] then
range = HealBot_Spells[pattern].Range or HealBot_Spells[pattern].range or 40;
end
if HealBot_Range_Check(unit, range) == 0 then return nil end;
return pattern;
end
return nil;
end
-- HealBot_HealUnit: Main entry point for healing a unit.
function HealBot_HealUnit(unit, pattern)
HealBot_CastSpellOnFriend(HealBot_GetHealSpell(unit, pattern), unit);
end
-- HealBot_RecalcHeals: Flags unit for visual refresh.
function HealBot_RecalcHeals(unit)
if unit then
HealBot_View_DirtyUnits[unit] = true;
else
if HealBot_Action_UnitButtons then
for u, _ in pairs(HealBot_Action_UnitButtons) do
HealBot_View_DirtyUnits[u] = true;
end
end
end
end
-- HealBot_RecalcParty: Triggers group layout rebuild.
function HealBot_RecalcParty()
HealBot_Action_PartyChanged();
if HealBot_Action_HealButtons then
for _, button in ipairs(HealBot_Action_HealButtons) do
if button and button.unit then
HealBot_OnEvent_UnitAura(nil, button.unit);
end
end
end
end
-- HealBot_RecalcSpells: Recalculates spells and updates layout.
function HealBot_RecalcSpells()
HealBot_FindHealSpells();
HealBot_RecalcParty();
end
HealBot_TalentRanks = {}
-- HealBot_GetShapeshiftForm: Detects active druid form to prevent invalid casts.
function HealBot_GetShapeshiftForm()
local forms = GetNumShapeshiftForms();
if forms then
local i;
for i=1,forms do
local icon,name,active = GetShapeshiftFormInfo(i);
if active then
if icon then
local icon_lower = string.lower(icon)
-- Exclude non-standard/custom forms like Tree of Life from unshifting
if not string.find(icon_lower, "humanoidform") and not string.find(icon_lower, "treeoflife") and not string.find(icon_lower, "healingway") and not string.find(icon_lower, "stoneclawtotem") then
return nil;
end
else
return i;
end
end
end
end
return nil;
end
@@ -30,8 +30,15 @@ function HealBot_AddChat(msg)
end end
end end
-- HealBot_AddDebug: Prints debug messages to internal chat channel. -- HealBot_AddDebug: Prints debug messages to chat or internal debug channel.
function HealBot_AddDebug(msg) function HealBot_AddDebug(msg)
if HealBot_Config and HealBot_Config.DebugMode == 1 then
if DEFAULT_CHAT_FRAME then
DEFAULT_CHAT_FRAME:AddMessage("|cFFFFD100[HB Debug]|r " .. msg);
end
return;
end
local chanid = HealBot_Get_DebugChan(); local chanid = HealBot_Get_DebugChan();
if chanid and HealBot_SpamCnt < 3 then if chanid and HealBot_SpamCnt < 3 then
HealBot_SpamCnt = HealBot_SpamCnt + 1; HealBot_SpamCnt = HealBot_SpamCnt + 1;
@@ -136,9 +143,17 @@ function HealBot_OnEvent_AddonMsg(this, addon_id, inc_msg, dist_target, sender_i
-- Clear reusable args array -- Clear reusable args array
for i=1, 10 do HealBot_Comms_Args[i] = nil end for i=1, 10 do HealBot_Comms_Args[i] = nil end
local argCount = 0 local argCount = 0
for word in string.gfind(inc_msg, "[^/]+") do local start_pos = 1
local next_pos = string.find(inc_msg, "/", start_pos, true)
while next_pos do
argCount = argCount + 1 argCount = argCount + 1
HealBot_Comms_Args[argCount] = word HealBot_Comms_Args[argCount] = string.sub(inc_msg, start_pos, next_pos - 1)
start_pos = next_pos + 1
next_pos = string.find(inc_msg, "/", start_pos, true)
end
if start_pos <= string.len(inc_msg) then
argCount = argCount + 1
HealBot_Comms_Args[argCount] = string.sub(inc_msg, start_pos)
end end
local cmd = HealBot_Comms_Args[1] local cmd = HealBot_Comms_Args[1]
@@ -7,6 +7,9 @@ local unitsToRefresh = {}
local powerToRefresh = {} local powerToRefresh = {}
local HealBot_Timer1, HealsIn_Timer = 0, 0; local HealBot_Timer1, HealsIn_Timer = 0, 0;
HealBot_LastModState = "" HealBot_LastModState = ""
HealBot_EquipChangeTimer = 0
HealBot_SpellsInitFlag = 1
HealBot_Delay_RecalcParty = 0
-- HealBot_OnLoad: Registers core events and observers on addon load. -- HealBot_OnLoad: Registers core events and observers on addon load.
function HealBot_OnLoad(this) function HealBot_OnLoad(this)
@@ -69,11 +72,11 @@ function HealBot_OnUpdate(this, arg1)
local pending = HealBot_TargetRestorePending; local pending = HealBot_TargetRestorePending;
HealBot_TargetRestorePending = nil; HealBot_TargetRestorePending = nil;
HealBot_TargetRestoreTimer = 0; HealBot_TargetRestoreTimer = 0;
if pending.type == "enemy" then if pending == "enemy" then
TargetLastEnemy(); TargetLastEnemy();
elseif pending.type == "friend" then elseif pending == "friend" then
TargetLastTarget(); TargetLastTarget();
elseif pending.type == "clear" then elseif pending == "clear" then
ClearTarget(); ClearTarget();
end end
end end
@@ -112,11 +115,11 @@ function HealBot_OnUpdate(this, arg1)
-- Restore target logic -- Restore target logic
if pendingCast.targetEnemy then if pendingCast.targetEnemy then
HealBot_TargetRestorePending = { type = "enemy" } HealBot_TargetRestorePending = "enemy"
elseif pendingCast.oldTarget and pendingCast.oldTarget ~= UnitName(pendingCast.target) then elseif pendingCast.oldTarget and pendingCast.oldTarget ~= UnitName(pendingCast.target) then
HealBot_TargetRestorePending = { type = "friend" } HealBot_TargetRestorePending = "friend"
elseif not pendingCast.oldTarget then elseif not pendingCast.oldTarget then
HealBot_TargetRestorePending = { type = "clear" } HealBot_TargetRestorePending = "clear"
end end
HealBot_TargetRestoreTimer = 0 HealBot_TargetRestoreTimer = 0
end end
@@ -173,14 +176,23 @@ function HealBot_OnUpdate(this, arg1)
HealBot_Action_RefreshPower(unitID) HealBot_Action_RefreshPower(unitID)
end end
local powerID, _ = next(HealBot_View_DirtyPower) if HealBot_Action_UpdateDebuffAnimation then
while powerID do HealBot_Action_UpdateDebuffAnimation(arg1)
HealBot_Action_RefreshPower(powerID) end
HealBot_View_DirtyPower[powerID] = nil -- Periodic resolution of units with missing class identity
powerID, _ = next(HealBot_View_DirtyPower) if HealBot_Model and HealBot_Model.unresolvedUnits and next(HealBot_Model.unresolvedUnits) then
HealBot_UnresolvedTimer = (HealBot_UnresolvedTimer or 0) + arg1
if HealBot_UnresolvedTimer >= 0.5 then
HealBot_UnresolvedTimer = 0
for u in pairs(HealBot_Model.unresolvedUnits) do
if HealBot_Model:UpdateUnitIdentity(u) then
HealBot_View_DirtyUnits[u] = true
end
end
end
end end
if HealBot_EquipChangeTimer > 0 then if (HealBot_EquipChangeTimer or 0) > 0 then
HealBot_EquipChangeTimer = HealBot_EquipChangeTimer - arg1 HealBot_EquipChangeTimer = HealBot_EquipChangeTimer - arg1
if HealBot_EquipChangeTimer <= 0 then if HealBot_EquipChangeTimer <= 0 then
HealBot_EquipChangeTimer = 0 HealBot_EquipChangeTimer = 0
@@ -189,6 +201,26 @@ function HealBot_OnUpdate(this, arg1)
HealBot_RecalcSpells(); HealBot_RecalcSpells();
end end
end end
if HealBot_Config.HealBot_Integrations_ShowHoTTimers == 1 then
if not HealBot_HoT_Update_Timer or GetTime() >= HealBot_HoT_Update_Timer then
HealBot_HoT_Update_Timer = GetTime() + 0.25
if HealBot_UpdateActiveHoTTimers then
HealBot_UpdateActiveHoTTimers()
elseif HealBot_Action_UpdatePlayerHoTs then
HealBot_Action_UpdatePlayerHoTs()
end
end
else
if (HealBot_PlayerHoTsListFrame and HealBot_PlayerHoTsListFrame:IsVisible()) or HealBot_Overlays_Active then
if HealBot_PlayerHoTsListFrame and HealBot_PlayerHoTsListFrame:IsVisible() then
HealBot_PlayerHoTsListFrame:Hide()
end
if HealBot_ClearHoTOverlays then
HealBot_ClearHoTOverlays()
end
HealBot_Overlays_Active = false
end
end
HealBot_Timer1 = HealBot_Timer1 + arg1; HealBot_Timer1 = HealBot_Timer1 + arg1;
if HealBot_Timer1 >= 2.5 then if HealBot_Timer1 >= 2.5 then
@@ -271,22 +303,30 @@ local HealBot_EventHandlers = {
HealBot_OnEvent_PlayerTargetChanged(this) HealBot_OnEvent_PlayerTargetChanged(this)
end, end,
["PARTY_MEMBERS_CHANGED"] = function(this) ["PARTY_MEMBERS_CHANGED"] = function(this)
HealBot_Model:RefreshUnit("player")
for _, unit in ipairs(HealBot_Model.partyMembers) do for _, unit in ipairs(HealBot_Model.partyMembers) do
HealBot_Model:RefreshUnit(unit) HealBot_Model:RefreshUnit(unit)
end end
for _, unit in ipairs(HealBot_Model.raidMembers) do for _, unit in ipairs(HealBot_Model.raidMembers) do
HealBot_Model:RefreshUnit(unit) HealBot_Model:RefreshUnit(unit)
end end
if HealBot_Model and HealBot_Model.PopulateAllGUIDs then
HealBot_Model:PopulateAllGUIDs()
end
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) ["RAID_ROSTER_UPDATE"] = function(this)
HealBot_Model:RefreshUnit("player")
for _, unit in ipairs(HealBot_Model.partyMembers) do for _, unit in ipairs(HealBot_Model.partyMembers) do
HealBot_Model:RefreshUnit(unit) HealBot_Model:RefreshUnit(unit)
end end
for _, unit in ipairs(HealBot_Model.raidMembers) do for _, unit in ipairs(HealBot_Model.raidMembers) do
HealBot_Model:RefreshUnit(unit) HealBot_Model:RefreshUnit(unit)
end end
if HealBot_Model and HealBot_Model.PopulateAllGUIDs then
HealBot_Model:PopulateAllGUIDs()
end
HealBot_Model:NotifyObservers("ROSTER_CHANGED") HealBot_Model:NotifyObservers("ROSTER_CHANGED")
HealBot_OnEvent_PartyMembersChanged(this) HealBot_OnEvent_PartyMembersChanged(this)
end, end,
@@ -300,6 +340,9 @@ local HealBot_EventHandlers = {
["PLAYER_ENTERING_WORLD"] = function(this) ["PLAYER_ENTERING_WORLD"] = function(this)
HealBot_Model:RefreshUnit("player") HealBot_Model:RefreshUnit("player")
HealBot_Model:RefreshUnit("pet") HealBot_Model:RefreshUnit("pet")
if HealBot_Model and HealBot_Model.PopulateAllGUIDs then
HealBot_Model:PopulateAllGUIDs()
end
HealBot_OnEvent_PlayerEnteringWorld(this) HealBot_OnEvent_PlayerEnteringWorld(this)
end, end,
["VARIABLES_LOADED"] = function(this) ["VARIABLES_LOADED"] = function(this)
@@ -343,8 +386,6 @@ end
-- HealBot_OnEvent_VariablesLoaded: Applies config defaults and initializes state. -- 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 function DeepCopyMissing(src, dest) local function DeepCopyMissing(src, dest)
for k, v in pairs(src) do for k, v in pairs(src) do
if type(v) == "table" then if type(v) == "table" then
@@ -359,6 +400,11 @@ function HealBot_OnEvent_VariablesLoaded(this)
end end
DeepCopyMissing(HealBot_ConfigDefaults, HealBot_Config) DeepCopyMissing(HealBot_ConfigDefaults, HealBot_Config)
local locClass = UnitClass("player")
if locClass and (not HealBot_Config.KeyCombo[locClass] or not next(HealBot_Config.KeyCombo[locClass])) then
HealBot_Config.KeyCombo[locClass] = { ["Left"] = "Target" }
end
local foundModern = false local foundModern = false
if HealBot_Config.Skins then if HealBot_Config.Skins then
for _, skin in ipairs(HealBot_Config.Skins) do for _, skin in ipairs(HealBot_Config.Skins) do
@@ -371,6 +417,13 @@ function HealBot_OnEvent_VariablesLoaded(this)
HealBot_InitData(); HealBot_InitData();
if HealBot_Config and HealBot_Config.CDCOverlay == 6 and not HealBot_Config.CDCOverlay_v2 then
HealBot_Config.CDCOverlay = 7
end
if HealBot_Config then
HealBot_Config.CDCOverlay_v2 = 1
end
if not HealBot_PartyFrameHooked then if not HealBot_PartyFrameHooked then
local origShowPartyFrame = ShowPartyFrame; local origShowPartyFrame = ShowPartyFrame;
ShowPartyFrame = function() ShowPartyFrame = function()
@@ -387,10 +440,10 @@ function HealBot_OnEvent_VariablesLoaded(this)
HidePartyFrame(); HidePartyFrame();
end end
if class == "PRIEST" or class == "DRUID" or class == "PALADIN" or class == "SHAMAN" then
HealBot_BonusScanner:ScanEquipment(); HealBot_BonusScanner:ScanEquipment();
HealBot_Action_ShowFrame(); HealBot_Action_ShowFrame();
HealBot_Action_ResetSkin();
this:RegisterEvent("ZONE_CHANGED_NEW_AREA"); this:RegisterEvent("ZONE_CHANGED_NEW_AREA");
this:RegisterEvent("PLAYER_REGEN_DISABLED"); this:RegisterEvent("PLAYER_REGEN_DISABLED");
@@ -419,7 +472,6 @@ function HealBot_OnEvent_VariablesLoaded(this)
this:RegisterEvent("CHAT_MSG_SYSTEM"); this:RegisterEvent("CHAT_MSG_SYSTEM");
this:RegisterEvent("PLAYER_ENTERING_WORLD"); this:RegisterEvent("PLAYER_ENTERING_WORLD");
HealBot_SpellsInitFlag = 2; HealBot_SpellsInitFlag = 2;
end
end end
-- HealBot_OnEvent_UnitHealth: Internal utility: HealBot_OnEvent_UnitHealth -- HealBot_OnEvent_UnitHealth: Internal utility: HealBot_OnEvent_UnitHealth
@@ -505,6 +557,7 @@ end
function HealBot_OnEvent_PartyMembersChanged(this) function HealBot_OnEvent_PartyMembersChanged(this)
HealBot_Model:PreserveStateByGUID() HealBot_Model:PreserveStateByGUID()
HealBot_Integrations_PruneNampower() HealBot_Integrations_PruneNampower()
if HealBot_UpdateUnitIDCache then HealBot_UpdateUnitIDCache() end
if HealBot_IsFighting then if HealBot_IsFighting then
HealBot_Action_PartyChanged() HealBot_Action_PartyChanged()
end end
@@ -564,12 +617,14 @@ end
function HealBot_OnEvent_SpellsChanged(this, arg1) function HealBot_OnEvent_SpellsChanged(this, arg1)
if arg1 then return; end if arg1 then return; end
HealBot_AddDebug("HB: SpellsChanged"); HealBot_AddDebug("HB: SpellsChanged");
if HealBot_CacheSpellIDs then HealBot_CacheSpellIDs() end
HealBot_SpellsInitFlag = 2; HealBot_SpellsInitFlag = 2;
end end
-- HealBot_OnEvent_TalentsChanged: Internal utility: HealBot_OnEvent_TalentsChanged -- 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");
if HealBot_UpdateTalentRanks then HealBot_UpdateTalentRanks() end
end end
-- HealBot_OnEvent_PlayerEnteringWorld: Internal utility: HealBot_OnEvent_PlayerEnteringWorld -- HealBot_OnEvent_PlayerEnteringWorld: Internal utility: HealBot_OnEvent_PlayerEnteringWorld
@@ -579,6 +634,7 @@ function HealBot_OnEvent_PlayerEnteringWorld(this)
if HealBot_ApplyRefreshHook then if HealBot_ApplyRefreshHook then
HealBot_ApplyRefreshHook() HealBot_ApplyRefreshHook()
end end
if HealBot_UpdateUnitIDCache then HealBot_UpdateUnitIDCache() end
end end
-- HealBot_OnEvent_SpellcastStart: Internal utility: HealBot_OnEvent_SpellcastStart -- HealBot_OnEvent_SpellcastStart: Internal utility: HealBot_OnEvent_SpellcastStart
+95
View File
@@ -0,0 +1,95 @@
-- HealBot_Controller_Range.lua
-- Handles periodic range checking for units
local _scale = 0
-- HealBot_ResetRangeScale: Resets map range scaling on zone change.
function HealBot_ResetRangeScale()
_scale = 0
end
local _rangeCache = {}
local _lastFrameTime = 0
-- HealBot_Range_Check: Checks if unit is in range via map distance or API.
function HealBot_Range_Check(unit, range)
local currentTime = GetTime()
if _lastFrameTime ~= currentTime then
for r, cacheTable in pairs(_rangeCache) do
for u in pairs(cacheTable) do
cacheTable[u] = nil
end
end
_lastFrameTime = currentTime
end
local return_val = 0;
if not range then
range = 40;
end
_rangeCache[range] = _rangeCache[range] or {}
if _rangeCache[range][unit] ~= nil then
return _rangeCache[range][unit]
end
if ( unit and (unit == "player" or string.find(unit, "^Test") or UnitIsUnit(unit, "player")) ) then
return_val = 1;
else
local checked = false
if HealBot_Integrations_ClassicAPI_Active and UnitDistanceSquared and UnitInLineOfSight then
local inSight = UnitInLineOfSight(unit)
if inSight == nil then inSight = UnitInLineOfSight("player", unit) end
if inSight ~= nil then
checked = true
if inSight then
local distSq = UnitDistanceSquared(unit)
if distSq and distSq <= (range * range) then
return_val = 1;
end
end
end
end
if not checked and HealBot_Integrations_UnitXP_Active then
local inSight = UnitXP("inSight", "player", unit)
if inSight ~= nil then
checked = true
if inSight then
local dist = UnitXP("distanceBetween", "player", unit, "Gaussian")
if dist and dist <= range then
return_val = 1;
end
end
end
end
if not checked and ( UnitIsVisible(unit) == 1 ) then
local tx, ty = GetPlayerMapPosition(unit)
local dist
if tx > 0 or ty > 0 then
local px, py = GetPlayerMapPosition("player")
dist = math.sqrt((px - tx)^2 + (py - ty)^2)
if dist > _scale and (px > 0 or py > 0) then
if ( CheckInteractDistance(unit, 4) ) then
_scale = dist
end
end
if dist <= (_scale * range / 27) then
return_val = 1
end
else
if ( HealBot_Config.QualityRange == 1 ) or range <= 27 or unit == "target" then
if ( CheckInteractDistance(unit, 4) ) then
return_val = 1;
end
else
return_val = 1;
end
end
end
end
_rangeCache[range][unit] = return_val
return return_val;
end
@@ -1,22 +1,5 @@
-- HealBot_Controller_Spells.lua -- HealBot_Controller_SpellBook.lua
-- Centralized Spell management, calculation, and casting logic -- Spellbook parsing, tooltip data extraction, rank math, and equipment/talent bonuses
HealBot_CastingSpell = nil;
HealBot_CastingTarget = nil;
HealBot_TargetRestorePending = nil;
HealBot_TargetRestoreTimer = 0;
local HealBot_Health60 = {
["DRUID"] = 3500,
["MAGE"] = 2500,
["HUNTER"] = 3500,
["PALADIN"] = 4000,
["PRIEST"] = 2500,
["ROGUE"] = 3500,
["SHAMAN"] = 3800,
["WARLOCK"] = 3500,
["WARRIOR"] = 5000,
}
-- HealBot_GetSpellName: Internal utility: HealBot_GetSpellName -- HealBot_GetSpellName: Internal utility: HealBot_GetSpellName
function HealBot_GetSpellName(id) function HealBot_GetSpellName(id)
@@ -33,102 +16,27 @@ function HealBot_GetSpellName(id)
return spellName .. " (" .. subSpellName .. ")"; return spellName .. " (" .. subSpellName .. ")";
end end
HealBot_SpellNameToId = {}
function HealBot_CacheSpellIDs()
HealBot_SpellNameToId = {}
local id = 1
while true do
local spellName, subSpellName = GetSpellName(id, BOOKTYPE_SPELL)
if not spellName then break end
if subSpellName and subSpellName ~= "" then
HealBot_SpellNameToId[spellName .. " (" .. subSpellName .. ")"] = id
HealBot_SpellNameToId[spellName .. "(" .. subSpellName .. ")"] = id
end
HealBot_SpellNameToId[spellName] = id
id = id + 1
end
end
-- HealBot_GetSpellId: Internal utility: HealBot_GetSpellId -- HealBot_GetSpellId: Internal utility: HealBot_GetSpellId
function HealBot_GetSpellId(spell) function HealBot_GetSpellId(spell)
local id, idd = 1, 0; if not spell then return nil end
while true do return HealBot_SpellNameToId[spell]
local spellName, subSpellName = GetSpellName(id, BOOKTYPE_SPELL);
if (spellName) then
if (spell == spellName .. " (" .. subSpellName .. ")") or (spell == spellName .. "(" .. subSpellName .. ")") then
return id;
end
if (spell == spellName) then
idd = id;
end
else
break
end
id = id + 1;
end
if idd > 0 then
return idd
else
return nil;
end
end
-- HealBot_CastSpellByName: Internal utility: HealBot_CastSpellByName
function HealBot_CastSpellByName(spell)
if (HealBot_Spells[spell] and HealBot_Spells[spell].BagSlot) then
HealBot_UseItem(spell);
return;
end
local id;
if not HealBot_Spells[spell] then
id = HealBot_GetSpellId(spell);
elseif HealBot_Spells[spell].id then
id = HealBot_Spells[spell].id
else
id = HealBot_GetSpellId(spell);
end
if (not id) then
return;
end
CastSpell(id, BOOKTYPE_SPELL);
end
-- HealBot_AnnounceCast: Internal utility: HealBot_AnnounceCast
function HealBot_AnnounceCast(spell, target)
if not spell or not target then return end
if UnitIsDeadOrGhost(target) then
local spellLower = string.lower(spell)
if not (string.find(spellLower, "resurrection") or string.find(spellLower, "ancestral spirit") or string.find(spellLower, "redemption") or string.find(spellLower, "rebirth")) then
return
end
end
if HealBot_Config.ChatMessages then
local tName = target
if target == "target" then tName = HealBot_TargetName() or "target" else tName = UnitName(target) end
if not tName then tName = target end
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
-- Strip trailing spaces from base spell
baseSpell = string.gsub(baseSpell, "%s+$", "")
for i = 1, 5 do
local msgConf = HealBot_Config.ChatMessages[i]
local configSpell = msgConf and msgConf.Spell or ""
-- Strip trailing spaces from config spell just in case
configSpell = string.gsub(configSpell, "%s+$", "")
if msgConf and configSpell ~= "" and msgConf.Channel ~= "None" and (configSpell == spell or configSpell == baseSpell) then
local msg = msgConf.Message or ""
msg = string.gsub(msg, "#Spell#", spell)
msg = string.gsub(msg, "#Target#", tName)
local chan = msgConf.Channel
if chan == "Say" then
SendChatMessage(msg, "SAY")
elseif chan == "Party" and GetNumPartyMembers() > 0 then
SendChatMessage(msg, "PARTY")
elseif chan == "Raid" and GetNumRaidMembers() > 0 then
SendChatMessage(msg, "RAID")
elseif chan == "Whisper" and UnitIsPlayer(target) then
SendChatMessage(msg, "WHISPER", nil, tName)
end
end
end
end
end end
-- HealBot_Process_HealValue: Internal utility: HealBot_Process_HealValue -- HealBot_Process_HealValue: Internal utility: HealBot_Process_HealValue
@@ -158,194 +66,54 @@ function HealBot_Process_HealValue(spell, target)
end end
local uname = UnitName(target) local uname = UnitName(target)
if uname then if uname then
HealBot_SendAddonMessage(HEALBOT_ADDON_ID, ">> " .. uname .. " <<=>> " .. HealBot_HealValue .. " << "); if not HealBot_CastingGroupMembers then HealBot_CastingGroupMembers = {} end
HealBot_SendAddonMessage("HealComm", "Heal/" .. uname .. "/" .. HealBot_HealValue .. "/1500/"); for i=1, table.getn(HealBot_CastingGroupMembers) do HealBot_CastingGroupMembers[i] = nil end
if not HealBot_HealsIn[uname] then table.setn(HealBot_CastingGroupMembers, 0)
HealBot_HealsIn[uname] = 0; if HEALBOT_PRAYER_OF_HEALING and string.find(spell, HEALBOT_PRAYER_OF_HEALING) then
if GetNumRaidMembers() > 0 then
local targetGroup = 0
for i = 1, GetNumRaidMembers() do
local name, _, subgroup = GetRaidRosterInfo(i)
if name == uname then targetGroup = subgroup; break; end
end end
HealBot_HealsIn[uname] = HealBot_HealsIn[uname] + HealBot_HealValue; if targetGroup > 0 then
HealBot_RecalcHeals(HealBot_FindUnitID(uname)); for i = 1, GetNumRaidMembers() do
local name, _, subgroup = GetRaidRosterInfo(i)
if subgroup == targetGroup and name then table.insert(HealBot_CastingGroupMembers, name); end
end end
end end
end
-- HealBot_StartCasting: Initiates spell cast and broadcasts incoming heal.
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 else
parenIndex = string.find(spell, "%(") table.insert(HealBot_CastingGroupMembers, UnitName("player"))
if parenIndex then for i = 1, GetNumPartyMembers() do
baseSpell = string.sub(spell, 1, parenIndex - 1) if UnitName("party"..i) then table.insert(HealBot_CastingGroupMembers, UnitName("party"..i)); end
end end
end end
end
if table.getn(HealBot_CastingGroupMembers) == 0 then
table.insert(HealBot_CastingGroupMembers, uname)
end
HealBot_CastSpellByName(spell); if table.getn(HealBot_CastingGroupMembers) > 1 then
if ( SpellCanTargetUnit(target) ) then local commsStr = "GrpHeal/" .. HealBot_HealValue .. "/1500/"
SpellTargetUnit(target); for _, memberName in ipairs(HealBot_CastingGroupMembers) do
ttype = "fired"; commsStr = commsStr .. memberName .. "/"
elseif SpellIsTargeting() then
SpellTargetUnit(target);
SpellStopTargeting()
elseif ttype == "direct" then
if ( UnitIsUnit(target, "player") or CheckInteractDistance(target, 4) ) then
ttype = "fired";
end end
HealBot_SendAddonMessage("HealComm", commsStr)
for _, memberName in ipairs(HealBot_CastingGroupMembers) do
HealBot_SendAddonMessage(HEALBOT_ADDON_ID, ">> " .. memberName .. " <<=>> " .. HealBot_HealValue .. " << ")
if not HealBot_HealsIn[memberName] then HealBot_HealsIn[memberName] = 0 end
HealBot_HealsIn[memberName] = HealBot_HealsIn[memberName] + HealBot_HealValue
HealBot_RecalcHeals(HealBot_FindUnitID(memberName))
end end
if ttype == "fired" and HealBot_Spells[baseSpell] then
if not HealBot_CastFailed then
HealBot_CastingSpell = baseSpell;
HealBot_CastingTarget = target;
HealBot_Process_HealValue(baseSpell, target);
HealBot_AnnounceCast(spell, target);
end
end
return ttype == "fired"
end
-- HealBot_StopCasting: Internal utility: HealBot_StopCasting
function HealBot_StopCasting()
HealBot_IsCasting = false;
if HealBot_CastingTarget then
if HealBot_HealValue > 0 then
local uname = UnitName(HealBot_CastingTarget)
if uname then
HealBot_SendAddonMessage(HEALBOT_ADDON_ID, ">> " .. uname .. " <<=>> " .. 0 - HealBot_HealValue .. " << ");
HealBot_SendAddonMessage("HealComm", "Healstop");
if HealBot_HealsIn[uname] then
HealBot_HealsIn[uname] = HealBot_HealsIn[uname] - HealBot_HealValue;
if HealBot_HealsIn[uname] < 0 then
HealBot_HealsIn[uname] = 0;
end
HealBot_RecalcHeals(HealBot_FindUnitID(uname));
end
end
HealBot_HealValue = 0;
end
end
HealBot_CastingSpell = nil;
HealBot_CastingTarget = nil;
local bar = HealBot_Action_HealthBar(HealBot_Action_AbortButton);
local ar = HealBot_Config.babortcolr[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 aa = HealBot_Config.babortcola[HealBot_Config.Current_Skin] or 1;
bar.txt = getglobal(bar:GetName() .. "_text");
bar:SetStatusBarColor(ar, ag, ab, 0);
local sr = HealBot_Config.btextdisbledcolr[HealBot_Config.Current_Skin];
local sg = HealBot_Config.btextdisbledcolg[HealBot_Config.Current_Skin];
local sb = HealBot_Config.btextdisbledcolb[HealBot_Config.Current_Skin];
local sa = HealBot_Config.btextdisbledcola[HealBot_Config.Current_Skin];
bar.txt:SetTextColor(sr, sg, sb, sa);
end
-- HealBot_UnitHealth: Internal utility: HealBot_UnitHealth
function HealBot_UnitHealth(unit)
local Current, Desired = UnitHealth(unit), UnitHealthMax(unit);
if unit == 'target' and Desired == 100 then
local class, level = HealBot_UnitClass(unit), UnitLevel(unit);
if HealBot_Health60[class] and level > 0 then
Desired = math.floor(HealBot_Health60[class] / 60 * level + 0.5)
else else
Desired = UnitHealthMax('player'); HealBot_SendAddonMessage("HealComm", "Heal/" .. uname .. "/" .. HealBot_HealValue .. "/1500/")
end HealBot_SendAddonMessage(HEALBOT_ADDON_ID, ">> " .. uname .. " <<=>> " .. HealBot_HealValue .. " << ")
Current = Desired / 100 * Current; if not HealBot_HealsIn[uname] then HealBot_HealsIn[uname] = 0 end
end HealBot_HealsIn[uname] = HealBot_HealsIn[uname] + HealBot_HealValue
return Current, Desired; HealBot_RecalcHeals(HealBot_FindUnitID(uname))
end
-- HealBot_CheckCasting: Internal utility: HealBot_CheckCasting
function HealBot_CheckCasting(unit)
if not HealBot_CastingSpell or HealBot_AlwaysHeal() then return nil end
if not HealBot_Spells[HealBot_CastingSpell] then return nil end
if not unit then unit = HealBot_CastingTarget end
if unit ~= HealBot_CastingTarget then return nil end
local bar = HealBot_Action_HealthBar(HealBot_Action_AbortButton);
local ar = HealBot_Config.babortcolr[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 aa = HealBot_Config.babortcola[HealBot_Config.Current_Skin] or 1;
if not bar.txt then bar.txt = getglobal(bar:GetName() .. "_text") end
if HealBot_IsCasting == false and HealBot_AbortButton == 0 then
bar:SetStatusBarColor(ar, ag, ab, 0);
local sr = HealBot_Config.btextdisbledcolr[HealBot_Config.Current_Skin];
local sg = HealBot_Config.btextdisbledcolg[HealBot_Config.Current_Skin];
local sb = HealBot_Config.btextdisbledcolb[HealBot_Config.Current_Skin];
local sa = HealBot_Config.btextdisbledcola[HealBot_Config.Current_Skin];
bar.txt:SetTextColor(sr, sg, sb, sa);
return nil
end
local Current, Desired = HealBot_UnitHealth(unit)
local Needed = Desired - Current;
Needed = Needed * (1 + (HealBot_Config.OverHeal * 4));
if Needed < 0 then Needed = 0 end
if (Needed > HealBot_Spells[HealBot_CastingSpell].HealsDur) then
local sr = HealBot_Config.btextdisbledcolr[HealBot_Config.Current_Skin];
local sg = HealBot_Config.btextdisbledcolg[HealBot_Config.Current_Skin];
local sb = HealBot_Config.btextdisbledcolb[HealBot_Config.Current_Skin];
local sa = HealBot_Config.btextdisbledcola[HealBot_Config.Current_Skin];
bar.txt:SetTextColor(sr, sg, sb, sa);
bar:SetStatusBarColor(ar, ag, ab, 0);
return nil
elseif HealBot_AbortButton == 1 and HealBot_IsCasting == true then
bar:SetStatusBarColor(ar, ag, ab, aa);
local sr = HealBot_Config.btextenabledcolr[HealBot_Config.Current_Skin];
local sg = HealBot_Config.btextenabledcolg[HealBot_Config.Current_Skin];
local sb = HealBot_Config.btextenabledcolb[HealBot_Config.Current_Skin];
local sa = HealBot_Config.btextenabledcola[HealBot_Config.Current_Skin];
bar.txt = getglobal(bar:GetName() .. "_text");
bar.txt:SetTextColor(sr, sg, sb, sa);
end
end
-- HealBot_CastSpellOnFriend: Target-safe wrapper for casting spells on allies.
function HealBot_CastSpellOnFriend(spell, target)
if (not spell or not target or not UnitName(target)) then
return;
end
local targetEnemy = UnitCanAttack("player", "target");
local oldTarget = UnitName("target");
local formCancelled = false
if HealBot_UnitClass("player") == "DRUID" and HealBot_Config.AutoUnshift == 1 then
local currentForm = HealBot_GetShapeshiftForm()
if currentForm then
CastShapeshiftForm(currentForm);
formCancelled = true
end end
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
TargetUnit(target);
end
HealBot_StartCasting(spell, target, "direct");
if targetEnemy then
HealBot_TargetRestorePending = { type = "enemy" };
elseif oldTarget and oldTarget ~= UnitName(target) then
HealBot_TargetRestorePending = { type = "friend" };
elseif not oldTarget then
HealBot_TargetRestorePending = { type = "clear" };
end
HealBot_TargetRestoreTimer = 0;
end end
-- HealBot_SetItemDefaults: Internal utility: HealBot_SetItemDefaults -- HealBot_SetItemDefaults: Internal utility: HealBot_SetItemDefaults
@@ -428,7 +196,13 @@ end
-- HealBot_AddHeal: Internal utility: HealBot_AddHeal -- 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) local targetList = HealBot_Spells[spell].Target
if not targetList and HealBot_Spells[spell].Group and HealBot_Spells[HealBot_Spells[spell].Group] then
targetList = HealBot_Spells[HealBot_Spells[spell].Group].Target
end
if not targetList then targetList = {"player", "party", "pet"} end
table.foreachi(targetList, function (i, val)
if not HealBot_Heals[val] then HealBot_Heals[val] = {} end
table.insert(HealBot_Heals[val], spell); table.insert(HealBot_Heals[val], spell);
end); end);
HealBot_Spells[spell].BagSlot = HealBot_GetBagSlot(spell); HealBot_Spells[spell].BagSlot = HealBot_GetBagSlot(spell);
@@ -440,6 +214,7 @@ function HealBot_FindHealSpells()
if HealBot_SpellsInitFlag > 0 then NeedEquipUpdate = 1; return; end if HealBot_SpellsInitFlag > 0 then NeedEquipUpdate = 1; return; end
HealBot_Heals = { player = {}, pet = {}, party = {} }; HealBot_Heals = { player = {}, pet = {}, party = {} };
RealHealing = 0;
table.foreach(HealBot_CurrentSpells, function (index, spell) table.foreach(HealBot_CurrentSpells, function (index, spell)
if (HealBot_Spells[spell]) then if (HealBot_Spells[spell]) then
@@ -459,7 +234,7 @@ function HealBot_FindHealSpells()
temp_Spell_cast = HealBot_Spells[spell].CastTime; temp_Spell_cast = HealBot_Spells[spell].CastTime;
end end
RealHealing = ((HealBot_GetBonus() * healingbonus_penalty) * (temp_Spell_cast / 3.5)); RealHealing = ((HealBot_GetBonus() * healingbonus_penalty) * (temp_Spell_cast / 3.5));
local playerClass, englishClass = UnitClass("player"); local englishClass = HealBot_UnitClass("player");
local SpiBonus = 0; local SpiBonus = 0;
if (englishClass == "PRIEST") then if (englishClass == "PRIEST") then
SpiBonus = ((HealBot_SpiBonus(spell) * healingbonus_penalty) * (temp_Spell_cast / 3.5)) SpiBonus = ((HealBot_SpiBonus(spell) * healingbonus_penalty) * (temp_Spell_cast / 3.5))
@@ -472,7 +247,7 @@ function HealBot_FindHealSpells()
end end
end); end);
local items = {}; local items = HealBot_GetTable();
for bag = 0, NUM_BAG_FRAMES do for bag = 0, NUM_BAG_FRAMES do
for slot = 1, GetContainerNumSlots(bag) do for slot = 1, GetContainerNumSlots(bag) do
local item = HealBot_GetItemName(bag, slot); local item = HealBot_GetItemName(bag, slot);
@@ -483,12 +258,8 @@ function HealBot_FindHealSpells()
end end
end end
end end
table.foreach(HealBot_Heals, function (key, val)
if (table.getn(val) == 0) then
HealBot_Heals[key] = nil;
end
end);
HealBot_Heals.target = HealBot_Heals.party; HealBot_Heals.target = HealBot_Heals.party;
HealBot_Heals.focus = HealBot_Heals.party;
for i = 1, 4 do for i = 1, 4 do
HealBot_Heals["party" .. i] = HealBot_Heals.party; HealBot_Heals["party" .. i] = HealBot_Heals.party;
HealBot_Heals["partypet" .. i] = HealBot_Heals.party; HealBot_Heals["partypet" .. i] = HealBot_Heals.party;
@@ -498,109 +269,29 @@ function HealBot_FindHealSpells()
HealBot_Heals["raidpet" .. i] = HealBot_Heals.party; HealBot_Heals["raidpet" .. i] = HealBot_Heals.party;
end end
HealBot_ReleaseTable(items);
if HealBot_CalcEquipBonus then if HealBot_CalcEquipBonus then
HealBot_AddDebug("...Done Equip Bonus:" .. RealHealing); HealBot_AddDebug("...Done Equip Bonus:" .. tostring(RealHealing or 0));
end end
HealBot_CalcEquipBonus = false; HealBot_CalcEquipBonus = false;
end end
-- HealBot_CanCastSpell: Internal utility: HealBot_CanCastSpell function HealBot_UpdateTalentRanks()
function HealBot_CanCastSpell(spell, unit) HealBot_TalentRanks = {}
local this = HealBot_Spells[spell]; for t = 1, GetNumTalentTabs() do
-- Removed manual mana check so WoW can properly handle 0-cost buffs (Clearcasting/Inner Focus) for i = 1, GetNumTalents(t) do
-- and so tooltips can render in red instead of disappearing. local nameTalent, icon, tier, column, currRank, maxRank = GetTalentInfo(t, i)
if this.BagSlot then if nameTalent then
local bag, slot = HealBot_UnpackBagSlot(this.BagSlot); HealBot_TalentRanks[nameTalent] = currRank
local start, duration, enable = GetContainerItemCooldown(bag, slot);
if (start > 0 and duration > 0 and enable > 0) then
return false;
end
end
return true;
end
-- HealBot_GetHealSpell: Resolves spell rank based on health deficit.
function HealBot_GetHealSpell(unit, pattern)
if (not UnitName(unit)) then return nil end;
if not pattern 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_UnitClass("player") == "DRUID" then
if HealBot_GetShapeshiftForm() and HealBot_Config.AutoUnshift ~= 1 then return nil end;
end
-- 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;
if HealBot_Spells[spell] then
if not HealBot_CanCastSpell(spell, unit) then return nil end;
range = HealBot_Spells[spell].range or 40;
end
if HealBot_Range_Check(unit, range) == 0 then return nil end;
return spell;
end
-- Handle Named Macros
if GetMacroIndexByName(pattern) ~= 0 then
return pattern;
end
-- Handle Items
local bag, slot = HealBot_FindBagSlot(pattern)
if bag then
-- optionally check item range, but skipping for now as it's complex in vanilla
return pattern;
end
return nil;
end
-- HealBot_HealUnit: Main entry point for healing a unit.
function HealBot_HealUnit(unit, pattern)
HealBot_CastSpellOnFriend(HealBot_GetHealSpell(unit, pattern), unit);
end
-- HealBot_RecalcHeals: Flags unit for visual refresh.
function HealBot_RecalcHeals(unit)
HealBot_Action_Refresh(unit);
end
-- HealBot_RecalcParty: Triggers group layout rebuild.
function HealBot_RecalcParty()
HealBot_Action_PartyChanged();
if HealBot_Action_HealButtons then
for _, button in ipairs(HealBot_Action_HealButtons) do
if button and button.unit then
HealBot_OnEvent_UnitAura(nil, button.unit);
end end
end end
end end
HealBot_Action_RefreshButtons();
end
-- HealBot_RecalcSpells: Recalculates spells and updates layout.
function HealBot_RecalcSpells()
HealBot_FindHealSpells();
HealBot_RecalcParty();
end end
-- HealBot_GetTalentRank: Internal utility: HealBot_GetTalentRank -- HealBot_GetTalentRank: Internal utility: HealBot_GetTalentRank
function HealBot_GetTalentRank(talentName) function HealBot_GetTalentRank(talentName)
for t = 1, GetNumTalentTabs() do if not next(HealBot_TalentRanks) then HealBot_UpdateTalentRanks() end
for i = 1, GetNumTalents(t) do return HealBot_TalentRanks[talentName] or 0
local nameTalent, icon, tier, column, currRank, maxRank = GetTalentInfo(t, i);
if nameTalent == talentName then
return currRank;
end
end
end
return 0;
end end
-- HealBot_SpiBonus: Internal utility: HealBot_SpiBonus -- HealBot_SpiBonus: Internal utility: HealBot_SpiBonus
@@ -635,6 +326,7 @@ end
-- HealBot_InitSpells: Scans spellbook to find available heals. -- HealBot_InitSpells: Scans spellbook to find available heals.
function HealBot_InitSpells() function HealBot_InitSpells()
HealBot_CacheSpellIDs()
local id = 1 local id = 1
local cnt = 0; local cnt = 0;
local class = HealBot_UnitClass("player") local class = HealBot_UnitClass("player")
@@ -673,8 +365,15 @@ function HealBot_InitGetSpellData(spell, id, class)
_cast = 0; _cast = 0;
line = nil; line = nil;
if not HealBot_ScanTooltip_Lines_Left then HealBot_ScanTooltip_Lines_Left = {} end
if not HealBot_ScanTooltip_Lines_Right then HealBot_ScanTooltip_Lines_Right = {} end
for lineNum = 2, 6 do for lineNum = 2, 6 do
local lText = getglobal("HealBot_ScanTooltipTextLeft"..lineNum); local lText = HealBot_ScanTooltip_Lines_Left[lineNum];
if not lText then
lText = getglobal("HealBot_ScanTooltipTextLeft"..lineNum);
HealBot_ScanTooltip_Lines_Left[lineNum] = lText;
end
if lText and lText:IsVisible() and lText:GetText() then if lText and lText:IsVisible() and lText:GetText() then
local txt = lText:GetText(); local txt = lText:GetText();
local t1, t2, match; local t1, t2, match;
@@ -698,7 +397,11 @@ function HealBot_InitGetSpellData(spell, id, class)
end end
end end
local rText = getglobal("HealBot_ScanTooltipTextRight"..lineNum); local rText = HealBot_ScanTooltip_Lines_Right[lineNum];
if not rText then
rText = getglobal("HealBot_ScanTooltipTextRight"..lineNum);
HealBot_ScanTooltip_Lines_Right[lineNum] = rText;
end
if rText and rText:IsVisible() and rText:GetText() then if rText and rText:IsVisible() and rText:GetText() then
local txt = rText:GetText(); local txt = rText:GetText();
local t1, t2, match; local t1, t2, match;
@@ -861,26 +564,3 @@ end
-- HealBot_GetShapeshiftForm: Detects active druid form to prevent invalid casts.
function HealBot_GetShapeshiftForm()
local forms = GetNumShapeshiftForms();
if forms then
local i;
for i=1,forms do
local icon,name,active = GetShapeshiftFormInfo(i);
if active then
if icon then
local icon_lower = string.lower(icon)
-- Exclude non-standard/custom forms like Tree of Life from unshifting
if not string.find(icon_lower, "humanoidform") and not string.find(icon_lower, "treeoflife") and not string.find(icon_lower, "healingway") and not string.find(icon_lower, "stoneclawtotem") then
return nil;
end
else
return i;
end
end
end
end
return nil;
end
-7
View File
@@ -1,13 +1,6 @@
<Ui xmlns="http://www.blizzard.com/wow/ui/" <Ui xmlns="http://www.blizzard.com/wow/ui/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.blizzard.com/wow/ui/ ..\FrameXML\UI.xsd"> xsi:schemaLocation="http://www.blizzard.com/wow/ui/ ..\FrameXML\UI.xsd">
<Script file="HealBot_Localization.en.lua" />
<Script file="HealBot_Localization.de.lua" />
<Script file="HealBot_Localization.fr.lua" />
<Script file="HealBot_Localization.kr.lua" />
<Script file="HealBot_BonusScanner.lua" />
<Script file="HealBot_Data.lua" />
<Script file="HealBot.lua" />
<StatusBar name="HealBot_StatusBar" virtual="true" frameStrata="FOREGROUND" hidden="false"> <StatusBar name="HealBot_StatusBar" virtual="true" frameStrata="FOREGROUND" hidden="false">
<Size> <Size>
+44 -22
View File
@@ -1,6 +1,6 @@
## Interface: 11200 ## Interface: 11200
## Title: HealBotBlue ## Title: HealBotBlue
## Version: 1.7.2 ## Version: 1.7.8dev
## Author: Bluewhale ## Author: Bluewhale
## Notes: Raidframe replacement for healing, decursing, resource tracking and buffing with optional support for SuperWow, ClassicAPI, UnitXP_SP3 and Nampower. ## Notes: Raidframe replacement for healing, decursing, resource tracking and buffing with optional support for SuperWow, ClassicAPI, UnitXP_SP3 and Nampower.
## SavedVariablesPerCharacter: HealBot_Config ## SavedVariablesPerCharacter: HealBot_Config
@@ -8,25 +8,47 @@
..\..\FrameXML\OptionsFrameTemplates.xml ..\..\FrameXML\OptionsFrameTemplates.xml
..\..\FrameXML\UIPanelTemplates.xml ..\..\FrameXML\UIPanelTemplates.xml
..\..\FrameXML\UIDropDownMenu.xml ..\..\FrameXML\UIDropDownMenu.xml
HealBot_Error.xml Locales\HealBot_Localization.en.lua
HealBot_Model.lua Locales\HealBot_Localization.de.lua
HealBot_Integrations.lua Locales\HealBot_Localization.fr.lua
HealBot_Controller_Range.lua Locales\HealBot_Localization.kr.lua
HealBot_Controller_Comms.lua Model\HealBot_Data.lua
HealBot_Controller_Aura.lua Model\HealBot_Model.lua
HealBot_Controller_Spells.lua Integrations\HealBot_BonusScanner.lua
HealBot_Controller_Events.lua Integrations\HealBot_Integrations.lua
Controller\HealBot_Controller_Range.lua
Controller\HealBot_Controller_Comms.lua
Controller\HealBot_Controller_Aura.lua
Controller\HealBot_Controller_SpellBook.lua
Controller\HealBot_Controller_Casting.lua
Controller\HealBot_Controller_Events.lua
View\HealBot.lua
HealBot.xml HealBot.xml
HealBot_View_Layout.lua View\HealBot_Errors.lua
HealBot_View_Tooltip.lua View\HealBot_Error.xml
HealBot_Action.xml View\HealBot_View_Grid.lua
HealBot_Options.xml View\HealBot_View_Bars.lua
HealBot_Options_General.xml View\HealBot_View_HoT.lua
HealBot_Options_Spells.xml View\HealBot_View_Tooltip.lua
HealBot_Options_Healing.xml View\HealBot_Action.lua
HealBot_Options_CDC.xml View\HealBot_Action.xml
HealBot_Options_Skins.xml Options\HealBot_Options.lua
HealBot_Options_Buffs.xml Options\HealBot_Options.xml
HealBot_Options_Chat.xml Options\HealBot_Options_General.lua
HealBot_Options_Auto.xml Options\HealBot_Options_General.xml
HealBot_Options_Integrations.xml Options\HealBot_Options_Spells.lua
Options\HealBot_Options_Spells.xml
Options\HealBot_Options_Healing.lua
Options\HealBot_Options_Healing.xml
Options\HealBot_Options_CDC.lua
Options\HealBot_Options_CDC.xml
Options\HealBot_Options_Skins.lua
Options\HealBot_Options_Skins.xml
Options\HealBot_Options_Buffs.lua
Options\HealBot_Options_Buffs.xml
Options\HealBot_Options_Chat.lua
Options\HealBot_Options_Chat.xml
Options\HealBot_Options_Auto.lua
Options\HealBot_Options_Auto.xml
Options\HealBot_Options_Integrations.lua
Options\HealBot_Options_Integrations.xml
-60
View File
@@ -1,60 +0,0 @@
-- HealBot_Controller_Range.lua
-- Handles periodic range checking for units
local _scale = 0
-- HealBot_ResetRangeScale: Resets map range scaling on zone change.
function HealBot_ResetRangeScale()
_scale = 0
end
-- HealBot_Range_Check: Checks if unit is in range via map distance or API.
function HealBot_Range_Check(unit, range)
local return_val = 0;
if not range then
range = 40;
end
if ( unit == "player" ) then
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
local tx, ty = GetPlayerMapPosition(unit)
local dist
if tx > 0 or ty > 0 then
local px, py = GetPlayerMapPosition("player")
dist = math.sqrt((px - tx)^2 + (py - ty)^2)
if dist > _scale and (px > 0 or py > 0) then
if ( CheckInteractDistance(unit, 4) ) then
_scale = dist
end
end
if dist <= (_scale * range / 27) then
return_val = 1
end
else
if ( HealBot_Config.QualityRange == 1 ) or range <= 27 then
if ( CheckInteractDistance(unit, 4) ) then
return_val = 1;
end
else
return_val = 1;
end
end
end
return return_val;
end
-127
View File
@@ -1,127 +0,0 @@
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
if event == "AURA_CAST_ON_SELF" or event == "AURA_CAST_ON_OTHER" then
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)
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
-372
View File
@@ -1,372 +0,0 @@
<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_Buffs.lua" />
<Frame name="HealBot_Options_Panel6" parent="HealBot_Options" hidden="true" setAllPoints="true">
<Frames>
<Frame name="HealBot_Options_BuffFrame" inherits="OptionFrameBoxTemplate">
<Scripts>
<OnLoad>
this:SetBackdropBorderColor(0.4, 0.4, 0.4);
this:SetBackdropColor(0, 0, 0, 0);
</OnLoad>
</Scripts>
<Size>
<AbsDimension y="330"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="21" y="-35"/>
</Offset>
</Anchor>
<Anchor point="TOPRIGHT">
<Offset>
<AbsDimension x="-21" y="0"/>
</Offset>
</Anchor>
</Anchors>
<Layers>
<Layer level="BACKGROUND">
<FontString name="HealBot_BuffPanel_Text" text="Buff Settings" inherits="GameFontNormalSmall">
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="15" y="10" />
</Offset>
</Anchor>
</Anchors>
</FontString>
</Layer>
</Layers>
</Frame>
<CheckButton name="HealBot_Options_BuffWatch" inherits="OptionsCheckButtonTemplate">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_BuffFrame" relativePoint="TOPLEFT">
<Offset>
<AbsDimension x="15" y="-15"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_WarningSound_OnLoad(this,HEALBOT_OPTIONS_BUFFWATCH)</OnLoad>
<OnClick>HealBot_Options_BuffWatch_OnClick(this)</OnClick>
</Scripts>
</CheckButton>
<CheckButton name="HealBot_Options_BuffWatchInCombat" inherits="OptionsCheckButtonTemplate">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_BuffWatch" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="20" y="0"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_WarningSound_OnLoad(this,HEALBOT_OPTIONS_BUFFWATCHINCOMBAT)</OnLoad>
<OnClick>HealBot_Options_BuffWatchInCombat_OnClick(this)</OnClick>
</Scripts>
</CheckButton>
<Frame name="HealBot_Options_Buff1" inherits="UIDropDownMenuTemplate" id="1">
<Layers>
<Layer level="BACKGROUND">
<FontString name="HealBot_Options_Buff1Text" text="HEALBOT_OPTIONS_BUFF1" inherits="GameFontNormalSmall">
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="-10" y="15" />
</Offset>
</Anchor>
</Anchors>
</FontString>
</Layer>
</Layers>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_BuffWatchInCombat" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="-15" y="-30" />
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad> HealBot_Options_Buff_OnLoad(this) </OnLoad>
</Scripts>
</Frame>
<CheckButton name="HealBot_Options_Buff1Self" inherits="OptionsCheckButtonTemplate" id="1">
<Size><AbsDimension x="20" y="20"/></Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_Buff1" relativePoint="TOPLEFT">
<Offset><AbsDimension x="40" y="18"/></Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_BuffSelf_OnLoad(this)</OnLoad>
<OnClick>HealBot_Options_BuffSelf_OnClick(this)</OnClick>
</Scripts>
</CheckButton>
<Frame name="HealBot_Options_Buff2" inherits="UIDropDownMenuTemplate" id="2">
<Layers>
<Layer level="BACKGROUND">
<FontString name="HealBot_Options_Buff2Text" text="HEALBOT_OPTIONS_BUFF2" inherits="GameFontNormalSmall">
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="-10" y="15" />
</Offset>
</Anchor>
</Anchors>
</FontString>
</Layer>
</Layers>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_Buff1" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="0" y="-35" />
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad> HealBot_Options_Buff_OnLoad(this) </OnLoad>
</Scripts>
</Frame>
<CheckButton name="HealBot_Options_Buff2Self" inherits="OptionsCheckButtonTemplate" id="2">
<Size><AbsDimension x="20" y="20"/></Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_Buff2" relativePoint="TOPLEFT">
<Offset><AbsDimension x="40" y="18"/></Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_BuffSelf_OnLoad(this)</OnLoad>
<OnClick>HealBot_Options_BuffSelf_OnClick(this)</OnClick>
</Scripts>
</CheckButton>
<Frame name="HealBot_Options_Buff3" inherits="UIDropDownMenuTemplate" id="3">
<Layers>
<Layer level="BACKGROUND">
<FontString name="HealBot_Options_Buff3Text" text="HEALBOT_OPTIONS_BUFF3" inherits="GameFontNormalSmall">
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="-10" y="15" />
</Offset>
</Anchor>
</Anchors>
</FontString>
</Layer>
</Layers>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_Buff2" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="0" y="-35" />
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad> HealBot_Options_Buff_OnLoad(this) </OnLoad>
</Scripts>
</Frame>
<CheckButton name="HealBot_Options_Buff3Self" inherits="OptionsCheckButtonTemplate" id="3">
<Size><AbsDimension x="20" y="20"/></Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_Buff3" relativePoint="TOPLEFT">
<Offset><AbsDimension x="40" y="18"/></Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_BuffSelf_OnLoad(this)</OnLoad>
<OnClick>HealBot_Options_BuffSelf_OnClick(this)</OnClick>
</Scripts>
</CheckButton>
<Frame name="HealBot_Options_Buff4" inherits="UIDropDownMenuTemplate" id="4">
<Layers>
<Layer level="BACKGROUND">
<FontString name="HealBot_Options_Buff4Text" text="HEALBOT_OPTIONS_BUFF4" inherits="GameFontNormalSmall">
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="-10" y="15" />
</Offset>
</Anchor>
</Anchors>
</FontString>
</Layer>
</Layers>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_Buff3" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="0" y="-35" />
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad> HealBot_Options_Buff_OnLoad(this) </OnLoad>
</Scripts>
</Frame>
<CheckButton name="HealBot_Options_Buff4Self" inherits="OptionsCheckButtonTemplate" id="4">
<Size><AbsDimension x="20" y="20"/></Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_Buff4" relativePoint="TOPLEFT">
<Offset><AbsDimension x="40" y="18"/></Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_BuffSelf_OnLoad(this)</OnLoad>
<OnClick>HealBot_Options_BuffSelf_OnClick(this)</OnClick>
</Scripts>
</CheckButton>
<Frame name="HealBot_Options_Buff5" inherits="UIDropDownMenuTemplate" id="5">
<Layers>
<Layer level="BACKGROUND">
<FontString name="HealBot_Options_Buff5Text" text="HEALBOT_OPTIONS_BUFF5" inherits="GameFontNormalSmall">
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="-10" y="15" />
</Offset>
</Anchor>
</Anchors>
</FontString>
</Layer>
</Layers>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_BuffWatchInCombat" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="160" y="-30" />
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad> HealBot_Options_Buff_OnLoad(this) </OnLoad>
</Scripts>
</Frame>
<CheckButton name="HealBot_Options_Buff5Self" inherits="OptionsCheckButtonTemplate" id="5">
<Size><AbsDimension x="20" y="20"/></Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_Buff5" relativePoint="TOPLEFT">
<Offset><AbsDimension x="40" y="18"/></Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_BuffSelf_OnLoad(this)</OnLoad>
<OnClick>HealBot_Options_BuffSelf_OnClick(this)</OnClick>
</Scripts>
</CheckButton>
<Frame name="HealBot_Options_Buff6" inherits="UIDropDownMenuTemplate" id="6">
<Layers>
<Layer level="BACKGROUND">
<FontString name="HealBot_Options_Buff6Text" text="HEALBOT_OPTIONS_BUFF6" inherits="GameFontNormalSmall">
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="-10" y="15" />
</Offset>
</Anchor>
</Anchors>
</FontString>
</Layer>
</Layers>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_Buff5" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="0" y="-35" />
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad> HealBot_Options_Buff_OnLoad(this) </OnLoad>
</Scripts>
</Frame>
<CheckButton name="HealBot_Options_Buff6Self" inherits="OptionsCheckButtonTemplate" id="6">
<Size><AbsDimension x="20" y="20"/></Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_Buff6" relativePoint="TOPLEFT">
<Offset><AbsDimension x="40" y="18"/></Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_BuffSelf_OnLoad(this)</OnLoad>
<OnClick>HealBot_Options_BuffSelf_OnClick(this)</OnClick>
</Scripts>
</CheckButton>
<Frame name="HealBot_Options_Buff7" inherits="UIDropDownMenuTemplate" id="7">
<Layers>
<Layer level="BACKGROUND">
<FontString name="HealBot_Options_Buff7Text" text="HEALBOT_OPTIONS_BUFF7" inherits="GameFontNormalSmall">
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="-10" y="15" />
</Offset>
</Anchor>
</Anchors>
</FontString>
</Layer>
</Layers>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_Buff6" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="0" y="-35" />
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad> HealBot_Options_Buff_OnLoad(this) </OnLoad>
</Scripts>
</Frame>
<CheckButton name="HealBot_Options_Buff7Self" inherits="OptionsCheckButtonTemplate" id="7">
<Size><AbsDimension x="20" y="20"/></Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_Buff7" relativePoint="TOPLEFT">
<Offset><AbsDimension x="40" y="18"/></Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_BuffSelf_OnLoad(this)</OnLoad>
<OnClick>HealBot_Options_BuffSelf_OnClick(this)</OnClick>
</Scripts>
</CheckButton>
<Frame name="HealBot_Options_Buff8" inherits="UIDropDownMenuTemplate" id="8">
<Layers>
<Layer level="BACKGROUND">
<FontString name="HealBot_Options_Buff8Text" text="HEALBOT_OPTIONS_BUFF8" inherits="GameFontNormalSmall">
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="-10" y="15" />
</Offset>
</Anchor>
</Anchors>
</FontString>
</Layer>
</Layers>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_Buff7" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="0" y="-35" />
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad> HealBot_Options_Buff_OnLoad(this) </OnLoad>
</Scripts>
</Frame>
<CheckButton name="HealBot_Options_Buff8Self" inherits="OptionsCheckButtonTemplate" id="8">
<Size><AbsDimension x="20" y="20"/></Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_Buff8" relativePoint="TOPLEFT">
<Offset><AbsDimension x="40" y="18"/></Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_BuffSelf_OnLoad(this)</OnLoad>
<OnClick>HealBot_Options_BuffSelf_OnClick(this)</OnClick>
</Scripts>
</CheckButton>
</Frames>
</Frame>
</Ui>
-289
View File
@@ -1,289 +0,0 @@
<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_Chat.lua" />
<Frame name="HealBot_Options_Panel7" parent="HealBot_Options" hidden="true" setAllPoints="true">
<Frames>
<!-- Chat Message 1 -->
<EditBox name="HealBot_Options_ChatMsg1_Spell" inherits="InputBoxTemplate" autoFocus="false">
<Size>
<AbsDimension x="130" y="20"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="25" y="-30" />
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnTextChanged>
if HealBot_Config.ChatMessages then
HealBot_Config.ChatMessages[1].Spell = this:GetText();
end
</OnTextChanged>
</Scripts>
</EditBox>
<Button name="HealBot_Options_ChatMsg1_Channel" inherits="UIPanelButtonTemplate" text="None">
<Size>
<AbsDimension x="80" y="22"/>
</Size>
<Anchors>
<Anchor point="LEFT" relativeTo="HealBot_Options_ChatMsg1_Spell" relativePoint="RIGHT">
<Offset>
<AbsDimension x="15" y="0"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnClick>
HealBot_Options_ChatMsg_Channel_OnClick(1, this);
</OnClick>
</Scripts>
</Button>
<EditBox name="HealBot_Options_ChatMsg1_Text" inherits="InputBoxTemplate" autoFocus="false">
<Size>
<AbsDimension x="300" y="20"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_ChatMsg1_Spell" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="0" y="-5"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnTextChanged>
if HealBot_Config.ChatMessages then
HealBot_Config.ChatMessages[1].Message = this:GetText();
end
</OnTextChanged>
</Scripts>
</EditBox>
<!-- Chat Message 2 -->
<EditBox name="HealBot_Options_ChatMsg2_Spell" inherits="InputBoxTemplate" autoFocus="false">
<Size>
<AbsDimension x="130" y="20"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="25" y="-90" />
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnTextChanged>
if HealBot_Config.ChatMessages then
HealBot_Config.ChatMessages[2].Spell = this:GetText();
end
</OnTextChanged>
</Scripts>
</EditBox>
<Button name="HealBot_Options_ChatMsg2_Channel" inherits="UIPanelButtonTemplate" text="None">
<Size>
<AbsDimension x="80" y="22"/>
</Size>
<Anchors>
<Anchor point="LEFT" relativeTo="HealBot_Options_ChatMsg2_Spell" relativePoint="RIGHT">
<Offset>
<AbsDimension x="15" y="0"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnClick>
HealBot_Options_ChatMsg_Channel_OnClick(2, this);
</OnClick>
</Scripts>
</Button>
<EditBox name="HealBot_Options_ChatMsg2_Text" inherits="InputBoxTemplate" autoFocus="false">
<Size>
<AbsDimension x="300" y="20"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_ChatMsg2_Spell" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="0" y="-5"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnTextChanged>
if HealBot_Config.ChatMessages then
HealBot_Config.ChatMessages[2].Message = this:GetText();
end
</OnTextChanged>
</Scripts>
</EditBox>
<!-- Chat Message 3 -->
<EditBox name="HealBot_Options_ChatMsg3_Spell" inherits="InputBoxTemplate" autoFocus="false">
<Size>
<AbsDimension x="130" y="20"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="25" y="-150" />
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnTextChanged>
if HealBot_Config.ChatMessages then
HealBot_Config.ChatMessages[3].Spell = this:GetText();
end
</OnTextChanged>
</Scripts>
</EditBox>
<Button name="HealBot_Options_ChatMsg3_Channel" inherits="UIPanelButtonTemplate" text="None">
<Size>
<AbsDimension x="80" y="22"/>
</Size>
<Anchors>
<Anchor point="LEFT" relativeTo="HealBot_Options_ChatMsg3_Spell" relativePoint="RIGHT">
<Offset>
<AbsDimension x="15" y="0"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnClick>
HealBot_Options_ChatMsg_Channel_OnClick(3, this);
</OnClick>
</Scripts>
</Button>
<EditBox name="HealBot_Options_ChatMsg3_Text" inherits="InputBoxTemplate" autoFocus="false">
<Size>
<AbsDimension x="300" y="20"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_ChatMsg3_Spell" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="0" y="-5"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnTextChanged>
if HealBot_Config.ChatMessages then
HealBot_Config.ChatMessages[3].Message = this:GetText();
end
</OnTextChanged>
</Scripts>
</EditBox>
<!-- Chat Message 4 -->
<EditBox name="HealBot_Options_ChatMsg4_Spell" inherits="InputBoxTemplate" autoFocus="false">
<Size>
<AbsDimension x="130" y="20"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="25" y="-210" />
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnTextChanged>
if HealBot_Config.ChatMessages then
HealBot_Config.ChatMessages[4].Spell = this:GetText();
end
</OnTextChanged>
</Scripts>
</EditBox>
<Button name="HealBot_Options_ChatMsg4_Channel" inherits="UIPanelButtonTemplate" text="None">
<Size>
<AbsDimension x="80" y="22"/>
</Size>
<Anchors>
<Anchor point="LEFT" relativeTo="HealBot_Options_ChatMsg4_Spell" relativePoint="RIGHT">
<Offset>
<AbsDimension x="15" y="0"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnClick>
HealBot_Options_ChatMsg_Channel_OnClick(4, this);
</OnClick>
</Scripts>
</Button>
<EditBox name="HealBot_Options_ChatMsg4_Text" inherits="InputBoxTemplate" autoFocus="false">
<Size>
<AbsDimension x="300" y="20"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_ChatMsg4_Spell" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="0" y="-5"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnTextChanged>
if HealBot_Config.ChatMessages then
HealBot_Config.ChatMessages[4].Message = this:GetText();
end
</OnTextChanged>
</Scripts>
</EditBox>
<!-- Chat Message 5 -->
<EditBox name="HealBot_Options_ChatMsg5_Spell" inherits="InputBoxTemplate" autoFocus="false">
<Size>
<AbsDimension x="130" y="20"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="25" y="-270" />
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnTextChanged>
if HealBot_Config.ChatMessages then
HealBot_Config.ChatMessages[5].Spell = this:GetText();
end
</OnTextChanged>
</Scripts>
</EditBox>
<Button name="HealBot_Options_ChatMsg5_Channel" inherits="UIPanelButtonTemplate" text="None">
<Size>
<AbsDimension x="80" y="22"/>
</Size>
<Anchors>
<Anchor point="LEFT" relativeTo="HealBot_Options_ChatMsg5_Spell" relativePoint="RIGHT">
<Offset>
<AbsDimension x="15" y="0"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnClick>
HealBot_Options_ChatMsg_Channel_OnClick(5, this);
</OnClick>
</Scripts>
</Button>
<EditBox name="HealBot_Options_ChatMsg5_Text" inherits="InputBoxTemplate" autoFocus="false">
<Size>
<AbsDimension x="300" y="20"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_ChatMsg5_Spell" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="0" y="-5"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnTextChanged>
if HealBot_Config.ChatMessages then
HealBot_Config.ChatMessages[5].Message = this:GetText();
end
</OnTextChanged>
</Scripts>
</EditBox>
</Frames>
</Frame>
</Ui>
-7
View File
@@ -1,7 +0,0 @@
-- 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
@@ -1,105 +0,0 @@
<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>
-728
View File
@@ -1,728 +0,0 @@
<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_Skins.lua" />
<Frame name="HealBot_Options_Panel5" parent="HealBot_Options" hidden="true" setAllPoints="true">
<Frames>
<Frame name="HealBot_Options_Skins" inherits="UIDropDownMenuTemplate" id="1">
<Layers>
<Layer level="BACKGROUND">
<FontString name="HealBot_Options_ScaleFrameText" text="HEALBOT_OPTIONS_SKINTEXT" inherits="GameFontNormalSmall">
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="-45" y="-5" />
</Offset>
</Anchor>
</Anchors>
</FontString>
</Layer>
</Layers>
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="70" y="-28" />
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad> HealBot_Options_Skins_OnLoad(this) </OnLoad>
</Scripts>
</Frame>
<Button name="HealBot_Options_DeleteSkin" inherits="UIPanelButtonTemplate" text="HEALBOT_OPTIONS_DELSKIN">
<Size>
<AbsDimension x="80" y="22"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_Skins" relativePoint="TOPRIGHT">
<Offset>
<AbsDimension x="7" y="-1"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnClick>HealBot_Options_DeleteSkin_OnClick(this)</OnClick>
</Scripts>
</Button>
<EditBox name="HealBot_Options_NewSkin" inherits="HealBot_Options_EditBoxTemplate">
<Size>
<AbsDimension x="100" y="20"/>
</Size>
<Layers>
<Layer level="BACKGROUND">
<FontString name="HealBot_Options_ScaleFrameText2" text="HEALBOT_OPTIONS_NEWSKINTEXT" inherits="GameFontNormalSmall">
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="-70" y="-2" />
</Offset>
</Anchor>
</Anchors>
</FontString>
</Layer>
</Layers>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_Skins" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="25" y="-2"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnTextChanged>
HealBot_Options_NewSkin_OnTextChanged(this)
</OnTextChanged>
</Scripts>
</EditBox>
<Button name="HealBot_Options_NewSkinb" inherits="UIPanelButtonTemplate" text="HEALBOT_OPTIONS_SAVESKIN">
<Size>
<AbsDimension x="80" y="22"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_NewSkin" relativePoint="TOPRIGHT">
<Offset>
<AbsDimension x="32" y="2"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnClick>HealBot_Options_NewSkinb_OnClick(this)</OnClick>
</Scripts>
</Button>
<Frame name="HealBot_Options_Scale" inherits="OptionFrameBoxTemplate">
<Scripts>
<OnLoad>
this:SetBackdropBorderColor(0.4, 0.4, 0.4);
this:SetBackdropColor(0, 0, 0, 0);
</OnLoad>
</Scripts>
<Size>
<AbsDimension y="325"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="20" y="-88"/>
</Offset>
</Anchor>
<Anchor point="TOPRIGHT">
<Offset>
<AbsDimension x="-20" y="-180"/>
</Offset>
</Anchor>
</Anchors>
<Layers>
<Layer level="BACKGROUND">
<FontString name="HealBot_Options_ScaleFrameText3" text="HEALBOT_OPTIONS_SKINBARS" inherits="GameFontNormalSmall">
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="50" y="-12" />
</Offset>
</Anchor>
</Anchors>
</FontString>
</Layer>
</Layers>
<Frames>
<CheckButton name="HealBot_Options_ShowHeaders" inherits="SendMailRadioButtonTemplate">
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="155" y="-8" />
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_ShowHeaders_OnLoad(this,HEALBOT_OPTIONS_SHOWHEADERS)</OnLoad>
<OnClick>HealBot_Options_ShowHeaders_OnClick(this)</OnClick>
</Scripts>
</CheckButton>
<CheckButton name="HealBot_Options_BarColorMode" inherits="SendMailRadioButtonTemplate">
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="290" y="-8" /></Offset></Anchor></Anchors>
<Scripts>
<OnLoad>getglobal(this:GetName().."Text"):SetText("Class Colors")</OnLoad>
<OnClick>HealBot_Config.bcolormode[HealBot_Config.Current_Skin] = (this:GetChecked() and 2 or 1); HealBot_Action_ResetSkin()</OnClick>
</Scripts>
</CheckButton>
<CheckButton name="HealBot_Options_FontOutline" inherits="SendMailRadioButtonTemplate">
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="290" y="-33" /></Offset></Anchor></Anchors>
<Scripts>
<OnLoad>getglobal(this:GetName().."Text"):SetText("Font Outline")</OnLoad>
<OnClick>HealBot_Config.bfontoutline[HealBot_Config.Current_Skin] = (this:GetChecked() and 1 or 0); HealBot_Action_ResetSkin()</OnClick>
</Scripts>
</CheckButton>
<CheckButton name="HealBot_Options_1pxBorders" inherits="SendMailRadioButtonTemplate">
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="290" y="-58" /></Offset></Anchor></Anchors>
<Scripts>
<OnLoad>getglobal(this:GetName().."Text"):SetText("1px Borders")</OnLoad>
<OnClick>HealBot_Config.bborder[HealBot_Config.Current_Skin] = (this:GetChecked() and 1 or 2); HealBot_Action_ResetSkin()</OnClick>
</Scripts>
</CheckButton>
<Slider name="HealBot_Options_BarTextureS" inherits="HealBot_Options_SliderTemplate">
<Size>
<AbsDimension x="123" y="17" />
</Size>
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="20" y="-40" />
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_val_OnLoad(this,HEALBOT_OPTIONS_SKINTEXTURE,1,14)</OnLoad>
<OnValueChanged>HealBot_Options_BarTextureS_OnValueChanged(this)</OnValueChanged>
</Scripts>
</Slider>
<Slider name="HealBot_Options_BarNumColsS" inherits="HealBot_Options_SliderTemplate">
<Size>
<AbsDimension x="123" y="18" />
</Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_BarTextureS" relativePoint="TOPRIGHT">
<Offset>
<AbsDimension x="10" y="0" />
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_val_OnLoad(this,HEALBOT_OPTIONS_SKINNUMCOLS,1,8)</OnLoad>
<OnValueChanged>HealBot_Options_BarNumColsS_OnValueChanged(this)</OnValueChanged>
</Scripts>
</Slider>
<Slider name="HealBot_Options_BarHeightS" inherits="HealBot_Options_SliderTemplate">
<Size>
<AbsDimension x="123" y="18" />
</Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_BarTextureS" relativePoint="TOPLEFT">
<Offset>
<AbsDimension x="0" y="-32" />
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_val_OnLoad(this,HEALBOT_OPTIONS_SKINHEIGHT,10,100)</OnLoad>
<OnValueChanged>HealBot_Options_BarHeightS_OnValueChanged(this)</OnValueChanged>
</Scripts>
</Slider>
<Slider name="HealBot_Options_BarWidthS" inherits="HealBot_Options_SliderTemplate">
<Size>
<AbsDimension x="123" y="17" />
</Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_BarHeightS" relativePoint="TOPRIGHT">
<Offset>
<AbsDimension x="10" y="0" />
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_val_OnLoad(this,HEALBOT_OPTIONS_SKINWIDTH,50,225)</OnLoad>
<OnValueChanged>HealBot_Options_BarWidthS_OnValueChanged(this)</OnValueChanged>
</Scripts>
</Slider>
<Slider name="HealBot_Options_BarBRSpaceS" inherits="HealBot_Options_SliderTemplate">
<Size>
<AbsDimension x="123" y="17" />
</Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_BarHeightS" relativePoint="TOPLEFT">
<Offset>
<AbsDimension x="0" y="-32" />
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_val_OnLoad(this,HEALBOT_OPTIONS_SKINBRSPACE,0,10)</OnLoad>
<OnValueChanged>HealBot_Options_BarBRSpaceS_OnValueChanged(this)</OnValueChanged>
</Scripts>
</Slider>
<Slider name="HealBot_Options_BarBCSpaceS" inherits="HealBot_Options_SliderTemplate">
<Size>
<AbsDimension x="123" y="17" />
</Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_BarBRSpaceS" relativePoint="TOPRIGHT">
<Offset>
<AbsDimension x="10" y="0" />
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_val_OnLoad(this,HEALBOT_OPTIONS_SKINBCSPACE,0,25)</OnLoad>
<OnValueChanged>HealBot_Options_BarBCSpaceS_OnValueChanged(this)</OnValueChanged>
</Scripts>
</Slider>
<Slider name="HealBot_Options_FramePaddingS" inherits="HealBot_Options_SliderTemplate">
<Size>
<AbsDimension x="123" y="17" />
</Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_BarBCSpaceS" relativePoint="TOPRIGHT">
<Offset>
<AbsDimension x="10" y="0" />
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_val_OnLoad(this,"Frame Padding",0,50)</OnLoad>
<OnValueChanged>HealBot_Options_FramePaddingS_OnValueChanged(this)</OnValueChanged>
</Scripts>
</Slider>
<Slider name="HealBot_Options_BarAlpha" inherits="HealBot_Options_SliderTemplate">
<Size>
<AbsDimension x="123" y="17" />
</Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_BarBRSpaceS" relativePoint="TOPLEFT">
<Offset>
<AbsDimension x="0" y="-35" />
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_Pct_OnLoad_MinMax(this,HEALBOT_OPTIONS_BARALPHA,0.25,1)</OnLoad>
<OnValueChanged>HealBot_Options_BarAlpha_OnValueChanged(this)</OnValueChanged>
</Scripts>
</Slider>
<Slider name="HealBot_Options_BarAlphaInHeal" inherits="HealBot_Options_SliderTemplate">
<Size>
<AbsDimension x="123" y="17" />
</Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_BarAlpha" relativePoint="TOPRIGHT">
<Offset>
<AbsDimension x="10" y="0" />
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_Pct_OnLoad_MinMax(this,HEALBOT_OPTIONS_BARALPHAINHEAL,0.05,0.75)</OnLoad>
<OnValueChanged>HealBot_Options_BarAlphaInHeal_OnValueChanged(this)</OnValueChanged>
</Scripts>
</Slider>
<Slider name="HealBot_Options_BarAlphaDis" inherits="HealBot_Options_SliderTemplate">
<Size>
<AbsDimension x="123" y="17" />
</Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_BarAlpha" relativePoint="TOPLEFT">
<Offset>
<AbsDimension x="0" y="-35" />
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_Pct_OnLoad(this,HEALBOT_OPTIONS_BARALPHADIS)</OnLoad>
<OnValueChanged>HealBot_Options_BarAlphaDis_OnValueChanged(this)</OnValueChanged>
</Scripts>
</Slider>
<Slider name="HealBot_Options_AbortBarSize" inherits="HealBot_Options_SliderTemplate">
<Size>
<AbsDimension x="123" y="17" />
</Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_BarAlphaDis" relativePoint="TOPRIGHT">
<Offset>
<AbsDimension x="10" y="0" />
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_val_OnLoad(this,"Abort size",0,15)</OnLoad>
<OnValueChanged>HealBot_Options_AbortBarSize_OnValueChanged(this)</OnValueChanged>
</Scripts>
</Slider>
<Slider name="HealBot_Options_FontHeight" inherits="HealBot_Options_SliderTemplate">
<Size>
<AbsDimension x="123" y="17" />
</Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_BarAlphaDis" relativePoint="TOPLEFT">
<Offset>
<AbsDimension x="0" y="-35" />
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_val_OnLoad(this,HEALBOT_OPTIONS_SKINFHEIGHT,7,18)</OnLoad>
<OnValueChanged>HealBot_Options_FontHeight_OnValueChanged(this)</OnValueChanged>
</Scripts>
</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">
<Size>
<AbsDimension x="87" y="20"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_FontHeight" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="0" y="-15"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnClick>HealBot_SkinColorpick_OnClick("En")</OnClick>
</Scripts>
</Button>
<StatusBar name="HealBot_EnTextColorpick" inherits="TextStatusBar">
<Size>
<AbsDimension x="87" y="20"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_FontHeight" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="0" y="-15"/>
</Offset>
</Anchor>
</Anchors>
<Layers>
<Layer level="OVERLAY">
<FontString name="HealBot_EnTextColorpickt" inherits="GameFontNormalSmall" text="HEALBOT_SKIN_ENTEXT">
<Anchors>
<Anchor point="CENTER" relativeTo="HealBot_EnTextColorpick" relativePoint="CENTER">
<Offset>
<AbsDimension x="0" y="1"/>
</Offset>
</Anchor>
</Anchors>
</FontString>
</Layer>
</Layers>
<Scripts>
<OnLoad> this:SetMinMaxValues(0,100); this:SetValue(70); </OnLoad>
</Scripts>
<BarTexture file="Interface\TargetingFrame\UI-StatusBar"/>
<BarColor r="0" g="1" b="0"/>
</StatusBar>
<StatusBar name="HealBot_EnTextColorpickin" inherits="TextStatusBar">
<Size>
<AbsDimension x="87" y="20"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_FontHeight" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="0" y="-15"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad> this:SetMinMaxValues(0,100); this:SetValue(100); </OnLoad>
</Scripts>
<BarTexture file="Interface\TargetingFrame\UI-StatusBar"/>
<BarColor r="0" g="1" b="0"/>
</StatusBar>
<Button name="HealBot_DisTextColorpickb">
<Size>
<AbsDimension x="87" y="20"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_EnTextColorpick" relativePoint="TOPRIGHT">
<Offset>
<AbsDimension x="5" y="0"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnClick>HealBot_SkinColorpick_OnClick("Dis")</OnClick>
</Scripts>
</Button>
<StatusBar name="HealBot_DisTextColorpick" inherits="TextStatusBar">
<Size>
<AbsDimension x="87" y="20"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_EnTextColorpick" relativePoint="TOPRIGHT">
<Offset>
<AbsDimension x="5" y="0"/>
</Offset>
</Anchor>
</Anchors>
<Layers>
<Layer level="OVERLAY">
<FontString name="HealBot_DisTextColorpickt" inherits="GameFontNormalSmall" text="HEALBOT_SKIN_DISTEXT">
<Anchors>
<Anchor point="CENTER" relativeTo="HealBot_DisTextColorpick" relativePoint="CENTER">
<Offset>
<AbsDimension x="0" y="1"/>
</Offset>
</Anchor>
</Anchors>
</FontString>
</Layer>
</Layers>
<Scripts>
<OnLoad> this:SetMinMaxValues(0,100); this:SetValue(100); </OnLoad>
</Scripts>
<BarTexture file="Interface\TargetingFrame\UI-StatusBar"/>
<BarColor r="0" g="1" b="0"/>
</StatusBar>
<Button name="HealBot_DebTextColorpickb">
<Size>
<AbsDimension x="87" y="20"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_DisTextColorpick" relativePoint="TOPRIGHT">
<Offset>
<AbsDimension x="5" y="0"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnClick>HealBot_SkinColorpick_OnClick("Debuff")</OnClick>
</Scripts>
</Button>
<StatusBar name="HealBot_DebTextColorpick" inherits="HealBot_ColourButtonTemplate">
<Size>
<AbsDimension x="87" y="20"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_DisTextColorpick" relativePoint="TOPRIGHT">
<Offset>
<AbsDimension x="5" y="0"/>
</Offset>
</Anchor>
</Anchors>
<Layers>
<Layer level="OVERLAY">
<FontString name="HealBot_DebTextColorpickt" inherits="GameFontNormalSmall" text="HEALBOT_SKIN_DEBTEXT">
<Anchors>
<Anchor point="CENTER" relativeTo="HealBot_DebTextColorpick" relativePoint="CENTER">
<Offset>
<AbsDimension x="0" y="1"/>
</Offset>
</Anchor>
</Anchors>
</FontString>
</Layer>
</Layers>
<Scripts>
<OnLoad> this:SetMinMaxValues(0,100); this:SetValue(100); </OnLoad>
</Scripts>
<BarTexture file="Interface\TargetingFrame\UI-StatusBar"/>
<BarColor r="0" g="1" b="0"/>
</StatusBar>
<Button name="HealBot_BackgroundColorpickb">
<Size>
<AbsDimension x="87" y="20"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_EnTextColorpick" relativePoint="TOPLEFT">
<Offset>
<AbsDimension x="0" y="-25"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnClick>HealBot_SkinColorpick_OnClick("Back")</OnClick>
</Scripts>
</Button>
<StatusBar name="HealBot_BackgroundColorpick" inherits="HealBot_ColourButtonTemplate">
<Size>
<AbsDimension x="87" y="20"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_EnTextColorpick" relativePoint="TOPLEFT">
<Offset>
<AbsDimension x="0" y="-25"/>
</Offset>
</Anchor>
</Anchors>
<Layers>
<Layer level="OVERLAY">
<FontString inherits="GameFontNormalSmall" text="HEALBOT_SKIN_BACKTEXT">
<Anchors>
<Anchor point="CENTER" relativeTo="HealBot_BackgroundColorpick" relativePoint="CENTER">
<Offset>
<AbsDimension x="0" y="1"/>
</Offset>
</Anchor>
</Anchors>
</FontString>
</Layer>
</Layers>
<Scripts>
<OnLoad> this:SetMinMaxValues(0,100); this:SetValue(100); </OnLoad>
</Scripts>
<BarTexture file="Interface\TargetingFrame\UI-StatusBar"/>
<BarColor r="0" g="1" b="0"/>
</StatusBar>
<Button name="HealBot_BorderColorpickb">
<Size>
<AbsDimension x="87" y="20"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_BackgroundColorpick" relativePoint="TOPRIGHT">
<Offset>
<AbsDimension x="5" y="0"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnClick>HealBot_SkinColorpick_OnClick("Bor")</OnClick>
</Scripts>
</Button>
<StatusBar name="HealBot_BorderColorpick" inherits="HealBot_ColourButtonTemplate">
<Size>
<AbsDimension x="87" y="20"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_BackgroundColorpick" relativePoint="TOPRIGHT">
<Offset>
<AbsDimension x="5" y="0"/>
</Offset>
</Anchor>
</Anchors>
<Layers>
<Layer level="OVERLAY">
<FontString inherits="GameFontNormalSmall" text="HEALBOT_SKIN_BORDERTEXT">
<Anchors>
<Anchor point="CENTER" relativeTo="HealBot_BorderColorpick" relativePoint="CENTER">
<Offset>
<AbsDimension x="0" y="1"/>
</Offset>
</Anchor>
</Anchors>
</FontString>
</Layer>
</Layers>
<Scripts>
<OnLoad> this:SetMinMaxValues(0,100); this:SetValue(100); </OnLoad>
</Scripts>
<BarTexture file="Interface\TargetingFrame\UI-StatusBar"/>
<BarColor r="0" g="1" b="0"/>
</StatusBar>
<Button name="HealBot_AbortColorpickb">
<Size>
<AbsDimension x="87" y="20"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_BorderColorpick" relativePoint="TOPRIGHT">
<Offset>
<AbsDimension x="5" y="0"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnClick>HealBot_SkinColorpick_OnClick("Abort")</OnClick>
</Scripts>
</Button>
<StatusBar name="HealBot_AbortColorpick" inherits="HealBot_ColourButtonTemplate">
<Size>
<AbsDimension x="87" y="20"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_BorderColorpick" relativePoint="TOPRIGHT">
<Offset>
<AbsDimension x="5" y="0"/>
</Offset>
</Anchor>
</Anchors>
<Layers>
<Layer level="OVERLAY">
<FontString inherits="GameFontNormalSmall" text="HEALBOT_ACTION_ABORT">
<Anchors>
<Anchor point="CENTER" relativeTo="HealBot_AbortColorpick" relativePoint="CENTER">
<Offset>
<AbsDimension x="0" y="1"/>
</Offset>
</Anchor>
</Anchors>
</FontString>
</Layer>
</Layers>
<Scripts>
<OnLoad> this:SetMinMaxValues(0,100); this:SetValue(100); </OnLoad>
</Scripts>
<BarTexture file="Interface\TargetingFrame\UI-StatusBar"/>
<BarColor r="0" g="1" b="0"/>
</StatusBar>
</Frames>
</Frame>
</Frames>
</Frame>
</Ui>
-308
View File
@@ -1,308 +0,0 @@
<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_Spells.lua" />
<Frame name="HealBot_Options_Panel2" parent="HealBot_Options" hidden="true" setAllPoints="true">
<Frames>
<Frame name="HealBot_Options_KeysFrame" inherits="OptionFrameBoxTemplate">
<Size>
<AbsDimension y="268"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="21" y="-30"/>
</Offset>
</Anchor>
<Anchor point="TOPRIGHT">
<Offset>
<AbsDimension x="-21" y="0"/>
</Offset>
</Anchor>
</Anchors>
<Layers>
<Layer level="BACKGROUND">
<FontString name="HealBot_ComboButtons_ButtonText1" text="HEALBOT_OPTIONS_USEBUTTONS" inherits="GameFontNormalSmall">
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="110" y="-10" />
</Offset>
</Anchor>
</Anchors>
</FontString>
</Layer>
</Layers>
<Frames>
<Slider name="HealBot_Options_Dummy" hidden="true" inherits="HealBot_Options_SliderTemplate">
<Anchors>
<Anchor point="TOP">
<Offset>
<AbsDimension x="0" y="0" />
</Offset>
</Anchor>
</Anchors>
</Slider>
<Frame name="HealBot_Options_ComboClassButton">
<Layers>
<Layer level="BACKGROUND">
<FontString name="HealBot_ComboButtons_ButtonText" text="HEALBOT_OPTIONS_COMBOBUTTON" inherits="GameFontNormalSmall">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_Dummy" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="-5" y="-25" />
</Offset>
</Anchor>
</Anchors>
</FontString>
</Layer>
</Layers>
</Frame>
<CheckButton name="HealBot_ComboButtons_Button1" inherits="SendMailRadioButtonTemplate" id="1">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_Dummy" relativePoint="TOPLEFT">
<Offset>
<AbsDimension x="40" y="-30"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_ComboButtons_Button_OnLoad(this,HEALBOT_OPTIONS_BUTTONLEFT)</OnLoad>
<OnClick>HealBot_ComboButtons_Button_OnClick(this,this:GetID())</OnClick>
</Scripts>
</CheckButton>
<CheckButton name="HealBot_ComboButtons_Button2" inherits="SendMailRadioButtonTemplate" id="2">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_ComboButtons_Button1" relativePoint="TOPRIGHT">
<Offset>
<AbsDimension x="40" y="0"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_ComboButtons_Button_OnLoad(this,HEALBOT_OPTIONS_BUTTONMIDDLE)</OnLoad>
<OnClick>HealBot_ComboButtons_Button_OnClick(this,this:GetID())</OnClick>
</Scripts>
</CheckButton>
<CheckButton name="HealBot_ComboButtons_Button3" inherits="SendMailRadioButtonTemplate" id="3">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_ComboButtons_Button2" relativePoint="TOPRIGHT">
<Offset>
<AbsDimension x="50" y="0"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_ComboButtons_Button_OnLoad(this,HEALBOT_OPTIONS_BUTTONRIGHT)</OnLoad>
<OnClick>HealBot_ComboButtons_Button_OnClick(this,this:GetID())</OnClick>
</Scripts>
</CheckButton>
<CheckButton name="HealBot_ComboButtons_Button4" inherits="SendMailRadioButtonTemplate" id="4">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_ComboButtons_Button1" relativePoint="TOPRIGHT">
<Offset>
<AbsDimension x="0" y="-18"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_ComboButtons_Button_OnLoad(this,HEALBOT_OPTIONS_BUTTON4)</OnLoad>
<OnClick>HealBot_ComboButtons_Button_OnClick(this,this:GetID())</OnClick>
</Scripts>
</CheckButton>
<CheckButton name="HealBot_ComboButtons_Button5" inherits="SendMailRadioButtonTemplate" id="5">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_ComboButtons_Button4" relativePoint="TOPRIGHT">
<Offset>
<AbsDimension x="55" y="0"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_ComboButtons_Button_OnLoad(this,HEALBOT_OPTIONS_BUTTON5)</OnLoad>
<OnClick>HealBot_ComboButtons_Button_OnClick(this,this:GetID())</OnClick>
</Scripts>
</CheckButton>
<EditBox name="HealBot_Options_Click" inherits="HealBot_Options_EditBoxTemplate">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_Dummy" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="-5" y="-68"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>
HealBot_Options_EditBox_OnLoad(this,HEALBOT_OPTIONS_CLICK)
</OnLoad>
<OnTextChanged>
HealBot_Options_Click_OnTextChanged(this)
</OnTextChanged>
</Scripts>
</EditBox>
<EditBox name="HealBot_Options_Shift" inherits="HealBot_Options_EditBoxTemplate">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_Click" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="0" y="-20"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>
HealBot_Options_EditBox_OnLoad(this,HEALBOT_OPTIONS_SHIFT)
</OnLoad>
<OnTextChanged>
HealBot_Options_Shift_OnTextChanged(this)
</OnTextChanged>
</Scripts>
</EditBox>
<EditBox name="HealBot_Options_Ctrl" inherits="HealBot_Options_EditBoxTemplate">
<Anchors>
<Anchor point="TOPRIGHT" relativeTo="HealBot_Options_Shift" relativePoint="BOTTOMRIGHT">
<Offset>
<AbsDimension x="0" y="-20"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>
HealBot_Options_EditBox_OnLoad(this,HEALBOT_OPTIONS_CTRL)
</OnLoad>
<OnTextChanged>
HealBot_Options_Ctrl_OnTextChanged(this)
</OnTextChanged>
</Scripts>
</EditBox>
<EditBox name="HealBot_Options_ShiftCtrl" inherits="HealBot_Options_EditBoxTemplate">
<Anchors>
<Anchor point="TOPRIGHT" relativeTo="HealBot_Options_Ctrl" relativePoint="BOTTOMRIGHT">
<Offset>
<AbsDimension x="0" y="-20"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>
HealBot_Options_EditBox_OnLoad(this,HEALBOT_OPTIONS_SHIFTCTRL)
</OnLoad>
<OnTextChanged>
HealBot_Options_ShiftCtrl_OnTextChanged(this)
</OnTextChanged>
</Scripts>
</EditBox>
<CheckButton name="HealBot_Options_EnableHealthy" inherits="OptionsCheckButtonTemplate">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_ShiftCtrl" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="25" y="-4" />
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_EnableHealthy_OnLoad(this,HEALBOT_OPTIONS_ENABLEHEALTHY)</OnLoad>
<OnClick>HealBot_Options_EnableHealthy_OnClick(this)</OnClick>
</Scripts>
</CheckButton>
</Frames>
</Frame>
<Frame name="HealBot_Options_TooltipsPanel" inherits="OptionFrameBoxTemplate">
<Scripts>
<OnLoad>
this:SetBackdropBorderColor(0.4, 0.4, 0.4);
this:SetBackdropColor(0, 0, 0, 0);
</OnLoad>
</Scripts>
<Size>
<AbsDimension y="118"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="20" y="-300"/>
</Offset>
</Anchor>
<Anchor point="TOPRIGHT">
<Offset>
<AbsDimension x="-20" y="-180"/>
</Offset>
</Anchor>
</Anchors>
<Frames>
<CheckButton name="HealBot_Options_ShowTooltip" inherits="OptionsCheckButtonTemplate">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_TooltipsPanel" relativePoint="TOPLEFT">
<Offset>
<AbsDimension x="20" y="-4" />
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_ShowTooltip_OnLoad(this,HEALBOT_OPTIONS_SHOWTOOLTIP)</OnLoad>
<OnClick>HealBot_Options_ShowTooltip_OnClick(this)</OnClick>
</Scripts>
</CheckButton>
<Frame name="HealBot_Options_TooltipPos" inherits="UIDropDownMenuTemplate" id="1">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_ShowTooltip" relativePoint="TOPRIGHT">
<Offset>
<AbsDimension x="68" y="-2" />
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_TooltipPos_OnLoad(this) </OnLoad>
</Scripts>
</Frame>
<CheckButton name="HealBot_Options_ShowTooltipTarget" inherits="OptionsCheckButtonTemplate">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_TooltipsPanel" relativePoint="TOPLEFT">
<Offset>
<AbsDimension x="20" y="-30" />
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_ShowTooltipTarget_OnLoad(this,HEALBOT_OPTIONS_SHOWUNITTOOLTIP)</OnLoad>
<OnClick>HealBot_Options_ShowTooltipTarget_OnClick(this)</OnClick>
</Scripts>
</CheckButton>
<CheckButton name="HealBot_Options_ShowTooltipSpellDetail" inherits="OptionsCheckButtonTemplate">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_TooltipsPanel" relativePoint="TOPLEFT">
<Offset>
<AbsDimension x="20" y="-55" />
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_ShowTooltipSpellDetail_OnLoad(this,HEALBOT_OPTIONS_SHOWDETTOOLTIP)</OnLoad>
<OnClick>HealBot_Options_ShowTooltipSpellDetail_OnClick(this)</OnClick>
</Scripts>
</CheckButton>
<CheckButton name="HealBot_Options_ShowTooltipInstant" inherits="OptionsCheckButtonTemplate">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_TooltipsPanel" relativePoint="TOPLEFT">
<Offset>
<AbsDimension x="20" y="-80" />
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_ShowTooltipInstant_OnLoad(this,HEALBOT_OPTIONS_SHOWRECTOOLTIP)</OnLoad>
<OnClick>HealBot_Options_ShowTooltipInstant_OnClick(this)</OnClick>
</Scripts>
</CheckButton>
</Frames>
</Frame>
</Frames>
</Frame>
</Ui>
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

@@ -77,7 +77,11 @@ function HealBot_BonusScanner:ScanEquipment()
HealBot_BonusTooltip:SetOwner(HealBot_BonusTooltip, "ANCHOR_NONE"); HealBot_BonusTooltip:SetOwner(HealBot_BonusTooltip, "ANCHOR_NONE");
HealBot_BonusScanner.temp.bonuses = 0; HealBot_BonusScanner.temp.bonuses = 0;
HealBot_BonusScanner.temp.sets = {}; if not HealBot_BonusScanner.temp.sets then
HealBot_BonusScanner.temp.sets = {}
else
for k in pairs(HealBot_BonusScanner.temp.sets) do HealBot_BonusScanner.temp.sets[k] = nil end
end
HealBot_BonusScanner.temp.set = ""; HealBot_BonusScanner.temp.set = "";
for i, slotname in HealBot_BonusScanner.slots do for i, slotname in HealBot_BonusScanner.slots do
slotid, _ = GetInventorySlotInfo(slotname.. "Slot"); slotid, _ = GetInventorySlotInfo(slotname.. "Slot");
+219
View File
@@ -0,0 +1,219 @@
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)
elseif HealBot_Integrations_Nampower_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
if event == "AURA_CAST_ON_SELF" or event == "AURA_CAST_ON_OTHER" then
local spellID, caster, target, _, _, _, _, duration = arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8
if not caster or not target or not duration or duration <= 0 then return end
-- The player is ALWAYS the caster in these events for Nampower
if not HealBot_PlayerGUID then
HealBot_PlayerGUID = caster
if HealBot_Model and HealBot_Model.unitGUIDs then
HealBot_Model.unitGUIDs["player"] = caster
HealBot_Model.guidUnits[caster] = "player"
end
end
local spellName = GetSpellRecField(spellID, "name")
if not spellName then return end
if not HealBot_Nampower_Auras[target] then
HealBot_Nampower_Auras[target] = HealBot_GetTable()
end
local expirationTime = GetTime() + (duration / 1000)
HealBot_Nampower_Auras[target][spellName] = expirationTime
if not HealBot_Nampower_NameCache then HealBot_Nampower_NameCache = HealBot_GetTable() end
local unitID = nil
local tName = nil
if event == "AURA_CAST_ON_SELF" or (HealBot_PlayerGUID and (target == HealBot_PlayerGUID or string.lower(target) == string.lower(HealBot_PlayerGUID))) then
unitID = "player"
tName = UnitName("player")
if not HealBot_PlayerGUID then
HealBot_PlayerGUID = target
end
else
unitID = HealBot_Model and (HealBot_Model:GetUnitByGUID(target) or HealBot_Model:GetUnitByGUID(string.lower(target)))
if not unitID and HealBot_PlayerGUID and (target == HealBot_PlayerGUID or string.lower(target) == string.lower(HealBot_PlayerGUID)) then
unitID = "player"
end
if UnitExists("target") then
local curTargetGuid = HealBot_GetUnitGUID and HealBot_GetUnitGUID("target")
if curTargetGuid and (curTargetGuid == target or string.lower(curTargetGuid) == string.lower(target)) then
tName = UnitName("target")
if not unitID and UnitIsUnit("target", "player") then unitID = "player" end
end
end
if not tName and UnitExists("mouseover") then
local curMOGuid = HealBot_GetUnitGUID and HealBot_GetUnitGUID("mouseover")
if curMOGuid and (curMOGuid == target or string.lower(curMOGuid) == string.lower(target)) then
tName = UnitName("mouseover")
if not unitID and UnitIsUnit("mouseover", "player") then unitID = "player" end
end
end
if not tName and unitID then
tName = UnitName(unitID) or (HealBot_Model and HealBot_Model.units[unitID] and HealBot_Model.units[unitID].name)
end
end
if tName then
HealBot_Nampower_NameCache[target] = tName
HealBot_Nampower_NameCache[string.lower(target)] = tName
end
if unitID and HealBot_Model then
if HealBot_Model.guidUnits then
HealBot_Model.guidUnits[target] = unitID
HealBot_Model.guidUnits[string.lower(target)] = unitID
end
if HealBot_Model.unitGUIDs then
HealBot_Model.unitGUIDs[unitID] = target
end
end
if unitID and HealBot_View_DirtyUnits then
HealBot_View_DirtyUnits[unitID] = true
end
if HealBot_UpdateActiveHoTTimers then
HealBot_UpdateActiveHoTTimers()
elseif HealBot_Action_UpdatePlayerHoTs then
HealBot_Action_UpdatePlayerHoTs()
end
end
end)
end
else
HealBot_Integrations_Nampower_Active = false;
HealBot_AddDebug("nampower Integration: DISABLED");
if HealBot_Nampower_Auras then
for k, v in pairs(HealBot_Nampower_Auras) do
HealBot_ReleaseTable(v)
HealBot_Nampower_Auras[k] = nil
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
if HealBot_Model and HealBot_Model.PopulateAllGUIDs then
HealBot_Model:PopulateAllGUIDs()
end
if HealBot_Options_Integrations_ShowHoTTimers then
if HealBot_Integrations_Nampower_Active or HealBot_Integrations_SuperWoW_Active or HealBot_Integrations_ClassicAPI_Active then
HealBot_Options_Integrations_ShowHoTTimers:Enable()
getglobal(HealBot_Options_Integrations_ShowHoTTimers:GetName().."Text"):SetTextColor(1, 1, 1)
else
HealBot_Options_Integrations_ShowHoTTimers:Disable()
getglobal(HealBot_Options_Integrations_ShowHoTTimers:GetName().."Text"):SetTextColor(0.5, 0.5, 0.5)
HealBot_Options_Integrations_ShowHoTTimers:SetChecked(0)
HealBot_Config.HealBot_Integrations_ShowHoTTimers = 0
end
if HealBot_Options_Integrations_UpdateDropdownStates then
HealBot_Options_Integrations_UpdateDropdownStates()
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
local lowerName = string.lower(targetName)
local isPlayer = (HealBot_PlayerGUID and lowerName == string.lower(HealBot_PlayerGUID))
or (UnitName("player") and lowerName == string.lower(UnitName("player")))
or (HealBot_GetUnitGUID and (targetName == HealBot_GetUnitGUID("player") or lowerName == string.lower(HealBot_GetUnitGUID("player") or "")))
-- 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_ReleaseTable(auras)
HealBot_Nampower_Auras[targetName] = nil
elseif not isPlayer and not (HealBot_Model and (HealBot_Model:GetUnitByGUID(targetName) or HealBot_Model:GetUnitByGUID(lowerName))) and not (HealBot_Model and HealBot_Model:GetUnitIDByName(targetName)) then
-- Target left group or disconnected and is not player
if GetNumPartyMembers() == 0 and GetNumRaidMembers() == 0 then
-- Solo: keep non-player auras until expired
else
HealBot_ReleaseTable(auras)
HealBot_Nampower_Auras[targetName] = nil
end
end
end
end
@@ -83,6 +83,59 @@ HEALBOT_POWER_WORD_FORTITUDE = "Machtwort: Seelenst\195\164rke";
HEALBOT_MARK_OF_THE_WILD = "Mal der Wildnis"; HEALBOT_MARK_OF_THE_WILD = "Mal der Wildnis";
HEALBOT_BLESSING_OF_SALVATION = "Segen der Rettung"; HEALBOT_BLESSING_OF_SALVATION = "Segen der Rettung";
HEALBOT_BATTLE_SHOUT = "Schlachtruf";
HEALBOT_BLOODRAGE = "Blutrausch";
HEALBOT_BERSERKER_RAGE = "Berserkerwut";
HEALBOT_DEMON_SKIN = "D\195\164monenhaut";
HEALBOT_DEMON_ARMOR = "D\195\164monenr\195\188stung";
HEALBOT_UNENDING_BREATH = "Unendlicher Atem";
HEALBOT_DETECT_LESSER_INVISIBILITY = "Geringe Unsichtbarkeit entdecken";
HEALBOT_DETECT_INVISIBILITY = "Unsichtbarkeit entdecken";
HEALBOT_SHADOW_WARD = "Schattenzauberschutz";
HEALBOT_SOULSTONE_RESURRECTION = "Seelenstein-Auferstehung";
HEALBOT_FIRE_SHIELD = "Feuerschild";
HEALBOT_TRUESHOT_AURA = "Aura des Volltreffers";
HEALBOT_ASPECT_OF_THE_HAWK = "Aspekt des Falken";
HEALBOT_ASPECT_OF_THE_MONKEY = "Aspekt des Affen";
HEALBOT_ASPECT_OF_THE_CHEETAH = "Aspekt des Geparden";
HEALBOT_ASPECT_OF_THE_PACK = "Aspekt des Rudels";
HEALBOT_ASPECT_OF_THE_WILD = "Aspekt der Wildnis";
HEALBOT_ASPECT_OF_THE_BEAST = "Aspekt des Wildtiers";
HEALBOT_STEALTH = "Verstohlenheit";
HEALBOT_BLADE_FLURRY = "Klingenwirbel";
HEALBOT_EVASION = "Entrinnen";
HEALBOT_SPRINT = "Sprinten";
HEALBOT_SLICE_AND_DICE = "Zerh\195\164ckseln";
HEALBOT_FROST_ARMOR = "Frostr\195\188stung";
HEALBOT_ICE_ARMOR = "Eisr\195\188stung";
HEALBOT_MAGE_ARMOR = "Magische R\195\188stung";
HEALBOT_MANA_SHIELD = "Manaschild";
HEALBOT_ICE_BARRIER = "Eisbarriere";
HEALBOT_FIRE_WARD = "Feuerzauberschutz";
HEALBOT_FROST_WARD = "Frostzauberschutz";
HEALBOT_GREATER_BLESSING_OF_SALVATION = "Gro\195\159er Segen der Rettung";
HEALBOT_GREATER_BLESSING_OF_MIGHT = "Gro\195\159er Segen der Macht";
HEALBOT_GREATER_BLESSING_OF_WISDOM = "Gro\195\159er Segen der Weisheit";
HEALBOT_GREATER_BLESSING_OF_KINGS = "Gro\195\159er Segen der K\195\182nige";
HEALBOT_GREATER_BLESSING_OF_LIGHT = "Gro\195\159er Segen des Lichts";
HEALBOT_GREATER_BLESSING_OF_SANCTUARY = "Gro\195\159er Segen des Unterschlupfs";
HEALBOT_RIGHTEOUS_FURY = "Zorn der Gerechtigkeit";
HEALBOT_SHADOWFORM = "Schattengestalt";
HEALBOT_BARKSKIN = "Baumrinde";
HEALBOT_NATURES_GRASP = "Griff der Natur";
HEALBOT_LIGHTNING_SHIELD = "Blitzschlagschild";
HEALBOT_WATER_SHIELD = "Wasserschild";
HEALBOT_WATER_WALKING = "Wasserwandeln";
HEALBOT_WATER_BREATHING = "Wasseratmung";
HEALBOT_RESURRECTION = "Auferstehung"; HEALBOT_RESURRECTION = "Auferstehung";
HEALBOT_REDEMPTION = "Erl\195\182sung"; HEALBOT_REDEMPTION = "Erl\195\182sung";
HEALBOT_REBIRTH = "Wiedergeburt"; HEALBOT_REBIRTH = "Wiedergeburt";
@@ -96,6 +149,7 @@ HEALBOT_DISPEL_MAGIC = "Magiebannung";
HEALBOT_CURE_POISON = "Vergiftung heilen"; HEALBOT_CURE_POISON = "Vergiftung heilen";
HEALBOT_ABOLISH_POISON = "Vergiftung aufheben"; HEALBOT_ABOLISH_POISON = "Vergiftung aufheben";
HEALBOT_REMOVE_CURSE = "Fluch aufheben"; HEALBOT_REMOVE_CURSE = "Fluch aufheben";
HEALBOT_REMOVE_LESSER_CURSE= "Geringeren Fluch aufheben";
HEALBOT_DISEASE = "Krankheit"; HEALBOT_DISEASE = "Krankheit";
HEALBOT_MAGIC = "Magie"; HEALBOT_MAGIC = "Magie";
HEALBOT_CURSE = "Fluch"; HEALBOT_CURSE = "Fluch";
@@ -154,6 +208,7 @@ HEALBOT_BUFF_REGROWTH = "Interface\\Icons\\Spell_Nature_ResistNature"
HEALBOT_BUFF_RENEW = "Interface\\Icons\\Spell_Holy_Renew"; HEALBOT_BUFF_RENEW = "Interface\\Icons\\Spell_Holy_Renew";
HEALBOT_BUFF_FEAR_WARD = "Interface\\Icons\\Spell_Holy_Excorcism"; HEALBOT_BUFF_FEAR_WARD = "Interface\\Icons\\Spell_Holy_Excorcism";
HEALBOT_DEBUFF_WEAKENED_SOUL = "Interface\\Icons\\Spell_Holy_AshesToAshes"; HEALBOT_DEBUFF_WEAKENED_SOUL = "Interface\\Icons\\Spell_Holy_AshesToAshes";
HEALBOT_WEAKENED_SOUL = "Geschw\195\164chte Seele";
HEALBOT_DEBUFF_RECENTLY_BANDAGED = "Interface\\Icons\\INV_Misc_Bandage_08"; HEALBOT_DEBUFF_RECENTLY_BANDAGED = "Interface\\Icons\\INV_Misc_Bandage_08";
@@ -242,6 +297,8 @@ HEALBOT_OPTIONS_NEWSKINTEXT = "Neuer Skin"
HEALBOT_OPTIONS_SAVESKIN = "Speichern" HEALBOT_OPTIONS_SAVESKIN = "Speichern"
HEALBOT_OPTIONS_SKINBARS = "Leisten Optionen" HEALBOT_OPTIONS_SKINBARS = "Leisten Optionen"
HEALBOT_OPTIONS_SKINPANEL = "Panel Farben" HEALBOT_OPTIONS_SKINPANEL = "Panel Farben"
HEALBOT_SKIN_MAXHPTEXT = "Max HP"
HEALBOT_SKIN_MINHPTEXT = "Min HP"
HEALBOT_SKIN_ENTEXT = "Aktiv" HEALBOT_SKIN_ENTEXT = "Aktiv"
HEALBOT_SKIN_DISTEXT = "Inaktiv" HEALBOT_SKIN_DISTEXT = "Inaktiv"
HEALBOT_SKIN_DEBTEXT = "Debuff" HEALBOT_SKIN_DEBTEXT = "Debuff"
@@ -362,3 +419,12 @@ end
HEALBOT_OPTIONS_CDCOVERLAY = "Debuff visual:";
HEALBOT_OPTIONS_CDCOVERLAY_BAR = "Whole Bar";
HEALBOT_OPTIONS_CDCOVERLAY_FRAME = "Frame / Border";
HEALBOT_OPTIONS_CDCOVERLAY_GLOW = "Glow Effect";
HEALBOT_OPTIONS_CDCOVERLAY_GLOWFRAME = "Glow + Frame";
HEALBOT_OPTIONS_CDCOVERLAY_NONE = "Disabled";
HEALBOT_OPTIONS_CDCOVERLAY_ANIMATED = "Animated";
HEALBOT_OPTIONS_CDCOVERLAY_ANIMFRAME = "Animated + Frame";
@@ -95,6 +95,59 @@ HEALBOT_INNER_FIRE = "Inner Fire";
HEALBOT_FEAR_WARD = "Fear Ward"; HEALBOT_FEAR_WARD = "Fear Ward";
HEALBOT_ENLIGHTEN = "Enlighten"; HEALBOT_ENLIGHTEN = "Enlighten";
HEALBOT_BATTLE_SHOUT = "Battle Shout";
HEALBOT_BLOODRAGE = "Bloodrage";
HEALBOT_BERSERKER_RAGE = "Berserker Rage";
HEALBOT_DEMON_SKIN = "Demon Skin";
HEALBOT_DEMON_ARMOR = "Demon Armor";
HEALBOT_UNENDING_BREATH = "Unending Breath";
HEALBOT_DETECT_LESSER_INVISIBILITY = "Detect Lesser Invisibility";
HEALBOT_DETECT_INVISIBILITY = "Detect Invisibility";
HEALBOT_SHADOW_WARD = "Shadow Ward";
HEALBOT_SOULSTONE_RESURRECTION = "Soulstone Resurrection";
HEALBOT_FIRE_SHIELD = "Fire Shield";
HEALBOT_TRUESHOT_AURA = "Trueshot Aura";
HEALBOT_ASPECT_OF_THE_HAWK = "Aspect of the Hawk";
HEALBOT_ASPECT_OF_THE_MONKEY = "Aspect of the Monkey";
HEALBOT_ASPECT_OF_THE_CHEETAH = "Aspect of the Cheetah";
HEALBOT_ASPECT_OF_THE_PACK = "Aspect of the Pack";
HEALBOT_ASPECT_OF_THE_WILD = "Aspect of the Wild";
HEALBOT_ASPECT_OF_THE_BEAST = "Aspect of the Beast";
HEALBOT_STEALTH = "Stealth";
HEALBOT_BLADE_FLURRY = "Blade Flurry";
HEALBOT_EVASION = "Evasion";
HEALBOT_SPRINT = "Sprint";
HEALBOT_SLICE_AND_DICE = "Slice and Dice";
HEALBOT_FROST_ARMOR = "Frost Armor";
HEALBOT_ICE_ARMOR = "Ice Armor";
HEALBOT_MAGE_ARMOR = "Mage Armor";
HEALBOT_MANA_SHIELD = "Mana Shield";
HEALBOT_ICE_BARRIER = "Ice Barrier";
HEALBOT_FIRE_WARD = "Fire Ward";
HEALBOT_FROST_WARD = "Frost Ward";
HEALBOT_GREATER_BLESSING_OF_SALVATION = "Greater Blessing of Salvation";
HEALBOT_GREATER_BLESSING_OF_MIGHT = "Greater Blessing of Might";
HEALBOT_GREATER_BLESSING_OF_WISDOM = "Greater Blessing of Wisdom";
HEALBOT_GREATER_BLESSING_OF_KINGS = "Greater Blessing of Kings";
HEALBOT_GREATER_BLESSING_OF_LIGHT = "Greater Blessing of Light";
HEALBOT_GREATER_BLESSING_OF_SANCTUARY = "Greater Blessing of Sanctuary";
HEALBOT_RIGHTEOUS_FURY = "Righteous Fury";
HEALBOT_SHADOWFORM = "Shadowform";
HEALBOT_BARKSKIN = "Barkskin";
HEALBOT_NATURES_GRASP = "Nature's Grasp";
HEALBOT_LIGHTNING_SHIELD = "Lightning Shield";
HEALBOT_WATER_SHIELD = "Water Shield";
HEALBOT_WATER_WALKING = "Water Walking";
HEALBOT_WATER_BREATHING = "Water Breathing";
HEALBOT_RESURRECTION = "Resurrection"; HEALBOT_RESURRECTION = "Resurrection";
HEALBOT_REDEMPTION = "Redemption"; HEALBOT_REDEMPTION = "Redemption";
HEALBOT_REBIRTH = "Rebirth"; HEALBOT_REBIRTH = "Rebirth";
@@ -104,6 +157,7 @@ HEALBOT_PURIFY = "Purify";
HEALBOT_CLEANSE = "Cleanse"; HEALBOT_CLEANSE = "Cleanse";
HEALBOT_CURE_POISON = "Cure Poison"; HEALBOT_CURE_POISON = "Cure Poison";
HEALBOT_REMOVE_CURSE = "Remove Curse"; HEALBOT_REMOVE_CURSE = "Remove Curse";
HEALBOT_REMOVE_LESSER_CURSE= "Remove Lesser Curse";
HEALBOT_ABOLISH_POISON = "Abolish Poison"; HEALBOT_ABOLISH_POISON = "Abolish Poison";
HEALBOT_CURE_DISEASE = "Cure Disease"; HEALBOT_CURE_DISEASE = "Cure Disease";
HEALBOT_ABOLISH_DISEASE = "Abolish Disease"; HEALBOT_ABOLISH_DISEASE = "Abolish Disease";
@@ -171,6 +225,7 @@ HEALBOT_BUFF_REGROWTH = "Interface\\Icons\\Spell_Nature_ResistNature"
HEALBOT_BUFF_RENEW = "Interface\\Icons\\Spell_Holy_Renew"; HEALBOT_BUFF_RENEW = "Interface\\Icons\\Spell_Holy_Renew";
HEALBOT_BUFF_FEAR_WARD = "Interface\\Icons\\Spell_Holy_Excorcism"; HEALBOT_BUFF_FEAR_WARD = "Interface\\Icons\\Spell_Holy_Excorcism";
HEALBOT_DEBUFF_WEAKENED_SOUL = "Interface\\Icons\\Spell_Holy_AshesToAshes"; HEALBOT_DEBUFF_WEAKENED_SOUL = "Interface\\Icons\\Spell_Holy_AshesToAshes";
HEALBOT_WEAKENED_SOUL = "Weakened Soul";
HEALBOT_DEBUFF_RECENTLY_BANDAGED = "Interface\\Icons\\INV_Misc_Bandage_08"; HEALBOT_DEBUFF_RECENTLY_BANDAGED = "Interface\\Icons\\INV_Misc_Bandage_08";
@@ -275,6 +330,8 @@ HEALBOT_OPTIONS_BUFF7 = "Buff 7";
HEALBOT_OPTIONS_BUFF8 = "Buff 8"; HEALBOT_OPTIONS_BUFF8 = "Buff 8";
HEALBOT_OPTIONS_SKINBARS = "Bar options" HEALBOT_OPTIONS_SKINBARS = "Bar options"
HEALBOT_OPTIONS_SKINPANEL = "Panel colours" HEALBOT_OPTIONS_SKINPANEL = "Panel colours"
HEALBOT_SKIN_MAXHPTEXT = "Max HP"
HEALBOT_SKIN_MINHPTEXT = "Min HP"
HEALBOT_SKIN_ENTEXT = "Enabled" HEALBOT_SKIN_ENTEXT = "Enabled"
HEALBOT_SKIN_DISTEXT = "Disabled" HEALBOT_SKIN_DISTEXT = "Disabled"
HEALBOT_SKIN_DEBTEXT = "Debuff" HEALBOT_SKIN_DEBTEXT = "Debuff"
@@ -390,3 +447,14 @@ HEALBOT_WORDS_SEC = "sec";
HEALBOT_WORDS_TO = "to"; HEALBOT_WORDS_TO = "to";
HEALBOT_WORDS_CAST = "Cast" HEALBOT_WORDS_CAST = "Cast"
HEALBOT_WORDS_FOR = "for"; HEALBOT_WORDS_FOR = "for";
HEALBOT_OPTIONS_TESTBARS = "Test Bars";
HEALBOT_WORD_TEST = "Test";
HEALBOT_OPTIONS_CDCOVERLAY = "Debuff visual:";
HEALBOT_OPTIONS_CDCOVERLAY_BAR = "Whole Bar";
HEALBOT_OPTIONS_CDCOVERLAY_FRAME = "Frame / Border";
HEALBOT_OPTIONS_CDCOVERLAY_GLOW = "Glow Effect";
HEALBOT_OPTIONS_CDCOVERLAY_GLOWFRAME = "Glow + Frame";
HEALBOT_OPTIONS_CDCOVERLAY_NONE = "Disabled";
HEALBOT_OPTIONS_CDCOVERLAY_ANIMATED = "Animated";
HEALBOT_OPTIONS_CDCOVERLAY_ANIMFRAME = "Animated + Frame";
@@ -18,7 +18,7 @@ if (GetLocale() == "frFR") then
HEALBOT_DRUID = "Druide"; HEALBOT_DRUID = "Druide";
HEALBOT_HUNTER = "Chasseur"; HEALBOT_HUNTER = "Chasseur";
HEALBOT_MAGE = "Magier"; HEALBOT_MAGE = "Mage";
HEALBOT_PALADIN = "Paladin"; HEALBOT_PALADIN = "Paladin";
HEALBOT_PRIEST = "Pr\195\170tre"; HEALBOT_PRIEST = "Pr\195\170tre";
HEALBOT_ROGUE = "Voleur"; HEALBOT_ROGUE = "Voleur";
@@ -72,6 +72,7 @@ HEALBOT_LESSER_HEAL = "Soins inf\195\169rieurs";
HEALBOT_LESSER_HEALING_WAVE = "Vague de soins mineurs"; HEALBOT_LESSER_HEALING_WAVE = "Vague de soins mineurs";
HEALBOT_MEND_PET = "Soigner un Familier"; HEALBOT_MEND_PET = "Soigner un Familier";
HEALBOT_POWER_WORD_SHIELD = "Mot de pouvoir : Bouclier"; HEALBOT_POWER_WORD_SHIELD = "Mot de pouvoir : Bouclier";
HEALBOT_WEAKENED_SOUL = "\195\130me affaiblie";
HEALBOT_REGROWTH = "R\195\169tablissement"; HEALBOT_REGROWTH = "R\195\169tablissement";
HEALBOT_RENEW = "R\195\169novation"; HEALBOT_RENEW = "R\195\169novation";
HEALBOT_REJUVENATION = "R\195\169cup\195\169ration"; HEALBOT_REJUVENATION = "R\195\169cup\195\169ration";
@@ -82,6 +83,59 @@ HEALBOT_POWER_WORD_FORTITUDE = "Mot de pouvoir : Robustesse";
HEALBOT_MARK_OF_THE_WILD = "Marque du fauve"; HEALBOT_MARK_OF_THE_WILD = "Marque du fauve";
HEALBOT_BLESSING_OF_SALVATION = "B\195\169n\195\169diction de salut"; HEALBOT_BLESSING_OF_SALVATION = "B\195\169n\195\169diction de salut";
HEALBOT_BATTLE_SHOUT = "Cri de guerre";
HEALBOT_BLOODRAGE = "Rage sanguinaire";
HEALBOT_BERSERKER_RAGE = "Rage berserker";
HEALBOT_DEMON_SKIN = "Peau de d\195\169mon";
HEALBOT_DEMON_ARMOR = "Armure d\195\169moniaque";
HEALBOT_UNENDING_BREATH = "Respiration interminable";
HEALBOT_DETECT_LESSER_INVISIBILITY = "D\195\169tection de l'invisibilit\195\169 inf\195\169rieure";
HEALBOT_DETECT_INVISIBILITY = "D\195\169tection de l'invisibilit\195\169";
HEALBOT_SHADOW_WARD = "Gardien de l'ombre";
HEALBOT_SOULSTONE_RESURRECTION = "R\195\169surrection de pierre d'\195\162me";
HEALBOT_FIRE_SHIELD = "Bouclier de feu";
HEALBOT_TRUESHOT_AURA = "Aura de pr\195\169cision";
HEALBOT_ASPECT_OF_THE_HAWK = "Aspect du faucon";
HEALBOT_ASPECT_OF_THE_MONKEY = "Aspect du singe";
HEALBOT_ASPECT_OF_THE_CHEETAH = "Aspect du gu\195\169pard";
HEALBOT_ASPECT_OF_THE_PACK = "Aspect de la meute";
HEALBOT_ASPECT_OF_THE_WILD = "Aspect de la nature";
HEALBOT_ASPECT_OF_THE_BEAST = "Aspect de la b\195\170te";
HEALBOT_STEALTH = "Camouflage";
HEALBOT_BLADE_FLURRY = "D\195\169luge de lames";
HEALBOT_EVASION = "Evasion";
HEALBOT_SPRINT = "Sprint";
HEALBOT_SLICE_AND_DICE = "D\195\169biter";
HEALBOT_FROST_ARMOR = "Armure de givre";
HEALBOT_ICE_ARMOR = "Armure de glace";
HEALBOT_MAGE_ARMOR = "Armure du mage";
HEALBOT_MANA_SHIELD = "Bouclier de mana";
HEALBOT_ICE_BARRIER = "Barri\195\168re de glace";
HEALBOT_FIRE_WARD = "Gardien de feu";
HEALBOT_FROST_WARD = "Gardien de givre";
HEALBOT_GREATER_BLESSING_OF_SALVATION = "B\195\169n\195\169diction de salut sup\195\169rieure";
HEALBOT_GREATER_BLESSING_OF_MIGHT = "B\195\169n\195\169diction de puissance sup\195\169rieure";
HEALBOT_GREATER_BLESSING_OF_WISDOM = "B\195\169n\195\169diction de sagesse sup\195\169rieure";
HEALBOT_GREATER_BLESSING_OF_KINGS = "B\195\169n\195\169diction des rois sup\195\169rieure";
HEALBOT_GREATER_BLESSING_OF_LIGHT = "B\195\169n\195\169diction de lumi\195\168re sup\195\169rieure";
HEALBOT_GREATER_BLESSING_OF_SANCTUARY = "B\195\169n\195\169diction du sanctuaire sup\195\169rieure";
HEALBOT_RIGHTEOUS_FURY = "Fureur vertueuse";
HEALBOT_SHADOWFORM = "Forme d'Ombre";
HEALBOT_BARKSKIN = "Peau d'\195\169corce";
HEALBOT_NATURES_GRASP = "Emprise de la nature";
HEALBOT_LIGHTNING_SHIELD = "Bouclier de foudre";
HEALBOT_WATER_SHIELD = "Bouclier d'eau";
HEALBOT_WATER_WALKING = "Marche sur l'eau";
HEALBOT_WATER_BREATHING = "Respiration aquatique";
HEALBOT_RESURRECTION = "R\195\169surrection"; HEALBOT_RESURRECTION = "R\195\169surrection";
HEALBOT_REDEMPTION = "R\195\169demption"; HEALBOT_REDEMPTION = "R\195\169demption";
HEALBOT_REBIRTH = "Renaissance"; HEALBOT_REBIRTH = "Renaissance";
@@ -91,6 +145,7 @@ HEALBOT_PURIFY = "Purification";
HEALBOT_CLEANSE = "Epuration"; HEALBOT_CLEANSE = "Epuration";
HEALBOT_CURE_POISON = "Gu\195\169rison du poison"; HEALBOT_CURE_POISON = "Gu\195\169rison du poison";
HEALBOT_REMOVE_CURSE = "D\195\169livrance de la mal\195\169diction"; HEALBOT_REMOVE_CURSE = "D\195\169livrance de la mal\195\169diction";
HEALBOT_REMOVE_LESSER_CURSE= "D\195\169livrance de la mal\195\169diction mineure";
HEALBOT_ABOLISH_POISON = "Abolir le poison"; HEALBOT_ABOLISH_POISON = "Abolir le poison";
HEALBOT_CURE_DISEASE = "Gu\195\169rison des maladies"; HEALBOT_CURE_DISEASE = "Gu\195\169rison des maladies";
HEALBOT_ABOLISH_DISEASE = "Abolir maladie"; HEALBOT_ABOLISH_DISEASE = "Abolir maladie";
@@ -305,6 +360,8 @@ HEALBOT_OPTIONS_NEWSKINTEXT = "New skin" -- *************** needs French
HEALBOT_OPTIONS_SAVESKIN = "Save" -- *************** needs French translation *************** HEALBOT_OPTIONS_SAVESKIN = "Save" -- *************** needs French translation ***************
HEALBOT_OPTIONS_SKINBARS = "Bar options" -- *************** needs French translation *************** HEALBOT_OPTIONS_SKINBARS = "Bar options" -- *************** needs French translation ***************
HEALBOT_OPTIONS_SKINPANEL = "Panel colours" -- *************** needs French translation *************** HEALBOT_OPTIONS_SKINPANEL = "Panel colours" -- *************** needs French translation ***************
HEALBOT_SKIN_MAXHPTEXT = "Max HP"
HEALBOT_SKIN_MINHPTEXT = "Min HP"
HEALBOT_SKIN_ENTEXT = "Enabled" -- *************** needs French translation *************** HEALBOT_SKIN_ENTEXT = "Enabled" -- *************** needs French translation ***************
HEALBOT_SKIN_DISTEXT = "Disabled" -- *************** needs French translation *************** HEALBOT_SKIN_DISTEXT = "Disabled" -- *************** needs French translation ***************
HEALBOT_SKIN_DEBTEXT = "Debuff" -- *************** needs French translation *************** HEALBOT_SKIN_DEBTEXT = "Debuff" -- *************** needs French translation ***************
@@ -343,3 +400,12 @@ end
HEALBOT_OPTIONS_CDCOVERLAY = "Debuff visual:";
HEALBOT_OPTIONS_CDCOVERLAY_BAR = "Whole Bar";
HEALBOT_OPTIONS_CDCOVERLAY_FRAME = "Frame / Border";
HEALBOT_OPTIONS_CDCOVERLAY_GLOW = "Glow Effect";
HEALBOT_OPTIONS_CDCOVERLAY_GLOWFRAME = "Glow + Frame";
HEALBOT_OPTIONS_CDCOVERLAY_NONE = "Disabled";
HEALBOT_OPTIONS_CDCOVERLAY_ANIMATED = "Animated";
HEALBOT_OPTIONS_CDCOVERLAY_ANIMFRAME = "Animated + Frame";
@@ -54,6 +54,7 @@ if (GetLocale() == "koKR") then
HEALBOT_LESSER_HEALING_WAVE = "하급 치유의 물결"; HEALBOT_LESSER_HEALING_WAVE = "하급 치유의 물결";
HEALBOT_MEND_PET = "동물 치료"; HEALBOT_MEND_PET = "동물 치료";
HEALBOT_POWER_WORD_SHIELD = "신의 권능: 보호막"; HEALBOT_POWER_WORD_SHIELD = "신의 권능: 보호막";
HEALBOT_WEAKENED_SOUL = "신체 취약";
HEALBOT_REGROWTH = "재생"; HEALBOT_REGROWTH = "재생";
HEALBOT_RENEW = "소생"; HEALBOT_RENEW = "소생";
HEALBOT_REJUVENATION = "회복"; HEALBOT_REJUVENATION = "회복";
@@ -67,6 +68,58 @@ HEALBOT_ENLIGHTEN = "Enlighten";
HEALBOT_MARK_OF_THE_WILD = "야생의 징표"; HEALBOT_MARK_OF_THE_WILD = "야생의 징표";
HEALBOT_GREATER_BLESSING_OF_SALVATION = "상급 구원의 축복"; HEALBOT_GREATER_BLESSING_OF_SALVATION = "상급 구원의 축복";
HEALBOT_BATTLE_SHOUT = "전투의 외침";
HEALBOT_BLOODRAGE = "피의 분노";
HEALBOT_BERSERKER_RAGE = "광전사의 격노";
HEALBOT_DEMON_SKIN = "악마의 피부";
HEALBOT_DEMON_ARMOR = "악마의 갑옷";
HEALBOT_UNENDING_BREATH = "영원의 숨결";
HEALBOT_DETECT_LESSER_INVISIBILITY = "하급 투명체 감지";
HEALBOT_DETECT_INVISIBILITY = "투명체 감지";
HEALBOT_SHADOW_WARD = "암흑계 수호";
HEALBOT_SOULSTONE_RESURRECTION = "영혼석 부활";
HEALBOT_FIRE_SHIELD = "불의 방패";
HEALBOT_TRUESHOT_AURA = "정밀함의 오라";
HEALBOT_ASPECT_OF_THE_HAWK = "매의 상";
HEALBOT_ASPECT_OF_THE_MONKEY = "원숭이의 상";
HEALBOT_ASPECT_OF_THE_CHEETAH = "치타의 상";
HEALBOT_ASPECT_OF_THE_PACK = "치타 무리의 상";
HEALBOT_ASPECT_OF_THE_WILD = "야생의 상";
HEALBOT_ASPECT_OF_THE_BEAST = "야수의 상";
HEALBOT_STEALTH = "은신";
HEALBOT_BLADE_FLURRY = "폭풍의 칼날";
HEALBOT_EVASION = "회피";
HEALBOT_SPRINT = "전력 질주";
HEALBOT_SLICE_AND_DICE = "난도질";
HEALBOT_FROST_ARMOR = "서리 갑옷";
HEALBOT_ICE_ARMOR = "얼음 갑옷";
HEALBOT_MAGE_ARMOR = "마법사 갑옷";
HEALBOT_MANA_SHIELD = "마나 보호막";
HEALBOT_ICE_BARRIER = "얼음 보호막";
HEALBOT_FIRE_WARD = "화염계 수호";
HEALBOT_FROST_WARD = "냉기계 수호";
HEALBOT_GREATER_BLESSING_OF_MIGHT = "상급 힘의 축복";
HEALBOT_GREATER_BLESSING_OF_WISDOM = "상급 지혜의 축복";
HEALBOT_GREATER_BLESSING_OF_KINGS = "상급 왕의 축복";
HEALBOT_GREATER_BLESSING_OF_LIGHT = "상급 빛의 축복";
HEALBOT_GREATER_BLESSING_OF_SANCTUARY = "상급 성역의 축복";
HEALBOT_RIGHTEOUS_FURY = "정의의 격노";
HEALBOT_SHADOWFORM = "어둠의 형상";
HEALBOT_BARKSKIN = "나무 껍질";
HEALBOT_NATURES_GRASP = "자연의 파악";
HEALBOT_LIGHTNING_SHIELD = "번개 보호막";
HEALBOT_WATER_SHIELD = "물의 보호막";
HEALBOT_WATER_WALKING = "수면 보행";
HEALBOT_WATER_BREATHING = "수중 호흡";
HEALBOT_RESURRECTION = "부활"; HEALBOT_RESURRECTION = "부활";
HEALBOT_REDEMPTION = "구원"; HEALBOT_REDEMPTION = "구원";
HEALBOT_REBIRTH = "환생"; HEALBOT_REBIRTH = "환생";
@@ -76,6 +129,7 @@ HEALBOT_GREATER_BLESSING_OF_SALVATION = "상급 구원의 축복";
HEALBOT_CLEANSE = "정화"; HEALBOT_CLEANSE = "정화";
HEALBOT_CURE_POISON = "해독"; HEALBOT_CURE_POISON = "해독";
HEALBOT_REMOVE_CURSE = "저주 해제"; HEALBOT_REMOVE_CURSE = "저주 해제";
HEALBOT_REMOVE_LESSER_CURSE = "하급 저주 해제";
HEALBOT_ABOLISH_POISON = "독 해제"; HEALBOT_ABOLISH_POISON = "독 해제";
HEALBOT_CURE_DISEASE = "질병 치료"; HEALBOT_CURE_DISEASE = "질병 치료";
HEALBOT_ABOLISH_DISEASE = "질병 해제"; HEALBOT_ABOLISH_DISEASE = "질병 해제";
@@ -221,6 +275,8 @@ HEALBOT_GREATER_BLESSING_OF_SALVATION = "상급 구원의 축복";
HEALBOT_OPTIONS_SAVESKIN = "저장" HEALBOT_OPTIONS_SAVESKIN = "저장"
HEALBOT_OPTIONS_SKINBARS = "바 옵션들" HEALBOT_OPTIONS_SKINBARS = "바 옵션들"
HEALBOT_OPTIONS_SKINPANEL = "패널 색" HEALBOT_OPTIONS_SKINPANEL = "패널 색"
HEALBOT_SKIN_MAXHPTEXT = "최대 생명력"
HEALBOT_SKIN_MINHPTEXT = "최소 생명력"
HEALBOT_SKIN_ENTEXT = "활성화" HEALBOT_SKIN_ENTEXT = "활성화"
HEALBOT_SKIN_DISTEXT = "비활성화" HEALBOT_SKIN_DISTEXT = "비활성화"
HEALBOT_SKIN_DEBTEXT = "디버프" HEALBOT_SKIN_DEBTEXT = "디버프"
@@ -338,3 +394,12 @@ end
HEALBOT_OPTIONS_CDCOVERLAY = "Debuff visual:";
HEALBOT_OPTIONS_CDCOVERLAY_BAR = "Whole Bar";
HEALBOT_OPTIONS_CDCOVERLAY_FRAME = "Frame / Border";
HEALBOT_OPTIONS_CDCOVERLAY_GLOW = "Glow Effect";
HEALBOT_OPTIONS_CDCOVERLAY_GLOWFRAME = "Glow + Frame";
HEALBOT_OPTIONS_CDCOVERLAY_NONE = "Disabled";
HEALBOT_OPTIONS_CDCOVERLAY_ANIMATED = "Animated";
HEALBOT_OPTIONS_CDCOVERLAY_ANIMFRAME = "Animated + Frame";
+141 -2
View File
@@ -1,4 +1,5 @@
HealBot_ConfigDefaults = { HealBot_ConfigDefaults = {
DebugMode = 0,
ShowManaBars=0, ShowManaBars=0,
ManaBarsHealersOnly=0, ManaBarsHealersOnly=0,
Version = HEALBOT_VERSION, Version = HEALBOT_VERSION,
@@ -51,6 +52,8 @@ HealBot_ConfigDefaults = {
SoundDebuffWarning = 0, SoundDebuffWarning = 0,
SoundDebuffPlay = 1, SoundDebuffPlay = 1,
CDCMonitor = 2, CDCMonitor = 2,
CDCOverlay = 1,
CDCOverlayTexture = "Interface\\AddOns\\HealBotBlue\\Images\\glow1.tga",
PanelAnchorX = -1, PanelAnchorX = -1,
PanelAnchorY = -1, PanelAnchorY = -1,
CDCBarColour = { CDCBarColour = {
@@ -65,12 +68,22 @@ HealBot_ConfigDefaults = {
[HEALBOT_PALADIN] = 1, [HEALBOT_PALADIN] = 1,
[HEALBOT_PRIEST] = 1, [HEALBOT_PRIEST] = 1,
[HEALBOT_SHAMAN] = 1, [HEALBOT_SHAMAN] = 1,
[HEALBOT_MAGE] = 1,
[HEALBOT_WARRIOR] = 1,
[HEALBOT_ROGUE] = 1,
[HEALBOT_HUNTER] = 1,
[HEALBOT_WARLOCK] = 1,
}, },
Debuff_Right = { Debuff_Right = {
[HEALBOT_DRUID] = 1, [HEALBOT_DRUID] = 1,
[HEALBOT_PALADIN] = 1, [HEALBOT_PALADIN] = 1,
[HEALBOT_PRIEST] = 1, [HEALBOT_PRIEST] = 1,
[HEALBOT_SHAMAN] = 1, [HEALBOT_SHAMAN] = 1,
[HEALBOT_MAGE] = 1,
[HEALBOT_WARRIOR] = 1,
[HEALBOT_ROGUE] = 1,
[HEALBOT_HUNTER] = 1,
[HEALBOT_WARLOCK] = 1,
}, },
BuffWatch = 1, BuffWatch = 1,
BuffWatchInCombat = 0, BuffWatchInCombat = 0,
@@ -186,13 +199,28 @@ HealBot_ConfigDefaults = {
["ShiftCtrlRight"] = HEALBOT_HEALING_WAVE .. HEALBOT_RANK_4, ["ShiftCtrlRight"] = HEALBOT_HEALING_WAVE .. HEALBOT_RANK_4,
["Middle"] = HEALBOT_CHAIN_HEAL, ["Middle"] = HEALBOT_CHAIN_HEAL,
}, },
[HEALBOT_WARRIOR] = {
["Left"] = "Target",
},
[HEALBOT_MAGE] = {
["Left"] = "Target",
},
[HEALBOT_ROGUE] = {
["Left"] = "Target",
},
[HEALBOT_HUNTER] = {
["Left"] = "Target",
},
[HEALBOT_WARLOCK] = {
["Left"] = "Target",
},
}, },
EnableHealthy = 0, EnableHealthy = 0,
ShowNonManaBars = 0, ShowNonManaBars = 0,
ActionVisible = 0, ActionVisible = 0,
ActionMouseover = 1, ActionMouseover = 1,
CDCLeftText = {[HEALBOT_PRIEST]="None", [HEALBOT_SHAMAN]="None", [HEALBOT_DRUID]="None", [HEALBOT_PALADIN]="None",}, CDCLeftText = {[HEALBOT_PRIEST]="None", [HEALBOT_SHAMAN]="None", [HEALBOT_DRUID]="None", [HEALBOT_PALADIN]="None", [HEALBOT_MAGE]="None", [HEALBOT_WARRIOR]="None", [HEALBOT_ROGUE]="None", [HEALBOT_HUNTER]="None", [HEALBOT_WARLOCK]="None",},
CDCRightText = {[HEALBOT_PRIEST]="None", [HEALBOT_SHAMAN]="None", [HEALBOT_DRUID]="None", [HEALBOT_PALADIN]="None",}, CDCRightText = {[HEALBOT_PRIEST]="None", [HEALBOT_SHAMAN]="None", [HEALBOT_DRUID]="None", [HEALBOT_PALADIN]="None", [HEALBOT_MAGE]="None", [HEALBOT_WARRIOR]="None", [HEALBOT_ROGUE]="None", [HEALBOT_HUNTER]="None", [HEALBOT_WARLOCK]="None",},
Current_Skin = "Modern Flat", Current_Skin = "Modern Flat",
Skin_ID = 1, Skin_ID = 1,
Skins = {"Modern Flat", HEALBOT_SKINS_STD, "HealBot Party", "HealBot Raid", "Alteric Valley"}, Skins = {"Modern Flat", HEALBOT_SKINS_STD, "HealBot Party", "HealBot Raid", "Alteric Valley"},
@@ -248,6 +276,19 @@ HealBot_ConfigDefaults = {
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}, biconsize = {[HEALBOT_SKINS_STD] = 12, ["HealBot Party"] = 12, ["HealBot Raid"] = 12, ["Alteric Valley"] = 12, ["Modern Flat"] = 12},
bcolormaxr = {[HEALBOT_SKINS_STD] = 0, ["HealBot Party"] = 0, ["HealBot Raid"] = 0, ["Alteric Valley"] = 0, ["Modern Flat"] = 0},
bcolormaxg = {[HEALBOT_SKINS_STD] = 1, ["HealBot Party"] = 1, ["HealBot Raid"] = 1, ["Alteric Valley"] = 1, ["Modern Flat"] = 1},
bcolormaxb = {[HEALBOT_SKINS_STD] = 0, ["HealBot Party"] = 0, ["HealBot Raid"] = 0, ["Alteric Valley"] = 0, ["Modern Flat"] = 0},
bcolorminr = {[HEALBOT_SKINS_STD] = 1, ["HealBot Party"] = 1, ["HealBot Raid"] = 1, ["Alteric Valley"] = 1, ["Modern Flat"] = 1},
bcolorming = {[HEALBOT_SKINS_STD] = 0, ["HealBot Party"] = 0, ["HealBot Raid"] = 0, ["Alteric Valley"] = 0, ["Modern Flat"] = 0},
bcolorminb = {[HEALBOT_SKINS_STD] = 0, ["HealBot Party"] = 0, ["HealBot Raid"] = 0, ["Alteric Valley"] = 0, ["Modern Flat"] = 0},
bfont = {[HEALBOT_SKINS_STD] = "Fonts\\FRIZQT__.TTF", ["HealBot Party"] = "Fonts\\FRIZQT__.TTF", ["HealBot Raid"] = "Fonts\\FRIZQT__.TTF", ["Alteric Valley"] = "Fonts\\FRIZQT__.TTF", ["Modern Flat"] = "Fonts\\FRIZQT__.TTF"},
bframe = {[HEALBOT_SKINS_STD] = 0, ["HealBot Party"] = 0, ["HealBot Raid"] = 0, ["Alteric Valley"] = 0, ["Modern Flat"] = 0},
bframewidth = {[HEALBOT_SKINS_STD] = 10, ["HealBot Party"] = 10, ["HealBot Raid"] = 10, ["Alteric Valley"] = 10, ["Modern Flat"] = 10},
bframecolr = {[HEALBOT_SKINS_STD] = 1, ["HealBot Party"] = 1, ["HealBot Raid"] = 1, ["Alteric Valley"] = 1, ["Modern Flat"] = 1},
bframecolg = {[HEALBOT_SKINS_STD] = 1, ["HealBot Party"] = 1, ["HealBot Raid"] = 1, ["Alteric Valley"] = 1, ["Modern Flat"] = 1},
bframecolb = {[HEALBOT_SKINS_STD] = 1, ["HealBot Party"] = 1, ["HealBot Raid"] = 1, ["Alteric Valley"] = 1, ["Modern Flat"] = 1},
bframecola = {[HEALBOT_SKINS_STD] = 1, ["HealBot Party"] = 1, ["HealBot Raid"] = 1, ["Alteric Valley"] = 1, ["Modern Flat"] = 1},
ShowTooltip = 1, ShowTooltip = 1,
ShowManaBars = 0, ShowManaBars = 0,
ManaBarsHealersOnly = 0, ManaBarsHealersOnly = 0,
@@ -260,6 +301,9 @@ HealBot_ConfigDefaults = {
HealBot_Integrations_Nampower = 0, HealBot_Integrations_Nampower = 0,
HealBot_Integrations_SuperWoW = 0, HealBot_Integrations_SuperWoW = 0,
HealBot_Integrations_ClassicAPI = 0, HealBot_Integrations_ClassicAPI = 0,
HealBot_Integrations_ShowHoTTimers = 0,
HealBot_Integrations_HoTTimerPosition = "BELOW",
HealBot_Integrations_HoTTimerDisplayMode = 0,
}; };
HealBot_Config = {}; HealBot_Config = {};
@@ -501,6 +545,9 @@ HealBot_Debuff_Spells = {
HEALBOT_CURE_POISON, HEALBOT_CURE_POISON,
HEALBOT_CURE_DISEASE, HEALBOT_CURE_DISEASE,
}, },
[HEALBOT_MAGE] = {
HEALBOT_REMOVE_LESSER_CURSE,
},
} }
HealBot_Buff_Spells = { HealBot_Buff_Spells = {
@@ -511,6 +558,13 @@ HealBot_Buff_Spells = {
HEALBOT_BLESSING_OF_SALVATION, HEALBOT_BLESSING_OF_SALVATION,
HEALBOT_BLESSING_OF_LIGHT, HEALBOT_BLESSING_OF_LIGHT,
HEALBOT_BLESSING_OF_SANCTUARY, HEALBOT_BLESSING_OF_SANCTUARY,
HEALBOT_GREATER_BLESSING_OF_KINGS,
HEALBOT_GREATER_BLESSING_OF_MIGHT,
HEALBOT_GREATER_BLESSING_OF_WISDOM,
HEALBOT_GREATER_BLESSING_OF_SALVATION,
HEALBOT_GREATER_BLESSING_OF_LIGHT,
HEALBOT_GREATER_BLESSING_OF_SANCTUARY,
HEALBOT_RIGHTEOUS_FURY,
}, },
[HEALBOT_DRUID] = { [HEALBOT_DRUID] = {
HEALBOT_MARK_OF_THE_WILD, HEALBOT_MARK_OF_THE_WILD,
@@ -527,6 +581,7 @@ HealBot_Buff_Spells = {
HEALBOT_PRAYER_OF_SHADOW_PROTECTION, HEALBOT_PRAYER_OF_SHADOW_PROTECTION,
HEALBOT_INNER_FIRE, HEALBOT_INNER_FIRE,
HEALBOT_FEAR_WARD, HEALBOT_FEAR_WARD,
HEALBOT_SHADOWFORM,
HEALBOT_ENLIGHTEN, HEALBOT_ENLIGHTEN,
}, },
[HEALBOT_MAGE] = { [HEALBOT_MAGE] = {
@@ -534,13 +589,63 @@ HealBot_Buff_Spells = {
HEALBOT_ARCANE_BRILLIANCE, HEALBOT_ARCANE_BRILLIANCE,
HEALBOT_DAMPEN_MAGIC, HEALBOT_DAMPEN_MAGIC,
HEALBOT_AMPLIFY_MAGIC, HEALBOT_AMPLIFY_MAGIC,
HEALBOT_FROST_ARMOR,
HEALBOT_ICE_ARMOR,
HEALBOT_MAGE_ARMOR,
HEALBOT_ICE_BARRIER,
}, },
[HEALBOT_SHAMAN] = { [HEALBOT_SHAMAN] = {
HEALBOT_ROCKBITER_WEAPON, HEALBOT_ROCKBITER_WEAPON,
HEALBOT_FLAMETONGUE_WEAPON, HEALBOT_FLAMETONGUE_WEAPON,
HEALBOT_FROSTBRAND_WEAPON, HEALBOT_FROSTBRAND_WEAPON,
HEALBOT_WINDFURY_WEAPON, HEALBOT_WINDFURY_WEAPON,
HEALBOT_LIGHTNING_SHIELD,
HEALBOT_WATER_SHIELD,
HEALBOT_WATER_WALKING,
HEALBOT_WATER_BREATHING,
}, },
[HEALBOT_WARRIOR] = {
HEALBOT_BATTLE_SHOUT,
},
[HEALBOT_WARLOCK] = {
HEALBOT_DEMON_SKIN,
HEALBOT_DEMON_ARMOR,
HEALBOT_UNENDING_BREATH,
HEALBOT_DETECT_LESSER_INVISIBILITY,
HEALBOT_DETECT_INVISIBILITY,
},
[HEALBOT_HUNTER] = {
HEALBOT_TRUESHOT_AURA,
HEALBOT_ASPECT_OF_THE_HAWK,
HEALBOT_ASPECT_OF_THE_MONKEY,
HEALBOT_ASPECT_OF_THE_CHEETAH,
HEALBOT_ASPECT_OF_THE_PACK,
HEALBOT_ASPECT_OF_THE_WILD,
HEALBOT_ASPECT_OF_THE_BEAST,
},
[HEALBOT_ROGUE] = {},
}
HealBot_SelfOnly_Buffs = {
[HEALBOT_DEMON_SKIN] = true,
[HEALBOT_DEMON_ARMOR] = true,
[HEALBOT_ASPECT_OF_THE_HAWK] = true,
[HEALBOT_ASPECT_OF_THE_MONKEY] = true,
[HEALBOT_ASPECT_OF_THE_CHEETAH] = true,
[HEALBOT_ASPECT_OF_THE_BEAST] = true,
[HEALBOT_FROST_ARMOR] = true,
[HEALBOT_ICE_ARMOR] = true,
[HEALBOT_MAGE_ARMOR] = true,
[HEALBOT_ICE_BARRIER] = true,
[HEALBOT_RIGHTEOUS_FURY] = true,
[HEALBOT_INNER_FIRE] = true,
[HEALBOT_SHADOWFORM] = true,
[HEALBOT_LIGHTNING_SHIELD] = true,
[HEALBOT_WATER_SHIELD] = true,
[HEALBOT_ROCKBITER_WEAPON] = true,
[HEALBOT_FLAMETONGUE_WEAPON] = true,
[HEALBOT_FROSTBRAND_WEAPON] = true,
[HEALBOT_WINDFURY_WEAPON] = true,
} }
HealBot_Debuff_Types = { HealBot_Debuff_Types = {
@@ -553,6 +658,7 @@ HealBot_Debuff_Types = {
[HEALBOT_ABOLISH_DISEASE] = {HEALBOT_DISEASE_en}, [HEALBOT_ABOLISH_DISEASE] = {HEALBOT_DISEASE_en},
[HEALBOT_DISPEL_MAGIC..HEALBOT_RANK_1] = {HEALBOT_MAGIC_en}, [HEALBOT_DISPEL_MAGIC..HEALBOT_RANK_1] = {HEALBOT_MAGIC_en},
[HEALBOT_DISPEL_MAGIC..HEALBOT_RANK_2] = {HEALBOT_MAGIC_en}, [HEALBOT_DISPEL_MAGIC..HEALBOT_RANK_2] = {HEALBOT_MAGIC_en},
[HEALBOT_REMOVE_LESSER_CURSE] = {HEALBOT_CURSE_en},
} }
HealBot_IsFighting = false; HealBot_IsFighting = false;
@@ -594,3 +700,36 @@ function HealBot_ReleaseTable(t)
end end
end end
HealBot_TrackedAuras = {
["Renew"] = { texture = "Interface\\Icons\\Spell_Holy_Renew", isDebuff = false, showTimer = true, locKey = "HEALBOT_RENEW" },
["Rejuvenation"] = { texture = "Interface\\Icons\\Spell_Nature_Rejuvenation", isDebuff = false, showTimer = true, locKey = "HEALBOT_REJUVENATION" },
["Regrowth"] = { texture = "Interface\\Icons\\Spell_Nature_ResistNature", isDebuff = false, showTimer = true, locKey = "HEALBOT_REGROWTH" },
["Power Word: Shield"] = { texture = "Interface\\Icons\\Spell_Holy_PowerWordShield", isDebuff = false, showTimer = true, locKey = "HEALBOT_POWER_WORD_SHIELD" },
["Fear Ward"] = { texture = "Interface\\Icons\\Spell_Holy_Excorcism", isDebuff = false, showTimer = true, locKey = "HEALBOT_FEAR_WARD" },
["Abolish Disease"] = { texture = "Interface\\Icons\\Spell_Nature_NullifyDisease",isDebuff = false, showTimer = true, locKey = "HEALBOT_ABOLISH_DISEASE" },
["Abolish Poison"] = { texture = "Interface\\Icons\\Spell_Nature_NullifyPoison", isDebuff = false, showTimer = true, locKey = "HEALBOT_ABOLISH_POISON" },
["Weakened Soul"] = { texture = "Interface\\Icons\\Spell_Holy_AshesToAshes", isDebuff = true, showTimer = true, locKey = "HEALBOT_WEAKENED_SOUL" },
["Blessing of Protection"] = { texture = "Interface\\Icons\\Spell_Holy_SealOfProtection", isDebuff = false, showTimer = false },
["Holy Scriptures"] = { texture = "Interface\\Icons\\btnholyscriptures", isDebuff = false, showTimer = false },
};
HealBot_TrackedAura_Textures = {};
HealBot_TrackedAura_Spells = {};
function HealBot_Init_TrackedAuras()
for spell, info in pairs(HealBot_TrackedAuras) do
info.spell = spell
HealBot_TrackedAura_Textures[info.texture] = info
HealBot_TrackedAura_Spells[spell] = info
if info.locKey then
local locName = getglobal(info.locKey)
if locName and locName ~= "" then
info.locName = locName
HealBot_TrackedAura_Spells[locName] = info
end
end
end
end
HealBot_Init_TrackedAuras();
+155 -12
View File
@@ -47,7 +47,10 @@ HealBot_Model = {
-- Integration maps -- Integration maps
unitGUIDs = {}, -- unit -> GUID unitGUIDs = {}, -- unit -> GUID
guidUnits = {} -- GUID -> unit guidUnits = {}, -- GUID -> unit
-- Delayed resolution queue
unresolvedUnits = {}
} }
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
@@ -87,6 +90,7 @@ end
-- HealBot_Model:Initialize: Pre-allocates the unit state dictionary. -- HealBot_Model:Initialize: Pre-allocates the unit state dictionary.
function HealBot_Model:Initialize() function HealBot_Model:Initialize()
for k in pairs(self.unresolvedUnits) do self.unresolvedUnits[k] = nil end
self:InitUnitState("player") self:InitUnitState("player")
self:InitUnitState("target") self:InitUnitState("target")
self:InitUnitState("pet") self:InitUnitState("pet")
@@ -144,34 +148,172 @@ end
-- Updates base unit info (Name, Class) -- Updates base unit info (Name, Class)
function HealBot_Model:UpdateUnitIdentity(unit) function HealBot_Model:UpdateUnitIdentity(unit)
if not self.units[unit] then return false end if not self.units[unit] or string.find(unit, "^Test") then return false end
local oldName = self.units[unit].name local oldName = self.units[unit].name
local oldEnglishClass = self.units[unit].englishClass local oldEnglishClass = self.units[unit].englishClass
local name = UnitName(unit) local name = UnitName(unit)
local _, englishClass = UnitClass(unit)
-- If UnitName is not ready, attempt raid roster fallback for raid units
if not name or name == "Unknown" then
local _, _, raidIdx = string.find(unit, "^raid(%d+)$")
if raidIdx and GetNumRaidMembers() > 0 then
local rName = GetRaidRosterInfo(tonumber(raidIdx))
if rName and rName ~= "" and rName ~= "Unknown" then
name = rName
end
end
end
-- If name is still nil, retain oldName if unit exists
if not name and oldName and UnitExists(unit) then
name = oldName
end
local englishClass = HealBot_UnitClass(unit)
-- If name is identical, do NOT overwrite an existing valid englishClass with nil
if oldName and name == oldName and not englishClass and oldEnglishClass then
englishClass = oldEnglishClass
end
-- Track unresolved units (unit exists with a name, but missing englishClass)
if name and not englishClass then
self.unresolvedUnits[unit] = true
else
self.unresolvedUnits[unit] = nil
end
if oldName ~= name or oldEnglishClass ~= englishClass 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 if (HealBot_Integrations_SuperWoW_Active or HealBot_Integrations_ClassicAPI_Active or HealBot_Integrations_Nampower_Active) and HealBot_GetUnitGUID then
local guid = HealBot_GetUnitGUID(unit) local guid = HealBot_GetUnitGUID(unit)
if guid and guid ~= "0" and guid ~= "0x0000000000000000" then if guid and guid ~= "0" and guid ~= "0x0000000000000000" then
self.unitGUIDs[unit] = guid self.unitGUIDs[unit] = guid
if unit ~= "target" then
self.guidUnits[guid] = unit self.guidUnits[guid] = unit
end end
end end
end
return true -- Identity changed return true -- Identity changed
end end
return false return false
end end
-- HealBot_Model:PopulateAllGUIDs: Refreshes unit-to-GUID and GUID-to-unit mappings for all current roster units.
function HealBot_Model:PopulateAllGUIDs()
if not (HealBot_Integrations_SuperWoW_Active or HealBot_Integrations_ClassicAPI_Active or HealBot_Integrations_Nampower_Active) or not HealBot_GetUnitGUID then return end
if not HealBot_Nampower_NameCache then HealBot_Nampower_NameCache = HealBot_GetTable() end
local playerGuid = HealBot_GetUnitGUID("player")
if playerGuid and playerGuid ~= "0" and playerGuid ~= "0x0000000000000000" then
local lowerPGuid = string.lower(playerGuid)
self.unitGUIDs["player"] = playerGuid
self.guidUnits[playerGuid] = "player"
self.guidUnits[lowerPGuid] = "player"
HealBot_PlayerGUID = playerGuid
local pName = UnitName("player")
if pName then
HealBot_Nampower_NameCache[playerGuid] = pName
HealBot_Nampower_NameCache[lowerPGuid] = pName
end
end
for _, unit in ipairs(self.partyMembers) do
local guid = HealBot_GetUnitGUID(unit)
if guid and guid ~= "0" and guid ~= "0x0000000000000000" then
local lowerGuid = string.lower(guid)
self.unitGUIDs[unit] = guid
self.guidUnits[guid] = unit
self.guidUnits[lowerGuid] = unit
local uName = UnitName(unit)
if uName then
HealBot_Nampower_NameCache[guid] = uName
HealBot_Nampower_NameCache[lowerGuid] = uName
end
end
end
for _, unit in ipairs(self.raidMembers) do
local guid = HealBot_GetUnitGUID(unit)
if guid and guid ~= "0" and guid ~= "0x0000000000000000" then
local lowerGuid = string.lower(guid)
self.unitGUIDs[unit] = guid
self.guidUnits[guid] = unit
self.guidUnits[lowerGuid] = unit
local uName = UnitName(unit)
if uName then
HealBot_Nampower_NameCache[guid] = uName
HealBot_Nampower_NameCache[lowerGuid] = uName
end
end
end
end
-- HealBot_Model:GetUnitByGUID: Internal utility: HealBot_Model:GetUnitByGUID -- HealBot_Model:GetUnitByGUID: Internal utility: HealBot_Model:GetUnitByGUID
function HealBot_Model:GetUnitByGUID(guid) function HealBot_Model:GetUnitByGUID(guid)
if not guid then return nil end if not guid then return nil end
return self.guidUnits[guid] local unit = self.guidUnits[guid]
if unit and UnitExists(unit) then return unit end
local lowerGuid = string.lower(guid)
unit = self.guidUnits[lowerGuid]
if unit and UnitExists(unit) then return unit end
if HealBot_PlayerGUID and string.lower(HealBot_PlayerGUID) == lowerGuid then
self.guidUnits[guid] = "player"
self.guidUnits[lowerGuid] = "player"
return "player"
end
if HealBot_GetUnitGUID then
local pGuid = HealBot_GetUnitGUID("player")
if pGuid and string.lower(pGuid) == lowerGuid then
self.guidUnits[guid] = "player"
self.guidUnits[lowerGuid] = "player"
HealBot_PlayerGUID = pGuid
return "player"
end
for i = 1, 40 do
local u = "raid" .. i
if UnitExists(u) then
local uGuid = HealBot_GetUnitGUID(u)
if uGuid and string.lower(uGuid) == lowerGuid then
self.guidUnits[guid] = u
self.guidUnits[lowerGuid] = u
self.unitGUIDs[u] = guid
return u
end
end
end
for i = 1, 4 do
local u = "party" .. i
if UnitExists(u) then
local uGuid = HealBot_GetUnitGUID(u)
if uGuid and string.lower(uGuid) == lowerGuid then
self.guidUnits[guid] = u
self.guidUnits[lowerGuid] = u
self.unitGUIDs[u] = guid
return u
end
end
end
if UnitExists("target") then
local tGuid = HealBot_GetUnitGUID("target")
if tGuid and string.lower(tGuid) == lowerGuid then
return "target"
end
end
if UnitExists("mouseover") then
local moGuid = HealBot_GetUnitGUID("mouseover")
if moGuid and string.lower(moGuid) == lowerGuid then
return "mouseover"
end
end
end
return nil
end end
-- HealBot_Model:GetUnitIDByName: Looks up a group unit token by player name. -- HealBot_Model:GetUnitIDByName: Looks up a group unit token by player name.
@@ -185,7 +327,7 @@ end
-- HealBot_Model:PreserveStateByGUID: Preserves icon and debuff state when group indices shift during combat. -- HealBot_Model:PreserveStateByGUID: Preserves icon and debuff state when group indices shift during combat.
function HealBot_Model:PreserveStateByGUID() function HealBot_Model:PreserveStateByGUID()
if not (HealBot_Integrations_SuperWoW_Active or HealBot_Integrations_ClassicAPI_Active) or not HealBot_GetUnitGUID then return end if not (HealBot_Integrations_SuperWoW_Active or HealBot_Integrations_ClassicAPI_Active or HealBot_Integrations_Nampower_Active) or not HealBot_GetUnitGUID then return end
for k in pairs(pool_oldGUIDs) do pool_oldGUIDs[k] = nil end for k in pairs(pool_oldGUIDs) do pool_oldGUIDs[k] = nil end
local oldGUIDs = pool_oldGUIDs local oldGUIDs = pool_oldGUIDs
@@ -245,11 +387,12 @@ function HealBot_Model:PreserveStateByGUID()
for targetUnit, stateData in pairs(stateSwaps) do for targetUnit, stateData in pairs(stateSwaps) do
-- Deep copy to prevent memory aliasing -- Deep copy to prevent memory aliasing
if not self.units[targetUnit] then if not self.units[targetUnit] then
self.units[targetUnit] = { icons = {} } self.units[targetUnit] = HealBot_GetTable()
self.units[targetUnit].icons = HealBot_GetTable()
end end
local targetIcons = self.units[targetUnit].icons local targetIcons = self.units[targetUnit].icons
if not targetIcons then targetIcons = {} end if not targetIcons then targetIcons = HealBot_GetTable() end
for k in pairs(targetIcons) do targetIcons[k] = nil end for k in pairs(targetIcons) do targetIcons[k] = nil end
for k in pairs(self.units[targetUnit]) do self.units[targetUnit][k] = nil end for k in pairs(self.units[targetUnit]) do self.units[targetUnit][k] = nil end
@@ -262,7 +405,7 @@ function HealBot_Model:PreserveStateByGUID()
self.units[targetUnit].icons = targetIcons self.units[targetUnit].icons = targetIcons
if HealBot_UnitIcons and iconSwaps[targetUnit] then if HealBot_UnitIcons and iconSwaps[targetUnit] then
if not HealBot_UnitIcons[targetUnit] then HealBot_UnitIcons[targetUnit] = {} end if not HealBot_UnitIcons[targetUnit] then HealBot_UnitIcons[targetUnit] = HealBot_GetTable() end
for j=1, 10 do for j=1, 10 do
HealBot_UnitIcons[targetUnit][j] = iconSwaps[targetUnit][j] HealBot_UnitIcons[targetUnit][j] = iconSwaps[targetUnit][j]
end end
@@ -278,7 +421,7 @@ 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] or string.find(unit, "^Test") then return false end
local oldHealth = self.units[unit].health local oldHealth = self.units[unit].health
local oldMax = self.units[unit].maxHealth local oldMax = self.units[unit].maxHealth
@@ -297,7 +440,7 @@ end
-- Updates power values (mana, rage, energy). Returns true if changed. -- Updates power values (mana, rage, energy). Returns true if changed.
function HealBot_Model:UpdateUnitPower(unit) function HealBot_Model:UpdateUnitPower(unit)
if not self.units[unit] then return false end if not self.units[unit] or string.find(unit, "^Test") then return false end
local oldMana = self.units[unit].mana local oldMana = self.units[unit].mana
local oldMax = self.units[unit].maxMana local oldMax = self.units[unit].maxMana
@@ -319,7 +462,7 @@ end
-- Updates status flags (Dead, Ghost, Offline). Returns true if changed. -- Updates status flags (Dead, Ghost, Offline). Returns true if changed.
function HealBot_Model:UpdateUnitStatus(unit) function HealBot_Model:UpdateUnitStatus(unit)
if not self.units[unit] then return false end if not self.units[unit] or string.find(unit, "^Test") then return false end
local oldDead = self.units[unit].isDead local oldDead = self.units[unit].isDead
local oldGhost = self.units[unit].isGhost local oldGhost = self.units[unit].isGhost
@@ -202,6 +202,30 @@ function HealBot_Returned_Colours()
HealBot_Config.babortcolg[HealBot_Config.Current_Skin], HealBot_Config.babortcolg[HealBot_Config.Current_Skin],
HealBot_Config.babortcolb[HealBot_Config.Current_Skin] = ColorPickerFrame:GetColorRGB(); HealBot_Config.babortcolb[HealBot_Config.Current_Skin] = ColorPickerFrame:GetColorRGB();
HealBot_Config.babortcola[HealBot_Config.Current_Skin] = A; HealBot_Config.babortcola[HealBot_Config.Current_Skin] = A;
elseif HealBot_ColourObjWaiting=="MaxHP" then
if not HealBot_Config.bcolormaxr then HealBot_Config.bcolormaxr = {} end
if not HealBot_Config.bcolormaxg then HealBot_Config.bcolormaxg = {} end
if not HealBot_Config.bcolormaxb then HealBot_Config.bcolormaxb = {} end
HealBot_Config.bcolormaxr[HealBot_Config.Current_Skin],
HealBot_Config.bcolormaxg[HealBot_Config.Current_Skin],
HealBot_Config.bcolormaxb[HealBot_Config.Current_Skin] = ColorPickerFrame:GetColorRGB();
elseif HealBot_ColourObjWaiting=="MinHP" then
if not HealBot_Config.bcolorminr then HealBot_Config.bcolorminr = {} end
if not HealBot_Config.bcolorming then HealBot_Config.bcolorming = {} end
if not HealBot_Config.bcolorminb then HealBot_Config.bcolorminb = {} end
HealBot_Config.bcolorminr[HealBot_Config.Current_Skin],
HealBot_Config.bcolorming[HealBot_Config.Current_Skin],
HealBot_Config.bcolorminb[HealBot_Config.Current_Skin] = ColorPickerFrame:GetColorRGB();
elseif HealBot_ColourObjWaiting=="BarFrame" then
if not HealBot_Config.bframecolr then HealBot_Config.bframecolr = {} end
if not HealBot_Config.bframecolg then HealBot_Config.bframecolg = {} end
if not HealBot_Config.bframecolb then HealBot_Config.bframecolb = {} end
if not HealBot_Config.bframecola then HealBot_Config.bframecola = {} end
HealBot_Config.bframecolr[HealBot_Config.Current_Skin],
HealBot_Config.bframecolg[HealBot_Config.Current_Skin],
HealBot_Config.bframecolb[HealBot_Config.Current_Skin] = ColorPickerFrame:GetColorRGB();
HealBot_Config.bframecola[HealBot_Config.Current_Skin] = A;
HealBot_Action_ResetSkin()
else else
HealBot_Config.CDCBarColour[HealBot_ColourObjWaiting].R, HealBot_Config.CDCBarColour[HealBot_ColourObjWaiting].R,
HealBot_Config.CDCBarColour[HealBot_ColourObjWaiting].G, HealBot_Config.CDCBarColour[HealBot_ColourObjWaiting].G,
@@ -210,13 +234,18 @@ function HealBot_Returned_Colours()
HealBot_SetSkinColours() HealBot_SetSkinColours()
HealBot_SetCDCBarColours() HealBot_SetCDCBarColours()
end end
ColorPickerFrame.func = HealBot_Returned_Colours
-- HealBot_UseColourPick: Internal utility: HealBot_UseColourPick -- HealBot_UseColourPick: Internal utility: HealBot_UseColourPick
function HealBot_UseColourPick(R, G, B, A) function HealBot_UseColourPick(R, G, B, A)
ColorPickerFrame.func = HealBot_Returned_Colours;
ColorPickerFrame.cancelFunc = HealBot_Returned_Colours;
if ColorPickerFrame:IsVisible() then if ColorPickerFrame:IsVisible() then
ColorPickerFrame:Hide(); ColorPickerFrame:Hide();
elseif A then elseif A then
ColorPickerFrame.hasOpacity = true; ColorPickerFrame.hasOpacity = true;
ColorPickerFrame.opacity = A; ColorPickerFrame.opacity = A;
ColorPickerFrame.opacityFunc = HealBot_Returned_Colours;
ColorPickerFrame:ClearAllPoints(); ColorPickerFrame:ClearAllPoints();
ColorPickerFrame:SetPoint("TOPLEFT","HealBot_Options","TOPRIGHT",0,-152); ColorPickerFrame:SetPoint("TOPLEFT","HealBot_Options","TOPRIGHT",0,-152);
ColorPickerFrame:Show(); ColorPickerFrame:Show();
@@ -224,6 +253,7 @@ function HealBot_UseColourPick(R, G, B, A)
ColorPickerFrame:SetColorRGB(R, G, B); ColorPickerFrame:SetColorRGB(R, G, B);
else else
ColorPickerFrame.hasOpacity = false; ColorPickerFrame.hasOpacity = false;
ColorPickerFrame.opacityFunc = nil;
ColorPickerFrame:ClearAllPoints(); ColorPickerFrame:ClearAllPoints();
ColorPickerFrame:SetPoint("TOPLEFT","HealBot_Options","TOPRIGHT",0,-152); ColorPickerFrame:SetPoint("TOPLEFT","HealBot_Options","TOPRIGHT",0,-152);
ColorPickerFrame:Show(); ColorPickerFrame:Show();
@@ -321,6 +351,7 @@ function HealBot_Options_OnShow(this)
HealBot_Options_CDCButRight_Refresh() HealBot_Options_CDCButRight_Refresh()
HealBot_SetCDCBarColours() HealBot_SetCDCBarColours()
HealBot_Options_CDCMonitor_Refresh() HealBot_Options_CDCMonitor_Refresh()
HealBot_Options_CDCOverlay_Refresh()
HealBot_ComboButtons_Button_OnClick(nil,HealBot_Options_ComboButtons_Button); HealBot_ComboButtons_Button_OnClick(nil,HealBot_Options_ComboButtons_Button);
HealBot_Options_EnableHealthy:SetChecked(HealBot_Config.EnableHealthy); HealBot_Options_EnableHealthy:SetChecked(HealBot_Config.EnableHealthy);
HealBot_Options_NewSkinb:Disable(); HealBot_Options_NewSkinb:Disable();
@@ -342,12 +373,37 @@ function HealBot_Options_SetSkins()
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_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) local orient = (HealBot_Config.GridOrientation and HealBot_Config.GridOrientation[HealBot_Config.Current_Skin]) or 1
UIDropDownMenu_SetSelectedID(HealBot_Options_GridOrientation_Dropdown, orient)
if orient == 2 then
HealBot_Options_GridOrientation_DropdownText:SetText("Horizontal (Rows)")
HealBot_Options_BarMaxRowsS:Hide()
HealBot_Options_BarNumColsS:Show()
else
HealBot_Options_GridOrientation_DropdownText:SetText("Vertical (Columns)")
HealBot_Options_BarMaxRowsS:Show()
HealBot_Options_BarNumColsS:Hide()
end
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)
HealBot_Options_BorderThicknessS:SetValue((HealBot_Config.bboffset and HealBot_Config.bboffset[HealBot_Config.Current_Skin]) or 1) HealBot_Options_BorderThicknessS:SetValue((HealBot_Config.bboffset and HealBot_Config.bboffset[HealBot_Config.Current_Skin]) or 1)
HealBot_Options_FontHeight:SetValue(HealBot_Config.btextheight[HealBot_Config.Current_Skin]) HealBot_Options_FontHeight:SetValue(HealBot_Config.btextheight[HealBot_Config.Current_Skin])
local fontFile = (HealBot_Config.bfont and HealBot_Config.bfont[HealBot_Config.Current_Skin]) or "Fonts\\FRIZQT__.TTF"
local fontName = "Friz Quadrata"
if HealBot_Font_List then
for i = 1, getn(HealBot_Font_List) do
if HealBot_Font_List[i].file == fontFile then
fontName = HealBot_Font_List[i].text
UIDropDownMenu_SetSelectedID(HealBot_Options_Font_Dropdown, i)
break
end
end
end
if HealBot_Options_Font_DropdownText then
HealBot_Options_Font_DropdownText:SetText(fontName)
end
HealBot_Options_BarAlphaDis:SetValue(HealBot_Config.bardisa[HealBot_Config.Current_Skin]) HealBot_Options_BarAlphaDis:SetValue(HealBot_Config.bardisa[HealBot_Config.Current_Skin])
HealBot_Options_AbortBarSize:SetValue(HealBot_Config.abortsize[HealBot_Config.Current_Skin]) HealBot_Options_AbortBarSize:SetValue(HealBot_Config.abortsize[HealBot_Config.Current_Skin])
local isShowHeaders = (HealBot_Config.ShowHeader[HealBot_Config.Current_Skin] == 1) local isShowHeaders = (HealBot_Config.ShowHeader[HealBot_Config.Current_Skin] == 1)
@@ -362,6 +418,16 @@ function HealBot_Options_SetSkins()
local is1pxBorder = (HealBot_Config.bborder[HealBot_Config.Current_Skin] == 1) local is1pxBorder = (HealBot_Config.bborder[HealBot_Config.Current_Skin] == 1)
HealBot_Options_1pxBorders:SetChecked(is1pxBorder and 1 or nil) HealBot_Options_1pxBorders:SetChecked(is1pxBorder and 1 or nil)
local isBarFrame = (HealBot_Config.bframe and HealBot_Config.bframe[HealBot_Config.Current_Skin] == 1)
HealBot_Options_BarFrame:SetChecked(isBarFrame and 1 or nil)
local frameWidth = (HealBot_Config.bframewidth and HealBot_Config.bframewidth[HealBot_Config.Current_Skin]) or 10
HealBot_Options_BarFrameWidthS:SetValue(frameWidth)
if HealBot_Options_Skins_ScrollFrame then
HealBot_Options_Skins_ScrollFrame:UpdateScrollChildRect()
end
HealBot_SetSkinColours() HealBot_SetSkinColours()
if HealBot_Config.Current_Skin==HEALBOT_SKINS_STD then if HealBot_Config.Current_Skin==HEALBOT_SKINS_STD then
HealBot_Options_DeleteSkin:Disable(); HealBot_Options_DeleteSkin:Disable();
@@ -8,7 +8,7 @@
<Anchors> <Anchors>
<Anchor point="TOPLEFT"> <Anchor point="TOPLEFT">
<Offset> <Offset>
<AbsDimension x="25" y="-30" /> <AbsDimension x="170" y="-30"/>
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -28,15 +28,15 @@
<FontString name="$parentLabel" text="Solo Skin:" inherits="GameFontNormalSmall"> <FontString name="$parentLabel" text="Solo Skin:" inherits="GameFontNormalSmall">
<Anchors> <Anchors>
<Anchor point="TOPLEFT"> <Anchor point="TOPLEFT">
<Offset><AbsDimension x="-10" y="15" /></Offset> <Offset><AbsDimension x="-10" y="15"/></Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
</FontString> </FontString>
</Layer> </Layer>
</Layers> </Layers>
<Anchors> <Anchors>
<Anchor point="TOPLEFT"> <Anchor point="TOPLEFT" relativeTo="HealBot_Options_AutoSwap" relativePoint="BOTTOMLEFT">
<Offset><AbsDimension x="30" y="-80" /></Offset> <Offset><AbsDimension x="0" y="-25"/></Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
<Scripts> <Scripts>
@@ -52,15 +52,15 @@
<FontString name="$parentLabel" text="Party Skin:" inherits="GameFontNormalSmall"> <FontString name="$parentLabel" text="Party Skin:" inherits="GameFontNormalSmall">
<Anchors> <Anchors>
<Anchor point="TOPLEFT"> <Anchor point="TOPLEFT">
<Offset><AbsDimension x="-10" y="15" /></Offset> <Offset><AbsDimension x="-10" y="15"/></Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
</FontString> </FontString>
</Layer> </Layer>
</Layers> </Layers>
<Anchors> <Anchors>
<Anchor point="TOPLEFT"> <Anchor point="TOPLEFT" relativeTo="HealBot_Options_Auto_Solo" relativePoint="BOTTOMLEFT">
<Offset><AbsDimension x="30" y="-130" /></Offset> <Offset><AbsDimension x="0" y="-25"/></Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
<Scripts> <Scripts>
@@ -76,15 +76,15 @@
<FontString name="$parentLabel" text="Raid 15 Skin:" inherits="GameFontNormalSmall"> <FontString name="$parentLabel" text="Raid 15 Skin:" inherits="GameFontNormalSmall">
<Anchors> <Anchors>
<Anchor point="TOPLEFT"> <Anchor point="TOPLEFT">
<Offset><AbsDimension x="-10" y="15" /></Offset> <Offset><AbsDimension x="-10" y="15"/></Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
</FontString> </FontString>
</Layer> </Layer>
</Layers> </Layers>
<Anchors> <Anchors>
<Anchor point="TOPLEFT"> <Anchor point="TOPLEFT" relativeTo="HealBot_Options_Auto_Party" relativePoint="BOTTOMLEFT">
<Offset><AbsDimension x="30" y="-180" /></Offset> <Offset><AbsDimension x="0" y="-25"/></Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
<Scripts> <Scripts>
@@ -100,15 +100,15 @@
<FontString name="$parentLabel" text="Raid 25 Skin:" inherits="GameFontNormalSmall"> <FontString name="$parentLabel" text="Raid 25 Skin:" inherits="GameFontNormalSmall">
<Anchors> <Anchors>
<Anchor point="TOPLEFT"> <Anchor point="TOPLEFT">
<Offset><AbsDimension x="-10" y="15" /></Offset> <Offset><AbsDimension x="-10" y="15"/></Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
</FontString> </FontString>
</Layer> </Layer>
</Layers> </Layers>
<Anchors> <Anchors>
<Anchor point="TOPLEFT"> <Anchor point="TOPLEFT" relativeTo="HealBot_Options_Auto_Raid15" relativePoint="BOTTOMLEFT">
<Offset><AbsDimension x="30" y="-230" /></Offset> <Offset><AbsDimension x="0" y="-25"/></Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
<Scripts> <Scripts>
@@ -124,15 +124,15 @@
<FontString name="$parentLabel" text="Raid 40 Skin:" inherits="GameFontNormalSmall"> <FontString name="$parentLabel" text="Raid 40 Skin:" inherits="GameFontNormalSmall">
<Anchors> <Anchors>
<Anchor point="TOPLEFT"> <Anchor point="TOPLEFT">
<Offset><AbsDimension x="-10" y="15" /></Offset> <Offset><AbsDimension x="-10" y="15"/></Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
</FontString> </FontString>
</Layer> </Layer>
</Layers> </Layers>
<Anchors> <Anchors>
<Anchor point="TOPLEFT"> <Anchor point="TOPLEFT" relativeTo="HealBot_Options_Auto_Raid25" relativePoint="BOTTOMLEFT">
<Offset><AbsDimension x="30" y="-280" /></Offset> <Offset><AbsDimension x="0" y="-25"/></Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
<Scripts> <Scripts>
@@ -141,7 +141,6 @@
</OnLoad> </OnLoad>
</Scripts> </Scripts>
</Frame> </Frame>
</Frames> </Frames>
<Scripts> <Scripts>
<OnShow> <OnShow>
@@ -111,6 +111,11 @@ function HealBot_Options_SetBuffs()
local val = HealBot_Config.BuffDropDowns[myClass][i] or 0 local val = HealBot_Config.BuffDropDowns[myClass][i] or 0
UIDropDownMenu_Initialize(dropDown, HealBot_Options_Buff_Initialize) UIDropDownMenu_Initialize(dropDown, HealBot_Options_Buff_Initialize)
HealBot_UIDropDownMenu_SetSelectedID(dropDown, val + 1) HealBot_UIDropDownMenu_SetSelectedID(dropDown, val + 1)
local text = "None"
if val > 0 and HealBot_Buff_Spells[myClass] and HealBot_Buff_Spells[myClass][val] then
text = HealBot_Buff_Spells[myClass][val]
end
UIDropDownMenu_SetText(text, dropDown)
end end
local selfCheck = getglobal("HealBot_Options_Buff" .. i .. "Self") local selfCheck = getglobal("HealBot_Options_Buff" .. i .. "Self")
+365
View File
@@ -0,0 +1,365 @@
<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_Buffs.lua" />
<Frame name="HealBot_Options_Panel6" parent="HealBot_Options" hidden="true" setAllPoints="true">
<Frames>
<Frame name="HealBot_Options_BuffFrame">
<Size>
<AbsDimension y="330"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="50" y="-30"/>
</Offset>
</Anchor>
<Anchor point="TOPRIGHT">
<Offset>
<AbsDimension x="-50" y="-30"/>
</Offset>
</Anchor>
</Anchors>
<Layers>
<Layer level="BACKGROUND">
<FontString name="HealBot_BuffPanel_Text" text="Buff Settings" inherits="GameFontNormalSmall">
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="15" y="10"/>
</Offset>
</Anchor>
</Anchors>
</FontString>
</Layer>
</Layers>
</Frame>
<CheckButton name="HealBot_Options_BuffWatch" inherits="OptionsCheckButtonTemplate">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_BuffFrame" relativePoint="TOPLEFT">
<Offset>
<AbsDimension x="15" y="-10"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_WarningSound_OnLoad(this,HEALBOT_OPTIONS_BUFFWATCH)</OnLoad>
<OnClick>HealBot_Options_BuffWatch_OnClick(this)</OnClick>
</Scripts>
</CheckButton>
<CheckButton name="HealBot_Options_BuffWatchInCombat" inherits="OptionsCheckButtonTemplate">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_BuffWatch" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="0" y="-4"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_WarningSound_OnLoad(this,HEALBOT_OPTIONS_BUFFWATCHINCOMBAT)</OnLoad>
<OnClick>HealBot_Options_BuffWatchInCombat_OnClick(this)</OnClick>
</Scripts>
</CheckButton>
<!-- Column 1 (Buffs 1-4) -->
<Frame name="HealBot_Options_Buff1" inherits="UIDropDownMenuTemplate" id="1">
<Layers>
<Layer level="BACKGROUND">
<FontString name="HealBot_Options_Buff1Text" text="HEALBOT_OPTIONS_BUFF1" inherits="GameFontNormalSmall">
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="-10" y="15"/>
</Offset>
</Anchor>
</Anchors>
</FontString>
</Layer>
</Layers>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_BuffWatchInCombat" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="-5" y="-30"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_Buff_OnLoad(this)</OnLoad>
</Scripts>
</Frame>
<CheckButton name="HealBot_Options_Buff1Self" inherits="UICheckButtonTemplate" id="1">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_Buff1" relativePoint="TOPLEFT">
<Offset><AbsDimension x="145" y="8"/></Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_BuffSelf_OnLoad(this)</OnLoad>
<OnClick>HealBot_Options_BuffSelf_OnClick(this)</OnClick>
</Scripts>
</CheckButton>
<Frame name="HealBot_Options_Buff2" inherits="UIDropDownMenuTemplate" id="2">
<Layers>
<Layer level="BACKGROUND">
<FontString name="HealBot_Options_Buff2Text" text="HEALBOT_OPTIONS_BUFF2" inherits="GameFontNormalSmall">
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="-10" y="15"/>
</Offset>
</Anchor>
</Anchors>
</FontString>
</Layer>
</Layers>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_Buff1" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="0" y="-28"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_Buff_OnLoad(this)</OnLoad>
</Scripts>
</Frame>
<CheckButton name="HealBot_Options_Buff2Self" inherits="UICheckButtonTemplate" id="2">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_Buff2" relativePoint="TOPLEFT">
<Offset><AbsDimension x="145" y="8"/></Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_BuffSelf_OnLoad(this)</OnLoad>
<OnClick>HealBot_Options_BuffSelf_OnClick(this)</OnClick>
</Scripts>
</CheckButton>
<Frame name="HealBot_Options_Buff3" inherits="UIDropDownMenuTemplate" id="3">
<Layers>
<Layer level="BACKGROUND">
<FontString name="HealBot_Options_Buff3Text" text="HEALBOT_OPTIONS_BUFF3" inherits="GameFontNormalSmall">
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="-10" y="15"/>
</Offset>
</Anchor>
</Anchors>
</FontString>
</Layer>
</Layers>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_Buff2" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="0" y="-28"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_Buff_OnLoad(this)</OnLoad>
</Scripts>
</Frame>
<CheckButton name="HealBot_Options_Buff3Self" inherits="UICheckButtonTemplate" id="3">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_Buff3" relativePoint="TOPLEFT">
<Offset><AbsDimension x="145" y="8"/></Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_BuffSelf_OnLoad(this)</OnLoad>
<OnClick>HealBot_Options_BuffSelf_OnClick(this)</OnClick>
</Scripts>
</CheckButton>
<Frame name="HealBot_Options_Buff4" inherits="UIDropDownMenuTemplate" id="4">
<Layers>
<Layer level="BACKGROUND">
<FontString name="HealBot_Options_Buff4Text" text="HEALBOT_OPTIONS_BUFF4" inherits="GameFontNormalSmall">
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="-10" y="15"/>
</Offset>
</Anchor>
</Anchors>
</FontString>
</Layer>
</Layers>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_Buff3" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="0" y="-28"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_Buff_OnLoad(this)</OnLoad>
</Scripts>
</Frame>
<CheckButton name="HealBot_Options_Buff4Self" inherits="UICheckButtonTemplate" id="4">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_Buff4" relativePoint="TOPLEFT">
<Offset><AbsDimension x="145" y="8"/></Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_BuffSelf_OnLoad(this)</OnLoad>
<OnClick>HealBot_Options_BuffSelf_OnClick(this)</OnClick>
</Scripts>
</CheckButton>
<!-- Column 2 (Buffs 5-8, anchored relative to Buff 1) -->
<Frame name="HealBot_Options_Buff5" inherits="UIDropDownMenuTemplate" id="5">
<Layers>
<Layer level="BACKGROUND">
<FontString name="HealBot_Options_Buff5Text" text="HEALBOT_OPTIONS_BUFF5" inherits="GameFontNormalSmall">
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="-10" y="15"/>
</Offset>
</Anchor>
</Anchors>
</FontString>
</Layer>
</Layers>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_Buff1" relativePoint="TOPRIGHT">
<Offset>
<AbsDimension x="60" y="0"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_Buff_OnLoad(this)</OnLoad>
</Scripts>
</Frame>
<CheckButton name="HealBot_Options_Buff5Self" inherits="UICheckButtonTemplate" id="5">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_Buff5" relativePoint="TOPLEFT">
<Offset><AbsDimension x="145" y="8"/></Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_BuffSelf_OnLoad(this)</OnLoad>
<OnClick>HealBot_Options_BuffSelf_OnClick(this)</OnClick>
</Scripts>
</CheckButton>
<Frame name="HealBot_Options_Buff6" inherits="UIDropDownMenuTemplate" id="6">
<Layers>
<Layer level="BACKGROUND">
<FontString name="HealBot_Options_Buff6Text" text="HEALBOT_OPTIONS_BUFF6" inherits="GameFontNormalSmall">
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="-10" y="15"/>
</Offset>
</Anchor>
</Anchors>
</FontString>
</Layer>
</Layers>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_Buff5" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="0" y="-28"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_Buff_OnLoad(this)</OnLoad>
</Scripts>
</Frame>
<CheckButton name="HealBot_Options_Buff6Self" inherits="UICheckButtonTemplate" id="6">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_Buff6" relativePoint="TOPLEFT">
<Offset><AbsDimension x="145" y="8"/></Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_BuffSelf_OnLoad(this)</OnLoad>
<OnClick>HealBot_Options_BuffSelf_OnClick(this)</OnClick>
</Scripts>
</CheckButton>
<Frame name="HealBot_Options_Buff7" inherits="UIDropDownMenuTemplate" id="7">
<Layers>
<Layer level="BACKGROUND">
<FontString name="HealBot_Options_Buff7Text" text="HEALBOT_OPTIONS_BUFF7" inherits="GameFontNormalSmall">
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="-10" y="15"/>
</Offset>
</Anchor>
</Anchors>
</FontString>
</Layer>
</Layers>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_Buff6" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="0" y="-28"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_Buff_OnLoad(this)</OnLoad>
</Scripts>
</Frame>
<CheckButton name="HealBot_Options_Buff7Self" inherits="UICheckButtonTemplate" id="7">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_Buff7" relativePoint="TOPLEFT">
<Offset><AbsDimension x="145" y="8"/></Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_BuffSelf_OnLoad(this)</OnLoad>
<OnClick>HealBot_Options_BuffSelf_OnClick(this)</OnClick>
</Scripts>
</CheckButton>
<Frame name="HealBot_Options_Buff8" inherits="UIDropDownMenuTemplate" id="8">
<Layers>
<Layer level="BACKGROUND">
<FontString name="HealBot_Options_Buff8Text" text="HEALBOT_OPTIONS_BUFF8" inherits="GameFontNormalSmall">
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="-10" y="15"/>
</Offset>
</Anchor>
</Anchors>
</FontString>
</Layer>
</Layers>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_Buff7" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="0" y="-28"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_Buff_OnLoad(this)</OnLoad>
</Scripts>
</Frame>
<CheckButton name="HealBot_Options_Buff8Self" inherits="UICheckButtonTemplate" id="8">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_Buff8" relativePoint="TOPLEFT">
<Offset><AbsDimension x="145" y="8"/></Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_BuffSelf_OnLoad(this)</OnLoad>
<OnClick>HealBot_Options_BuffSelf_OnClick(this)</OnClick>
</Scripts>
</CheckButton>
</Frames>
</Frame>
</Ui>
@@ -43,6 +43,52 @@ function HealBot_WarningSound_OnClick(this,id)
end end
end end
end end
-- HealBot_Options_CDCOverlay_DropDown: UI handler for DropDown options panel.
function HealBot_Options_CDCOverlay_DropDown()
local list = {
HEALBOT_OPTIONS_CDCOVERLAY_BAR or "Whole Bar",
HEALBOT_OPTIONS_CDCOVERLAY_FRAME or "Frame / Border",
HEALBOT_OPTIONS_CDCOVERLAY_GLOW or "Glow Effect",
HEALBOT_OPTIONS_CDCOVERLAY_GLOWFRAME or "Glow + Frame",
HEALBOT_OPTIONS_CDCOVERLAY_ANIMATED or "Animated",
HEALBOT_OPTIONS_CDCOVERLAY_ANIMFRAME or "Animated + Frame",
HEALBOT_OPTIONS_CDCOVERLAY_NONE or "Disabled",
};
for i=1, getn(list), 1 do
local info = {};
info.text = list[i];
info.func = HealBot_Options_CDCOverlay_OnSelect;
UIDropDownMenu_AddButton(info);
end
end
-- HealBot_Options_CDCOverlay_Initialize: UI handler for Initialize options panel.
function HealBot_Options_CDCOverlay_Initialize()
UIDropDownMenu_Initialize(HealBot_Options_CDCOverlay, HealBot_Options_CDCOverlay_DropDown)
end
-- HealBot_Options_CDCOverlay_Refresh: UI handler for Refresh options panel.
function HealBot_Options_CDCOverlay_Refresh(onselect)
if not HealBot_Config.CDCOverlay then HealBot_Config.CDCOverlay = 1 end
if not onselect then HealBot_Options_CDCOverlay_Initialize() end
HealBot_UIDropDownMenu_SetSelectedID(HealBot_Options_CDCOverlay, HealBot_Config.CDCOverlay)
end
-- HealBot_Options_CDCOverlay_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_CDCOverlay_OnLoad()
UIDropDownMenu_Initialize(this, HealBot_Options_CDCOverlay_DropDown)
UIDropDownMenu_SetWidth(120, this)
end
-- HealBot_Options_CDCOverlay_OnSelect: UI handler for OnSelect options panel.
function HealBot_Options_CDCOverlay_OnSelect()
HealBot_Config.CDCOverlay = this:GetID()
HealBot_Options_CDCOverlay_Refresh(true)
if HealBot_Action_EnableButtons then
HealBot_Action_EnableButtons()
end
end
-- HealBot_Options_CDCMonitor_DropDown: UI handler for DropDown options panel. -- 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
@@ -168,14 +214,13 @@ end
-- HealBot_Options_CDCButLeft_DropDown: UI handler for DropDown options panel. -- 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")
if classEN=="PRIEST" or classEN=="DRUID" or classEN=="PALADIN" or classEN=="SHAMAN" then
local class=UnitClass("Player");
local DebuffSpells_List = HealBot_Options_GetDebuffSpells_List(class)
local info = {}; local info = {};
info.text = "None"; info.text = "None";
info.func = HealBot_Options_CDCButLeft_OnSelect; info.func = HealBot_Options_CDCButLeft_OnSelect;
UIDropDownMenu_AddButton(info); UIDropDownMenu_AddButton(info);
local class = UnitClass("Player");
local DebuffSpells_List = HealBot_Options_GetDebuffSpells_List(class);
if DebuffSpells_List then
for i=1, getn(DebuffSpells_List), 1 do for i=1, getn(DebuffSpells_List), 1 do
local spell=HealBot_GetSpellName(HealBot_GetSpellId(DebuffSpells_List[i])); local spell=HealBot_GetSpellName(HealBot_GetSpellId(DebuffSpells_List[i]));
if spell then if spell then
@@ -189,14 +234,13 @@ function HealBot_Options_CDCButLeft_DropDown()
end end
-- HealBot_Options_CDCButRight_DropDown: UI handler for DropDown options panel. -- 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")
if classEN=="PRIEST" or classEN=="DRUID" or classEN=="PALADIN" or classEN=="SHAMAN" then
local class=UnitClass("Player");
local DebuffSpells_List = HealBot_Options_GetDebuffSpells_List(class)
local info = {}; local info = {};
info.text = "None"; info.text = "None";
info.func = HealBot_Options_CDCButRight_OnSelect; info.func = HealBot_Options_CDCButRight_OnSelect;
UIDropDownMenu_AddButton(info); UIDropDownMenu_AddButton(info);
local class = UnitClass("Player");
local DebuffSpells_List = HealBot_Options_GetDebuffSpells_List(class);
if DebuffSpells_List then
for i=1, getn(DebuffSpells_List), 1 do for i=1, getn(DebuffSpells_List), 1 do
local spell=HealBot_GetSpellName(HealBot_GetSpellId(DebuffSpells_List[i])); local spell=HealBot_GetSpellName(HealBot_GetSpellId(DebuffSpells_List[i]));
if spell then if spell then
@@ -218,19 +262,49 @@ function HealBot_Options_CDCButRight_Initialize()
end end
-- HealBot_Options_CDCButLeft_Refresh: UI handler for Refresh options panel. -- 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");
local DebuffSpells_List = HealBot_Options_GetDebuffSpells_List(class);
if not onselect then HealBot_Options_CDCButLeft_Initialize() end if not onselect then HealBot_Options_CDCButLeft_Initialize() end
set_id = HealBot_Config.Debuff_Left[class]; if DebuffSpells_List and getn(DebuffSpells_List) > 0 then
HealBot_UIDropDownMenu_SetSelectedID(HealBot_Options_CDCButLeft,set_id) set_id = HealBot_Config.Debuff_Left[class] or 1;
getglobal("HealBot_Options_CDCButLeftButton"):Enable();
getglobal("HealBot_Options_CDCButLeftText"):SetTextColor(1.0, 1.0, 1.0);
HealBot_UIDropDownMenu_SetSelectedID(HealBot_Options_CDCButLeft, set_id);
if set_id == 1 then
UIDropDownMenu_SetText("None", HealBot_Options_CDCButLeft);
end
else
set_id = 1;
HealBot_Config.Debuff_Left[class] = 1;
HealBot_Config.CDCLeftText[class] = "None";
getglobal("HealBot_Options_CDCButLeftButton"):Disable();
getglobal("HealBot_Options_CDCButLeftText"):SetTextColor(0.5, 0.5, 0.5);
UIDropDownMenu_SetText("None", HealBot_Options_CDCButLeft);
end
end end
-- HealBot_Options_CDCButRight_Refresh: UI handler for Refresh options panel. -- 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 = 1;
local class=UnitClass("Player"); local class = UnitClass("Player");
local DebuffSpells_List = HealBot_Options_GetDebuffSpells_List(class);
if not onselect then HealBot_Options_CDCButRight_Initialize() end if not onselect then HealBot_Options_CDCButRight_Initialize() end
set_id = HealBot_Config.Debuff_Right[class]; if DebuffSpells_List and getn(DebuffSpells_List) > 0 then
HealBot_UIDropDownMenu_SetSelectedID(HealBot_Options_CDCButRight,set_id) set_id = HealBot_Config.Debuff_Right[class] or 1;
getglobal("HealBot_Options_CDCButRightButton"):Enable();
getglobal("HealBot_Options_CDCButRightText"):SetTextColor(1.0, 1.0, 1.0);
HealBot_UIDropDownMenu_SetSelectedID(HealBot_Options_CDCButRight, set_id);
if set_id == 1 then
UIDropDownMenu_SetText("None", HealBot_Options_CDCButRight);
end
else
set_id = 1;
HealBot_Config.Debuff_Right[class] = 1;
HealBot_Config.CDCRightText[class] = "None";
getglobal("HealBot_Options_CDCButRightButton"):Disable();
getglobal("HealBot_Options_CDCButRightText"):SetTextColor(0.5, 0.5, 0.5);
UIDropDownMenu_SetText("None", HealBot_Options_CDCButRight);
end
end end
-- HealBot_Options_CDCButLeft_OnLoad: UI handler for OnLoad options panel. -- HealBot_Options_CDCButLeft_OnLoad: UI handler for OnLoad options panel.
function HealBot_Options_CDCButLeft_OnLoad() function HealBot_Options_CDCButLeft_OnLoad()
@@ -275,7 +349,7 @@ end
-- HealBot_Options_Debuff_Reset: Restores default debuff tracking options. -- 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" or classEN=="MAGE" then
HealBot_DebuffWatch = {[HEALBOT_DISEASE_en]=false, [HEALBOT_MAGIC_en]=false, [HEALBOT_POISON_en]=false, [HEALBOT_CURSE_en]=false } 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 -- Automatically track all curable debuffs out of the box
@@ -292,6 +366,8 @@ function HealBot_Options_Debuff_Reset()
elseif classEN == "SHAMAN" then elseif classEN == "SHAMAN" then
HealBot_DebuffWatch[HEALBOT_POISON_en] = true HealBot_DebuffWatch[HEALBOT_POISON_en] = true
HealBot_DebuffWatch[HEALBOT_DISEASE_en] = true HealBot_DebuffWatch[HEALBOT_DISEASE_en] = true
elseif classEN == "MAGE" then
HealBot_DebuffWatch[HEALBOT_CURSE_en] = true
end end
local spell = HealBot_Config.CDCLeftText[UnitClass("player")]; local spell = HealBot_Config.CDCLeftText[UnitClass("player")];
@@ -9,7 +9,7 @@
<Anchors> <Anchors>
<Anchor point="TOP"> <Anchor point="TOP">
<Offset> <Offset>
<AbsDimension x="-20" y="-30" /> <AbsDimension x="40" y="-30" />
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -45,13 +45,7 @@
</Scripts> </Scripts>
</CheckButton> </CheckButton>
<Frame name="HealBot_Options_CureDispelCleanse" inherits="OptionFrameBoxTemplate"> <Frame name="HealBot_Options_CureDispelCleanse">
<Scripts>
<OnLoad>
this:SetBackdropBorderColor(0.4, 0.4, 0.4);
this:SetBackdropColor(0, 0, 0, 0);
</OnLoad>
</Scripts>
<Size> <Size>
<AbsDimension y="110"/> <AbsDimension y="110"/>
</Size> </Size>
@@ -83,9 +77,9 @@
</Frame> </Frame>
<Frame name="HealBot_Options_CDCButLeft" inherits="UIDropDownMenuTemplate" id="1"> <Frame name="HealBot_Options_CDCButLeft" inherits="UIDropDownMenuTemplate" id="1">
<Anchors> <Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_CureDispelCleanse" relativePoint="TOPLEFT"> <Anchor point="TOP" relativeTo="HealBot_Options_CureDispelCleanse" relativePoint="TOP">
<Offset> <Offset>
<AbsDimension x="150" y="-35" /> <AbsDimension x="40" y="-35" />
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -93,9 +87,9 @@
<Layer level="OVERLAY"> <Layer level="OVERLAY">
<FontString inherits="GameFontNormalSmall" text="HEALBOT_OPTIONS_CDCLEFT"> <FontString inherits="GameFontNormalSmall" text="HEALBOT_OPTIONS_CDCLEFT">
<Anchors> <Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_CureDispelCleanse" relativePoint="TOPLEFT"> <Anchor point="RIGHT" relativeTo="HealBot_Options_CDCButLeft" relativePoint="LEFT">
<Offset> <Offset>
<AbsDimension x="70" y="-42"/> <AbsDimension x="-5" y="3"/>
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -110,9 +104,9 @@
</Frame> </Frame>
<Frame name="HealBot_Options_CDCButRight" inherits="UIDropDownMenuTemplate" id="1"> <Frame name="HealBot_Options_CDCButRight" inherits="UIDropDownMenuTemplate" id="1">
<Anchors> <Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_CureDispelCleanse" relativePoint="TOPLEFT"> <Anchor point="TOP" relativeTo="HealBot_Options_CureDispelCleanse" relativePoint="TOP">
<Offset> <Offset>
<AbsDimension x="150" y="-67" /> <AbsDimension x="40" y="-67" />
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -120,9 +114,9 @@
<Layer level="OVERLAY"> <Layer level="OVERLAY">
<FontString inherits="GameFontNormalSmall" text="HEALBOT_OPTIONS_CDCRIGHT"> <FontString inherits="GameFontNormalSmall" text="HEALBOT_OPTIONS_CDCRIGHT">
<Anchors> <Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_CureDispelCleanse" relativePoint="TOPLEFT"> <Anchor point="RIGHT" relativeTo="HealBot_Options_CDCButRight" relativePoint="LEFT">
<Offset> <Offset>
<AbsDimension x="70" y="-74"/> <AbsDimension x="-5" y="3"/>
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -136,15 +130,9 @@
</Scripts> </Scripts>
</Frame> </Frame>
<Frame name="HealBot_Options_CureDispelCleanseCol" inherits="OptionFrameBoxTemplate"> <Frame name="HealBot_Options_CureDispelCleanseCol">
<Scripts>
<OnLoad>
this:SetBackdropBorderColor(0.4, 0.4, 0.4);
this:SetBackdropColor(0, 0, 0, 0);
</OnLoad>
</Scripts>
<Size> <Size>
<AbsDimension y="95"/> <AbsDimension y="125"/>
</Size> </Size>
<Anchors> <Anchors>
<Anchor point="TOPLEFT"> <Anchor point="TOPLEFT">
@@ -154,7 +142,7 @@
</Anchor> </Anchor>
<Anchor point="TOPRIGHT"> <Anchor point="TOPRIGHT">
<Offset> <Offset>
<AbsDimension x="-21" y="-190"/> <AbsDimension x="-21" y="-185"/>
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -164,7 +152,7 @@
<Anchors> <Anchors>
<Anchor point="TOP"> <Anchor point="TOP">
<Offset> <Offset>
<AbsDimension x="0" y="-12" /> <AbsDimension x="0" y="-10" />
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -172,14 +160,41 @@
</Layer> </Layer>
</Layers> </Layers>
</Frame> </Frame>
<Frame name="HealBot_Options_CDCOverlay" inherits="UIDropDownMenuTemplate" id="1">
<Anchors>
<Anchor point="TOP" relativeTo="HealBot_Options_CureDispelCleanseCol" relativePoint="TOP">
<Offset>
<AbsDimension x="40" y="-28" />
</Offset>
</Anchor>
</Anchors>
<Layers>
<Layer level="OVERLAY">
<FontString inherits="GameFontNormalSmall" text="HEALBOT_OPTIONS_CDCOVERLAY">
<Anchors>
<Anchor point="RIGHT" relativeTo="HealBot_Options_CDCOverlay" relativePoint="LEFT">
<Offset>
<AbsDimension x="-5" y="3"/>
</Offset>
</Anchor>
</Anchors>
</FontString>
</Layer>
</Layers>
<Scripts>
<OnLoad>
HealBot_Options_CDCOverlay_OnLoad(this)
</OnLoad>
</Scripts>
</Frame>
<Button name="HealBot_DiseaseColorpickb"> <Button name="HealBot_DiseaseColorpickb">
<Size> <Size>
<AbsDimension x="130" y="20"/> <AbsDimension x="130" y="20"/>
</Size> </Size>
<Anchors> <Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_CureDispelCleanseCol" relativePoint="TOPLEFT"> <Anchor point="TOPRIGHT" relativeTo="HealBot_Options_CureDispelCleanseCol" relativePoint="TOP">
<Offset> <Offset>
<AbsDimension x="70" y="-35"/> <AbsDimension x="-2" y="-62"/>
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -192,9 +207,9 @@
<AbsDimension x="130" y="20"/> <AbsDimension x="130" y="20"/>
</Size> </Size>
<Anchors> <Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_CureDispelCleanseCol" relativePoint="TOPLEFT"> <Anchor point="TOPRIGHT" relativeTo="HealBot_Options_CureDispelCleanseCol" relativePoint="TOP">
<Offset> <Offset>
<AbsDimension x="70" y="-35"/> <AbsDimension x="-2" y="-62"/>
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -269,9 +284,9 @@
<AbsDimension x="130" y="20"/> <AbsDimension x="130" y="20"/>
</Size> </Size>
<Anchors> <Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_CureDispelCleanseCol" relativePoint="TOPLEFT"> <Anchor point="TOPRIGHT" relativeTo="HealBot_Options_CureDispelCleanseCol" relativePoint="TOP">
<Offset> <Offset>
<AbsDimension x="70" y="-65"/> <AbsDimension x="-2" y="-92"/>
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -284,9 +299,9 @@
<AbsDimension x="130" y="20"/> <AbsDimension x="130" y="20"/>
</Size> </Size>
<Anchors> <Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_CureDispelCleanseCol" relativePoint="TOPLEFT"> <Anchor point="TOPRIGHT" relativeTo="HealBot_Options_CureDispelCleanseCol" relativePoint="TOP">
<Offset> <Offset>
<AbsDimension x="70" y="-65"/> <AbsDimension x="-2" y="-92"/>
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -356,25 +371,19 @@
<BarColor r="0" g="1" b="0"/> <BarColor r="0" g="1" b="0"/>
</StatusBar> </StatusBar>
<Frame name="HealBot_Options_CureDispelCleanseWarn" inherits="OptionFrameBoxTemplate"> <Frame name="HealBot_Options_CureDispelCleanseWarn">
<Scripts>
<OnLoad>
this:SetBackdropBorderColor(0.4, 0.4, 0.4);
this:SetBackdropColor(0, 0, 0, 0);
</OnLoad>
</Scripts>
<Size> <Size>
<AbsDimension y="120"/> <AbsDimension y="115"/>
</Size> </Size>
<Anchors> <Anchors>
<Anchor point="TOPLEFT"> <Anchor point="TOPLEFT">
<Offset> <Offset>
<AbsDimension x="21" y="-285"/> <AbsDimension x="21" y="-318"/>
</Offset> </Offset>
</Anchor> </Anchor>
<Anchor point="TOPRIGHT"> <Anchor point="TOPRIGHT">
<Offset> <Offset>
<AbsDimension x="-21" y="-290"/> <AbsDimension x="-21" y="-318"/>
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -394,9 +403,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="TOPLEFT"> <Anchor point="TOP" relativeTo="HealBot_Options_CureDispelCleanseWarn" relativePoint="TOP">
<Offset> <Offset>
<AbsDimension x="70" y="-35" /> <AbsDimension x="-90" y="-35" />
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -409,7 +418,7 @@
<Anchors> <Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_ShowDebuffWarning" relativePoint="BOTTOMLEFT"> <Anchor point="TOPLEFT" relativeTo="HealBot_Options_ShowDebuffWarning" relativePoint="BOTTOMLEFT">
<Offset> <Offset>
<AbsDimension x="0" y="5" /> <AbsDimension x="0" y="-5" />
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
+293
View File
@@ -0,0 +1,293 @@
<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_Chat.lua" />
<Frame name="HealBot_Options_Panel7" parent="HealBot_Options" hidden="true" setAllPoints="true">
<Frames>
<!-- Chat Message 1 -->
<EditBox name="HealBot_Options_ChatMsg1_Spell" inherits="InputBoxTemplate" autoFocus="false">
<Size>
<AbsDimension x="130" y="20"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="120" y="-30"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnTextChanged>
if HealBot_Config.ChatMessages then
HealBot_Config.ChatMessages[1].Spell = this:GetText();
end
</OnTextChanged>
</Scripts>
</EditBox>
<Button name="HealBot_Options_ChatMsg1_Channel" inherits="UIPanelButtonTemplate" text="None">
<Size>
<AbsDimension x="80" y="22"/>
</Size>
<Anchors>
<Anchor point="LEFT" relativeTo="HealBot_Options_ChatMsg1_Spell" relativePoint="RIGHT">
<Offset>
<AbsDimension x="15" y="0"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnClick>
HealBot_Options_ChatMsg_Channel_OnClick(1, this);
</OnClick>
</Scripts>
</Button>
<EditBox name="HealBot_Options_ChatMsg1_Text" inherits="InputBoxTemplate" autoFocus="false">
<Size>
<AbsDimension x="300" y="20"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_ChatMsg1_Spell" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="0" y="-5"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnTextChanged>
if HealBot_Config.ChatMessages then
HealBot_Config.ChatMessages[1].Message = this:GetText();
end
</OnTextChanged>
</Scripts>
</EditBox>
<!-- Chat Message 2 -->
<EditBox name="HealBot_Options_ChatMsg2_Spell" inherits="InputBoxTemplate" autoFocus="false">
<Size>
<AbsDimension x="130" y="20"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_ChatMsg1_Text" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="0" y="-12"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnTextChanged>
if HealBot_Config.ChatMessages then
HealBot_Config.ChatMessages[2].Spell = this:GetText();
end
</OnTextChanged>
</Scripts>
</EditBox>
<Button name="HealBot_Options_ChatMsg2_Channel" inherits="UIPanelButtonTemplate" text="None">
<Size>
<AbsDimension x="80" y="22"/>
</Size>
<Anchors>
<Anchor point="LEFT" relativeTo="HealBot_Options_ChatMsg2_Spell" relativePoint="RIGHT">
<Offset>
<AbsDimension x="15" y="0"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnClick>
HealBot_Options_ChatMsg_Channel_OnClick(2, this);
</OnClick>
</Scripts>
</Button>
<EditBox name="HealBot_Options_ChatMsg2_Text" inherits="InputBoxTemplate" autoFocus="false">
<Size>
<AbsDimension x="300" y="20"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_ChatMsg2_Spell" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="0" y="-5"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnTextChanged>
if HealBot_Config.ChatMessages then
HealBot_Config.ChatMessages[2].Message = this:GetText();
end
</OnTextChanged>
</Scripts>
</EditBox>
<!-- Chat Message 3 -->
<EditBox name="HealBot_Options_ChatMsg3_Spell" inherits="InputBoxTemplate" autoFocus="false">
<Size>
<AbsDimension x="130" y="20"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_ChatMsg2_Text" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="0" y="-12"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnTextChanged>
if HealBot_Config.ChatMessages then
HealBot_Config.ChatMessages[3].Spell = this:GetText();
end
</OnTextChanged>
</Scripts>
</EditBox>
<Button name="HealBot_Options_ChatMsg3_Channel" inherits="UIPanelButtonTemplate" text="None">
<Size>
<AbsDimension x="80" y="22"/>
</Size>
<Anchors>
<Anchor point="LEFT" relativeTo="HealBot_Options_ChatMsg3_Spell" relativePoint="RIGHT">
<Offset>
<AbsDimension x="15" y="0"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnClick>
HealBot_Options_ChatMsg_Channel_OnClick(3, this);
</OnClick>
</Scripts>
</Button>
<EditBox name="HealBot_Options_ChatMsg3_Text" inherits="InputBoxTemplate" autoFocus="false">
<Size>
<AbsDimension x="300" y="20"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_ChatMsg3_Spell" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="0" y="-5"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnTextChanged>
if HealBot_Config.ChatMessages then
HealBot_Config.ChatMessages[3].Message = this:GetText();
end
</OnTextChanged>
</Scripts>
</EditBox>
<!-- Chat Message 4 -->
<EditBox name="HealBot_Options_ChatMsg4_Spell" inherits="InputBoxTemplate" autoFocus="false">
<Size>
<AbsDimension x="130" y="20"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_ChatMsg3_Text" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="0" y="-12"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnTextChanged>
if HealBot_Config.ChatMessages then
HealBot_Config.ChatMessages[4].Spell = this:GetText();
end
</OnTextChanged>
</Scripts>
</EditBox>
<Button name="HealBot_Options_ChatMsg4_Channel" inherits="UIPanelButtonTemplate" text="None">
<Size>
<AbsDimension x="80" y="22"/>
</Size>
<Anchors>
<Anchor point="LEFT" relativeTo="HealBot_Options_ChatMsg4_Spell" relativePoint="RIGHT">
<Offset>
<AbsDimension x="15" y="0"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnClick>
HealBot_Options_ChatMsg_Channel_OnClick(4, this);
</OnClick>
</Scripts>
</Button>
<EditBox name="HealBot_Options_ChatMsg4_Text" inherits="InputBoxTemplate" autoFocus="false">
<Size>
<AbsDimension x="300" y="20"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_ChatMsg4_Spell" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="0" y="-5"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnTextChanged>
if HealBot_Config.ChatMessages then
HealBot_Config.ChatMessages[4].Message = this:GetText();
end
</OnTextChanged>
</Scripts>
</EditBox>
<!-- Chat Message 5 -->
<EditBox name="HealBot_Options_ChatMsg5_Spell" inherits="InputBoxTemplate" autoFocus="false">
<Size>
<AbsDimension x="130" y="20"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_ChatMsg4_Text" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="0" y="-12"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnTextChanged>
if HealBot_Config.ChatMessages then
HealBot_Config.ChatMessages[5].Spell = this:GetText();
end
</OnTextChanged>
</Scripts>
</EditBox>
<Button name="HealBot_Options_ChatMsg5_Channel" inherits="UIPanelButtonTemplate" text="None">
<Size>
<AbsDimension x="80" y="22"/>
</Size>
<Anchors>
<Anchor point="LEFT" relativeTo="HealBot_Options_ChatMsg5_Spell" relativePoint="RIGHT">
<Offset>
<AbsDimension x="15" y="0"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnClick>
HealBot_Options_ChatMsg_Channel_OnClick(5, this);
</OnClick>
</Scripts>
</Button>
<EditBox name="HealBot_Options_ChatMsg5_Text" inherits="InputBoxTemplate" autoFocus="false">
<Size>
<AbsDimension x="300" y="20"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_ChatMsg5_Spell" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="0" y="-5"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnTextChanged>
if HealBot_Config.ChatMessages then
HealBot_Config.ChatMessages[5].Message = this:GetText();
end
</OnTextChanged>
</Scripts>
</EditBox>
</Frames>
</Frame>
</Ui>
@@ -119,6 +119,22 @@ function HealBot_SkinColorpick_OnClick(SkinType)
HealBot_Config.babortcolg[HealBot_Config.Current_Skin], HealBot_Config.babortcolg[HealBot_Config.Current_Skin],
HealBot_Config.babortcolb[HealBot_Config.Current_Skin], HealBot_Config.babortcolb[HealBot_Config.Current_Skin],
HealBot_Config.babortcola[HealBot_Config.Current_Skin]) HealBot_Config.babortcola[HealBot_Config.Current_Skin])
elseif SkinType=="MaxHP" then
local r = HealBot_Config.bcolormaxr and HealBot_Config.bcolormaxr[HealBot_Config.Current_Skin] or 0.0
local g = HealBot_Config.bcolormaxg and HealBot_Config.bcolormaxg[HealBot_Config.Current_Skin] or 1.0
local b = HealBot_Config.bcolormaxb and HealBot_Config.bcolormaxb[HealBot_Config.Current_Skin] or 0.0
HealBot_UseColourPick(r, g, b, 1.0)
elseif SkinType=="MinHP" then
local r = HealBot_Config.bcolorminr and HealBot_Config.bcolorminr[HealBot_Config.Current_Skin] or 1.0
local g = HealBot_Config.bcolorming and HealBot_Config.bcolorming[HealBot_Config.Current_Skin] or 0.0
local b = HealBot_Config.bcolorminb and HealBot_Config.bcolorminb[HealBot_Config.Current_Skin] or 0.0
HealBot_UseColourPick(r, g, b, 1.0)
elseif SkinType=="BarFrame" then
local r = (HealBot_Config.bframecolr and HealBot_Config.bframecolr[HealBot_Config.Current_Skin]) or 1.0
local g = (HealBot_Config.bframecolg and HealBot_Config.bframecolg[HealBot_Config.Current_Skin]) or 1.0
local b = (HealBot_Config.bframecolb and HealBot_Config.bframecolb[HealBot_Config.Current_Skin]) or 1.0
local a = (HealBot_Config.bframecola and HealBot_Config.bframecola[HealBot_Config.Current_Skin]) or 1.0
HealBot_UseColourPick(r, g, b, a)
end end
end end
-- HealBot_SetSkinColours: Applies skin configuration to UI elements. -- HealBot_SetSkinColours: Applies skin configuration to UI elements.
@@ -136,6 +152,20 @@ function HealBot_SetSkinColours()
HealBot_EnTextColorpickin:SetStatusBarColor(0, 1, 0, inHealAlpha) HealBot_EnTextColorpickin:SetStatusBarColor(0, 1, 0, inHealAlpha)
HealBot_DisTextColorpick:SetStatusBarColor(0, 1, 0, disabledAlpha) HealBot_DisTextColorpick:SetStatusBarColor(0, 1, 0, disabledAlpha)
local maxR = HealBot_Config.bcolormaxr and HealBot_Config.bcolormaxr[skin] or 0.0
local maxG = HealBot_Config.bcolormaxg and HealBot_Config.bcolormaxg[skin] or 1.0
local maxB = HealBot_Config.bcolormaxb and HealBot_Config.bcolormaxb[skin] or 0.0
if HealBot_MaxHPColorpick then
HealBot_MaxHPColorpick:SetStatusBarColor(maxR, maxG, maxB, 1.0)
end
local minR = HealBot_Config.bcolorminr and HealBot_Config.bcolorminr[skin] or 1.0
local minG = HealBot_Config.bcolorming and HealBot_Config.bcolorming[skin] or 0.0
local minB = HealBot_Config.bcolorminb and HealBot_Config.bcolorminb[skin] or 0.0
if HealBot_MinHPColorpick then
HealBot_MinHPColorpick:SetStatusBarColor(minR, minG, minB, 1.0)
end
-- 2. Set Text Colors -- 2. Set Text Colors
HealBot_EnTextColorpickt:SetTextColor( HealBot_EnTextColorpickt:SetTextColor(
HealBot_Config.btextenabledcolr[skin], HealBot_Config.btextenabledcolg[skin], HealBot_Config.btextenabledcolr[skin], HealBot_Config.btextenabledcolg[skin],
@@ -160,6 +190,13 @@ function HealBot_SetSkinColours()
HealBot_Config.babortcolr[skin], HealBot_Config.babortcolg[skin], HealBot_Config.babortcolr[skin], HealBot_Config.babortcolg[skin],
HealBot_Config.babortcolb[skin], HealBot_Config.babortcola[skin] HealBot_Config.babortcolb[skin], HealBot_Config.babortcola[skin]
) )
if HealBot_BarFrameColorpick then
local bfr = (HealBot_Config.bframecolr and HealBot_Config.bframecolr[skin]) or 1.0
local bfg = (HealBot_Config.bframecolg and HealBot_Config.bframecolg[skin]) or 1.0
local bfb = (HealBot_Config.bframecolb and HealBot_Config.bframecolb[skin]) or 1.0
local bfa = (HealBot_Config.bframecola and HealBot_Config.bframecola[skin]) or 1.0
HealBot_BarFrameColorpick:SetStatusBarColor(bfr, bfg, bfb, bfa)
end
-- 4. Setup Main Panel Backdrop (Fixed scoping bugs) -- 4. Setup Main Panel Backdrop (Fixed scoping bugs)
local borderStyle = HealBot_Config.bborder[skin] or 2 local borderStyle = HealBot_Config.bborder[skin] or 2
@@ -203,13 +240,30 @@ function HealBot_SetSkinColours()
end end
-- 5. Update Text Labels -- 5. Update Text Labels
HealBot_EnTextColorpickt:SetTextHeight(btextheight) local bfont = (HealBot_Config.bfont and HealBot_Config.bfont[skin]) or "Fonts\\FRIZQT__.TTF"
HealBot_DisTextColorpickt:SetTextHeight(btextheight) local fontOutline = (HealBot_Config.bfontoutline and HealBot_Config.bfontoutline[skin]) or 0
HealBot_DebTextColorpickt:SetTextHeight(btextheight) local expectedFlags = fontOutline == 1 and "OUTLINE" or ""
if HealBot_EnTextColorpickt then
HealBot_EnTextColorpickt:SetFont(bfont, btextheight, expectedFlags)
HealBot_EnTextColorpickt:SetText(HEALBOT_SKIN_ENTEXT) HealBot_EnTextColorpickt:SetText(HEALBOT_SKIN_ENTEXT)
end
if HealBot_DisTextColorpickt then
HealBot_DisTextColorpickt:SetFont(bfont, btextheight, expectedFlags)
HealBot_DisTextColorpickt:SetText(HEALBOT_SKIN_DISTEXT) HealBot_DisTextColorpickt:SetText(HEALBOT_SKIN_DISTEXT)
end
if HealBot_DebTextColorpickt then
HealBot_DebTextColorpickt:SetFont(bfont, btextheight, expectedFlags)
HealBot_DebTextColorpickt:SetText(HEALBOT_SKIN_DEBTEXT) HealBot_DebTextColorpickt:SetText(HEALBOT_SKIN_DEBTEXT)
end
if HealBot_MaxHPColorpickt then
HealBot_MaxHPColorpickt:SetFont(bfont, btextheight, expectedFlags)
HealBot_MaxHPColorpickt:SetText(HEALBOT_SKIN_MAXHPTEXT or "Max HP")
end
if HealBot_MinHPColorpickt then
HealBot_MinHPColorpickt:SetFont(bfont, btextheight, expectedFlags)
HealBot_MinHPColorpickt:SetText(HEALBOT_SKIN_MINHPTEXT or "Min HP")
end
-- 6. Force UI redraw (Kept the scale hack since it addresses a specific engine quirk) -- 6. Force UI redraw (Kept the scale hack since it addresses a specific engine quirk)
local barScale = HealBot_EnTextColorpick:GetScale() local barScale = HealBot_EnTextColorpick:GetScale()
@@ -10,7 +10,7 @@
<Anchors> <Anchors>
<Anchor point="TOPLEFT"> <Anchor point="TOPLEFT">
<Offset> <Offset>
<AbsDimension x="31" y="-40" /> <AbsDimension x="60" y="-40" />
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -23,7 +23,7 @@
<Anchors> <Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_ActionLocked" relativePoint="BOTTOMLEFT"> <Anchor point="TOPLEFT" relativeTo="HealBot_Options_ActionLocked" relativePoint="BOTTOMLEFT">
<Offset> <Offset>
<AbsDimension x="0" y="5" /> <AbsDimension x="0" y="-5" />
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -36,7 +36,7 @@
<Anchors> <Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_GrowUpwards" relativePoint="BOTTOMLEFT"> <Anchor point="TOPLEFT" relativeTo="HealBot_Options_GrowUpwards" relativePoint="BOTTOMLEFT">
<Offset> <Offset>
<AbsDimension x="0" y="5" /> <AbsDimension x="0" y="-5" />
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -49,7 +49,7 @@
<Anchors> <Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_ActionLocked" relativePoint="TOPLEFT"> <Anchor point="TOPLEFT" relativeTo="HealBot_Options_ActionLocked" relativePoint="TOPLEFT">
<Offset> <Offset>
<AbsDimension x="200" y="0" /> <AbsDimension x="280" y="0" />
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -62,7 +62,7 @@
<Anchors> <Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_GrowUpwards" relativePoint="TOPLEFT"> <Anchor point="TOPLEFT" relativeTo="HealBot_Options_GrowUpwards" relativePoint="TOPLEFT">
<Offset> <Offset>
<AbsDimension x="200" y="0" /> <AbsDimension x="280" y="0" />
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -75,7 +75,7 @@
<Anchors> <Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_ActionMouseover" relativePoint="TOPLEFT"> <Anchor point="TOPLEFT" relativeTo="HealBot_Options_ActionMouseover" relativePoint="TOPLEFT">
<Offset> <Offset>
<AbsDimension x="200" y="0" /> <AbsDimension x="280" y="0" />
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -94,20 +94,14 @@
</Scripts> </Scripts>
</CheckButton> </CheckButton>
<Frame name="HealBot_Options_GenFrame" inherits="OptionFrameBoxTemplate"> <Frame name="HealBot_Options_GenFrame">
<Scripts>
<OnLoad>
this:SetBackdropBorderColor(0.4, 0.4, 0.4);
this:SetBackdropColor(0, 0, 0, 0);
</OnLoad>
</Scripts>
<Size> <Size>
<AbsDimension y="95"/> <AbsDimension y="95"/>
</Size> </Size>
<Anchors> <Anchors>
<Anchor point="TOPLEFT"> <Anchor point="TOPLEFT">
<Offset> <Offset>
<AbsDimension x="21" y="-135"/> <AbsDimension x="60" y="-135"/>
</Offset> </Offset>
</Anchor> </Anchor>
<Anchor point="TOPRIGHT"> <Anchor point="TOPRIGHT">
@@ -122,7 +116,7 @@
<Anchors> <Anchors>
<Anchor point="TOPLEFT"> <Anchor point="TOPLEFT">
<Offset> <Offset>
<AbsDimension x="130" y="-12" /> <AbsDimension x="280" y="-12" />
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -134,7 +128,7 @@
<Anchors> <Anchors>
<Anchor point="TOPLEFT"> <Anchor point="TOPLEFT">
<Offset> <Offset>
<AbsDimension x="10" y="-30" /> <AbsDimension x="0" y="-30" />
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -156,7 +150,7 @@
<Anchors> <Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_ShowManaBars" relativePoint="TOPLEFT"> <Anchor point="TOPLEFT" relativeTo="HealBot_Options_ShowManaBars" relativePoint="TOPLEFT">
<Offset> <Offset>
<AbsDimension x="180" y="0" /> <AbsDimension x="280" y="0" />
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -178,7 +172,7 @@
<Anchors> <Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_ShowManaBars" relativePoint="BOTTOMLEFT"> <Anchor point="TOPLEFT" relativeTo="HealBot_Options_ShowManaBars" relativePoint="BOTTOMLEFT">
<Offset> <Offset>
<AbsDimension x="0" y="-2" /> <AbsDimension x="0" y="-5" />
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -203,7 +197,7 @@
<Anchors> <Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_GenFrame" relativePoint="BOTTOMLEFT"> <Anchor point="TOPLEFT" relativeTo="HealBot_Options_GenFrame" relativePoint="BOTTOMLEFT">
<Offset> <Offset>
<AbsDimension x="10" y="-10" /> <AbsDimension x="0" y="-10" />
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -216,7 +210,7 @@
<Anchors> <Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_HideOptions" relativePoint="BOTTOMLEFT"> <Anchor point="TOPLEFT" relativeTo="HealBot_Options_HideOptions" relativePoint="BOTTOMLEFT">
<Offset> <Offset>
<AbsDimension x="0" y="-2" /> <AbsDimension x="0" y="-5" />
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -229,7 +223,7 @@
<Anchors> <Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_HideAbort" relativePoint="BOTTOMLEFT"> <Anchor point="TOPLEFT" relativeTo="HealBot_Options_HideAbort" relativePoint="BOTTOMLEFT">
<Offset> <Offset>
<AbsDimension x="0" y="-2" /> <AbsDimension x="0" y="-5" />
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -242,7 +236,7 @@
<Anchors> <Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_QualityRange" relativePoint="BOTTOMLEFT"> <Anchor point="TOPLEFT" relativeTo="HealBot_Options_QualityRange" relativePoint="BOTTOMLEFT">
<Offset> <Offset>
<AbsDimension x="0" y="-2" /> <AbsDimension x="0" y="-5" />
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -255,7 +249,7 @@
<Anchors> <Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_ProtectPvP" relativePoint="BOTTOMLEFT"> <Anchor point="TOPLEFT" relativeTo="HealBot_Options_ProtectPvP" relativePoint="BOTTOMLEFT">
<Offset> <Offset>
<AbsDimension x="0" y="-2" /> <AbsDimension x="0" y="-5" />
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -5,13 +5,7 @@
<Frame name="HealBot_Options_Panel3" parent="HealBot_Options" hidden="true" setAllPoints="true"> <Frame name="HealBot_Options_Panel3" parent="HealBot_Options" hidden="true" setAllPoints="true">
<Frames> <Frames>
<Frame name="HealBot_Options_HealTargetFrame" inherits="OptionFrameBoxTemplate"> <Frame name="HealBot_Options_HealTargetFrame">
<Scripts>
<OnLoad>
this:SetBackdropBorderColor(0.4, 0.4, 0.4);
this:SetBackdropColor(0, 0, 0, 0);
</OnLoad>
</Scripts>
<Size> <Size>
<AbsDimension y="88"/> <AbsDimension y="88"/>
</Size> </Size>
@@ -32,9 +26,9 @@
<Layer level="BACKGROUND"> <Layer level="BACKGROUND">
<FontString name="HealBot_HealButtons_Text" text="HEALBOT_OPTIONS_HEAL_BUTTONS" inherits="GameFontNormalSmall"> <FontString name="HealBot_HealButtons_Text" text="HEALBOT_OPTIONS_HEAL_BUTTONS" inherits="GameFontNormalSmall">
<Anchors> <Anchors>
<Anchor point="TOPLEFT"> <Anchor point="TOP">
<Offset> <Offset>
<AbsDimension x="100" y="-8" /> <AbsDimension x="0" y="-8" />
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -47,7 +41,7 @@
<Anchors> <Anchors>
<Anchor point="TOPLEFT"> <Anchor point="TOPLEFT">
<Offset> <Offset>
<AbsDimension x="25" y="-21" /> <AbsDimension x="85" y="-21" />
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -60,7 +54,7 @@
<Anchors> <Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_GroupHeals" relativePoint="BOTTOMLEFT"> <Anchor point="TOPLEFT" relativeTo="HealBot_Options_GroupHeals" relativePoint="BOTTOMLEFT">
<Offset> <Offset>
<AbsDimension x="0" y="5" /> <AbsDimension x="0" y="-5" />
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -86,7 +80,7 @@
<Anchors> <Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_GroupHeals" relativePoint="BOTTOMLEFT"> <Anchor point="TOPLEFT" relativeTo="HealBot_Options_GroupHeals" relativePoint="BOTTOMLEFT">
<Offset> <Offset>
<AbsDimension x="122" y="5" /> <AbsDimension x="122" y="-5" />
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -99,7 +93,7 @@
<Anchors> <Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_GroupHeals" relativePoint="BOTTOMLEFT"> <Anchor point="TOPLEFT" relativeTo="HealBot_Options_GroupHeals" relativePoint="BOTTOMLEFT">
<Offset> <Offset>
<AbsDimension x="244" y="5" /> <AbsDimension x="244" y="-5" />
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -114,9 +108,9 @@
<Slider name="HealBot_Options_AlertLevel" inherits="HealBot_Options_SliderTemplate"> <Slider name="HealBot_Options_AlertLevel" inherits="HealBot_Options_SliderTemplate">
<Anchors> <Anchors>
<Anchor point="TOPLEFT"> <Anchor point="TOP">
<Offset> <Offset>
<AbsDimension x="45" y="-132" /> <AbsDimension x="0" y="-132" />
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -142,9 +136,9 @@
<Frame name="HealBot_Options_EmergencyFilter" inherits="UIDropDownMenuTemplate" id="1"> <Frame name="HealBot_Options_EmergencyFilter" inherits="UIDropDownMenuTemplate" id="1">
<Anchors> <Anchors>
<Anchor point="TOPLEFT"> <Anchor point="TOP">
<Offset> <Offset>
<AbsDimension x="155" y="-205" /> <AbsDimension x="40" y="-205" />
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -170,9 +164,9 @@
<Frame name="HealBot_Options_ExtraSort" inherits="UIDropDownMenuTemplate" id="1"> <Frame name="HealBot_Options_ExtraSort" inherits="UIDropDownMenuTemplate" id="1">
<Anchors> <Anchors>
<Anchor point="TOPLEFT"> <Anchor point="TOP">
<Offset> <Offset>
<AbsDimension x="155" y="-238" /> <AbsDimension x="40" y="-238" />
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -198,9 +192,9 @@
<Frame name="HealBot_Options_HealthText" inherits="UIDropDownMenuTemplate" id="1"> <Frame name="HealBot_Options_HealthText" inherits="UIDropDownMenuTemplate" id="1">
<Anchors> <Anchors>
<Anchor point="TOPLEFT"> <Anchor point="TOP">
<Offset> <Offset>
<AbsDimension x="155" y="-271" /> <AbsDimension x="40" y="-271" />
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
@@ -224,13 +218,7 @@
</Scripts> </Scripts>
</Frame> </Frame>
<Frame name="HealBot_Options_EmergLFrame" inherits="OptionFrameBoxTemplate"> <Frame name="HealBot_Options_EmergLFrame">
<Scripts>
<OnLoad>
this:SetBackdropBorderColor(0.4, 0.4, 0.4);
this:SetBackdropColor(0, 0, 0, 0);
</OnLoad>
</Scripts>
<Size> <Size>
<AbsDimension y="125"/> <AbsDimension y="125"/>
</Size> </Size>
@@ -251,9 +239,9 @@
<Frame name="HealBot_Options_EmergencyFClass" inherits="UIDropDownMenuTemplate" id="1"> <Frame name="HealBot_Options_EmergencyFClass" inherits="UIDropDownMenuTemplate" id="1">
<Anchors> <Anchors>
<Anchor point="TOPLEFT"> <Anchor point="TOP">
<Offset> <Offset>
<AbsDimension x="128" y="-10" /> <AbsDimension x="40" y="-10" />
</Offset> </Offset>
</Anchor> </Anchor>
</Anchors> </Anchors>
+138
View File
@@ -0,0 +1,138 @@
-- HealBot_Options_Integrations.lua
local function HealBot_Options_SetDropDownState(frame, enabled)
if not frame then return end
local button = getglobal(frame:GetName() .. "Button")
local text = getglobal(frame:GetName() .. "Text")
if button then
if enabled then
button:Enable()
else
button:Disable()
end
end
if text then
if enabled then
text:SetTextColor(1, 1, 1)
else
text:SetTextColor(0.5, 0.5, 0.5)
end
end
end
-- Update enabled/disabled state of dropdowns based on current config
function HealBot_Options_Integrations_UpdateDropdownStates()
local timersEnabled = HealBot_Config.HealBot_Integrations_ShowHoTTimers == 1
local displayMode = HealBot_Config.HealBot_Integrations_HoTTimerDisplayMode or 0
HealBot_Options_SetDropDownState(HealBot_Options_Integrations_DisplayModeDropdown, timersEnabled)
HealBot_Options_SetDropDownState(HealBot_Options_Integrations_PositionDropdown, timersEnabled and (displayMode == 0 or displayMode == 2))
end
-- 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);
HealBot_Options_Integrations_ShowHoTTimers:SetChecked(HealBot_Config.HealBot_Integrations_ShowHoTTimers);
-- Set display mode dropdown text
local displayMode = HealBot_Config.HealBot_Integrations_HoTTimerDisplayMode or 0
if displayMode == 1 then
UIDropDownMenu_SetText("Icon Overlay", HealBot_Options_Integrations_DisplayModeDropdown)
elseif displayMode == 2 then
UIDropDownMenu_SetText("Both", HealBot_Options_Integrations_DisplayModeDropdown)
else
UIDropDownMenu_SetText("List", HealBot_Options_Integrations_DisplayModeDropdown)
end
-- Set position dropdown text
local pos = HealBot_Config.HealBot_Integrations_HoTTimerPosition or "BELOW"
local posLabels = { BELOW = "Below", ABOVE = "Above", LEFT = "Left", RIGHT = "Right" }
UIDropDownMenu_SetText(posLabels[pos] or "Below", HealBot_Options_Integrations_PositionDropdown)
-- Update enabled/disabled state
HealBot_Options_Integrations_UpdateDropdownStates()
end
-- Display Mode dropdown click handler (relying on global this)
function HealBot_Options_Integrations_DisplayModeDropdown_OnClick()
UIDropDownMenu_SetSelectedID(HealBot_Options_Integrations_DisplayModeDropdown, this:GetID())
HealBot_Config.HealBot_Integrations_HoTTimerDisplayMode = this.value
UIDropDownMenu_SetText(this:GetText(), HealBot_Options_Integrations_DisplayModeDropdown)
HealBot_Options_Integrations_UpdateDropdownStates()
if HealBot_Action_UnitButtons then
for u in pairs(HealBot_Action_UnitButtons) do
HealBot_View_DirtyUnits[u] = true
end
end
if HealBot_Action_UpdatePlayerHoTs then
HealBot_Action_UpdatePlayerHoTs()
end
end
-- Display Mode dropdown init
function HealBot_Options_Integrations_DisplayModeDropdown_Init()
local mode = HealBot_Config.HealBot_Integrations_HoTTimerDisplayMode or 0
local info
info = {}
info.text = "List"
info.value = 0
info.func = HealBot_Options_Integrations_DisplayModeDropdown_OnClick
if mode == 0 then
info.checked = 1
end
UIDropDownMenu_AddButton(info)
info = {}
info.text = "Icon Overlay"
info.value = 1
info.func = HealBot_Options_Integrations_DisplayModeDropdown_OnClick
if mode == 1 then
info.checked = 1
end
UIDropDownMenu_AddButton(info)
info = {}
info.text = "Both"
info.value = 2
info.func = HealBot_Options_Integrations_DisplayModeDropdown_OnClick
if mode == 2 then
info.checked = 1
end
UIDropDownMenu_AddButton(info)
end
-- Position dropdown click handler (relying on global this)
function HealBot_Options_Integrations_PositionDropdown_OnClick()
UIDropDownMenu_SetSelectedID(HealBot_Options_Integrations_PositionDropdown, this:GetID())
HealBot_Config.HealBot_Integrations_HoTTimerPosition = this.value
UIDropDownMenu_SetText(this:GetText(), HealBot_Options_Integrations_PositionDropdown)
if HealBot_Action_UpdatePlayerHoTs then
HealBot_Action_UpdatePlayerHoTs()
end
end
-- Position dropdown init
function HealBot_Options_Integrations_PositionDropdown_Init()
local positions = {
{ value = "BELOW", label = "Below" },
{ value = "ABOVE", label = "Above" },
{ value = "LEFT", label = "Left" },
{ value = "RIGHT", label = "Right" },
}
local currentPos = HealBot_Config.HealBot_Integrations_HoTTimerPosition or "BELOW"
for _, p in ipairs(positions) do
local info = {}
info.text = p.label
info.value = p.value
info.func = HealBot_Options_Integrations_PositionDropdown_OnClick
if currentPos == p.value then
info.checked = 1
end
UIDropDownMenu_AddButton(info)
end
end
+207
View File
@@ -0,0 +1,207 @@
<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="100" y="-35"/>
</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="-6"/>
</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" relativeTo="HealBot_Options_Integrations_Nampower" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="0" y="-60"/>
</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="-6"/>
</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>
<CheckButton name="HealBot_Options_Integrations_ShowHoTTimers" inherits="OptionsCheckButtonTemplate">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_Integrations_ClassicAPI" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="0" y="-6"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>
getglobal(this:GetName().."Text"):SetText("Track Player HoT Timers");
</OnLoad>
<OnClick>
HealBot_Config.HealBot_Integrations_ShowHoTTimers = this:GetChecked() and 1 or 0;
HealBot_Options_Integrations_UpdateDropdownStates();
if HealBot_Action_UnitButtons then
for u in pairs(HealBot_Action_UnitButtons) do
HealBot_View_DirtyUnits[u] = true;
end
end
if HealBot_Action_UpdatePlayerHoTs then
HealBot_Action_UpdatePlayerHoTs();
end
</OnClick>
</Scripts>
</CheckButton>
<!-- HoT Timer Display Mode Dropdown -->
<Frame name="HealBot_Options_Integrations_DisplayModeDropdown" inherits="UIDropDownMenuTemplate">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_Integrations_ShowHoTTimers" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="-15" y="-22"/>
</Offset>
</Anchor>
</Anchors>
<Layers>
<Layer level="ARTWORK">
<FontString name="HealBot_Options_Integrations_DisplayModeLabel" inherits="GameFontHighlightSmall" justifyH="LEFT" text="Timer Display Mode:">
<Anchors>
<Anchor point="BOTTOMLEFT" relativePoint="TOPLEFT">
<Offset>
<AbsDimension x="20" y="2"/>
</Offset>
</Anchor>
</Anchors>
<Color r="1" g="0.82" b="0"/>
</FontString>
</Layer>
</Layers>
<Scripts>
<OnLoad>
UIDropDownMenu_SetWidth(120, this);
UIDropDownMenu_Initialize(this, HealBot_Options_Integrations_DisplayModeDropdown_Init);
</OnLoad>
</Scripts>
</Frame>
<!-- HoT Timer Position Dropdown -->
<Frame name="HealBot_Options_Integrations_PositionDropdown" inherits="UIDropDownMenuTemplate">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_Integrations_DisplayModeDropdown" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="0" y="-22"/>
</Offset>
</Anchor>
</Anchors>
<Layers>
<Layer level="ARTWORK">
<FontString name="HealBot_Options_Integrations_PositionLabel" inherits="GameFontHighlightSmall" justifyH="LEFT" text="Timer List Position:">
<Anchors>
<Anchor point="BOTTOMLEFT" relativePoint="TOPLEFT">
<Offset>
<AbsDimension x="20" y="2"/>
</Offset>
</Anchor>
</Anchors>
<Color r="1" g="0.82" b="0"/>
</FontString>
</Layer>
</Layers>
<Scripts>
<OnLoad>
UIDropDownMenu_SetWidth(120, this);
UIDropDownMenu_Initialize(this, HealBot_Options_Integrations_PositionDropdown_Init);
</OnLoad>
</Scripts>
</Frame>
<Frame setAllPoints="true">
<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="340" y="48"/>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_Integrations_Nampower" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="20" y="-4"/>
</Offset>
</Anchor>
</Anchors>
<Color r="0.7" g="0.7" b="0.7"/>
</FontString>
<FontString name="HealBot_Options_Integrations_HoTInfo" inherits="GameFontHighlightSmall" justifyH="LEFT" justifyV="TOP" text="Note: HoT Timers require Nampower to be enabled and active to provide accurate aura times.">
<Size x="340" y="30"/>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_Integrations_PositionDropdown" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="20" y="-6"/>
</Offset>
</Anchor>
</Anchors>
<Color r="0.7" g="0.7" b="0.7"/>
</FontString>
</Layer>
</Layers>
</Frame>
</Frames>
<Scripts>
<OnShow>
HealBot_Options_Integrations_OnShow(this);
</OnShow>
</Scripts>
</Frame>
</Ui>
@@ -1,6 +1,41 @@
-- 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_Font_List = {
{ text = "Friz Quadrata", file = "Fonts\\FRIZQT__.TTF" },
{ text = "Arial Narrow", file = "Fonts\\ARIALN.TTF" },
{ text = "Skurri", file = "Fonts\\skurri.ttf" },
{ text = "Morpheus", file = "Fonts\\MORPHEUS.ttf" },
}
function HealBot_Options_FontDD_OnLoad(this)
UIDropDownMenu_Initialize(this, HealBot_Options_FontDD_Initialize)
UIDropDownMenu_SetWidth(110, this)
end
function HealBot_Options_FontDD_Initialize()
local currentFont = (HealBot_Config.bfont and HealBot_Config.bfont[HealBot_Config.Current_Skin]) or "Fonts\\FRIZQT__.TTF"
for i = 1, getn(HealBot_Font_List) do
local fontItem = HealBot_Font_List[i]
local info = {}
info.text = fontItem.text
info.func = HealBot_Options_FontDD_OnClick
info.value = fontItem.file
info.checked = (currentFont == fontItem.file)
UIDropDownMenu_AddButton(info)
end
end
function HealBot_Options_FontDD_OnClick()
UIDropDownMenu_SetSelectedID(HealBot_Options_Font_Dropdown, this:GetID())
if HealBot_Options_Font_DropdownText then
HealBot_Options_Font_DropdownText:SetText(this:GetText())
end
if not HealBot_Config.bfont then HealBot_Config.bfont = {} end
HealBot_Config.bfont[HealBot_Config.Current_Skin] = this.value
HealBot_Action_ResetSkin()
end
-- HealBot_Options_BarMaxRowsS_OnValueChanged: UI handler for OnValueChanged options panel. -- HealBot_Options_BarMaxRowsS_OnValueChanged: UI handler for OnValueChanged options panel.
function HealBot_Options_BarMaxRowsS_OnValueChanged(this) function HealBot_Options_BarMaxRowsS_OnValueChanged(this)
if not HealBot_Config.bmaxrows then HealBot_Config.bmaxrows = {} end if not HealBot_Config.bmaxrows then HealBot_Config.bmaxrows = {} end
@@ -8,15 +43,54 @@ function HealBot_Options_BarMaxRowsS_OnValueChanged(this)
HealBot_Action_PartyChanged() HealBot_Action_PartyChanged()
end end
-- HealBot_Options_GridOrientation_OnClick: UI handler for OnClick options panel. function HealBot_Options_BarFrame_OnClick(this)
function HealBot_Options_GridOrientation_OnClick(this) if not HealBot_Config.bframe then HealBot_Config.bframe = {} end
HealBot_Config.bframe[HealBot_Config.Current_Skin] = (this:GetChecked() and 1 or 0)
HealBot_Action_ResetSkin()
end
function HealBot_Options_BarFrameWidthS_OnValueChanged(this)
if not HealBot_Config.bframewidth then HealBot_Config.bframewidth = {} end
HealBot_Config.bframewidth[HealBot_Config.Current_Skin] = this:GetValue()
getglobal(this:GetName().."Text"):SetText(this.text .. ": " .. this:GetValue())
HealBot_Action_ResetSkin()
end
function HealBot_Options_GridOrientationDD_OnLoad(this)
UIDropDownMenu_Initialize(this, HealBot_Options_GridOrientationDD_Initialize);
UIDropDownMenu_SetWidth(110, this);
end
function HealBot_Options_GridOrientationDD_Initialize()
local orient = HealBot_Config.GridOrientation and HealBot_Config.GridOrientation[HealBot_Config.Current_Skin] or 1;
local info = {};
info.text = "Vertical (Columns)";
info.func = HealBot_Options_GridOrientationDD_OnClick;
info.value = 1;
info.checked = (orient == 1);
UIDropDownMenu_AddButton(info);
info = {};
info.text = "Horizontal (Rows)";
info.func = HealBot_Options_GridOrientationDD_OnClick;
info.value = 2;
info.checked = (orient == 2);
UIDropDownMenu_AddButton(info);
end
function HealBot_Options_GridOrientationDD_OnClick()
UIDropDownMenu_SetSelectedID(HealBot_Options_GridOrientation_Dropdown, this:GetID());
if not HealBot_Config.GridOrientation then HealBot_Config.GridOrientation = {} end if not HealBot_Config.GridOrientation then HealBot_Config.GridOrientation = {} end
if this:GetChecked() then HealBot_Config.GridOrientation[HealBot_Config.Current_Skin] = this.value;
HealBot_Config.GridOrientation[HealBot_Config.Current_Skin] = 2 -- Horizontal
else
HealBot_Config.GridOrientation[HealBot_Config.Current_Skin] = 1 -- Vertical
end
HealBot_Action_PartyChanged() HealBot_Action_PartyChanged()
if (this.value == 2) then
HealBot_Options_BarMaxRowsS:Hide();
HealBot_Options_BarNumColsS:Show();
else
HealBot_Options_BarMaxRowsS:Show();
HealBot_Options_BarNumColsS:Hide();
end
end end
-- HealBot_Options_NewSkin_OnTextChanged: UI handler for OnTextChanged options panel. -- HealBot_Options_NewSkin_OnTextChanged: UI handler for OnTextChanged options panel.
@@ -71,6 +145,36 @@ function HealBot_Options_NewSkinb_OnClick(this)
HealBot_Config.babortcola[HealBot_Options_NewSkin:GetText()] = HealBot_Config.babortcola[HealBot_Config.Current_Skin] HealBot_Config.babortcola[HealBot_Options_NewSkin:GetText()] = HealBot_Config.babortcola[HealBot_Config.Current_Skin]
HealBot_Config.ShowHeader[HealBot_Options_NewSkin:GetText()] = HealBot_Config.ShowHeader[HealBot_Config.Current_Skin] HealBot_Config.ShowHeader[HealBot_Options_NewSkin:GetText()] = HealBot_Config.ShowHeader[HealBot_Config.Current_Skin]
if not HealBot_Config.bcolormaxr then HealBot_Config.bcolormaxr = {} end
if not HealBot_Config.bcolormaxg then HealBot_Config.bcolormaxg = {} end
if not HealBot_Config.bcolormaxb then HealBot_Config.bcolormaxb = {} end
if not HealBot_Config.bcolorminr then HealBot_Config.bcolorminr = {} end
if not HealBot_Config.bcolorming then HealBot_Config.bcolorming = {} end
if not HealBot_Config.bcolorminb then HealBot_Config.bcolorminb = {} end
if not HealBot_Config.bfont then HealBot_Config.bfont = {} end
if not HealBot_Config.bframe then HealBot_Config.bframe = {} end
if not HealBot_Config.bframewidth then HealBot_Config.bframewidth = {} end
if not HealBot_Config.bframecolr then HealBot_Config.bframecolr = {} end
if not HealBot_Config.bframecolg then HealBot_Config.bframecolg = {} end
if not HealBot_Config.bframecolb then HealBot_Config.bframecolb = {} end
if not HealBot_Config.bframecola then HealBot_Config.bframecola = {} end
local curSkin = HealBot_Config.Current_Skin
local newSkin = HealBot_Options_NewSkin:GetText()
HealBot_Config.bcolormaxr[newSkin] = HealBot_Config.bcolormaxr[curSkin] or 0
HealBot_Config.bcolormaxg[newSkin] = HealBot_Config.bcolormaxg[curSkin] or 1
HealBot_Config.bcolormaxb[newSkin] = HealBot_Config.bcolormaxb[curSkin] or 0
HealBot_Config.bcolorminr[newSkin] = HealBot_Config.bcolorminr[curSkin] or 1
HealBot_Config.bcolorming[newSkin] = HealBot_Config.bcolorming[curSkin] or 0
HealBot_Config.bcolorminb[newSkin] = HealBot_Config.bcolorminb[curSkin] or 0
HealBot_Config.bfont[newSkin] = HealBot_Config.bfont[curSkin] or "Fonts\\FRIZQT__.TTF"
HealBot_Config.bframe[newSkin] = HealBot_Config.bframe[curSkin] or 0
HealBot_Config.bframewidth[newSkin] = HealBot_Config.bframewidth[curSkin] or 10
HealBot_Config.bframecolr[newSkin] = HealBot_Config.bframecolr[curSkin] or 1
HealBot_Config.bframecolg[newSkin] = HealBot_Config.bframecolg[curSkin] or 1
HealBot_Config.bframecolb[newSkin] = HealBot_Config.bframecolb[curSkin] or 1
HealBot_Config.bframecola[newSkin] = HealBot_Config.bframecola[curSkin] or 1
table.insert(HealBot_Skins,2,HealBot_Options_NewSkin:GetText()) table.insert(HealBot_Skins,2,HealBot_Options_NewSkin:GetText())
HealBot_Config.Skin_ID = 2; HealBot_Config.Skin_ID = 2;
HealBot_Config.Skins = HealBot_Skins; HealBot_Config.Current_Skin = HealBot_Options_NewSkin:GetText(); HealBot_Config.Skins = HealBot_Skins; HealBot_Config.Current_Skin = HealBot_Options_NewSkin:GetText();
@@ -118,6 +222,19 @@ function HealBot_Options_DeleteSkin_OnClick(this)
HealBot_Config.babortcolb[HealBot_Options_SkinsText:GetText()] = nil HealBot_Config.babortcolb[HealBot_Options_SkinsText:GetText()] = nil
HealBot_Config.babortcola[HealBot_Options_SkinsText:GetText()] = nil HealBot_Config.babortcola[HealBot_Options_SkinsText:GetText()] = nil
HealBot_Config.ShowHeader[HealBot_Options_SkinsText:GetText()] = nil HealBot_Config.ShowHeader[HealBot_Options_SkinsText:GetText()] = nil
if HealBot_Config.bcolormaxr then HealBot_Config.bcolormaxr[HealBot_Options_SkinsText:GetText()] = nil end
if HealBot_Config.bcolormaxg then HealBot_Config.bcolormaxg[HealBot_Options_SkinsText:GetText()] = nil end
if HealBot_Config.bcolormaxb then HealBot_Config.bcolormaxb[HealBot_Options_SkinsText:GetText()] = nil end
if HealBot_Config.bcolorminr then HealBot_Config.bcolorminr[HealBot_Options_SkinsText:GetText()] = nil end
if HealBot_Config.bcolorming then HealBot_Config.bcolorming[HealBot_Options_SkinsText:GetText()] = nil end
if HealBot_Config.bcolorminb then HealBot_Config.bcolorminb[HealBot_Options_SkinsText:GetText()] = nil end
if HealBot_Config.bfont then HealBot_Config.bfont[HealBot_Options_SkinsText:GetText()] = nil end
if HealBot_Config.bframe then HealBot_Config.bframe[HealBot_Options_SkinsText:GetText()] = nil end
if HealBot_Config.bframewidth then HealBot_Config.bframewidth[HealBot_Options_SkinsText:GetText()] = nil end
if HealBot_Config.bframecolr then HealBot_Config.bframecolr[HealBot_Options_SkinsText:GetText()] = nil end
if HealBot_Config.bframecolg then HealBot_Config.bframecolg[HealBot_Options_SkinsText:GetText()] = nil end
if HealBot_Config.bframecolb then HealBot_Config.bframecolb[HealBot_Options_SkinsText:GetText()] = nil end
if HealBot_Config.bframecola then HealBot_Config.bframecola[HealBot_Options_SkinsText:GetText()] = nil end
table.remove(HealBot_Skins,HealBot_Config.Skin_ID) table.remove(HealBot_Skins,HealBot_Config.Skin_ID)
HealBot_Config.Skin_ID = 1; HealBot_Config.Skin_ID = 1;
HealBot_Config.Skins = HealBot_Skins; HealBot_Config.Skins = HealBot_Skins;
@@ -158,3 +275,19 @@ function HealBot_Options_Skins_OnSelect()
HealBot_Options_SetSkins() HealBot_Options_SetSkins()
end end
end end
function HealBot_Options_TestBarsButton_OnClick(this)
if HealBot_Config.TestBarsOn then
HealBot_Config.TestBarsOn = false
this:SetText(HEALBOT_OPTIONS_TESTBARS.." OFF")
else
HealBot_Config.TestBarsOn = true
this:SetText(HEALBOT_OPTIONS_TESTBARS.." ON")
end
HealBot_Action_PartyChanged()
end
function HealBot_Options_NumTestBars_OnValueChanged(this)
HealBot_Config.numTestBars = this:GetValue()
if HealBot_Config.TestBarsOn then HealBot_Action_PartyChanged() end
end
+716
View File
@@ -0,0 +1,716 @@
<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_Skins.lua" />
<Frame name="HealBot_Options_Panel5" parent="HealBot_Options" hidden="true" setAllPoints="true">
<Frames>
<Frame name="HealBot_Options_Skins" inherits="UIDropDownMenuTemplate" id="1">
<Layers>
<Layer level="BACKGROUND">
<FontString name="HealBot_Options_ScaleFrameText" text="HEALBOT_OPTIONS_SKINTEXT" inherits="GameFontNormalSmall">
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="-45" y="-5" />
</Offset>
</Anchor>
</Anchors>
</FontString>
</Layer>
</Layers>
<Anchors>
<Anchor point="TOP">
<Offset>
<AbsDimension x="-50" y="-28" />
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad> HealBot_Options_Skins_OnLoad(this) </OnLoad>
</Scripts>
</Frame>
<Button name="HealBot_Options_DeleteSkin" inherits="UIPanelButtonTemplate" text="HEALBOT_OPTIONS_DELSKIN">
<Size>
<AbsDimension x="80" y="22"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_Skins" relativePoint="TOPRIGHT">
<Offset>
<AbsDimension x="7" y="-1"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnClick>HealBot_Options_DeleteSkin_OnClick(this)</OnClick>
</Scripts>
</Button>
<EditBox name="HealBot_Options_NewSkin" inherits="HealBot_Options_EditBoxTemplate">
<Size>
<AbsDimension x="100" y="20"/>
</Size>
<Layers>
<Layer level="BACKGROUND">
<FontString name="HealBot_Options_ScaleFrameText2" text="HEALBOT_OPTIONS_NEWSKINTEXT" inherits="GameFontNormalSmall">
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="-70" y="-2" />
</Offset>
</Anchor>
</Anchors>
</FontString>
</Layer>
</Layers>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_Skins" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="25" y="-2"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnTextChanged>
HealBot_Options_NewSkin_OnTextChanged(this)
</OnTextChanged>
</Scripts>
</EditBox>
<Button name="HealBot_Options_NewSkinb" inherits="UIPanelButtonTemplate" text="HEALBOT_OPTIONS_SAVESKIN">
<Size>
<AbsDimension x="80" y="22"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_NewSkin" relativePoint="TOPRIGHT">
<Offset>
<AbsDimension x="32" y="2"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnClick>HealBot_Options_NewSkinb_OnClick(this)</OnClick>
</Scripts>
</Button>
<ScrollFrame name="HealBot_Options_Skins_ScrollFrame" inherits="UIPanelScrollFrameTemplate">
<Size>
<AbsDimension x="475" y="330"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="20" y="-85"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnMouseWheel>
local scrollBar = getglobal(this:GetName().."ScrollBar");
if not scrollBar then return end
local current = scrollBar:GetValue();
local minVal, maxVal = scrollBar:GetMinMaxValues();
if arg1 &gt; 0 then
scrollBar:SetValue(math.max(minVal, current - 25));
else
scrollBar:SetValue(math.min(maxVal, current + 25));
end
</OnMouseWheel>
</Scripts>
<ScrollChild>
<Frame name="HealBot_Options_Scale">
<Size>
<AbsDimension x="475" y="490"/>
</Size>
<Frames>
<!-- COLUMN 1: Geometry -->
<Slider name="HealBot_Options_BarHeightS" inherits="HealBot_Options_SliderTemplate">
<Size><AbsDimension x="123" y="18" /></Size>
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="45" y="-15" /></Offset></Anchor></Anchors>
<Scripts>
<OnLoad>HealBot_Options_val_OnLoad(this,HEALBOT_OPTIONS_SKINHEIGHT,10,100)</OnLoad>
<OnValueChanged>HealBot_Options_BarHeightS_OnValueChanged(this)</OnValueChanged>
</Scripts>
</Slider>
<Slider name="HealBot_Options_BarWidthS" inherits="HealBot_Options_SliderTemplate">
<Size><AbsDimension x="123" y="17" /></Size>
<Anchors><Anchor point="TOPLEFT" relativeTo="HealBot_Options_BarHeightS" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="-20" /></Offset></Anchor></Anchors>
<Scripts>
<OnLoad>HealBot_Options_val_OnLoad(this,HEALBOT_OPTIONS_SKINWIDTH,50,225)</OnLoad>
<OnValueChanged>HealBot_Options_BarWidthS_OnValueChanged(this)</OnValueChanged>
</Scripts>
</Slider>
<Slider name="HealBot_Options_BarBRSpaceS" inherits="HealBot_Options_SliderTemplate">
<Size><AbsDimension x="123" y="17" /></Size>
<Anchors><Anchor point="TOPLEFT" relativeTo="HealBot_Options_BarWidthS" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="-20" /></Offset></Anchor></Anchors>
<Scripts>
<OnLoad>HealBot_Options_val_OnLoad(this,HEALBOT_OPTIONS_SKINBRSPACE,0,10)</OnLoad>
<OnValueChanged>HealBot_Options_BarBRSpaceS_OnValueChanged(this)</OnValueChanged>
</Scripts>
</Slider>
<Slider name="HealBot_Options_BarBCSpaceS" inherits="HealBot_Options_SliderTemplate">
<Size><AbsDimension x="123" y="17" /></Size>
<Anchors><Anchor point="TOPLEFT" relativeTo="HealBot_Options_BarBRSpaceS" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="-20" /></Offset></Anchor></Anchors>
<Scripts>
<OnLoad>HealBot_Options_val_OnLoad(this,HEALBOT_OPTIONS_SKINBCSPACE,0,25)</OnLoad>
<OnValueChanged>HealBot_Options_BarBCSpaceS_OnValueChanged(this)</OnValueChanged>
</Scripts>
</Slider>
<Slider name="HealBot_Options_FramePaddingS" inherits="HealBot_Options_SliderTemplate">
<Size><AbsDimension x="123" y="17" /></Size>
<Anchors><Anchor point="TOPLEFT" relativeTo="HealBot_Options_BarBCSpaceS" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="-20" /></Offset></Anchor></Anchors>
<Scripts>
<OnLoad>HealBot_Options_val_OnLoad(this,"Frame Padding",0,50)</OnLoad>
<OnValueChanged>HealBot_Options_FramePaddingS_OnValueChanged(this)</OnValueChanged>
</Scripts>
</Slider>
<Slider name="HealBot_Options_FontHeight" inherits="HealBot_Options_SliderTemplate">
<Size><AbsDimension x="123" y="17" /></Size>
<Anchors><Anchor point="TOPLEFT" relativeTo="HealBot_Options_FramePaddingS" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="-20" /></Offset></Anchor></Anchors>
<Scripts>
<OnLoad>HealBot_Options_val_OnLoad(this,HEALBOT_OPTIONS_SKINFHEIGHT,7,18)</OnLoad>
<OnValueChanged>HealBot_Options_FontHeight_OnValueChanged(this)</OnValueChanged>
</Scripts>
</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="BOTTOMLEFT"><Offset><AbsDimension x="0" y="-20" /></Offset></Anchor></Anchors>
<Scripts>
<OnLoad>HealBot_Options_val_OnLoad(this,"Icon size",5,30)</OnLoad>
<OnValueChanged>HealBot_Options_IconSizeS_OnValueChanged(this)</OnValueChanged>
</Scripts>
</Slider>
<!-- COLUMN 2: Grid & Layout -->
<CheckButton name="HealBot_Options_ShowHeaders" inherits="SendMailRadioButtonTemplate">
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="190" y="-5" /></Offset></Anchor></Anchors>
<Scripts>
<OnLoad>HealBot_Options_ShowHeaders_OnLoad(this,HEALBOT_OPTIONS_SHOWHEADERS)</OnLoad>
<OnClick>HealBot_Options_ShowHeaders_OnClick(this)</OnClick>
</Scripts>
</CheckButton>
<Frame name="HealBot_Options_GridOrientation_Dropdown" inherits="UIDropDownMenuTemplate" id="1">
<Anchors><Anchor point="TOPLEFT" relativeTo="HealBot_Options_ShowHeaders" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="-15" y="-20" /></Offset></Anchor></Anchors>
<Layers>
<Layer level="OVERLAY">
<FontString inherits="GameFontNormalSmall" text="Grid Layout">
<Anchors>
<Anchor point="BOTTOM" relativePoint="TOP">
<Offset><AbsDimension x="15" y="0"/></Offset>
</Anchor>
</Anchors>
</FontString>
</Layer>
</Layers>
<Scripts>
<OnLoad>HealBot_Options_GridOrientationDD_OnLoad(this)</OnLoad>
</Scripts>
</Frame>
<Slider name="HealBot_Options_BarNumColsS" inherits="HealBot_Options_SliderTemplate">
<Size><AbsDimension x="123" y="18" /></Size>
<Anchors><Anchor point="TOPLEFT" relativeTo="HealBot_Options_GridOrientation_Dropdown" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="15" y="-15" /></Offset></Anchor></Anchors>
<Scripts>
<OnLoad>
HealBot_Options_val_OnLoad(this,HEALBOT_OPTIONS_SKINNUMCOLS,1,8)
local orient = HealBot_Config.GridOrientation and HealBot_Config.GridOrientation[HealBot_Config.Current_Skin] or 1; if (orient == 2) then this:Show() else this:Hide() end
</OnLoad>
<OnValueChanged>HealBot_Options_BarNumColsS_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_GridOrientation_Dropdown" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="15" y="-15" /></Offset></Anchor></Anchors>
<Scripts>
<OnLoad>
HealBot_Options_val_OnLoad(this,"Max Rows",0,40)
local orient = HealBot_Config.GridOrientation and HealBot_Config.GridOrientation[HealBot_Config.Current_Skin] or 1; if (orient == 2) then this:Hide() else this:Show() end
</OnLoad>
<OnValueChanged>HealBot_Options_BarMaxRowsS_OnValueChanged(this)</OnValueChanged>
</Scripts>
</Slider>
<Slider name="HealBot_Options_AbortBarSize" inherits="HealBot_Options_SliderTemplate">
<Size><AbsDimension x="123" y="17" /></Size>
<Anchors><Anchor point="TOPLEFT" relativeTo="HealBot_Options_BarMaxRowsS" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="-20" /></Offset></Anchor></Anchors>
<Scripts>
<OnLoad>HealBot_Options_val_OnLoad(this,"Abort size",0,15)</OnLoad>
<OnValueChanged>HealBot_Options_AbortBarSize_OnValueChanged(this)</OnValueChanged>
</Scripts>
</Slider>
<Frame name="HealBot_Options_Font_Dropdown" inherits="UIDropDownMenuTemplate" id="2">
<Anchors><Anchor point="TOPLEFT" relativeTo="HealBot_Options_AbortBarSize" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="-15" y="-20" /></Offset></Anchor></Anchors>
<Layers>
<Layer level="OVERLAY">
<FontString inherits="GameFontNormalSmall" text="Font">
<Anchors>
<Anchor point="BOTTOM" relativePoint="TOP">
<Offset><AbsDimension x="15" y="0"/></Offset>
</Anchor>
</Anchors>
</FontString>
</Layer>
</Layers>
<Scripts>
<OnLoad>HealBot_Options_FontDD_OnLoad(this)</OnLoad>
</Scripts>
</Frame>
<Button name="HealBot_Options_TestBarsButton" inherits="UIPanelButtonTemplate" text="HEALBOT_OPTIONS_TESTBARS">
<Size><AbsDimension x="123" y="22"/></Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_Font_Dropdown" relativePoint="BOTTOMLEFT">
<Offset><AbsDimension x="15" y="-12"/></Offset>
</Anchor>
</Anchors>
<Scripts>
<OnClick>HealBot_Options_TestBarsButton_OnClick(this)</OnClick>
</Scripts>
</Button>
<Slider name="HealBot_Options_NumTestBarsS" inherits="HealBot_Options_SliderTemplate">
<Size><AbsDimension x="123" y="17"/></Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_TestBarsButton" relativePoint="BOTTOMLEFT">
<Offset><AbsDimension x="0" y="-18"/></Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_val_OnLoad(this,HEALBOT_OPTIONS_TESTBARS,1,40)</OnLoad>
<OnValueChanged>HealBot_Options_NumTestBars_OnValueChanged(this)</OnValueChanged>
</Scripts>
</Slider>
<!-- COLUMN 3: Visuals & Opacity -->
<CheckButton name="HealBot_Options_BarColorMode" inherits="SendMailRadioButtonTemplate">
<Anchors><Anchor point="TOPLEFT"><Offset><AbsDimension x="335" y="-5" /></Offset></Anchor></Anchors>
<Scripts>
<OnLoad>getglobal(this:GetName().."Text"):SetText("Class Colors")</OnLoad>
<OnClick>HealBot_Config.bcolormode[HealBot_Config.Current_Skin] = (this:GetChecked() and 2 or 1); HealBot_Action_ResetSkin()</OnClick>
</Scripts>
</CheckButton>
<CheckButton name="HealBot_Options_FontOutline" inherits="SendMailRadioButtonTemplate">
<Anchors><Anchor point="TOPLEFT" relativeTo="HealBot_Options_BarColorMode" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="-5" /></Offset></Anchor></Anchors>
<Scripts>
<OnLoad>getglobal(this:GetName().."Text"):SetText("Font Outline")</OnLoad>
<OnClick>HealBot_Config.bfontoutline[HealBot_Config.Current_Skin] = (this:GetChecked() and 1 or 0); HealBot_Action_ResetSkin()</OnClick>
</Scripts>
</CheckButton>
<CheckButton name="HealBot_Options_1pxBorders" inherits="SendMailRadioButtonTemplate">
<Anchors><Anchor point="TOPLEFT" relativeTo="HealBot_Options_FontOutline" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="-5" /></Offset></Anchor></Anchors>
<Scripts>
<OnLoad>getglobal(this:GetName().."Text"):SetText("1px Borders")</OnLoad>
<OnClick>HealBot_Config.bborder[HealBot_Config.Current_Skin] = (this:GetChecked() and 1 or 2); HealBot_Action_ResetSkin()</OnClick>
</Scripts>
</CheckButton>
<CheckButton name="HealBot_Options_BarFrame" inherits="SendMailRadioButtonTemplate">
<Anchors><Anchor point="TOPLEFT" relativeTo="HealBot_Options_1pxBorders" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="-5" /></Offset></Anchor></Anchors>
<Scripts>
<OnLoad>getglobal(this:GetName().."Text"):SetText("Bar Frames")</OnLoad>
<OnClick>HealBot_Options_BarFrame_OnClick(this)</OnClick>
</Scripts>
</CheckButton>
<Slider name="HealBot_Options_BarTextureS" inherits="HealBot_Options_SliderTemplate">
<Size><AbsDimension x="123" y="17" /></Size>
<Anchors><Anchor point="TOPLEFT" relativeTo="HealBot_Options_BarFrame" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="-15" /></Offset></Anchor></Anchors>
<Scripts>
<OnLoad>HealBot_Options_val_OnLoad(this,HEALBOT_OPTIONS_SKINTEXTURE,1,14)</OnLoad>
<OnValueChanged>HealBot_Options_BarTextureS_OnValueChanged(this)</OnValueChanged>
</Scripts>
</Slider>
<Slider name="HealBot_Options_BarAlpha" inherits="HealBot_Options_SliderTemplate">
<Size><AbsDimension x="123" y="17" /></Size>
<Anchors><Anchor point="TOPLEFT" relativeTo="HealBot_Options_BarTextureS" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="-20" /></Offset></Anchor></Anchors>
<Scripts>
<OnLoad>HealBot_Options_Pct_OnLoad_MinMax(this,HEALBOT_OPTIONS_BARALPHA,0.25,1)</OnLoad>
<OnValueChanged>HealBot_Options_BarAlpha_OnValueChanged(this)</OnValueChanged>
</Scripts>
</Slider>
<Slider name="HealBot_Options_BarAlphaInHeal" inherits="HealBot_Options_SliderTemplate">
<Size><AbsDimension x="123" y="17" /></Size>
<Anchors><Anchor point="TOPLEFT" relativeTo="HealBot_Options_BarAlpha" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="-20" /></Offset></Anchor></Anchors>
<Scripts>
<OnLoad>HealBot_Options_Pct_OnLoad_MinMax(this,HEALBOT_OPTIONS_BARALPHAINHEAL,0.05,0.75)</OnLoad>
<OnValueChanged>HealBot_Options_BarAlphaInHeal_OnValueChanged(this)</OnValueChanged>
</Scripts>
</Slider>
<Slider name="HealBot_Options_BarAlphaDis" inherits="HealBot_Options_SliderTemplate">
<Size><AbsDimension x="123" y="17" /></Size>
<Anchors><Anchor point="TOPLEFT" relativeTo="HealBot_Options_BarAlphaInHeal" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="-20" /></Offset></Anchor></Anchors>
<Scripts>
<OnLoad>HealBot_Options_Pct_OnLoad(this,HEALBOT_OPTIONS_BARALPHADIS)</OnLoad>
<OnValueChanged>HealBot_Options_BarAlphaDis_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_BarAlphaDis" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="-20" /></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_BarFrameWidthS" inherits="HealBot_Options_SliderTemplate">
<Size><AbsDimension x="123" y="17" /></Size>
<Anchors><Anchor point="TOPLEFT" relativeTo="HealBot_Options_BorderThicknessS" relativePoint="BOTTOMLEFT"><Offset><AbsDimension x="0" y="-20" /></Offset></Anchor></Anchors>
<Scripts>
<OnLoad>HealBot_Options_val_OnLoad(this,"Frame Width",1,20)</OnLoad>
<OnValueChanged>HealBot_Options_BarFrameWidthS_OnValueChanged(this)</OnValueChanged>
</Scripts>
</Slider>
<!-- BOTTOM ROW 1: Max HP, Min HP, Font Enabled, Font Disabled -->
<StatusBar name="HealBot_MaxHPColorpick" inherits="TextStatusBar">
<Size><AbsDimension x="87" y="18"/></Size>
<Anchors>
<Anchor point="TOPLEFT">
<Offset><AbsDimension x="20" y="-345"/></Offset>
</Anchor>
</Anchors>
<Layers>
<Layer level="OVERLAY">
<FontString inherits="GameFontNormalSmall" text="Max Health">
<Anchors>
<Anchor point="BOTTOM" relativePoint="TOP">
<Offset><AbsDimension x="0" y="2"/></Offset>
</Anchor>
</Anchors>
</FontString>
<FontString name="HealBot_MaxHPColorpickt" inherits="GameFontHighlightSmall" text="HEALBOT_SKIN_MAXHPTEXT">
<Anchors><Anchor point="CENTER"/></Anchors>
</FontString>
</Layer>
</Layers>
<Scripts><OnLoad>this:SetMinMaxValues(0,100); this:SetValue(100);</OnLoad></Scripts>
<BarTexture file="Interface\TargetingFrame\UI-StatusBar"/>
<BarColor r="0" g="1" b="0"/>
</StatusBar>
<Button name="HealBot_MaxHPColorpickb">
<Size><AbsDimension x="87" y="18"/></Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_MaxHPColorpick" relativePoint="TOPLEFT">
<Offset><AbsDimension x="0" y="0"/></Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>this:SetFrameLevel(this:GetParent():GetFrameLevel() + 2)</OnLoad>
<OnClick>HealBot_SkinColorpick_OnClick("MaxHP")</OnClick>
</Scripts>
</Button>
<StatusBar name="HealBot_MinHPColorpick" inherits="TextStatusBar">
<Size><AbsDimension x="87" y="18"/></Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_MaxHPColorpick" relativePoint="TOPRIGHT">
<Offset><AbsDimension x="12" y="0"/></Offset>
</Anchor>
</Anchors>
<Layers>
<Layer level="OVERLAY">
<FontString inherits="GameFontNormalSmall" text="Min Health">
<Anchors>
<Anchor point="BOTTOM" relativePoint="TOP">
<Offset><AbsDimension x="0" y="2"/></Offset>
</Anchor>
</Anchors>
</FontString>
<FontString name="HealBot_MinHPColorpickt" inherits="GameFontHighlightSmall" text="HEALBOT_SKIN_MINHPTEXT">
<Anchors><Anchor point="CENTER"/></Anchors>
</FontString>
</Layer>
</Layers>
<Scripts><OnLoad>this:SetMinMaxValues(0,100); this:SetValue(100);</OnLoad></Scripts>
<BarTexture file="Interface\TargetingFrame\UI-StatusBar"/>
<BarColor r="1" g="0" b="0"/>
</StatusBar>
<Button name="HealBot_MinHPColorpickb">
<Size><AbsDimension x="87" y="18"/></Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_MinHPColorpick" relativePoint="TOPLEFT">
<Offset><AbsDimension x="0" y="0"/></Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>this:SetFrameLevel(this:GetParent():GetFrameLevel() + 2)</OnLoad>
<OnClick>HealBot_SkinColorpick_OnClick("MinHP")</OnClick>
</Scripts>
</Button>
<StatusBar name="HealBot_EnTextColorpick" inherits="TextStatusBar">
<Size><AbsDimension x="87" y="18"/></Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_MinHPColorpick" relativePoint="TOPRIGHT">
<Offset><AbsDimension x="12" y="0"/></Offset>
</Anchor>
</Anchors>
<Layers>
<Layer level="OVERLAY">
<FontString inherits="GameFontNormalSmall" text="Font Normal">
<Anchors>
<Anchor point="BOTTOM" relativePoint="TOP">
<Offset><AbsDimension x="0" y="2"/></Offset>
</Anchor>
</Anchors>
</FontString>
<FontString name="HealBot_EnTextColorpickt" inherits="GameFontHighlightSmall" text="HEALBOT_SKIN_ENTEXT">
<Anchors><Anchor point="CENTER"/></Anchors>
</FontString>
</Layer>
</Layers>
<Scripts><OnLoad>this:SetMinMaxValues(0,100); this:SetValue(70);</OnLoad></Scripts>
<BarTexture file="Interface\TargetingFrame\UI-StatusBar"/>
<BarColor r="0" g="1" b="0"/>
</StatusBar>
<StatusBar name="HealBot_EnTextColorpickin" inherits="TextStatusBar">
<Size><AbsDimension x="87" y="18"/></Size>
<Anchors><Anchor point="TOPLEFT" relativeTo="HealBot_EnTextColorpick"/></Anchors>
<Scripts><OnLoad>this:SetMinMaxValues(0,100); this:SetValue(100);</OnLoad></Scripts>
<BarTexture file="Interface\TargetingFrame\UI-StatusBar"/>
<BarColor r="0" g="1" b="0"/>
</StatusBar>
<Button name="HealBot_EnTextColorpickb">
<Size><AbsDimension x="87" y="18"/></Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_EnTextColorpick" relativePoint="TOPLEFT">
<Offset><AbsDimension x="0" y="0"/></Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>this:SetFrameLevel(this:GetParent():GetFrameLevel() + 2)</OnLoad>
<OnClick>HealBot_SkinColorpick_OnClick("En")</OnClick>
</Scripts>
</Button>
<StatusBar name="HealBot_DisTextColorpick" inherits="TextStatusBar">
<Size><AbsDimension x="87" y="18"/></Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_EnTextColorpick" relativePoint="TOPRIGHT">
<Offset><AbsDimension x="12" y="0"/></Offset>
</Anchor>
</Anchors>
<Layers>
<Layer level="OVERLAY">
<FontString inherits="GameFontNormalSmall" text="Font Disabled">
<Anchors>
<Anchor point="BOTTOM" relativePoint="TOP">
<Offset><AbsDimension x="0" y="2"/></Offset>
</Anchor>
</Anchors>
</FontString>
<FontString name="HealBot_DisTextColorpickt" inherits="GameFontHighlightSmall" text="HEALBOT_SKIN_DISTEXT">
<Anchors><Anchor point="CENTER"/></Anchors>
</FontString>
</Layer>
</Layers>
<Scripts><OnLoad>this:SetMinMaxValues(0,100); this:SetValue(100);</OnLoad></Scripts>
<BarTexture file="Interface\TargetingFrame\UI-StatusBar"/>
<BarColor r="0" g="1" b="0"/>
</StatusBar>
<Button name="HealBot_DisTextColorpickb">
<Size><AbsDimension x="87" y="18"/></Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_DisTextColorpick" relativePoint="TOPLEFT">
<Offset><AbsDimension x="0" y="0"/></Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>this:SetFrameLevel(this:GetParent():GetFrameLevel() + 2)</OnLoad>
<OnClick>HealBot_SkinColorpick_OnClick("Dis")</OnClick>
</Scripts>
</Button>
<!-- BOTTOM ROW 2: Font Debuff, Background, Border, Abort Bar -->
<StatusBar name="HealBot_DebTextColorpick" inherits="TextStatusBar">
<Size><AbsDimension x="87" y="18"/></Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_MaxHPColorpick" relativePoint="BOTTOMLEFT">
<Offset><AbsDimension x="0" y="-22"/></Offset>
</Anchor>
</Anchors>
<Layers>
<Layer level="OVERLAY">
<FontString inherits="GameFontNormalSmall" text="Font Debuff">
<Anchors>
<Anchor point="BOTTOM" relativePoint="TOP">
<Offset><AbsDimension x="0" y="2"/></Offset>
</Anchor>
</Anchors>
</FontString>
<FontString name="HealBot_DebTextColorpickt" inherits="GameFontHighlightSmall" text="HEALBOT_SKIN_DEBTEXT">
<Anchors><Anchor point="CENTER"/></Anchors>
</FontString>
</Layer>
</Layers>
<Scripts><OnLoad>this:SetMinMaxValues(0,100); this:SetValue(100);</OnLoad></Scripts>
<BarTexture file="Interface\TargetingFrame\UI-StatusBar"/>
<BarColor r="0" g="1" b="0"/>
</StatusBar>
<Button name="HealBot_DebTextColorpickb">
<Size><AbsDimension x="87" y="18"/></Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_DebTextColorpick" relativePoint="TOPLEFT">
<Offset><AbsDimension x="0" y="0"/></Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>this:SetFrameLevel(this:GetParent():GetFrameLevel() + 2)</OnLoad>
<OnClick>HealBot_SkinColorpick_OnClick("Debuff")</OnClick>
</Scripts>
</Button>
<StatusBar name="HealBot_BackgroundColorpick" inherits="TextStatusBar">
<Size><AbsDimension x="87" y="18"/></Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_DebTextColorpick" relativePoint="TOPRIGHT">
<Offset><AbsDimension x="12" y="0"/></Offset>
</Anchor>
</Anchors>
<Layers>
<Layer level="OVERLAY">
<FontString inherits="GameFontNormalSmall" text="Background">
<Anchors>
<Anchor point="BOTTOM" relativePoint="TOP">
<Offset><AbsDimension x="0" y="2"/></Offset>
</Anchor>
</Anchors>
</FontString>
<FontString inherits="GameFontHighlightSmall" text="HEALBOT_SKIN_BACKTEXT">
<Anchors><Anchor point="CENTER"/></Anchors>
</FontString>
</Layer>
</Layers>
<Scripts><OnLoad>this:SetMinMaxValues(0,100); this:SetValue(100);</OnLoad></Scripts>
<BarTexture file="Interface\TargetingFrame\UI-StatusBar"/>
<BarColor r="0" g="1" b="0"/>
</StatusBar>
<Button name="HealBot_BackgroundColorpickb">
<Size><AbsDimension x="87" y="18"/></Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_BackgroundColorpick" relativePoint="TOPLEFT">
<Offset><AbsDimension x="0" y="0"/></Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>this:SetFrameLevel(this:GetParent():GetFrameLevel() + 2)</OnLoad>
<OnClick>HealBot_SkinColorpick_OnClick("Back")</OnClick>
</Scripts>
</Button>
<StatusBar name="HealBot_BorderColorpick" inherits="TextStatusBar">
<Size><AbsDimension x="87" y="18"/></Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_BackgroundColorpick" relativePoint="TOPRIGHT">
<Offset><AbsDimension x="12" y="0"/></Offset>
</Anchor>
</Anchors>
<Layers>
<Layer level="OVERLAY">
<FontString inherits="GameFontNormalSmall" text="Border">
<Anchors>
<Anchor point="BOTTOM" relativePoint="TOP">
<Offset><AbsDimension x="0" y="2"/></Offset>
</Anchor>
</Anchors>
</FontString>
<FontString inherits="GameFontHighlightSmall" text="HEALBOT_SKIN_BORDERTEXT">
<Anchors><Anchor point="CENTER"/></Anchors>
</FontString>
</Layer>
</Layers>
<Scripts><OnLoad>this:SetMinMaxValues(0,100); this:SetValue(100);</OnLoad></Scripts>
<BarTexture file="Interface\TargetingFrame\UI-StatusBar"/>
<BarColor r="0" g="1" b="0"/>
</StatusBar>
<Button name="HealBot_BorderColorpickb">
<Size><AbsDimension x="87" y="18"/></Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_BorderColorpick" relativePoint="TOPLEFT">
<Offset><AbsDimension x="0" y="0"/></Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>this:SetFrameLevel(this:GetParent():GetFrameLevel() + 2)</OnLoad>
<OnClick>HealBot_SkinColorpick_OnClick("Bor")</OnClick>
</Scripts>
</Button>
<StatusBar name="HealBot_AbortColorpick" inherits="TextStatusBar">
<Size><AbsDimension x="87" y="18"/></Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_BorderColorpick" relativePoint="TOPRIGHT">
<Offset><AbsDimension x="12" y="0"/></Offset>
</Anchor>
</Anchors>
<Layers>
<Layer level="OVERLAY">
<FontString inherits="GameFontNormalSmall" text="Abort Bar">
<Anchors>
<Anchor point="BOTTOM" relativePoint="TOP">
<Offset><AbsDimension x="0" y="2"/></Offset>
</Anchor>
</Anchors>
</FontString>
<FontString inherits="GameFontHighlightSmall" text="HEALBOT_ACTION_ABORT">
<Anchors><Anchor point="CENTER"/></Anchors>
</FontString>
</Layer>
</Layers>
<Scripts><OnLoad>this:SetMinMaxValues(0,100); this:SetValue(100);</OnLoad></Scripts>
<BarTexture file="Interface\TargetingFrame\UI-StatusBar"/>
<BarColor r="0" g="1" b="0"/>
</StatusBar>
<Button name="HealBot_AbortColorpickb">
<Size><AbsDimension x="87" y="18"/></Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_AbortColorpick" relativePoint="TOPLEFT">
<Offset><AbsDimension x="0" y="0"/></Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>this:SetFrameLevel(this:GetParent():GetFrameLevel() + 2)</OnLoad>
<OnClick>HealBot_SkinColorpick_OnClick("Abort")</OnClick>
</Scripts>
</Button>
<!-- BOTTOM ROW 3: Bar Frame Color -->
<StatusBar name="HealBot_BarFrameColorpick" inherits="TextStatusBar">
<Size><AbsDimension x="87" y="18"/></Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_DebTextColorpick" relativePoint="BOTTOMLEFT">
<Offset><AbsDimension x="0" y="-22"/></Offset>
</Anchor>
</Anchors>
<Layers>
<Layer level="OVERLAY">
<FontString inherits="GameFontNormalSmall" text="Bar Frame">
<Anchors>
<Anchor point="BOTTOM" relativePoint="TOP">
<Offset><AbsDimension x="0" y="2"/></Offset>
</Anchor>
</Anchors>
</FontString>
<FontString inherits="GameFontHighlightSmall" text="Bar Frame">
<Anchors><Anchor point="CENTER"/></Anchors>
</FontString>
</Layer>
</Layers>
<Scripts><OnLoad>this:SetMinMaxValues(0,100); this:SetValue(100);</OnLoad></Scripts>
<BarTexture file="Interface\TargetingFrame\UI-StatusBar"/>
<BarColor r="1" g="1" b="1"/>
</StatusBar>
<Button name="HealBot_BarFrameColorpickb">
<Size><AbsDimension x="87" y="18"/></Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_BarFrameColorpick" relativePoint="TOPLEFT">
<Offset><AbsDimension x="0" y="0"/></Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>this:SetFrameLevel(this:GetParent():GetFrameLevel() + 2)</OnLoad>
<OnClick>HealBot_SkinColorpick_OnClick("BarFrame")</OnClick>
</Scripts>
</Button>
</Frames>
</Frame>
</ScrollChild>
</ScrollFrame>
</Frames>
</Frame>
</Ui>
@@ -116,6 +116,11 @@ function HealBot_Options_ComboClass_Text()
HealBot_Options_Shift:SetText(combo["Shift"..button] or "") HealBot_Options_Shift:SetText(combo["Shift"..button] or "")
HealBot_Options_Ctrl:SetText(combo["Ctrl"..button] or "") HealBot_Options_Ctrl:SetText(combo["Ctrl"..button] or "")
HealBot_Options_ShiftCtrl:SetText(combo["ShiftCtrl"..button] or "") HealBot_Options_ShiftCtrl:SetText(combo["ShiftCtrl"..button] or "")
else
HealBot_Options_Click:SetText("")
HealBot_Options_Shift:SetText("")
HealBot_Options_Ctrl:SetText("")
HealBot_Options_ShiftCtrl:SetText("")
end end
end end
+320
View File
@@ -0,0 +1,320 @@
<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_Spells.lua" />
<Frame name="HealBot_Options_Panel2" parent="HealBot_Options" hidden="true" setAllPoints="true">
<Frames>
<Frame name="HealBot_Options_KeysFrame">
<Size>
<AbsDimension y="268"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="20" y="-30"/>
</Offset>
</Anchor>
<Anchor point="TOPRIGHT">
<Offset>
<AbsDimension x="-20" y="-30"/>
</Offset>
</Anchor>
</Anchors>
<Layers>
<Layer level="BACKGROUND">
<FontString name="HealBot_ComboButtons_ButtonText1" text="HEALBOT_OPTIONS_USEBUTTONS" inherits="GameFontNormalSmall">
<Anchors>
<Anchor point="TOP">
<Offset>
<AbsDimension x="0" y="-5"/>
</Offset>
</Anchor>
</Anchors>
</FontString>
</Layer>
</Layers>
<Frames>
<Slider name="HealBot_Options_Dummy" hidden="true" inherits="HealBot_Options_SliderTemplate">
<Anchors>
<Anchor point="TOP">
<Offset>
<AbsDimension x="0" y="0"/>
</Offset>
</Anchor>
</Anchors>
</Slider>
<Frame name="HealBot_Options_ComboClassButton">
<Size>
<AbsDimension x="40" y="16"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_Dummy" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="0" y="-22"/>
</Offset>
</Anchor>
</Anchors>
<Layers>
<Layer level="BACKGROUND">
<FontString name="HealBot_ComboButtons_ButtonText" text="HEALBOT_OPTIONS_COMBOBUTTON" inherits="GameFontNormalSmall">
<Anchors>
<Anchor point="LEFT">
<Offset>
<AbsDimension x="0" y="0"/>
</Offset>
</Anchor>
</Anchors>
</FontString>
</Layer>
</Layers>
</Frame>
<CheckButton name="HealBot_ComboButtons_Button1" inherits="SendMailRadioButtonTemplate" id="1">
<Anchors>
<Anchor point="LEFT" relativeTo="HealBot_Options_ComboClassButton" relativePoint="RIGHT">
<Offset>
<AbsDimension x="5" y="0"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_ComboButtons_Button_OnLoad(this,HEALBOT_OPTIONS_BUTTONLEFT)</OnLoad>
<OnClick>HealBot_ComboButtons_Button_OnClick(this,this:GetID())</OnClick>
</Scripts>
</CheckButton>
<CheckButton name="HealBot_ComboButtons_Button2" inherits="SendMailRadioButtonTemplate" id="2">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_ComboButtons_Button1" relativePoint="TOPRIGHT">
<Offset>
<AbsDimension x="40" y="0"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_ComboButtons_Button_OnLoad(this,HEALBOT_OPTIONS_BUTTONMIDDLE)</OnLoad>
<OnClick>HealBot_ComboButtons_Button_OnClick(this,this:GetID())</OnClick>
</Scripts>
</CheckButton>
<CheckButton name="HealBot_ComboButtons_Button3" inherits="SendMailRadioButtonTemplate" id="3">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_ComboButtons_Button2" relativePoint="TOPRIGHT">
<Offset>
<AbsDimension x="50" y="0"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_ComboButtons_Button_OnLoad(this,HEALBOT_OPTIONS_BUTTONRIGHT)</OnLoad>
<OnClick>HealBot_ComboButtons_Button_OnClick(this,this:GetID())</OnClick>
</Scripts>
</CheckButton>
<CheckButton name="HealBot_ComboButtons_Button4" inherits="SendMailRadioButtonTemplate" id="4">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_ComboButtons_Button1" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="0" y="-4"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_ComboButtons_Button_OnLoad(this,HEALBOT_OPTIONS_BUTTON4)</OnLoad>
<OnClick>HealBot_ComboButtons_Button_OnClick(this,this:GetID())</OnClick>
</Scripts>
</CheckButton>
<CheckButton name="HealBot_ComboButtons_Button5" inherits="SendMailRadioButtonTemplate" id="5">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_ComboButtons_Button2" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="0" y="-4"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_ComboButtons_Button_OnLoad(this,HEALBOT_OPTIONS_BUTTON5)</OnLoad>
<OnClick>HealBot_ComboButtons_Button_OnClick(this,this:GetID())</OnClick>
</Scripts>
</CheckButton>
<EditBox name="HealBot_Options_Click" inherits="HealBot_Options_EditBoxTemplate">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_Dummy" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="0" y="-68"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>
HealBot_Options_EditBox_OnLoad(this,HEALBOT_OPTIONS_CLICK)
</OnLoad>
<OnTextChanged>
HealBot_Options_Click_OnTextChanged(this)
</OnTextChanged>
</Scripts>
</EditBox>
<EditBox name="HealBot_Options_Shift" inherits="HealBot_Options_EditBoxTemplate">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_Click" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="0" y="-20"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>
HealBot_Options_EditBox_OnLoad(this,HEALBOT_OPTIONS_SHIFT)
</OnLoad>
<OnTextChanged>
HealBot_Options_Shift_OnTextChanged(this)
</OnTextChanged>
</Scripts>
</EditBox>
<EditBox name="HealBot_Options_Ctrl" inherits="HealBot_Options_EditBoxTemplate">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_Shift" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="0" y="-20"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>
HealBot_Options_EditBox_OnLoad(this,HEALBOT_OPTIONS_CTRL)
</OnLoad>
<OnTextChanged>
HealBot_Options_Ctrl_OnTextChanged(this)
</OnTextChanged>
</Scripts>
</EditBox>
<EditBox name="HealBot_Options_ShiftCtrl" inherits="HealBot_Options_EditBoxTemplate">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_Ctrl" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="0" y="-20"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>
HealBot_Options_EditBox_OnLoad(this,HEALBOT_OPTIONS_SHIFTCTRL)
</OnLoad>
<OnTextChanged>
HealBot_Options_ShiftCtrl_OnTextChanged(this)
</OnTextChanged>
</Scripts>
</EditBox>
<CheckButton name="HealBot_Options_EnableHealthy" inherits="OptionsCheckButtonTemplate">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_ShiftCtrl" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="0" y="-4"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_EnableHealthy_OnLoad(this,HEALBOT_OPTIONS_ENABLEHEALTHY)</OnLoad>
<OnClick>HealBot_Options_EnableHealthy_OnClick(this)</OnClick>
</Scripts>
</CheckButton>
</Frames>
</Frame>
<Frame name="HealBot_Options_TooltipsPanel">
<Size>
<AbsDimension y="118"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_EnableHealthy" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="0" y="-12"/>
</Offset>
</Anchor>
<Anchor point="TOPRIGHT" relativeTo="HealBot_Options_ShiftCtrl" relativePoint="BOTTOMRIGHT">
<Offset>
<AbsDimension x="0" y="-12"/>
</Offset>
</Anchor>
</Anchors>
<Frames>
<CheckButton name="HealBot_Options_ShowTooltip" inherits="OptionsCheckButtonTemplate">
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="0" y="0"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_ShowTooltip_OnLoad(this,HEALBOT_OPTIONS_SHOWTOOLTIP)</OnLoad>
<OnClick>HealBot_Options_ShowTooltip_OnClick(this)</OnClick>
</Scripts>
</CheckButton>
<Frame name="HealBot_Options_TooltipPos" inherits="UIDropDownMenuTemplate" id="1">
<Anchors>
<Anchor point="TOPRIGHT">
<Offset>
<AbsDimension x="15" y="2"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_TooltipPos_OnLoad(this)</OnLoad>
</Scripts>
</Frame>
<CheckButton name="HealBot_Options_ShowTooltipTarget" inherits="OptionsCheckButtonTemplate">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_ShowTooltip" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="0" y="-4"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_ShowTooltipTarget_OnLoad(this,HEALBOT_OPTIONS_SHOWUNITTOOLTIP)</OnLoad>
<OnClick>HealBot_Options_ShowTooltipTarget_OnClick(this)</OnClick>
</Scripts>
</CheckButton>
<CheckButton name="HealBot_Options_ShowTooltipSpellDetail" inherits="OptionsCheckButtonTemplate">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_ShowTooltipTarget" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="0" y="-4"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_ShowTooltipSpellDetail_OnLoad(this,HEALBOT_OPTIONS_SHOWDETTOOLTIP)</OnLoad>
<OnClick>HealBot_Options_ShowTooltipSpellDetail_OnClick(this)</OnClick>
</Scripts>
</CheckButton>
<CheckButton name="HealBot_Options_ShowTooltipInstant" inherits="OptionsCheckButtonTemplate">
<Anchors>
<Anchor point="TOPLEFT" relativeTo="HealBot_Options_ShowTooltipSpellDetail" relativePoint="BOTTOMLEFT">
<Offset>
<AbsDimension x="0" y="-4"/>
</Offset>
</Anchor>
</Anchors>
<Scripts>
<OnLoad>HealBot_Options_ShowTooltipInstant_OnLoad(this,HEALBOT_OPTIONS_SHOWRECTOOLTIP)</OnLoad>
<OnClick>HealBot_Options_ShowTooltipInstant_OnClick(this)</OnClick>
</Scripts>
</CheckButton>
</Frames>
</Frame>
</Frames>
</Frame>
</Ui>
+61 -3
View File
@@ -21,6 +21,8 @@ Default installation path: `C:\Program Files\World of Warcraft\Interface\AddOns\
* `/hb` - Toggles the main HealBot panel on and off * `/hb` - Toggles the main HealBot panel on and off
* `/hb options` - Toggles the HealBot options panel on and off * `/hb options` - Toggles the HealBot options panel on and off
* `/hb reset` - Resets the contents of the main HealBot panel * `/hb reset` - Resets the contents of the main HealBot panel
* `/hb debug` - Toggles in-game debug message output to the main chat frame
* `/hb test <poison|curse|disease|magic|clear>` - Simulates a debuff effect on player and test bars to preview visual animation overlays without needing live debuffs (alias: `/hb debuff <type>`)
### 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. Features memory recycling pool and event loop decoupling for zero-stutter combat. * **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.
@@ -30,13 +32,14 @@ Default installation path: `C:\Program Files\World of Warcraft\Interface\AddOns\
* **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. * **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). * **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). Optional extended HoT timer tracker togglable below frames. With integration modules enabled there are timers as icon overlay, a list or both combined togglable.
* **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.
* **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), with selectable display modes: classic Whole Bar tinting, Frame / Border highlights, Glow Overlays, and animated flipbooks (poison drips, rising curse flames, 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.
* **Skin swap on different raid sizes** Togglable option to iterate over skin presets for different raid sizes - chaning frames styles dynamicly dependning on player count.
* **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). * **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 ### To be implemented
@@ -49,6 +52,56 @@ Default installation path: `C:\Program Files\World of Warcraft\Interface\AddOns\
### Change Log ### Change Log
**v1.7.Unreleased**
* **Architecture - Codebase Modularization & Subdirectory Reorganization:** De-cluttered flat root directory by organizing into dedicated subdirectories (`Controller/`, `View/`, `Model/`, `Options/`, `Locales/`, `Integrations/`). Split monolithic files: partitioned `HealBot_View_Layout.lua` (1,782 lines) into `HealBot_View_Grid.lua` (roster math and positioning), `HealBot_View_Bars.lua` (bar rendering and styling), and `HealBot_View_HoT.lua` (HoT overlay timers and list). Split `HealBot_Controller_Spells.lua` (929 lines) into `HealBot_Controller_SpellBook.lua` (spellbook scanning and gear/talent bonus math) and `HealBot_Controller_Casting.lua` (active combat casting and shapeshift handling). Enforced zero function loss through automated AST baseline verification.
* **Bug Fix - Test Bars Crash & White Texture Glitch:** Resolved `Unknown unit name: Test1` and `Unknown unit name: Test25` crashes occurring on test bar activation and hover. Fixed non-unit tokens being passed into Vanilla API functions (`UnitIsDeadOrGhost`, `UnitIsUnit`, `UnitClass`) by evaluating `string.find(unit, "^Test")` before native API calls. Initialized default status flags (`isDead`, `isGhost`, `isConnected`) in dummy model entries, allowing test bars to fully style, texture, and color without halting UI layout.
* **Bug Fix - Line of Sight & Target Range Resolution:** Resolved Line of Sight regression where the target bar failed to update or dim when obstructed. Fixed `UnitInLineOfSight` parameter mismatch with ClassicAPI (1-arg signature required), added multi-tier fallback chaining to `UnitXP`, and enforced `CheckInteractDistance` on `target` units during Vanilla map coordinate fallbacks. Added range validation to non-healer class bar evaluation.
* **Bug Fix - Out-of-Range Bar Glow on Modifier Press:** Decoupled unit bar enable/range evaluation from physical modifier keys (`IsShiftKeyDown()`, etc.) in `HealBot_CanHeal`, preventing out-of-range and obstructed units from falsely brightening to full alpha when holding Shift/Ctrl/Alt. Enforced range checking across all action patterns (`"Target"`, macros, items, scripts) in `HealBot_GetHealSpell`, and fixed table key case sensitivity on spell range extraction (`Range` vs `range`).
* **Feature - HoT Timer Display Modes & Positioning:** Added configurable HoT timer list position dropdown (`Below`, `Above`, `Left`, `Right`) relative to raid frames. Added `Icon Overlay` mode rendering countdown timers directly on health bar HoT icons, and a `Both` mode allowing simultaneous timer list and on-bar icon countdown numbers. Excluded pets from HoT timer lists and overlays. Optimized expiration lookups with O(1) texture-to-spell mappings.
* **Refactor & Feature - Unified Aura & HoT Tracking:** Unified bar icons and HoT timers into a master dictionary (`HealBot_TrackedAuras`) in `HealBot_Data.lua`. Added Weakened Soul, Fear Ward, Abolish Disease, and Abolish Poison to active timer bars with localized client support and debuff-aware pruning.
* **Bug Fix - HoT Tracking Premature Deletion & GUID Resolution:** Resolved issue where synchronous aura scans on spell cast prematurely purged active HoTs before server buff packets arrived. Fixed HoT timer list showing raw GUID strings instead of names by ensuring GUID caches populate immediately on `PLAYER_ENTERING_WORLD` (even when solo) and adding multi-tier name resolution fallbacks. Fixed unit bar icon countdown numbers not rendering by adding explicit overlay frame show triggers and normalized texture lookup fallbacks.
* **Feature - Debuff Visual Overlays & Animated Sprite Sheets:** Added selectable visual styles for Cure / Dispel / Cleanse (CDC) debuff alerts in Options -> Cure (`Whole Bar`, `Frame / Border`, `Glow Overlay`, `Glow + Frame`, `Animated`, `Disabled`). Modeled high-readability animated flipbook sprite sheets: Poison (dripping slime teardrops), Curse (tall 64px demonic flame pillars with embers and S-sway), Magic (large 48px rotating Arcane Sigil with outer celestial rings, astrolabe tick bands, and crackling mana lightning forks), and Disease (heavy necrotic border crust with 5 thick throbbing rot tendrils and bursting pustule boils). Integrated lightweight, throttled (15 FPS) UV sprite animation engine directly into `HealBot_OnUpdate` with zero garbage allocation.
* **Feature - Debuff Animation Test Slash Commands:** Added `/hb test <poison|curse|disease|magic|clear>` (and `/hb debuff <type>`) commands to simulate active debuff animations on player and dummy test bars out-of-combat. Automatically activates Animated mode and dummy debuff icons, while guarding state against aura event overwrite until stopped.
* **Feature - Bar Frames (Borders) & Scrollable Skins Menu:** Added separate option in Skins menu to display frames/borders around each unit health bar with configurable width (1-20) and a dedicated color picker. Bar frames adapt to the skin's sharp ("1px Borders", `WHITE8X8`) or fuzzy (default tooltip border, `UI-Tooltip-Border`) style. Wired directly into the CDC debuff overlay engine: when cleanable debuffs trigger with Frame/Border, Glow+Frame, or Animated+Frame mode, the bar frame dynamically adopts the CDC debuff color and returns to the bar frame's regular color when dispelled. Implemented a scrollable container (`UIPanelScrollFrameTemplate`) with mouse wheel support in the Skins options panel to comfortably fit all layout, geometry, and color settings without control overlap.
* **Feature - CDC "Animated + Frame" Overlay Option:** Added "Animated + Frame" display option to the Cure / Dispel (CDC) options panel. Combines the active procedural animated debuff flipbook with a colored debuff border highlighting the bar frame.
**v1.7.7**
* **Bug Fix - Lua 5.0 Compatibility (Test Bars):** Replaced Lua 5.1 `#` length operators with `table.getn` in test bar generator, resolving `unexpected symbol near '#'` in `HealBot_View_Layout.lua` and resulting `attempt to call global 'HealBot_Action_ResetSkin' (a nil value)` startup crash on Vanilla 1.12.
**v1.7.6**
* **Feature - All-Class Support & Raid Frame Replacement:** Removed legacy restriction that disabled HealBot event listeners and UI frames for classes without native healing spells. HealBot now initializes and functions as a full party/raid frame replacement for all classes (Warrior, Mage, Rogue, Hunter, Warlock).
* **Targeting & Binding Defaults:** Added default `Left` click `"Target"` binding for non-healer classes, recognized `"target"` in spell resolution, and prevented non-healer buttons from disabling on full-health allies.
* **Mage Decurse Support:** Integrated `Remove Lesser Curse` into Mage debuff tables and Cure/Dispel (CDC) options.
* **Bug Fix - Spellbook Scan Lua Error:** Initialized `RealHealing` in spell scanner, resolving `attempt to concatenate global 'RealHealing' (a nil value)` when opening the spellbook on non-healer classes.
* **UI Fix - Cure Dropdown Stale Text:** Unconditionally added "None" entry and disabled curing button dropdowns for classes without decurse/cleanse abilities, fixing stale dropdown text ("Melee") displaying on Warrior and other non-dispelling classes.
* **Feature - Class Buff Tracking:** Added buff tracking lists, bidirectional group/rank equivalents (Greater Blessings, armors, etc.), and self-only auto-filtering for all classes. Added Water Shield for Shaman and refreshed buff dropdown labels to eliminate stale UI cache text.
**v1.7.5**
* **Feature - Test Bars** - Implemented a "Test Bars" button and slider in the Skins options tab, allowing you to spawn and adjust a dummy raid group of up to 40 members without being in a real raid. This allows for easy layout and appearance customization out of combat.
* **UI - Skins Options & Custom Health Gradients** - Added configurable Max HP and Min HP colour pickers with descriptive labels for custom gradient support. Fixed colour picker button click interceptors and hooked ColorPickerFrame callbacks. Integrated global font selector across raid frame text, headers, Options button, and preview bars. Reorganized Skins tab layout to anchor Test Bars cleanly in Column 2.
* **UI - Cleanup** - While adding new funcionalities the way menus look was ignored, new functions were added to each tab where there was free space, so attempt was made to clean up this convoluted mess I made. Menu Tabs are now aligned and grouped in a manner that makes more sense.
* **UI - Options Tabs Relative Anchoring Fix** - Fixed layout skewing and margin drift across Spells, Buffs, Chat, Extras (Integrations), and Auto options tabs. Replaced arbitrary hardcoded coordinate shifts with clean relative-anchoring hierarchies centered across the dialog width.
* **Performance Fix - Table Pooling & GC Leaks** - Resolved critical table leaks in emergency heals where pooled tables (`order` and `units`) failed to release when pet heals were disabled, un-nested pet healing from emergency heals, eliminated high-frequency (4 Hz) anonymous closure allocations in `HealBot_Action_UpdatePlayerHoTs`, and implemented in-place key recycling for equipment scanning and grid button tables.
**v1.7.4**
* **Performance Fix - CPU Spikes** - Fixed massive FPS drops during raid combat. The `HealBot_CheckBuffs` function previously forced the client to generate hidden UI tooltips for up to 32 buffs per player on every single `UNIT_AURA` event. Tooltip parsing is now cached per texture, bypassing thousands of redundant API calls per second.
* **Performance Fix - Frame Rendering** - Eliminated redundant UI layout recalculations in `HealBot_Action_EnableButton`. The UI no longer forces `SetFont`, `SetWidth`, `SetHeight`, and `GetGlobal` lookups on every single combat tick (which previously caused 4,000+ layout updates per second in 40-man raids).
* **Performance Fix - Range Checking** - Greatly reduced CPU stutter caused by range calculations. `HealBot_Range_Check` now caches map positioning math and API calls per-frame, preventing the addon from calculating the exact same `math.sqrt` distance up to 5 times per unit during heavy combat.
* **Performance Fix - Unit ID Lookup** - Optimized `HealBot_FindUnitID` by pre-allocating raid unit tokens, preventing massive string concatenation and garbage collection spam during high-frequency combat events like `CHAT_MSG_ADDON` (HealComm).
* **Performance Fix - String GC Leak** - Fixed garbage collection hitches caused by `string.gfind` closures in the HealComm parsing loop by rewriting it to use closure-free `string.find` native loops.
* **Debug Output Command** - Added `/hb debug` (or `/hb dbg`) slash command to toggle real-time debug message printing directly into the standard chat frame without requiring custom chat channels.
* **Performance Fix - Spell Lookup** - Fixed a massive CPU drain and garbage generation issue where the entire spellbook was linearly scanned every frame per unit. Spell IDs are now cached via O(1) dictionary lookup on login and talent/spell changes.
* **Performance Fix - Unit Hash Lookup** - Eliminated heavy C-API calls to `UnitName()` during incoming heals by caching raid and party unit tokens in a fast O(1) hash table that updates on roster changes.
* **Performance Fix - Range Cache GC Leak** - Fixed a continuous memory leak in the range checker caused by string concatenation (`unit .. "_" .. range`) running every frame. Range states are now stored in a nested numeric table cache.
* **Performance Fix - Talent Rank Scan** - Fixed severe CPU stutter when gaining or losing auras that affect stats. Previously, inventory updates forced a full equipment and spell recalculation which linearly scanned the entire talent tree multiple times per rank. Talent ranks are now cached natively.
* **Feature - HoT Tracking** - Added an option in the Integrations tab to track Player-cast HoT timers in a dedicated list below the main HealBot frame. Requires Nampower to fetch exact durations. Added support for tracking Power Word: Shield. Implemented with a pre-allocated static cache array for zero GC leaks, and precise GUID trapping for instant name resolution on self and non-party members.
**v1.7.3**
* **Performance Fix - Table Pooling Part 2** - Fixed remaining un-pooled table allocations in layout updates, macro parsing, nampower integration, and aura tracking by utilizing HealBot_GetTable().
* **Performance Fix - HealComm Networking** - Fixed issue where incoming `HealComm` messages triggered synchronous UI redraws, causing massive lag in 40-man raids during combat. `HealBot_RecalcHeals` is now decoupled and deferred through the `HealBot_OnUpdate` dirty queue, allowing multiple network events to collapse into a single frame redraw.
**v1.7.2** **v1.7.2**
* **Performance Fix - Table Pooling** - Fixed massive Vanilla Lua 5.0 garbage collection memory leaks caused by unbounded table allocations in high-frequency update loops (e.g., `OnUpdate` and `PreserveStateByGUID`). Moved tables to file-local scope and implemented inline clearing. * **Performance Fix - Table Pooling** - Fixed massive Vanilla Lua 5.0 garbage collection memory leaks caused by unbounded table allocations in high-frequency update loops (e.g., `OnUpdate` and `PreserveStateByGUID`). Moved tables to file-local scope and implemented inline clearing.
* **Performance Fix - OOC Cleanup** - Added an out-of-combat garbage collection hook (`PLAYER_REGEN_ENABLED`) to purge disconnected senders from the `HealBot_IncomingHealers` global table, preventing memory bloat during prolonged play sessions. * **Performance Fix - OOC Cleanup** - Added an out-of-combat garbage collection hook (`PLAYER_REGEN_ENABLED`) to purge disconnected senders from the `HealBot_IncomingHealers` global table, preventing memory bloat during prolonged play sessions.
@@ -76,6 +129,8 @@ Default installation path: `C:\Program Files\World of Warcraft\Interface\AddOns\
* **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. * **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 - 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. * **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.
* **Bug Fix - Raid Self-Range & Transparency** - Fixed player health bar appearing transparent in raid instances by checking `UnitIsUnit(unit, "player")` in range detection, preventing false out-of-range failures when player is represented by a `raidX` token.
* **Bug Fix - Raid Class Coloring & Identity Cache** - Fixed missing and delayed raid class colors by querying authoritative server data (`GetRaidRosterInfo`) for raid members, preventing model identity cache wipes, adding a throttled resolution retry in `OnUpdate`, and providing on-demand class color fallbacks in `HealBot_HealthColor`.
**v1.6.5** **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. * **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.
@@ -91,6 +146,7 @@ Default installation path: `C:\Program Files\World of Warcraft\Interface\AddOns\
* **UI Update - Customizable icon size** - Added an option to change size of HoT icons (default to 12px). * **UI Update - Customizable icon size** - Added an option to change size of HoT icons (default to 12px).
* **Cleanup** - Removed dead code `HealBot_Groups` table. * **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. * **Bug Fix - Buff Watch Self** - Fixed an issue where the "Self Only" toggle for watched buffs failed to load visually across sessions.
* **Bug Fix - Pet Coloring** - Fixed an issue where custom server integrations giving pets a class could override the mint pet color when class color override is toggled.
**v1.6.2** **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. * **Hotfix - raid and party frames** - if getNumRaidMembers() > 0 wrapper around extra bars stopped from displaying all frames blocked from displaying Extras\Raid.
@@ -124,6 +180,9 @@ Default installation path: `C:\Program Files\World of Warcraft\Interface\AddOns\
* **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. * **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** **v1.4.1**
* **Debuff Visual Overlay Options (CDC):** Added configurable visual overlay styles for cleanable debuffs in the Cure tab ("Debuff visual:"). Supports `Whole Bar` (classic status bar recolor), `Frame / Border` (crisp 9-slice debuff border while preserving unit health/class color), `Glow Effect` (additive blend texture glow), `Glow + Frame` (both border and glow), `Animated` (multi-frame procedural sprite sheet animation for all 4 debuff types: Poison drips, Curse shadow wisps, Disease spores, and Magic sparkles), and `Disabled`. Added dedicated 3rd visual layer `$parentDebuffOverlay` to button templates.
* **Frame Disappearing Fix:** Fixed a layout rendering bug where frames would flash for a split second and disappear on login due to improper table clearing of unit buttons, leaving empty arrays that incorrectly failed the layout check.
* **Ranked Spell Parsing Fix:** Fixed a Lua crash during addon initialization when discovering ranked spells without an explicit target property. Ranked spells now dynamically inherit the target table from their base spells.
* **Talent-based Healing Calculations:** Implemented dynamic spell healing calculations for Druid, Priest, and Paladin classes based on talents. * **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. * **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. * **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.
@@ -140,7 +199,6 @@ Default installation path: `C:\Program Files\World of Warcraft\Interface\AddOns\
* **Chat Announcements & Mouseover Casts:** Chat announcements are now correctly fired when using native Hovercasting (Mouseover). Additionally, added safety checks to prevent spamming chat announcements when accidentally clicking on a dead player (unless casting a resurrection spell). * **Chat Announcements & Mouseover Casts:** Chat announcements are now correctly fired when using native Hovercasting (Mouseover). Additionally, added safety checks to prevent spamming chat announcements when accidentally clicking on a dead player (unless casting a resurrection spell).
* **New Priest Buff (Enlighten):** Added the custom "Enlighten" buff to Priest trackable buffs, complete with the `btnholyscriptures` icon on unit frames. * **New Priest Buff (Enlighten):** Added the custom "Enlighten" buff to Priest trackable buffs, complete with the `btnholyscriptures` icon on unit frames.
**1.3.3** **1.3.3**
* **Chat Panel Refactor:** Completely replaced the spell selection dropdowns in the Chat tab with manual text input boxes, allowing users to type exact spell names (with or without ranks) directly, matching the behavior of the key-bindings configuration. Fixed a string matching bug caused by Vanilla WoW's hidden trailing spaces when comparing spell names, ensuring that both rankless (e.g. `Flash Heal`) and ranked inputs trigger correctly. * **Chat Panel Refactor:** Completely replaced the spell selection dropdowns in the Chat tab with manual text input boxes, allowing users to type exact spell names (with or without ranks) directly, matching the behavior of the key-bindings configuration. Fixed a string matching bug caused by Vanilla WoW's hidden trailing spaces when comparing spell names, ensuring that both rankless (e.g. `Flash Heal`) and ranked inputs trigger correctly.
* **Chat Layout Stack:** Restructured the Chat Options XML layout to correctly stack the inputs into neat rows, preventing horizontal overlap and providing more space for typing long announce messages. * **Chat Layout Stack:** Restructured the Chat Options XML layout to correctly stack the inputs into neat rows, preventing horizontal overlap and providing more space for typing long announce messages.
+218 -32
View File
@@ -50,12 +50,125 @@ function HealBot_StopMoving(frame)
end end
-- HealBot_SetTestDebuff: Simulates debuff effects for testing animations and overlays.
function HealBot_SetTestDebuff(debuffType)
local iconMap = {
[HEALBOT_POISON_en] = "Interface\\Icons\\Spell_Nature_NullifyPoison",
[HEALBOT_CURSE_en] = "Interface\\Icons\\Spell_Shadow_GatherShadows",
[HEALBOT_DISEASE_en] = "Interface\\Icons\\Spell_Nature_NullifyDisease",
[HEALBOT_MAGIC_en] = "Interface\\Icons\\Spell_Holy_DispelMagic",
};
if debuffType then
HealBot_TestDebuff = debuffType;
if HealBot_Config then
if HealBot_Config.CDCOverlay ~= 5 and HealBot_Config.CDCOverlay ~= 6 then
HealBot_Config.CDCOverlay = 5; -- Automatically switch to Animated mode
end
end
if not HealBot_UnitDebuff then HealBot_UnitDebuff = {} end
HealBot_UnitDebuff["player"] = debuffType;
if not HealBot_UnitIcons then HealBot_UnitIcons = {} end
if not HealBot_UnitIcons["player"] then HealBot_UnitIcons["player"] = {} end
HealBot_UnitIcons["player"][1] = iconMap[debuffType];
-- If test bars active, apply to dummy units as well
for i = 1, 40 do
local tUnit = "Test" .. i;
if HealBot_Action_UnitButtons and HealBot_Action_UnitButtons[tUnit] then
HealBot_UnitDebuff[tUnit] = debuffType;
if not HealBot_UnitIcons[tUnit] then HealBot_UnitIcons[tUnit] = {} end
HealBot_UnitIcons[tUnit][1] = iconMap[debuffType];
end
end
if HealBot_Options_CDCOverlay_Refresh and HealBot_Options and HealBot_Options:IsVisible() then
HealBot_Options_CDCOverlay_Refresh(true);
end
if DEFAULT_CHAT_FRAME then
DEFAULT_CHAT_FRAME:AddMessage("|cFFFFD100HealBot|r: Simulating |cFF00FF00" .. debuffType .. "|r debuff animation. (Type |cFFFFFF00/hb test clear|r to stop)");
end
else
HealBot_TestDebuff = nil;
if HealBot_UnitDebuff then
HealBot_UnitDebuff["player"] = nil;
end
if HealBot_UnitIcons and HealBot_UnitIcons["player"] then
HealBot_UnitIcons["player"][1] = nil;
end
for i = 1, 40 do
local tUnit = "Test" .. i;
if HealBot_UnitDebuff then HealBot_UnitDebuff[tUnit] = nil end
if HealBot_UnitIcons and HealBot_UnitIcons[tUnit] then
HealBot_UnitIcons[tUnit][1] = nil;
end
end
if DEFAULT_CHAT_FRAME then
DEFAULT_CHAT_FRAME:AddMessage("|cFFFFD100HealBot|r: Test debuff cleared.");
end
end
HealBot_Action_RefreshButtons();
end
-- HealBot_SlashCmd: Handles '/hb' or '/healbot' chat commands. -- 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);
return return
end end
local lowCmd = string.lower(cmd or "");
local sub1, sub2 = nil, nil;
for word in string.gfind(lowCmd, "%S+") do
if not sub1 then
sub1 = word;
elseif not sub2 then
sub2 = word;
break;
end
end
if (sub1 == "test" or sub1 == "debuff" or sub1 == "anim") then
local typeMap = {
["poison"] = HEALBOT_POISON_en,
["p"] = HEALBOT_POISON_en,
["curse"] = HEALBOT_CURSE_en,
["c"] = HEALBOT_CURSE_en,
["disease"] = HEALBOT_DISEASE_en,
["d"] = HEALBOT_DISEASE_en,
["magic"] = HEALBOT_MAGIC_en,
["m"] = HEALBOT_MAGIC_en,
["clear"] = "clear",
["off"] = "clear",
["stop"] = "clear",
["none"] = "clear",
};
local chosen = sub2 and typeMap[sub2];
if chosen == "clear" then
HealBot_SetTestDebuff(nil);
elseif chosen then
HealBot_SetTestDebuff(chosen);
else
if DEFAULT_CHAT_FRAME then
DEFAULT_CHAT_FRAME:AddMessage("|cFFFFD100HealBot|r: Usage: /hb test <poison|curse|disease|magic|clear>");
end
end
return;
end
if (sub1 == "poison" or sub1 == "curse" or sub1 == "disease" or sub1 == "magic") then
local quickMap = {
["poison"] = HEALBOT_POISON_en,
["curse"] = HEALBOT_CURSE_en,
["disease"] = HEALBOT_DISEASE_en,
["magic"] = HEALBOT_MAGIC_en,
};
HealBot_SetTestDebuff(quickMap[sub1]);
return;
end
if (cmd=="options" or cmd=="opt" or cmd=="config" or cmd=="cfg") then if (cmd=="options" or cmd=="opt" or cmd=="config" or cmd=="cfg") then
HealBot_TogglePanel(HealBot_Options); HealBot_TogglePanel(HealBot_Options);
return return
@@ -103,6 +216,21 @@ function HealBot_SlashCmd(cmd)
HealBot_AddDebug( "Channel active" ); HealBot_AddDebug( "Channel active" );
return; return;
end end
if (cmd=="debug" or cmd=="dbg") then
if not HealBot_Config then return; end
if HealBot_Config.DebugMode == 1 then
HealBot_Config.DebugMode = 0;
if DEFAULT_CHAT_FRAME then
DEFAULT_CHAT_FRAME:AddMessage("|cFFFFD100HealBot|r: Debug mode |cFFFF0000DISABLED|r.");
end
else
HealBot_Config.DebugMode = 1;
if DEFAULT_CHAT_FRAME then
DEFAULT_CHAT_FRAME:AddMessage("|cFFFFD100HealBot|r: Debug mode |cFF00FF00ENABLED|r.");
end
end
return;
end
end end
-- HealBot_SendAddonMessage moved to HealBot_Controller_Comms.lua -- HealBot_SendAddonMessage moved to HealBot_Controller_Comms.lua
@@ -188,22 +316,65 @@ end
-- Spell parsing and casting functions moved to HealBot_Controller_Spells.lua -- Spell parsing and casting functions moved to HealBot_Controller_Spells.lua
HealBot_ClassMap = nil
function HealBot_InitClassMap()
HealBot_ClassMap = {
["DRUID"] = "DRUID", ["Druid"] = "DRUID",
["HUNTER"] = "HUNTER", ["Hunter"] = "HUNTER",
["MAGE"] = "MAGE", ["Mage"] = "MAGE",
["PALADIN"] = "PALADIN", ["Paladin"] = "PALADIN",
["PRIEST"] = "PRIEST", ["Priest"] = "PRIEST",
["ROGUE"] = "ROGUE", ["Rogue"] = "ROGUE",
["SHAMAN"] = "SHAMAN", ["Shaman"] = "SHAMAN",
["WARLOCK"] = "WARLOCK", ["Warlock"] = "WARLOCK",
["WARRIOR"] = "WARRIOR", ["Warrior"] = "WARRIOR",
}
if HEALBOT_DRUID then HealBot_ClassMap[HEALBOT_DRUID] = "DRUID" end
if HEALBOT_HUNTER then HealBot_ClassMap[HEALBOT_HUNTER] = "HUNTER" end
if HEALBOT_MAGE then HealBot_ClassMap[HEALBOT_MAGE] = "MAGE" end
if HEALBOT_PALADIN then HealBot_ClassMap[HEALBOT_PALADIN] = "PALADIN" end
if HEALBOT_PRIEST then HealBot_ClassMap[HEALBOT_PRIEST] = "PRIEST" end
if HEALBOT_ROGUE then HealBot_ClassMap[HEALBOT_ROGUE] = "ROGUE" end
if HEALBOT_SHAMAN then HealBot_ClassMap[HEALBOT_SHAMAN] = "SHAMAN" end
if HEALBOT_WARLOCK then HealBot_ClassMap[HEALBOT_WARLOCK] = "WARLOCK" end
if HEALBOT_WARRIOR then HealBot_ClassMap[HEALBOT_WARRIOR] = "WARRIOR" end
end
-- HealBot_UnitClass: Returns English class string for a unit. -- HealBot_UnitClass: Returns English class string for a unit.
function HealBot_UnitClass(unit) function HealBot_UnitClass(unit)
local locClass, enClass = UnitClass(unit) if not unit then return nil end
if enClass then return string.upper(enClass) end if string.find(unit, "^Test") then
if HealBot_Model and HealBot_Model.units[unit] then
-- Fallback for Vanilla 1.12 where enClass is nil return HealBot_Model.units[unit].englishClass
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 end
return nil
end
if not HealBot_ClassMap then HealBot_InitClassMap() end
-- 1. If player self, query "player" directly
if unit == "player" or UnitIsUnit(unit, "player") then
local locClass, enClass = UnitClass("player")
if enClass and enClass ~= "" then return string.upper(enClass) end
if locClass and HealBot_ClassMap[locClass] then return HealBot_ClassMap[locClass] end
if locClass then return string.upper(locClass) end
end
-- 2. If raid member, query GetRaidRosterInfo (server authoritative English class token)
local _, _, raidIdx = string.find(unit, "^raid(%d+)$")
if raidIdx and GetNumRaidMembers() > 0 then
local _, _, _, _, class, fileName = GetRaidRosterInfo(tonumber(raidIdx))
if fileName and fileName ~= "" then
return string.upper(fileName)
elseif class and HealBot_ClassMap[class] then
return HealBot_ClassMap[class]
end
end
-- 3. General fallback via UnitClass API
local locClass, enClass = UnitClass(unit)
if enClass and enClass ~= "" then return string.upper(enClass) end
if locClass and HealBot_ClassMap[locClass] then return HealBot_ClassMap[locClass] end
return locClass return locClass
end end
@@ -222,27 +393,42 @@ end
-- SpiBonus and GetBonus functions moved to HealBot_Controller_Spells.lua -- SpiBonus and GetBonus functions moved to HealBot_Controller_Spells.lua
local HealBot_RaidUnitTokens = {}
for i=1, 40 do HealBot_RaidUnitTokens[i] = "raid"..i end
HealBot_NameToUnitID = {}
function HealBot_UpdateUnitIDCache()
HealBot_NameToUnitID = {}
local name = UnitName("player")
if name then HealBot_NameToUnitID[name] = "player" end
for i=1, 4 do
local unit = "party"..i
name = UnitName(unit)
if name then HealBot_NameToUnitID[name] = unit end
unit = "partypet"..i
name = UnitName(unit)
if name then HealBot_NameToUnitID[name] = unit end
end
local petName = UnitName("pet")
if petName then HealBot_NameToUnitID[petName] = "pet" end
for i=1, 40 do
local unit = "raid"..i
name = UnitName(unit)
if name then HealBot_NameToUnitID[name] = unit end
unit = "raidpet"..i
name = UnitName(unit)
if name then HealBot_NameToUnitID[name] = unit end
end
end
-- HealBot_FindUnitID: Finds a unit token for a given player name. -- HealBot_FindUnitID: Finds a unit token for a given player name.
function HealBot_FindUnitID(unitname) function HealBot_FindUnitID(unitname)
local text; if not unitname then return nil end
for _,unit in ipairs(HealBot_Action_HealGroup) do return HealBot_NameToUnitID[unitname]
text = UnitName(unit);
if text then
if text==unitname then
return unit;
end
end
end
for i=1,40 do
local unit = "raid"..i;
text = UnitName(unit);
if text then
if text==unitname then
return unit;
end
end
end
return nil;
end end
-- HealBot_PlaySound: Plays an audio alert based on ID. -- HealBot_PlaySound: Plays an audio alert based on ID.
+40 -17
View File
@@ -2,11 +2,16 @@
-- HealBot_AlwaysHeal: Returns true if healthy units should be shown. -- HealBot_AlwaysHeal: Returns true if healthy units should be shown.
function HealBot_AlwaysHeal() function HealBot_AlwaysHeal()
local class = HealBot_UnitClass("player")
if class ~= "PRIEST" and class ~= "DRUID" and class ~= "PALADIN" and class ~= "SHAMAN" then
return true
end
return HealBot_Config.EnableHealthy==1 return HealBot_Config.EnableHealthy==1
end end
-- HealBot_MayHeal: Checks if unit is eligible for healing UI. -- HealBot_MayHeal: Checks if unit is eligible for healing UI.
function HealBot_MayHeal(unit) function HealBot_MayHeal(unit)
if string.find(unit, "^Test") then return true end
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
if not HealBot_Config.TargetHeals or UnitCanAttack("player",unit) then return false end if not HealBot_Config.TargetHeals or UnitCanAttack("player",unit) then return false end
@@ -15,6 +20,8 @@ end
-- HealBot_ShouldHeal: Checks if unit needs immediate healing. -- HealBot_ShouldHeal: Checks if unit needs immediate healing.
function HealBot_ShouldHeal(unit) function HealBot_ShouldHeal(unit)
if not unit then return false end
if string.find(unit, "^Test") then return true end
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
return true; return true;
@@ -33,6 +40,7 @@ end
-- HealBot_MustHeal: Internal utility: HealBot_MustHeal -- HealBot_MustHeal: Internal utility: HealBot_MustHeal
function HealBot_MustHeal(unit) function HealBot_MustHeal(unit)
if string.find(unit, "^Test") then return true end
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
@@ -56,6 +64,15 @@ end
-- HealBot_CanHeal: Internal utility: HealBot_CanHeal -- HealBot_CanHeal: Internal utility: HealBot_CanHeal
function HealBot_CanHeal(unit) function HealBot_CanHeal(unit)
if string.find(unit, "^Test") then return true end
local class = HealBot_UnitClass("player")
if class ~= "PRIEST" and class ~= "DRUID" and class ~= "PALADIN" and class ~= "SHAMAN" then
if UnitExists(unit) and not UnitIsDeadOrGhost(unit) and HealBot_Range_Check(unit, 40) == 1 then
return true
end
return false
end
if UnitIsDeadOrGhost(unit) then if UnitIsDeadOrGhost(unit) then
local rezSpell = HealBot_GetRezSpellForClass(); local rezSpell = HealBot_GetRezSpellForClass();
if rezSpell and HealBot_GetHealSpell(unit, rezSpell) then if rezSpell and HealBot_GetHealSpell(unit, rezSpell) then
@@ -66,12 +83,17 @@ function HealBot_CanHeal(unit)
local SHeal = HealBot_ShouldHeal(unit) local SHeal = HealBot_ShouldHeal(unit)
if SHeal then if SHeal then
local spell = HealBot_GetHealSpell(unit,HealBot_Action_SpellPattern("Left")) local spell = HealBot_GetHealSpell(unit, HealBot_Action_SpellPattern("Left", true))
if not spell then spell = HealBot_GetHealSpell(unit,HealBot_Action_SpellPattern("Middle")) end if not spell then spell = HealBot_GetHealSpell(unit, HealBot_Action_SpellPattern("Middle", true)) end
if not spell then spell = HealBot_GetHealSpell(unit,HealBot_Action_SpellPattern("Right")) end if not spell then spell = HealBot_GetHealSpell(unit, HealBot_Action_SpellPattern("Right", true)) end
if not spell then spell = HealBot_GetHealSpell(unit,HealBot_Action_SpellPattern("Button4")) end if not spell then spell = HealBot_GetHealSpell(unit, HealBot_Action_SpellPattern("Button4", true)) end
if not spell then spell = HealBot_GetHealSpell(unit,HealBot_Action_SpellPattern("Button5")) end if not spell then spell = HealBot_GetHealSpell(unit, HealBot_Action_SpellPattern("Button5", true)) end
if not spell then if not spell then
-- Fallback: if player has no base click spells bound but has modifier combos, check pure 40yd range
local combos = HealBot_Config.KeyCombo[UnitClass("player")]
if combos and next(combos) and HealBot_Range_Check(unit, 40) == 1 then
return true
end
return false return false
else else
return true return true
@@ -85,14 +107,16 @@ 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. -- HealBot_Action_SpellPattern: Resolves spell string based on click modifiers.
function HealBot_Action_SpellPattern(button) function HealBot_Action_SpellPattern(button, ignoreModifiers)
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
local press = button; local press = button or "Left";
if not ignoreModifiers then
if IsAltKeyDown() then press = "Alt"..press end if IsAltKeyDown() then press = "Alt"..press end
if IsControlKeyDown() then press = "Ctrl"..press end if IsControlKeyDown() then press = "Ctrl"..press end
if IsShiftKeyDown() then press = "Shift"..press end if IsShiftKeyDown() then press = "Shift"..press end
return combos[press] end
return combos[press];
end end
-- HealBot_Decode_Button: Decodes click action to spell pattern. -- HealBot_Decode_Button: Decodes click action to spell pattern.
@@ -118,6 +142,8 @@ end
-- HealBot_Action_HealUnit_OnLoad: Internal utility: HealBot_Action_HealUnit_OnLoad -- 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");
this.debuffOverlay = getglobal(this:GetName() .. "DebuffOverlay");
this.debuffGlow = getglobal(this:GetName() .. "DebuffOverlayGlow");
end end
-- HealBot_Action_HealUnit_OnEnter: Internal utility: HealBot_Action_HealUnit_OnEnter -- HealBot_Action_HealUnit_OnEnter: Internal utility: HealBot_Action_HealUnit_OnEnter
@@ -136,9 +162,10 @@ end
-- HealBot_SplitString: Internal utility: HealBot_SplitString -- HealBot_SplitString: Internal utility: HealBot_SplitString
function HealBot_SplitString(str, delimiter) function HealBot_SplitString(str, delimiter)
local result = {} local result = HealBot_GetTable()
if not delimiter or delimiter == "" then if not delimiter or delimiter == "" then
return {str} table.insert(result, str)
return result
end end
local start_pos = 1 local start_pos = 1
while true do while true do
@@ -160,6 +187,7 @@ function HealBot_RunMacroText(body)
ChatFrameEditBox:SetText(commands[i]) ChatFrameEditBox:SetText(commands[i])
ChatEdit_SendText(ChatFrameEditBox) ChatEdit_SendText(ChatFrameEditBox)
end end
HealBot_ReleaseTable(commands)
end end
-- HealBot_RunMacro: Internal utility: HealBot_RunMacro -- HealBot_RunMacro: Internal utility: HealBot_RunMacro
@@ -206,6 +234,7 @@ end
-- HealBot_Action_HealUnit_OnClick: Click event handler. -- HealBot_Action_HealUnit_OnClick: Click event handler.
function HealBot_Action_HealUnit_OnClick(this,button) function HealBot_Action_HealUnit_OnClick(this,button)
if not this.unit or string.find(this.unit, "^Test") then return end
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);
@@ -429,19 +458,13 @@ function HealBot_Action_OnDragStop(this)
end end
-- http://www.flexbarforums.com/viewtopic.php?t=66 -- http://www.flexbarforums.com/viewtopic.php?t=66
-- no idea what it was link is dead -- Legacy handler preserved for compatibility
function HealBot_Action_OnKey(this,key,state) function HealBot_Action_OnKey(this,key,state)
local command = GetBindingAction(key); local command = GetBindingAction(key);
if command then if command then
DEFAULT_CHAT_FRAME:AddMessage(key.." "..state.." "..(command or "nil"));
keystate = state keystate = state
RunBinding(command,keystate) RunBinding(command,keystate)
end end
DEFAULT_CHAT_FRAME:AddMessage("HealBot_Action_OnKey - "..key);
if key=="SHIFT" or key=="CTRL" or key=="ALT" then
DEFAULT_CHAT_FRAME:AddMessage((IsShiftKeyDown() or 0).." "..(IsControlKeyDown() or 0).." "..(IsAltKeyDown() or 0));
HealBot_Action_Refresh();
end
end end
@@ -152,6 +152,30 @@
</Anchor> </Anchor>
</Anchors> </Anchors>
</StatusBar> </StatusBar>
<Frame name="$parentDebuffOverlay" frameStrata="FOREGROUND" enableMouse="false" hidden="true">
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="-2" y="2"/>
</Offset>
</Anchor>
<Anchor point="BOTTOMRIGHT">
<Offset>
<AbsDimension x="2" y="-2"/>
</Offset>
</Anchor>
</Anchors>
<Backdrop edgeFile="Interface\Tooltips\UI-Tooltip-Border">
<EdgeSize>
<AbsValue val="10"/>
</EdgeSize>
</Backdrop>
<Layers>
<Layer level="ARTWORK">
<Texture name="$parentGlow" file="Interface\AddOns\HealBotBlue\Images\glow1.tga" setAllPoints="true" alphaMode="BLEND" hidden="true"/>
</Layer>
</Layers>
</Frame>
</Frames> </Frames>
</Button> </Button>
+648
View File
@@ -0,0 +1,648 @@
-- HealBot_View_Bars.lua
-- Status bar rendering, color calculations, button styling, and debuff pulsing
local HealBot_AnimTimer = 0
local HealBot_BarFrame_Backdrop = {
tile = false,
insets = { left = 0, right = 0, top = 0, bottom = 0 }
}
-- HealBot_Action_SetTexture: Internal utility: HealBot_Action_SetTexture
function HealBot_Action_SetTexture(bar, btexture)
if not bar then return end
if btexture == 10 then
bar:SetStatusBarTexture("Interface\\Buttons\\WHITE8X8");
else
bar:SetStatusBarTexture("Interface\\AddOns\\HealBotBlue\\Images\\bar" .. tostring(btexture) .. ".tga");
end
end
-- HealBot_HealthColor: Computes health bar RGBA based on debuffs and class.
function HealBot_HealthColor(unit, hlth, maxhlth)
local cached_debuff = HealBot_UnitDebuff[unit]
local overlayMode = HealBot_Config.CDCOverlay or 1
if cached_debuff and overlayMode == 1 then
local color = HealBot_Config.CDCBarColour[cached_debuff]
if color then
local dr = color.R
local dg = color.G
local db = color.B
return dr, dg, db, HealBot_Config.Barcola[HealBot_Config.Current_Skin];
end
return dr, dg, db, HealBot_Config.Barcola[HealBot_Config.Current_Skin];
end
local text
if string.find(unit, "^Test") then
text = HealBot_Model.units[unit] and HealBot_Model.units[unit].name or unit
else
text = UnitName(unit) or unit
end
if not HealBot_HealsIn[text] then
HealBot_HealsIn[text] = 0;
end
local pct = hlth + HealBot_HealsIn[text];
if maxhlth and maxhlth > 0 then
if pct < maxhlth then
pct = pct / maxhlth;
else
pct = 1;
end
else
pct = 0;
end
local r, g, b = 1.0, 1.0, 0.0;
local a = HealBot_Config.Barcola[HealBot_Config.Current_Skin];
if pct > HealBot_Config.AlertLevel then
a = HealBot_Config.bardisa[HealBot_Config.Current_Skin];
end
local colorMode = HealBot_Config.bcolormode[HealBot_Config.Current_Skin] or 1
local engClass = nil
if colorMode == 2 and not string.find(unit, "pet") then
engClass = HealBot_Model and HealBot_Model.units[unit] and HealBot_Model.units[unit].englishClass
if not engClass then
engClass = HealBot_UnitClass(unit)
if engClass and HealBot_Model and HealBot_Model.units[unit] then
HealBot_Model.units[unit].englishClass = engClass
end
end
end
if colorMode == 2 and string.find(unit, "pet") then
r, g, b = 0.4, 0.9, 0.6 -- Mint color
elseif colorMode == 2 and engClass and RAID_CLASS_COLORS and RAID_CLASS_COLORS[engClass] then
r = RAID_CLASS_COLORS[engClass].r
g = RAID_CLASS_COLORS[engClass].g
b = RAID_CLASS_COLORS[engClass].b
else
local skin = HealBot_Config.Current_Skin
local maxR = HealBot_Config.bcolormaxr and HealBot_Config.bcolormaxr[skin] or 0.0
local maxG = HealBot_Config.bcolormaxg and HealBot_Config.bcolormaxg[skin] or 1.0
local maxB = HealBot_Config.bcolormaxb and HealBot_Config.bcolormaxb[skin] or 0.0
local minR = HealBot_Config.bcolorminr and HealBot_Config.bcolorminr[skin] or 1.0
local minG = HealBot_Config.bcolorming and HealBot_Config.bcolorming[skin] or 0.0
local minB = HealBot_Config.bcolorminb and HealBot_Config.bcolorminb[skin] or 0.0
if maxR == 0 and maxG == 1 and maxB == 0 and minR == 1 and minG == 0 and minB == 0 then
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.64 and pct > 0.31 then g = (pct - 0.31) * 3; end
if pct <= 0.31 then g = 0.0; end
else
r = minR + (maxR - minR) * pct
g = minG + (maxG - minG) * pct
b = minB + (maxB - minB) * pct
end
end
return r, g, b, a;
end
-- HealBot_Action_HealthBar: Internal utility: HealBot_Action_HealthBar
function HealBot_Action_HealthBar(button)
if not button.bar then
button.bar = getglobal(button:GetName() .. "Bar")
end
return button.bar;
end
-- HealBot_Action_HealthBar2: Internal utility: HealBot_Action_HealthBar2
function HealBot_Action_HealthBar2(button)
if not button.bar2 then
button.bar2 = getglobal(button:GetName() .. "Bar2")
end
return button.bar2;
end
-- HealBot_Action_EnableButton: Updates a button's health, color, text, and debuffs.
function HealBot_Action_EnableButton(button)
local unit = button.unit;
local state = HealBot_Model.units[unit]
if not state then return end
if not state.englishClass then
HealBot_Model:UpdateUnitIdentity(unit)
end
local hlth = state.health
local maxhlth = state.maxHealth
local name = state.name
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 bar2 = HealBot_Action_HealthBar2(button);
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 bheight = HealBot_Config.bheight[HealBot_Config.Current_Skin];
local sr = HealBot_Config.btextenabledcolr[HealBot_Config.Current_Skin];
local sg = HealBot_Config.btextenabledcolg[HealBot_Config.Current_Skin];
local sb = HealBot_Config.btextenabledcolb[HealBot_Config.Current_Skin];
local sa = HealBot_Config.btextenabledcola[HealBot_Config.Current_Skin];
local r, g, b, a = HealBot_HealthColor(button.unit, hlth, maxhlth)
local btextheight = HealBot_Config.btextheight[HealBot_Config.Current_Skin] or 10;
if btextheight == 0 then btextheight = 10 end
local bwidth = HealBot_Config.bwidth[HealBot_Config.Current_Skin]
local textlen = math.floor(5 + (((bwidth * 1.8) / btextheight) - (btextheight / 2)))
bar:SetMinMaxValues(0, maxhlth);
bar:SetValue(hlth);
local englishClass = state.englishClass
local isHealer = false
if englishClass == "PALADIN" or englishClass == "DRUID" or englishClass == "SHAMAN" or englishClass == "PRIEST" then
isHealer = true
end
local pt = state.powerType
local showMana = false
local pr, pg, pb = 0, 0, 1 -- Default Blue for Mana
if HealBot_Config.ShowManaBars == 1 and state.maxMana > 0 then
if pt == 0 then
if HealBot_Config.ManaBarsHealersOnly == 1 then
if isHealer then showMana = true end
else
showMana = true
end
elseif HealBot_Config.ShowNonManaBars == 1 then
showMana = true
if pt == 1 then pr, pg, pb = 1, 0, 0 -- Rage (Red)
elseif pt == 3 then pr, pg, pb = 1, 1, 0 -- Energy (Yellow)
elseif pt == 2 then pr, pg, pb = 1, 0.5, 0 -- Focus (Orange)
end
end
end
if showMana then
if bar3 then
bar3:SetMinMaxValues(0, state.maxMana)
bar3:SetValue(state.mana)
bar3:SetStatusBarColor(pr, pg, pb, HealBot_Config.Barcola[HealBot_Config.Current_Skin])
HealBot_Action_SetTexture(bar3, HealBot_Config.btexture[HealBot_Config.Current_Skin])
bar3:Show()
bar3:SetHeight(bheight * 0.2)
end
bar:SetHeight(bheight * 0.8)
bar2:SetHeight(bheight * 0.8)
else
if bar3 then
bar3:Hide()
end
bar:SetHeight(bheight)
bar2:SetHeight(bheight)
end
if HealBot_HealsIn[name] then
bar2:SetMinMaxValues(0, maxhlth);
bar2:SetValue(hlth + HealBot_HealsIn[name]);
else
bar2:SetValue(0);
end
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
button:Enable();
if HealBot_UnitDebuff[unit] then
sr = HealBot_Config.btextcursecolr[HealBot_Config.Current_Skin];
sg = HealBot_Config.btextcursecolg[HealBot_Config.Current_Skin];
sb = HealBot_Config.btextcursecolb[HealBot_Config.Current_Skin];
sa = HealBot_Config.btextcursecola[HealBot_Config.Current_Skin];
elseif HealBot_MissingBuffs[unit] then
r = r * 0.5;
g = g * 0.5;
b = b * 0.5;
sr = 1.0;
sg = 1.0;
sb = 0.0;
end
bar:SetStatusBarColor(r, g, b, HealBot_Config.Barcola[HealBot_Config.Current_Skin]);
bar2:SetStatusBarColor(r, g, b, HealBot_Config.BarcolaInHeal[HealBot_Config.Current_Skin]);
else
button:Disable();
sr = HealBot_Config.btextdisbledcolr[HealBot_Config.Current_Skin];
sg = HealBot_Config.btextdisbledcolg[HealBot_Config.Current_Skin];
sb = HealBot_Config.btextdisbledcolb[HealBot_Config.Current_Skin];
sa = HealBot_Config.btextdisbledcola[HealBot_Config.Current_Skin];
bar:SetStatusBarColor(r, g, b, HealBot_Config.bardisa[HealBot_Config.Current_Skin]);
bar2:SetStatusBarColor(r, g, b, HealBot_Config.bardisa[HealBot_Config.Current_Skin]);
end
if not button.debuffOverlay then
button.debuffOverlay = getglobal(button:GetName() .. "DebuffOverlay")
end
if not button.debuffGlow then
button.debuffGlow = getglobal(button:GetName() .. "DebuffOverlayGlow")
end
if button.debuffOverlay then
local debuffType = HealBot_UnitDebuff[unit]
local isDead = state.isDead or state.isGhost or (not string.find(unit, "^Test") and UnitIsDeadOrGhost(unit))
local overlayMode = HealBot_Config.CDCOverlay or 1
local skin = HealBot_Config.Current_Skin
local hasBarFrame = (HealBot_Config.bframe and HealBot_Config.bframe[skin] == 1)
local bfr = (HealBot_Config.bframecolr and HealBot_Config.bframecolr[skin]) or 1.0
local bfg = (HealBot_Config.bframecolg and HealBot_Config.bframecolg[skin]) or 1.0
local bfb = (HealBot_Config.bframecolb and HealBot_Config.bframecolb[skin]) or 1.0
local bfa = (HealBot_Config.bframecola and HealBot_Config.bframecola[skin]) or 1.0
local alphaBorder = 1.0
local alphaOverlay = 1.0
if not button:IsEnabled() then
local disAlpha = HealBot_Config.bardisa[skin] or 0.4
alphaBorder = disAlpha
alphaOverlay = disAlpha
bfa = bfa * disAlpha
end
if debuffType and not isDead and overlayMode > 1 and overlayMode < 7 then
local color = HealBot_Config.CDCBarColour[debuffType]
local cr, cg, cb = 1, 0, 0
if color then
cr, cg, cb = color.R, color.G, color.B
end
button.debuffOverlay:SetFrameLevel(bar:GetFrameLevel() + 2)
button.debuffOverlay:Show()
if overlayMode == 2 then
button.isAnimatedDebuff = false
button.debuffOverlay:SetBackdropBorderColor(cr, cg, cb, alphaBorder)
if button.debuffGlow then
button.debuffGlow:Hide()
button.debuffGlow:SetTexCoord(0, 1, 0, 1)
end
elseif overlayMode == 3 then
button.isAnimatedDebuff = false
if hasBarFrame then
button.debuffOverlay:SetBackdropBorderColor(bfr, bfg, bfb, bfa)
else
button.debuffOverlay:SetBackdropBorderColor(0, 0, 0, 0)
end
if button.debuffGlow then
local glowTex = HealBot_Config.CDCOverlayTexture or "Interface\\AddOns\\HealBotBlue\\Images\\glow1.tga"
button.debuffGlow:SetTexture(glowTex)
button.debuffGlow:SetBlendMode("BLEND")
button.debuffGlow:SetTexCoord(0, 1, 0, 1)
button.debuffGlow:SetVertexColor(cr, cg, cb, alphaOverlay)
button.debuffGlow:Show()
end
elseif overlayMode == 4 then
button.isAnimatedDebuff = false
button.debuffOverlay:SetBackdropBorderColor(cr, cg, cb, alphaBorder)
if button.debuffGlow then
local glowTex = HealBot_Config.CDCOverlayTexture or "Interface\\AddOns\\HealBotBlue\\Images\\glow1.tga"
button.debuffGlow:SetTexture(glowTex)
button.debuffGlow:SetBlendMode("BLEND")
button.debuffGlow:SetTexCoord(0, 1, 0, 1)
button.debuffGlow:SetVertexColor(cr, cg, cb, alphaOverlay)
button.debuffGlow:Show()
end
elseif overlayMode == 5 then -- Animated
if hasBarFrame then
button.debuffOverlay:SetBackdropBorderColor(bfr, bfg, bfb, bfa)
else
button.debuffOverlay:SetBackdropBorderColor(0, 0, 0, 0)
end
if button.debuffGlow then
local glowTex
if debuffType == HEALBOT_POISON_en then
glowTex = "Interface\\AddOns\\HealBotBlue\\Images\\debuff_poison.tga"
button.isAnimatedDebuff = true
elseif debuffType == HEALBOT_CURSE_en then
glowTex = "Interface\\AddOns\\HealBotBlue\\Images\\debuff_curse.tga"
button.isAnimatedDebuff = true
elseif debuffType == HEALBOT_DISEASE_en then
glowTex = "Interface\\AddOns\\HealBotBlue\\Images\\debuff_disease.tga"
button.isAnimatedDebuff = true
elseif debuffType == HEALBOT_MAGIC_en then
glowTex = "Interface\\AddOns\\HealBotBlue\\Images\\debuff_magic.tga"
button.isAnimatedDebuff = true
else
glowTex = HealBot_Config.CDCOverlayTexture or "Interface\\AddOns\\HealBotBlue\\Images\\glow1.tga"
button.isAnimatedDebuff = false
button.debuffGlow:SetTexCoord(0, 1, 0, 1)
end
button.debuffGlow:SetTexture(glowTex)
button.debuffGlow:SetBlendMode("BLEND")
button.debuffGlow:SetVertexColor(cr, cg, cb, alphaOverlay)
button.debuffGlow:Show()
end
elseif overlayMode == 6 then -- Animated + Frame
button.debuffOverlay:SetBackdropBorderColor(cr, cg, cb, alphaBorder)
if button.debuffGlow then
local glowTex
if debuffType == HEALBOT_POISON_en then
glowTex = "Interface\\AddOns\\HealBotBlue\\Images\\debuff_poison.tga"
button.isAnimatedDebuff = true
elseif debuffType == HEALBOT_CURSE_en then
glowTex = "Interface\\AddOns\\HealBotBlue\\Images\\debuff_curse.tga"
button.isAnimatedDebuff = true
elseif debuffType == HEALBOT_DISEASE_en then
glowTex = "Interface\\AddOns\\HealBotBlue\\Images\\debuff_disease.tga"
button.isAnimatedDebuff = true
elseif debuffType == HEALBOT_MAGIC_en then
glowTex = "Interface\\AddOns\\HealBotBlue\\Images\\debuff_magic.tga"
button.isAnimatedDebuff = true
else
glowTex = HealBot_Config.CDCOverlayTexture or "Interface\\AddOns\\HealBotBlue\\Images\\glow1.tga"
button.isAnimatedDebuff = false
button.debuffGlow:SetTexCoord(0, 1, 0, 1)
end
button.debuffGlow:SetTexture(glowTex)
button.debuffGlow:SetBlendMode("BLEND")
button.debuffGlow:SetVertexColor(cr, cg, cb, alphaOverlay)
button.debuffGlow:Show()
end
end
else
button.isAnimatedDebuff = false
if button.debuffGlow then
button.debuffGlow:Hide()
button.debuffGlow:SetTexCoord(0, 1, 0, 1)
end
if hasBarFrame and not isDead then
button.debuffOverlay:SetFrameLevel(bar:GetFrameLevel() + 2)
button.debuffOverlay:SetBackdropBorderColor(bfr, bfg, bfb, bfa)
button.debuffOverlay:Show()
else
button.debuffOverlay:Hide()
end
end
end
local healthTextOpt = HealBot_Config.ShowHealthText or 0
local displayText = name
if healthTextOpt == 1 then
local pct = 0
if maxhlth > 0 then pct = math.floor((hlth / maxhlth) * 100) end
displayText = name .. " - " .. pct .. "%"
elseif healthTextOpt == 2 then
displayText = name .. " - " .. hlth .. "/" .. maxhlth
elseif healthTextOpt == 3 then
local deficit = maxhlth - hlth
if deficit > 0 then
displayText = name .. " - -" .. deficit
end
end
if string.len(displayText) > textlen then
if healthTextOpt > 0 then
-- If we have numbers, just truncate the name part so the numbers still show.
-- Find where " - " starts.
local dashIndex = string.find(displayText, " %- ")
if dashIndex then
local numbersPart = string.sub(displayText, dashIndex)
local namePart = string.sub(name, 1, math.max(1, textlen - string.len(numbersPart) - 3)) .. "..."
displayText = namePart .. numbersPart
end
else
displayText = string.sub(name, 1, textlen - 3) .. '...';
end
end
bar.txt:SetText(displayText);
bar.txt:SetTextColor(sr, sg, sb, sa);
local fontName, fontHeight, fontFlags = bar.txt:GetFont()
local btextheight = (HealBot_Config.btextheight and HealBot_Config.btextheight[HealBot_Config.Current_Skin]) or 10
local fontHeightToUse = (fontHeight and fontHeight >= 6) and fontHeight or btextheight
local fontOutline = HealBot_Config.bfontoutline[HealBot_Config.Current_Skin] or 0
local expectedFlags = fontOutline == 1 and "OUTLINE" or ""
local expectedFont = (HealBot_Config.bfont and HealBot_Config.bfont[HealBot_Config.Current_Skin]) or fontName
if fontFlags ~= expectedFlags or fontName ~= expectedFont or (fontHeight and fontHeight < 6) then
bar.txt:SetFont(expectedFont, fontHeightToUse, expectedFlags)
end
local iconSize = HealBot_Config.biconsize[HealBot_Config.Current_Skin] or 12
local dMode = HealBot_Config.HealBot_Integrations_HoTTimerDisplayMode or 0
local overlayMode = (HealBot_Config.HealBot_Integrations_ShowHoTTimers == 1) and (dMode == 1 or dMode == 2)
local unitMap = overlayMode and HealBot_ActiveHoTUnitMap and HealBot_ActiveHoTUnitMap[unit]
for i = 1, 10 do
local icon = button["icon"..i]
if not icon then
icon = getglobal(button:GetName() .. "BarIcon" .. i)
button["icon"..i] = icon
end
if icon then
if button["iconText"..i] then
button["iconText"..i]:Hide()
button["iconText"..i] = nil
end
local iconText = bar["iconText"..i]
if HealBot_UnitIcons and HealBot_UnitIcons[unit] and HealBot_UnitIcons[unit][i] then
local currentTexture = icon:GetTexture()
local newTexture = HealBot_UnitIcons[unit][i]
if currentTexture ~= newTexture then
icon:SetTexture(newTexture)
end
if icon:GetWidth() ~= iconSize then
icon:SetWidth(iconSize)
icon:SetHeight(iconSize)
if iconText then
iconText:SetFont("Fonts\\ARIALN.TTF", math.min(11, math.max(8, iconSize - 2)), "OUTLINE")
end
end
if not icon:IsVisible() then
icon:Show()
end
if overlayMode then
if not iconText then
local overlayFrame = bar.overlayFrame
if not overlayFrame then
overlayFrame = CreateFrame("Frame", nil, bar)
overlayFrame:SetAllPoints(bar)
overlayFrame:SetFrameLevel(bar:GetFrameLevel() + 5)
bar.overlayFrame = overlayFrame
end
iconText = overlayFrame:CreateFontString(nil, "OVERLAY")
iconText:SetFont("Fonts\\ARIALN.TTF", math.min(11, math.max(8, iconSize - 2)), "OUTLINE")
iconText:SetPoint("CENTER", icon, "CENTER", 0, 0)
iconText:SetTextColor(1, 1, 1, 1)
bar["iconText"..i] = iconText
end
local cleanTex = newTexture and string.lower(string.gsub(newTexture, "/", "\\"))
local shortTex = cleanTex and string.match(cleanTex, "([^\\]+)$")
local timeLeft = unitMap and (unitMap[newTexture] or (cleanTex and unitMap[cleanTex]) or (shortTex and unitMap[shortTex]))
if timeLeft then
if bar.overlayFrame then bar.overlayFrame:Show() end
iconText:SetText(timeLeft)
iconText:Show()
else
if iconText and iconText:IsVisible() then
iconText:SetText("")
iconText:Hide()
end
end
elseif iconText and iconText:IsVisible() then
iconText:SetText("")
iconText:Hide()
end
else
if icon:IsVisible() then
icon:Hide()
end
if iconText and iconText:IsVisible() then
iconText:Hide()
end
end
end
end
local raidIcon = getglobal(button:GetName() .. "BarRaidIcon")
if raidIcon then
local index
if not string.find(unit, "^Test") then
index = GetRaidTargetIndex(unit)
end
if index then
SetRaidTargetIconTexture(raidIcon, index)
raidIcon:Show()
else
raidIcon:Hide()
end
end
end
local HealBot_AnimTimer = 0
local HealBot_AnimFrame = 0
-- HealBot_Action_UpdateDebuffAnimation: Advances animated overlay frames on active debuffed buttons.
function HealBot_Action_UpdateDebuffAnimation(elapsed)
if not HealBot_Config or (HealBot_Config.CDCOverlay ~= 5 and HealBot_Config.CDCOverlay ~= 6) then return end
HealBot_AnimTimer = HealBot_AnimTimer + elapsed
if HealBot_AnimTimer < 0.066 then return end -- ~15 FPS
HealBot_AnimTimer = 0
HealBot_AnimFrame = math.mod(HealBot_AnimFrame + 1, 16)
local col = math.mod(HealBot_AnimFrame, 2)
local row = math.floor(HealBot_AnimFrame / 2)
local left = col * 0.5
local right = left + 0.5
local top = row * 0.125
local bottom = top + 0.125
for _, button in pairs(HealBot_Action_HealButtons) do
if button and button.isAnimatedDebuff and button.debuffOverlay and button.debuffOverlay:IsVisible() and button.debuffGlow and button.debuffGlow:IsVisible() then
button.debuffGlow:SetTexCoord(left, right, top, bottom)
end
end
end
-- HealBot_Action_EnableButtons: Internal utility: HealBot_Action_EnableButtons
function HealBot_Action_EnableButtons()
for index, button in pairs(HealBot_Action_HealButtons) do
HealBot_Action_EnableButton(button)
end
end
-- HealBot_Action_RefreshButton: Calls EnableButton if unit is valid.
function HealBot_Action_RefreshButton(button)
if not button then return end
local unit = button.unit;
if HealBot_MayHeal(unit) then
HealBot_Action_EnableButton(button)
end
end
-- HealBot_Action_ResetSkin: Internal utility: HealBot_Action_ResetSkin
function HealBot_Action_ResetSkin()
HealBot_Action_PartyChanged()
local skin = HealBot_Config.Current_Skin
local bfont = (HealBot_Config.bfont and HealBot_Config.bfont[skin]) or "Fonts\\FRIZQT__.TTF"
local btextheight = (HealBot_Config.btextheight and HealBot_Config.btextheight[skin]) or 10
local fontOutline = (HealBot_Config.bfontoutline and HealBot_Config.bfontoutline[skin]) or 0
local expectedFlags = fontOutline == 1 and "OUTLINE" or ""
local borderStyle = (HealBot_Config.bborder and HealBot_Config.bborder[skin]) or 2
local width = (HealBot_Config.bframewidth and HealBot_Config.bframewidth[skin]) or 10
local edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border"
if borderStyle == 1 then
edgeFile = "Interface\\Buttons\\WHITE8X8"
end
HealBot_BarFrame_Backdrop.edgeFile = edgeFile
HealBot_BarFrame_Backdrop.edgeSize = width
for i = 1, 84 do
local btn = getglobal("HealBot_Action_HealUnit" .. i)
if btn then
if not btn.debuffOverlay then
btn.debuffOverlay = getglobal(btn:GetName() .. "DebuffOverlay")
end
if btn.debuffOverlay then
btn.debuffOverlay:SetBackdrop(HealBot_BarFrame_Backdrop)
end
end
end
if HealBot_Action_OptionsButton and HealBot_Action_OptionsButton:GetFontString() then
HealBot_Action_OptionsButton:GetFontString():SetFont(bfont, btextheight, expectedFlags)
end
if HealBot_Action_AbortButton and HealBot_Action_AbortButton:GetFontString() then
HealBot_Action_AbortButton:GetFontString():SetFont(bfont, btextheight, expectedFlags)
end
for j = 1, 20 do
local headerobj = getglobal("HealBot_Action_Header" .. j)
if headerobj and headerobj:GetFontString() then
headerobj:GetFontString():SetFont(bfont, btextheight, expectedFlags)
end
end
if HealBot_Options:IsVisible() then
HealBot_Action_SetTexture(HealBot_DiseaseColorpick, HealBot_Config.btexture[skin])
HealBot_Action_SetTexture(HealBot_MagicColorpick, HealBot_Config.btexture[skin])
HealBot_Action_SetTexture(HealBot_PoisonColorpick, HealBot_Config.btexture[skin])
HealBot_Action_SetTexture(HealBot_CurseColorpick, HealBot_Config.btexture[skin])
HealBot_Action_SetTexture(HealBot_EnTextColorpick, HealBot_Config.btexture[skin])
HealBot_Action_SetTexture(HealBot_EnTextColorpickin, HealBot_Config.btexture[skin])
HealBot_Action_SetTexture(HealBot_DisTextColorpick, HealBot_Config.btexture[skin])
HealBot_Action_SetTexture(HealBot_DebTextColorpick, HealBot_Config.btexture[skin])
if HealBot_BarFrameColorpick then
HealBot_Action_SetTexture(HealBot_BarFrameColorpick, HealBot_Config.btexture[skin])
end
HealBot_SetSkinColours()
end
HealBot_Action_EnableButtons()
end
-- HealBot_Action_RefreshButtons: Refreshes all active unit buttons.
function HealBot_Action_RefreshButtons(unit)
if unit and HealBot_Action_UnitButtons[unit] then
for index, button in pairs(HealBot_Action_UnitButtons[unit]) do
HealBot_Action_RefreshButton(button)
end
else
for index, button in pairs(HealBot_Action_HealButtons) do
HealBot_Action_RefreshButton(button)
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
@@ -1,5 +1,5 @@
-- HealBot_View_Layout.lua -- HealBot_View_Grid.lua
-- Manages skins, status bar layouts, anchoring, and grid rendering for the HealBot panel -- Roster tracking, grid calculation, button positioning, and frame geometry
local headerno = 0 local headerno = 0
@@ -17,329 +17,6 @@ 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)
if not bar then return end
if btexture == 10 then
bar:SetStatusBarTexture("Interface\\Buttons\\WHITE8X8");
else
bar:SetStatusBarTexture("Interface\\AddOns\\HealBotBlue\\Images\\bar" .. tostring(btexture) .. ".tga");
end
end
-- HealBot_HealthColor: Computes health bar RGBA based on debuffs and class.
function HealBot_HealthColor(unit, hlth, maxhlth)
local cached_debuff = HealBot_UnitDebuff[unit]
if cached_debuff then
local color = HealBot_Config.CDCBarColour[cached_debuff]
if color then
local dr = color.R
local dg = color.G
local db = color.B
return dr, dg, db, HealBot_Config.Barcola[HealBot_Config.Current_Skin];
end
return dr, dg, db, HealBot_Config.Barcola[HealBot_Config.Current_Skin];
end
local text = UnitName(unit);
if not HealBot_HealsIn[text] then
HealBot_HealsIn[text] = 0;
end
local pct = hlth + HealBot_HealsIn[text];
if maxhlth and maxhlth > 0 then
if pct < maxhlth then
pct = pct / maxhlth;
else
pct = 1;
end
else
pct = 0;
end
local r, g, b = 1.0, 1.0, 0.0;
local a = HealBot_Config.Barcola[HealBot_Config.Current_Skin];
if pct > HealBot_Config.AlertLevel then
a = HealBot_Config.bardisa[HealBot_Config.Current_Skin];
end
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 and RAID_CLASS_COLORS and RAID_CLASS_COLORS[HealBot_Model.units[unit].englishClass] then
local engClass = HealBot_Model.units[unit].englishClass
r = RAID_CLASS_COLORS[engClass].r
g = RAID_CLASS_COLORS[engClass].g
b = RAID_CLASS_COLORS[engClass].b
elseif colorMode == 2 and string.find(unit, "pet") then
r, g, b = 0.4, 0.9, 0.6 -- Mint color
else
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.64 and pct > 0.31 then g = (pct - 0.31) * 3; end
if pct <= 0.31 then g = 0.0; end
end
return r, g, b, a;
end
-- HealBot_Action_HealthBar: Internal utility: HealBot_Action_HealthBar
function HealBot_Action_HealthBar(button)
if not button.bar then
button.bar = getglobal(button:GetName() .. "Bar")
end
return button.bar;
end
-- HealBot_Action_HealthBar2: Internal utility: HealBot_Action_HealthBar2
function HealBot_Action_HealthBar2(button)
if not button.bar2 then
button.bar2 = getglobal(button:GetName() .. "Bar2")
end
return button.bar2;
end
-- HealBot_Action_EnableButton: Updates a button's health, color, text, and debuffs.
function HealBot_Action_EnableButton(button)
local unit = button.unit;
local state = HealBot_Model.units[unit]
if not state then return end
if not state.englishClass then
HealBot_Model:UpdateUnitIdentity(unit)
end
local hlth = state.health
local maxhlth = state.maxHealth
local name = state.name
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 bar2 = HealBot_Action_HealthBar2(button);
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 bheight = HealBot_Config.bheight[HealBot_Config.Current_Skin];
local sr = HealBot_Config.btextenabledcolr[HealBot_Config.Current_Skin];
local sg = HealBot_Config.btextenabledcolg[HealBot_Config.Current_Skin];
local sb = HealBot_Config.btextenabledcolb[HealBot_Config.Current_Skin];
local sa = HealBot_Config.btextenabledcola[HealBot_Config.Current_Skin];
local r, g, b, a = HealBot_HealthColor(button.unit, hlth, maxhlth)
local btextheight = HealBot_Config.btextheight[HealBot_Config.Current_Skin] or 10;
if btextheight == 0 then btextheight = 10 end
local bwidth = HealBot_Config.bwidth[HealBot_Config.Current_Skin]
local textlen = math.floor(5 + (((bwidth * 1.8) / btextheight) - (btextheight / 2)))
bar:SetMinMaxValues(0, maxhlth);
bar:SetValue(hlth);
local englishClass = state.englishClass
local isHealer = false
if englishClass == "PALADIN" or englishClass == "DRUID" or englishClass == "SHAMAN" or englishClass == "PRIEST" then
isHealer = true
end
local pt = state.powerType
local showMana = false
local pr, pg, pb = 0, 0, 1 -- Default Blue for Mana
if HealBot_Config.ShowManaBars == 1 and state.maxMana > 0 then
if pt == 0 then
if HealBot_Config.ManaBarsHealersOnly == 1 then
if isHealer then showMana = true end
else
showMana = true
end
elseif HealBot_Config.ShowNonManaBars == 1 then
showMana = true
if pt == 1 then pr, pg, pb = 1, 0, 0 -- Rage (Red)
elseif pt == 3 then pr, pg, pb = 1, 1, 0 -- Energy (Yellow)
elseif pt == 2 then pr, pg, pb = 1, 0.5, 0 -- Focus (Orange)
end
end
end
if showMana then
if bar3 then
bar3:SetMinMaxValues(0, state.maxMana)
bar3:SetValue(state.mana)
bar3:SetStatusBarColor(pr, pg, pb, HealBot_Config.Barcola[HealBot_Config.Current_Skin])
HealBot_Action_SetTexture(bar3, HealBot_Config.btexture[HealBot_Config.Current_Skin])
bar3:Show()
bar3:SetHeight(bheight * 0.2)
end
bar:SetHeight(bheight * 0.8)
bar2:SetHeight(bheight * 0.8)
else
if bar3 then
bar3:Hide()
end
bar:SetHeight(bheight)
bar2:SetHeight(bheight)
end
if HealBot_HealsIn[name] then
bar2:SetMinMaxValues(0, maxhlth);
bar2:SetValue(hlth + HealBot_HealsIn[name]);
else
bar2:SetValue(0);
end
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
button:Enable();
if HealBot_UnitDebuff[unit] then
sr = HealBot_Config.btextcursecolr[HealBot_Config.Current_Skin];
sg = HealBot_Config.btextcursecolg[HealBot_Config.Current_Skin];
sb = HealBot_Config.btextcursecolb[HealBot_Config.Current_Skin];
sa = HealBot_Config.btextcursecola[HealBot_Config.Current_Skin];
elseif HealBot_MissingBuffs[unit] then
r = r * 0.5;
g = g * 0.5;
b = b * 0.5;
sr = 1.0;
sg = 1.0;
sb = 0.0;
end
bar:SetStatusBarColor(r, g, b, HealBot_Config.Barcola[HealBot_Config.Current_Skin]);
bar2:SetStatusBarColor(r, g, b, HealBot_Config.BarcolaInHeal[HealBot_Config.Current_Skin]);
else
button:Disable();
sr = HealBot_Config.btextdisbledcolr[HealBot_Config.Current_Skin];
sg = HealBot_Config.btextdisbledcolg[HealBot_Config.Current_Skin];
sb = HealBot_Config.btextdisbledcolb[HealBot_Config.Current_Skin];
sa = HealBot_Config.btextdisbledcola[HealBot_Config.Current_Skin];
bar:SetStatusBarColor(r, g, b, HealBot_Config.bardisa[HealBot_Config.Current_Skin]);
bar2:SetStatusBarColor(r, g, b, HealBot_Config.bardisa[HealBot_Config.Current_Skin]);
end
local healthTextOpt = HealBot_Config.ShowHealthText or 0
local displayText = name
if healthTextOpt == 1 then
local pct = 0
if maxhlth > 0 then pct = math.floor((hlth / maxhlth) * 100) end
displayText = name .. " - " .. pct .. "%"
elseif healthTextOpt == 2 then
displayText = name .. " - " .. hlth .. "/" .. maxhlth
elseif healthTextOpt == 3 then
local deficit = maxhlth - hlth
if deficit > 0 then
displayText = name .. " - -" .. deficit
end
end
if string.len(displayText) > textlen then
if healthTextOpt > 0 then
-- If we have numbers, just truncate the name part so the numbers still show.
-- Find where " - " starts.
local dashIndex = string.find(displayText, " %- ")
if dashIndex then
local numbersPart = string.sub(displayText, dashIndex)
local namePart = string.sub(name, 1, math.max(1, textlen - string.len(numbersPart) - 3)) .. "..."
displayText = namePart .. numbersPart
end
else
displayText = string.sub(name, 1, textlen - 3) .. '...';
end
end
bar.txt:SetText(displayText);
bar.txt:SetTextColor(sr, sg, sb, sa);
local fontName, fontHeight, fontFlags = bar.txt:GetFont()
local fontOutline = HealBot_Config.bfontoutline[HealBot_Config.Current_Skin] or 0
if fontOutline == 1 then
bar.txt:SetFont(fontName, fontHeight, "OUTLINE")
else
bar.txt:SetFont(fontName, fontHeight, "")
end
local iconSize = HealBot_Config.biconsize[HealBot_Config.Current_Skin] or 12
for i = 1, 10 do
local icon = getglobal(button:GetName() .. "BarIcon" .. i)
if icon then
if HealBot_UnitIcons and HealBot_UnitIcons[unit] and HealBot_UnitIcons[unit][i] then
icon:SetTexture(HealBot_UnitIcons[unit][i])
icon:SetWidth(iconSize)
icon:SetHeight(iconSize)
icon:Show()
else
icon:Hide()
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
-- HealBot_Action_EnableButtons: Internal utility: HealBot_Action_EnableButtons
function HealBot_Action_EnableButtons()
for index, button in pairs(HealBot_Action_HealButtons) do
HealBot_Action_EnableButton(button)
end
end
-- HealBot_Action_RefreshButton: Calls EnableButton if unit is valid.
function HealBot_Action_RefreshButton(button)
if not button then return end
local unit = button.unit;
if HealBot_MayHeal(unit) then
HealBot_Action_EnableButton(button)
end
end
-- HealBot_Action_ResetSkin: Internal utility: HealBot_Action_ResetSkin
function HealBot_Action_ResetSkin()
HealBot_Action_PartyChanged()
if HealBot_Options:IsVisible() then
HealBot_Action_SetTexture(HealBot_DiseaseColorpick, HealBot_Config.btexture[HealBot_Config.Current_Skin])
HealBot_Action_SetTexture(HealBot_MagicColorpick, HealBot_Config.btexture[HealBot_Config.Current_Skin])
HealBot_Action_SetTexture(HealBot_PoisonColorpick, HealBot_Config.btexture[HealBot_Config.Current_Skin])
HealBot_Action_SetTexture(HealBot_CurseColorpick, HealBot_Config.btexture[HealBot_Config.Current_Skin])
HealBot_Action_SetTexture(HealBot_EnTextColorpick, HealBot_Config.btexture[HealBot_Config.Current_Skin])
HealBot_Action_SetTexture(HealBot_EnTextColorpickin, HealBot_Config.btexture[HealBot_Config.Current_Skin])
HealBot_Action_SetTexture(HealBot_DisTextColorpick, HealBot_Config.btexture[HealBot_Config.Current_Skin])
HealBot_Action_SetTexture(HealBot_DebTextColorpick, HealBot_Config.btexture[HealBot_Config.Current_Skin])
HealBot_SetSkinColours()
end
end
-- HealBot_Action_RefreshButtons: Refreshes all active unit buttons.
function HealBot_Action_RefreshButtons(unit)
if unit and HealBot_Action_UnitButtons[unit] then
for index, button in pairs(HealBot_Action_UnitButtons[unit]) do
HealBot_Action_RefreshButton(button)
end
else
for index, button in pairs(HealBot_Action_HealButtons) do
HealBot_Action_RefreshButton(button)
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. -- 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;
@@ -347,6 +24,13 @@ function HealBot_Action_PositionButton(button, OsetX, OsetY, bwidth, bheight, ch
headerno = headerno + 1; headerno = headerno + 1;
local headerobj = getglobal("HealBot_Action_Header" .. headerno); local headerobj = getglobal("HealBot_Action_Header" .. headerno);
headerobj:SetText(header) headerobj:SetText(header)
local bfont = (HealBot_Config.bfont and HealBot_Config.bfont[HealBot_Config.Current_Skin]) or "Fonts\\FRIZQT__.TTF"
local btextheight = (HealBot_Config.btextheight and HealBot_Config.btextheight[HealBot_Config.Current_Skin]) or 10
local fontOutline = (HealBot_Config.bfontoutline and HealBot_Config.bfontoutline[HealBot_Config.Current_Skin]) or 0
local expectedFlags = fontOutline == 1 and "OUTLINE" or ""
if headerobj:GetFontString() then
headerobj:GetFontString():SetFont(bfont, btextheight, expectedFlags)
end
headerobj:Show(); headerobj:Show();
headerobj:ClearAllPoints(); headerobj:ClearAllPoints();
headerobj:SetHeight(bheight); headerobj:SetHeight(bheight);
@@ -383,6 +67,13 @@ function HealBot_Action_PositionButtonHorizontal(button, OsetX, OsetY, bwidth, b
headerno = headerno + 1; headerno = headerno + 1;
local headerobj = getglobal("HealBot_Action_Header" .. headerno); local headerobj = getglobal("HealBot_Action_Header" .. headerno);
headerobj:SetText(header) headerobj:SetText(header)
local bfont = (HealBot_Config.bfont and HealBot_Config.bfont[HealBot_Config.Current_Skin]) or "Fonts\\FRIZQT__.TTF"
local btextheight = (HealBot_Config.btextheight and HealBot_Config.btextheight[HealBot_Config.Current_Skin]) or 10
local fontOutline = (HealBot_Config.bfontoutline and HealBot_Config.bfontoutline[HealBot_Config.Current_Skin]) or 0
local expectedFlags = fontOutline == 1 and "OUTLINE" or ""
if headerobj:GetFontString() then
headerobj:GetFontString():SetFont(bfont, btextheight, expectedFlags)
end
headerobj:Show(); headerobj:Show();
headerobj:ClearAllPoints(); headerobj:ClearAllPoints();
headerobj:SetHeight(bheight); headerobj:SetHeight(bheight);
@@ -441,8 +132,10 @@ end
-- HealBot_Action_SetHealButton: Assigns a unit string to a grid button slot. -- 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 = {}; for k in pairs(HealBot_Action_HealButtons) do HealBot_Action_HealButtons[k] = nil end
HealBot_Action_UnitButtons = {}; for k in pairs(HealBot_Action_UnitButtons) do
HealBot_Action_UnitButtons[k] = nil
end
return nil return nil
end end
local button = getglobal("HealBot_Action_HealUnit" .. index); local button = getglobal("HealBot_Action_HealUnit" .. index);
@@ -495,11 +188,13 @@ function HealBot_Action_PartyChanged()
end end
end end
for j = 1, 15 do for j = 1, 20 do
local headerobj = getglobal("HealBot_Action_Header" .. j); local headerobj = getglobal("HealBot_Action_Header" .. j);
if headerobj then
headerobj:SetText(" ") headerobj:SetText(" ")
headerobj:Hide(); headerobj:Hide();
end end
end
local bwidth = HealBot_Config.bwidth[HealBot_Config.Current_Skin] or 85; local bwidth = HealBot_Config.bwidth[HealBot_Config.Current_Skin] or 85;
local sr = HealBot_Config.btextdisbledcolr[HealBot_Config.Current_Skin] or 0.4; local sr = HealBot_Config.btextdisbledcolr[HealBot_Config.Current_Skin] or 0.4;
@@ -524,6 +219,51 @@ function HealBot_Action_PartyChanged()
local i = 0; local i = 0;
local last = 0; local last = 0;
local GroupValid = numBars; local GroupValid = numBars;
if HealBot_Config.TestBarsOn then
local testBars = HealBot_Config.numTestBars or 25
if HealBot_Config.ShowHeader[HealBot_Config.Current_Skin] == 1 then
HeaderPos[i + 1] = HEALBOT_OPTIONS_TESTBARS or "Test Bars"
end
local testClasses = {"PRIEST", "DRUID", "SHAMAN", "PALADIN", "WARRIOR", "MAGE", "WARLOCK", "HUNTER", "ROGUE"}
local testNames = {"Arthas", "Illidan", "Sylvanas", "Thrall", "Jaina", "Uther", "Grommash", "Malfurion", "Tyrande", "Guldan", "Kael", "Rexxar", "Varian", "Voljin", "Baine"}
for j = 1, testBars do
i = i + 1
local unit = "Test" .. j
HealBot_Action_SetHealButton(i, unit)
if not HealBot_Model.units[unit] then
local rClass = testClasses[math.random(1, table.getn(testClasses))]
local rName = testNames[math.random(1, table.getn(testNames))] .. j
local mHealth = math.random(4000, 8000)
local cHealth = math.random(1, mHealth)
local pt = 0
if rClass == "WARRIOR" then pt = 1 elseif rClass == "ROGUE" then pt = 3 end
HealBot_Model.units[unit] = { name = rName, guid = "TestGuid"..j, class = rClass, englishClass = rClass, health = cHealth, maxHealth = mHealth, mana = 2000, maxMana = 4000, powerType = pt, incomingHeal = 0, hasAggro = false, range = 1, isDead = false, isGhost = false, isConnected = true }
if not HealBot_UnitIcons then HealBot_UnitIcons = {} end
HealBot_UnitIcons[unit] = {}
local testIcons = {
"Interface\\Icons\\Spell_Holy_Renew",
"Interface\\Icons\\Spell_Nature_Rejuvenation",
"Interface\\Icons\\Spell_Nature_ResistNature", -- Regrowth
"Interface\\Icons\\Spell_Holy_PowerWordShield",
"Interface\\Icons\\Spell_Holy_Excorcism" -- Fear Ward
}
-- Shuffle icons
for k = table.getn(testIcons), 2, -1 do
local j = math.random(k)
testIcons[k], testIcons[j] = testIcons[j], testIcons[k]
end
local numIcons = math.random(0, 3)
for k = 1, numIcons do
HealBot_UnitIcons[unit][k] = testIcons[k]
end
end
numBars = numBars + 1
end
if HealBot_Config.ShowHeader[HealBot_Config.Current_Skin] == 1 then
numBars = numBars + 1
numHeaders = numHeaders + 1
end
else
last = last + 6 last = last + 6
if HealBot_Config.GroupHeals == 1 then if HealBot_Config.GroupHeals == 1 then
if HealBot_Config.ShowHeader[HealBot_Config.Current_Skin] == 1 then if HealBot_Config.ShowHeader[HealBot_Config.Current_Skin] == 1 then
@@ -724,14 +464,15 @@ function HealBot_Action_PartyChanged()
if GetNumRaidMembers() > 0 then if GetNumRaidMembers() > 0 then
for j = 1, 40 do for j = 1, 40 do
local unit = "raid" .. j; local unit = "raid" .. j;
local Class = UnitClass(unit);
local ProcessUnit = 0;
local PossibleEmerg = 1;
local name, rank, subgroup, level, class, fileName, zone, online, isDead = GetRaidRosterInfo(j); local name, rank, subgroup, level, class, fileName, zone, online, isDead = GetRaidRosterInfo(j);
if not name then name = "not known" end if not name then name = "not known" end
if not class then class = "not known" end if not class then class = "not known" end
if not subgroup then subgroup = "not known" end if not subgroup then subgroup = "not known" end
local Class = UnitClass(unit) or class;
local ProcessUnit = 0;
local PossibleEmerg = 1;
if HealBot_EmergInc[Class] == 1 then if HealBot_EmergInc[Class] == 1 then
ProcessUnit = 1; ProcessUnit = 1;
end end
@@ -837,6 +578,9 @@ function HealBot_Action_PartyChanged()
HeaderPos[i + 1] = nil; HeaderPos[i + 1] = nil;
numBars = numBars - 1; numBars = numBars - 1;
end end
HealBot_ReleaseTable(order);
HealBot_ReleaseTable(units);
end
last = last + 40 last = last + 40
local PetsValid = numBars; local PetsValid = numBars;
@@ -857,8 +601,10 @@ function HealBot_Action_PartyChanged()
if i == last then break end if i == last then break end
end end
else else
local petUnits = { "pet", "partypet1", "partypet2", "partypet3", "partypet4" }; if not HealBot_PetUnits then
for _, unit in ipairs(petUnits) do HealBot_PetUnits = { "pet", "partypet1", "partypet2", "partypet3", "partypet4" };
end
for _, unit in ipairs(HealBot_PetUnits) do
if not HealBot_Action_UnitButtons[unit] and HealBot_MayHeal(unit) then if not HealBot_Action_UnitButtons[unit] and HealBot_MayHeal(unit) then
i = i + 1; i = i + 1;
HealBot_Action_SetHealButton(i, unit); HealBot_Action_SetHealButton(i, unit);
@@ -867,8 +613,6 @@ function HealBot_Action_PartyChanged()
if i == last then break end if i == last then break end
end end
end end
HealBot_ReleaseTable(order);
HealBot_ReleaseTable(units);
end end
if numBars == PetsValid + 1 and HealBot_Config.ShowHeader[HealBot_Config.Current_Skin] == 1 then if numBars == PetsValid + 1 and HealBot_Config.ShowHeader[HealBot_Config.Current_Skin] == 1 then
HeaderPos[PetsValid + 1] = nil; HeaderPos[PetsValid + 1] = nil;
@@ -988,10 +732,17 @@ function HealBot_Action_PartyChanged()
HealBot_Grid_Limit = limit; HealBot_Grid_Limit = limit;
HealBot_Grid_NumBars = numBars; HealBot_Grid_NumBars = numBars;
local bfont = (HealBot_Config.bfont and HealBot_Config.bfont[HealBot_Config.Current_Skin]) or "Fonts\\FRIZQT__.TTF"
local fontOutline = (HealBot_Config.bfontoutline and HealBot_Config.bfontoutline[HealBot_Config.Current_Skin]) or 0
local expectedFlags = fontOutline == 1 and "OUTLINE" or ""
if HealBot_Config.HideOptions == 1 then if HealBot_Config.HideOptions == 1 then
HealBot_Action_OptionsButton:Hide(); HealBot_Action_OptionsButton:Hide();
else else
HealBot_Action_OptionsButton:SetPoint("BOTTOM", "HealBot_Action", "BOTTOM", 0, bpadding); HealBot_Action_OptionsButton:SetPoint("BOTTOM", "HealBot_Action", "BOTTOM", 0, bpadding);
if HealBot_Action_OptionsButton:GetFontString() then
HealBot_Action_OptionsButton:GetFontString():SetFont(bfont, btextheight, expectedFlags)
end
HealBot_Action_OptionsButton:Show(); HealBot_Action_OptionsButton:Show();
MaxOffsetY = MaxOffsetY + 30; MaxOffsetY = MaxOffsetY + 30;
end end
@@ -1007,6 +758,7 @@ function HealBot_Action_PartyChanged()
bar.txt = getglobal(bar:GetName() .. "_text"); bar.txt = getglobal(bar:GetName() .. "_text");
bar.txt:SetTextColor(sr, sg, sb, sa); bar.txt:SetTextColor(sr, sg, sb, sa);
bar.txt:SetText(HEALBOT_ACTION_ABORT); bar.txt:SetText(HEALBOT_ACTION_ABORT);
bar.txt:SetFont(bfont, btextheight, expectedFlags);
HealBot_Action_SetTexture(bar, btexture); HealBot_Action_SetTexture(bar, btexture);
bar:SetMinMaxValues(0, 100); bar:SetMinMaxValues(0, 100);
bar:SetValue(100); bar:SetValue(100);
@@ -1054,8 +806,8 @@ end
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 = {}; for k in pairs(HealBot_Action_HealTarget) do HealBot_Action_HealTarget[k] = nil end
HealBot_Action_HealFocus = {}; for k in pairs(HealBot_Action_HealFocus) do HealBot_Action_HealFocus[k] = nil end
HealBot_Action_PartyChanged(); HealBot_Action_PartyChanged();
end end
@@ -1132,7 +884,10 @@ function HealBot_Action_AppendUnit(unit)
local btexture = (HealBot_Config.btexture and HealBot_Config.btexture[HealBot_Config.Current_Skin]) or 5 local btexture = (HealBot_Config.btexture and HealBot_Config.btexture[HealBot_Config.Current_Skin]) or 5
HealBot_Action_SetTexture(bar, btexture) HealBot_Action_SetTexture(bar, btexture)
local btextheight = (HealBot_Config.btextheight and HealBot_Config.btextheight[HealBot_Config.Current_Skin]) or 10 local btextheight = (HealBot_Config.btextheight and HealBot_Config.btextheight[HealBot_Config.Current_Skin]) or 10
bar.txt:SetTextHeight(btextheight) local bfont = (HealBot_Config.bfont and HealBot_Config.bfont[HealBot_Config.Current_Skin]) or "Fonts\\FRIZQT__.TTF"
local fontOutline = (HealBot_Config.bfontoutline and HealBot_Config.bfontoutline[HealBot_Config.Current_Skin]) or 0
local expectedFlags = fontOutline == 1 and "OUTLINE" or ""
bar.txt:SetFont(bfont, btextheight, expectedFlags)
bar2:SetHeight(bheight) bar2:SetHeight(bheight)
HealBot_Action_SetTexture(bar2, btexture) HealBot_Action_SetTexture(bar2, btexture)
@@ -1153,7 +908,7 @@ end
function HealBot_Action_AppendNewUnits() function HealBot_Action_AppendNewUnits()
if not HealBot_Grid_LastI then return end if not HealBot_Grid_LastI then return end
local unitsToCheck = {} local unitsToCheck = HealBot_GetTable()
-- Gather units based on config, similar to PartyChanged -- Gather units based on config, similar to PartyChanged
if HealBot_Config.GroupHeals == 1 then if HealBot_Config.GroupHeals == 1 then
@@ -1220,4 +975,11 @@ function HealBot_Action_AppendNewUnits()
HealBot_Action_AppendUnit(unit) HealBot_Action_AppendUnit(unit)
end end
end end
HealBot_ReleaseTable(unitsToCheck)
end end
local HealBot_PlayerHoTsListFrame = nil
local HealBot_PlayerHoTFrames = {}
local HealBot_PlayerHoTs_ListCache = {}
HealBot_ActiveHoTUnitMap = {} -- unitID -> { [texture] = timeLeft }
+322
View File
@@ -0,0 +1,322 @@
-- HealBot_View_HoT.lua
-- HoT overlays, duration timers, and side list rendering
local HealBot_PlayerHoTsListFrame = nil
local HealBot_PlayerHoTFrames = {}
local HealBot_PlayerHoTs_ListCache = {}
local HealBot_ActiveHoTUnitMap = {}
local function HealBot_PlayerHoTs_SortComparator(a, b)
return (a.expires or 0) < (b.expires or 0)
end
-- Reposition the HoT timer list frame based on config
local function HealBot_HoTTimerList_Reanchor()
if not HealBot_PlayerHoTsListFrame then return end
local pos = HealBot_Config.HealBot_Integrations_HoTTimerPosition or "BELOW"
HealBot_PlayerHoTsListFrame:ClearAllPoints()
if pos == "ABOVE" then
HealBot_PlayerHoTsListFrame:SetPoint("BOTTOMLEFT", HealBot_Action, "TOPLEFT", 0, 2)
elseif pos == "RIGHT" then
HealBot_PlayerHoTsListFrame:SetPoint("TOPLEFT", HealBot_Action, "TOPRIGHT", 2, 0)
elseif pos == "LEFT" then
HealBot_PlayerHoTsListFrame:SetPoint("TOPRIGHT", HealBot_Action, "TOPLEFT", -2, 0)
else -- BELOW (default)
HealBot_PlayerHoTsListFrame:SetPoint("TOPLEFT", HealBot_Action, "BOTTOMLEFT", 0, -2)
end
end
-- Reposition child HoT frames for stacking direction
local function HealBot_HoTTimerList_StackChild(frame, index)
local pos = HealBot_Config.HealBot_Integrations_HoTTimerPosition or "BELOW"
frame:ClearAllPoints()
if pos == "ABOVE" then
if index == 1 then
frame:SetPoint("BOTTOMLEFT", HealBot_PlayerHoTsListFrame, "BOTTOMLEFT", 0, 0)
else
frame:SetPoint("BOTTOMLEFT", HealBot_PlayerHoTFrames[index-1], "TOPLEFT", 0, 2)
end
else
if index == 1 then
frame:SetPoint("TOPLEFT", HealBot_PlayerHoTsListFrame, "TOPLEFT", 0, 0)
else
frame:SetPoint("TOPLEFT", HealBot_PlayerHoTFrames[index-1], "BOTTOMLEFT", 0, -2)
end
end
end
-- Clear all icon overlay timer texts
function HealBot_ClearHoTOverlays()
if not HealBot_Action_UnitButtons then return end
for unit, btnList in pairs(HealBot_Action_UnitButtons) do
for _, button in pairs(btnList) do
local bar = button.bar or getglobal(button:GetName() .. "Bar")
if bar then
for i = 1, 10 do
local iconText = bar["iconText"..i]
if iconText and iconText:IsVisible() then
iconText:SetText("")
iconText:Hide()
end
end
end
end
end
end
-- Render countdown numbers directly on unit bar icons
function HealBot_RenderHoTOverlays()
if not HealBot_Action_UnitButtons then return end
local iconSize = HealBot_Config.biconsize[HealBot_Config.Current_Skin] or 12
local fontSize = math.min(11, math.max(8, iconSize - 2))
for unit, btnList in pairs(HealBot_Action_UnitButtons) do
local unitMap = HealBot_ActiveHoTUnitMap[unit]
for _, button in pairs(btnList) do
local bar = HealBot_Action_HealthBar(button)
if bar and bar:IsVisible() then
for i = 1, 10 do
local icon = button["icon"..i] or getglobal(button:GetName() .. "BarIcon" .. i)
local iconText = bar["iconText"..i]
if icon and icon:IsVisible() then
local tex = icon:GetTexture()
local cleanTex = tex and string.lower(string.gsub(tex, "/", "\\"))
local shortTex = cleanTex and string.match(cleanTex, "([^\\]+)$")
local timeLeft = unitMap and (unitMap[tex] or (cleanTex and unitMap[cleanTex]) or (shortTex and unitMap[shortTex]))
if timeLeft then
if not iconText then
local overlayFrame = bar.overlayFrame
if not overlayFrame then
overlayFrame = CreateFrame("Frame", nil, bar)
overlayFrame:SetAllPoints(bar)
overlayFrame:SetFrameLevel(bar:GetFrameLevel() + 5)
bar.overlayFrame = overlayFrame
end
iconText = overlayFrame:CreateFontString(nil, "OVERLAY")
iconText:SetFont("Fonts\\ARIALN.TTF", fontSize, "OUTLINE")
iconText:SetPoint("CENTER", icon, "CENTER", 0, 0)
iconText:SetTextColor(1, 1, 1, 1)
bar["iconText"..i] = iconText
end
if bar.overlayFrame then bar.overlayFrame:Show() end
iconText:SetText(timeLeft)
iconText:Show()
else
if iconText and iconText:IsVisible() then
iconText:SetText("")
iconText:Hide()
end
end
else
if iconText and iconText:IsVisible() then
iconText:Hide()
end
end
end
end
end
end
end
-- Render HoT timer list
local function HealBot_RenderHoTList(numHoTs, currentTime)
if not HealBot_PlayerHoTsListFrame then
HealBot_PlayerHoTsListFrame = CreateFrame("Frame", "HealBot_PlayerHoTsListFrame", HealBot_Action)
HealBot_PlayerHoTsListFrame:SetWidth(128)
HealBot_PlayerHoTsListFrame:SetHeight(1)
end
HealBot_HoTTimerList_Reanchor()
HealBot_PlayerHoTsListFrame:Show()
-- Sort active HoTs by expiration
table.sort(HealBot_PlayerHoTs_ListCache, HealBot_PlayerHoTs_SortComparator)
for i = 1, math.max(numHoTs, table.getn(HealBot_PlayerHoTFrames)) do
local frame = HealBot_PlayerHoTFrames[i]
if i <= numHoTs then
if not frame then
frame = CreateFrame("Frame", "HealBot_PlayerHoT" .. i, HealBot_PlayerHoTsListFrame)
frame:SetWidth(128)
frame:SetHeight(16)
local icon = frame:CreateTexture(nil, "ARTWORK")
icon:SetWidth(14)
icon:SetHeight(14)
icon:SetPoint("LEFT", frame, "LEFT", 2, 0)
frame.icon = icon
local text = frame:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
text:SetPoint("LEFT", icon, "RIGHT", 4, 0)
text:SetJustifyH("LEFT")
frame.text = text
HealBot_PlayerHoTFrames[i] = frame
end
HealBot_HoTTimerList_StackChild(frame, i)
local hot = HealBot_PlayerHoTs_ListCache[i]
local timeLeft = hot.timeLeft or math.floor(hot.expires - currentTime)
frame.icon:SetTexture(hot.texture)
frame.text:SetText(hot.name .. ": " .. timeLeft .. "s")
frame.text:SetTextColor(0.8, 1, 0.8)
frame:Show()
else
if frame then
frame:Hide()
end
end
end
HealBot_PlayerHoTsListFrame:SetHeight(math.max(1, numHoTs * 18))
end
-- Unified HoT Timer Pipeline
function HealBot_UpdateActiveHoTTimers()
if HealBot_Config.HealBot_Integrations_ShowHoTTimers ~= 1 then
if HealBot_PlayerHoTsListFrame and HealBot_PlayerHoTsListFrame:IsVisible() then
HealBot_PlayerHoTsListFrame:Hide()
end
HealBot_ClearHoTOverlays()
return
end
local currentTime = GetTime()
local numHoTs = 0
-- Clear unit map (recycle)
for _, sub in pairs(HealBot_ActiveHoTUnitMap) do
for k in pairs(sub) do sub[k] = nil end
end
if HealBot_Integrations_Nampower_Active and HealBot_Nampower_Auras then
for targetKey, auras in pairs(HealBot_Nampower_Auras) do
local lowerKey = string.lower(targetKey)
local unitID = HealBot_Model and (HealBot_Model:GetUnitByGUID(targetKey) or HealBot_Model:GetUnitByGUID(lowerKey))
if not unitID then
local isPlayer = (HealBot_PlayerGUID and (targetKey == HealBot_PlayerGUID or lowerKey == string.lower(HealBot_PlayerGUID)))
or (UnitName("player") and (targetKey == UnitName("player") or lowerKey == string.lower(UnitName("player"))))
or (HealBot_GetUnitGUID and (targetKey == HealBot_GetUnitGUID("player") or lowerKey == string.lower(HealBot_GetUnitGUID("player") or "")))
if isPlayer then
unitID = "player"
end
end
if not unitID and HealBot_Model and HealBot_Model.GetUnitIDByName then
unitID = HealBot_Model:GetUnitIDByName(targetKey)
end
-- Multi-tier player name resolution
local displayName = nil
if unitID and unitID ~= "target" then
if HealBot_Model and HealBot_Model.units[unitID] and HealBot_Model.units[unitID].name then
displayName = HealBot_Model.units[unitID].name
end
if not displayName then
displayName = UnitName(unitID)
end
end
if not displayName and HealBot_Nampower_NameCache then
displayName = HealBot_Nampower_NameCache[targetKey] or HealBot_Nampower_NameCache[lowerKey]
end
if not displayName and UnitExists("target") and HealBot_GetUnitGUID and (targetKey == HealBot_GetUnitGUID("target") or lowerKey == string.lower(HealBot_GetUnitGUID("target") or "")) then
displayName = UnitName("target")
end
if not displayName and UnitExists("mouseover") and HealBot_GetUnitGUID and (targetKey == HealBot_GetUnitGUID("mouseover") or lowerKey == string.lower(HealBot_GetUnitGUID("mouseover") or "")) then
displayName = UnitName("mouseover")
end
if not displayName then
local uName = UnitName(targetKey)
if uName and uName ~= targetKey and uName ~= "Unknown" then
displayName = uName
end
end
if displayName and HealBot_Nampower_NameCache then
HealBot_Nampower_NameCache[targetKey] = displayName
HealBot_Nampower_NameCache[lowerKey] = displayName
end
-- Exclude pets
if not (unitID and string.find(unitID, "pet")) then
for spellName, expiration in pairs(auras) do
local auraInfo = HealBot_TrackedAura_Spells and HealBot_TrackedAura_Spells[spellName]
if not auraInfo and HealBot_TrackedAuras and HealBot_TrackedAuras[spellName] then
auraInfo = HealBot_TrackedAuras[spellName]
end
if auraInfo and auraInfo.showTimer and expiration > currentTime then
local timeLeft = math.floor(expiration - currentTime)
local tex = auraInfo.texture or "Interface\\Icons\\INV_Misc_QuestionMark"
numHoTs = numHoTs + 1
if not HealBot_PlayerHoTs_ListCache[numHoTs] then
HealBot_PlayerHoTs_ListCache[numHoTs] = {}
end
local hot = HealBot_PlayerHoTs_ListCache[numHoTs]
hot.unit = unitID
hot.name = displayName or "Unknown"
hot.spell = spellName
hot.texture = tex
hot.expires = expiration
hot.timeLeft = timeLeft
if unitID then
if not HealBot_ActiveHoTUnitMap[unitID] then
HealBot_ActiveHoTUnitMap[unitID] = {}
end
local cleanTex = string.lower(string.gsub(tex, "/", "\\"))
local shortTex = string.match(cleanTex, "([^\\]+)$")
HealBot_ActiveHoTUnitMap[unitID][tex] = timeLeft
HealBot_ActiveHoTUnitMap[unitID][cleanTex] = timeLeft
if shortTex then
HealBot_ActiveHoTUnitMap[unitID][shortTex] = timeLeft
end
-- If player in raid, map under raid token button as well
if unitID == "player" and HealBot_Action_UnitButtons then
for btnUnit in pairs(HealBot_Action_UnitButtons) do
if btnUnit ~= "player" and not string.find(btnUnit, "^Test") and UnitIsUnit(btnUnit, "player") then
if not HealBot_ActiveHoTUnitMap[btnUnit] then
HealBot_ActiveHoTUnitMap[btnUnit] = {}
end
HealBot_ActiveHoTUnitMap[btnUnit][tex] = timeLeft
HealBot_ActiveHoTUnitMap[btnUnit][cleanTex] = timeLeft
if shortTex then
HealBot_ActiveHoTUnitMap[btnUnit][shortTex] = timeLeft
end
end
end
end
end
end
end
end
end
end
-- Blank out remaining cache entries so sort doesn't read them
for i = numHoTs + 1, table.getn(HealBot_PlayerHoTs_ListCache) do
HealBot_PlayerHoTs_ListCache[i].expires = 9999999999
end
local displayMode = HealBot_Config.HealBot_Integrations_HoTTimerDisplayMode or 0
if displayMode == 0 then
-- List Mode
HealBot_ClearHoTOverlays()
HealBot_RenderHoTList(numHoTs, currentTime)
elseif displayMode == 1 then
-- Overlay Mode
if HealBot_PlayerHoTsListFrame and HealBot_PlayerHoTsListFrame:IsVisible() then
HealBot_PlayerHoTsListFrame:Hide()
end
HealBot_RenderHoTOverlays()
else
-- Both Mode (2)
HealBot_RenderHoTList(numHoTs, currentTime)
HealBot_RenderHoTOverlays()
end
end
HealBot_Action_UpdatePlayerHoTs = HealBot_UpdateActiveHoTTimers
@@ -20,8 +20,15 @@ function HealBot_Action_RefreshTooltip(unit)
if not unit then unit = HealBot_Action_TooltipUnit end if not unit then unit = HealBot_Action_TooltipUnit end
if not unit then return end; if not unit then return end;
local hlth=UnitHealth(unit); local hlth=0;
local maxhlth=UnitHealthMax(unit); local maxhlth=100;
if string.find(unit, "^Test") then
hlth = HealBot_Model.units[unit] and HealBot_Model.units[unit].health or 5000;
maxhlth = HealBot_Model.units[unit] and HealBot_Model.units[unit].maxHealth or 10000;
else
hlth=UnitHealth(unit);
maxhlth=UnitHealthMax(unit);
end
local spellLeft = HealBot_GetHealSpell(unit,HealBot_Action_SpellPattern("Left")); local spellLeft = HealBot_GetHealSpell(unit,HealBot_Action_SpellPattern("Left"));
local spellMiddle = HealBot_GetHealSpell(unit,HealBot_Action_SpellPattern("Middle")); local spellMiddle = HealBot_GetHealSpell(unit,HealBot_Action_SpellPattern("Middle"));
@@ -33,8 +40,9 @@ function HealBot_Action_RefreshTooltip(unit)
HealBot_Action_Tooltip_ClearLines(); HealBot_Action_Tooltip_ClearLines();
if HealBot_Config.Tooltip_ShowTarget==1 then if HealBot_Config.Tooltip_ShowTarget==1 then
if UnitName(unit) then local uname = HealBot_Model.units[unit] and HealBot_Model.units[unit].name or UnitName(unit)
HealBot_Action_Tooltip_SetLineLeft(UnitName(unit),0,1,0,linenum) if uname then
HealBot_Action_Tooltip_SetLineLeft(uname,0,1,0,linenum)
if hlth and maxhlth then if hlth and maxhlth then
local r,g,b,a=HealBot_HealthColor(unit,hlth,maxhlth); local r,g,b,a=HealBot_HealthColor(unit,hlth,maxhlth);
HealBot_Action_Tooltip_SetLineRight(hlth.."/"..maxhlth.." (-"..maxhlth-hlth..")",r,g,b,linenum) HealBot_Action_Tooltip_SetLineRight(hlth.."/"..maxhlth.." (-"..maxhlth-hlth..")",r,g,b,linenum)