diff --git a/HealBotBlue.toc b/HealBotBlue.toc
index 39c4310..39b405a 100644
--- a/HealBotBlue.toc
+++ b/HealBotBlue.toc
@@ -1,6 +1,6 @@
## Interface: 11200
## Title: HealBotBlue
-## Version: 1.6.0
+## Version: 1.6.2
## Author: Bluewhale
## Notes: Adds panel with skinable bars for healing and decursive
## SavedVariablesPerCharacter: HealBot_Config
diff --git a/HealBot_Action.xml b/HealBot_Action.xml
index d744213..8cfd040 100644
--- a/HealBot_Action.xml
+++ b/HealBot_Action.xml
@@ -232,6 +232,15 @@
+
+
+
+
+
+
+
+
+
@@ -243,6 +252,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/HealBot_Controller_Events.lua b/HealBot_Controller_Events.lua
index c10d4b2..ab094dd 100644
--- a/HealBot_Controller_Events.lua
+++ b/HealBot_Controller_Events.lua
@@ -181,6 +181,16 @@ local HealBot_EventHandlers = {
HealBot_Model:NotifyObservers("ROSTER_CHANGED")
HealBot_OnEvent_PartyMembersChanged(this)
end,
+ ["RAID_ROSTER_UPDATE"] = function(this)
+ for _, unit in ipairs(HealBot_Model.partyMembers) do
+ HealBot_Model:RefreshUnit(unit)
+ end
+ for _, unit in ipairs(HealBot_Model.raidMembers) do
+ HealBot_Model:RefreshUnit(unit)
+ end
+ HealBot_Model:NotifyObservers("ROSTER_CHANGED")
+ HealBot_OnEvent_PartyMembersChanged(this)
+ end,
["PLAYER_ENTERING_WORLD"] = function(this)
HealBot_Model:RefreshUnit("player")
HealBot_Model:RefreshUnit("pet")
@@ -282,6 +292,7 @@ function HealBot_OnEvent_VariablesLoaded(this)
this:RegisterEvent("PLAYER_REGEN_ENABLED");
this:RegisterEvent("PLAYER_TARGET_CHANGED");
this:RegisterEvent("PARTY_MEMBERS_CHANGED");
+ this:RegisterEvent("RAID_ROSTER_UPDATE");
this:RegisterEvent("PARTY_MEMBER_DISABLE");
this:RegisterEvent("PARTY_MEMBER_ENABLE");
this:RegisterEvent("UNIT_PET");
@@ -365,7 +376,7 @@ end
function HealBot_OnEvent_PlayerRegenEnabled(this)
HealBot_IsFighting = false;
- -- Removed HealBot_Delay_RecalcParty = 1;
+ HealBot_Delay_RecalcParty = 1;
end
function HealBot_OnEvent_PlayerTargetChanged(this)
diff --git a/HealBot_Controller_Spells.lua b/HealBot_Controller_Spells.lua
index 5c6bde5..2205af4 100644
--- a/HealBot_Controller_Spells.lua
+++ b/HealBot_Controller_Spells.lua
@@ -608,47 +608,47 @@ function HealBot_InitGetSpellData(spell, id, class)
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, HEALBOT_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");
+ _mana = 0;
+ _range = 40;
+ _cast = 0;
+ line = nil;
+
+ for lineNum = 2, 6 do
+ local lText = getglobal("HealBot_ScanTooltipTextLeft"..lineNum);
+ if lText and lText:IsVisible() and lText:GetText() then
+ local txt = lText:GetText();
+ local t1, t2, match;
+ t1, t2, match = string.find(txt, HEALBOT_TOOLTIP_MANA);
+ if match then _mana = match; end
+
+ if txt == HEALBOT_TOOLTIP_INSTANT_CAST or txt == "Instant" then
+ _cast = 0;
+ elseif txt == HEALBOT_TOOLTIP_CHANNELED then
+ _cast = 0;
+ else
+ t1, t2, match = string.find(txt, HEALBOT_TOOLTIP_CAST_TIME);
+ if match then _cast = match; end
+ end
+
+ t1, t2, match = string.find(txt, HEALBOT_TOOLTIP_RANGE);
+ if match then _range = match; end
+
+ if not string.find(txt, HEALBOT_TOOLTIP_MANA) and txt ~= HEALBOT_TOOLTIP_INSTANT_CAST and txt ~= "Instant" and txt ~= HEALBOT_TOOLTIP_CHANNELED and not string.find(txt, HEALBOT_TOOLTIP_CAST_TIME) and not string.find(txt, HEALBOT_TOOLTIP_RANGE) then
+ if not line then line = txt; end
+ end
+ end
+
+ local rText = getglobal("HealBot_ScanTooltipTextRight"..lineNum);
+ if rText and rText:IsVisible() and rText:GetText() then
+ local txt = rText:GetText();
+ local t1, t2, match;
+ t1, t2, match = string.find(txt, HEALBOT_TOOLTIP_RANGE);
+ if match then _range = match; end
+ end
end
- tmpText = getglobal("HealBot_ScanTooltipTextRight2");
- if (tmpText:GetText()) then
- line = tmpText:GetText();
- tmpTest, tmpTest, _range = string.find(line, HEALBOT_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 == HEALBOT_TOOLTIP_INSTANT_CAST) then
- _cast = 0;
- elseif line == HEALBOT_TOOLTIP_CHANNELED then
- _cast = 0;
- elseif (tmpText) then
- tmpTest, tmpTest, _cast = string.find(line, HEALBOT_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 line then
if class == "PRIEST" then
if string.sub(spell, 1, 14) == string.sub(HEALBOT_POWER_WORD_SHIELD, 1, 14) then
tmpTest, tmpTest, _HealsMin, _shield = string.find(line, HEALBOT_SPELL_PATTERN_SHIELD);
diff --git a/HealBot_View_Layout.lua b/HealBot_View_Layout.lua
index b174810..5e85306 100644
--- a/HealBot_View_Layout.lua
+++ b/HealBot_View_Layout.lua
@@ -109,6 +109,11 @@ function HealBot_Action_EnableButton(button)
local maxhlth = state.maxHealth
local name = state.name
if not name then name = UnitName(unit) end -- fallback
+
+ if not name or name == "Unknown" then
+ button:Hide()
+ return
+ end
local bar = HealBot_Action_HealthBar(button);
local bar2 = HealBot_Action_HealthBar2(button);
@@ -402,6 +407,7 @@ function HealBot_Action_SetHealButton(index, unit)
return nil
end
local button = getglobal("HealBot_Action_HealUnit" .. index);
+ if not button then return nil end
button.unit = unit;
if unit then
table.insert(HealBot_Action_HealButtons, button);
@@ -414,8 +420,12 @@ function HealBot_Action_SetHealButton(index, unit)
end
function HealBot_Action_PartyChanged()
- if not HealBot_IsFighting then
- local numBars = 0;
+ if HealBot_IsFighting then
+ HealBot_Action_AppendNewUnits()
+ return
+ end
+
+ local numBars = 0;
local numHeaders = 0;
local TempMaxH = 0;
local HeaderPos = {};
@@ -466,10 +476,7 @@ function HealBot_Action_PartyChanged()
local checked_end = 0;
headerno = 0;
- for j = 1, 41 do
- HealBot_Action_SetHealButton(j, nil);
- end
- for j = 51, 60 do
+ for j = 1, 100 do
HealBot_Action_SetHealButton(j, nil);
end
HealBot_Action_SetHealButton();
@@ -628,6 +635,9 @@ function HealBot_Action_PartyChanged()
else
for _, unit in ipairs(HealBot_Action_HealGroup) do
if not HealBot_Action_UnitButtons[unit] and HealBot_MayHeal(unit) then
+ local name = UnitName(unit) or "not known"
+ local class = UnitClass(unit) or "not known"
+ local subgroup = 1
if HealBot_Config.ExtraOrder == 1 then
order[unit] = name;
elseif HealBot_Config.ExtraOrder == 2 then
@@ -726,6 +736,9 @@ function HealBot_Action_PartyChanged()
else
for _, unit in ipairs(HealBot_Action_HealGroup) do
if not HealBot_Action_UnitButtons[unit] and HealBot_MayHeal(unit) then
+ local name = UnitName(unit) or "not known"
+ local class = UnitClass(unit) or "not known"
+ local subgroup = 1
if HealBot_Config.ExtraOrder == 1 then
order[unit] = name;
elseif HealBot_Config.ExtraOrder == 2 then
@@ -901,6 +914,16 @@ function HealBot_Action_PartyChanged()
end
end
+ HealBot_Grid_LastI = i;
+ HealBot_Grid_LastH = h;
+ HealBot_Grid_LastZ = z;
+ HealBot_Grid_OffsetX = OffsetX;
+ HealBot_Grid_OffsetY = OffsetY;
+ HealBot_Grid_MaxOffsetX = MaxOffsetX;
+ HealBot_Grid_MaxOffsetY = MaxOffsetY;
+ HealBot_Grid_Limit = limit;
+ HealBot_Grid_NumBars = numBars;
+
if HealBot_Config.HideOptions == 1 then
HealBot_Action_OptionsButton:Hide();
else
@@ -945,7 +968,6 @@ function HealBot_Action_PartyChanged()
if HealBot_Config.HideParty == 1 and HidePartyFrame then
HidePartyFrame();
end
- end
HealBot_Action_RefreshButtons();
HealBot_Action_ShowFrame();
end
@@ -995,3 +1017,129 @@ function HealBot_Action_Refresh(unit)
end
end
end
+function HealBot_Action_AppendUnit(unit)
+ if not HealBot_Grid_LastI then return end
+ if HealBot_Grid_LastI >= 100 then return end
+
+ HealBot_Grid_LastI = HealBot_Grid_LastI + 1
+ HealBot_Grid_NumBars = HealBot_Grid_NumBars + 1
+
+ local button = HealBot_Action_SetHealButton(HealBot_Grid_LastI, unit)
+ if not button then return end
+
+ local orientation = (HealBot_Config.GridOrientation and HealBot_Config.GridOrientation[HealBot_Config.Current_Skin]) or 1
+ local bwidth = (HealBot_Config.bwidth and HealBot_Config.bwidth[HealBot_Config.Current_Skin]) or 85
+ local bheight = (HealBot_Config.bheight and HealBot_Config.bheight[HealBot_Config.Current_Skin]) or 18
+ local bcspace = (HealBot_Config.bcspace and HealBot_Config.bcspace[HealBot_Config.Current_Skin]) or 3
+ local brspace = (HealBot_Config.brspace and HealBot_Config.brspace[HealBot_Config.Current_Skin]) or 3
+ local bpadding = (HealBot_Config.bpadding and HealBot_Config.bpadding[HealBot_Config.Current_Skin]) or 10
+
+ if orientation == 1 then
+ HealBot_Grid_OffsetY = HealBot_Action_PositionButton(button, HealBot_Grid_OffsetX, HealBot_Grid_OffsetY, bwidth, bheight, false, nil)
+ if HealBot_Grid_LastH == HealBot_Grid_Limit then
+ HealBot_Grid_LastH = 0
+ if HealBot_Grid_MaxOffsetY < HealBot_Grid_OffsetY then HealBot_Grid_MaxOffsetY = HealBot_Grid_OffsetY end
+ HealBot_Grid_OffsetY = bpadding
+ HealBot_Grid_OffsetX = HealBot_Grid_OffsetX + bwidth + bcspace
+ end
+ else
+ HealBot_Grid_OffsetX = HealBot_Action_PositionButtonHorizontal(button, HealBot_Grid_OffsetX, HealBot_Grid_OffsetY, bwidth, bheight, false, nil)
+ if HealBot_Grid_LastH == HealBot_Grid_Limit then
+ HealBot_Grid_LastH = 0
+ if HealBot_Grid_MaxOffsetX < HealBot_Grid_OffsetX then HealBot_Grid_MaxOffsetX = HealBot_Grid_OffsetX end
+ HealBot_Grid_OffsetX = bpadding
+ HealBot_Grid_OffsetY = HealBot_Grid_OffsetY + bheight + brspace
+ end
+ end
+
+ HealBot_Grid_LastH = HealBot_Grid_LastH + 1
+ HealBot_Grid_LastZ = HealBot_Grid_LastZ + 1
+
+ local bar = HealBot_Action_HealthBar(button)
+ local bar2 = HealBot_Action_HealthBar2(button)
+ bar.txt = getglobal(bar:GetName() .. "_text")
+ bar:SetHeight(bheight)
+ local btexture = (HealBot_Config.btexture and HealBot_Config.btexture[HealBot_Config.Current_Skin]) or 5
+ HealBot_Action_SetTexture(bar, btexture)
+ local btextheight = (HealBot_Config.btextheight and HealBot_Config.btextheight[HealBot_Config.Current_Skin]) or 10
+ bar.txt:SetTextHeight(btextheight)
+ bar2:SetHeight(bheight)
+ HealBot_Action_SetTexture(bar2, btexture)
+
+ local totalOffsetX = HealBot_Grid_OffsetX
+ local totalOffsetY = HealBot_Grid_OffsetY
+ if orientation == 1 then
+ if HealBot_Grid_MaxOffsetY < totalOffsetY then HealBot_Grid_MaxOffsetY = totalOffsetY end
+ totalOffsetY = HealBot_Grid_MaxOffsetY
+ else
+ if HealBot_Grid_MaxOffsetX < totalOffsetX then HealBot_Grid_MaxOffsetX = totalOffsetX end
+ totalOffsetX = HealBot_Grid_MaxOffsetX
+ totalOffsetY = totalOffsetY + bheight + brspace
+ end
+
+ HealBot_Action_SetHeightWidth(totalOffsetX, totalOffsetY + bpadding, bwidth)
+end
+function HealBot_Action_AppendNewUnits()
+ if not HealBot_Grid_LastI then return end
+
+ local unitsToCheck = {}
+
+ -- Gather units based on config, similar to PartyChanged
+ if HealBot_Config.GroupHeals == 1 then
+ for _, unit in ipairs(HealBot_Action_HealGroup) do
+ table.insert(unitsToCheck, unit)
+ end
+ end
+
+ if HealBot_Config.TankHeals == 1 and GetNumRaidMembers() > 0 and CT_RA_MainTanks then
+ for j = 1, 10 do
+ if CT_RA_MainTanks[j] then
+ for k = 1, GetNumRaidMembers() do
+ local unit = "raid" .. k
+ if UnitName(unit) == CT_RA_MainTanks[j] then
+ table.insert(unitsToCheck, unit)
+ end
+ end
+ end
+ end
+ end
+
+ if HealBot_Config.TargetHeals == 1 then
+ for _, unit in ipairs(HealBot_Action_HealTarget) do
+ table.insert(unitsToCheck, unit)
+ end
+ table.insert(unitsToCheck, "target")
+ end
+
+ if HealBot_Config.EmergencyHeals == 1 then
+ if GetNumRaidMembers() > 0 then
+ for j = 1, 40 do
+ table.insert(unitsToCheck, "raid" .. j)
+ end
+ else
+ for j = 1, 4 do
+ table.insert(unitsToCheck, "party" .. j)
+ end
+ table.insert(unitsToCheck, "player")
+ end
+ end
+
+ if HealBot_Config.PetHeals == 1 then
+ if GetNumRaidMembers() > 0 then
+ for j = 1, 40 do
+ table.insert(unitsToCheck, "raidpet" .. j)
+ end
+ else
+ for j = 1, 4 do
+ table.insert(unitsToCheck, "partypet" .. j)
+ end
+ table.insert(unitsToCheck, "pet")
+ end
+ end
+
+ for _, unit in ipairs(unitsToCheck) do
+ if not HealBot_Action_UnitButtons[unit] and HealBot_MayHeal(unit) then
+ HealBot_Action_AppendUnit(unit)
+ end
+ end
+end
diff --git a/README.md b/README.md
index 89d1812..eb5874e 100644
--- a/README.md
+++ b/README.md
@@ -47,7 +47,8 @@ Default installation path: `C:\Program Files\World of Warcraft\Interface\AddOns\
### Change Log
**v1.6.1**
-* **Hotfix** - With class colours toggled extra frames for player pets were given some classy mint colour.
+* **Hotfix - pet frames** - With class colours toggled extra frames for player pets were given some classy mint colour.
+* **Hotfi - raidframes in combat** - Modfied how frames behave when player leaves during combat.
**v1.6**
* **Event Loop Decoupling:** Ripped out redundant synchronous UI redraws that were bypassed by the new MVC architecture. High-frequency events (mana regen, health ticks) now fully rely on the `HealBot_OnUpdate` dirty queue, severely reducing CPU bottlenecks.
diff --git a/Talents.md b/Talents.md
new file mode 100644
index 0000000..583181a
--- /dev/null
+++ b/Talents.md
@@ -0,0 +1,40 @@
+Druid:
+Name - Rank - Effect
+Genesis - 1 - increase damage and healing of periodic spells by 5%
+Genesis - 2 - increase damage and healing of periodic spells by 10%
+Genesis - 3 -increase damage and healing of periodic spells by 15%
+
+Gift of Nature - 1- Increases effectivenes of all healing spells by 2%
+Gift of Nature - 2- Increases effectivenes of all healing spells by 4%
+Gift of Nature - 3- Increases effectivenes of all healing spells by 6%
+Gift of Nature - 4- Increases effectivenes of all healing spells by 8%
+Gift of Nature - 5- Increases effectivenes of all healing spells by 10%
+
+Preservation - 1 - Increases the periodic healing of Regrowth by 10% if target is affected by Rejuvenation
+Preservation - 2 - Increases the periodic healing of Regrowth by 20% if target is affected by Rejuvenation
+Preservation - 3 - Increases the periodic healing of Regrowth by 30% if target is affected by Rejuvenation
+
+Paladin:
+
+Healing Light - 1 - Increases the amount of healed by Holy Light, Flash of Light and Holy Shock by 4%
+Healing Light - 2 - Increases the amount of healed by Holy Light, Flash of Light and Holy Shock by 8%
+Healing Light - 3 - Increases the amount of healed by Holy Light, Flash of Light and Holy Shock by 12%
+
+Ironclad - 1 - Improves healing done by 1% of current armour from items
+Ironclad - 2 - Improves healing done by 2% of current armour from items
+
+Priest:
+
+Improved Renew - 1 - Improves amount healed by renew by 5%
+Improved Renew - 2 - Improves amount healed by renew by 10%
+Improved Renew - 3 - Improves amount healed by renew by 15%
+
+Spiritual Healing - 1 - Improves amount healed by all healing spells by 6%
+Spiritual Healing - 2 - Improves amount healed by all healing spells by 12%
+Spiritual Healing - 3 - Improves amount healed by all healing spells by 18%
+Spiritual Healing - 4 - Improves amount healed by all healing spells by 24%
+Spiritual Healing - 5 - Improves amount healed by all healing spells by 30%
+
+Shaman:
+
+none
\ No newline at end of file