WoWInterface SVN idShamanTotemButtons

[/] [trunk/] [addon.lua] - Rev 2

Compare with Previous | Blame | View Log

if select(2, UnitClass('player')) ~= 'SHAMAN' then return end

local _G = _G
local TL, TC, TR = 'TOPLEFT', 'TOP', 'TOPRIGHT'
local ML, MC, MR = 'LEFT', 'CENTER', 'RIGHT'
local BL, BC, BR = 'BOTTOMLEFT', 'BOTTOM', 'BOTTOMRIGHT'

local ADDON_NAME = 'idShamanTotemButtons'
local BUTTON_NAME = ADDON_NAME .. 'Button'
local BUTTON_PADDING = 1

local addon = CreateFrame('Frame')

local earthtotems = {
        8143,--'Tremor Totem',
        8075,--'Strength of Earth Totem',
        2484,--'Earthbind Totem',
        8071,--'Stoneskin Totem',
        2062,--'Earth Elemental Totem',
        5730,--'Stoneclaw Totem',
}

local firetotems = {
        1535,--'Fire Nova Totem',
        8181,--'Frost Resistance Totem',
        8190,--'Magma Totem',
        3599,--'Searing Totem',
        2894,--'Fire Elemental Totem',
        8227,--'Flametongue Totem',
}
if select(5, GetTalentInfo(1, 20)) > 0 then
        table.insert(firetotems, 1, 30706)--'Totem of Wrath',--TALENT
end

local windtotems = {
        3738,--'Wrath of Air Totem',
        8512,--'Windfury Totem',
        8835,--'Grace of Air Totem',
        8177,--'Grounding Totem',
        10595,--'Nature Resistance Totem',
        6495,--'Sentry Totem',
        15107,--'Windwall Totem',
        25908,--'Tranquil Air Totem',
}

local watertotems = {
        5675,--'Mana Spring Totem',
        8166,--'Poison Cleansing Totem',
        8170,--'Disease Cleansing Totem',
        8184,--'Fire Resistance Totem',
        5394,--'Healing Stream Totem',
}
if select(5, GetTalentInfo(3, 16)) > 0 then
        table.insert(firetotems, 16190)--'Mana Tide Totem',--TALENT
end

local totemtypes = {
        windtotems,
        watertotems,
        earthtotems,
        firetotems,
}

function addon:createButton (name)
        local button = CreateFrame('CheckButton', name, UIParent, 'SecureActionButtonTemplate, ActionButtonTemplate')
        local icon = _G[name .. 'Icon']
        local texture = _G[name .. 'NormalTexture2'] or _G[name .. 'NormalTexture']
        local checkedtexture = _G[name]:GetCheckedTexture():SetTexture()

        button:RegisterForClicks('AnyUp')

        _G[name..'Name']:Hide()
        _G[name..'HotKey']:Hide()

        icon:SetTexCoord(0.08,0.92,0.08,0.92)
        texture:SetTexCoord(0,0,0,0)

        return button
end

function addon:setButtonSpell(button, spellid)
        local name = GetSpellInfo(spellid)

        if not GetSpellTexture(name) then
                return
        end

        self.Totems[name] = button

        button:SetAttribute('type', 'spell')
        button:SetAttribute('spell', name)

        _G[button:GetName()..'Icon']:SetTexture(GetSpellTexture(name))

        button:SetScript('OnEnter', function ()
                GameTooltip:SetOwner(this, 'ANCHOR_RIGHT')
                GameTooltip:SetHyperlink(GetSpellLink(spellid))
                GameTooltip:Show()
        end)
        button:SetScript('OnLeave', function ()
                GameTooltip:Hide()
        end)
end

function addon:createBar (name, first, last, p1, p2, padding)
        local bar = CreateFrame('Frame', name, UIParent)
        local cols = last - first + 1
        local button

        bar.Buttons = {}

        for i = first, last do
                button = self:createButton(BUTTON_NAME .. i)
                table.insert(bar.Buttons, button)
                button:SetParent(bar)
                button:ClearAllPoints()

                if i == first then
                        button:SetPoint(p1, bar, p1, 0, 0)
                else
                        button:SetPoint(p1, _G[BUTTON_NAME .. i - 1], p2, padding, 0)
                end
        end

        bar:SetWidth(button:GetWidth() * cols + (cols - 1) * BUTTON_PADDING)
        bar:SetHeight(button:GetHeight())

        return bar
end

function addon:PLAYER_LOGIN ()
        -- EARTH!
        -- FIRE!
        -- WIND!
        -- WATER!
        -- HEART!
        -- Go Planet!
        --
        -- By your powers combined, I am Captain Planet!
        --
        -- Captain Planet, He's our hero
        -- Gonna take pollution down to zero
        --
        -- He's our powers magnified
        -- And he's fighting on the planet's side
        --
        -- Captain Planet, He's out hero
        -- Gonna take pollution down to zero
        --
        -- Gonna help him put asunder
        -- Bad guys who like to loot and plunder
        --
        -- "You'll pay for this, Captain Planet!"
        --
        -- We're the Planeteers
        -- You can be one too
        -- 'Cause saving our planet is the thing to do!
        --
        -- Looting and Polluting is not the way
        -- Hear what Captain planet has to say!
        --
        -- The power is yours!


        local earth = self:createBar(ADDON_NAME .. 'BarEarth',  1,  6, ML, MR, BUTTON_PADDING)
        local fire  = self:createBar(ADDON_NAME .. 'BarFire',   7, 13, ML, MR, BUTTON_PADDING)
        local wind  = self:createBar(ADDON_NAME .. 'BarWind',  14, 21, ML, MR, BUTTON_PADDING)
        local water = self:createBar(ADDON_NAME .. 'BarWater', 22, 27, ML, MR, BUTTON_PADDING)

        self.Totems = {}
        self.Bars = {}
        self.Bars.Earth = earth
        self.Bars.Fire  = fire
        self.Bars.Wind  = wind
        self.Bars.Water = water

        for i=1,#earthtotems do
                self:setButtonSpell(earth.Buttons[i], earthtotems[i])
        end
        for i=1,#firetotems do
                self:setButtonSpell(fire.Buttons[i], firetotems[i])
        end
        for i=1,#windtotems do
                self:setButtonSpell(wind.Buttons[i], windtotems[i])
        end
        for i=1,#watertotems do
                self:setButtonSpell(water.Buttons[i], watertotems[i])
        end

        earth:SetPoint(MC, UIParent, MC, 400, 0)
        fire:SetPoint(TL, earth, BL, 0, -BUTTON_PADDING)
        wind:SetPoint(TL, fire, BL, 0, -BUTTON_PADDING)
        water:SetPoint(TL, wind, BL, 0, -BUTTON_PADDING)
end

function addon:PLAYER_TOTEM_UPDATE (totemtype)
        local name
        local texture

        for i, spellid in ipairs(totemtypes[totemtype]) do
                name = GetSpellInfo(spellid)
                texture = GetSpellTexture(name)
                if texture then
                        self.Totems[name]:SetButtonState('NORMAL')
                end
        end
end

function addon:SPELL_UPDATE_COOLDOWN ()
        local name
        local texture
        local start, duration, enable

        for i, totemtype in ipairs(totemtypes) do
                for j, spellid in ipairs(totemtype) do
                        name = GetSpellInfo(spellid)
                        texture = GetSpellTexture(name)
                        if texture then
                                start, duration, enable = GetSpellCooldown(name)
                                CooldownFrame_SetTimer(_G[self.Totems[name]:GetName() .. 'Cooldown'], start, duration, enable)
                        end
                end
        end
end

function addon.OnEvent (frame, event, ...)
        if event == 'PLAYER_LOGIN' then
                addon:PLAYER_LOGIN()
        elseif event == 'PLAYER_TOTEM_UPDATE' then
                addon:PLAYER_TOTEM_UPDATE(...)
        elseif event == 'SPELL_UPDATE_COOLDOWN' then
                addon:SPELL_UPDATE_COOLDOWN(...)
        end
end

addon:SetScript('OnEvent', addon.OnEvent)
addon:RegisterEvent('PLAYER_LOGIN')
addon:RegisterEvent('PLAYER_TOTEM_UPDATE')
addon:RegisterEvent('SPELL_UPDATE_COOLDOWN')

_G.idShamanTotemButtons = addon

Compare with Previous | Blame