Merge branch 'dev' into main

Signed-off-by: Bluewhale1337 <295648290+Bluewhale1337@users.noreply.github.com>
This commit is contained in:
Bluewhale1337
2026-11-09 19:11:01 +01:00
committed by GitHub
23 changed files with 864 additions and 433 deletions
+22 -19
View File
@@ -66,7 +66,7 @@ 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) then
if UnitExists(unit) and not UnitIsDeadOrGhost(unit) and HealBot_Range_Check(unit, 40) == 1 then
return true
end
return false
@@ -82,12 +82,17 @@ function HealBot_CanHeal(unit)
local SHeal = HealBot_ShouldHeal(unit)
if SHeal then
local spell = HealBot_GetHealSpell(unit,HealBot_Action_SpellPattern("Left"))
if not spell then spell = HealBot_GetHealSpell(unit,HealBot_Action_SpellPattern("Middle")) 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("Button4")) end
if not spell then spell = HealBot_GetHealSpell(unit,HealBot_Action_SpellPattern("Button5")) end
local spell = HealBot_GetHealSpell(unit, HealBot_Action_SpellPattern("Left", true))
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", true)) 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", true)) end
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
else
return true
@@ -101,14 +106,16 @@ end
-- Refresh and reset functions moved to HealBot_View_Layout.lua
-- HealBot_Action_SpellPattern: Resolves spell string based on click modifiers.
function HealBot_Action_SpellPattern(button)
function HealBot_Action_SpellPattern(button, ignoreModifiers)
local combos = HealBot_Config.KeyCombo[UnitClass("player")]
if not combos then return nil end
local press = button;
if IsAltKeyDown() then press = "Alt"..press end
if IsControlKeyDown() then press = "Ctrl"..press end
if IsShiftKeyDown() then press = "Shift"..press end
return combos[press]
local press = button or "Left";
if not ignoreModifiers then
if IsAltKeyDown() then press = "Alt"..press end
if IsControlKeyDown() then press = "Ctrl"..press end
if IsShiftKeyDown() then press = "Shift"..press end
end
return combos[press];
end
-- HealBot_Decode_Button: Decodes click action to spell pattern.
@@ -134,6 +141,8 @@ end
-- HealBot_Action_HealUnit_OnLoad: Internal utility: HealBot_Action_HealUnit_OnLoad
function HealBot_Action_HealUnit_OnLoad(this)
this:RegisterForClicks("LeftButtonUp", "RightButtonUp", "MiddleButtonUp", "Button4Up", "Button5Up");
this.debuffOverlay = getglobal(this:GetName() .. "DebuffOverlay");
this.debuffGlow = getglobal(this:GetName() .. "DebuffOverlayGlow");
end
-- HealBot_Action_HealUnit_OnEnter: Internal utility: HealBot_Action_HealUnit_OnEnter
@@ -447,19 +456,13 @@ function HealBot_Action_OnDragStop(this)
end
-- 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)
local command = GetBindingAction(key);
if command then
DEFAULT_CHAT_FRAME:AddMessage(key.." "..state.." "..(command or "nil"));
keystate = state
RunBinding(command,keystate)
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
+24
View File
@@ -152,6 +152,30 @@
</Anchor>
</Anchors>
</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>
</Button>
+9 -13
View File
@@ -339,19 +339,15 @@ function HealBot_OnEvent_UnitAura(this, unit)
local guid = HealBot_GetUnitGUID and HealBot_GetUnitGUID(unit)
if guid then
if not HealBot_Nampower_NameCache then HealBot_Nampower_NameCache = HealBot_GetTable() end
HealBot_Nampower_NameCache[guid] = UnitName(unit)
if HealBot_Nampower_Auras[guid] then
for spellName, _ in pairs(HealBot_Nampower_Auras[guid]) do
local auraInfo = HealBot_TrackedAura_Spells and HealBot_TrackedAura_Spells[spellName]
if auraInfo then
local tex = auraInfo.texture
local isActive = auraInfo.isDebuff and activeDebuffs[tex] or activeBuffs[tex]
if not isActive then
HealBot_Nampower_Auras[guid][spellName] = nil
end
end
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
+7
View File
@@ -172,6 +172,10 @@ function HealBot_OnUpdate(this, arg1)
for unitID in pairs(powerToRefresh) do
HealBot_Action_RefreshPower(unitID)
end
if HealBot_Action_UpdateDebuffAnimation then
HealBot_Action_UpdateDebuffAnimation(arg1)
end
-- Periodic resolution of units with missing class identity
if HealBot_Model and HealBot_Model.unresolvedUnits and next(HealBot_Model.unresolvedUnits) then
HealBot_UnresolvedTimer = (HealBot_UnresolvedTimer or 0) + arg1
@@ -333,6 +337,9 @@ local HealBot_EventHandlers = {
["PLAYER_ENTERING_WORLD"] = function(this)
HealBot_Model:RefreshUnit("player")
HealBot_Model:RefreshUnit("pet")
if HealBot_Model and HealBot_Model.PopulateAllGUIDs then
HealBot_Model:PopulateAllGUIDs()
end
HealBot_OnEvent_PlayerEnteringWorld(this)
end,
["VARIABLES_LOADED"] = function(this)
+47 -33
View File
@@ -35,43 +35,57 @@ function HealBot_Range_Check(unit, range)
if ( unit and (unit == "player" or UnitIsUnit(unit, "player") or string.find(unit, "^Test")) ) 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
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
if dist <= (_scale * range / 27) then
return_val = 1
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
else
if ( HealBot_Config.QualityRange == 1 ) or range <= 27 then
if ( CheckInteractDistance(unit, 4) ) then
return_val = 1;
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
return_val = 1;
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
+19 -2
View File
@@ -584,11 +584,13 @@ function HealBot_GetHealSpell(unit, pattern)
-- 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
@@ -598,7 +600,17 @@ function HealBot_GetHealSpell(unit, 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;
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;
@@ -606,13 +618,18 @@ function HealBot_GetHealSpell(unit, pattern)
-- 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
-- optionally check item range, but skipping for now as it's complex in vanilla
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
+100 -98
View File
@@ -52,6 +52,8 @@ HealBot_ConfigDefaults = {
SoundDebuffWarning = 0,
SoundDebuffPlay = 1,
CDCMonitor = 2,
CDCOverlay = 1,
CDCOverlayTexture = "Interface\\AddOns\\HealBotBlue\\Images\\glow1.tga",
PanelAnchorX = -1,
PanelAnchorY = -1,
CDCBarColour = {
@@ -542,104 +544,104 @@ HealBot_Debuff_Spells = {
},
}
HealBot_Buff_Spells = {
[HEALBOT_PALADIN] = {
HEALBOT_BLESSING_OF_KINGS,
HEALBOT_BLESSING_OF_MIGHT,
HEALBOT_BLESSING_OF_WISDOM,
HEALBOT_BLESSING_OF_SALVATION,
HEALBOT_BLESSING_OF_LIGHT,
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_MARK_OF_THE_WILD,
HEALBOT_GIFT_OF_THE_WILD,
HEALBOT_THORNS,
HEALBOT_OMEN_OF_CLARITY,
},
[HEALBOT_PRIEST] = {
HEALBOT_POWER_WORD_FORTITUDE,
HEALBOT_PRAYER_OF_FORTITUDE,
HEALBOT_DIVINE_SPIRIT,
HEALBOT_PRAYER_OF_SPIRIT,
HEALBOT_SHADOW_PROTECTION,
HEALBOT_PRAYER_OF_SHADOW_PROTECTION,
HEALBOT_INNER_FIRE,
HEALBOT_FEAR_WARD,
HEALBOT_SHADOWFORM,
HEALBOT_ENLIGHTEN,
},
[HEALBOT_MAGE] = {
HEALBOT_ARCANE_INTELLECT,
HEALBOT_ARCANE_BRILLIANCE,
HEALBOT_DAMPEN_MAGIC,
HEALBOT_AMPLIFY_MAGIC,
HEALBOT_FROST_ARMOR,
HEALBOT_ICE_ARMOR,
HEALBOT_MAGE_ARMOR,
HEALBOT_ICE_BARRIER,
},
[HEALBOT_SHAMAN] = {
HEALBOT_ROCKBITER_WEAPON,
HEALBOT_FLAMETONGUE_WEAPON,
HEALBOT_FROSTBRAND_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_Buff_Spells = {
[HEALBOT_PALADIN] = {
HEALBOT_BLESSING_OF_KINGS,
HEALBOT_BLESSING_OF_MIGHT,
HEALBOT_BLESSING_OF_WISDOM,
HEALBOT_BLESSING_OF_SALVATION,
HEALBOT_BLESSING_OF_LIGHT,
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_MARK_OF_THE_WILD,
HEALBOT_GIFT_OF_THE_WILD,
HEALBOT_THORNS,
HEALBOT_OMEN_OF_CLARITY,
},
[HEALBOT_PRIEST] = {
HEALBOT_POWER_WORD_FORTITUDE,
HEALBOT_PRAYER_OF_FORTITUDE,
HEALBOT_DIVINE_SPIRIT,
HEALBOT_PRAYER_OF_SPIRIT,
HEALBOT_SHADOW_PROTECTION,
HEALBOT_PRAYER_OF_SHADOW_PROTECTION,
HEALBOT_INNER_FIRE,
HEALBOT_FEAR_WARD,
HEALBOT_SHADOWFORM,
HEALBOT_ENLIGHTEN,
},
[HEALBOT_MAGE] = {
HEALBOT_ARCANE_INTELLECT,
HEALBOT_ARCANE_BRILLIANCE,
HEALBOT_DAMPEN_MAGIC,
HEALBOT_AMPLIFY_MAGIC,
HEALBOT_FROST_ARMOR,
HEALBOT_ICE_ARMOR,
HEALBOT_MAGE_ARMOR,
HEALBOT_ICE_BARRIER,
},
[HEALBOT_SHAMAN] = {
HEALBOT_ROCKBITER_WEAPON,
HEALBOT_FLAMETONGUE_WEAPON,
HEALBOT_FROSTBRAND_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_PURIFY] = {HEALBOT_DISEASE_en, HEALBOT_POISON_en},
[HEALBOT_CLEANSE] = {HEALBOT_DISEASE_en, HEALBOT_POISON_en, HEALBOT_MAGIC_en},
+63 -26
View File
@@ -62,31 +62,62 @@ function HealBot_Integrations_Toggle()
HealBot_Nampower_Auras[target][spellName] = expirationTime
if not HealBot_Nampower_NameCache then HealBot_Nampower_NameCache = HealBot_GetTable() end
if event == "AURA_CAST_ON_SELF" then
HealBot_Nampower_NameCache[target] = UnitName("player")
HealBot_OnEvent_UnitAura(nil, "player")
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
local tName = nil
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
local unitID = HealBot_Model and HealBot_Model:GetUnitByGUID(target)
if not unitID and HealBot_PlayerGUID and (target == HealBot_PlayerGUID or string.lower(target) == string.lower(HealBot_PlayerGUID)) then
unitID = "player"
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
if tName then
HealBot_Nampower_NameCache[target] = tName
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 unitID then
HealBot_OnEvent_UnitAura(nil, unitID)
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
@@ -157,23 +188,29 @@ function HealBot_Integrations_PruneNampower()
local currentTime = GetTime()
for targetName, auras in pairs(HealBot_Nampower_Auras) do
-- Check if target is still in the raid/party, or is the player
local isPlayer = (HealBot_PlayerGUID and string.lower(targetName) == string.lower(HealBot_PlayerGUID))
or (UnitName("player") and string.lower(targetName) == string.lower(UnitName("player")))
if not isPlayer and not HealBot_Model:GetUnitByGUID(targetName) and not HealBot_Model:GetUnitIDByName(targetName) then
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
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
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
+62 -54
View File
@@ -81,59 +81,59 @@ HEALBOT_CHAIN_HEAL = "Kettenheilung";
HEALBOT_POWER_WORD_FORTITUDE = "Machtwort: Seelenst\195\164rke";
HEALBOT_MARK_OF_THE_WILD = "Mal der Wildnis";
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_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";
@@ -148,7 +148,7 @@ HEALBOT_CLEANSE = "Reinigung des Glaubens";
HEALBOT_DISPEL_MAGIC = "Magiebannung";
HEALBOT_CURE_POISON = "Vergiftung heilen";
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_MAGIC = "Magie";
@@ -419,3 +419,11 @@ 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";
+62 -54
View File
@@ -93,59 +93,59 @@ HEALBOT_THORNS = "Thorns";
HEALBOT_OMEN_OF_CLARITY = "Omen of Clarity";
HEALBOT_INNER_FIRE = "Inner Fire";
HEALBOT_FEAR_WARD = "Fear Ward";
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_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";
@@ -156,7 +156,7 @@ HEALBOT_ANCESTRALSPIRIT = "Ancestral Spirit";
HEALBOT_PURIFY = "Purify";
HEALBOT_CLEANSE = "Cleanse";
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_CURE_DISEASE = "Cure Disease";
@@ -449,3 +449,11 @@ HEALBOT_WORDS_CAST = "Cast"
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";
+62 -54
View File
@@ -81,59 +81,59 @@ HEALBOT_CHAIN_HEAL = "Salve de gu\195\169rison";
HEALBOT_POWER_WORD_FORTITUDE = "Mot de pouvoir : Robustesse";
HEALBOT_MARK_OF_THE_WILD = "Marque du fauve";
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_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";
@@ -144,7 +144,7 @@ HEALBOT_ANCESTRALSPIRIT = "Esprit Ancestral";
HEALBOT_PURIFY = "Purification";
HEALBOT_CLEANSE = "Epuration";
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_CURE_DISEASE = "Gu\195\169rison des maladies";
@@ -400,3 +400,11 @@ 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";
+61 -53
View File
@@ -66,58 +66,58 @@ HEALBOT_INNER_FIRE = "내면의 열정";
HEALBOT_FEAR_WARD = "공포의 결계";
HEALBOT_ENLIGHTEN = "Enlighten";
HEALBOT_MARK_OF_THE_WILD = "야생의 징표";
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_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 = "부활";
@@ -128,7 +128,7 @@ HEALBOT_WATER_BREATHING = "수중 호흡";
HEALBOT_PURIFY = "정화";
HEALBOT_CLEANSE = "정화";
HEALBOT_CURE_POISON = "해독";
HEALBOT_REMOVE_CURSE = "저주 해제";
HEALBOT_REMOVE_CURSE = "저주 해제";
HEALBOT_REMOVE_LESSER_CURSE = "하급 저주 해제";
HEALBOT_ABOLISH_POISON = "독 해제";
HEALBOT_CURE_DISEASE = "질병 치료";
@@ -394,3 +394,11 @@ 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";
+43
View File
@@ -206,27 +206,49 @@ 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
@@ -238,14 +260,19 @@ function HealBot_Model:GetUnitByGUID(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
@@ -255,6 +282,8 @@ function HealBot_Model:GetUnitByGUID(guid)
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
@@ -265,10 +294,24 @@ function HealBot_Model:GetUnitByGUID(guid)
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
+1
View File
@@ -341,6 +341,7 @@ function HealBot_Options_OnShow(this)
HealBot_Options_CDCButRight_Refresh()
HealBot_SetCDCBarColours()
HealBot_Options_CDCMonitor_Refresh()
HealBot_Options_CDCOverlay_Refresh()
HealBot_ComboButtons_Button_OnClick(nil,HealBot_Options_ComboButtons_Button);
HealBot_Options_EnableHealthy:SetChecked(HealBot_Config.EnableHealthy);
HealBot_Options_NewSkinb:Disable();
+45
View File
@@ -43,6 +43,51 @@ function HealBot_WarningSound_OnClick(this,id)
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_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.
function HealBot_Options_CDCMonitor_DropDown()
for i=1, getn(HealBot_Options_EmergencyFilter_List), 1 do
+37 -10
View File
@@ -132,7 +132,7 @@
<Frame name="HealBot_Options_CureDispelCleanseCol">
<Size>
<AbsDimension y="95"/>
<AbsDimension y="125"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT">
@@ -142,7 +142,7 @@
</Anchor>
<Anchor point="TOPRIGHT">
<Offset>
<AbsDimension x="-21" y="-190"/>
<AbsDimension x="-21" y="-185"/>
</Offset>
</Anchor>
</Anchors>
@@ -152,7 +152,7 @@
<Anchors>
<Anchor point="TOP">
<Offset>
<AbsDimension x="0" y="-12" />
<AbsDimension x="0" y="-10" />
</Offset>
</Anchor>
</Anchors>
@@ -160,6 +160,33 @@
</Layer>
</Layers>
</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">
<Size>
<AbsDimension x="130" y="20"/>
@@ -167,7 +194,7 @@
<Anchors>
<Anchor point="TOPRIGHT" relativeTo="HealBot_Options_CureDispelCleanseCol" relativePoint="TOP">
<Offset>
<AbsDimension x="-2" y="-35"/>
<AbsDimension x="-2" y="-62"/>
</Offset>
</Anchor>
</Anchors>
@@ -182,7 +209,7 @@
<Anchors>
<Anchor point="TOPRIGHT" relativeTo="HealBot_Options_CureDispelCleanseCol" relativePoint="TOP">
<Offset>
<AbsDimension x="-2" y="-35"/>
<AbsDimension x="-2" y="-62"/>
</Offset>
</Anchor>
</Anchors>
@@ -259,7 +286,7 @@
<Anchors>
<Anchor point="TOPRIGHT" relativeTo="HealBot_Options_CureDispelCleanseCol" relativePoint="TOP">
<Offset>
<AbsDimension x="-2" y="-65"/>
<AbsDimension x="-2" y="-92"/>
</Offset>
</Anchor>
</Anchors>
@@ -274,7 +301,7 @@
<Anchors>
<Anchor point="TOPRIGHT" relativeTo="HealBot_Options_CureDispelCleanseCol" relativePoint="TOP">
<Offset>
<AbsDimension x="-2" y="-65"/>
<AbsDimension x="-2" y="-92"/>
</Offset>
</Anchor>
</Anchors>
@@ -346,17 +373,17 @@
<Frame name="HealBot_Options_CureDispelCleanseWarn">
<Size>
<AbsDimension y="120"/>
<AbsDimension y="115"/>
</Size>
<Anchors>
<Anchor point="TOPLEFT">
<Offset>
<AbsDimension x="21" y="-285"/>
<AbsDimension x="21" y="-318"/>
</Offset>
</Anchor>
<Anchor point="TOPRIGHT">
<Offset>
<AbsDimension x="-21" y="-290"/>
<AbsDimension x="-21" y="-318"/>
</Offset>
</Anchor>
</Anchors>
+196 -15
View File
@@ -30,7 +30,8 @@ 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 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
@@ -243,6 +244,103 @@ function HealBot_Action_EnableButton(button)
bar:SetStatusBarColor(r, g, b, HealBot_Config.bardisa[HealBot_Config.Current_Skin]);
bar2:SetStatusBarColor(r, g, b, HealBot_Config.bardisa[HealBot_Config.Current_Skin]);
end
if 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 UnitIsDeadOrGhost(unit)
local overlayMode = HealBot_Config.CDCOverlay or 1
if debuffType and not isDead and overlayMode > 1 and overlayMode < 6 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()
local alphaBorder = 1.0
local alphaOverlay = 1.0
if not button:IsEnabled() then
local disAlpha = HealBot_Config.bardisa[HealBot_Config.Current_Skin] or 0.4
alphaBorder = disAlpha
alphaOverlay = disAlpha
end
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
button.debuffOverlay:SetBackdropBorderColor(0, 0, 0, 0)
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
button.debuffOverlay:SetBackdropBorderColor(0, 0, 0, 0)
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
button.debuffOverlay:Hide()
if button.debuffGlow then
button.debuffGlow:Hide()
button.debuffGlow:SetTexCoord(0, 1, 0, 1)
end
end
end
local healthTextOpt = HealBot_Config.ShowHealthText or 0
local displayText = name
if healthTextOpt == 1 then
@@ -275,11 +373,13 @@ function HealBot_Action_EnableButton(button)
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 then
bar.txt:SetFont(expectedFont, fontHeight, expectedFlags)
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
@@ -335,13 +435,18 @@ function HealBot_Action_EnableButton(button)
iconText:SetTextColor(1, 1, 1, 1)
bar["iconText"..i] = iconText
end
local timeLeft = unitMap and (unitMap[newTexture] or (newTexture and unitMap[string.lower(newTexture)]))
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
iconText:SetText("")
iconText:Hide()
if iconText and iconText:IsVisible() then
iconText:SetText("")
iconText:Hide()
end
end
elseif iconText and iconText:IsVisible() then
iconText:SetText("")
@@ -373,6 +478,32 @@ function HealBot_Action_EnableButton(button)
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 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
@@ -1493,7 +1624,9 @@ function HealBot_RenderHoTOverlays()
local iconText = bar["iconText"..i]
if icon and icon:IsVisible() then
local tex = icon:GetTexture()
local timeLeft = unitMap and (unitMap[tex] or (tex and unitMap[string.lower(tex)]))
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
@@ -1509,6 +1642,7 @@ function HealBot_RenderHoTOverlays()
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
@@ -1603,13 +1737,23 @@ function HealBot_UpdateActiveHoTTimers()
if HealBot_Integrations_Nampower_Active and HealBot_Nampower_Auras then
for targetKey, auras in pairs(HealBot_Nampower_Auras) do
local unitID = HealBot_Model and HealBot_Model:GetUnitByGUID(targetKey)
if not unitID and HealBot_PlayerGUID and (targetKey == HealBot_PlayerGUID or string.lower(targetKey) == string.lower(HealBot_PlayerGUID)) then
unitID = "player"
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 UnitName("player") and (targetKey == UnitName("player") or string.lower(targetKey) == string.lower(UnitName("player"))) then
unitID = "player"
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
@@ -1620,16 +1764,32 @@ function HealBot_UpdateActiveHoTTimers()
end
end
if not displayName and HealBot_Nampower_NameCache then
displayName = HealBot_Nampower_NameCache[targetKey]
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"
@@ -1640,7 +1800,7 @@ function HealBot_UpdateActiveHoTTimers()
end
local hot = HealBot_PlayerHoTs_ListCache[numHoTs]
hot.unit = unitID
hot.name = displayName or targetKey
hot.name = displayName or "Unknown"
hot.spell = spellName
hot.texture = tex
hot.expires = expiration
@@ -1650,8 +1810,29 @@ function HealBot_UpdateActiveHoTTimers()
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][string.lower(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 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
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

+4 -2
View File
@@ -31,13 +31,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.
* **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.
* **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.
* **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.
* **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.
* **Customizable Health Text:** Dynamic unit health display (Name Only, Percentage, Real Health, or Health Deficit).
* **Non-Mana Resource Tracking:** Track Rage, Energy, and Focus for non-mana classes.
* **Highly Customizable Skins:** Fully configure dimensions (width, height), row spacing, column layouts, custom textures, opacity, class-colored frames, and outline of fonts.
* **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).
### To be implemented
@@ -164,6 +165,7 @@ 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.
**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.