comparison 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
comparison
equal deleted inserted replaced
133:729e284b2576 134:d186e041ca14
1 local ReAction = ReAction
2 local L = ReAction.L
3 local _G = _G
4 local CreateFrame = CreateFrame
5 local format = string.format
6 local GetCVar = GetCVar
7 local GameTooltip_SetDefaultAnchor = GameTooltip_SetDefaultAnchor
8 local CooldownFrame_SetTimer = CooldownFrame_SetTimer
9 local InCombatLockdown = InCombatLockdown
10 local GetNumShapeshiftForms = GetNumShapeshiftForms
11 local GetShapeshiftFormInfo = GetShapeshiftFormInfo
12 local IsUsableSpell = IsUsableSpell
13 local GetSpellInfo = GetSpellInfo
14
15 ReAction:UpdateRevision("$Revision: 154 $")
16
17 --
18 -- private
19 --
20 local playerClass = select(2,UnitClass("player"))
21
22 local aspects = {
23 -- All rank one, so that the usable check works
24 GetSpellInfo(13163), -- monkey
25 GetSpellInfo(13165), -- hawk
26 GetSpellInfo(5118), -- cheetah
27 GetSpellInfo(34074), -- viper
28 GetSpellInfo(13161), -- beast
29 GetSpellInfo(13159), -- pack
30 GetSpellInfo(20043), -- wild
31 GetSpellInfo(61846), -- dragonhawk
32 }
33
34 local aspectLinks = { }
35
36 local eventList = {
37 "PLAYER_REGEN_ENABLED",
38 "PLAYER_ENTERING_WORLD",
39 "UPDATE_SHAPESHIFT_FORM",
40 "UPDATE_SHAPESHIFT_FORMS",
41 "UPDATE_SHAPESHIFT_USABLE",
42 "UPDATE_SHAPESHIFT_COOLDOWN",
43 -- "UPDATE_INVENTORY_ALERTS" -- WTF?
44 }
45
46 local eventListHunter = {
47 "PLAYER_REGEN_ENABLED",
48 "PLAYER_ENTERING_WORLD",
49 "SPELL_UPDATE_COOLDOWN",
50 "SPELL_UPDATE_USABLE",
51 "UNIT_AURA",
52 "SPELLS_CHANGED"
53 }
54
55 if playerClass == "HUNTER" then
56 eventList = eventListHunter
57 end
58
59 --
60 -- Stance Button class
61 --
62 local Super = ReAction.Button
63 local Stance = setmetatable( { }, { __index = Super } )
64 ReAction.Button.Stance = Stance
65
66 function Stance:New( idx, moduleConfig, bar, idHint )
67 local name = format("ReAction_%s_Stance_%d",bar:GetName(),idx)
68
69 self = Super.New(self, name, moduleConfig.buttons[bar:GetName()][idx], bar, idx, "SecureActionButtonTemplate, ActionButtonTemplate" )
70 self.moduleConfig = moduleConfig
71 self.hunterIdx = 1
72
73 local f = self:GetFrame()
74 local barFrame = bar:GetFrame()
75 local config = self:GetConfig()
76
77 -- set up the base stance ID
78 self:SetActionIDPool("stance",8)
79 config.stanceID = self:AcquireActionID(config.stanceID, idHint, true)
80
81 -- attribute setup
82 f:SetAttribute("type","spell")
83 self:UpdateAction()
84
85 -- non secure scripts
86 f:SetScript("OnEvent", function(frame, ...) self:OnEvent(...) end)
87 f:SetScript("OnEnter", function(frame) self:OnEnter() end)
88 f:SetScript("OnLeave", function(frame) self:OnLeave() end)
89 f:SetScript("PreClick", function(frame, ...) self:PreClick(...) end)
90
91 -- secure handlers
92 -- (none)
93
94 -- event registration
95 f:EnableMouse(true)
96 f:RegisterForClicks("AnyUp")
97 for _, evt in pairs(eventList) do
98 f:RegisterEvent(evt)
99 end
100
101 -- attach to skinner
102 bar:SkinButton(self)
103
104 -- initial display
105 if ReAction:GetConfigMode() then
106 self:GetFrame():Show()
107 end
108
109 self:Refresh()
110
111 return self
112 end
113
114 function Stance:GetModuleConfig()
115 -- this is the Stance module config structure,
116 -- not the config structure of the bar itself
117 return self.moduleConfig
118 end
119
120 function Stance:GetActionID()
121 return self.config.stanceID
122 end
123
124 function Stance:UpdateAction()
125 if InCombatLockdown() then
126 self.updatePending = true
127 else
128 self.updatePending = false
129 local idx = self:GetActionID()
130 local f = self:GetFrame()
131 local c = self:GetModuleConfig()
132 if playerClass == "HUNTER" then
133 if c.showHunterAspects then
134 -- re-map the index in the case of "hide monkey/hawk"
135 if c.hideMonkeyHawk then
136 local usable, outOfMana = IsUsableSpell(aspects[8])
137 if usable or outOfMana then
138 idx = idx + 2
139 if idx > 8 then
140 f:Hide()
141 return
142 end
143 end
144 end
145 self.hunterIdx = idx
146 -- cache the highest rank spellID
147 if not aspectLinks[aspects[idx]] then
148 aspectLinks[aspects[idx]] = GetSpellLink(aspects[idx],"")
149 end
150 local usable, outOfMana = IsUsableSpell(aspects[idx])
151 if usable or outOfMana then
152 f:SetAttribute("spell",aspects[idx])
153 f:Show()
154 self:Update()
155 else
156 -- haven't learned this spell yet
157 f:Hide()
158 end
159 else
160 f:Hide()
161 end
162 elseif idx > GetNumShapeshiftForms() or
163 playerClass == "PALADIN" and c.hidePaladinAuras or
164 playerClass == "DEATHKNIGHT" and c.hideDKPresences then
165 f:Hide()
166 else
167 f:SetAttribute("spell", select(2,GetShapeshiftFormInfo(idx)))
168 f:Show()
169 self:Update()
170 end
171 end
172 end
173
174 function Stance:Refresh()
175 Super.Refresh(self)
176 self:Update()
177 end
178
179 function Stance:Update()
180 local texture, isActive, isCastable
181 if playerClass == "HUNTER" then
182 local name, rank
183 local spell = aspects[self.hunterIdx]
184 name, rank, texture = GetSpellInfo(spell)
185 isCastable = IsUsableSpell(spell)
186 for i = 1, 40 do
187 local buff = UnitBuff("player",i,true)
188 if not buff then break end
189 if buff == spell then
190 isActive = true
191 texture = "Interface\\Icons\\Spell_Nature_WispSplode"
192 break
193 end
194 end
195 else
196 local _
197 texture, _, isActive, isCastable = GetShapeshiftFormInfo(self:GetActionID())
198 end
199
200 local icon = self.frames.icon
201 icon:SetTexture(texture)
202 self:GetFrame():SetChecked( isActive and 1 or 0 )
203 if isCastable then
204 icon:SetVertexColor(1.0, 1.0, 1.0)
205 else
206 icon:SetVertexColor(0.4, 0.4, 0.4)
207 end
208
209 self:UpdateCooldown()
210 end
211
212 function Stance:UpdateCooldown()
213 local start, duration, enabled
214 if playerClass == "HUNTER" then
215 local spell = aspects[self.hunterIdx]
216 if spell then
217 start, duration, enabled = GetSpellCooldown(spell)
218 end
219 else
220 start, duration, enabled = GetShapeshiftFormCooldown(self:GetActionID())
221 end
222 if start then
223 CooldownFrame_SetTimer(self.frames.cooldown, start, duration, enabled)
224 end
225 end
226
227 function Stance:SetTooltip()
228 if GetCVar("UberTooltips") == "1" then
229 GameTooltip_SetDefaultAnchor(GameTooltip, self:GetFrame())
230 else
231 GameTooltip:SetOwner(self:GetFrame(), "ANCHOR_RIGHT")
232 end
233 if playerClass == "HUNTER" then
234 local aspect = aspects[self.hunterIdx]
235 if aspect and aspectLinks[aspect] then
236 GameTooltip:SetHyperlink(aspectLinks[aspect])
237 end
238 else
239 GameTooltip:SetShapeshift(self:GetActionID())
240 end
241 end
242
243 function Stance:OnEnter()
244 self:SetTooltip()
245 end
246
247 function Stance:OnLeave()
248 GameTooltip:Hide()
249 end
250
251 function Stance:PreClick()
252 local f = self:GetFrame()
253 f:SetChecked( not f:GetChecked() )
254 end
255
256 function Stance:OnEvent(event, arg)
257 if event == "PLAYER_REGEN_ENABLED" then
258 if self.updatePending then
259 self:UpdateAction()
260 end
261 elseif event == "UPDATE_SHAPESHIFT_COOLDOWN" then
262 self:UpdateCooldown()
263 elseif event == "UPDATE_SHAPESHIFT_FORMS" or
264 event == "SPELLS_CHANGED" then
265 aspectLinks = { } -- force repopulate of the spellIDs
266 self:UpdateAction()
267 elseif event == "UNIT_AURA" then
268 if arg == "player" then
269 self:Update()
270 end
271 else
272 self:Update()
273 end
274 end
275
276 function Stance:ShowGridTemp(show)
277 if show then
278 self:GetFrame():Show()
279 else
280 self:UpdateAction()
281 end
282 end