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.
102 lines
2.8 KiB
102 lines
2.8 KiB
local Runes = {}
|
|
ShadowUF:RegisterModule(Runes, "runeBar", ShadowUF.L["Rune bar"], true, "DEATHKNIGHT")
|
|
ShadowUF.BlockTimers:Inject(Runes, "RUNE_TIMER")
|
|
ShadowUF.DynamicBlocks:Inject(Runes)
|
|
|
|
function Runes:OnEnable(frame)
|
|
if( not frame.runeBar ) then
|
|
frame.runeBar = CreateFrame("StatusBar", nil, frame)
|
|
frame.runeBar:SetMinMaxValues(0, 1)
|
|
frame.runeBar:SetValue(0)
|
|
frame.runeBar.runes = {}
|
|
frame.runeBar.blocks = frame.runeBar.runes
|
|
|
|
for id=1, 6 do
|
|
local rune = ShadowUF.Units:CreateBar(frame.runeBar)
|
|
rune.id = id
|
|
|
|
if( id > 1 ) then
|
|
rune:SetPoint("TOPLEFT", frame.runeBar.runes[id-1], "TOPRIGHT", 1, 0)
|
|
else
|
|
rune:SetPoint("TOPLEFT", frame.runeBar, "TOPLEFT", 0, 0)
|
|
end
|
|
|
|
frame.runeBar.runes[id] = rune
|
|
end
|
|
end
|
|
|
|
frame:RegisterNormalEvent("RUNE_POWER_UPDATE", self, "UpdateUsable")
|
|
frame:RegisterUpdateFunc(self, "UpdateUsable")
|
|
end
|
|
|
|
function Runes:OnDisable(frame)
|
|
frame:UnregisterAll(self)
|
|
end
|
|
|
|
function Runes:OnLayoutApplied(frame)
|
|
if( not frame.visibility.runeBar ) then return end
|
|
|
|
local barWidth = (frame.runeBar:GetWidth() - 5) / 6
|
|
for id, rune in pairs(frame.runeBar.runes) do
|
|
if( ShadowUF.db.profile.units[frame.unitType].runeBar.background ) then
|
|
rune.background:Show()
|
|
else
|
|
rune.background:Hide()
|
|
end
|
|
|
|
rune.background:SetTexture(ShadowUF.Layout.mediaPath.statusbar)
|
|
rune.background:SetHorizTile(false)
|
|
rune:SetStatusBarTexture(ShadowUF.Layout.mediaPath.statusbar)
|
|
rune:GetStatusBarTexture():SetHorizTile(false)
|
|
rune:SetWidth(barWidth)
|
|
|
|
local color = ShadowUF.db.profile.powerColors.RUNES
|
|
frame:SetBlockColor(rune, "runeBar", color.r, color.g, color.b)
|
|
end
|
|
end
|
|
|
|
local function runeMonitor(self, elapsed)
|
|
local time = GetTime()
|
|
self:SetValue(time)
|
|
|
|
if( time >= self.endTime ) then
|
|
self:SetValue(self.endTime)
|
|
self:SetAlpha(1.0)
|
|
self:SetScript("OnUpdate", nil)
|
|
self.endTime = nil
|
|
end
|
|
|
|
if( self.fontString ) then
|
|
self.fontString:UpdateTags()
|
|
end
|
|
end
|
|
|
|
-- Updates the timers on runes
|
|
function Runes:UpdateUsable(frame, event, id, usable)
|
|
if( not id or not frame.runeBar.runes[id] ) then
|
|
return
|
|
end
|
|
|
|
local rune = frame.runeBar.runes[id]
|
|
local startTime, cooldown, cooled = GetRuneCooldown(id)
|
|
-- Blizzard changed something with this API apparently and now it can be true/false/nil
|
|
if( cooled == nil ) then return end
|
|
|
|
if( not cooled ) then
|
|
rune.endTime = startTime + cooldown
|
|
rune:SetMinMaxValues(startTime, rune.endTime)
|
|
rune:SetValue(GetTime())
|
|
rune:SetAlpha(0.40)
|
|
rune:SetScript("OnUpdate", runeMonitor)
|
|
else
|
|
rune:SetMinMaxValues(0, 1)
|
|
rune:SetValue(1)
|
|
rune:SetAlpha(1.0)
|
|
rune:SetScript("OnUpdate", nil)
|
|
rune.endTime = nil
|
|
end
|
|
|
|
if( rune.fontString ) then
|
|
rune.fontString:UpdateTags()
|
|
end
|
|
end
|
|
|