Files
HealBotBlue/HealBot.lua
T
Bluewhale1337 913ab315b0 Commit 2
Added a native Action Bar Hovercasting (Mouseover) engine. You can now cast spells on hovered targets using action bar keybinds without losing your current target. Togglable in Options -> General.
Added Fear Ward to the global HoT tracker, which will display the icon directly on the unit frame.
Fixed Shaman weapon buff tracking (e.g., Rockbiter) failing due to spell ranks in tooltips.
Fixed missing health bar skin textures by ensuring `.tga` paths are explicitly resolved.
ixed division-by-zero math errors during UI scaling that caused the addon to crash.

Signed-off-by: Bluewhale1337 <295648290+Bluewhale1337@users.noreply.github.com>
2026-06-23 22:48:40 +02:00

1592 lines
52 KiB
Lua

--[[
HealBot Contined
]]
local _scale=0;
local CalcEquipBonus=false;
local InitCalcEquipBonus=false;
local FlagEquipUpdate1=1;
local FlagEquipUpdate2=1;
local NeedEquipUpdate=0;
local HealValue=0;
local InitSpells=1;
local DebugDebuff=false;
local Delay_RecalcParty=0;
function HealBot_AddChat(msg)
local chanid=HealBot_Get_DebugChan();
if chanid and HealBot_SpamCnt < 3 then
HealBot_SpamCnt=HealBot_SpamCnt+1;
local hour,minute = GetGameTime();
if minute==0 then
msg="["..hour..":00] "..msg;
elseif minute<10 then
msg="["..hour..":0"..minute.."] "..msg;
else
msg="["..hour..":"..minute.."] "..msg;
end
SendChatMessage(msg , "CHANNEL", nil, chanid);
elseif ( DEFAULT_CHAT_FRAME ) then
DEFAULT_CHAT_FRAME:AddMessage(msg);
end
end
function HealBot_AddDebug(msg)
local chanid=HealBot_Get_DebugChan();
if chanid and HealBot_SpamCnt < 3 then
HealBot_SpamCnt=HealBot_SpamCnt+1;
local hour,minute = GetGameTime();
if minute==0 then
msg="["..hour..":00] DEBUG: "..msg;
elseif minute<10 then
msg="["..hour..":0"..minute.."] DEBUG: "..msg;
else
msg="["..hour..":"..minute.."] DEBUG: "..msg;
end
SendChatMessage(msg , "CHANNEL", nil, chanid);
end
end
function HealBot_Report_Error(msg)
if HealBot_ErrorCnt<28 then
HealBot_ErrorCnt=HealBot_ErrorCnt+1;
ShowUIPanel(HealBot_Error);
HealBot_ErrorsIn(msg,HealBot_ErrorCnt);
end
end
function HealBot_AddError(msg)
UIErrorsFrame:AddMessage(msg, 1.0, 1.0, 1.0, 1.0, UIERRORS_HOLD_TIME);
HealBot_AddDebug(msg);
end
function HealBot_TogglePanel(panel)
if (not panel) then return end
if ( panel:IsVisible() ) then
HideUIPanel(panel);
else
ShowUIPanel(panel);
end
end
function HealBot_StartMoving(frame)
if ( not frame.isMoving ) and ( frame.isLocked ~= 1 ) then
frame:StartMoving();
frame.isMoving = true;
end
end
function HealBot_StopMoving(frame)
if ( frame.isMoving ) then
frame:StopMovingOrSizing();
frame.isMoving = false;
end
if HealBot_Config.GrowUpwards==1 then
local left,bottom = HealBot_Action:GetLeft(),HealBot_Action:GetBottom();
if left and bottom then
HealBot_Config.PanelAnchorX=left;
HealBot_Config.PanelAnchorY=bottom;
end
-- HealBot_AddDebug("Pos X="..HealBot_Config.PanelAnchorX.." Pos Y="..HealBot_Config.PanelAnchorY)
end
end
function HealBot_SlashCmd(cmd)
if (cmd=="") then
HealBot_TogglePanel(HealBot_Action);
return
end
if (cmd=="options" or cmd=="opt" or cmd=="config" or cmd=="cfg") then
HealBot_TogglePanel(HealBot_Options);
return
end
if (cmd=="reset" or cmd=="recalc" or cmd=="defaults") then
initSpells=2;
HealBot_Options_Defaults_OnClick(HealBot_Options_Defaults);
return
end
if (cmd=="ui") then
ReloadUI();
return;
end
if (cmd=="init") then
HealBot_RegisterThis(this);
end
if (cmd=="x") then
initSpells=2;
NeedEquipUpdate=1
HealBot_RecalcSpells();
return;
end
if (cmd=="ver") then
local text=UnitName("player");
HealBot_SendAddonMessage( "HealBot", ">> RequestVersion <<=>> "..text.." <<=>> nil <<" );
return;
end
if (cmd=="chan") then
HealBot_AddDebug( "Channel active" );
return;
end
end
function HealBot_SendAddonMessage(prefix, text)
if GetNumRaidMembers() > 0 then
SendAddonMessage(prefix, text, "RAID")
elseif GetNumPartyMembers() > 0 then
SendAddonMessage(prefix, text, "PARTY")
end
end
function HealBot_TargetName()
if UnitIsEnemy("target","player") then return nil end
-- if not UnitPlayerControlled("target") then return nil end
if (UnitIsPlayer("target")) then
if UnitIsUnit("target","player") then return "player" end
if (UnitInParty("target")) then
for i=1,4 do
if UnitIsUnit("target","party"..i) then return "party"..i end
end
end
if (UnitInRaid("target")) then
for i=1,40 do
if UnitIsUnit("target","raid"..i) then return "raid"..i end
end
end
else
if UnitIsUnit("target","pet") then return "pet" end
if (UnitInParty("player")) then
for i=1,4 do
if UnitIsUnit("target","partypet"..i) then return "partypet"..i end
end
end
if (UnitInRaid("player")) then
for i=1,40 do
if UnitIsUnit("target","raidpet"..i) then return "raidpet"..i end
end
end
end
return nil
end
function HealBot_PackBagSlot(bag,slot)
return bag*100+slot;
end
function HealBot_UnpackBagSlot(bagslot)
return math.floor(bagslot/100),math.mod(bagslot,100);
end
function HealBot_GetItemName(bag,slot)
local link = GetContainerItemLink(bag,slot);
if not link then return nil end;
local _,_,item = string.find(link,"%[(.*)%]");
local _,count = GetContainerItemInfo(bag,slot);
return item,count;
end
function HealBot_GetBagSlot(item)
local BagSlot,BestCount;
for bag=0,NUM_BAG_FRAMES do
for slot=1,GetContainerNumSlots(bag) do
local bagitem,count = HealBot_GetItemName(bag,slot);
if (item==bagitem) then
if not BestCount or BestCount>count then
BagSlot = HealBot_PackBagSlot(bag,slot);
BestCount = count;
end
end
end
end
return BagSlot;
end
function HealBot_UseItem(item)
local bagslot = HealBot_GetBagSlot(item);
if not bagslot then return end;
local bag,slot = HealBot_UnpackBagSlot(bagslot);
local Link = GetContainerItemLink(bag,slot);
UseContainerItem(bag,slot);
end
function HealBot_GetSpellName(id)
if (not id) then
return nil;
end
local spellName, subSpellName = GetSpellName(id,BOOKTYPE_SPELL);
if (not spellName) then
return nil;
end
if (not subSpellName or subSpellName=="") then
return spellName;
end
return spellName .. " (" .. subSpellName .. ")";
end
function HealBot_GetSpellId(spell)
local id,idd = 1,0;
while true do
local spellName, subSpellName = GetSpellName(id,BOOKTYPE_SPELL);
if (spellName) then
if (spell == spellName .. " (" .. subSpellName .. ")") or (spell == spellName .. "(" .. subSpellName .. ")") then
return id;
end
if (spell == spellName) then
idd=id;
end
else
do break end
end
id = id + 1;
end
if idd>0 then
return idd
else
return nil;
end
end
function HealBot_CastSpellByName(spell)
if (HealBot_Spells[spell] and HealBot_Spells[spell].BagSlot) then
HealBot_UseItem(spell);
return;
end
local id;
if not HealBot_Spells[spell] then
id = HealBot_GetSpellId(spell);
elseif HealBot_Spells[spell].id then
id = HealBot_Spells[spell].id
else
id = HealBot_GetSpellId(spell);
end
if (not id) then
return;
end
CastSpell(id,BOOKTYPE_SPELL);
end
HealBot_CastingSpell = nil;
HealBot_CastingTarget = nil;
function HealBot_StartCasting(spell,target,ttype)
HealBot_CastSpellByName(spell);
HealBot_CastingSpell = spell;
HealBot_CastingTarget = target;
if ( SpellCanTargetUnit(target) ) then
SpellTargetUnit(target);
ttype="fired";
elseif SpellIsTargeting() then
SpellTargetUnit(target);
SpellStopTargeting()
elseif ttype=="direct" then
if ( CheckInteractDistance(target, 4) ) then
ttype="fired";
end
end
if HealBot_Config.ChatMessages then
local tName = target
if target=="target" then tName = HealBot_TargetName() or "target" else tName = UnitName(target) end
if not tName then tName = target end
local baseSpell = spell
local parenIndex = string.find(spell, "%(")
if parenIndex then
baseSpell = string.sub(spell, 1, parenIndex - 1)
end
for i = 1, 5 do
local msgConf = HealBot_Config.ChatMessages[i]
if msgConf and msgConf.Spell == baseSpell and msgConf.Channel ~= "None" then
local msg = msgConf.Message or ""
msg = string.gsub(msg, "#Spell#", spell)
msg = string.gsub(msg, "#Target#", tName)
local chan = msgConf.Channel
if chan == "Say" then
SendChatMessage(msg, "SAY")
elseif chan == "Party" and GetNumPartyMembers() > 0 then
SendChatMessage(msg, "PARTY")
elseif chan == "Raid" and GetNumRaidMembers() > 0 then
SendChatMessage(msg, "RAID")
elseif chan == "Whisper" and UnitIsPlayer(target) then
SendChatMessage(msg, "WHISPER", nil, tName)
end
end
end
end
if ttype=="fired" and HealBot_Spells[spell] then
-- if not HealBot_Spells[spell].CastTime then
-- if HealBot_Spells[spell].id then
-- HealBot_InitGetSpellData(spell, HealBot_Spells[spell].id, HealBot_UnitClass("player"))
-- HealBot_AddDebug("Requested init spell data for "..spell)
-- end
-- if not HealBot_Spells[spell].CastTime then
-- HealBot_Spells[spell].CastTime=0
-- HealBot_AddDebug("Unable to init spell data for "..spell)
-- InitSpells=2;
-- return
-- end
-- end
if HealBot_Spells[spell].CastTime > 1 then
HealValue=HealBot_Spells[spell].HealsDur;
HealBot_SendAddonMessage( HEALBOT_ADDON_ID, ">> "..UnitName(target).." <<=>> "..HealValue.." << " );
end
end
end
function HealBot_StopCasting()
if HealBot_CastingTarget then
if HealBot_HealsIn[UnitName(HealBot_CastingTarget)] then
if HealValue > 0 then
HealBot_SendAddonMessage( HEALBOT_ADDON_ID, ">> "..UnitName(HealBot_CastingTarget).." <<=>> "..0-HealValue.." << " );
HealValue=0;
end
end
end
HealBot_CastingSpell = nil;
HealBot_CastingTarget = nil;
local bar = HealBot_Action_HealthBar(HealBot_Action_AbortButton);
local ar=HealBot_Config.babortcolr[HealBot_Config.Current_Skin] or 0.1;
local ag=HealBot_Config.babortcolg[HealBot_Config.Current_Skin] or 0.1;
local ab=HealBot_Config.babortcolb[HealBot_Config.Current_Skin] or 0.5;
local aa=HealBot_Config.babortcola[HealBot_Config.Current_Skin] or 1;
bar.txt = getglobal(bar:GetName().."_text"); bar:SetStatusBarColor(ar,ag,ab,0);
local sr=HealBot_Config.btextdisbledcolr[HealBot_Config.Current_Skin];
local sg=HealBot_Config.btextdisbledcolg[HealBot_Config.Current_Skin];
local sb=HealBot_Config.btextdisbledcolb[HealBot_Config.Current_Skin];
local sa=HealBot_Config.btextdisbledcola[HealBot_Config.Current_Skin];
bar.txt:SetTextColor(sr,sg,sb,sa);
end
local HealBot_Health60 = {
["DRUID"] = 3500,
["MAGE"] = 2500,
["HUNTER"] = 3500,
["PALADIN"] = 4000,
["PRIEST"] = 2500,
["ROGUE"] = 3500,
["SHAMAN"] = 3800,
["WARLOCK"] = 3500,
["WARRIOR"] = 5000,
}
function HealBot_UnitHealth(unit)
local Current,Desired = UnitHealth(unit),UnitHealthMax(unit);
if unit=='target' and Desired==100 then
local class,level = HealBot_UnitClass(unit),UnitLevel(unit);
if HealBot_Health60[class] and level>0 then
Desired = math.floor(HealBot_Health60[class]/60*level+0.5)
else
Desired = UnitHealthMax('player');
end
Current = Desired/100*Current;
end
return Current,Desired;
end
function HealBot_CheckCasting(unit)
if not HealBot_CastingSpell or HealBot_AlwaysHeal() then return nil end
if not HealBot_Spells[HealBot_CastingSpell] then return nil end
if not unit then unit = HealBot_CastingTarget end
if unit~=HealBot_CastingTarget then return nil end
local bar = HealBot_Action_HealthBar(HealBot_Action_AbortButton);
local ar=HealBot_Config.babortcolr[HealBot_Config.Current_Skin] or 0.1;
local ag=HealBot_Config.babortcolg[HealBot_Config.Current_Skin] or 0.1;
local ab=HealBot_Config.babortcolb[HealBot_Config.Current_Skin] or 0.5;
local aa=HealBot_Config.babortcola[HealBot_Config.Current_Skin] or 1;
bar.txt = getglobal(bar:GetName().."_text");
if HealBot_IsCasting==false and HealBot_AbortButton==0 then
bar:SetStatusBarColor(ar,ag,ab,0);
local sr=HealBot_Config.btextdisbledcolr[HealBot_Config.Current_Skin];
local sg=HealBot_Config.btextdisbledcolg[HealBot_Config.Current_Skin];
local sb=HealBot_Config.btextdisbledcolb[HealBot_Config.Current_Skin];
local sa=HealBot_Config.btextdisbledcola[HealBot_Config.Current_Skin];
bar.txt:SetTextColor(sr,sg,sb,sa);
return nil
end
local Current,Desired = HealBot_UnitHealth(unit)
local Needed = Desired-Current;
Needed = Needed * (1 + (HealBot_Config.OverHeal*4));
if Needed<0 then Needed = 0 end
if (Needed>HealBot_Spells[HealBot_CastingSpell].HealsDur) then
local sr=HealBot_Config.btextdisbledcolr[HealBot_Config.Current_Skin];
local sg=HealBot_Config.btextdisbledcolg[HealBot_Config.Current_Skin];
local sb=HealBot_Config.btextdisbledcolb[HealBot_Config.Current_Skin];
local sa=HealBot_Config.btextdisbledcola[HealBot_Config.Current_Skin];
bar.txt:SetTextColor(sr,sg,sb,sa);
bar:SetStatusBarColor(ar,ag,ab,0);
return nil
elseif HealBot_AbortButton==1 and HealBot_IsCasting==true then
bar:SetStatusBarColor(ar,ag,ab,aa);
local sr=HealBot_Config.btextenabledcolr[HealBot_Config.Current_Skin];
local sg=HealBot_Config.btextenabledcolg[HealBot_Config.Current_Skin];
local sb=HealBot_Config.btextenabledcolb[HealBot_Config.Current_Skin];
local sa=HealBot_Config.btextenabledcola[HealBot_Config.Current_Skin];
bar.txt = getglobal(bar:GetName().."_text");
bar.txt:SetTextColor(sr,sg,sb,sa);
end
end
function HealBot_CastSpellOnFriend(spell,target)
local old;
local ttype="other";
if (not spell or not target or not UnitName(target)) then
return;
end
if (UnitCanAttack("player","target")) then
old = "enemy";
else
old = UnitName("target");
if UnitName("target")~=UnitName(target) then
ClearTarget();
else
ttype="direct";
end
end
HealBot_StartCasting(spell,target,ttype);
if (old=="enemy") then
TargetLastEnemy();
elseif (old) then
TargetByName(old);
else
ClearTarget();
end
end
function HealBot_UnitClass(unit)
local playerClass, englishClass = UnitClass(unit);
return englishClass;
end
-- TBD: use the event UNIT_AURA to keep track instead of querying each time
function HealBot_UnitAffected(unit,effect)
if not effect then return nil; end
local i = 1
while true do
local buff = UnitBuff(unit,i)
if not buff then
do break end
end
if buff==effect then
return buff
end
i = i + 1
end
i = 1
while true do
local debuff = UnitDebuff(unit,i)
if not debuff then
do break end
end
if debuff==effect then
return debuff
end
i = i + 1
end
return nil;
end
-- safer to use GameTooltip:SetUnitBuff and read the lines in the tooltip ...
-- maybe make an additional GameTooltip frame if possible ?
function HealBot_SetItemDefaults(spell)
if not HealBot_Spells[spell].Target then
HealBot_Spells[spell].Target = {"player","party","pet"};
end
if not HealBot_Spells[spell].Price then
HealBot_Spells[spell].Price = 0;
end
if not HealBot_Spells[spell].CastTime then
HealBot_Spells[spell].CastTime = 0;
end
if not HealBot_Spells[spell].Mana then
HealBot_Spells[spell].Mana = 0;
end
if not HealBot_Spells[spell].Channel then
HealBot_Spells[spell].Channel = HealBot_Spells[spell].CastTime;
end
if not HealBot_Spells[spell].Duration then
HealBot_Spells[spell].Duration = HealBot_Spells[spell].Channel;
end
if not HealBot_Spells[spell].HealsMin then
HealBot_Spells[spell].HealsMin = 0;
end
if not HealBot_Spells[spell].HealsMax then
HealBot_Spells[spell].HealsMax = 0;
end
HealBot_Spells[spell].RealHealing=0;
HealBot_Spells[spell].HealsCast = (HealBot_Spells[spell].HealsMin+HealBot_Spells[spell].HealsMax)/2;
if not HealBot_Spells[spell].HealsExt then
HealBot_Spells[spell].HealsExt = 0;
end
end
function HealBot_SetSpellDefaults(spell)
HealBot_Spells[spell].HealsDur = floor((HealBot_Spells[spell].HealsCast+HealBot_Spells[spell].HealsExt) + HealBot_Spells[spell].RealHealing);
end
function HealBot_AddHeal(spell)
HealBot_SetSpellDefaults(spell);
table.foreachi(HealBot_Spells[spell].Target,function (i,val)
table.insert(HealBot_Heals[val],spell);
end);
HealBot_Spells[spell].BagSlot = HealBot_GetBagSlot(spell);
end
function HealBot_FindHealSpells()
local id = 1;
if InitSpells>0 then NeedEquipUpdate=1; return; end
HealBot_Heals = { player = {}, pet = {}, party = {} };
table.foreach(HealBot_CurrentSpells, function (index,spell)
if (HealBot_Spells[spell]) then
if CalcEquipBonus then
local healingbonus_penalty=1;
if HealBot_Spells[spell].Level < 20 then
healingbonus_penalty=(1-((20-HealBot_Spells[spell].Level)*0.0375));
end
local temp_Spell_cast=3.5;
if HealBot_Spells[spell].CastTime == 0 then
temp_Spell_cast=3.5;
end
if not HealBot_Spells[spell].CastTime then
-- HealBot_SetOldDefaults(spell);
-- HealBot_Report_Error( "================================" );
-- HealBot_Report_Error( "ERROR: HealBot_Spells[spell].CastTime == nil" );
-- HealBot_Report_Error( "ERROR: spell = "..spell );
HealBot_Spells[spell].CastTime = 1.5;
end
if HealBot_Spells[spell].CastTime >= 1.5 and HealBot_Spells[spell].CastTime < 3.5 then
temp_Spell_cast=HealBot_Spells[spell].CastTime;
end
RealHealing = ((HealBot_GetBonus() * healingbonus_penalty) * (temp_Spell_cast/3.5));
local playerClass, englishClass = UnitClass("player");
local SpiBonus = 0;
if (englishClass=="PRIEST") then
SpiBonus = ((HealBot_SpiBonus(spell) * healingbonus_penalty) * (temp_Spell_cast/3.5))
RealHealing = RealHealing + SpiBonus;
end
RealHealing = floor(RealHealing);
HealBot_Spells[spell].RealHealing = RealHealing;
end
HealBot_AddHeal(spell);
end
end);
local items = {};
for bag=0,NUM_BAG_FRAMES do
for slot=1,GetContainerNumSlots(bag) do
local item = HealBot_GetItemName(bag,slot);
if HealBot_Spells[item] and not items[item] then
HealBot_SetItemDefaults(item);
HealBot_AddHeal(item);
items[item] = 1;
end
end
end
table.foreach(HealBot_Heals, function (key,val)
if (table.getn(val)==0) then
HealBot_Heals[key] = nil;
end
end);
HealBot_Heals.target = HealBot_Heals.party;
for i=1,4 do
HealBot_Heals["party"..i] = HealBot_Heals.party;
HealBot_Heals["partypet"..i] = HealBot_Heals.party;
end
for i=1,40 do
HealBot_Heals["raid"..i] = HealBot_Heals.party;
HealBot_Heals["raidpet"..i] = HealBot_Heals.party;
end
table.foreach(HealBot_Heals, function (key,val)
table.foreachi(val, function (i,val)
end);
end);
if CalcEquipBonus then
HealBot_AddDebug("...Done Equip Bonus:"..RealHealing);
end
CalcEquipBonus=false;
end
function HealBot_GetShapeshiftForm()
local forms = GetNumShapeshiftForms();
if forms then
local i;
for i=1,forms do
local icon,name,active = GetShapeshiftFormInfo(i);
if active and not string.find(icon,"HumanoidForm") then return i; end
end
end
return nil;
end
function HealBot_CanCastSpell(spell,unit)
local this = HealBot_Spells[spell];
if this.Mana>UnitMana("player") then return false end;
if this.BagSlot then
local bag,slot = HealBot_UnpackBagSlot(this.BagSlot);
local start, duration, enable = GetContainerItemCooldown(bag,slot);
if (start > 0 and duration > 0 and enable > 0) then
return false;
end
end
return true;
end
function HealBot_GetHealSpell(unit,pattern)
if (not UnitName(unit)) then return nil end;
if UnitOnTaxi("player") then return nil end;
if HealBot_Config.ProtectPvP==1 and UnitIsPVP(unit) and not UnitIsPVP("player") then return nil end
if HealBot_UnitClass("player")=="DRUID" then
if HealBot_GetShapeshiftForm() then return nil end;
end
local spell = HealBot_GetSpellName(HealBot_GetSpellId(pattern))
local range=40;
if HealBot_Spells[spell] then
if not HealBot_CanCastSpell(spell,unit) then return nil end;
range=HealBot_Spells[spell].range;
end
if HealBot_Range_Check(unit, range)==0 then return nil end;
return spell;
end
function HealBot_HealUnit(unit,pattern)
HealBot_CastSpellOnFriend(HealBot_GetHealSpell(unit,pattern),unit);
end
function HealBot_RecalcHeals(unit)
HealBot_Action_Refresh(unit);
end
function HealBot_RecalcParty()
HealBot_Action_PartyChanged();
HealBot_Action_RefreshButtons();
end
function HealBot_RecalcSpells()
HealBot_FindHealSpells();
HealBot_RecalcParty();
end
--------------------------------------------------------------------------------------------------
-- OnFoo functions
--------------------------------------------------------------------------------------------------
function HealBot_OnLoad(this)
this:RegisterEvent("VARIABLES_LOADED");
SLASH_HEALBOT1 = "/healbot";
SLASH_HEALBOT2 = "/hb";
SlashCmdList["HEALBOT"] = function(msg)
HealBot_SlashCmd(msg);
end
HealBot_AddError(HEALBOT_ADDON .. HEALBOT_LOADED);
end
function HealBot_RegisterThis(this)
end
local HealBot_Timer1,HealsIn_Timer = 0,0;
function HealBot_OnUpdate(this,arg1)
HealBot_Timer1 = HealBot_Timer1+arg1;
if HealBot_Timer1>=2.5 then
if not HealBot_IsFighting then
HealsIn_Timer=HealsIn_Timer+1;
if HealsIn_Timer>=10 then
HealBot_HealsIn={};
HealBot_Healers={};
HealsIn_Timer=0;
InitCalcEquipBonus=true
end
if FlagEquipUpdate1>0 and FlagEquipUpdate2>0 then
FlagEquipUpdate1=0;
FlagEquipUpdate2=0;
NeedEquipUpdate=1;
elseif FlagEquipUpdate1>0 then
FlagEquipUpdate1=FlagEquipUpdate1+1;
if FlagEquipUpdate1>1 then
FlagEquipUpdate1=0;
end
elseif FlagEquipUpdate2>0 then
FlagEquipUpdate2=FlagEquipUpdate2+1;
if FlagEquipUpdate2>1 then
FlagEquipUpdate2=0;
end
end
if NeedEquipUpdate>0 and InitCalcEquipBonus then
NeedEquipUpdate=NeedEquipUpdate+1;
if NeedEquipUpdate>1 then
HealBot_BonusScanner:ScanEquipment()
CalcEquipBonus=true;
InitCalcEquipBonus=false;
NeedEquipUpdate=0;
HealBot_RecalcSpells();
end
end
if InitSpells>1 then
InitSpells=InitSpells+1;
if InitSpells>2 then
local cnt=HealBot_InitSpells();
InitSpells=0;
InitCalcEquipBonus=true;
end
end
if Delay_RecalcParty>0 then
Delay_RecalcParty=Delay_RecalcParty+1
if Delay_RecalcParty>1 then
Delay_RecalcParty=0;
HealBot_RecalcParty();
end
end
else
HealsIn_Timer=0;
end
HealBot_Timer1 = 0;
HealBot_SpamCnt = 0;
end
end
function HealBot_OnEvent(this, event, arg1,arg2,arg3,arg4)
if (event=="CHAT_MSG_ADDON") then
HealBot_OnEvent_AddonMsg(this,arg1,arg2,arg3,arg4);
elseif (event=="UNIT_HEALTH") then
HealBot_OnEvent_UnitHealth(this,arg1);
elseif (event=="UNIT_MANA" or event=="UNIT_RAGE" or event=="UNIT_ENERGY" or event=="UNIT_DISPLAYPOWER") then
if (arg1=="player") then HealBot_RecalcHeals(); end
HealBot_Action_RefreshButtons(arg1);
elseif (event=="UNIT_AURA") then
HealBot_OnEvent_UnitAura(this,arg1);
elseif (event=="SPELLCAST_START") then
HealBot_OnEvent_SpellcastStart(this,arg1,arg2);
elseif (event=="SPELLCAST_STOP") then
HealBot_OnEvent_SpellcastStop(this);
elseif (event=="SPELLCAST_INTERRUPTED") then
HealBot_OnEvent_SpellcastStop(this);
elseif (event=="SPELLCAST_FAILED") then
HealBot_OnEvent_SpellcastStop(this);
elseif (event=="PLAYER_REGEN_DISABLED") then
HealBot_OnEvent_PlayerRegenDisabled(this);
elseif (event=="PLAYER_REGEN_ENABLED") then
HealBot_OnEvent_PlayerRegenEnabled(this);
elseif (event=="BAG_UPDATE_COOLDOWN") then
HealBot_OnEvent_BagUpdateCooldown(this,arg1);
elseif (event=="BAG_UPDATE") then
HealBot_OnEvent_BagUpdate(this,arg1);
elseif (event=="PARTY_MEMBER_DISABLE") then
HealBot_OnEvent_PartyMemberDisable(this,arg1);
elseif (event=="PARTY_MEMBER_ENABLE") then
HealBot_OnEvent_PartyMemberEnable(this,arg1);
elseif (event=="CHAT_MSG_SYSTEM") then
HealBot_OnEvent_SystemMsg(this,arg1);
elseif (event=="PARTY_MEMBERS_CHANGED") then
HealBot_OnEvent_PartyMembersChanged(this);
elseif (event=="PLAYER_TARGET_CHANGED") then
HealBot_OnEvent_PlayerTargetChanged(this);
elseif (event=="ZONE_CHANGED_NEW_AREA") then
HealBot_OnEvent_ZoneChanged(this);
elseif (event=="UPDATE_INVENTORY_ALERTS") then
HealBot_OnEvent_PlayerEquipmentChanged(this);
elseif (event=="UNIT_INVENTORY_CHANGED") then
HealBot_OnEvent_PlayerEquipmentChanged2(this,arg1);
elseif (event=="PET_BAR_SHOWGRID") then
HealBot_OnEvent_PartyMembersChanged(this);
elseif (event=="PET_BAR_HIDEGRID") then
HealBot_OnEvent_PartyMembersChanged(this);
elseif (event=="SPELLS_CHANGED") then
HealBot_OnEvent_SpellsChanged(this,arg1);
elseif (event=="PLAYER_ENTERING_WORLD") then
HealBot_OnEvent_PlayerEnteringWorld(this);
-- elseif (event=="CHARACTER_POINTS_CHANGED") then
-- HealBot_OnEvent_TalentsChanged(this, arg1);
elseif (event=="VARIABLES_LOADED") then
HealBot_OnEvent_VariablesLoaded(this);
else
HealBot_AddDebug("OnEvent (" .. event .. ")");
end
end
function HealBot_OnEvent_VariablesLoaded(this)
local class=HealBot_UnitClass("player")
table.foreach(HealBot_ConfigDefaults, function (key,val)
if not HealBot_Config[key] then
HealBot_Config[key] = val;
end
end);
HealBot_InitData();
if class=="PRIEST" or class=="DRUID" or class=="PALADIN" or class=="SHAMAN" then
HealBot_BonusScanner:ScanEquipment();
if HealBot_Config.ActionVisible==1 then HealBot_Action:Show() end
this:RegisterEvent("ZONE_CHANGED_NEW_AREA");
this:RegisterEvent("PLAYER_REGEN_DISABLED");
this:RegisterEvent("PLAYER_REGEN_ENABLED");
this:RegisterEvent("PLAYER_TARGET_CHANGED");
this:RegisterEvent("PARTY_MEMBERS_CHANGED");
this:RegisterEvent("PARTY_MEMBER_DISABLE");
this:RegisterEvent("PARTY_MEMBER_ENABLE");
this:RegisterEvent("PET_BAR_SHOWGRID");
this:RegisterEvent("PET_BAR_HIDEGRID");
this:RegisterEvent("UNIT_HEALTH");
this:RegisterEvent("UNIT_MANA");
this:RegisterEvent("UNIT_RAGE");
this:RegisterEvent("UNIT_ENERGY");
this:RegisterEvent("UNIT_DISPLAYPOWER");
this:RegisterEvent("SPELLS_CHANGED");
this:RegisterEvent("SPELLCAST_START");
this:RegisterEvent("SPELLCAST_STOP");
this:RegisterEvent("SPELLCAST_INTERRUPTED");
this:RegisterEvent("SPELLCAST_FAILED");
this:RegisterEvent("BAG_UPDATE");
this:RegisterEvent("BAG_UPDATE_COOLDOWN");
this:RegisterEvent("UNIT_AURA");
-- this:RegisterEvent("CHARACTER_POINTS_CHANGED");
this:RegisterEvent("UPDATE_INVENTORY_ALERTS");
this:RegisterEvent("UNIT_INVENTORY_CHANGED");
this:RegisterEvent("CHAT_MSG_ADDON");
this:RegisterEvent("CHAT_MSG_SYSTEM");
this:RegisterEvent("PLAYER_ENTERING_WORLD");
InitSpells=2;
end
end
function HealBot_OnEvent_AddonMsg(this,addon_id,inc_msg,dist_target,sender_id)
if addon_id==HEALBOT_ADDON_ID then
local tmpTest, unitname, heal_val
tmpTest,tmpTest,unitname,heal_val = string.find(inc_msg, ">> (%a+) <<=>> (.%d+) <<" );
if heal_val then
if not HealBot_HealsIn[unitname] then
HealBot_HealsIn[unitname]=0;
end
HealBot_Healers[sender_id] = ">> "..unitname.." <<=>> "..heal_val.." <<";
HealBot_HealsIn[unitname] = HealBot_HealsIn[unitname] + tonumber(heal_val);
if tonumber(heal_val) > 0 then
HealBot_RecalcHeals(HealBot_FindUnitID(unitname))
elseif HealBot_HealsIn[unitname] < 0 then
HealBot_HealsIn[unitname]=0;
end
end
elseif addon_id=="HealBot" then
local tmpTest, datatype, datamsg, sender
local PName=UnitName("player");
tmpTest, tmpTest, datatype, sender, datamsg = string.find(inc_msg, ">> (%a+) <<=>> (%a+) <<=>> (.+)");
if datatype=="RequestVersion" then
HealBot_SendAddonMessage( "HealBot", ">> SendVersion <<=>> "..sender.." <<=>> Version="..HEALBOT_VERSION );
elseif datatype=="SendVersion" and PName==sender then
HealBot_AddChat(sender_id..": "..datamsg);
end
elseif addon_id=="CTRA" then
if ( strsub(inc_msg, 1, 3) == "RES" ) then
if ( inc_msg == "RESNO" ) then
HealBot_AddDebug(sender_id.." Stopped ressing");
if HealBot_Ressing[unitname] then HealBot_Ressing[unitname] = nil; end
else
local unitname, tmpTest
tmpTest, tmpTest, unitname = string.find(inc_msg, "^RES (.+)$");
if ( unitname ) then
HealBot_AddDebug(sender_id.." is ressing "..unitname);
HealBot_Ressing[unitname] = sender_id;
end
end
HealBot_RecalcHeals(HealBot_FindUnitID(unitname));
end
end
end
function HealBot_OnEvent_UnitHealth(this,unit)
if (not HealBot_Heals[unit]) then return end
HealBot_CheckCasting(unit);
HealBot_RecalcHeals(unit);
if unit==HealBot_Action_TooltipUnit then
HealBot_Action_RefreshTooltip(HealBot_Action_TooltipUnit);
end
end
function HealBot_OnEvent_UnitMana(this,unit)
if (unit~="player") then return end
HealBot_RecalcHeals();
end
function HealBot_OnEvent_ZoneChanged(this)
-- HealBot_AddDebug("HB: ZoneChange");
_scale = 0;
Delay_RecalcParty=1;
end
HealBot_MissingBuffs = {}
function HealBot_CheckShamanWeaponBuff(spellName)
local hasMainHandEnchant, _, _, hasOffHandEnchant = GetWeaponEnchantInfo()
if hasMainHandEnchant or hasOffHandEnchant then
return true
end
return false
end
function HealBot_CheckBuffs(unit)
if HealBot_Config.BuffWatch ~= 1 then
HealBot_MissingBuffs[unit] = nil
return
end
local inCombat = UnitAffectingCombat("player") or UnitAffectingCombat(unit)
if inCombat and HealBot_Config.BuffWatchInCombat ~= 1 then
HealBot_MissingBuffs[unit] = nil
return
end
local myClass = UnitClass("player")
if not HealBot_Buff_Spells[myClass] then return end
if UnitIsDeadOrGhost(unit) or not UnitIsConnected(unit) then
HealBot_MissingBuffs[unit] = nil
return
end
-- Group Buff Equivalents
local HealBot_Buff_Equivalents = {
[HEALBOT_POWER_WORD_FORTITUDE] = HEALBOT_PRAYER_OF_FORTITUDE,
[HEALBOT_DIVINE_SPIRIT] = HEALBOT_PRAYER_OF_SPIRIT,
[HEALBOT_SHADOW_PROTECTION] = HEALBOT_PRAYER_OF_SHADOW_PROTECTION,
[HEALBOT_ARCANE_INTELLECT] = HEALBOT_ARCANE_BRILLIANCE,
[HEALBOT_MARK_OF_THE_WILD] = HEALBOT_GIFT_OF_THE_WILD,
}
-- Gather buffs on unit
local hasBuff = {}
local i = 1
while true do
local buffTexture = UnitBuff(unit, i)
if not buffTexture then break end
HealBot_ScanTooltip:SetOwner(UIParent, "ANCHOR_NONE")
HealBot_ScanTooltip:ClearLines()
HealBot_ScanTooltip:SetUnitBuff(unit, i)
local buffName = HealBot_ScanTooltipTextLeft1:GetText()
if buffName then
hasBuff[buffName] = true
end
i = i + 1
end
HealBot_ScanTooltip:Hide()
HealBot_MissingBuffs[unit] = nil
if HealBot_Config.BuffDropDowns and HealBot_Config.BuffDropDowns[myClass] then
for j = 1, 8 do
local val = HealBot_Config.BuffDropDowns[myClass][j]
if val and val > 0 then
local isSelfOnly = (HealBot_Config.BuffWatchSelf and HealBot_Config.BuffWatchSelf[j] == 1)
if not (isSelfOnly and unit ~= "player") then
local spellName = HealBot_Buff_Spells[myClass][val]
local hasIt = hasBuff[spellName]
if not hasIt and HealBot_Buff_Equivalents[spellName] then
hasIt = hasBuff[HealBot_Buff_Equivalents[spellName]]
end
if not hasIt then
if myClass == "SHAMAN" and unit == "player" and string.find(spellName, " Weapon") then
hasIt = HealBot_CheckShamanWeaponBuff(spellName)
end
end
if not hasIt then
HealBot_MissingBuffs[unit] = spellName
break
end
end
end
end
end
end
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 = {
["Interface\\Icons\\Spell_Holy_Renew"] = true,
["Interface\\Icons\\Spell_Nature_Rejuvenation"] = true,
["Interface\\Icons\\Spell_Nature_ResistNature"] = true,
["Interface\\Icons\\Spell_Holy_PowerWordShield"] = true,
["Interface\\Icons\\Spell_Holy_SealOfProtection"] = true,
["Interface\\Icons\\Spell_Holy_Excorcism"] = true,
}
local i = 1;
while true do
local debuff, tmp, debuff_type = UnitDebuff(unit,i, 1)
if debuff then
if iconCount < 5 then
iconCount = iconCount + 1
HealBot_UnitIcons[unit][iconCount] = debuff
end
if HealBot_CDCInc[UnitClass(unit)]==1 and HealBot_DebuffWatch[debuff_type]=="YES" then
HealBot_UnitDebuff[unit]=debuff_type
DebuffType=debuff_type;
if HealBot_DebuffPriority[debuff_type] then
do break end
end
end
i = i + 1;
else
if i==1 then HealBot_UnitDebuff[unit] = nil; end
do break end
end
end
local b = 1
while true do
local buff = UnitBuff(unit, b)
if not buff then break end
if HealBot_TrackedHoTs[buff] and iconCount < 5 then
iconCount = iconCount + 1
HealBot_UnitIcons[unit][iconCount] = buff
end
b = b + 1
end
if HealBot_UnitDebuff[unit] then
if DebuffType and HealBot_Range_Check(unit, 27)==1 then
if HealBot_Config.ShowDebuffWarning==1 then
UIErrorsFrame:AddMessage(UnitName(unit).." suffers from "..DebuffType,
HealBot_Config.CDCBarColour[DebuffType].R,
HealBot_Config.CDCBarColour[DebuffType].G,
HealBot_Config.CDCBarColour[DebuffType].B,
1, UIERRORS_HOLD_TIME);
end
if HealBot_Config.SoundDebuffWarning==1 then HealBot_PlaySound(HealBot_Config.SoundDebuffPlay); end
end
end
HealBot_CheckBuffs(unit);
HealBot_RecalcHeals(unit);
end
end
function HealBot_OnEvent_PlayerRegenDisabled(this)
HealBot_RecalcParty();
if (UnitIsDeadOrGhost("player")) or (UnitOnTaxi("player")) then
if HealBot_Config.AutoClose==1 and HealBot_Config.ActionVisible~=0 then HealBot_Action:Hide(); end;
else
HealBot_Action:Show();
HealBot_IsFighting = true;
end
-- HealBot_RecalcHeals();
end
function HealBot_OnEvent_PlayerRegenEnabled(this)
HealBot_IsFighting = false;
Delay_RecalcParty=1;
end
function HealBot_OnEvent_PlayerTargetChanged(this)
HealBot_RecalcParty();
end
function HealBot_OnEvent_PartyMembersChanged(this)
Delay_RecalcParty=1;
end
function HealBot_OnEvent_PartyMemberDisable(this,unit)
HealBot_RecalcHeals();
end
function HealBot_OnEvent_SystemMsg(this,msg)
if type(msg)=="string" then
local tmpTest, tmpTest, deserter = string.find(msg, HB_HASLEFTRAID);
if not deserter then
local tmpTest, tmpTest, deserter = string.find(msg, HB_HASLEFTPARTY);
end
if deserter then
if (HealBot_Healers[deserter]) then
local tmpTest, unitname, heal_val, heal_valn
tmpTest,tmpTest,unitname,heal_val = string.find(HealBot_Healers[deserter], ">> (%a+) <<=>> (.%d+) <<" );
heal_valn=tonumber(heal_val)
HealBot_Healers[deserter]=nil;
HealBot_AddDebug("Healer "..deserter.." left the group - Last known activity was heal "..unitname.." for "..heal_val.." << trapped in event SystemMsg");
if heal_valn>0 and HealBot_HealsIn[unitname] then
HealBot_HealsIn[unitname] = HealBot_HealsIn[unitname] - heal_valn;
if HealBot_HealsIn[unitname] < 0 then
HealBot_HealsIn[unitname]=0;
end
end
end
elseif msg==HB_YOULEAVETHEGROUP or msg==HB_YOULEAVETHERAID then
Delay_RecalcParty=1;
else
-- find other messges
end
end
end
function HealBot_OnEvent_PartyMemberEnable(this,unit)
HealBot_RecalcHeals();
end
function HealBot_OnEvent_PlayerEquipmentChanged(this)
FlagEquipUpdate1=1;
end
function HealBot_OnEvent_PlayerEquipmentChanged2(this,unit)
if unit=="player" then
FlagEquipUpdate2=1;
end
end
function HealBot_OnEvent_SpellsChanged(this, arg1)
if arg1 then return; end
HealBot_AddDebug("HB: SpellsChanged");
InitSpells=2;
end
function HealBot_OnEvent_TalentsChanged(this, arg1)
HealBot_AddDebug("HB: TalentsChanged");
end
function HealBot_OnEvent_BagUpdate(this,bag)
if FlagEquipUpdate1==0 and FlagEquipUpdate2==0 then
HealBot_RecalcSpells();
end
end
function HealBot_OnEvent_BagUpdateCooldown(this,bag)
if not bag then
bag = "undef"
elseif FlagEquipUpdate1==0 and FlagEquipUpdate2==0 then
HealBot_RecalcSpells();
end
end
function HealBot_OnEvent_PlayerEnteringWorld(this)
HealBot_IsFighting = false;
end
function HealBot_OnEvent_SpellcastStart(this,spell,duration)
HealBot_IsCasting = true;
HealBot_RecalcHeals();
HealBot_CheckCasting();
if spell==HEALBOT_RESURRECTION or spell==HEALBOT_ANCESTRALSPIRIT or spell==HEALBOT_REBIRTH or spell==HEALBOT_REDEMPTION then
if UnitName("Target") then
HealBot_SendAddonMessage( "CTRA", "RES "..UnitName("Target"));
--HealBot_AddDebug("I am ressing "..UnitName("Target"))
HealBot_IamRessing=true;
end
end
end
function HealBot_OnEvent_SpellcastStop(this)
HealBot_IsCasting = false;
HealBot_StopCasting();
HealBot_RecalcHeals();
if HealBot_IamRessing then
HealBot_SendAddonMessage( "CTRA", "RESNO");
--HealBot_AddDebug("I finished ressing")
HealBot_IamRessing=false;
end
end
function HealBot_SpiBonus(spell)
local heals_modifer = 0;
local base, stat, posBuff, negBuff = UnitStat("player",5);
nameTalent, icon, tier, column, currRank, maxRank = GetTalentInfo(2,14); -- Spiritual guidence
spiGuideBonus = stat * 0.05;
heals_modifer = heals_modifer + (currRank * spiGuideBonus);
return heals_modifer;
end
function HealBot_GetBonus()
local HealBonus=HealBot_BonusScanner:GetBonus();
return HealBonus;
end
function HealBot_FindUnitID(unitname)
local text;
for _,unit in ipairs(HealBot_Action_HealGroup) do
text = UnitName(unit);
if text then
if text==unitname then
return unit;
end
end
end
for i=1,40 do
local unit = "raid"..i;
text = UnitName(unit);
if text then
if text==unitname then
return unit;
end
end
end
return nil;
end
function HealBot_PlaySound(id)
if id==1 then
PlaySoundFile("Sound\\Doodad\\BellTollTribal.wav");
elseif id==2 then
PlaySoundFile("Sound\\Spells\\Thorns.wav");
elseif id==3 then
PlaySoundFile("Sound\\Doodad\\BellTollNightElf.wav");
end
end
function HealBot_InitSpells()
local id = 1
local cnt = 0;
local class=HealBot_UnitClass("player")
HealBot_CurrentSpells = {};
while true do
local spell = HealBot_GetSpellName(id);
if not spell then
do break end
end
if (HealBot_Spells[spell]) then
HealBot_Spells[spell].id = id;
HealBot_InitGetSpellData(spell, id, class);
table.insert(HealBot_CurrentSpells,spell);
cnt = cnt + 1;
end
id = id + 1;
end
if class=="PRIEST" or class=="DRUID" or class=="PALADIN" or class=="SHAMAN" then
HealBot_AddChat("Initiated HealBot_CurrentSpells with ".. cnt .." Spells");
end
return cnt;
end
function HealBot_InitData()
HealBot_Skins = HealBot_Config.Skins;
if(CT_RegisterMod) then
CT_RegisterMod(HEALBOT_ADDON,"HealBot Options",5,"Interface\\AddOns\\HealBotBlue\\Images\\HealBot","Opens HealBot Options","off",nil,HealBot_ToggleOptions);
end
-- remove after 1.126
local tmp=HealBot_Config.ShowHeader[HealBot_Config.Current_Skin] or 0
HealBot_Config.ShowHeader[HealBot_Config.Current_Skin]=tmp
HealBot_Options_CDCMonitor_Reset()
HealBot_Options_EmergencyFilter_Reset()
HealBot_Options_Debuff_Reset()
end
function HealBot_ToggleOptions()
HealBot_TogglePanel(HealBot_Options)
end
function HealBot_InitGetSpellData(spell, id, class)
local i, _mana, _cast, _HealsMin, _HealsMax, _HealsExt, _duration, _range, _shield, _channel;
local tooltip = getglobal( "HealBot_ScanTooltip" );
local tmpText, line, tmpTest
if ( not spell ) then
return;
end
HealBot_ScanTooltip:SetOwner(HealBot_ScanTooltip, "ANCHOR_NONE")
HealBot_ScanTooltip:SetSpell( id, BOOKTYPE_SPELL );
tmpText = getglobal("HealBot_ScanTooltipTextLeft2");
if (tmpText:GetText()) then
line = tmpText:GetText();
tmpTest,tmpTest,_mana = string.find(line, HB_TOOLTIP_MANA );
else
HealBot_Report_Error( "================================" );
HealBot_Report_Error( "ERROR: HealBot_ScanTooltip is lost" );
HealBot_Report_Error( "ERROR: If BonusScanner is used, try disabling BonusScanner" );
end
tmpText = getglobal("HealBot_ScanTooltipTextRight2");
if (tmpText:GetText()) then
line = tmpText:GetText();
tmpTest,tmpTest,_range = string.find(line, HB_TOOLTIP_RANGE );
else
HealBot_Report_Error( "================================" );
HealBot_Report_Error( "ERROR: HealBot_ScanTooltip is lost" );
HealBot_Report_Error( "ERROR: If BonusScanner is used, try disabling BonusScanner" );
end
tmpText = getglobal("HealBot_ScanTooltipTextLeft3");
_cast = nil;
if (tmpText:GetText()) then
line = tmpText:GetText();
if ( line == HB_TOOLTIP_INSTANT_CAST ) then
_cast = 0;
elseif line == HB_TOOLTIP_CHANNELED then
_cast = 0;
elseif ( tmpText ) then
tmpTest,tmpTest,_cast = string.find(line, HB_TOOLTIP_CAST_TIME );
end
else
HealBot_Report_Error( "================================" );
HealBot_Report_Error( "ERROR: HealBot_ScanTooltip is lost" );
HealBot_Report_Error( "ERROR: If BonusScanner is used, try disabling BonusScanner" );
end
tmpText = getglobal("HealBot_ScanTooltipTextLeft4");
tmpTest = nil;
if (tmpText:GetText()) then
line = tmpText:GetText();
if class == "PRIEST" then
if strsub(spell, 0, 14) == strsub(HEALBOT_POWER_WORD_SHIELD, 0, 14) then
tmpTest,tmpTest,_HealsMin,_shield = string.find(line, HB_SPELL_PATTERN_SHIELD );
_HealsExt=0;
_HealsMax=_HealsMin;
elseif strsub(spell, 0, 4) == strsub(HEALBOT_RENEW, 0, 4) then
tmpTest,tmpTest,_HealsExt,tmpTest,_duration = string.find(line, HB_SPELL_PATTERN_RENEW );
_HealsMin=0;
_HealsMax=0;
if ( _HealsExt == nil ) then
tmpTest,tmpTest,_HealsExt,_duration = string.find(line, HB_SPELL_PATTERN_RENEW1 );
end
if ( _HealsExt == nil ) then
tmpTest,tmpTest,_duration,_HealsExt = string.find(line, HB_SPELL_PATTERN_RENEW2 );
end
if ( _HealsExt == nil ) then
tmpTest,tmpTest,_duration,_HealsExt = string.find(line, HB_SPELL_PATTERN_RENEW3 );
end
elseif strsub(spell, 0, 9) == strsub(HEALBOT_LESSER_HEAL, 0, 9) then
tmpTest,_HealsMin,_HealsMax = HealBot_Generic_Patten(line,HB_SPELL_PATTERN_LESSER_HEAL);
elseif strsub(spell, 0, 9) == strsub(HEALBOT_GREATER_HEAL, 0, 9) then
tmpTest,_HealsMin,_HealsMax = HealBot_Generic_Patten(line, HB_SPELL_PATTERN_GREATER_HEAL );
elseif strsub(spell, 0, 9) == strsub(HEALBOT_FLASH_HEAL, 0, 9) then
tmpTest,_HealsMin,_HealsMax = HealBot_Generic_Patten(line, HB_SPELL_PATTERN_FLASH_HEAL );
elseif strsub(spell, 0, 4) == strsub(HEALBOT_HEAL, 0, 4) then
tmpTest,_HealsMin,_HealsMax = HealBot_Generic_Patten(line, HB_SPELL_PATTERN_HEAL );
end
elseif class=="DRUID" then
if strsub(spell, 0, 6) == strsub(HEALBOT_REGROWTH, 0, 6) then
tmpTest,tmpTest,_HealsMin,_HealsMax,_HealsExt = string.find(line, HB_SPELL_PATTERN_REGROWTH );
if ( tmpTest == nil ) then
tmpTest,tmpTest,_HealsMin,_HealsMax,tmpTest,_HealsExt = string.find(line, HB_SPELL_PATTERN_REGROWTH1 );
end
elseif strsub(spell, 0, 9) == strsub(HEALBOT_REJUVENATION, 0, 9) then
tmpTest,tmpTest,_HealsExt,_duration = string.find(line, HB_SPELL_PATTERN_REJUVENATION );
_HealsMin=0;
_HealsMax=0;
if ( _HealsExt == nil ) then
tmpTest,tmpTest,_HealsExt,tmpTest,_duration = string.find(line, HB_SPELL_PATTERN_REJUVENATION1 );
end
elseif strsub(spell, 0, 7) == strsub(HEALBOT_HEALING_TOUCH, 0, 7) then
tmpTest,_HealsMin,_HealsMax = HealBot_Generic_Patten(line, HB_SPELL_PATTERN_HEALING_TOUCH );
end
elseif class=="PALADIN" then
if strsub(spell, 0, 9) == strsub(HEALBOT_HOLY_LIGHT, 0, 9) then
tmpTest,_HealsMin,_HealsMax = HealBot_Generic_Patten(line, HB_SPELL_PATTERN_HOLY_LIGHT );
elseif strsub(spell, 0, 9) == strsub(HEALBOT_FLASH_OF_LIGHT, 0, 9) then
tmpTest,_HealsMin,_HealsMax = HealBot_Generic_Patten(line, HB_SPELL_PATTERN_FLASH_OF_LIGHT );
end
elseif class=="SHAMAN" then
if strsub(spell, 0, 9) == strsub(HEALBOT_HEALING_WAVE, 0, 9) then
tmpTest,_HealsMin,_HealsMax = HealBot_Generic_Patten(line, HB_SPELL_PATTERN_HEALING_WAVE );
elseif strsub(spell, 0, 9) == strsub(HEALBOT_LESSER_HEALING_WAVE, 0, 9) then
tmpTest,_HealsMin,_HealsMax = HealBot_Generic_Patten(line, HB_SPELL_PATTERN_LESSER_HEALING_WAVE );
end
end
else
HealBot_Report_Error( "================================" );
HealBot_Report_Error( "ERROR: HealBot_ScanTooltip is lost" );
HealBot_Report_Error( "ERROR: If BonusScanner is used, try disabling BonusScanner" );
end
if ( _mana == nil ) then
HealBot_Report_Error( "================================" );
HealBot_Report_Error( "ERROR: _mana is NIL" );
HealBot_Report_Error( "ERROR: Spell: "..spell );
if HealBot_ScanTooltipTextLeft2:GetText() then
HealBot_Report_Error( "ERROR: Tooltip = >> "..HealBot_ScanTooltipTextLeft2:GetText().." <<" );
end
HealBot_Report_Error( "ERROR: Patten = >> "..HB_TOOLTIP_MANA.." <<" );
end
if ( _range == nil ) then
HealBot_Report_Error( "================================" );
HealBot_Report_Error( "ERROR: _range is NIL" );
HealBot_Report_Error( "ERROR: Spell: "..spell );
if HealBot_ScanTooltipTextRight2:GetText() then
HealBot_Report_Error( "ERROR: Tooltip = >> "..HealBot_ScanTooltipTextRight2:GetText().." <<" );
end
HealBot_Report_Error( "ERROR: Patten = >> "..HB_TOOLTIP_RANGE.." <<" );
end
if ( _cast == nil ) then
HealBot_Report_Error( "================================" );
HealBot_Report_Error( "ERROR: _cast is NIL" );
HealBot_Report_Error( "ERROR: Spell: "..spell );
if HealBot_ScanTooltipTextLeft3:GetText() then
HealBot_Report_Error( "ERROR: Tooltip = >> "..HealBot_ScanTooltipTextLeft3:GetText().." <<" );
end
HealBot_Report_Error( "ERROR: Patten = >> "..HB_TOOLTIP_CAST_TIME.." <<" );
end
if ( tmpTest == nil ) then
HealBot_Report_Error( "================================" );
HealBot_Report_Error( "ERROR: tmpTest == nil" );
HealBot_Report_Error( "ERROR: spell = "..spell );
if line then
HealBot_Report_Error( "ERROR: Tooltip = >> "..line.." <<" );
end
end
HealBot_Spells[spell].CastTime=tonumber(_cast);
HealBot_Spells[spell].Mana=tonumber(_mana);
HealBot_Spells[spell].Range=tonumber(_range);
HealBot_Spells[spell].HealsMin=tonumber(_HealsMin);
HealBot_Spells[spell].HealsMax=tonumber(_HealsMax);
if _HealsExt then
HealBot_Spells[spell].HealsExt=tonumber(_HealsExt);
end
if _duration then
HealBot_Spells[spell].Duration=tonumber(_duration);
end
if _shield then
HealBot_Spells[spell].Shield=tonumber(_shield);
end
if _channel then
HealBot_Spells[spell].Channel=tonumber(_channel);
end
if not HealBot_Spells[spell].Target then
HealBot_Spells[spell].Target = {"player","party","pet"};
end
if not HealBot_Spells[spell].Price then
HealBot_Spells[spell].Price = 0;
end
if not HealBot_Spells[spell].Channel then
HealBot_Spells[spell].Channel = HealBot_Spells[spell].CastTime;
end
if not HealBot_Spells[spell].Duration then
HealBot_Spells[spell].Duration = HealBot_Spells[spell].Channel;
end
if not HealBot_Spells[spell].RealHealing then
HealBot_Spells[spell].RealHealing=0;
end
HealBot_Spells[spell].HealsCast = (HealBot_Spells[spell].HealsMin+HealBot_Spells[spell].HealsMax)/2;
if not HealBot_Spells[spell].HealsExt then
HealBot_Spells[spell].HealsExt = 0;
end
end
function HealBot_Generic_Patten(matchStr,matchPattern)
local tmpTest,_HealsMin,_HealsMax,_HealsExt,_duration
tmpTest,tmpTest,_HealsMin,_HealsMax = string.find(matchStr, matchPattern );
if ( tmpTest == nil ) then
HealBot_Report_Error( "================================" );
HealBot_Report_Error( "ERROR: tmpTest == nil" );
HealBot_Report_Error( "ERROR: pattern = "..matchPattern );
HealBot_Report_Error( "ERROR: Tooltip = >> "..matchStr.." <<" );
end
return tmpTest,_HealsMin,_HealsMax;
end
function HealBot_Get_DebugChan()
local index = GetChannelName("HBmsg");
if (index>0) then
return index;
else
return nil;
end
end
function HealBot_Range_Check(unit, range)
local return_val = 0;
if not range then
range=40;
end
if ( unit=="player" ) then
return_val = 1;
elseif ( UnitIsVisible(unit) == 1) then
local tx, ty = GetPlayerMapPosition(unit)
local dist
if tx > 0 or ty > 0 then
local px, py = GetPlayerMapPosition("player")
dist = sqrt((px - tx)^2 + (py - ty)^2)
if dist > _scale and (px > 0 or py > 0) then
if (CheckInteractDistance(unit, 4)) then
_scale = dist
end
end
if dist <=(_scale*range/27) then
return_val=1
end
else
if (HealBot_Config.QualityRange == 1) or range <= 27 then
if ( CheckInteractDistance(unit, 4) ) then
return_val = 1;
end
else
return_val = 1;
end
end
end
return return_val;
end
--------------------------------------------------------------------------------
-- Native Action Bar Hovercasting (Mouseover Hook)
--------------------------------------------------------------------------------
do
local pass = function() end
local orig = UseAction
function UseAction(slot, checkCursor, onSelf)
if HealBot_Config.ActionMouseover == 1 then
local mouseover = HealBot_Action_TooltipUnit
if mouseover and mouseover ~= 'target' then
local _PlaySound = PlaySound
local target = UnitName("target")
PlaySound = pass
ClearTarget()
PlaySound = _PlaySound
do
local autoSelfCast = GetCVar("autoSelfCast")
SetCVar("autoSelfCast", "0") -- Ensure disabled
orig(slot, checkCursor, onSelf)
if autoSelfCast then
SetCVar("autoSelfCast", autoSelfCast)
end
end
SpellTargetUnit(mouseover)
if target then
PlaySound = pass
TargetLastTarget()
PlaySound = _PlaySound
end
return
end
end
orig(slot, checkCursor, onSelf)
end
end