Mercurial > wow > reaction
diff 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 diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/classes/StanceButton.lua Tue Mar 17 23:38:38 2009 +0000 @@ -0,0 +1,282 @@ +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