3 local CreateFrame = CreateFrame;
4 local UnitAura = UnitAura;
5 local GameTooltip = GameTooltip;
7 local auraFilters = {"HELPFUL", "HARMFUL"};
12 local function updateTooltip(frame)
13 if GameTooltip:IsOwned(frame) then
14 GameTooltip:SetUnitAura(frame.unit, frame.index, frame.filter);
16 frame:SetScript("OnUpdate", nil);
20 local function showTooltip(frame)
21 -- tooltip handling from FrameXML/TargetFrame.xml
22 GameTooltip:SetOwner(frame, "ANCHOR_BOTTOMRIGHT", 15, -25);
23 GameTooltip:SetUnitAura(frame.unit, frame.index, frame.filter);
24 frame:SetScript("OnUpdate", updateTooltip);
27 local function hideTooltip(frame)
29 frame:SetScript("OnUpdate", nil);
32 function M.UpdateAuraTooltips()
33 GameTooltip = _G["GameTooltip"];
36 local function createAura(parent, prev, anchor, name, unit)
37 local aura = CreateFrame("Frame", name, parent);
38 aura:SetPoint("TOPLEFT", prev, anchor);
41 aura.icon = aura:CreateTexture(nil, "ARTWORK");
42 aura.icon:SetAllPoints();
43 aura.stack = aura:CreateFontString(nil, "OVERLAY", "NumberFontNormalSmall");
44 aura.stack:SetPoint("BOTTOMRIGHT");
45 aura.cd = CreateFrame("Cooldown", name.."CD", aura, "CooldownFrameTemplate");
46 aura.cd:SetReverse(true);
47 aura.cd:SetHideCountdownNumbers(true);
48 aura.cd:SetAllPoints();
50 aura:SetScript("OnEnter", showTooltip);
51 aura:SetScript("OnLeave", hideTooltip);
56 function M.CreateAuraFrame(parent, unit)
57 local name = parent:GetName().."Auras";
58 parent.auras = CreateFrame("Frame", name, parent);
59 parent.auras:SetPoint("TOPLEFT", parent, "BOTTOMLEFT", 0, -8);
60 parent.auras:SetWidth(10);
61 parent.auras:SetHeight(10);
65 local auraName = name..i;
67 parent.auras[i] = createAura(parent.auras, parent.auras, "TOPLEFT", auraName, unit);
69 parent.auras[i] = createAura(parent.auras, parent.auras[i-1], "TOPRIGHT", auraName, unit);
76 local auraName = name..i;
77 parent.auras[i] = createAura(parent.auras, parent.auras[y*10+x], "BOTTOMLEFT", auraName, unit);
83 function M.UpdateAuras(frame, unit)
84 local auras = frame.auras;
85 for _, aura in ipairs(auras) do
86 if not aura:IsShown() then break end
89 local icon, count, duration, expires, caster, id;
91 for _, filter in ipairs(auraFilters) do
94 _, _, icon, count, _, duration, expires, caster, _, _, id = UnitAura(unit, i, filter);
95 if not id or not auras[pos] then break end
96 -- aura filter self-applied, player-applied, list of important auras TODO
97 local aura = auras[pos];
98 aura.icon:SetTexture(icon);
100 aura.filter = filter;
102 aura.stack:SetText(count);
108 aura.cd:SetCooldown(expires - duration, duration);