diff --git a/HealBotBlue.toc b/HealBotBlue.toc
index 62d9942..b61b6eb 100644
--- a/HealBotBlue.toc
+++ b/HealBotBlue.toc
@@ -3,7 +3,7 @@
## Version: 1.5.1
## Author: Bluewhale
## Notes: Adds panel with skinable bars for healing and decursive
-## SavedVariables: HealBot_Config
+## SavedVariablesPerCharacter: HealBot_Config
..\..\FrameXML\Fonts.xml
..\..\FrameXML\OptionsFrameTemplates.xml
..\..\FrameXML\UIPanelTemplates.xml
@@ -27,3 +27,4 @@ HealBot_Options_CDC.xml
HealBot_Options_Skins.xml
HealBot_Options_Buffs.xml
HealBot_Options_Chat.xml
+HealBot_Options_Auto.xml
diff --git a/HealBot_Controller_Aura.lua b/HealBot_Controller_Aura.lua
index 9ae5d5e..9dee3c1 100644
--- a/HealBot_Controller_Aura.lua
+++ b/HealBot_Controller_Aura.lua
@@ -2,6 +2,7 @@
-- Handles tracking buffs/debuffs (auras) on group/raid units
HealBot_MissingBuffs = {}
+local StaticHasBuff = {}
function HealBot_UnitAffected(unit, effect)
if not effect then return nil; end
@@ -68,7 +69,10 @@ function HealBot_CheckBuffs(unit)
}
-- Gather buffs on unit
- local hasBuff = {}
+ local hasBuff = StaticHasBuff
+ for k in pairs(hasBuff) do
+ hasBuff[k] = nil
+ end
local i = 1
while true do
local buffTexture = UnitBuff(unit, i)
@@ -91,7 +95,7 @@ function HealBot_CheckBuffs(unit)
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
+ if not (isSelfOnly and not UnitIsUnit(unit, "player")) then
local spellName = HealBot_Buff_Spells[myClass][val]
local hasIt = hasBuff[spellName]
@@ -100,7 +104,7 @@ function HealBot_CheckBuffs(unit)
end
if not hasIt then
- if myClass == "SHAMAN" and unit == "player" and string.find(spellName, " Weapon") then
+ if myClass == "SHAMAN" and UnitIsUnit(unit, "player") and string.find(spellName, " Weapon") then
hasIt = HealBot_CheckShamanWeaponBuff(spellName)
end
end
@@ -123,6 +127,7 @@ local HealBot_TrackedHoTs = {
["Interface\\Icons\\Spell_Holy_SealOfProtection"] = true,
["Interface\\Icons\\Spell_Holy_Excorcism"] = true,
["Interface\\Icons\\btnholyscriptures"] = true,
+ ["Interface\\Icons\\Spell_Holy_AshesToAshes"] = true,
}
function HealBot_OnEvent_UnitAura(this, unit)
@@ -144,7 +149,7 @@ function HealBot_OnEvent_UnitAura(this, unit)
iconCount = iconCount + 1
HealBot_UnitIcons[unit][iconCount] = debuff
end
- if HealBot_CDCInc[UnitClass(unit)] == 1 and HealBot_DebuffWatch[debuff_type] == "YES" then
+ if HealBot_CDCInc[UnitClass(unit)] == 1 and HealBot_DebuffWatch[debuff_type] then
HealBot_UnitDebuff[unit] = debuff_type
DebuffType = debuff_type;
if HealBot_DebuffPriority[debuff_type] then
@@ -168,6 +173,17 @@ function HealBot_OnEvent_UnitAura(this, unit)
end
b = b + 1
end
+
+ local d = 1
+ while true do
+ local debuff = UnitDebuff(unit, d)
+ if not debuff then break end
+ if HealBot_TrackedHoTs[debuff] and iconCount < 5 then
+ iconCount = iconCount + 1
+ HealBot_UnitIcons[unit][iconCount] = debuff
+ end
+ d = d + 1
+ end
if HealBot_UnitDebuff[unit] then
if DebuffType and HealBot_Range_Check(unit, 27) == 1 then
diff --git a/HealBot_Controller_Events.lua b/HealBot_Controller_Events.lua
index 122b32f..c10d4b2 100644
--- a/HealBot_Controller_Events.lua
+++ b/HealBot_Controller_Events.lua
@@ -30,9 +30,7 @@ function HealBot_OnLoad(this)
end)
HealBot_Model:RegisterObserver("EQUIPMENT_CHANGED", function(unitID)
if unitID == "player" then
- HealBot_BonusScanner:ScanEquipment()
- HealBot_CalcEquipBonus = true;
- HealBot_RecalcSpells();
+ HealBot_EquipChangeTimer = 1
end
end)
end
@@ -43,17 +41,20 @@ end
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
+ local s = IsShiftKeyDown() and true or false
+ local c = IsControlKeyDown() and true or false
+ local a = IsAltKeyDown() and true or false
- if HealBot_LastModState ~= currentModState then
- HealBot_LastModState = currentModState
+ if HealBot_LastModS ~= s or HealBot_LastModC ~= c or HealBot_LastModA ~= a then
+ HealBot_LastModS = s
+ HealBot_LastModC = c
+ HealBot_LastModA = a
HealBot_Action_RefreshTooltip(HealBot_Action_TooltipUnit)
end
else
- HealBot_LastModState = ""
+ HealBot_LastModS = false
+ HealBot_LastModC = false
+ HealBot_LastModA = false
end
if HealBot_TargetRestorePending then
@@ -73,10 +74,20 @@ function HealBot_OnUpdate(this, arg1)
end
-- Process Dirty Queue for MVC View
- if next(HealBot_View_DirtyUnits) ~= nil then
- for unitID in pairs(HealBot_View_DirtyUnits) do
- HealBot_Action_RefreshButtons(unitID)
- HealBot_View_DirtyUnits[unitID] = nil
+ local unitID, _ = next(HealBot_View_DirtyUnits)
+ while unitID do
+ HealBot_Action_RefreshButtons(unitID)
+ HealBot_View_DirtyUnits[unitID] = nil
+ unitID, _ = next(HealBot_View_DirtyUnits)
+ end
+
+ if HealBot_EquipChangeTimer > 0 then
+ HealBot_EquipChangeTimer = HealBot_EquipChangeTimer - arg1
+ if HealBot_EquipChangeTimer <= 0 then
+ HealBot_EquipChangeTimer = 0
+ HealBot_BonusScanner:ScanEquipment()
+ HealBot_CalcEquipBonus = true;
+ HealBot_RecalcSpells();
end
end
@@ -85,20 +96,12 @@ function HealBot_OnUpdate(this, arg1)
if not HealBot_IsFighting then
HealsIn_Timer = HealsIn_Timer + 1;
if HealsIn_Timer >= 10 then
- HealBot_HealsIn = {};
- HealBot_Healers = {};
+ for k in pairs(HealBot_HealsIn) do HealBot_HealsIn[k] = nil end
+ for k in pairs(HealBot_Healers) do HealBot_Healers[k] = nil end
HealsIn_Timer = 0;
end
- if HealBot_EquipChangeTimer > 0 then
- HealBot_EquipChangeTimer = HealBot_EquipChangeTimer - arg1
- if HealBot_EquipChangeTimer <= 0 then
- HealBot_EquipChangeTimer = 0
- HealBot_BonusScanner:ScanEquipment()
- HealBot_CalcEquipBonus = true;
- HealBot_RecalcSpells();
- end
- end
+
if HealBot_SpellsInitFlag > 1 then
HealBot_SpellsInitFlag = HealBot_SpellsInitFlag + 1;
@@ -131,32 +134,28 @@ local HealBot_EventHandlers = {
HealBot_OnEvent_UnitHealth(this, arg1)
end,
["UNIT_MANA"] = function(this, arg1)
+ if arg1 ~= "player" and HealBot_Config.ShowManaBars == 0 then return end
if HealBot_Model:UpdateUnitPower(arg1) then
HealBot_Model:NotifyObservers("UNIT_POWER_CHANGED", arg1)
end
- if (arg1 == "player") then HealBot_RecalcHeals(); end
- HealBot_Action_RefreshButtons(arg1);
end,
["UNIT_RAGE"] = function(this, arg1)
+ if arg1 ~= "player" and HealBot_Config.ShowManaBars == 0 then return end
if HealBot_Model:UpdateUnitPower(arg1) then
HealBot_Model:NotifyObservers("UNIT_POWER_CHANGED", arg1)
end
- if (arg1 == "player") then HealBot_RecalcHeals(); end
- HealBot_Action_RefreshButtons(arg1);
end,
["UNIT_ENERGY"] = function(this, arg1)
+ if arg1 ~= "player" and HealBot_Config.ShowManaBars == 0 then return end
if HealBot_Model:UpdateUnitPower(arg1) then
HealBot_Model:NotifyObservers("UNIT_POWER_CHANGED", arg1)
end
- if (arg1 == "player") then HealBot_RecalcHeals(); end
- HealBot_Action_RefreshButtons(arg1);
end,
["UNIT_DISPLAYPOWER"] = function(this, arg1)
+ if arg1 ~= "player" and HealBot_Config.ShowManaBars == 0 then return end
if HealBot_Model:UpdateUnitPower(arg1) then
HealBot_Model:NotifyObservers("UNIT_POWER_CHANGED", arg1)
end
- if (arg1 == "player") then HealBot_RecalcHeals(); end
- HealBot_Action_RefreshButtons(arg1);
end,
["UNIT_AURA"] = function(this, arg1)
HealBot_Model:MarkAuraChanged(arg1)
@@ -201,8 +200,6 @@ local HealBot_EventHandlers = {
["SPELLCAST_FAILED"] = function(this) HealBot_OnEvent_SpellcastStop(this, "SPELLCAST_FAILED") end,
["PLAYER_REGEN_DISABLED"] = function(this) HealBot_OnEvent_PlayerRegenDisabled(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"] = function(this, arg1) HealBot_OnEvent_BagUpdate(this, arg1) end,
["PARTY_MEMBER_DISABLE"] = function(this, arg1) HealBot_OnEvent_PartyMemberDisable(this, arg1) end,
["PARTY_MEMBER_ENABLE"] = function(this, arg1) HealBot_OnEvent_PartyMemberEnable(this, arg1) end,
["CHAT_MSG_SYSTEM"] = function(this, arg1) HealBot_OnEvent_SystemMsg(this, arg1) end,
@@ -212,11 +209,10 @@ local HealBot_EventHandlers = {
HealBot_OnEvent_PlayerEquipmentChanged(this)
end,
["UNIT_INVENTORY_CHANGED"] = function(this, arg1)
+ if arg1 ~= "player" then return end
HealBot_Model:NotifyObservers("EQUIPMENT_CHANGED", arg1)
HealBot_OnEvent_PlayerEquipmentChanged2(this, arg1)
end,
- ["PET_BAR_SHOWGRID"] = function(this) HealBot_OnEvent_PartyMembersChanged(this) end,
- ["PET_BAR_HIDEGRID"] = function(this) HealBot_OnEvent_PartyMembersChanged(this) end,
["UNIT_PET"] = function(this, arg1) HealBot_OnEvent_PartyMembersChanged(this) end,
["SPELLS_CHANGED"] = function(this, arg1) HealBot_OnEvent_SpellsChanged(this, arg1) end,
["UPDATE_SHAPESHIFT_FORM"] = function(this) HealBot_UpdateShapeshiftForm() end,
@@ -288,8 +284,6 @@ function HealBot_OnEvent_VariablesLoaded(this)
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_PET");
this:RegisterEvent("UNIT_HEALTH");
this:RegisterEvent("UNIT_MANA");
@@ -301,8 +295,6 @@ function HealBot_OnEvent_VariablesLoaded(this)
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("UPDATE_INVENTORY_ALERTS");
this:RegisterEvent("UNIT_INVENTORY_CHANGED");
@@ -321,7 +313,6 @@ 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
@@ -338,7 +329,7 @@ function HealBot_OnEvent_ZoneChanged(this)
end
function HealBot_OnEvent_PlayerRegenDisabled(this)
- HealBot_RecalcParty();
+ -- Removed HealBot_RecalcParty();
if (UnitIsDeadOrGhost("player")) or (UnitOnTaxi("player")) then
if HealBot_Config.AutoClose==1 and HealBot_Config.ActionVisible~=0 then
HealBot_Action.ProgrammaticHide = true;
@@ -374,11 +365,14 @@ end
function HealBot_OnEvent_PlayerRegenEnabled(this)
HealBot_IsFighting = false;
- HealBot_Delay_RecalcParty = 1;
+ -- Removed HealBot_Delay_RecalcParty = 1;
end
function HealBot_OnEvent_PlayerTargetChanged(this)
- HealBot_RecalcParty();
+ if HealBot_Action_UnitButtons and HealBot_Action_UnitButtons["target"] then
+ HealBot_View_DirtyUnits["target"] = true
+ HealBot_OnEvent_UnitAura(nil, "target");
+ end
end
function HealBot_OnEvent_PartyMembersChanged(this)
@@ -439,20 +433,6 @@ function HealBot_OnEvent_TalentsChanged(this, arg1)
HealBot_AddDebug("HB: TalentsChanged");
end
-function HealBot_OnEvent_BagUpdate(this, bag)
- if HealBot_EquipChangeTimer == 0 then
- HealBot_RecalcSpells();
- end
-end
-
-function HealBot_OnEvent_BagUpdateCooldown(this, bag)
- if not bag then
- bag = "undef"
- elseif HealBot_EquipChangeTimer == 0 then
- HealBot_RecalcSpells();
- end
-end
-
function HealBot_OnEvent_PlayerEnteringWorld(this)
HealBot_IsFighting = false;
-- Re-apply the refresh hook late in case another addon overrode it during load
diff --git a/HealBot_Controller_Spells.lua b/HealBot_Controller_Spells.lua
index 97f9dd9..5c6bde5 100644
--- a/HealBot_Controller_Spells.lua
+++ b/HealBot_Controller_Spells.lua
@@ -246,7 +246,7 @@ function HealBot_CheckCasting(unit)
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 not bar.txt then bar.txt = getglobal(bar:GetName() .. "_text") end
if HealBot_IsCasting == false and HealBot_AbortButton == 0 then
bar:SetStatusBarColor(ar, ag, ab, 0);
@@ -462,7 +462,8 @@ end
function HealBot_CanCastSpell(spell, unit)
local this = HealBot_Spells[spell];
- if this.Mana > UnitMana("player") then return false end;
+ -- Removed manual mana check so WoW can properly handle 0-cost buffs (Clearcasting/Inner Focus)
+ -- and so tooltips can render in red instead of disappearing.
if this.BagSlot then
local bag, slot = HealBot_UnpackBagSlot(this.BagSlot);
local start, duration, enable = GetContainerItemCooldown(bag, slot);
@@ -592,9 +593,7 @@ function HealBot_InitSpells()
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
diff --git a/HealBot_Data.lua b/HealBot_Data.lua
index 6915aa6..86d1b4c 100644
--- a/HealBot_Data.lua
+++ b/HealBot_Data.lua
@@ -2,6 +2,20 @@ HealBot_ConfigDefaults = {
ShowManaBars=0,
ManaBarsHealersOnly=0,
Version = HEALBOT_VERSION,
+ AutoSwap_Enabled = 0,
+ AutoSwap_Profiles = {
+ [1] = HEALBOT_SKINS_STD,
+ [2] = HEALBOT_SKINS_STD,
+ [3] = HEALBOT_SKINS_STD,
+ [4] = HEALBOT_SKINS_STD,
+ [5] = HEALBOT_SKINS_STD,
+ },
+ bmaxrows = {
+ [HEALBOT_SKINS_STD] = 0,
+ },
+ GridOrientation = {
+ [HEALBOT_SKINS_STD] = 1,
+ },
AlertLevel = 0.95,
AutoClose = 1,
PanelSounds = 1,
@@ -181,7 +195,17 @@ HealBot_ConfigDefaults = {
Current_Skin = "Modern Flat",
Skin_ID = 1,
Skins = {"Modern Flat", HEALBOT_SKINS_STD, "HealBot Party", "HealBot Raid", "Alteric Valley"},
+ AutoSwap_Enabled = 0,
+ AutoSwap_Profiles = {
+ [1] = "Modern Flat", -- Solo
+ [2] = "HealBot Party", -- Party (2-5)
+ [3] = "HealBot Raid", -- Raid 15 (6-15)
+ [4] = "HealBot Raid", -- Raid 25 (16-25)
+ [5] = "HealBot Raid", -- Raid 40 (26-40)
+ },
numcols = {[HEALBOT_SKINS_STD] = 1, ["HealBot Party"] = 1, ["HealBot Raid"] = 4, ["Alteric Valley"] = 2, ["Modern Flat"] = 1},
+ bmaxrows = {[HEALBOT_SKINS_STD] = 0, ["HealBot Party"] = 0, ["HealBot Raid"] = 0, ["Alteric Valley"] = 0, ["Modern Flat"] = 0},
+ GridOrientation = {[HEALBOT_SKINS_STD] = 1, ["HealBot Party"] = 1, ["HealBot Raid"] = 1, ["Alteric Valley"] = 1, ["Modern Flat"] = 1},
btexture = {[HEALBOT_SKINS_STD] = 8,["HealBot Party"] = 6, ["HealBot Raid"] = 7, ["Alteric Valley"] = 9, ["Modern Flat"] = 10},
bcspace = {[HEALBOT_SKINS_STD] = 4, ["HealBot Party"] = 4, ["HealBot Raid"] = 2, ["Alteric Valley"] = 2, ["Modern Flat"] = 4},
brspace = {[HEALBOT_SKINS_STD] = 1, ["HealBot Party"] = 2, ["HealBot Raid"] = 2, ["Alteric Valley"] = 1, ["Modern Flat"] = 2},
@@ -545,7 +569,7 @@ HealBot_Debuff_Types = {
HealBot_IsFighting = false;
HealBot_DebuffPriority = {"none"};
-HealBot_DebuffWatch = {[HEALBOT_DISEASE_en]="NO", [HEALBOT_MAGIC_en]="NO", [HEALBOT_POISON_en]="NO", [HEALBOT_CURSE_en]="NO"};
+HealBot_DebuffWatch = {[HEALBOT_DISEASE_en]=false, [HEALBOT_MAGIC_en]=false, [HEALBOT_POISON_en]=false, [HEALBOT_CURSE_en]=false};
HealBot_Heals = {};
diff --git a/HealBot_Localization.en.lua b/HealBot_Localization.en.lua
index c635178..8afa9ab 100644
--- a/HealBot_Localization.en.lua
+++ b/HealBot_Localization.en.lua
@@ -1,4 +1,4 @@
-HEALBOT_VERSION = GetAddOnMetadata("HealBotBlue", "Version") or "Unknown";
+HEALBOT_VERSION = GetAddOnMetadata("HealBotBlue", "Version");
-------------
-- ENGLISH --
diff --git a/HealBot_Options.lua b/HealBot_Options.lua
index 0a30e9c..9a974cc 100644
--- a/HealBot_Options.lua
+++ b/HealBot_Options.lua
@@ -234,7 +234,7 @@ function HealBot_Options_OnLoad(this)
table.insert(UISpecialFrames,this:GetName());
-- Tabs
- PanelTemplates_SetNumTabs(this,7);
+ PanelTemplates_SetNumTabs(this,8);
this.selectedTab = 1;
PanelTemplates_UpdateTabs(this);
HealBot_Options_ShowPanel(this.selectedTab);
@@ -314,6 +314,8 @@ function HealBot_Options_SetSkins()
HealBot_Options_BarHeightS:SetValue(HealBot_Config.bheight[HealBot_Config.Current_Skin])
HealBot_Options_BarWidthS:SetValue(HealBot_Config.bwidth[HealBot_Config.Current_Skin])
HealBot_Options_BarNumColsS:SetValue(HealBot_Config.numcols[HealBot_Config.Current_Skin])
+ HealBot_Options_BarMaxRowsS:SetValue((HealBot_Config.bmaxrows and HealBot_Config.bmaxrows[HealBot_Config.Current_Skin]) or 0)
+ HealBot_Options_GridOrientation:SetChecked(((HealBot_Config.GridOrientation and HealBot_Config.GridOrientation[HealBot_Config.Current_Skin]) == 2) and 1 or nil)
HealBot_Options_BarBRSpaceS:SetValue(HealBot_Config.brspace[HealBot_Config.Current_Skin])
HealBot_Options_BarBCSpaceS:SetValue(HealBot_Config.bcspace[HealBot_Config.Current_Skin])
HealBot_Options_FramePaddingS:SetValue((HealBot_Config.bpadding and HealBot_Config.bpadding[HealBot_Config.Current_Skin]) or 10)
diff --git a/HealBot_Options.xml b/HealBot_Options.xml
index 31db38a..6380dd1 100644
--- a/HealBot_Options.xml
+++ b/HealBot_Options.xml
@@ -94,7 +94,7 @@
-
+
@@ -206,38 +206,16 @@
-