Files
HealBotBlue/HealBot_Controller_Aura.lua
T

300 lines
10 KiB
Lua

-- HealBot_Controller_Aura.lua
-- Handles tracking buffs/debuffs (auras) on group/raid units
HealBot_MissingBuffs = {}
local StaticHasBuff = {}
-- HealBot_UnitAffected: Checks if a specific buff/debuff exists on a unit.
function HealBot_UnitAffected(unit, effect)
if not effect then return nil; end
local i = 1
while true do
local buff = UnitBuff(unit, i)
if not buff then
break
end
if buff == effect then
return buff
end
i = i + 1
end
i = 1
while true do
local debuff = UnitDebuff(unit, i)
if not debuff then
break
end
if debuff == effect then
return debuff
end
i = i + 1
end
return nil;
end
-- HealBot_CheckShamanWeaponBuff: Checks for Shaman weapon enchants via API.
function HealBot_CheckShamanWeaponBuff(spellName)
local hasMainHandEnchant, _, _, hasOffHandEnchant = GetWeaponEnchantInfo()
if not (hasMainHandEnchant or hasOffHandEnchant) then return false end
local firstWord = string.match(spellName, "^(%w+)")
if not firstWord then return false end
HealBot_ScanTooltip:SetOwner(UIParent, "ANCHOR_NONE")
local slots = HealBot_GetTable()
if hasMainHandEnchant then table.insert(slots, 16) end
if hasOffHandEnchant then table.insert(slots, 17) end
for _, slot in ipairs(slots) do
HealBot_ScanTooltip:ClearLines()
HealBot_ScanTooltip:SetInventoryItem("player", slot)
for i = 1, HealBot_ScanTooltip:NumLines() do
local textObj = getglobal("HealBot_ScanTooltipTextLeft" .. i)
if textObj then
local text = textObj:GetText()
if text and string.find(text, firstWord) then
HealBot_ScanTooltip:Hide()
HealBot_ReleaseTable(slots)
return true
end
end
end
end
HealBot_ScanTooltip:Hide()
HealBot_ReleaseTable(slots)
return false
end
-- HealBot_CheckBuffs: Scans unit for missing tracked buffs.
function HealBot_CheckBuffs(unit)
if HealBot_Config.BuffWatch ~= 1 then
HealBot_MissingBuffs[unit] = nil
return
end
local inCombat = UnitAffectingCombat("player") or UnitAffectingCombat(unit)
if inCombat and HealBot_Config.BuffWatchInCombat ~= 1 then
HealBot_MissingBuffs[unit] = nil
return
end
local myClass = UnitClass("player")
if not HealBot_Buff_Spells[myClass] then return end
if UnitIsDeadOrGhost(unit) or not UnitIsConnected(unit) then
HealBot_MissingBuffs[unit] = nil
return
end
-- Group Buff Equivalents
local HealBot_Buff_Equivalents = {
[HEALBOT_POWER_WORD_FORTITUDE] = HEALBOT_PRAYER_OF_FORTITUDE,
[HEALBOT_DIVINE_SPIRIT] = HEALBOT_PRAYER_OF_SPIRIT,
[HEALBOT_SHADOW_PROTECTION] = HEALBOT_PRAYER_OF_SHADOW_PROTECTION,
[HEALBOT_ARCANE_INTELLECT] = HEALBOT_ARCANE_BRILLIANCE,
[HEALBOT_MARK_OF_THE_WILD] = HEALBOT_GIFT_OF_THE_WILD,
}
-- Gather buffs on unit
local hasBuff = StaticHasBuff
for k in pairs(hasBuff) do
hasBuff[k] = nil
end
local i = 1
while true do
local buffTexture = UnitBuff(unit, i)
if not buffTexture then break end
HealBot_ScanTooltip:SetOwner(UIParent, "ANCHOR_NONE")
HealBot_ScanTooltip:ClearLines()
HealBot_ScanTooltip:SetUnitBuff(unit, i)
local buffName = HealBot_ScanTooltipTextLeft1:GetText()
if buffName then
hasBuff[buffName] = true
end
i = i + 1
end
HealBot_ScanTooltip:Hide()
HealBot_MissingBuffs[unit] = nil
if HealBot_Config.BuffDropDowns and HealBot_Config.BuffDropDowns[myClass] then
for j = 1, 8 do
local val = HealBot_Config.BuffDropDowns[myClass][j]
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 hasIt = hasBuff[spellName]
if not hasIt and HealBot_Buff_Equivalents[spellName] then
hasIt = hasBuff[HealBot_Buff_Equivalents[spellName]]
end
if not hasIt then
if myClass == HEALBOT_SHAMAN and UnitIsUnit(unit, "player") and string.find(spellName, " Weapon") then
hasIt = HealBot_CheckShamanWeaponBuff(spellName)
end
end
if not hasIt then
HealBot_MissingBuffs[unit] = spellName
break
end
end
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
-- HealBot_OnEvent_UnitAura: Updates debuff lists and icon textures on aura change.
function HealBot_OnEvent_UnitAura(this, unit)
if not HealBot_DebuffTypeMap then
HealBot_DebuffTypeMap = {
[HEALBOT_DISEASE] = HEALBOT_DISEASE_en,
[HEALBOT_MAGIC] = HEALBOT_MAGIC_en,
[HEALBOT_POISON] = HEALBOT_POISON_en,
[HEALBOT_CURSE] = HEALBOT_CURSE_en
}
end
local DebuffType;
if HealBot_Heals[unit] then
if not HealBot_UnitIcons[unit] then
HealBot_UnitIcons[unit] = {}
end
for j = 1, 10 do
HealBot_UnitIcons[unit][j] = nil
end
local iconCount = 0
local i = 1;
HealBot_UnitDebuff[unit] = nil;
local trackedTextures = {}
while true do
local debuff, tmp, debuff_type = UnitDebuff(unit, i)
if debuff then
local mapped_type = nil
if debuff_type then
mapped_type = HealBot_DebuffTypeMap[debuff_type] or debuff_type
end
local localizedClass = UnitClass(unit)
local shouldTrack = false
if unit == "target" then
shouldTrack = true
elseif localizedClass and HealBot_CDCInc[localizedClass] == 1 then
shouldTrack = true
elseif not localizedClass or HealBot_CDCInc[localizedClass] == nil then
shouldTrack = true
end
local isDispellable = false
if mapped_type and HealBot_DebuffWatch[mapped_type] then
isDispellable = true
end
if isDispellable or HealBot_Config.CDCShowAllDebuffs == 1 then
if iconCount < 10 and not trackedTextures[debuff] then
iconCount = iconCount + 1
HealBot_UnitIcons[unit][iconCount] = debuff
trackedTextures[debuff] = true
end
end
if shouldTrack and isDispellable then
HealBot_UnitDebuff[unit] = mapped_type
DebuffType = mapped_type;
local isPriority = false
if HealBot_DebuffPriority then
for _, pType in ipairs(HealBot_DebuffPriority) do
if pType == mapped_type then
isPriority = true
break
end
end
end
if isPriority then
break
end
end
i = i + 1;
else
break
end
end
if HealBot_Config.CDCShowAllDebuffs == 1 then
local k = 1
while true do
local debuff = UnitDebuff(unit, k)
if not debuff then break end
if not trackedTextures[debuff] and iconCount < 10 then
iconCount = iconCount + 1
HealBot_UnitIcons[unit][iconCount] = debuff
trackedTextures[debuff] = true
end
k = k + 1
end
end
local b = 1
while true do
local buff = UnitBuff(unit, b)
if not buff then break end
if HealBot_TrackedHoTs[buff] and iconCount < 10 then
iconCount = iconCount + 1
HealBot_UnitIcons[unit][iconCount] = buff
end
b = b + 1
end
local d = 1
while true do
local debuff = UnitDebuff(unit, d)
if not debuff then break end
if HealBot_TrackedHoTs[debuff] and iconCount < 10 then
iconCount = iconCount + 1
HealBot_UnitIcons[unit][iconCount] = debuff
end
d = d + 1
end
if HealBot_UnitDebuff[unit] then
if DebuffType and HealBot_Range_Check(unit, 27) == 1 then
if HealBot_Config.ShowDebuffWarning == 1 then
local color = HealBot_Config.CDCBarColour[DebuffType]
local r, g, b = 1, 0, 0
if color then
r, g, b = color.R, color.G, color.B
end
UIErrorsFrame:AddMessage(UnitName(unit) .. " suffers from " .. DebuffType,
r, g, b,
1, UIERRORS_HOLD_TIME);
end
if HealBot_Config.SoundDebuffWarning == 1 then HealBot_PlaySound(HealBot_Config.SoundDebuffPlay); end
end
end
-- Check buffs synchronously because tooltip scanning fails in OnUpdate
HealBot_CheckBuffs(unit)
-- Defer UI updates
HealBot_View_DirtyUnits[unit] = true
end
end