2 -- 2019 Aleksi Blinnikka
4 -- Main update function for all frames. Gets around issues with events.
8 local UnitDebuff, UnitIsCharmed = UnitDebuff, UnitIsCharmed;
9 local UnitHealth, UnitHealthMax = UnitHealth, UnitHealthMax;
10 local UnitIsAFK, UnitIsDND = UnitIsAFK, UnitIsDND;
11 local UnitGetIncomingHeals, UnitGetTotalAbsorbs = UnitGetIncomingHeals, UnitGetTotalAbsorbs;
12 local UnitIsDeadOrGhost, UnitIsConnected = UnitIsDeadOrGhost, UnitIsConnected;
13 local UnitGetTotalHealAbsorbs = UnitGetTotalHealAbsorbs;
15 local dispelcolor = addon.Colors.OverlayColorDispel;
16 local charmcolor = addon.Colors.OverlayColorCharm;
17 local majorcolor = addon.Colors.OverlayColorAlert;
18 local healcolor = addon.Colors.OverlayColorHeal;
20 local ignoredAuras = {
21 [315176] = true, -- Grasping Tendrils
25 function addon.FrameUpdate(frame)
26 assert(type(frame) == "table", "FrameUpdate received invalid frame parameter!");
28 local unit = frame.displayed;
29 local width = frame.barwidth;
30 -- range check (doesn't have an event)
31 local inrange, checked = UnitInRange(unit);
32 if checked and not inrange then
38 if UnitIsDeadOrGhost(unit) then
39 frame.text:SetText("Dead");
40 if not frame.text:IsShown() then frame.text:Show() end
41 if frame.health:IsShown() then frame.health:Hide() end
42 if frame.shield:IsShown() then frame.shield:Hide() end
43 if frame.shieldhl:IsShown() then frame.shieldhl:Hide() end
44 if frame.healpred:IsShown() then frame.healpred:Hide() end
45 if frame.healabsorb:IsShown() then frame.healabsorb:Hide() end
46 frame.prev.health = nil;
47 frame.prev.hmax = nil;
48 elseif not UnitIsConnected(unit) then
49 frame.text:SetText("DC");
50 if not frame.text:IsShown() then frame.text:Show() end
51 if frame.health:IsShown() then frame.health:Hide() end
52 if frame.shield:IsShown() then frame.shield:Hide() end
53 if frame.shieldhl:IsShown() then frame.shieldhl:Hide() end
54 if frame.healpred:IsShown() then frame.healpred:Hide() end
55 if frame.healabsorb:IsShown() then frame.healabsorb:Hide() end
56 frame.prev.health = nil;
57 frame.prev.hmax = nil;
59 if UnitIsAFK(unit) then
60 frame.text:SetText("afk");
61 if not frame.text:IsShown() then frame.text:Show() end
62 elseif UnitIsDND(unit) then
63 frame.text:SetText("dnd");
64 if not frame.text:IsShown() then frame.text:Show() end
66 if frame.text:IsShown() then frame.text:Hide() end
69 local current, hmax = UnitHealth(unit), UnitHealthMax(unit);
70 if frame.prev.health ~= current or frame.prev.hmax ~= hmax then
71 frame.prev.health = current;
72 frame.prev.hmax = hmax;
73 if hmax < current or hmax <= 1 then
74 frame.health:SetWidth(width);
75 frame.health.width = width;
76 if not frame.health:IsShown() then frame.health:Show() end
77 elseif current <= 0 then
78 if frame.health:IsShown() then frame.health:Hide() end
80 local w = current/hmax*width;
81 frame.health:SetWidth(w);
82 frame.health.width = w;
83 if not frame.health:IsShown() then frame.health:Show() end
87 local hwidth = frame.health.width;
88 current = UnitGetTotalAbsorbs(unit) or 0;
90 local space = width - hwidth;
91 current = (current / hmax) * width;
93 if frame.shield:IsShown() then frame.shield:Hide() end
94 if not frame.shieldhl:IsShown() then frame.shieldhl:Show() end
95 elseif space < current then
96 frame.shield:SetWidth(space);
97 if not frame.shield:IsShown() then frame.shield:Show() end
98 if not frame.shieldhl:IsShown() then frame.shieldhl:Show() end
100 frame.shield:SetWidth(current);
101 if not frame.shield:IsShown() then frame.shield:Show() end
102 if frame.shieldhl:IsShown() then frame.shieldhl:Hide() end
105 if frame.shield:IsShown() then frame.shield:Hide() end
106 if frame.shieldhl:IsShown() then frame.shieldhl:Hide() end
109 current = UnitGetTotalHealAbsorbs(unit) or 0;
111 current = (current / hmax) * width;
112 frame.healabsorb:SetWidth(min(hwidth, current));
113 if not frame.healabsorb:IsShown() then frame.healabsorb:Show() end
114 elseif frame.healabsorb:IsShown() then
115 frame.healabsorb:Hide();
118 current = UnitGetIncomingHeals(unit) or 0;
120 current = (current / hmax) * width;
121 -- at least 1 pixel prediction shown
122 frame.healpred:SetWidth(min(width - hwidth + 1, current));
123 if not frame.healpred:IsShown() then frame.healpred:Show() end
124 elseif frame.healpred:IsShown() then
125 frame.healpred:Hide();
134 addon.SetAuras(frame.unit, frame.guid);
138 if next(frame.tankcd) then
139 if not frame.defensive:IsShown() then frame.defensive:Show() end
140 elseif frame.defensive:IsShown() then
141 frame.defensive:Hide();
144 if next(frame.stacks) then
145 local _, amount = next(frame.stacks);
146 frame.stack:SetText(amount);
147 if not frame.stack:IsShown() then frame.stack:Show() end
148 elseif frame.stack:IsShown() then
151 -- custom buff indicator 1
152 if next(frame.buff1) then
153 if not frame.buffind1:IsShown() then frame.buffind1:Show() end
154 elseif frame.buffind1:IsShown() then
155 frame.buffind1:Hide();
158 if next(frame.alert) then
160 if frame.overlay.color ~= majorcolor then
161 frame.overlay:SetVertexColor(unpack(majorcolor));
162 frame.overlay.color = majorcolor;
163 if not frame.overlay:IsShown() then frame.overlay:Show() end
166 local _, _, _, _, _, _, _, _, _, spellid = UnitDebuff(unit, 1, "RAID");
167 if UnitIsCharmed(unit) and frame.unit == frame.displayed then
169 if frame.overlay.color ~= charmcolor then
170 frame.overlay:SetVertexColor(unpack(charmcolor));
171 frame.overlay.color = charmcolor;
172 if not frame.overlay:IsShown() then frame.overlay:Show() end
174 elseif spellid ~= nil and not ignoredAuras[spellid] then
176 if frame.overlay.color ~= dispelcolor then
177 frame.overlay:SetVertexColor(unpack(dispelcolor));
178 frame.overlay.color = dispelcolor;
179 if not frame.overlay:IsShown() then frame.overlay:Show() end
181 elseif next(frame.heal) then
182 -- major heals needed
183 if frame.overlay.color ~= healcolor then
184 frame.overlay:SetVertexColor(unpack(healcolor));
185 frame.overlay.color = healcolor;
186 if not frame.overlay:IsShown() then frame.overlay:Show() end
189 if frame.overlay.color ~= nil then
190 frame.overlay.color = nil;
191 if frame.overlay:IsShown() then frame.overlay:Hide() end