4 local GetSpecialization = GetSpecialization;
5 local UnitExists = UnitExists;
6 local UnitAura = UnitAura;
7 local GetTotemInfo = GetTotemInfo;
9 -- character specific frames
10 -- TODO try with auraFilter, remove characters, change to classes
13 ["PLAYER HELPFUL"] = {
16 auras = {["Divine Shield"]=1, ""},
31 ["PLAYER HELPFUL"] = {
34 auras = {["Judgment"]=1},
41 ["PLAYER HARMFUL"] = {
53 spec = 3, -- Retribution
55 auraFilter = "PLAYER HARMFUL",
56 x = 570, -- placed over Innervate frame
63 spec = 3, -- Retribution
64 auras = {"Divine Purpose"},
65 auraFilter = "PLAYER HELPFUL",
73 spec = 2, -- Protection
74 auras = {"Shield of the Righteous"},
75 auraFilter = "PLAYER HELPFUL",
83 auras = {"Divine Shield"},
84 auraFilter = "PLAYER HELPFUL",
96 spec = 3, -- Retribution
98 auraFilter = "PLAYER HARMFUL",
99 x = 570, -- placed over Innervate frame
106 spec = 3, -- Retribution
107 auras = {"Divine Purpose"},
108 auraFilter = "PLAYER HELPFUL",
116 spec = 2, -- Protection
117 auras = {"Shield of the Righteous"},
118 auraFilter = "PLAYER HELPFUL",
126 auras = {"Divine Shield"},
127 auraFilter = "PLAYER HELPFUL",
136 totems = {1}, -- Efflorescence
146 auras = {"Tidal Waves"},
147 auraFilter = "PLAYER HELPFUL",
155 auras = {"Healing Rain"},
156 auraFilter = "PLAYER HELPFUL",
164 auras = {"Unleash Life"},
165 auraFilter = "PLAYER HELPFUL",
176 -- unit = unitID where to check auras, not required for totem checkers
177 -- spec = player spec index to show frame, if nil show always
178 -- auras = list of auras to track, in priority order
179 -- auraFilter = filter for UnitAura
180 -- totems = list of totem slots to track, in priority order, only checked if auras is nil
181 -- x = x position relative to UIParent bottom left
182 -- y = y position relative to UIParent bottom left
186 -- global frames' settings
190 auras = {"Innervate"},
191 auraFilter = "HELPFUL",
200 "Delusions", "Entropic Blast", "Necrotic Embrace", "Flametouched", "Shadowtouched",
201 "Blazing Eruption", "Shattering Scream", "Consuming Hunger", "Unstable Soul",
202 "Time Bomb", "Broken Shard", "Demolished", "Fetid Rot", "Roiling Deceit",
203 "Putrid Blood", "Endemic Virus", "Lingering Infection", "Gigavolt Charge",
204 "Crackling Lightning", "Storm's Wail", "Death's Door", "Deathly Withering",
205 "Chilling Touch", "Volatile Charge", "Liquid Gold", "Drained Soul"
207 auraFilter = "HARMFUL",
216 local units = {}; -- mapping from unitID to frames
217 local totems = {}; -- mapping to frames with totems
219 for i = 1, MAX_BOSS_FRAMES do
220 bosses[i] = "boss"..i;
222 local currentSpec = 0; -- 0 is invalid
224 local Indicators = CreateFrame("Frame", "OmaTMW", UIParent);
226 local function updateAuraFrame(frame)
227 local unit = frame.unit;
228 if UnitExists(unit) and (not frame.spec or frame.spec == currentSpec) then
229 local name, icon, count, duration, expires;
230 local auraFilter = frame.auraFilter;
233 name, icon, count, _, duration, expires = UnitAura(unit, i, auraFilter);
234 if not name then break end
235 -- possible improvement to add spellID as an option
236 if frame.auras[name] then
238 frame.stack:SetText(count);
244 frame.cd:SetCooldown(expires - duration, duration);
249 frame.icon:SetTexture(icon);
259 local function updateAuras(unit)
261 for _, i in pairs(units[unit]) do
262 updateAuraFrame(frames[i]);
267 local function updateTotemFrame(frame, slot)
268 local _, name, start, duration, icon = GetTotemInfo(slot);
270 frame.cd:SetCooldown(start, duration);
272 frame.icon:SetTexture(icon);
279 local function updateTotems(slot)
281 for _, i in pairs(totems[slot]) do
282 updateTotemFrame(frames[i], slot);
287 local function createTMW(name, config, parent)
288 local frame = CreateFrame("Frame", name, parent);
289 frame:SetPoint("TOPLEFT", parent, "BOTTOMLEFT", config.x, config.y+config.height);
290 frame:SetPoint("BOTTOMRIGHT", parent, "BOTTOMLEFT", config.x+config.width, config.y);
291 frame.unit = config.unit;
292 frame.spec = config.spec;
295 for _, v in pairs(config.auras) do
296 frame.auras[v] = true;
299 frame.auraFilter = config.auraFilter;
300 frame.totems = config.totems;
302 frame.base = frame:CreateTexture(nil, "BACKGROUND");
303 frame.base:SetAllPoints();
304 frame.base:SetColorTexture(0, 0, 0, 0.6);
305 frame.icon = frame:CreateTexture(nil, "ARTWORK");
306 frame.icon:SetPoint("TOPLEFT", frame.base, "TOPLEFT", 1, -1);
307 frame.icon:SetPoint("BOTTOMRIGHT", frame.base, "BOTTOMRIGHT", -1, 1);
308 frame.icon:SetTexCoord(0.07, 0.93, 0.07, 0.93);
309 frame.stack = frame:CreateFontString(nil, "OVERLAY", "NumberFontNormalLarge");
310 frame.stack:SetPoint("TOPLEFT");
312 frame.cd = CreateFrame("Cooldown", name.."CD", frame, "CooldownFrameTemplate");
313 frame.cd:SetReverse(true);
314 frame.cd:SetAllPoints();
318 local function initialize()
319 Indicators:SetFrameStrata("LOW");
320 Indicators:SetPoint("BOTTOMLEFT");
321 Indicators:SetWidth(1);
322 Indicators:SetHeight(1);
323 currentSpec = GetSpecialization();
324 local name, realm = UnitFullName("player");
325 if chars[realm] and chars[realm][name] then
326 for _, config in pairs(chars[realm][name]) do
327 table.insert(settings, config)
330 for i, config in pairs(settings) do
332 if not units[config.unit] then units[config.unit] = {} end
333 table.insert(units[config.unit], i);
335 if config.totems then
336 for _, slot in pairs(config.totems) do
337 if not totems[slot] then totems[slot] = {} end
338 table.insert(totems[slot], i);
341 frames[i] = createTMW("OmaTMW"..i, config, Indicators);
344 for _, frame in pairs(frames) do
345 if frame.auras then updateAuraFrame(frame) end
347 for _, slot in pairs(frame.totems) do updateTotemFrame(frame, slot) end
352 Indicators:RegisterEvent("UNIT_AURA");
353 Indicators:RegisterEvent("PLAYER_TARGET_CHANGED");
354 Indicators:RegisterEvent("PLAYER_TOTEM_UPDATE");
355 Indicators:RegisterEvent("INSTANCE_ENCOUNTER_ENGAGE_UNIT");
356 Indicators:RegisterEvent("PLAYER_SPECIALIZATION_CHANGED");
357 Indicators:RegisterEvent("PLAYER_LOGIN");
358 Indicators:SetScript("OnEvent", function(self, event, arg1)
359 if event == "UNIT_AURA" then
361 elseif event == "PLAYER_TARGET_CHANGED" then
362 updateAuras("target");
363 elseif event == "PLAYER_TOTEM_UPDATE" then
365 elseif event == "INSTANCE_ENCOUNTER_ENGAGE_UNIT" then
366 for _, boss in pairs(bosses) do
369 elseif event == "PLAYER_SPECIALIZATION_CHANGED" then
370 currentSpec = GetSpecialization();
371 for _, frame in pairs(frames) do
372 if frame.auras then updateAuraFrame(frame) end
374 for _, slot in pairs(frame.totems) do updateTotemFrame(frame, slot) end
377 elseif event == "PLAYER_LOGIN" then