Files
2024-12-23 06:56:21 -07:00

116 lines
3.5 KiB
Lua

local Runes = {}
local RUNE_MAP = {[1] = 1, [2] = 2, [3] = 5, [4] = 6, [5] = 3, [6] = 4}
local runeColors = {{r = 1, g = 0, b = 0.4}, {r = 0, g = 1, b = 0.4}, {r = 0, g = 0.4, b = 1}, {r = 0.7, g = 0.5, b = 1}}
ShadowUF:RegisterModule(Runes, "runeBar", ShadowUF.L["Rune bar"], true, "DEATHKNIGHT")
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 = {}
for id=1, 6 do
local rune = ShadowUF.Units:CreateBar(frame)
rune:SetFrameLevel(1)
if( id > 1 ) then
rune:SetPoint("TOPLEFT", frame.runeBar.runes[RUNE_MAP[id - 1]], "TOPRIGHT", 1, 0)
else
rune:SetPoint("TOPLEFT", frame.runeBar, "TOPLEFT", 0, 0)
end
frame.runeBar.runes[RUNE_MAP[id]] = rune
end
end
frame:RegisterNormalEvent("RUNE_POWER_UPDATE", self, "UpdateUsable")
frame:RegisterNormalEvent("RUNE_TYPE_UPDATE", self, "Update")
frame:RegisterUpdateFunc(self, "Update")
frame:RegisterUpdateFunc(self, "UpdateUsable")
end
function Runes:OnDisable(frame)
frame:UnregisterAll(self)
end
function Runes:OnLayoutApplied(frame)
if( frame.visibility.runeBar ) then
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:SetHeight(frame.runeBar:GetHeight())
rune:SetWidth(barWidth)
end
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)
end
end
-- Updates the timers on runes
function Runes:UpdateUsable(frame, event, id, usable)
if( not id ) then
self:UpdateColors(frame)
return
elseif( not frame.runeBar.runes[id] ) then
return
end
local rune = frame.runeBar.runes[id]
local startTime, cooldown, cooled = GetRuneCooldown(id)
if( not cooled ) then
rune.endTime = GetTime() + 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)
end
end
function Runes:UpdateColors(frame)
for id, rune in pairs(frame.runeBar.runes) do
local color = runeColors[GetRuneType(id)]
if( color ) then
rune:SetStatusBarColor(color.r, color.g, color.b)
color = ShadowUF.db.profile.bars.backgroundColor or ShadowUF.db.profile.units[frame.unitType].runeBar.backgroundColor or color
rune.background:SetVertexColor(color.r, color.g, color.b, ShadowUF.db.profile.bars.backgroundAlpha)
end
end
end
-- No rune is passed for full update (Login), a single rune is passed when a single rune type changes, such as Blood Tap
function Runes:Update(frame, event, id)
if( id ) then
local color = runeColors[GetRuneType(id)]
frame.runeBar.runes[id]:SetStatusBarColor(color.r, color.g, color.b)
color = ShadowUF.db.profile.bars.backgroundColor or ShadowUF.db.profile.units[frame.unitType].runeBar.backgroundColor or color
frame.runeBar.runes[id].background:SetVertexColor(color.r, color.g, color.b, ShadowUF.db.profile.bars.backgroundAlpha)
end
end