mirror of
https://github.com/Bluewhale1337/HealBotBlue.git
synced 2026-07-27 17:54:44 +00:00
Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 12838ff250 | |||
| 2d75406d88 | |||
| 2e35be6516 | |||
| 07a9c3a93d | |||
| c8e62fe80e | |||
| 1334fc09bf | |||
| ce594af5fa | |||
| f1c5d6a8d1 | |||
| 0186fc1d93 | |||
| ff97414bb1 | |||
| d0d6a39fb9 | |||
| 66172cab45 |
+5
-1
@@ -284,12 +284,16 @@ do
|
|||||||
spellName = HealBot_ScanTooltipTextLeft1 and HealBot_ScanTooltipTextLeft1:GetText()
|
spellName = HealBot_ScanTooltipTextLeft1 and HealBot_ScanTooltipTextLeft1:GetText()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
HealBot_CastFailed = false
|
||||||
orig(slot, checkCursor, onSelf)
|
orig(slot, checkCursor, onSelf)
|
||||||
if autoSelfCast then
|
if autoSelfCast then
|
||||||
SetCVar("autoSelfCast", autoSelfCast)
|
SetCVar("autoSelfCast", autoSelfCast)
|
||||||
end
|
end
|
||||||
|
|
||||||
if spellName and HealBot_AnnounceCast then
|
if spellName and not HealBot_CastFailed then
|
||||||
|
HealBot_CastingSpell = spellName
|
||||||
|
HealBot_CastingTarget = mouseover
|
||||||
|
HealBot_Process_HealValue(spellName, mouseover)
|
||||||
HealBot_AnnounceCast(spellName, mouseover)
|
HealBot_AnnounceCast(spellName, mouseover)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
## Interface: 11200
|
## Interface: 11200
|
||||||
## Title: HealBotBlue
|
## Title: HealBotBlue
|
||||||
## Version: 1.4.0
|
## Version: 1.5
|
||||||
## Author: Bluewhale
|
## Author: Bluewhale
|
||||||
## Notes: Adds panel with skinable bars for healing and decursive
|
## Notes: Adds panel with skinable bars for healing and decursive
|
||||||
## SavedVariables: HealBot_Config
|
## SavedVariables: HealBot_Config
|
||||||
|
|||||||
+127
-14
@@ -22,9 +22,9 @@ function HealBot_ShouldHeal(unit)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function HealBot_Action_ShouldHealSome()
|
function HealBot_Action_ShouldHealSome()
|
||||||
return table.foreach(HealBot_Action_HealButtons, function (index,button)
|
for index, button in pairs(HealBot_Action_HealButtons) do
|
||||||
if (HealBot_ShouldHeal(button.unit)) then return button.unit; end
|
if (HealBot_ShouldHeal(button.unit)) then return button.unit; end
|
||||||
end);
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function HealBot_MustHeal(unit)
|
function HealBot_MustHeal(unit)
|
||||||
@@ -32,9 +32,9 @@ function HealBot_MustHeal(unit)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function HealBot_Action_MustHealSome()
|
function HealBot_Action_MustHealSome()
|
||||||
return table.foreach(HealBot_Action_HealButtons, function (index,button)
|
for index, button in pairs(HealBot_Action_HealButtons) do
|
||||||
if (HealBot_MustHeal(button.unit)) then return button.unit; end
|
if (HealBot_MustHeal(button.unit)) then return button.unit; end
|
||||||
end);
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function HealBot_GetRezSpellForClass()
|
function HealBot_GetRezSpellForClass()
|
||||||
@@ -117,24 +117,81 @@ function HealBot_Action_HealUnit_OnLeave(this)
|
|||||||
HealBot_Action_HideTooltip(this);
|
HealBot_Action_HideTooltip(this);
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------------------------
|
||||||
|
-- Puppeteer Utility Ports for Macro and Item Execution
|
||||||
|
--------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
function HealBot_SplitString(str, delimiter)
|
||||||
|
local result = {}
|
||||||
|
local start_pos = 1
|
||||||
|
while true do
|
||||||
|
local end_pos = string.find(str, delimiter, start_pos, true)
|
||||||
|
if not end_pos then
|
||||||
|
table.insert(result, string.sub(str, start_pos))
|
||||||
|
break
|
||||||
|
end
|
||||||
|
table.insert(result, string.sub(str, start_pos, end_pos - 1))
|
||||||
|
start_pos = end_pos + string.len(delimiter)
|
||||||
|
end
|
||||||
|
return result
|
||||||
|
end
|
||||||
|
|
||||||
|
function HealBot_RunMacroText(body)
|
||||||
|
local commands = HealBot_SplitString(body, "\n")
|
||||||
|
for i = 1, table.getn(commands) do
|
||||||
|
ChatFrameEditBox:SetText(commands[i])
|
||||||
|
ChatEdit_SendText(ChatFrameEditBox)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function HealBot_RunMacro(name)
|
||||||
|
if GetMacroIndexByName(name) == 0 then return end
|
||||||
|
local _, _, body = GetMacroInfo(GetMacroIndexByName(name))
|
||||||
|
HealBot_RunMacroText(body)
|
||||||
|
end
|
||||||
|
|
||||||
|
function HealBot_GetBagSlotInfo(bag, slot)
|
||||||
|
local link = GetContainerItemLink(bag, slot)
|
||||||
|
if not link then return end
|
||||||
|
local _, _, name = string.find(link, "%[(.*)%]")
|
||||||
|
local _, count = GetContainerItemInfo(bag, slot)
|
||||||
|
return name, count
|
||||||
|
end
|
||||||
|
|
||||||
|
function HealBot_FindBagSlot(itemName)
|
||||||
|
local bestBag, bestSlot, lowestStackSize
|
||||||
|
for bag = 0, NUM_BAG_FRAMES do
|
||||||
|
for slot = 1, GetContainerNumSlots(bag) do
|
||||||
|
local name, count = HealBot_GetBagSlotInfo(bag, slot)
|
||||||
|
if itemName == name then
|
||||||
|
if not lowestStackSize or lowestStackSize > count then
|
||||||
|
bestBag = bag
|
||||||
|
bestSlot = slot
|
||||||
|
lowestStackSize = count
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return bestBag, bestSlot
|
||||||
|
end
|
||||||
|
|
||||||
|
function HealBot_UseItem(itemName)
|
||||||
|
local bag, slot = HealBot_FindBagSlot(itemName)
|
||||||
|
if not bag then return false end
|
||||||
|
UseContainerItem(bag, slot)
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
function HealBot_Action_HealUnit_OnClick(this,button)
|
function HealBot_Action_HealUnit_OnClick(this,button)
|
||||||
local decode_button = HealBot_Decode_Button(button);
|
local decode_button = HealBot_Decode_Button(button);
|
||||||
local pattern = HealBot_Action_SpellPattern(decode_button);
|
local pattern = HealBot_Action_SpellPattern(decode_button);
|
||||||
|
|
||||||
-- Resurrection override on dead target
|
if not pattern then return end
|
||||||
if UnitIsDeadOrGhost(this.unit) then
|
|
||||||
local rezSpell = HealBot_GetRezSpellForClass();
|
|
||||||
if rezSpell then
|
|
||||||
HealBot_CastSpellOnFriend(rezSpell, this.unit);
|
|
||||||
return
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Buff casting override
|
-- Buff casting override (Spells only)
|
||||||
if HealBot_Config.BuffWatch == 1 then
|
if HealBot_Config.BuffWatch == 1 then
|
||||||
local inCombat = UnitAffectingCombat("player")
|
local inCombat = UnitAffectingCombat("player")
|
||||||
if (not inCombat) or (HealBot_Config.BuffWatchInCombat == 1) then
|
if (not inCombat) or (HealBot_Config.BuffWatchInCombat == 1) then
|
||||||
local myClass = UnitClass("player")
|
|
||||||
if HealBot_MissingBuffs[this.unit] then
|
if HealBot_MissingBuffs[this.unit] then
|
||||||
local missingBuff = HealBot_MissingBuffs[this.unit]
|
local missingBuff = HealBot_MissingBuffs[this.unit]
|
||||||
if decode_button == "Left" or decode_button == "Right" then
|
if decode_button == "Left" or decode_button == "Right" then
|
||||||
@@ -145,6 +202,62 @@ function HealBot_Action_HealUnit_OnClick(this,button)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Priority 1: Inline Scripts (starts with /)
|
||||||
|
if string.sub(pattern, 1, 1) == "/" then
|
||||||
|
local oldTarget = nil
|
||||||
|
if UnitExists("target") then oldTarget = UnitName("target") end
|
||||||
|
TargetUnit(this.unit)
|
||||||
|
HealBot_RunMacroText(pattern)
|
||||||
|
if oldTarget then
|
||||||
|
TargetByName(oldTarget)
|
||||||
|
else
|
||||||
|
ClearTarget()
|
||||||
|
end
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Priority 2: Spells
|
||||||
|
-- Resurrection override on dead target first
|
||||||
|
if UnitIsDeadOrGhost(this.unit) then
|
||||||
|
local rezSpell = HealBot_GetRezSpellForClass();
|
||||||
|
if rezSpell then
|
||||||
|
HealBot_CastSpellOnFriend(rezSpell, this.unit);
|
||||||
|
return
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if HealBot_Spells[pattern] or HealBot_GetSpellId(pattern) then
|
||||||
|
HealBot_HealUnit(this.unit, pattern);
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Priority 3: Named Macros
|
||||||
|
if GetMacroIndexByName(pattern) ~= 0 then
|
||||||
|
local oldTarget = nil
|
||||||
|
if UnitExists("target") then oldTarget = UnitName("target") end
|
||||||
|
TargetUnit(this.unit)
|
||||||
|
HealBot_RunMacro(pattern)
|
||||||
|
if oldTarget then
|
||||||
|
TargetByName(oldTarget)
|
||||||
|
else
|
||||||
|
ClearTarget()
|
||||||
|
end
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Priority 4: Items
|
||||||
|
local bag, slot = HealBot_FindBagSlot(pattern)
|
||||||
|
if bag then
|
||||||
|
local oldTarget = nil
|
||||||
|
if UnitExists("target") then oldTarget = UnitName("target") end
|
||||||
|
TargetUnit(this.unit)
|
||||||
|
UseContainerItem(bag, slot)
|
||||||
|
if SpellIsTargeting() then SpellTargetUnit(this.unit) end
|
||||||
|
if oldTarget then TargetByName(oldTarget) else ClearTarget() end
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Fallback attempt
|
||||||
HealBot_HealUnit(this.unit, pattern);
|
HealBot_HealUnit(this.unit, pattern);
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -115,13 +115,6 @@ function HealBot_CheckBuffs(unit)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function HealBot_OnEvent_UnitAura(this, unit)
|
|
||||||
local DebuffType;
|
|
||||||
|
|
||||||
if HealBot_Heals[unit] and unit ~= "target" then
|
|
||||||
HealBot_UnitIcons[unit] = {}
|
|
||||||
local iconCount = 0
|
|
||||||
|
|
||||||
local HealBot_TrackedHoTs = {
|
local HealBot_TrackedHoTs = {
|
||||||
["Interface\\Icons\\Spell_Holy_Renew"] = true,
|
["Interface\\Icons\\Spell_Holy_Renew"] = true,
|
||||||
["Interface\\Icons\\Spell_Nature_Rejuvenation"] = true,
|
["Interface\\Icons\\Spell_Nature_Rejuvenation"] = true,
|
||||||
@@ -132,6 +125,17 @@ function HealBot_OnEvent_UnitAura(this, unit)
|
|||||||
["Interface\\Icons\\btnholyscriptures"] = true,
|
["Interface\\Icons\\btnholyscriptures"] = true,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function HealBot_OnEvent_UnitAura(this, unit)
|
||||||
|
local DebuffType;
|
||||||
|
|
||||||
|
if HealBot_Heals[unit] and unit ~= "target" then
|
||||||
|
if not HealBot_UnitIcons[unit] then
|
||||||
|
HealBot_UnitIcons[unit] = {}
|
||||||
|
end
|
||||||
|
for j = 1, 5 do
|
||||||
|
HealBot_UnitIcons[unit][j] = nil
|
||||||
|
end
|
||||||
|
local iconCount = 0
|
||||||
local i = 1;
|
local i = 1;
|
||||||
while true do
|
while true do
|
||||||
local debuff, tmp, debuff_type = UnitDebuff(unit, i, 1)
|
local debuff, tmp, debuff_type = UnitDebuff(unit, i, 1)
|
||||||
|
|||||||
@@ -70,6 +70,7 @@ function HealBot_OnEvent_AddonMsg(this, addon_id, inc_msg, dist_target, sender_i
|
|||||||
local tmpTest, unitname, heal_val
|
local tmpTest, unitname, heal_val
|
||||||
tmpTest, tmpTest, unitname, heal_val = string.find(inc_msg, ">> (%a+) <<=>> (.%d+) <<" );
|
tmpTest, tmpTest, unitname, heal_val = string.find(inc_msg, ">> (%a+) <<=>> (.%d+) <<" );
|
||||||
if heal_val then
|
if heal_val then
|
||||||
|
if sender_id == UnitName("player") then return end
|
||||||
if not HealBot_HealsIn[unitname] then
|
if not HealBot_HealsIn[unitname] then
|
||||||
HealBot_HealsIn[unitname] = 0;
|
HealBot_HealsIn[unitname] = 0;
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -3,10 +3,10 @@
|
|||||||
|
|
||||||
HealBot_View_DirtyUnits = {}
|
HealBot_View_DirtyUnits = {}
|
||||||
local HealBot_Timer1, HealsIn_Timer = 0, 0;
|
local HealBot_Timer1, HealsIn_Timer = 0, 0;
|
||||||
|
HealBot_LastModState = ""
|
||||||
|
|
||||||
function HealBot_OnLoad(this)
|
function HealBot_OnLoad(this)
|
||||||
this:RegisterEvent("VARIABLES_LOADED");
|
this:RegisterEvent("VARIABLES_LOADED");
|
||||||
this:RegisterEvent("MODIFIER_STATE_CHANGED");
|
|
||||||
|
|
||||||
SLASH_HEALBOT1 = "/healbot";
|
SLASH_HEALBOT1 = "/healbot";
|
||||||
SLASH_HEALBOT2 = "/hb";
|
SLASH_HEALBOT2 = "/hb";
|
||||||
@@ -42,6 +42,20 @@ function HealBot_RegisterThis(this)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function HealBot_OnUpdate(this, arg1)
|
function HealBot_OnUpdate(this, arg1)
|
||||||
|
if HealBot_Action_TooltipUnit and HealBot_Tooltip:IsVisible() then
|
||||||
|
local currentModState = ""
|
||||||
|
if IsShiftKeyDown() then currentModState = currentModState .. "S" end
|
||||||
|
if IsControlKeyDown() then currentModState = currentModState .. "C" end
|
||||||
|
if IsAltKeyDown() then currentModState = currentModState .. "A" end
|
||||||
|
|
||||||
|
if HealBot_LastModState ~= currentModState then
|
||||||
|
HealBot_LastModState = currentModState
|
||||||
|
HealBot_Action_RefreshTooltip(HealBot_Action_TooltipUnit)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
HealBot_LastModState = ""
|
||||||
|
end
|
||||||
|
|
||||||
if HealBot_TargetRestorePending then
|
if HealBot_TargetRestorePending then
|
||||||
HealBot_TargetRestoreTimer = HealBot_TargetRestoreTimer + arg1;
|
HealBot_TargetRestoreTimer = HealBot_TargetRestoreTimer + arg1;
|
||||||
if HealBot_TargetRestoreTimer >= 0.1 then
|
if HealBot_TargetRestoreTimer >= 0.1 then
|
||||||
@@ -179,17 +193,12 @@ local HealBot_EventHandlers = {
|
|||||||
["VARIABLES_LOADED"] = function(this)
|
["VARIABLES_LOADED"] = function(this)
|
||||||
HealBot_OnEvent_VariablesLoaded(this)
|
HealBot_OnEvent_VariablesLoaded(this)
|
||||||
end,
|
end,
|
||||||
["MODIFIER_STATE_CHANGED"] = function(this, arg1, arg2)
|
|
||||||
if HealBot_Action_TooltipUnit and HealBot_Tooltip:IsVisible() then
|
|
||||||
HealBot_Action_RefreshTooltip(HealBot_Action_TooltipUnit)
|
|
||||||
end
|
|
||||||
end,
|
|
||||||
-- Legacy pass-throughs
|
-- Legacy pass-throughs
|
||||||
["CHAT_MSG_ADDON"] = function(this, arg1, arg2, arg3, arg4) HealBot_OnEvent_AddonMsg(this, arg1, arg2, arg3, arg4) end,
|
["CHAT_MSG_ADDON"] = function(this, arg1, arg2, arg3, arg4) HealBot_OnEvent_AddonMsg(this, arg1, arg2, arg3, arg4) end,
|
||||||
["SPELLCAST_START"] = function(this, arg1, arg2) HealBot_OnEvent_SpellcastStart(this, arg1, arg2) end,
|
["SPELLCAST_START"] = function(this, arg1, arg2) HealBot_OnEvent_SpellcastStart(this, arg1, arg2) end,
|
||||||
["SPELLCAST_STOP"] = function(this) HealBot_OnEvent_SpellcastStop(this) end,
|
["SPELLCAST_STOP"] = function(this) HealBot_OnEvent_SpellcastStop(this, "SPELLCAST_STOP") end,
|
||||||
["SPELLCAST_INTERRUPTED"] = function(this) HealBot_OnEvent_SpellcastStop(this) end,
|
["SPELLCAST_INTERRUPTED"] = function(this) HealBot_OnEvent_SpellcastStop(this, "SPELLCAST_INTERRUPTED") end,
|
||||||
["SPELLCAST_FAILED"] = function(this) HealBot_OnEvent_SpellcastStop(this) end,
|
["SPELLCAST_FAILED"] = function(this) HealBot_OnEvent_SpellcastStop(this, "SPELLCAST_FAILED") end,
|
||||||
["PLAYER_REGEN_DISABLED"] = function(this) HealBot_OnEvent_PlayerRegenDisabled(this) end,
|
["PLAYER_REGEN_DISABLED"] = function(this) HealBot_OnEvent_PlayerRegenDisabled(this) end,
|
||||||
["PLAYER_REGEN_ENABLED"] = function(this) HealBot_OnEvent_PlayerRegenEnabled(this) end,
|
["PLAYER_REGEN_ENABLED"] = function(this) HealBot_OnEvent_PlayerRegenEnabled(this) end,
|
||||||
["BAG_UPDATE_COOLDOWN"] = function(this, arg1) HealBot_OnEvent_BagUpdateCooldown(this, arg1) end,
|
["BAG_UPDATE_COOLDOWN"] = function(this, arg1) HealBot_OnEvent_BagUpdateCooldown(this, arg1) end,
|
||||||
@@ -464,8 +473,11 @@ function HealBot_OnEvent_SpellcastStart(this, spell, duration)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function HealBot_OnEvent_SpellcastStop(this)
|
function HealBot_OnEvent_SpellcastStop(this, eventName)
|
||||||
HealBot_IsCasting = false;
|
HealBot_IsCasting = false;
|
||||||
|
if eventName == "SPELLCAST_FAILED" then
|
||||||
|
HealBot_CastFailed = true;
|
||||||
|
end
|
||||||
HealBot_StopCasting();
|
HealBot_StopCasting();
|
||||||
HealBot_RecalcHeals();
|
HealBot_RecalcHeals();
|
||||||
if HealBot_IamRessing then
|
if HealBot_IamRessing then
|
||||||
|
|||||||
+144
-17
@@ -127,10 +127,45 @@ function HealBot_AnnounceCast(spell, target)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function HealBot_Process_HealValue(spell, target)
|
||||||
|
if HealBot_Spells[spell] and HealBot_Spells[spell].CastTime > 1 then
|
||||||
|
HealBot_HealValue = HealBot_Spells[spell].HealsDur;
|
||||||
|
|
||||||
|
-- Apply dynamic Preservation bonus
|
||||||
|
if HEALBOT_REGROWTH and string.find(spell, HEALBOT_REGROWTH) then
|
||||||
|
local presRank = HealBot_GetTalentRank("Preservation")
|
||||||
|
if presRank > 0 then
|
||||||
|
local hasRejuv = false
|
||||||
|
for i=1,32 do
|
||||||
|
local buff = UnitBuff(target, i)
|
||||||
|
if not buff then break end
|
||||||
|
if string.find(buff, "Spell_Nature_Rejuvenation") then
|
||||||
|
hasRejuv = true
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if hasRejuv then
|
||||||
|
local extHeal = HealBot_Spells[spell].HealsExt or 0
|
||||||
|
local bonus = extHeal * (presRank * 0.10)
|
||||||
|
HealBot_HealValue = HealBot_HealValue + math.floor(bonus)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
local uname = UnitName(target)
|
||||||
|
if uname then
|
||||||
|
HealBot_SendAddonMessage(HEALBOT_ADDON_ID, ">> " .. uname .. " <<=>> " .. HealBot_HealValue .. " << ");
|
||||||
|
if not HealBot_HealsIn[uname] then
|
||||||
|
HealBot_HealsIn[uname] = 0;
|
||||||
|
end
|
||||||
|
HealBot_HealsIn[uname] = HealBot_HealsIn[uname] + HealBot_HealValue;
|
||||||
|
HealBot_RecalcHeals(HealBot_FindUnitID(uname));
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
function HealBot_StartCasting(spell, target, ttype)
|
function HealBot_StartCasting(spell, target, ttype)
|
||||||
|
HealBot_CastFailed = false;
|
||||||
HealBot_CastSpellByName(spell);
|
HealBot_CastSpellByName(spell);
|
||||||
HealBot_CastingSpell = spell;
|
|
||||||
HealBot_CastingTarget = target;
|
|
||||||
if ( SpellCanTargetUnit(target) ) then
|
if ( SpellCanTargetUnit(target) ) then
|
||||||
SpellTargetUnit(target);
|
SpellTargetUnit(target);
|
||||||
ttype = "fired";
|
ttype = "fired";
|
||||||
@@ -138,28 +173,36 @@ function HealBot_StartCasting(spell, target, ttype)
|
|||||||
SpellTargetUnit(target);
|
SpellTargetUnit(target);
|
||||||
SpellStopTargeting()
|
SpellStopTargeting()
|
||||||
elseif ttype == "direct" then
|
elseif ttype == "direct" then
|
||||||
if ( CheckInteractDistance(target, 4) ) then
|
if ( UnitIsUnit(target, "player") or CheckInteractDistance(target, 4) ) then
|
||||||
ttype = "fired";
|
ttype = "fired";
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
HealBot_AnnounceCast(spell, target)
|
|
||||||
|
|
||||||
if ttype == "fired" and HealBot_Spells[spell] then
|
if ttype == "fired" and HealBot_Spells[spell] then
|
||||||
if HealBot_Spells[spell].CastTime > 1 then
|
if not HealBot_CastFailed then
|
||||||
HealBot_HealValue = HealBot_Spells[spell].HealsDur;
|
HealBot_CastingSpell = spell;
|
||||||
HealBot_SendAddonMessage(HEALBOT_ADDON_ID, ">> " .. UnitName(target) .. " <<=>> " .. HealBot_HealValue .. " << ");
|
HealBot_CastingTarget = target;
|
||||||
|
HealBot_Process_HealValue(spell, target);
|
||||||
|
HealBot_AnnounceCast(spell, target);
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function HealBot_StopCasting()
|
function HealBot_StopCasting()
|
||||||
if HealBot_CastingTarget then
|
if HealBot_CastingTarget then
|
||||||
if HealBot_HealsIn[UnitName(HealBot_CastingTarget)] then
|
|
||||||
if HealBot_HealValue > 0 then
|
if HealBot_HealValue > 0 then
|
||||||
HealBot_SendAddonMessage(HEALBOT_ADDON_ID, ">> " .. UnitName(HealBot_CastingTarget) .. " <<=>> " .. 0 - HealBot_HealValue .. " << ");
|
local uname = UnitName(HealBot_CastingTarget)
|
||||||
HealBot_HealValue = 0;
|
if uname then
|
||||||
|
HealBot_SendAddonMessage(HEALBOT_ADDON_ID, ">> " .. uname .. " <<=>> " .. 0 - HealBot_HealValue .. " << ");
|
||||||
|
if HealBot_HealsIn[uname] then
|
||||||
|
HealBot_HealsIn[uname] = HealBot_HealsIn[uname] - HealBot_HealValue;
|
||||||
|
if HealBot_HealsIn[uname] < 0 then
|
||||||
|
HealBot_HealsIn[uname] = 0;
|
||||||
end
|
end
|
||||||
|
HealBot_RecalcHeals(HealBot_FindUnitID(uname));
|
||||||
|
end
|
||||||
|
end
|
||||||
|
HealBot_HealValue = 0;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
HealBot_CastingSpell = nil;
|
HealBot_CastingSpell = nil;
|
||||||
@@ -298,7 +341,46 @@ function HealBot_SetItemDefaults(spell)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function HealBot_SetSpellDefaults(spell)
|
function HealBot_SetSpellDefaults(spell)
|
||||||
HealBot_Spells[spell].HealsDur = math.floor((HealBot_Spells[spell].HealsCast + HealBot_Spells[spell].HealsExt) + HealBot_Spells[spell].RealHealing);
|
local baseHeal = HealBot_Spells[spell].HealsCast or 0
|
||||||
|
local extHeal = HealBot_Spells[spell].HealsExt or 0
|
||||||
|
local realHeal = HealBot_Spells[spell].RealHealing or 0
|
||||||
|
|
||||||
|
local _, class = UnitClass("player")
|
||||||
|
if class == "DRUID" then
|
||||||
|
local giftRank = HealBot_GetTalentRank("Gift of Nature")
|
||||||
|
local genRank = HealBot_GetTalentRank("Genesis")
|
||||||
|
|
||||||
|
local mult = 1 + (giftRank * 0.02)
|
||||||
|
baseHeal = baseHeal * mult
|
||||||
|
extHeal = extHeal * mult
|
||||||
|
realHeal = realHeal * mult
|
||||||
|
|
||||||
|
if genRank > 0 then
|
||||||
|
extHeal = extHeal * (1 + (genRank * 0.05))
|
||||||
|
end
|
||||||
|
elseif class == "PRIEST" then
|
||||||
|
local spiritRank = HealBot_GetTalentRank("Spiritual Healing")
|
||||||
|
local mult = 1 + (spiritRank * 0.06)
|
||||||
|
baseHeal = baseHeal * mult
|
||||||
|
extHeal = extHeal * mult
|
||||||
|
realHeal = realHeal * mult
|
||||||
|
|
||||||
|
if HEALBOT_RENEW and string.find(spell, HEALBOT_RENEW) then
|
||||||
|
local renewRank = HealBot_GetTalentRank("Improved Renew")
|
||||||
|
extHeal = extHeal * (1 + (renewRank * 0.05))
|
||||||
|
end
|
||||||
|
elseif class == "PALADIN" then
|
||||||
|
local hlRank = HealBot_GetTalentRank("Healing Light")
|
||||||
|
if (HEALBOT_HOLY_LIGHT and string.find(spell, HEALBOT_HOLY_LIGHT)) or
|
||||||
|
(HEALBOT_FLASH_OF_LIGHT and string.find(spell, HEALBOT_FLASH_OF_LIGHT)) or
|
||||||
|
(HEALBOT_HOLY_SHOCK and string.find(spell, HEALBOT_HOLY_SHOCK)) then
|
||||||
|
local mult = 1 + (hlRank * 0.04)
|
||||||
|
baseHeal = baseHeal * mult
|
||||||
|
realHeal = realHeal * mult
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
HealBot_Spells[spell].HealsDur = math.floor(baseHeal + extHeal + realHeal);
|
||||||
end
|
end
|
||||||
|
|
||||||
function HealBot_AddHeal(spell)
|
function HealBot_AddHeal(spell)
|
||||||
@@ -393,21 +475,45 @@ end
|
|||||||
|
|
||||||
function HealBot_GetHealSpell(unit, pattern)
|
function HealBot_GetHealSpell(unit, pattern)
|
||||||
if (not UnitName(unit)) then return nil end;
|
if (not UnitName(unit)) then return nil end;
|
||||||
|
if not pattern then return nil end;
|
||||||
if UnitOnTaxi("player") then return nil end;
|
if UnitOnTaxi("player") then return nil end;
|
||||||
if HealBot_Config.ProtectPvP == 1 and UnitIsPVP(unit) and not UnitIsPVP("player") then return nil end
|
if HealBot_Config.ProtectPvP == 1 and UnitIsPVP(unit) and not UnitIsPVP("player") then return nil end
|
||||||
if HealBot_UnitClass("player") == "DRUID" then
|
if HealBot_UnitClass("player") == "DRUID" then
|
||||||
if HealBot_ActiveShapeshiftStance and HealBot_Config.AutoUnshift ~= 1 then return nil end;
|
if HealBot_ActiveShapeshiftStance and HealBot_Config.AutoUnshift ~= 1 then return nil end;
|
||||||
end
|
end
|
||||||
local spell = HealBot_GetSpellName(HealBot_GetSpellId(pattern))
|
|
||||||
|
-- Handle Inline Scripts
|
||||||
|
if string.sub(pattern, 1, 1) == "/" then
|
||||||
|
return pattern;
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Handle Spells
|
||||||
|
if HealBot_Spells[pattern] or HealBot_GetSpellId(pattern) then
|
||||||
|
local spell = HealBot_GetSpellName(HealBot_GetSpellId(pattern)) or pattern
|
||||||
local range = 40;
|
local range = 40;
|
||||||
if HealBot_Spells[spell] then
|
if HealBot_Spells[spell] then
|
||||||
if not HealBot_CanCastSpell(spell, unit) then return nil end;
|
if not HealBot_CanCastSpell(spell, unit) then return nil end;
|
||||||
range = HealBot_Spells[spell].range;
|
range = HealBot_Spells[spell].range or 40;
|
||||||
end
|
end
|
||||||
if HealBot_Range_Check(unit, range) == 0 then return nil end;
|
if HealBot_Range_Check(unit, range) == 0 then return nil end;
|
||||||
return spell;
|
return spell;
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Handle Named Macros
|
||||||
|
if GetMacroIndexByName(pattern) ~= 0 then
|
||||||
|
return pattern;
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Handle Items
|
||||||
|
local bag, slot = HealBot_FindBagSlot(pattern)
|
||||||
|
if bag then
|
||||||
|
-- optionally check item range, but skipping for now as it's complex in vanilla
|
||||||
|
return pattern;
|
||||||
|
end
|
||||||
|
|
||||||
|
return nil;
|
||||||
|
end
|
||||||
|
|
||||||
function HealBot_HealUnit(unit, pattern)
|
function HealBot_HealUnit(unit, pattern)
|
||||||
HealBot_CastSpellOnFriend(HealBot_GetHealSpell(unit, pattern), unit);
|
HealBot_CastSpellOnFriend(HealBot_GetHealSpell(unit, pattern), unit);
|
||||||
end
|
end
|
||||||
@@ -433,17 +539,38 @@ function HealBot_RecalcSpells()
|
|||||||
HealBot_RecalcParty();
|
HealBot_RecalcParty();
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function HealBot_GetTalentRank(talentName)
|
||||||
|
for t = 1, GetNumTalentTabs() do
|
||||||
|
for i = 1, GetNumTalents(t) do
|
||||||
|
local nameTalent, icon, tier, column, currRank, maxRank = GetTalentInfo(t, i);
|
||||||
|
if nameTalent == talentName then
|
||||||
|
return currRank;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return 0;
|
||||||
|
end
|
||||||
|
|
||||||
function HealBot_SpiBonus(spell)
|
function HealBot_SpiBonus(spell)
|
||||||
local heals_modifer = 0;
|
local heals_modifer = 0;
|
||||||
local base, stat, posBuff, negBuff = UnitStat("player", 5);
|
local base, stat, posBuff, negBuff = UnitStat("player", 5);
|
||||||
nameTalent, icon, tier, column, currRank, maxRank = GetTalentInfo(2, 14); -- Spiritual guidance
|
local currRank = HealBot_GetTalentRank("Spiritual Guidance")
|
||||||
spiGuideBonus = stat * 0.05;
|
if currRank > 0 then
|
||||||
|
local spiGuideBonus = stat * 0.05;
|
||||||
heals_modifer = heals_modifer + (currRank * spiGuideBonus);
|
heals_modifer = heals_modifer + (currRank * spiGuideBonus);
|
||||||
|
end
|
||||||
return heals_modifer;
|
return heals_modifer;
|
||||||
end
|
end
|
||||||
|
|
||||||
function HealBot_GetBonus()
|
function HealBot_GetBonus()
|
||||||
local HealBonus = HealBot_BonusScanner:GetBonus();
|
local HealBonus = HealBot_BonusScanner:GetBonus() or 0;
|
||||||
|
if UnitClass("player") == "PALADIN" then
|
||||||
|
local ironRank = HealBot_GetTalentRank("Ironclad")
|
||||||
|
if ironRank > 0 then
|
||||||
|
local base, effectiveArmor = UnitArmor("player")
|
||||||
|
HealBonus = HealBonus + (effectiveArmor * (ironRank * 0.01))
|
||||||
|
end
|
||||||
|
end
|
||||||
return HealBonus;
|
return HealBonus;
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -559,3 +559,23 @@ HealBot_SpamCnt=0;
|
|||||||
HealBot_Action_TooltipUnit=nil;
|
HealBot_Action_TooltipUnit=nil;
|
||||||
HealBot_Ressing = {};
|
HealBot_Ressing = {};
|
||||||
HealBot_IamRessing = false;
|
HealBot_IamRessing = false;
|
||||||
|
|
||||||
|
-- Table Recycling Pool (Puppeteer-inspired)
|
||||||
|
local tablePool = {}
|
||||||
|
function HealBot_GetTable()
|
||||||
|
local t = table.remove(tablePool)
|
||||||
|
if not t then
|
||||||
|
t = {}
|
||||||
|
end
|
||||||
|
return t
|
||||||
|
end
|
||||||
|
|
||||||
|
function HealBot_ReleaseTable(t)
|
||||||
|
if type(t) == "table" then
|
||||||
|
for k in pairs(t) do
|
||||||
|
t[k] = nil
|
||||||
|
end
|
||||||
|
table.insert(tablePool, t)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
HEALBOT_VERSION = "1.4";
|
HEALBOT_VERSION = "1.5";
|
||||||
|
|
||||||
-------------
|
-------------
|
||||||
-- ENGLISH --
|
-- ENGLISH --
|
||||||
|
|||||||
+11
-11
@@ -255,9 +255,9 @@ function HealBot_Action_EnableButton(button)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function HealBot_Action_EnableButtons()
|
function HealBot_Action_EnableButtons()
|
||||||
table.foreach(HealBot_Action_HealButtons, function (index, button)
|
for index, button in pairs(HealBot_Action_HealButtons) do
|
||||||
HealBot_Action_EnableButton(button);
|
HealBot_Action_EnableButton(button)
|
||||||
end);
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function HealBot_Action_RefreshButton(button)
|
function HealBot_Action_RefreshButton(button)
|
||||||
@@ -285,13 +285,13 @@ end
|
|||||||
|
|
||||||
function HealBot_Action_RefreshButtons(unit)
|
function HealBot_Action_RefreshButtons(unit)
|
||||||
if unit and HealBot_Action_UnitButtons[unit] then
|
if unit and HealBot_Action_UnitButtons[unit] then
|
||||||
table.foreach(HealBot_Action_UnitButtons[unit], function (index, button)
|
for index, button in pairs(HealBot_Action_UnitButtons[unit]) do
|
||||||
HealBot_Action_RefreshButton(button);
|
HealBot_Action_RefreshButton(button)
|
||||||
end);
|
end
|
||||||
else
|
else
|
||||||
table.foreach(HealBot_Action_HealButtons, function (index, button)
|
for index, button in pairs(HealBot_Action_HealButtons) do
|
||||||
HealBot_Action_RefreshButton(button);
|
HealBot_Action_RefreshButton(button)
|
||||||
end);
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -748,7 +748,7 @@ function HealBot_Action_PartyChanged()
|
|||||||
local i = 0;
|
local i = 0;
|
||||||
local z = 1;
|
local z = 1;
|
||||||
|
|
||||||
table.foreach(HealBot_Action_HealButtons, function (index, button)
|
for index, button in pairs(HealBot_Action_HealButtons) do
|
||||||
i = i + 1;
|
i = i + 1;
|
||||||
local checked = false;
|
local checked = false;
|
||||||
local header;
|
local header;
|
||||||
@@ -787,7 +787,7 @@ function HealBot_Action_PartyChanged()
|
|||||||
bar:SetScale(barScale);
|
bar:SetScale(barScale);
|
||||||
bar2:SetHeight(bheight);
|
bar2:SetHeight(bheight);
|
||||||
HealBot_Action_SetTexture(bar2, btexture);
|
HealBot_Action_SetTexture(bar2, btexture);
|
||||||
end);
|
end
|
||||||
|
|
||||||
if MaxOffsetY < OffsetY then MaxOffsetY = OffsetY; end
|
if MaxOffsetY < OffsetY then MaxOffsetY = OffsetY; end
|
||||||
|
|
||||||
|
|||||||
+30
-10
@@ -3,6 +3,16 @@
|
|||||||
|
|
||||||
HealBot_Action_TooltipUnit = nil
|
HealBot_Action_TooltipUnit = nil
|
||||||
|
|
||||||
|
function HealBot_Tooltip_GetSpellColor(spell)
|
||||||
|
local r, g, b = 1, 1, 0 -- default yellow
|
||||||
|
if spell and HealBot_Spells and HealBot_Spells[spell] and HealBot_Spells[spell].Mana then
|
||||||
|
if UnitMana("player") < HealBot_Spells[spell].Mana then
|
||||||
|
r, g, b = 1, 0, 0 -- red if not enough mana
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return r, g, b
|
||||||
|
end
|
||||||
|
|
||||||
function HealBot_Action_RefreshTooltip(unit)
|
function HealBot_Action_RefreshTooltip(unit)
|
||||||
if HealBot_Config.ShowTooltip==0 then return end
|
if HealBot_Config.ShowTooltip==0 then return end
|
||||||
if not unit then unit = HealBot_Action_TooltipUnit end
|
if not unit then unit = HealBot_Action_TooltipUnit end
|
||||||
@@ -33,53 +43,63 @@ function HealBot_Action_RefreshTooltip(unit)
|
|||||||
if HealBot_Config.Tooltip_ShowSpellDetail==1 then
|
if HealBot_Config.Tooltip_ShowSpellDetail==1 then
|
||||||
if spellLeft then
|
if spellLeft then
|
||||||
linenum=linenum+2
|
linenum=linenum+2
|
||||||
HealBot_Action_Tooltip_SetLineLeft(HEALBOT_OPTIONS_BUTTONLEFT.." "..HEALBOT_OPTIONS_COMBOBUTTON..": "..spellLeft,1,1,0,linenum)
|
local sr, sg, sb = HealBot_Tooltip_GetSpellColor(spellLeft)
|
||||||
|
HealBot_Action_Tooltip_SetLineLeft(HEALBOT_OPTIONS_BUTTONLEFT.." "..HEALBOT_OPTIONS_COMBOBUTTON..": "..spellLeft,sr,sg,sb,linenum)
|
||||||
linenum=HealBot_Action_Tooltip_SpellInfo(spellLeft,linenum);
|
linenum=HealBot_Action_Tooltip_SpellInfo(spellLeft,linenum);
|
||||||
end
|
end
|
||||||
if spellMiddle then
|
if spellMiddle then
|
||||||
linenum=linenum+2
|
linenum=linenum+2
|
||||||
HealBot_Action_Tooltip_SetLineLeft(HEALBOT_OPTIONS_BUTTONMIDDLE.." "..HEALBOT_OPTIONS_COMBOBUTTON..": "..spellMiddle,1,1,0,linenum)
|
local sr, sg, sb = HealBot_Tooltip_GetSpellColor(spellMiddle)
|
||||||
|
HealBot_Action_Tooltip_SetLineLeft(HEALBOT_OPTIONS_BUTTONMIDDLE.." "..HEALBOT_OPTIONS_COMBOBUTTON..": "..spellMiddle,sr,sg,sb,linenum)
|
||||||
linenum=HealBot_Action_Tooltip_SpellInfo(spellMiddle,linenum);
|
linenum=HealBot_Action_Tooltip_SpellInfo(spellMiddle,linenum);
|
||||||
end
|
end
|
||||||
if spellRight then
|
if spellRight then
|
||||||
linenum=linenum+2
|
linenum=linenum+2
|
||||||
HealBot_Action_Tooltip_SetLineLeft(HEALBOT_OPTIONS_BUTTONRIGHT.." "..HEALBOT_OPTIONS_COMBOBUTTON..": "..spellRight,1,1,0,linenum)
|
local sr, sg, sb = HealBot_Tooltip_GetSpellColor(spellRight)
|
||||||
|
HealBot_Action_Tooltip_SetLineLeft(HEALBOT_OPTIONS_BUTTONRIGHT.." "..HEALBOT_OPTIONS_COMBOBUTTON..": "..spellRight,sr,sg,sb,linenum)
|
||||||
linenum=HealBot_Action_Tooltip_SpellInfo(spellRight,linenum);
|
linenum=HealBot_Action_Tooltip_SpellInfo(spellRight,linenum);
|
||||||
end
|
end
|
||||||
if spellButton4 then
|
if spellButton4 then
|
||||||
linenum=linenum+2
|
linenum=linenum+2
|
||||||
HealBot_Action_Tooltip_SetLineLeft(HEALBOT_OPTIONS_BUTTON4.." "..HEALBOT_OPTIONS_COMBOBUTTON..": "..spellButton4,1,1,0,linenum)
|
local sr, sg, sb = HealBot_Tooltip_GetSpellColor(spellButton4)
|
||||||
|
HealBot_Action_Tooltip_SetLineLeft(HEALBOT_OPTIONS_BUTTON4.." "..HEALBOT_OPTIONS_COMBOBUTTON..": "..spellButton4,sr,sg,sb,linenum)
|
||||||
linenum=HealBot_Action_Tooltip_SpellInfo(spellButton4,linenum);
|
linenum=HealBot_Action_Tooltip_SpellInfo(spellButton4,linenum);
|
||||||
end
|
end
|
||||||
if spellButton5 then
|
if spellButton5 then
|
||||||
linenum=linenum+2
|
linenum=linenum+2
|
||||||
HealBot_Action_Tooltip_SetLineLeft(HEALBOT_OPTIONS_BUTTON5.." "..HEALBOT_OPTIONS_COMBOBUTTON..": "..spellButton5,1,1,0,linenum)
|
local sr, sg, sb = HealBot_Tooltip_GetSpellColor(spellButton5)
|
||||||
|
HealBot_Action_Tooltip_SetLineLeft(HEALBOT_OPTIONS_BUTTON5.." "..HEALBOT_OPTIONS_COMBOBUTTON..": "..spellButton5,sr,sg,sb,linenum)
|
||||||
linenum=HealBot_Action_Tooltip_SpellInfo(spellButton5,linenum);
|
linenum=HealBot_Action_Tooltip_SpellInfo(spellButton5,linenum);
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
if spellLeft then
|
if spellLeft then
|
||||||
linenum=linenum+1
|
linenum=linenum+1
|
||||||
HealBot_Action_Tooltip_SetLineLeft(HEALBOT_OPTIONS_BUTTONLEFT..":",1,1,0,linenum)
|
local sr, sg, sb = HealBot_Tooltip_GetSpellColor(spellLeft)
|
||||||
|
HealBot_Action_Tooltip_SetLineLeft(HEALBOT_OPTIONS_BUTTONLEFT..":",sr,sg,sb,linenum)
|
||||||
HealBot_Action_Tooltip_SetLineRight(HealBot_Action_Tooltip_SpellSummary(spellLeft),1,1,1,linenum)
|
HealBot_Action_Tooltip_SetLineRight(HealBot_Action_Tooltip_SpellSummary(spellLeft),1,1,1,linenum)
|
||||||
end
|
end
|
||||||
if spellMiddle then
|
if spellMiddle then
|
||||||
linenum=linenum+1
|
linenum=linenum+1
|
||||||
HealBot_Action_Tooltip_SetLineLeft(HEALBOT_OPTIONS_BUTTONMIDDLE..":",1,1,0,linenum)
|
local sr, sg, sb = HealBot_Tooltip_GetSpellColor(spellMiddle)
|
||||||
|
HealBot_Action_Tooltip_SetLineLeft(HEALBOT_OPTIONS_BUTTONMIDDLE..":",sr,sg,sb,linenum)
|
||||||
HealBot_Action_Tooltip_SetLineRight(HealBot_Action_Tooltip_SpellSummary(spellMiddle),1,1,1,linenum)
|
HealBot_Action_Tooltip_SetLineRight(HealBot_Action_Tooltip_SpellSummary(spellMiddle),1,1,1,linenum)
|
||||||
end
|
end
|
||||||
if spellRight then
|
if spellRight then
|
||||||
linenum=linenum+1
|
linenum=linenum+1
|
||||||
HealBot_Action_Tooltip_SetLineLeft(HEALBOT_OPTIONS_BUTTONRIGHT..":",1,1,0,linenum)
|
local sr, sg, sb = HealBot_Tooltip_GetSpellColor(spellRight)
|
||||||
|
HealBot_Action_Tooltip_SetLineLeft(HEALBOT_OPTIONS_BUTTONRIGHT..":",sr,sg,sb,linenum)
|
||||||
HealBot_Action_Tooltip_SetLineRight(HealBot_Action_Tooltip_SpellSummary(spellRight),1,1,1,linenum)
|
HealBot_Action_Tooltip_SetLineRight(HealBot_Action_Tooltip_SpellSummary(spellRight),1,1,1,linenum)
|
||||||
end
|
end
|
||||||
if spellButton4 then
|
if spellButton4 then
|
||||||
linenum=linenum+1
|
linenum=linenum+1
|
||||||
HealBot_Action_Tooltip_SetLineLeft(HEALBOT_OPTIONS_BUTTON4..":",1,1,0,linenum)
|
local sr, sg, sb = HealBot_Tooltip_GetSpellColor(spellButton4)
|
||||||
|
HealBot_Action_Tooltip_SetLineLeft(HEALBOT_OPTIONS_BUTTON4..":",sr,sg,sb,linenum)
|
||||||
HealBot_Action_Tooltip_SetLineRight(HealBot_Action_Tooltip_SpellSummary(spellButton4),1,1,1,linenum)
|
HealBot_Action_Tooltip_SetLineRight(HealBot_Action_Tooltip_SpellSummary(spellButton4),1,1,1,linenum)
|
||||||
end
|
end
|
||||||
if spellButton5 then
|
if spellButton5 then
|
||||||
linenum=linenum+1
|
linenum=linenum+1
|
||||||
HealBot_Action_Tooltip_SetLineLeft(HEALBOT_OPTIONS_BUTTON5..":",1,1,0,linenum)
|
local sr, sg, sb = HealBot_Tooltip_GetSpellColor(spellButton5)
|
||||||
|
HealBot_Action_Tooltip_SetLineLeft(HEALBOT_OPTIONS_BUTTON5..":",sr,sg,sb,linenum)
|
||||||
HealBot_Action_Tooltip_SetLineRight(HealBot_Action_Tooltip_SpellSummary(spellButton5),1,1,1,linenum)
|
HealBot_Action_Tooltip_SetLineRight(HealBot_Action_Tooltip_SpellSummary(spellButton5),1,1,1,linenum)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -31,12 +31,31 @@ Default installation path: `C:\Program Files\World of Warcraft\Interface\AddOns\
|
|||||||
* **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.
|
||||||
|
|
||||||
|
### To be implemented
|
||||||
|
- **GUID-based frame mapping:** Migrate internal state to use lightweight GUID tracking to resolve bugs when targets switch or duplicate names appear (e.g., enemy mobs, warlock pets).
|
||||||
|
- **Mod Integration Optimization:** Add conditional SuperWoW/UnitXP SP3 integration to reduce GC spikes and improve frame rendering accuracy.
|
||||||
|
|
||||||
### Known issues
|
### Known issues
|
||||||
|
|
||||||
* **New spell rank bug** you may experience lua error spaming your chat frame after learning new healing spells. /reload will clear the issue. To be fixed next release
|
* **New spell rank bug** you may experience lua error spaming your chat frame after learning new healing spells. /reload will clear the issue. To be fixed next release
|
||||||
|
|
||||||
|
|
||||||
### Change Log
|
### Change Log
|
||||||
|
|
||||||
|
|
||||||
|
**v1.5**
|
||||||
|
* **Macro, Item, and Script Bindings:** Support for binding named macros, inventory items, and inline scripts (e.g. `/target`) directly to mouse clicks in the Spells tab. All of these now natively support implicit `@mouseover` targeting on the unit frame you click, without losing your current target.
|
||||||
|
* **Modifier-Aware Tooltips & Resource Costs:** The tooltip dynamically updates to show exactly what action is bound when holding down Shift, Ctrl, or Alt over a frame. Spells also show their required mana cost, turning red if you do not have enough mana to cast them.
|
||||||
|
* **Memory Recycling Pool:** Added a local table recycling pool in the data layer to greatly reduce Lua garbage collection (GC) spikes, improving overall client frame rates during intense combat.
|
||||||
|
**v1.4.2**
|
||||||
|
* **Memory Optimization:** Fixed a significant memory leak where tracking tables were being repeatedly allocated every tick during aura scanning, and replaced `table.foreach` with pairs loops to avoid GC spikes during combat.
|
||||||
|
**v1.4.1**
|
||||||
|
* **Talent-based Healing Calculations:** Implemented dynamic spell healing calculations for Druid, Priest, and Paladin classes based on talents.
|
||||||
|
* **Modifier Key Polling:** Replaced MODIFIER_STATE_CHANGED event with polling in HealBot_OnUpdate to track modifier keys reliably.
|
||||||
|
* **Incoming Heals Fix:** Fixed a bug where incoming heals failed to broadcast or show on the UI due to synchronous GCD fails and `CheckInteractDistance` limitations in the 1.12 API.
|
||||||
|
* **Hovercast Incoming Heals:** Added full support for processing and displaying incoming heals when using action bar hovercasting.
|
||||||
|
* **Zero-latency Self-Heals:** Incoming heals for the local player now process instantly with zero latency and no network reliance, ensuring they function even when playing solo.
|
||||||
|
|
||||||
**v1.4**
|
**v1.4**
|
||||||
* **Extra Frame support for pets and familiars added:** Togglable from healing tab - Extra frames option selected & pets selected from dropdown.
|
* **Extra Frame support for pets and familiars added:** Togglable from healing tab - Extra frames option selected & pets selected from dropdown.
|
||||||
* **Customizable Health Text:** Added a new dropdown in the Healing Options tab that allows users to choose how health text is displayed on unit frames (`Name Only`, `Health Percentage`, `Real Health`, or `Health Deficit`). Includes a smart truncation algorithm to preserve critical health numbers even if the unit name is too long.
|
* **Customizable Health Text:** Added a new dropdown in the Healing Options tab that allows users to choose how health text is displayed on unit frames (`Name Only`, `Health Percentage`, `Real Health`, or `Health Deficit`). Includes a smart truncation algorithm to preserve critical health numbers even if the unit name is too long.
|
||||||
|
|||||||
Reference in New Issue
Block a user