You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
243 lines
6.6 KiB
243 lines
6.6 KiB
local _, Cell = ...
|
|
local F = Cell.funcs
|
|
local A = Cell.animations
|
|
|
|
-------------------------------------------------
|
|
-- pool
|
|
-------------------------------------------------
|
|
local pool
|
|
|
|
local function creationFunc()
|
|
local f = CreateFrame("Frame")
|
|
f:Hide()
|
|
|
|
local tex = f:CreateTexture(nil, "ARTWORK")
|
|
tex:SetTexture("Interface/AddOns/Cell/Media/star.png")
|
|
tex:SetAllPoints(f)
|
|
|
|
local ag = f:CreateAnimationGroup()
|
|
ag:SetScript("OnFinished", function()
|
|
pool:Release(f)
|
|
end)
|
|
|
|
-- in -------------------------------------------------------------------- --
|
|
local in_t = ag:CreateAnimation("Translation")
|
|
in_t:SetOrder(1)
|
|
in_t:SetDuration(0.3)
|
|
in_t:SetSmoothing("IN_OUT")
|
|
|
|
local in_s = ag:CreateAnimation("Scale")
|
|
in_s:SetOrder(1)
|
|
in_s:SetScaleFrom(0, 0)
|
|
in_s:SetScaleTo(1, 1)
|
|
in_s:SetDuration(0.3)
|
|
|
|
local in_a = ag:CreateAnimation("Alpha")
|
|
in_a:SetOrder(1)
|
|
in_a:SetFromAlpha(0)
|
|
in_a:SetToAlpha(1)
|
|
in_a:SetDuration(0.3)
|
|
|
|
local in_spinning = ag:CreateAnimation("Rotation")
|
|
in_spinning:SetOrder(1)
|
|
in_spinning:SetDegrees(-360)
|
|
in_spinning:SetDuration(0.5)
|
|
in_spinning:SetEndDelay(0.5)
|
|
|
|
-- main ------------------------------------------------------------------ --
|
|
local main_s1 = ag:CreateAnimation("Scale")
|
|
main_s1:SetOrder(2)
|
|
main_s1:SetScaleTo(1.25, 1.25)
|
|
main_s1:SetDuration(0.2)
|
|
|
|
local main_t1 = ag:CreateAnimation("Translation")
|
|
main_t1:SetOffset(0, 5)
|
|
main_t1:SetDuration(0.1)
|
|
main_t1:SetOrder(2)
|
|
main_t1:SetSmoothing("OUT")
|
|
|
|
local main_t2 = ag:CreateAnimation("Translation")
|
|
main_t2:SetOffset(0, -5)
|
|
main_t2:SetDuration(0.1)
|
|
main_t2:SetOrder(2)
|
|
main_t2:SetSmoothing("IN")
|
|
main_t2:SetStartDelay(0.1)
|
|
main_t2:SetEndDelay(0.25)
|
|
|
|
local main_s2 = ag:CreateAnimation("Scale")
|
|
main_s2:SetOrder(3)
|
|
main_s2:SetScaleTo(1.25, 1.25)
|
|
main_s2:SetDuration(0.2)
|
|
|
|
local main_t3 = ag:CreateAnimation("Translation")
|
|
main_t3:SetOffset(0, 5)
|
|
main_t3:SetDuration(0.1)
|
|
main_t3:SetOrder(3)
|
|
main_t3:SetSmoothing("OUT")
|
|
|
|
local main_t4 = ag:CreateAnimation("Translation")
|
|
main_t4:SetOffset(0, -5)
|
|
main_t4:SetDuration(0.1)
|
|
main_t4:SetOrder(3)
|
|
main_t4:SetSmoothing("IN")
|
|
main_t4:SetStartDelay(0.1)
|
|
main_t4:SetEndDelay(0.5)
|
|
|
|
-- out ------------------------------------------------------------------- --
|
|
local out_s = ag:CreateAnimation("Scale")
|
|
out_s:SetOrder(4)
|
|
out_s:SetScaleTo(0, 0)
|
|
out_s:SetDuration(0.5)
|
|
out_s:SetSmoothing("IN")
|
|
|
|
local out_spinning = ag:CreateAnimation("Rotation")
|
|
out_spinning:SetOrder(4)
|
|
out_spinning:SetDegrees(-360)
|
|
out_spinning:SetDuration(0.5)
|
|
|
|
local out_t = ag:CreateAnimation("Translation")
|
|
out_t:SetOrder(4)
|
|
out_t:SetStartDelay(0.2)
|
|
out_t:SetDuration(0.3)
|
|
out_t:SetSmoothing("IN_OUT")
|
|
|
|
local out_a = ag:CreateAnimation("Alpha")
|
|
out_a:SetOrder(4)
|
|
out_a:SetFromAlpha(1)
|
|
out_a:SetToAlpha(0)
|
|
out_a:SetStartDelay(0.2)
|
|
out_a:SetDuration(0.3)
|
|
|
|
function f:Display(x, y)
|
|
in_t:SetOffset(x, y)
|
|
out_t:SetOffset(x, -y)
|
|
f:Show()
|
|
ag:Play()
|
|
end
|
|
|
|
return f
|
|
end
|
|
|
|
local function resetterFunc(_, f)
|
|
f:Hide()
|
|
end
|
|
|
|
pool = CreateObjectPool(creationFunc, resetterFunc)
|
|
|
|
local function Display(b)
|
|
local f = pool:Acquire()
|
|
f:SetParent(b.widgets.indicatorFrame)
|
|
-- f:SetFrameLevel(b:GetFrameLevel()+200)
|
|
f:SetPoint("CENTER", b, "BOTTOMLEFT")
|
|
|
|
local size = max(min(b:GetHeight(), b:GetWidth()), 64)
|
|
f:SetSize(size, size)
|
|
|
|
f:Display(ceil(b:GetWidth()/2), ceil(b:GetHeight()/2))
|
|
-- f:FadeIn()
|
|
-- C_Timer.After(3, f.FadeOut)
|
|
end
|
|
|
|
-------------------------------------------------
|
|
-- mvp pool
|
|
-------------------------------------------------
|
|
local mvpPool = CreateObjectPool(function(pool)
|
|
local f = CreateFrame("Frame")
|
|
f:Hide()
|
|
f:SetSize(128, 128)
|
|
|
|
local tex = f:CreateTexture(nil, "ARTWORK")
|
|
tex:SetTexture("Interface/AddOns/Cell/Media/FlipBooks/mvp.png", nil, nil, "TRILINEAR")
|
|
tex:SetAllPoints(f)
|
|
tex:SetParentKey("Flipbook")
|
|
|
|
local mask = f:CreateMaskTexture()
|
|
f.mask = mask
|
|
mask:SetTexture(Cell.vars.whiteTexture, "CLAMPTOBLACKADDITIVE", "CLAMPTOBLACKADDITIVE")
|
|
tex:AddMaskTexture(mask)
|
|
|
|
local ag = f:CreateAnimationGroup()
|
|
ag:SetLooping("REPEAT")
|
|
|
|
local flip = ag:CreateAnimation("FlipBook")
|
|
flip:SetDuration(2)
|
|
flip:SetFlipBookColumns(4)
|
|
flip:SetFlipBookRows(8)
|
|
flip:SetFlipBookFrames(32)
|
|
flip:SetChildKey("Flipbook")
|
|
|
|
f:SetScript("OnShow", function()
|
|
ag:Play()
|
|
f.timer = C_Timer.NewTimer(3, f.FadeOut)
|
|
end)
|
|
|
|
A.CreateFadeIn(f, 0, 1, 0.2)
|
|
A.CreateFadeOut(f, 1, 0, 0.2, nil, function()
|
|
f.timer = nil
|
|
pool:Release(f)
|
|
end)
|
|
|
|
return f
|
|
end, function(_, f)
|
|
if f.timer then
|
|
f.timer:Cancel()
|
|
f.timer = nil
|
|
end
|
|
f:Hide()
|
|
end)
|
|
|
|
local function DisplayMVP(b)
|
|
local f = mvpPool:Acquire()
|
|
f:SetParent(b.widgets.indicatorFrame)
|
|
f:SetPoint("CENTER")
|
|
f.mask:SetAllPoints(b.widgets.indicatorFrame)
|
|
|
|
f:FadeIn()
|
|
end
|
|
|
|
-------------------------------------------------
|
|
-- events
|
|
-------------------------------------------------
|
|
local eventFrame = CreateFrame("Frame")
|
|
eventFrame:RegisterEvent("FIRST_FRAME_RENDERED")
|
|
|
|
local function Check()
|
|
pool:ReleaseAll()
|
|
mvpPool:ReleaseAll()
|
|
|
|
-- Cell.wowSupporters[Cell.vars.playerNameFull] = true
|
|
|
|
if IsInGroup() then
|
|
for unit in F.IterateGroupMembers() do
|
|
local fullName = F.UnitFullName(unit)
|
|
if Cell.wowSupporters[fullName] then
|
|
F.HandleUnitButton("unit", unit, Cell.wowSupporters[fullName] == "mvp" and DisplayMVP or Display)
|
|
end
|
|
end
|
|
else
|
|
if Cell.wowSupporters[Cell.vars.playerNameFull] then
|
|
F.HandleUnitButton("unit", "player", Cell.wowSupporters[Cell.vars.playerNameFull] == "mvp" and DisplayMVP or Display)
|
|
end
|
|
end
|
|
end
|
|
|
|
local timer, members
|
|
eventFrame:SetScript("OnEvent", function(self, event)
|
|
if event == "FIRST_FRAME_RENDERED" then
|
|
eventFrame:UnregisterEvent("FIRST_FRAME_RENDERED")
|
|
eventFrame:RegisterEvent("GROUP_ROSTER_UPDATE")
|
|
end
|
|
|
|
if timer then
|
|
timer:Cancel()
|
|
timer = nil
|
|
end
|
|
|
|
if InCombatLockdown() then return end
|
|
|
|
local newMembers = GetNumGroupMembers()
|
|
if members ~= newMembers then
|
|
members = newMembers
|
|
timer = C_Timer.NewTimer(5, Check)
|
|
end
|
|
end)
|