local sizeScale = 0.8;
local longSide = 256 * sizeScale;
local shortSide = 128 * sizeScale;
function SpellActivationOverlay_OnLoad(self)
self.overlaysInUse = {};
self.unusedOverlays = {};
self:RegisterEvent("SPELL_ACTIVATION_OVERLAY_SHOW");
self:RegisterEvent("SPELL_ACTIVATION_OVERLAY_HIDE");
self:SetSize(longSide, longSide)
end
function SpellActivationOverlay_OnEvent(self, event, ...)
if ( event == "SPELL_ACTIVATION_OVERLAY_SHOW" ) then
local spellID, texture, positions, scale, r, g, b = ...;
if ( GetCVarBool("displaySpellActivationOverlays") ) then
SpellActivationOverlay_ShowAllOverlays(self, spellID, texture, positions, scale, r, g, b)
end
elseif ( event == "SPELL_ACTIVATION_OVERLAY_HIDE" ) then
local spellID = ...;
if ( spellID ) then
SpellActivationOverlay_HideOverlays(self, spellID);
else
SpellActivationOverlay_HideAllOverlays(self);
end
end
end
local complexLocationTable = {
["RIGHT (FLIPPED)"] = {
RIGHT = { hFlip = true },
},
["BOTTOM (FLIPPED)"] = {
BOTTOM = { vFlip = true },
},
["LEFT + RIGHT (FLIPPED)"] = {
LEFT = {},
RIGHT = { hFlip = true },
},
["TOP + BOTTOM (FLIPPED)"] = {
TOP = {},
BOTTOM = { vFlip = true },
},
}
function SpellActivationOverlay_ShowAllOverlays(self, spellID, texturePath, positions, scale, r, g, b)
positions = strupper(positions);
if ( complexLocationTable[positions] ) then
for location, info in pairs(complexLocationTable[positions]) do
SpellActivationOverlay_ShowOverlay(self, spellID, texturePath, location, scale, r, g, b, info.vFlip, info.hFlip);
end
else
SpellActivationOverlay_ShowOverlay(self, spellID, texturePath, positions, scale, r, g, b, false, false);
end
end
function SpellActivationOverlay_ShowOverlay(self, spellID, texturePath, position, scale, r, g, b, vFlip, hFlip)
local overlay = SpellActivationOverlay_GetOverlay(self, spellID, position);
overlay.spellID = spellID;
overlay.position = position;
overlay:ClearAllPoints();
local texLeft, texRight, texTop, texBottom = 0, 1, 0, 1;
if ( vFlip ) then
texTop, texBottom = 1, 0;
end
if ( hFlip ) then
texLeft, texRight = 1, 0;
end
overlay.texture:SetTexCoord(texLeft, texRight, texTop, texBottom);
local width, height;
if ( position == "CENTER" ) then
width, height = longSide, longSide;
overlay:SetPoint("CENTER", self, "CENTER", 0, 0);
elseif ( position == "LEFT" ) then
width, height = shortSide, longSide;
overlay:SetPoint("RIGHT", self, "LEFT", 0, 0);
elseif ( position == "RIGHT" ) then
width, height = shortSide, longSide;
overlay:SetPoint("LEFT", self, "RIGHT", 0, 0);
elseif ( position == "TOP" ) then
width, height = longSide, shortSide;
overlay:SetPoint("BOTTOM", self, "TOP");
elseif ( position == "BOTTOM" ) then
width, height = longSide, shortSide;
overlay:SetPoint("TOP", self, "BOTTOM");
elseif ( position == "TOPRIGHT" ) then
width, height = shortSide, shortSide;
overlay:SetPoint("BOTTOMLEFT", self, "TOPRIGHT", 0, 0);
elseif ( position == "TOPLEFT" ) then
width, height = shortSide, shortSide;
overlay:SetPoint("BOTTOMRIGHT", self, "TOPLEFT", 0, 0);
elseif ( position == "BOTTOMRIGHT" ) then
width, height = shortSide, shortSide;
overlay:SetPoint("TOPLEFT", self, "BOTTOMRIGHT", 0, 0);
elseif ( position == "BOTTOMLEFT" ) then
width, height = shortSide, shortSide;
overlay:SetPoint("TOPRIGHT", self, "BOTTOMLEFT", 0, 0);
else
--GMError("Unknown SpellActivationOverlay position: "..tostring(position));
return;
end
overlay:SetSize(width * scale, height * scale);
overlay.texture:SetTexture(texturePath);
overlay.texture:SetVertexColor(r / 255, g / 255, b / 255);
overlay.animOut:Stop(); --In case we're in the process of animating this out.
PlaySoundKitID(23287);
overlay:Show();
end
function SpellActivationOverlay_GetOverlay(self, spellID, position)
local overlayList = self.overlaysInUse[spellID];
local overlay;
if ( overlayList ) then
for i=1, #overlayList do
if ( overlayList[i].position == position ) then
overlay = overlayList[i];
end
end
end
if ( not overlay ) then
overlay = SpellActivationOverlay_GetUnusedOverlay(self);
if ( overlayList ) then
tinsert(overlayList, overlay);
else
self.overlaysInUse[spellID] = { overlay };
end
end
return overlay;
end
function SpellActivationOverlay_HideOverlays(self, spellID)
local overlayList = self.overlaysInUse[spellID];
if ( overlayList ) then
for i=1, #overlayList do
local overlay = overlayList[i];
overlay.pulse:Pause();
overlay.animOut:Play();
end
end
end
function SpellActivationOverlay_HideAllOverlays(self)
for spellID, overlayList in pairs(self.overlaysInUse) do
SpellActivationOverlay_HideOverlays(self, spellID);
end
end
function SpellActivationOverlay_GetUnusedOverlay(self)
local overlay = tremove(self.unusedOverlays, #self.unusedOverlays);
if ( not overlay ) then
overlay = SpellActivationOverlay_CreateOverlay(self);
end
return overlay;
end
function SpellActivationOverlay_CreateOverlay(self)
return CreateFrame("Frame", nil, self, "SpellActivationOverlayTemplate");
end
function SpellActivationOverlayTexture_OnShow(self)
self.animIn:Play();
end
function SpellActivationOverlayTexture_OnFadeInPlay(animGroup)
animGroup:GetParent():SetAlpha(0);
end
function SpellActivationOverlayTexture_OnFadeInFinished(animGroup)
local overlay = animGroup:GetParent();
overlay:SetAlpha(1);
overlay.pulse:Play();
end
function SpellActivationOverlayTexture_OnFadeOutFinished(anim)
local overlay = anim:GetRegionParent();
local overlayParent = overlay:GetParent();
overlay.pulse:Stop();
overlay:Hide();
tDeleteItem(overlayParent.overlaysInUse[overlay.spellID], overlay)
tinsert(overlayParent.unusedOverlays, overlay);
end