mirror of
https://github.com/Bluewhale1337/HealBotBlue.git
synced 2026-09-11 18:00:20 +00:00
Compare commits
23 Commits
2aaa53a9e6
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 2958bc8e94 | |||
| 4486682568 | |||
| 27231aaf99 | |||
| 56b55f34ad | |||
| 135a8f6bcd | |||
| 7f5b1afe23 | |||
| 00a1ddf789 | |||
| 74e940f41c | |||
| 98b34f24b8 | |||
| 604a26dbb3 | |||
| 03114d4802 | |||
| a0b6e2f72d | |||
| 7d910eadd2 | |||
| 1ef79cfcd1 | |||
| 1f9d3af81e | |||
| e9cfd2fcc7 | |||
| 7c45d85030 | |||
| 92a4cb070a | |||
| 2af99cbc2b | |||
| ebb42f936a | |||
| 04519b9631 | |||
| 3ebcecb8e6 | |||
| b0195b30b9 |
+2
-2
@@ -1,8 +1,8 @@
|
||||
## Interface: 11200
|
||||
## Title: HealBotBlue
|
||||
## Version: 1.7.0
|
||||
## Version: 1.7.1
|
||||
## Author: Bluewhale
|
||||
## Notes: Adds panel with skinable bars for healing and decursive
|
||||
## Notes: Raidframe replacement for healing, decursing, resource tracking and buffing with optional support for SuperWow, ClassicAPI, UnitXP_SP3 and Nampower.
|
||||
## SavedVariablesPerCharacter: HealBot_Config
|
||||
..\..\FrameXML\Fonts.xml
|
||||
..\..\FrameXML\OptionsFrameTemplates.xml
|
||||
|
||||
+1
-1
@@ -50,7 +50,7 @@
|
||||
<Texture name="$parentRaidIcon" file="Interface\TargetingFrame\UI-RaidTargetingIcons" hidden="true">
|
||||
<Size><AbsDimension x="14" y="14"/></Size>
|
||||
<Anchors>
|
||||
<Anchor point="CENTER">
|
||||
<Anchor point="TOP">
|
||||
<Offset><AbsDimension x="0" y="0"/></Offset>
|
||||
</Anchor>
|
||||
</Anchors>
|
||||
|
||||
@@ -159,6 +159,7 @@ local HealBot_TrackedHoTs = {
|
||||
}
|
||||
|
||||
local HealBot_DebuffTypeMap = nil
|
||||
local HealBot_AuraWarningPlayed = {}
|
||||
|
||||
-- HealBot_OnEvent_UnitAura: Updates debuff lists and icon textures on aura change.
|
||||
function HealBot_OnEvent_UnitAura(this, unit)
|
||||
@@ -276,7 +277,9 @@ function HealBot_OnEvent_UnitAura(this, unit)
|
||||
end
|
||||
|
||||
if HealBot_UnitDebuff[unit] then
|
||||
if DebuffType and HealBot_Range_Check(unit, 27) == 1 then
|
||||
if DebuffType and HealBot_Range_Check(unit, 40) == 1 then
|
||||
if HealBot_AuraWarningPlayed[unit] ~= DebuffType then
|
||||
HealBot_AuraWarningPlayed[unit] = DebuffType
|
||||
if HealBot_Config.ShowDebuffWarning == 1 then
|
||||
local color = HealBot_Config.CDCBarColour[DebuffType]
|
||||
local r, g, b = 1, 0, 0
|
||||
@@ -290,6 +293,9 @@ function HealBot_OnEvent_UnitAura(this, unit)
|
||||
if HealBot_Config.SoundDebuffWarning == 1 then HealBot_PlaySound(HealBot_Config.SoundDebuffPlay); end
|
||||
end
|
||||
end
|
||||
else
|
||||
HealBot_AuraWarningPlayed[unit] = nil
|
||||
end
|
||||
-- Check buffs synchronously because tooltip scanning fails in OnUpdate
|
||||
HealBot_CheckBuffs(unit)
|
||||
|
||||
|
||||
@@ -71,33 +71,119 @@ function HealBot_SendAddonMessage(prefix, text)
|
||||
end
|
||||
end
|
||||
|
||||
if not HealBot_IncomingHealers then HealBot_IncomingHealers = {} end
|
||||
|
||||
-- Reusable global array for gfind string splitting
|
||||
if not HealBot_Comms_Args then HealBot_Comms_Args = {} end
|
||||
|
||||
local function ClearIncomingHeal(sender)
|
||||
local data = HealBot_IncomingHealers[sender]
|
||||
if not data then return end
|
||||
local oldAmount = data.amount
|
||||
for i=1, 5 do
|
||||
local oldTarget = data.targets[i]
|
||||
if oldTarget then
|
||||
if HealBot_HealsIn[oldTarget] then
|
||||
HealBot_HealsIn[oldTarget] = HealBot_HealsIn[oldTarget] - oldAmount
|
||||
if HealBot_HealsIn[oldTarget] < 0 then HealBot_HealsIn[oldTarget] = 0 end
|
||||
HealBot_RecalcHeals(HealBot_FindUnitID(oldTarget))
|
||||
end
|
||||
data.targets[i] = nil
|
||||
end
|
||||
end
|
||||
data.amount = 0
|
||||
end
|
||||
|
||||
local function SetIncomingHeal(sender, amount, protocol, t1, t2, t3, t4, t5)
|
||||
-- prioritize HealComm over HealBot protocol to avoid double-counting
|
||||
if HealBot_IncomingHealers[sender] and HealBot_IncomingHealers[sender].protocol == "HealComm" and protocol == "HealBot" then
|
||||
return
|
||||
end
|
||||
|
||||
if not HealBot_IncomingHealers[sender] then
|
||||
HealBot_IncomingHealers[sender] = { targets = {}, amount = 0, protocol = protocol }
|
||||
end
|
||||
|
||||
ClearIncomingHeal(sender)
|
||||
|
||||
local data = HealBot_IncomingHealers[sender]
|
||||
data.protocol = protocol
|
||||
|
||||
if amount > 0 and t1 then
|
||||
data.amount = amount
|
||||
data.targets[1] = t1
|
||||
data.targets[2] = t2
|
||||
data.targets[3] = t3
|
||||
data.targets[4] = t4
|
||||
data.targets[5] = t5
|
||||
|
||||
for i=1, 5 do
|
||||
local target = data.targets[i]
|
||||
if target then
|
||||
if not HealBot_HealsIn[target] then HealBot_HealsIn[target] = 0 end
|
||||
HealBot_HealsIn[target] = HealBot_HealsIn[target] + amount
|
||||
HealBot_RecalcHeals(HealBot_FindUnitID(target))
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- HealBot_OnEvent_AddonMsg: Parses incoming heal data from other clients.
|
||||
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 sender_id == UnitName("player") then return end
|
||||
if not HealBot_HealsIn[unitname] then
|
||||
HealBot_HealsIn[unitname] = 0;
|
||||
|
||||
if addon_id == "HealComm" then
|
||||
-- Clear reusable args array
|
||||
for i=1, 10 do HealBot_Comms_Args[i] = nil end
|
||||
local argCount = 0
|
||||
for word in string.gfind(inc_msg, "[^/]+") do
|
||||
argCount = argCount + 1
|
||||
HealBot_Comms_Args[argCount] = word
|
||||
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;
|
||||
local cmd = HealBot_Comms_Args[1]
|
||||
|
||||
if cmd == "Heal" and HealBot_Comms_Args[2] and HealBot_Comms_Args[3] then
|
||||
SetIncomingHeal(sender_id, tonumber(HealBot_Comms_Args[3]) or 0, "HealComm", HealBot_Comms_Args[2])
|
||||
elseif cmd == "Healstop" then
|
||||
SetIncomingHeal(sender_id, 0, "HealComm")
|
||||
elseif cmd == "GrpHeal" and HealBot_Comms_Args[2] then
|
||||
SetIncomingHeal(sender_id, tonumber(HealBot_Comms_Args[2]) or 0, "HealComm", HealBot_Comms_Args[4], HealBot_Comms_Args[5], HealBot_Comms_Args[6], HealBot_Comms_Args[7], HealBot_Comms_Args[8])
|
||||
elseif cmd == "GrpHealstop" then
|
||||
SetIncomingHeal(sender_id, 0, "HealComm")
|
||||
elseif cmd == "Resurrection" then
|
||||
if HealBot_Comms_Args[2] == "stop" then
|
||||
HealBot_AddDebug(sender_id .. " Stopped ressing");
|
||||
for unit, resser in pairs(HealBot_Ressing) do
|
||||
if resser == sender_id then
|
||||
HealBot_Ressing[unit] = nil;
|
||||
HealBot_RecalcHeals(HealBot_FindUnitID(unit));
|
||||
end
|
||||
end
|
||||
elseif HealBot_Comms_Args[2] and HealBot_Comms_Args[3] == "start" then
|
||||
HealBot_AddDebug(sender_id .. " is ressing " .. HealBot_Comms_Args[2]);
|
||||
HealBot_Ressing[HealBot_Comms_Args[2]] = sender_id;
|
||||
HealBot_RecalcHeals(HealBot_FindUnitID(HealBot_Comms_Args[2]));
|
||||
end
|
||||
end
|
||||
|
||||
elseif addon_id == HEALBOT_ADDON_ID then
|
||||
local tmpTest, tmpTest, unitname, heal_val = string.find(inc_msg, ">> (.-) <<=>> (.-) <<" );
|
||||
if heal_val and unitname then
|
||||
local amount = tonumber(heal_val) or 0
|
||||
if amount < 0 then amount = 0 end -- HealBot sends negative to cancel
|
||||
SetIncomingHeal(sender_id, amount, "HealBot", unitname)
|
||||
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+) <<=>> (.+)");
|
||||
tmpTest, tmpTest, datatype, sender, datamsg = string.find(inc_msg, ">> (.-) <<=>> (.-) <<=>> (.+)");
|
||||
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 ( string.sub(inc_msg, 1, 3) == "RES" ) then
|
||||
if ( inc_msg == "RESNO" ) then
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
|
||||
HealBot_View_DirtyUnits = {}
|
||||
HealBot_View_DirtyPower = {}
|
||||
local unitsToRefresh = {}
|
||||
local powerToRefresh = {}
|
||||
local HealBot_Timer1, HealsIn_Timer = 0, 0;
|
||||
HealBot_LastModState = ""
|
||||
|
||||
@@ -152,7 +154,7 @@ function HealBot_OnUpdate(this, arg1)
|
||||
end
|
||||
|
||||
-- Process Dirty Queue for MVC View
|
||||
local unitsToRefresh = {}
|
||||
for k in pairs(unitsToRefresh) do unitsToRefresh[k] = nil end
|
||||
for unitID in pairs(HealBot_View_DirtyUnits) do
|
||||
unitsToRefresh[unitID] = true
|
||||
HealBot_View_DirtyUnits[unitID] = nil
|
||||
@@ -162,7 +164,7 @@ function HealBot_OnUpdate(this, arg1)
|
||||
HealBot_Action_Refresh(unitID)
|
||||
end
|
||||
|
||||
local powerToRefresh = {}
|
||||
for k in pairs(powerToRefresh) do powerToRefresh[k] = nil end
|
||||
for unitID in pairs(HealBot_View_DirtyPower) do
|
||||
powerToRefresh[unitID] = true
|
||||
HealBot_View_DirtyPower[unitID] = nil
|
||||
@@ -298,9 +300,6 @@ local HealBot_EventHandlers = {
|
||||
["PLAYER_ENTERING_WORLD"] = function(this)
|
||||
HealBot_Model:RefreshUnit("player")
|
||||
HealBot_Model:RefreshUnit("pet")
|
||||
if HealBot_UnitClass("player") == "DRUID" then
|
||||
HealBot_UpdateShapeshiftForm()
|
||||
end
|
||||
HealBot_OnEvent_PlayerEnteringWorld(this)
|
||||
end,
|
||||
["VARIABLES_LOADED"] = function(this)
|
||||
@@ -329,9 +328,7 @@ local HealBot_EventHandlers = {
|
||||
HealBot_OnEvent_PlayerEquipmentChanged2(this, arg1)
|
||||
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,
|
||||
["UPDATE_SHAPESHIFT_FORMS"] = function(this) HealBot_UpdateShapeshiftForm() end
|
||||
["SPELLS_CHANGED"] = function(this, arg1) HealBot_OnEvent_SpellsChanged(this, arg1) end
|
||||
}
|
||||
|
||||
-- HealBot_OnEvent: Event dispatcher for WoW UI events.
|
||||
@@ -348,18 +345,19 @@ 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
|
||||
if type(val) == "table" and type(HealBot_Config[key]) == "table" then
|
||||
for k, v in pairs(val) do
|
||||
if HealBot_Config[key][k] == nil then
|
||||
HealBot_Config[key][k] = v
|
||||
local function DeepCopyMissing(src, dest)
|
||||
for k, v in pairs(src) do
|
||||
if type(v) == "table" then
|
||||
if type(dest[k]) ~= "table" then dest[k] = {} end
|
||||
DeepCopyMissing(v, dest[k])
|
||||
else
|
||||
if dest[k] == nil then
|
||||
dest[k] = v
|
||||
end
|
||||
end
|
||||
end
|
||||
end);
|
||||
end
|
||||
DeepCopyMissing(HealBot_ConfigDefaults, HealBot_Config)
|
||||
|
||||
local foundModern = false
|
||||
if HealBot_Config.Skins then
|
||||
@@ -420,11 +418,6 @@ function HealBot_OnEvent_VariablesLoaded(this)
|
||||
this:RegisterEvent("CHAT_MSG_ADDON");
|
||||
this:RegisterEvent("CHAT_MSG_SYSTEM");
|
||||
this:RegisterEvent("PLAYER_ENTERING_WORLD");
|
||||
if class == "DRUID" then
|
||||
this:RegisterEvent("UPDATE_SHAPESHIFT_FORM");
|
||||
this:RegisterEvent("UPDATE_SHAPESHIFT_FORMS");
|
||||
HealBot_UpdateShapeshiftForm();
|
||||
end
|
||||
HealBot_SpellsInitFlag = 2;
|
||||
end
|
||||
end
|
||||
@@ -490,6 +483,14 @@ end
|
||||
function HealBot_OnEvent_PlayerRegenEnabled(this)
|
||||
HealBot_IsFighting = false;
|
||||
HealBot_Delay_RecalcParty = 1;
|
||||
|
||||
if HealBot_IncomingHealers then
|
||||
for sender, data in pairs(HealBot_IncomingHealers) do
|
||||
if not HealBot_FindUnitID(sender) then
|
||||
HealBot_IncomingHealers[sender] = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- HealBot_OnEvent_PlayerTargetChanged: Internal utility: HealBot_OnEvent_PlayerTargetChanged
|
||||
|
||||
@@ -159,6 +159,7 @@ function HealBot_Process_HealValue(spell, target)
|
||||
local uname = UnitName(target)
|
||||
if uname then
|
||||
HealBot_SendAddonMessage(HEALBOT_ADDON_ID, ">> " .. uname .. " <<=>> " .. HealBot_HealValue .. " << ");
|
||||
HealBot_SendAddonMessage("HealComm", "Heal/" .. uname .. "/" .. HealBot_HealValue .. "/1500/");
|
||||
if not HealBot_HealsIn[uname] then
|
||||
HealBot_HealsIn[uname] = 0;
|
||||
end
|
||||
@@ -217,6 +218,7 @@ function HealBot_StopCasting()
|
||||
local uname = UnitName(HealBot_CastingTarget)
|
||||
if uname then
|
||||
HealBot_SendAddonMessage(HEALBOT_ADDON_ID, ">> " .. uname .. " <<=>> " .. 0 - HealBot_HealValue .. " << ");
|
||||
HealBot_SendAddonMessage("HealComm", "Healstop");
|
||||
if HealBot_HealsIn[uname] then
|
||||
HealBot_HealsIn[uname] = HealBot_HealsIn[uname] - HealBot_HealValue;
|
||||
if HealBot_HealsIn[uname] < 0 then
|
||||
@@ -857,10 +859,7 @@ function HealBot_Generic_Patten(matchStr, matchPattern)
|
||||
return tmpTest, _HealsMin, _HealsMax;
|
||||
end
|
||||
|
||||
-- HealBot_UpdateShapeshiftForm: Called on UPDATE_SHAPESHIFT_FORM
|
||||
function HealBot_UpdateShapeshiftForm()
|
||||
-- Deprecated
|
||||
end
|
||||
|
||||
|
||||
-- HealBot_GetShapeshiftForm: Detects active druid form to prevent invalid casts.
|
||||
function HealBot_GetShapeshiftForm()
|
||||
@@ -870,9 +869,18 @@ function HealBot_GetShapeshiftForm()
|
||||
for i=1,forms do
|
||||
local icon,name,active = GetShapeshiftFormInfo(i);
|
||||
if active then
|
||||
if icon then
|
||||
local icon_lower = string.lower(icon)
|
||||
-- Exclude non-standard/custom forms like Tree of Life from unshifting
|
||||
if not string.find(icon_lower, "humanoidform") and not string.find(icon_lower, "treeoflife") and not string.find(icon_lower, "healingway") and not string.find(icon_lower, "stoneclawtotem") then
|
||||
return i;
|
||||
end
|
||||
else
|
||||
return i;
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
return nil;
|
||||
end
|
||||
|
||||
|
||||
@@ -264,11 +264,6 @@ HealBot_ConfigDefaults = {
|
||||
|
||||
HealBot_Config = {};
|
||||
|
||||
--HealBot_EmergIncMelee = {};
|
||||
--HealBot_EmergIncRange = {};
|
||||
--HealBot_EmergIncHealers = {};
|
||||
--HealBot_EmergIncCustom = {};
|
||||
--HealBot_KeyCombo = {};
|
||||
HealBot_HealsIn = {};
|
||||
HealBot_Healers = {};
|
||||
HealBot_UnitDebuff = {};
|
||||
|
||||
@@ -36,6 +36,7 @@ function HealBot_Integrations_Toggle()
|
||||
HealBot_NampowerFrame:RegisterEvent("AURA_CAST_ON_OTHER")
|
||||
HealBot_NampowerFrame:SetScript("OnEvent", function()
|
||||
if not HealBot_Integrations_Nampower_Active then return end
|
||||
if event == "AURA_CAST_ON_SELF" or event == "AURA_CAST_ON_OTHER" then
|
||||
local spellID, caster, target, _, _, _, _, duration = arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8
|
||||
if not caster or not target or duration <= 0 then return end
|
||||
|
||||
@@ -53,6 +54,7 @@ function HealBot_Integrations_Toggle()
|
||||
if unitID then
|
||||
HealBot_OnEvent_UnitAura(nil, unitID)
|
||||
end
|
||||
end
|
||||
end)
|
||||
end
|
||||
else
|
||||
|
||||
+32
-8
@@ -1,6 +1,13 @@
|
||||
-- HealBot_Model.lua
|
||||
-- Centralized Data Store and Observer System for HealBotBlue
|
||||
|
||||
local pool_oldGUIDs = {}
|
||||
local pool_newUnitForGUID = {}
|
||||
local pool_stateSwaps = {}
|
||||
local pool_iconSwaps = {}
|
||||
local pool_missingBuffSwaps = {}
|
||||
local pool_debuffSwaps = {}
|
||||
|
||||
-- Safe local wrappers to prevent native UIDropDownMenu concatenation crashes
|
||||
-- when setting selected values on closed dropdowns during initialization.
|
||||
function HealBot_UIDropDownMenu_SetSelectedID(frame, id, useValue)
|
||||
@@ -180,14 +187,16 @@ end
|
||||
function HealBot_Model:PreserveStateByGUID()
|
||||
if not (HealBot_Integrations_SuperWoW_Active or HealBot_Integrations_ClassicAPI_Active) or not HealBot_GetUnitGUID then return end
|
||||
|
||||
local oldGUIDs = {}
|
||||
for k in pairs(pool_oldGUIDs) do pool_oldGUIDs[k] = nil end
|
||||
local oldGUIDs = pool_oldGUIDs
|
||||
for unit, guid in pairs(self.unitGUIDs) do
|
||||
if string.find(unit, "^party") or string.find(unit, "^raid") or unit == "player" or unit == "pet" then
|
||||
oldGUIDs[unit] = guid
|
||||
end
|
||||
end
|
||||
|
||||
local newUnitForGUID = {}
|
||||
for k in pairs(pool_newUnitForGUID) do pool_newUnitForGUID[k] = nil end
|
||||
local newUnitForGUID = pool_newUnitForGUID
|
||||
-- Scan the new roster
|
||||
for _, unit in ipairs(self.partyMembers) do
|
||||
local guid = HealBot_GetUnitGUID(unit)
|
||||
@@ -206,10 +215,14 @@ function HealBot_Model:PreserveStateByGUID()
|
||||
end
|
||||
end
|
||||
|
||||
local stateSwaps = {}
|
||||
local iconSwaps = {}
|
||||
local missingBuffSwaps = {}
|
||||
local debuffSwaps = {}
|
||||
for k in pairs(pool_stateSwaps) do pool_stateSwaps[k] = nil end
|
||||
local stateSwaps = pool_stateSwaps
|
||||
for k in pairs(pool_iconSwaps) do pool_iconSwaps[k] = nil end
|
||||
local iconSwaps = pool_iconSwaps
|
||||
for k in pairs(pool_missingBuffSwaps) do pool_missingBuffSwaps[k] = nil end
|
||||
local missingBuffSwaps = pool_missingBuffSwaps
|
||||
for k in pairs(pool_debuffSwaps) do pool_debuffSwaps[k] = nil end
|
||||
local debuffSwaps = pool_debuffSwaps
|
||||
|
||||
for oldUnit, guid in pairs(oldGUIDs) do
|
||||
local newUnit = newUnitForGUID[guid]
|
||||
@@ -231,11 +244,22 @@ function HealBot_Model:PreserveStateByGUID()
|
||||
|
||||
for targetUnit, stateData in pairs(stateSwaps) do
|
||||
-- Deep copy to prevent memory aliasing
|
||||
self.units[targetUnit] = {}
|
||||
if not self.units[targetUnit] then
|
||||
self.units[targetUnit] = { icons = {} }
|
||||
end
|
||||
|
||||
local targetIcons = self.units[targetUnit].icons
|
||||
if not targetIcons then targetIcons = {} end
|
||||
for k in pairs(targetIcons) do targetIcons[k] = nil end
|
||||
|
||||
for k in pairs(self.units[targetUnit]) do self.units[targetUnit][k] = nil end
|
||||
|
||||
for k, v in pairs(stateData) do
|
||||
if k ~= "icons" then
|
||||
self.units[targetUnit][k] = v
|
||||
end
|
||||
self.units[targetUnit].icons = {}
|
||||
end
|
||||
self.units[targetUnit].icons = targetIcons
|
||||
|
||||
if HealBot_UnitIcons and iconSwaps[targetUnit] then
|
||||
if not HealBot_UnitIcons[targetUnit] then HealBot_UnitIcons[targetUnit] = {} end
|
||||
|
||||
+12
-4
@@ -234,10 +234,18 @@ end
|
||||
-- HealBot_Options_Defaults_OnClick: UI handler for OnClick options panel.
|
||||
function HealBot_Options_Defaults_OnClick(this)
|
||||
HealBot_Options_CastNotify_OnClick(nil,0);
|
||||
-- HealBot_Config = HealBot_ConfigDefaults;
|
||||
table.foreach(HealBot_ConfigDefaults, function (key,val)
|
||||
HealBot_Config[key] = val;
|
||||
end);
|
||||
HealBot_Config = {}
|
||||
local function DeepCopy(src, dest)
|
||||
for k, v in pairs(src) do
|
||||
if type(v) == "table" then
|
||||
dest[k] = {}
|
||||
DeepCopy(v, dest[k])
|
||||
else
|
||||
dest[k] = v
|
||||
end
|
||||
end
|
||||
end
|
||||
DeepCopy(HealBot_ConfigDefaults, HealBot_Config)
|
||||
HealBot_Options_OnShow(HealBot_Options);
|
||||
HealBot_RecalcSpells();
|
||||
HealBot_Action_Reset();
|
||||
|
||||
+7
-25
@@ -45,9 +45,9 @@ function HealBot_WarningSound_OnClick(this,id)
|
||||
end
|
||||
-- HealBot_Options_CDCMonitor_DropDown: UI handler for DropDown options panel.
|
||||
function HealBot_Options_CDCMonitor_DropDown()
|
||||
for i=1, getn(HealBot_Options_CDCMonitor_List), 1 do
|
||||
for i=1, getn(HealBot_Options_EmergencyFilter_List), 1 do
|
||||
local info = {};
|
||||
info.text = HealBot_Options_CDCMonitor_List[i];
|
||||
info.text = HealBot_Options_EmergencyFilter_List[i];
|
||||
info.func = HealBot_Options_CDCMonitor_OnSelect;
|
||||
UIDropDownMenu_AddButton(info);
|
||||
end
|
||||
@@ -85,7 +85,7 @@ function HealBot_Options_CDCMonitor_Reset()
|
||||
HealBot_CDCInc[HEALBOT_SHAMAN] = 0;
|
||||
HealBot_CDCInc[HEALBOT_WARLOCK] = 0;
|
||||
HealBot_CDCInc[HEALBOT_WARRIOR] = 0;
|
||||
if HealBot_Config.CDCMonitor==2 then
|
||||
if HealBot_Config.CDCMonitor==1 then
|
||||
HealBot_CDCInc[HEALBOT_DRUID] = 1;
|
||||
HealBot_CDCInc[HEALBOT_HUNTER] = 1;
|
||||
HealBot_CDCInc[HEALBOT_MAGE] = 1;
|
||||
@@ -95,25 +95,7 @@ function HealBot_Options_CDCMonitor_Reset()
|
||||
HealBot_CDCInc[HEALBOT_SHAMAN] = 1;
|
||||
HealBot_CDCInc[HEALBOT_WARLOCK] = 1;
|
||||
HealBot_CDCInc[HEALBOT_WARRIOR] = 1;
|
||||
elseif HealBot_Config.CDCMonitor==3 then
|
||||
HealBot_CDCInc[HEALBOT_DRUID] = 1;
|
||||
elseif HealBot_Config.CDCMonitor==4 then
|
||||
HealBot_CDCInc[HEALBOT_HUNTER] = 1;
|
||||
elseif HealBot_Config.CDCMonitor==5 then
|
||||
HealBot_CDCInc[HEALBOT_MAGE] = 1;
|
||||
elseif HealBot_Config.CDCMonitor==6 then
|
||||
HealBot_CDCInc[HEALBOT_PALADIN] = 1;
|
||||
elseif HealBot_Config.CDCMonitor==7 then
|
||||
HealBot_CDCInc[HEALBOT_PRIEST] = 1;
|
||||
elseif HealBot_Config.CDCMonitor==8 then
|
||||
HealBot_CDCInc[HEALBOT_ROGUE] = 1;
|
||||
elseif HealBot_Config.CDCMonitor==9 then
|
||||
HealBot_CDCInc[HEALBOT_SHAMAN] = 1;
|
||||
elseif HealBot_Config.CDCMonitor==10 then
|
||||
HealBot_CDCInc[HEALBOT_WARLOCK] = 1;
|
||||
elseif HealBot_Config.CDCMonitor==11 then
|
||||
HealBot_CDCInc[HEALBOT_WARRIOR] = 1;
|
||||
elseif HealBot_Config.CDCMonitor==12 then
|
||||
elseif HealBot_Config.CDCMonitor==2 then
|
||||
HealBot_CDCInc[HEALBOT_DRUID] = HealBot_Config.EmergIncMelee[HEALBOT_DRUID];
|
||||
HealBot_CDCInc[HEALBOT_HUNTER] = HealBot_Config.EmergIncMelee[HEALBOT_HUNTER];
|
||||
HealBot_CDCInc[HEALBOT_MAGE] = HealBot_Config.EmergIncMelee[HEALBOT_MAGE];
|
||||
@@ -123,7 +105,7 @@ function HealBot_Options_CDCMonitor_Reset()
|
||||
HealBot_CDCInc[HEALBOT_SHAMAN] = HealBot_Config.EmergIncMelee[HEALBOT_SHAMAN];
|
||||
HealBot_CDCInc[HEALBOT_WARLOCK] = HealBot_Config.EmergIncMelee[HEALBOT_WARLOCK];
|
||||
HealBot_CDCInc[HEALBOT_WARRIOR] = HealBot_Config.EmergIncMelee[HEALBOT_WARRIOR];
|
||||
elseif HealBot_Config.CDCMonitor==13 then
|
||||
elseif HealBot_Config.CDCMonitor==3 then
|
||||
HealBot_CDCInc[HEALBOT_DRUID] = HealBot_Config.EmergIncRange[HEALBOT_DRUID];
|
||||
HealBot_CDCInc[HEALBOT_HUNTER] = HealBot_Config.EmergIncRange[HEALBOT_HUNTER];
|
||||
HealBot_CDCInc[HEALBOT_MAGE] = HealBot_Config.EmergIncRange[HEALBOT_MAGE];
|
||||
@@ -133,7 +115,7 @@ function HealBot_Options_CDCMonitor_Reset()
|
||||
HealBot_CDCInc[HEALBOT_SHAMAN] = HealBot_Config.EmergIncRange[HEALBOT_SHAMAN];
|
||||
HealBot_CDCInc[HEALBOT_WARLOCK] = HealBot_Config.EmergIncRange[HEALBOT_WARLOCK];
|
||||
HealBot_CDCInc[HEALBOT_WARRIOR] = HealBot_Config.EmergIncRange[HEALBOT_WARRIOR];
|
||||
elseif HealBot_Config.CDCMonitor==14 then
|
||||
elseif HealBot_Config.CDCMonitor==4 then
|
||||
HealBot_CDCInc[HEALBOT_DRUID] = HealBot_Config.EmergIncHealers[HEALBOT_DRUID];
|
||||
HealBot_CDCInc[HEALBOT_HUNTER] = HealBot_Config.EmergIncHealers[HEALBOT_HUNTER];
|
||||
HealBot_CDCInc[HEALBOT_MAGE] = HealBot_Config.EmergIncHealers[HEALBOT_MAGE];
|
||||
@@ -143,7 +125,7 @@ function HealBot_Options_CDCMonitor_Reset()
|
||||
HealBot_CDCInc[HEALBOT_SHAMAN] = HealBot_Config.EmergIncHealers[HEALBOT_SHAMAN];
|
||||
HealBot_CDCInc[HEALBOT_WARLOCK] = HealBot_Config.EmergIncHealers[HEALBOT_WARLOCK];
|
||||
HealBot_CDCInc[HEALBOT_WARRIOR] = HealBot_Config.EmergIncHealers[HEALBOT_WARRIOR];
|
||||
elseif HealBot_Config.CDCMonitor==15 then
|
||||
elseif HealBot_Config.CDCMonitor==5 then
|
||||
HealBot_CDCInc[HEALBOT_DRUID] = HealBot_Config.EmergIncCustom[HEALBOT_DRUID];
|
||||
HealBot_CDCInc[HEALBOT_HUNTER] = HealBot_Config.EmergIncCustom[HEALBOT_HUNTER];
|
||||
HealBot_CDCInc[HEALBOT_MAGE] = HealBot_Config.EmergIncCustom[HEALBOT_MAGE];
|
||||
|
||||
@@ -102,7 +102,7 @@ function HealBot_Options_EFClass_OnClick(this)
|
||||
HealBot_Config.EmergIncCustom[HEALBOT_WARLOCK] = HealBot_Options_EFClassWarlock:GetChecked() or 0;
|
||||
HealBot_Config.EmergIncCustom[HEALBOT_WARRIOR] = HealBot_Options_EFClassWarrior:GetChecked() or 0;
|
||||
end
|
||||
if HealBot_Config.EmergIncMonitor>10 then
|
||||
if HealBot_Config.EmergIncMonitor > 1 then
|
||||
HealBot_Action_PartyChanged();
|
||||
end
|
||||
end
|
||||
|
||||
@@ -49,6 +49,11 @@ Default installation path: `C:\Program Files\World of Warcraft\Interface\AddOns\
|
||||
|
||||
### Change Log
|
||||
|
||||
* **v1.7.1**
|
||||
* **Bug Fix - Shapeshift Auto-Unshift** - Fixed an issue where the shapeshift spell queue would incorrectly pull druids out of Tree of Life form .
|
||||
* **Cleanup** - Removed deprecated `UPDATE_SHAPESHIFT_FORM` event listeners and `HealBot_UpdateShapeshiftForm` function to save CPU cycles.
|
||||
|
||||
|
||||
**v1.7.0**
|
||||
* **Feature - Raid Marks** - Added tracking and display of raid marks on unit frames.
|
||||
* **External Addon Integrations** - Added a new 'Extras' tab in Options to optionally enable integrations with `UnitXP_SP3` (for ultra-precise 3D range and Line of Sight checks), `nampower` (for accurate real-time heal/buff tracking), `SuperWoW` (for robust GUID-based state tracking), and `ClassicAPI` (for native +Healing bonuses and fast 3D distance checks).
|
||||
|
||||
Reference in New Issue
Block a user