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.
210 lines
6.9 KiB
210 lines
6.9 KiB
local Totems = {}
|
|
local totemColors = {}
|
|
local MAX_TOTEMS = MAX_TOTEMS
|
|
|
|
local playerClass = select(2, UnitClass("player"))
|
|
if( playerClass == "DEATHKNIGHT" ) then
|
|
MAX_TOTEMS = 1
|
|
-- Unholy DKs get rank 2 on level 29 which converts their ghoul into a proper pet.
|
|
local spec = (UnitLevel("player") < 29) and {1, 2, 3} or {1, 2}
|
|
ShadowUF:RegisterModule(Totems, "totemBar", ShadowUF.L["Ghoul bar"], true, "DEATHKNIGHT", spec, 12)
|
|
elseif( playerClass == "DRUID" ) then
|
|
MAX_TOTEMS = 1
|
|
ShadowUF:RegisterModule(Totems, "totemBar", ShadowUF.L["Mushroom bar"], true, "DRUID", 4, 39)
|
|
elseif( playerClass == "MONK" ) then
|
|
MAX_TOTEMS = 1
|
|
ShadowUF:RegisterModule(Totems, "totemBar", ShadowUF.L["Statue bar"], true, "MONK", {1, 2}, 35)
|
|
elseif( playerClass == "MAGE" ) then
|
|
MAX_TOTEMS = 1
|
|
ShadowUF:RegisterModule(Totems, "totemBar", ShadowUF.L["Rune of Power bar"], true, "MAGE", {1, 2, 3}, 30)
|
|
elseif( playerClass == "WARLOCK" ) then
|
|
MAX_TOTEMS = 2
|
|
ShadowUF:RegisterModule(Totems, "totemBar", ShadowUF.L["Imp & Dreadstalker bar"], true, "WARLOCK", 2)
|
|
else
|
|
ShadowUF:RegisterModule(Totems, "totemBar", ShadowUF.L["Totem bar"], true, "SHAMAN")
|
|
end
|
|
|
|
ShadowUF.BlockTimers:Inject(Totems, "TOTEM_TIMER")
|
|
ShadowUF.DynamicBlocks:Inject(Totems)
|
|
|
|
function Totems:SecureLockable()
|
|
return MAX_TOTEMS > 1
|
|
end
|
|
|
|
function Totems:OnEnable(frame)
|
|
if( not frame.totemBar ) then
|
|
frame.totemBar = CreateFrame("Frame", nil, frame)
|
|
frame.totemBar.totems = {}
|
|
frame.totemBar.blocks = frame.totemBar.totems
|
|
|
|
local priorities = (playerClass == "SHAMAN") and SHAMAN_TOTEM_PRIORITIES or STANDARD_TOTEM_PRIORITIES
|
|
|
|
for id=1, MAX_TOTEMS do
|
|
local totem = ShadowUF.Units:CreateBar(frame.totemBar)
|
|
totem:SetMinMaxValues(0, 1)
|
|
totem:SetValue(0)
|
|
totem.id = MAX_TOTEMS == 1 and 1 or priorities[id]
|
|
totem.parent = frame
|
|
|
|
if( id > 1 ) then
|
|
totem:SetPoint("TOPLEFT", frame.totemBar.totems[id - 1], "TOPRIGHT", 1, 0)
|
|
else
|
|
totem:SetPoint("TOPLEFT", frame.totemBar, "TOPLEFT", 0, 0)
|
|
end
|
|
|
|
table.insert(frame.totemBar.totems, totem)
|
|
end
|
|
|
|
if( playerClass == "DEATHKNIGHT" ) then
|
|
totemColors[1] = ShadowUF.db.profile.classColors.PET
|
|
elseif( playerClass == "DRUID" ) then
|
|
totemColors[1] = ShadowUF.db.profile.powerColors.MUSHROOMS
|
|
elseif( playerClass == "WARLOCK" ) then
|
|
totemColors[1] = ShadowUF.db.profile.classColors.PET
|
|
totemColors[2] = ShadowUF.db.profile.classColors.PET
|
|
elseif( playerClass == "MONK" ) then
|
|
totemColors[1] = ShadowUF.db.profile.powerColors.STATUE
|
|
elseif( playerClass == "MAGE" ) then
|
|
totemColors[1] = ShadowUF.db.profile.powerColors.RUNEOFPOWER
|
|
else
|
|
totemColors[1] = {r = 1, g = 0, b = 0.4}
|
|
totemColors[2] = {r = 0, g = 1, b = 0.4}
|
|
totemColors[3] = {r = 0, g = 0.4, b = 1}
|
|
totemColors[4] = {r = 0.90, g = 0.90, b = 0.90}
|
|
end
|
|
end
|
|
|
|
frame:RegisterNormalEvent("PLAYER_TOTEM_UPDATE", self, "Update")
|
|
frame:RegisterUpdateFunc(self, "UpdateVisibility")
|
|
frame:RegisterUpdateFunc(self, "Update")
|
|
end
|
|
|
|
function Totems:OnDisable(frame)
|
|
frame:UnregisterAll(self)
|
|
frame:UnregisterUpdateFunc(self, "Update")
|
|
|
|
for _, totem in pairs(frame.totemBar.totems) do
|
|
totem:Hide()
|
|
end
|
|
end
|
|
|
|
function Totems:OnLayoutApplied(frame)
|
|
if( not frame.visibility.totemBar ) then return end
|
|
|
|
local barWidth = (frame.totemBar:GetWidth() - (MAX_TOTEMS - 1)) / MAX_TOTEMS
|
|
local config = ShadowUF.db.profile.units[frame.unitType].totemBar
|
|
|
|
for _, totem in pairs(frame.totemBar.totems) do
|
|
totem:SetHeight(frame.totemBar:GetHeight())
|
|
totem:SetWidth(barWidth)
|
|
totem:SetOrientation(ShadowUF.db.profile.units[frame.unitType].totemBar.vertical and "VERTICAL" or "HORIZONTAL")
|
|
totem:SetReverseFill(ShadowUF.db.profile.units[frame.unitType].totemBar.reverse and true or false)
|
|
totem:SetStatusBarTexture(ShadowUF.Layout.mediaPath.statusbar)
|
|
totem:GetStatusBarTexture():SetHorizTile(false)
|
|
|
|
totem.background:SetTexture(ShadowUF.Layout.mediaPath.statusbar)
|
|
|
|
if( config.background or config.invert ) then
|
|
totem.background:Show()
|
|
else
|
|
totem.background:Hide()
|
|
end
|
|
|
|
if( not ShadowUF.db.profile.units[frame.unitType].totemBar.icon ) then
|
|
frame:SetBlockColor(totem, "totemBar", totemColors[totem.id].r, totemColors[totem.id].g, totemColors[totem.id].b)
|
|
end
|
|
|
|
if( config.secure ) then
|
|
totem.secure = totem.secure or CreateFrame("Button", frame:GetName() .. "Secure" .. totem.id, totem, "SecureUnitButtonTemplate")
|
|
totem.secure:RegisterForClicks("RightButtonUp")
|
|
totem.secure:SetAllPoints(totem)
|
|
totem.secure:SetAttribute("type2", "destroytotem")
|
|
totem.secure:SetAttribute("*totem-slot*", totem.id)
|
|
totem.secure:Show()
|
|
|
|
elseif( totem.secure ) then
|
|
totem.secure:Hide()
|
|
end
|
|
end
|
|
|
|
self:Update(frame)
|
|
end
|
|
|
|
local function totemMonitor(self, elapsed)
|
|
local time = GetTime()
|
|
self:SetValue(self.endTime - time)
|
|
|
|
if( time >= self.endTime ) then
|
|
self:SetValue(0)
|
|
self:SetScript("OnUpdate", nil)
|
|
self.endTime = nil
|
|
|
|
if( not self.parent.inVehicle and MAX_TOTEMS == 1 ) then
|
|
ShadowUF.Layout:SetBarVisibility(self.parent, "totemBar", false)
|
|
end
|
|
end
|
|
|
|
if( self.fontString ) then
|
|
self.fontString:UpdateTags()
|
|
end
|
|
end
|
|
|
|
function Totems:UpdateVisibility(frame)
|
|
if( frame.totemBar.inVehicle ~= frame.inVehicle ) then
|
|
frame.totemBar.inVehicle = frame.inVehicle
|
|
|
|
if( frame.inVehicle ) then
|
|
ShadowUF.Layout:SetBarVisibility(frame, "totemBar", false)
|
|
elseif( MAX_TOTEMS ~= 1 ) then
|
|
self:Update(frame)
|
|
end
|
|
end
|
|
end
|
|
|
|
function Totems:Update(frame)
|
|
local totalActive = 0
|
|
for _, indicator in pairs(frame.totemBar.totems) do
|
|
local have, _name, start, duration, icon
|
|
if MAX_TOTEMS == 1 and indicator.id == 1 then
|
|
local id = 1
|
|
while not have and id <= 4 do
|
|
have, _name, start, duration, icon = GetTotemInfo(id)
|
|
id = id + 1
|
|
end
|
|
else
|
|
have, _name, start, duration, icon = GetTotemInfo(indicator.id)
|
|
end
|
|
if( have and start > 0 ) then
|
|
if( ShadowUF.db.profile.units[frame.unitType].totemBar.icon ) then
|
|
indicator:SetStatusBarTexture(icon)
|
|
end
|
|
|
|
indicator.have = true
|
|
indicator.endTime = start + duration
|
|
indicator:SetMinMaxValues(0, duration)
|
|
indicator:SetValue(indicator.endTime - GetTime())
|
|
indicator:SetScript("OnUpdate", totemMonitor)
|
|
indicator:SetAlpha(1.0)
|
|
|
|
totalActive = totalActive + 1
|
|
|
|
elseif( indicator.have ) then
|
|
indicator.have = nil
|
|
indicator:SetScript("OnUpdate", nil)
|
|
indicator:SetMinMaxValues(0, 1)
|
|
indicator:SetValue(0)
|
|
indicator.endTime = nil
|
|
end
|
|
|
|
if( indicator.fontString ) then
|
|
indicator.fontString:UpdateTags()
|
|
end
|
|
end
|
|
|
|
if( not frame.inVehicle ) then
|
|
-- Guardian timers always auto hide or if it's flagged to not always be shown
|
|
if( MAX_TOTEMS == 1 or not ShadowUF.db.profile.units[frame.unitType].totemBar.showAlways ) then
|
|
ShadowUF.Layout:SetBarVisibility(frame, "totemBar", totalActive > 0)
|
|
end
|
|
end
|
|
end
|
|
|