WoWInterface SVN Demonomicon

[/] [branches/] [WotLK/] [Demonomicon.lua] - Rev 3

Compare with Previous | Blame | View Log

--      local function print(msg) ChatFrame1:AddMessage(msg); end

BINDING_HEADER_DEMONOMICON_PETHEADER = 'Demonomicon'
_G["BINDING_NAME_CLICK PetFrame:LeftButton"] = '"Click" Pet Button'
_G["BINDING_NAME_CLICK PetFrame:RightButton"] = '"Right-Click" Pet Button'
_G["BINDING_NAME_CLICK DemonomiconMenuButton:LeftButton"] = 'Open Demon Menu'
_G["BINDING_NAME_CLICK DemonomiconMenuButton:RightButton"] = 'Open Demon Menu for Fast Summon'

local Demonomicon = CreateFrame("Button", "Demonomicon", UIParent, "DemonomiconStyleTemplate SecureHandlerClickTemplate")
Demonomicon:SetPoint("TOPLEFT", PlayerFrame, "BOTTOMLEFT", 52, 12)
Demonomicon.Icon = DemonomiconIcon
Demonomicon.Icon:SetTexture( [[Interface\Icons\INV_Misc_Book_06]] )
Demonomicon:SetHeight(24); Demonomicon:SetWidth(24)

Demonomicon.Buttons = {}
Demonomicon.SummonTab = [[Interface\Icons\Spell_Shadow_Metamorphosis]]
Demonomicon.Textures = {
        Imp = [[Interface\Icons\Spell_Shadow_SummonImp]], 
        Voidwalker = [[Interface\Icons\Spell_Shadow_SummonVoidWalker]], 
        Succubus = [[Interface\Icons\Spell_Shadow_SummonSuccubus]], 
        Felhunter = [[Interface\Icons\Spell_Shadow_SummonFelHunter]], 
        Felguard = [[Interface\Icons\Spell_Shadow_SummonFelGuard]]
}

Demonomicon[ [[Interface\Icons\Spell_Nature_RemoveCurse]] ] = 
        "FastCast"
Demonomicon[ [[Interface\Icons\Spell_Shadow_LifeDrain]] ] =
        "HealPet"
Demonomicon[ [[Interface\Icons\Spell_Shadow_AntiShadow]] ] = 
        {pet="Blueberry", spell="HealTank" }
Demonomicon[ [[Interface\Icons\Spell_Shadow_SacrificialShield]] ] =
        {pet="Blueberry", spell="PopBlueberry" }
Demonomicon[ [[Interface\Icons\Spell_Nature_Purge]] ] = 
        {pet="Puppy", spell="EatMagic" }
Demonomicon[ [[Interface\Icons\Ability_Rogue_Sprint]] ] = 
        {pet="Bruiser", spell="ChaseDown"}
Demonomicon[ [[Interface\Icons\Spell_Shadow_MindSteal]] ] = 
        {pet="Temptress", spell="Charm"}
Demonomicon[ [[Interface\Icons\Spell_Shadow_MindRot]] ] = 
        {pet="Puppy", spell="Silence"}

Demonomicon[ Demonomicon.Textures.Imp ] = 'Summon'
Demonomicon[ Demonomicon.Textures.Voidwalker ] = 'Summon'
Demonomicon[ Demonomicon.Textures.Succubus ] = 'Summon'
Demonomicon[ Demonomicon.Textures.Felhunter ] = 'Summon'
Demonomicon[ Demonomicon.Textures.Felguard ] = 'Summon'

Demonomicon["_childupdate-Close"] = [[
        --self:ClearBindings()
        self:Hide()
]]
Demonomicon["_childupdate-LeftButton"] = [[
        --self:SetBindingClick(true, tostring(self:GetID()), self:GetName(), "LeftButton")
        local localeBinding = tostring(self:GetAttribute('binding'))
        if localeBinding then
                --self:SetBindingClick(true, localeBinding, self:GetName(), "LeftButton")
        end
        self:SetAttribute('type', 'spell')
        self:Show()
]]
Demonomicon["_childupdate-RightButton"] = [[
        --self:SetBindingClick(true, tostring(self:GetID()), self:GetName(), "LeftButton")
        local localeBinding = tostring(self:GetAttribute('binding'))
        if localeBinding then
                --self:SetBindingClick(true, localeBinding, self:GetName(), "LeftButton")
        end
        if self:GetAttribute('*type2') then
                self:SetAttribute('type', 'macro')
        end
        self:Show()
]]
Demonomicon["_childclick"] = [[open = nil; return nil, true]]

function Demonomicon:SetUpButtons(event, ...)
        if InCombatLockdown() then 
                self:RegisterEvent("PLAYER_REGEN_ENABLED")
        else
                local Locale, Placement, Buttons = self.Locale, self.Placement, self.Buttons
                Locale.Spells = { Summons = {} }
                local Spells = Locale.Spells
                for tabIndex = 1,MAX_SKILLLINE_TABS do
                        local tabName, texture, startSpell, numSpells = GetSpellTabInfo(tabIndex)
                        if not tabName then break end
                        if texture == self.SummonTab then
                                for spellIndex = startSpell + 1, startSpell + numSpells do
                                        local spellIcon = GetSpellTexture(spellIndex,BOOKTYPE_SPELL)
                                        local spellSought = self[spellIcon]
                                        if spellSought and type(spellSought) == 'string' then
                                                if spellSought == 'Summon' then
                                                        Spells.Summons[spellIcon] = GetSpellName(spellIndex, BOOKTYPE_SPELL)
                                                else 
                                                        Spells[spellSought] = GetSpellName(spellIndex, BOOKTYPE_SPELL)
                                                end
                                        end
                                end
                        end
                end
                if next(Spells.Summons) then
                        self:Show()
                else
                        self:Hide()
                        return
                end

                if Spells.HealPet then
                        PetFrame:SetAttribute('alt-type1', 'spell')
                        PetFrame:SetAttribute('spell', Spells.HealPet)
                end

                local state2, type2
                if Spells.FastCast then
                        state2, type2 = "^rightclick", 'macro'
                end

                local numButtons = 0
                for _,summonKey in pairs(Placement.order) do
                        summon = Spells.Summons[summonKey]
                        if summon then 
                                numButtons = numButtons + 1
                                local summonButton = Buttons[numButtons]
                                if not summonButton then 
                                        local newName = self:GetName().."Summon"..numButtons
                                        summonButton = _G.CreateFrame('BUTTON', newName, self, "DemonomiconStyleTemplate SecureActionButtonTemplate")
                                        summonButton.Icon = _G[newName.."Icon"]
                                        summonButton:SetAttribute("_childupdate-Close", self["_childupdate-Close"])
                                        summonButton:SetAttribute("_childupdate-LeftButton", self["_childupdate-LeftButton"])
                                        summonButton:SetAttribute("_childupdate-RightButton", self["_childupdate-RightButton"])
                                        summonButton:SetAttribute("_childclick", self["_childclick"])
                                        Buttons[numButtons] = summonButton
                                        self:SetAttribute("_adopt", summonButton)
                                end
                                summonButton:SetID(numButtons)
                                summonButton.Icon:SetTexture(summonKey)
                                summonButton:SetAttribute("binding", Locale.Bindings)
                                summonButton:SetAttribute('spell', summon)
                                summonButton:SetAttribute('macrotext', '/cast '..(Locale.Spells.FastCast or "").."\n/stopcasting\n/cast "..summon)
                                summonButton:SetAttribute('*type2', type2)
                        end
                end
                for index=numButtons+1,5 do
                        local extraButton = Buttons[index]
                        if extraButton then
                                extraButton:SetID(0)
                                extraButton:SetAttribute('*type2', type2)
                                extraButton:SetAttribute('binding', nil)
                                extraButton:Hide()
                        end
                end

                if numButtons > 1 then
                        local angle = Placement.startAngle
                        local slice = (Placement.endAngle - angle) / numButtons
                        local radius = 18 / math.sin(slice / 2)
                        for index=1,numButtons do
                                Buttons[index]:SetPoint("CENTER", self, "CENTER", radius * math.cos(angle), radius * math.sin(angle))
                                angle = angle + slice
                        end
                elseif numButtons == 1 then
                        local oneButton = Buttons[1]
                        oneButton:SetPoint("CENTER", self, "CENTER")
                        oneButton:SetAttribute('hidestates', nil)
                        oneButton:Show()
                end
                self:UnregisterEvent("PLAYER_REGEN_ENABLED")
        end
end

function Demonomicon:SetUpPetFrame(event, ...)
        local Locale = self.Locale
        Locale.Pets = Locale.Pets or {}
        local spellCount = HasPetSpells()
        if spellCount and spellCount > 0 then
                for index=1,spellCount do
                        soughtSpell = self[GetSpellTexture(index, BOOKTYPE_PET)]
                        if soughtSpell and type(soughtSpell) == 'table' then 
                                Locale.Pets[soughtSpell.pet] = (UnitCreatureFamily("pet") or ""):lower()
                                Locale[soughtSpell.spell] = GetSpellName(index, BOOKTYPE_PET)
                        end
                end
                if InCombatLockdown() then 
                        self:RegisterEvent("PLAYER_REGEN_ENABLED")
                else
                        Locale.Macros = Locale.Macros or {}
                        local shiftMacro = {Populate = table.insert}
                        if Locale.PopBlueberry then
                                shiftMacro:Populate("[pet:"..Locale.Pets.Blueberry..",button:2] "..Locale.PopBlueberry)
                        end
                        if Locale.HealTank then
                                shiftMacro:Populate("[pet:"..Locale.Pets.Blueberry.."] "..Locale.HealTank)
                        end
                        if Locale.EatMagic then
                                shiftMacro:Populate("[pet:"..Locale.Pets.Puppy..",button:2,target=mouseover][pet:"..Locale.Pets.Puppy.."] "..locale.EatMagic)
                        end
                        if Locale.ChaseDown then
                                shiftMacro:Populate("[pet:"..Locale.Pets.Bruiser.."] "..Locale.ChaseDown)
                        end
                        shiftMacro.Populate = nil
                        if next(shiftMacro) then
                                Locale.Macros.shift = "/cast "..table.concat(shiftMacro, "; ")
                        end
                        local controlMacro = {Populate = table.insert}
                        if Locale.Charm then
                                controlMacro:Populate("[pet:"..Locale.Pets.Temptress..",button:2,target=focus][pet:"..Locale.Pets.Temptress.."] "..Locale.Charm)
                        end
                        if Locale.Silence then
                                controlMacro:Populate("[pet:"..Locale.Pets.Puppy..",button:2,target=focus][pet:"..Locale.Pets.Puppy.."] "..Locale.Silence)
                        end
                        controlMacro.Populate = nil
                        if next(controlMacro) then
                                Locale.Macros.ctrl = "/cast "..table.concat(controlMacro, "; ")
                        end
                end
        end
        local actionType = Locale.Macros.shift and 'macro'
        PetFrame:SetAttribute('shift-type1', actionType)
        PetFrame:SetAttribute('shift-type2', Locale.Macros.shift and 'macro')
        PetFrame:SetAttribute('shift-macrotext*', Locale.Macros.shift)
        PetFrame:SetAttribute('ctrl-type1', Locale.Macros.ctrl and 'macro')
        PetFrame:SetAttribute('ctrl-type2', Locale.Macros.ctrl and 'macro')
        PetFrame:SetAttribute('ctrl-macrotext*', Locale.Macros.ctrl)
        if Locale.PopBlueberry and Locale.HealTank and Locale.ChaseDown and Locale.EatMagic and Locale.Silence and Locale.Charm then
                SetUpPetFrame = nil
                self:UnregisterEvent('UNIT_MODEL_CHANGED')
        end
        self:UnregisterEvent("PLAYER_REGEN_ENABLED")
end
PetFrame:SetAttribute("alt-type2", "assist")

Demonomicon:SetAttribute("_onupdate", [[
        if open then
                if self:IsUnderMouse(true) then
                        open = 0
                        return nil, true
                end
                open = open + elapsed
                if open <= 2.5 then
                        return nil, true
                else 
                        open = nil
                end
        end
        --self:ClearBindings()
        open = nil
        return "Close"]]
)
Demonomicon:SetAttribute("_onclick", [[
        if open then 
                --self:ClearBindings()
                open = nil
                return "Close"
        else
                --self:SetBindingClick(true, "ESCAPE", "Demonomicon", "LeftButton")
                open = 0
                return button, true
        end]]
)
Demonomicon:RegisterForClicks("AnyUp")

Demonomicon:SetScript("OnEvent", 
        function (self, event, ...)
                local Textures = self.Textures
                if event ~= "ADDON_LOADED" or (...) ~= "Demonomicon" then return; end
                local currentLocale = GetLocale()
                Demonomicon_Locale = Demonomicon_Locale or {} 
                Demonomicon_Locale[currentLocale] = Demonomicon_Locale[currentLocale] or ({
                        ["frFR"] = {
                                Bindings = { 
                                        [ Textures.Imp ] =                      "D", 
                                        [ Textures.Voidwalker ] =       "M", 
                                        [ Textures.Succubus ] =         "S", 
                                        [ Textures.Felhunter ] =        "C", 
                                        [ Textures.Felguard ] =         "G" 
                                }
                        },
                        ["deDE"] = {
                                Bindings = { 
                                        [ Textures.Imp ] =                      "W", 
                                        [ Textures.Voidwalker ] =       "L", 
                                        [ Textures.Succubus ] =         "S", 
                                        [ Textures.Felhunter ] =        "J", 
                                        [ Textures.Felguard ] =         "T" 
                                }
                        },
                        ["enUS"] = {
                                Bindings = { 
                                        [ Textures.Imp ] =                      "I", 
                                        [ Textures.Voidwalker ] =       "V", 
                                        [ Textures.Succubus ] =         "S", 
                                        [ Textures.Felhunter ] =        "F", 
                                        [ Textures.Felguard ] =         "G" 
                                }
                        },
                        ["enGB"] = {
                                Bindings = { 
                                        [ Textures.Imp ] =                      "I", 
                                        [ Textures.Voidwalker ] =       "V", 
                                        [ Textures.Succubus ] =         "S", 
                                        [ Textures.Felhunter ] =        "F", 
                                        [ Textures.Felguard ] =         "G" 
                                }
                        }
                })[currentLocale] or {}
                self.Locale = Demonomicon_Locale[currentLocale]
                Demonomicon_Placement = Demonomicon_Placement or { 
                        startAngle = math.pi, 
                        endAngle = 3 * math.pi, 
                        order = {
                                Textures.Imp,
                                Textures.Voidwalker,
                                Textures.Succubus,
                                Textures.Felhunter,
                                Textures.Felguard
                        } 
                }
                self.Placement = Demonomicon_Placement
                self:SetScript('OnEvent', 
                        function (self, event, ...) 
                                self:SetUpButtons(event, ...)
                                if self.SetUpPetFrame and event ~= 'SPELLS_CHANGED' and (event ~= 'UNIT_MODEL_CHANGED' or (...) == 'pet') then
                                        self:SetUpPetFrame(event, ...)
                                end
                        end
                )
                self:UnregisterAllEvents()
                self:RegisterEvent('SPELLS_CHANGED')
        end
)
Demonomicon:RegisterEvent('ADDON_LOADED')

Demonomicon:SetScript("OnShow", 
        function (self)
                 if self.SetUpPetFrame then 
                        self:RegisterEvent('UNIT_MODEL_CHANGED')
                 end
        end
)

Demonomicon:SetScript("OnHide", 
        function (self)
                self:UnregisterEvent('UNIT_MODEL_CHANGED')
        end
)

Demonomicon:SetScript("OnDragStart", Demonomicon.StartMoving)
Demonomicon:SetScript("OnDragStop", Demonomicon.StopMovingOrSizing)
Demonomicon:RegisterForDrag("LeftButton")

Compare with Previous | Blame