local _, addon = ...;
local unpack = unpack;
local min = math.min;
+local format = string.format;
local UnitDebuff, UnitIsCharmed = UnitDebuff, UnitIsCharmed;
local UnitHealth, UnitHealthMax = UnitHealth, UnitHealthMax;
+local UnitPower, UnitPowerMax = UnitPower, UnitPowerMax;
local UnitIsAFK, UnitIsDND = UnitIsAFK, UnitIsDND;
local UnitGetIncomingHeals, UnitGetTotalAbsorbs = UnitGetIncomingHeals, UnitGetTotalAbsorbs;
local UnitIsDeadOrGhost, UnitIsConnected = UnitIsDeadOrGhost, UnitIsConnected;
local UnitGetTotalHealAbsorbs = UnitGetTotalHealAbsorbs;
+local IsResting = IsResting;
local dispelcolor = addon.Colors.OverlayColorDispel;
local charmcolor = addon.Colors.OverlayColorCharm;
local unit = frame.displayed;
local width = frame.barwidth;
- -- range check (doesn't have an event)
- local inrange, checked = UnitInRange(unit);
- if checked and not inrange then
- frame:SetAlpha(0.55);
- else
- frame:SetAlpha(1);
+ -- range check (doesn't have an event) frames can be marked constantly visible
+ if not frame.constant then
+ local inrange, checked = UnitInRange(unit);
+ if checked and not inrange then
+ frame:SetAlpha(0.55);
+ else
+ frame:SetAlpha(1);
+ end
end
-- states
if UnitIsDeadOrGhost(unit) then
elseif UnitIsDND(unit) then
frame.text:SetText("dnd");
if not frame.text:IsShown() then frame.text:Show() end
+ elseif frame.nonraid and frame.unit == "player" and IsResting() then
+ frame.text:SetText("zzz");
+ if not frame.text:IsShown() then frame.text:Show() end
else
if frame.text:IsShown() then frame.text:Hide() end
end
+ -- TODO incoming res, maybe just with events?
-- health
local current, hmax = UnitHealth(unit), UnitHealthMax(unit);
if frame.prev.health ~= current or frame.prev.hmax ~= hmax then
elseif frame.healpred:IsShown() then
frame.healpred:Hide();
end
- frame.rounds = frame.rounds + 1;
- if (frame.rounds > 7) then
- frame.tankcd = {};
- frame.alert = {};
- frame.stacks = {};
- frame.heal = {};
- frame.buff1 = {};
- addon.SetAuras(frame.unit, frame.guid);
- frame.rounds = 0;
+ -- mana, if present
+ if frame.mana ~= nil then
+ local current, max = UnitPower(unit), UnitPowerMax(unit);
+ if frame.prev.mana ~= current or frame.prev.mmax ~= max then
+ frame.prev.mana = current;
+ frame.prev.mmax = max;
+ if max < current or max <= 1 then
+ frame.mana:SetWidth(width);
+ frame.mana:SetText("100");
+ if not frame.mana:IsShown() then frame.mana:Show() end
+ if not frame.manatext:IsShown() then frame.manatext:Show() end
+ elseif current <= 0 then
+ if frame.mana:IsShown() then frame.mana:Hide() end
+ if frame.manatext:IsShown() then frame.manatext:Hide() end
+ else
+ local percent = current/max;
+ frame.mana:SetWidth(percent*width);
+ frame.manatext:SetText(format("%d", percent*100));
+ if not frame.mana:IsShown() then frame.mana:Show() end
+ if not frame.manatext:IsShown() then frame.manatext:Show() end
+ end
+ end
+ end
+ -- forced aura updates
+ if frame.rounds ~= nil then
+ frame.rounds = frame.rounds + 1;
+ if (frame.rounds > 7) then
+ frame.tankcd = {};
+ frame.alert = {};
+ frame.stacks = {};
+ frame.heal = {};
+ frame.buff1 = {};
+ addon.SetAuras(frame.unit, frame.guid);
+ frame.rounds = 0;
+ end
end
-- tank CD marker
if next(frame.tankcd) then
frame.overlay.color = majorcolor;
if not frame.overlay:IsShown() then frame.overlay:Show() end
end
- else
+ elseif frame.overlay ~= nil then
local _, _, _, _, _, _, _, _, _, spellid = UnitDebuff(unit, 1, "RAID");
if UnitIsCharmed(unit) and frame.unit == frame.displayed then
-- charmed