Mercurial > wow > reaction
view classes/StanceButton.lua @ 134:d186e041ca14
Added stance bar support
author | Flick <flickerstreak@gmail.com> |
---|---|
date | Tue, 17 Mar 2009 23:38:38 +0000 |
parents | |
children | b8a14165b807 |
line wrap: on
line source
local ReAction = ReAction local L = ReAction.L local _G = _G local CreateFrame = CreateFrame local format = string.format local GetCVar = GetCVar local GameTooltip_SetDefaultAnchor = GameTooltip_SetDefaultAnchor local CooldownFrame_SetTimer = CooldownFrame_SetTimer local InCombatLockdown = InCombatLockdown local GetNumShapeshiftForms = GetNumShapeshiftForms local GetShapeshiftFormInfo = GetShapeshiftFormInfo local IsUsableSpell = IsUsableSpell local GetSpellInfo = GetSpellInfo ReAction:UpdateRevision("$Revision: 154 $") -- -- private -- local playerClass = select(2,UnitClass("player")) local aspects = { -- All rank one, so that the usable check works GetSpellInfo(13163), -- monkey GetSpellInfo(13165), -- hawk GetSpellInfo(5118), -- cheetah GetSpellInfo(34074), -- viper GetSpellInfo(13161), -- beast GetSpellInfo(13159), -- pack GetSpellInfo(20043), -- wild GetSpellInfo(61846), -- dragonhawk } local aspectLinks = { } local eventList = { "PLAYER_REGEN_ENABLED", "PLAYER_ENTERING_WORLD", "UPDATE_SHAPESHIFT_FORM", "UPDATE_SHAPESHIFT_FORMS", "UPDATE_SHAPESHIFT_USABLE", "UPDATE_SHAPESHIFT_COOLDOWN", -- "UPDATE_INVENTORY_ALERTS" -- WTF? } local eventListHunter = { "PLAYER_REGEN_ENABLED", "PLAYER_ENTERING_WORLD", "SPELL_UPDATE_COOLDOWN", "SPELL_UPDATE_USABLE", "UNIT_AURA", "SPELLS_CHANGED" } if playerClass == "HUNTER" then eventList = eventListHunter end -- -- Stance Button class -- local Super = ReAction.Button local Stance = setmetatable( { }, { __index = Super } ) ReAction.Button.Stance = Stance function Stance:New( idx, moduleConfig, bar, idHint ) local name = format("ReAction_%s_Stance_%d",bar:GetName(),idx) self = Super.New(self, name, moduleConfig.buttons[bar:GetName()][idx], bar, idx, "SecureActionButtonTemplate, ActionButtonTemplate" ) self.moduleConfig = moduleConfig self.hunterIdx = 1 local f = self:GetFrame() local barFrame = bar:GetFrame() local config = self:GetConfig() -- set up the base stance ID self:SetActionIDPool("stance",8) config.stanceID = self:AcquireActionID(config.stanceID, idHint, true) -- attribute setup f:SetAttribute("type","spell") self:UpdateAction() -- non secure scripts f:SetScript("OnEvent", function(frame, ...) self:OnEvent(...) end) f:SetScript("OnEnter", function(frame) self:OnEnter() end) f:SetScript("OnLeave", function(frame) self:OnLeave() end) f:SetScript("PreClick", function(frame, ...) self:PreClick(...) end) -- secure handlers -- (none) -- event registration f:EnableMouse(true) f:RegisterForClicks("AnyUp") for _, evt in pairs(eventList) do f:RegisterEvent(evt) end -- attach to skinner bar:SkinButton(self) -- initial display if ReAction:GetConfigMode() then self:GetFrame():Show() end self:Refresh() return self end function Stance:GetModuleConfig() -- this is the Stance module config structure, -- not the config structure of the bar itself return self.moduleConfig end function Stance:GetActionID() return self.config.stanceID end function Stance:UpdateAction() if InCombatLockdown() then self.updatePending = true else self.updatePending = false local idx = self:GetActionID() local f = self:GetFrame() local c = self:GetModuleConfig() if playerClass == "HUNTER" then if c.showHunterAspects then -- re-map the index in the case of "hide monkey/hawk" if c.hideMonkeyHawk then local usable, outOfMana = IsUsableSpell(aspects[8]) if usable or outOfMana then idx = idx + 2 if idx > 8 then f:Hide() return end end end self.hunterIdx = idx -- cache the highest rank spellID if not aspectLinks[aspects[idx]] then aspectLinks[aspects[idx]] = GetSpellLink(aspects[idx],"") end local usable, outOfMana = IsUsableSpell(aspects[idx]) if usable or outOfMana then f:SetAttribute("spell",aspects[idx]) f:Show() self:Update() else -- haven't learned this spell yet f:Hide() end else f:Hide() end elseif idx > GetNumShapeshiftForms() or playerClass == "PALADIN" and c.hidePaladinAuras or playerClass == "DEATHKNIGHT" and c.hideDKPresences then f:Hide() else f:SetAttribute("spell", select(2,GetShapeshiftFormInfo(idx))) f:Show() self:Update() end end end function Stance:Refresh() Super.Refresh(self) self:Update() end function Stance:Update() local texture, isActive, isCastable if playerClass == "HUNTER" then local name, rank local spell = aspects[self.hunterIdx] name, rank, texture = GetSpellInfo(spell) isCastable = IsUsableSpell(spell) for i = 1, 40 do local buff = UnitBuff("player",i,true) if not buff then break end if buff == spell then isActive = true texture = "Interface\\Icons\\Spell_Nature_WispSplode" break end end else local _ texture, _, isActive, isCastable = GetShapeshiftFormInfo(self:GetActionID()) end local icon = self.frames.icon icon:SetTexture(texture) self:GetFrame():SetChecked( isActive and 1 or 0 ) if isCastable then icon:SetVertexColor(1.0, 1.0, 1.0) else icon:SetVertexColor(0.4, 0.4, 0.4) end self:UpdateCooldown() end function Stance:UpdateCooldown() local start, duration, enabled if playerClass == "HUNTER" then local spell = aspects[self.hunterIdx] if spell then start, duration, enabled = GetSpellCooldown(spell) end else start, duration, enabled = GetShapeshiftFormCooldown(self:GetActionID()) end if start then CooldownFrame_SetTimer(self.frames.cooldown, start, duration, enabled) end end function Stance:SetTooltip() if GetCVar("UberTooltips") == "1" then GameTooltip_SetDefaultAnchor(GameTooltip, self:GetFrame()) else GameTooltip:SetOwner(self:GetFrame(), "ANCHOR_RIGHT") end if playerClass == "HUNTER" then local aspect = aspects[self.hunterIdx] if aspect and aspectLinks[aspect] then GameTooltip:SetHyperlink(aspectLinks[aspect]) end else GameTooltip:SetShapeshift(self:GetActionID()) end end function Stance:OnEnter() self:SetTooltip() end function Stance:OnLeave() GameTooltip:Hide() end function Stance:PreClick() local f = self:GetFrame() f:SetChecked( not f:GetChecked() ) end function Stance:OnEvent(event, arg) if event == "PLAYER_REGEN_ENABLED" then if self.updatePending then self:UpdateAction() end elseif event == "UPDATE_SHAPESHIFT_COOLDOWN" then self:UpdateCooldown() elseif event == "UPDATE_SHAPESHIFT_FORMS" or event == "SPELLS_CHANGED" then aspectLinks = { } -- force repopulate of the spellIDs self:UpdateAction() elseif event == "UNIT_AURA" then if arg == "player" then self:Update() end else self:Update() end end function Stance:ShowGridTemp(show) if show then self:GetFrame():Show() else self:UpdateAction() end end