Flick@276
|
1 local _, ns = ...
|
Flick@276
|
2 local ReAction = ns.ReAction
|
flickerstreak@130
|
3 local L = ReAction.L
|
flickerstreak@130
|
4 local _G = _G
|
flickerstreak@130
|
5 local CreateFrame = CreateFrame
|
flickerstreak@130
|
6 local format = string.format
|
flickerstreak@130
|
7 local GetCVar = GetCVar
|
flickerstreak@130
|
8 local InCombatLockdown = InCombatLockdown
|
flickerstreak@130
|
9 local GetPetActionInfo = GetPetActionInfo
|
flickerstreak@130
|
10 local GetPetActionSlotUsable = GetPetActionSlotUsable
|
flickerstreak@130
|
11 local GetPetActionCooldown = GetPetActionCooldown
|
flickerstreak@130
|
12 local AutoCastShine_AutoCastStart = AutoCastShine_AutoCastStart
|
flickerstreak@130
|
13 local AutoCastShine_AutoCastStop = AutoCastShine_AutoCastStop
|
flickerstreak@130
|
14 local SetDesaturation = SetDesaturation
|
flickerstreak@130
|
15 local CooldownFrame_SetTimer = CooldownFrame_SetTimer
|
flickerstreak@130
|
16 local GameTooltip_SetDefaultAnchor = GameTooltip_SetDefaultAnchor
|
flickerstreak@130
|
17
|
flickerstreak@130
|
18 --
|
flickerstreak@130
|
19 -- Secure snippets
|
flickerstreak@130
|
20 -- These are run within the context of the bar's sandbox, as the
|
flickerstreak@130
|
21 -- buttons themselves do not have their own sandbox.
|
flickerstreak@130
|
22 --
|
flickerstreak@130
|
23 local _onDragStart = -- function(self, button, kind, value, ...)
|
flickerstreak@130
|
24 [[
|
flickerstreak@130
|
25 if lockButtons and (PlayerInCombat() or not lockButtonsCombat) and not IsModifiedClick("PICKUPACTION") then
|
flickerstreak@130
|
26 return kind, value, ...
|
flickerstreak@130
|
27 else
|
flickerstreak@130
|
28 return "petaction", self:GetAttribute("action")
|
flickerstreak@130
|
29 end
|
flickerstreak@130
|
30 ]]
|
flickerstreak@130
|
31
|
flickerstreak@130
|
32 local _onReceiveDrag = -- function(self, button, kind, value, ...)
|
flickerstreak@130
|
33 [[
|
flickerstreak@130
|
34 if kind then -- pet spells on the cursor return nil from GetCursorInfo(), which is very strange
|
flickerstreak@130
|
35 return kind, value, ...
|
flickerstreak@130
|
36 end
|
flickerstreak@130
|
37 return "petaction", self:GetAttribute("action")
|
flickerstreak@130
|
38 ]]
|
flickerstreak@130
|
39
|
flickerstreak@130
|
40 --
|
flickerstreak@130
|
41 -- private
|
flickerstreak@130
|
42 --
|
flickerstreak@130
|
43 local eventList = {
|
flickerstreak@130
|
44 "PLAYER_CONTROL_LOST",
|
flickerstreak@130
|
45 "PLAYER_CONTROL_GAINED",
|
flickerstreak@130
|
46 "PLAYER_FARSIGHT_FOCUS_CHANGED",
|
flickerstreak@130
|
47 "UNIT_PET",
|
flickerstreak@130
|
48 "UNIT_FLAGS",
|
flickerstreak@130
|
49 "UNIT_AURA",
|
flickerstreak@130
|
50 "PET_BAR_UPDATE",
|
flickerstreak@130
|
51 "PET_BAR_UPDATE_COOLDOWN",
|
flickerstreak@165
|
52 "PET_BAR_UPDATE_USABLE",
|
flickerstreak@130
|
53 "UPDATE_BINDINGS",
|
flickerstreak@130
|
54 }
|
flickerstreak@130
|
55
|
flickerstreak@130
|
56 --
|
flickerstreak@130
|
57 -- Pet Action Button class
|
flickerstreak@130
|
58 --
|
flickerstreak@218
|
59 local buttonTypeID = "PetAction"
|
flickerstreak@130
|
60 local Super = ReAction.Button
|
flickerstreak@218
|
61 local Pet = setmetatable(
|
flickerstreak@218
|
62 {
|
flickerstreak@218
|
63 defaultBarConfig = {
|
flickerstreak@218
|
64 type = buttonTypeID,
|
flickerstreak@218
|
65 btnWidth = 30,
|
flickerstreak@218
|
66 btnHeight = 30,
|
flickerstreak@218
|
67 btnRows = 1,
|
flickerstreak@218
|
68 btnColumns = 10,
|
flickerstreak@222
|
69 spacing = 8,
|
flickerstreak@222
|
70 buttons = { }
|
flickerstreak@218
|
71 },
|
flickerstreak@218
|
72
|
flickerstreak@218
|
73 barType = L["Pet Action Bar"],
|
Flick@231
|
74 buttonTypeID = buttonTypeID
|
flickerstreak@218
|
75 },
|
flickerstreak@218
|
76 { __index = Super } )
|
flickerstreak@223
|
77
|
flickerstreak@130
|
78 ReAction.Button.PetAction = Pet
|
flickerstreak@223
|
79 ReAction:RegisterBarType(Pet)
|
flickerstreak@130
|
80
|
Flick@234
|
81 function Pet:New( config, bar, idx, idHint )
|
Flick@277
|
82 self = Super.New(self, config, bar, idx, "SecureActionButtonTemplate, ActionButtonTemplate" )
|
flickerstreak@130
|
83
|
Flick@280
|
84 local name = self:GetFrame():GetName()
|
Flick@278
|
85
|
flickerstreak@130
|
86 local f = self:GetFrame()
|
flickerstreak@130
|
87 if not f.autoCastTexture then
|
flickerstreak@131
|
88 -- store autocast stuff with the frame for recycling
|
flickerstreak@130
|
89 local tex = f:CreateTexture(nil,"OVERLAY")
|
flickerstreak@130
|
90 tex:SetTexture([[Interface\Buttons\UI-AutoCastableOverlay]])
|
flickerstreak@130
|
91 tex:SetHeight(58)
|
flickerstreak@130
|
92 tex:SetWidth(58)
|
flickerstreak@130
|
93 tex:SetPoint("CENTER")
|
flickerstreak@130
|
94 f.autoCastTexture = tex
|
flickerstreak@158
|
95 f.autoCastShine = CreateFrame("Frame",name.."Shine",f,"AutoCastShineTemplate") -- create after autocast texture so it's on top
|
flickerstreak@131
|
96 -- move the cooldown around
|
flickerstreak@131
|
97 local cd = self.frames.cooldown
|
flickerstreak@131
|
98 cd:ClearAllPoints()
|
flickerstreak@131
|
99 cd:SetWidth(33)
|
flickerstreak@131
|
100 cd:SetHeight(33)
|
flickerstreak@131
|
101 cd:SetPoint("CENTER", f, "CENTER", -2, -1)
|
flickerstreak@131
|
102 -- resize to 30x30
|
flickerstreak@131
|
103 f:SetHeight(30)
|
flickerstreak@131
|
104 f:SetWidth(30)
|
flickerstreak@142
|
105 local nt = _G[name.."NormalTexture"]
|
flickerstreak@142
|
106 nt:SetHeight(54)
|
flickerstreak@142
|
107 nt:SetWidth(54)
|
flickerstreak@130
|
108 end
|
flickerstreak@130
|
109 local barFrame = bar:GetFrame()
|
flickerstreak@130
|
110
|
flickerstreak@130
|
111 -- set up the base action ID
|
flickerstreak@130
|
112 self:SetActionIDPool("pet",10)
|
flickerstreak@130
|
113 config.actionID = self:AcquireActionID(config.actionID, idHint, true)
|
flickerstreak@130
|
114
|
flickerstreak@130
|
115 -- attribute setup
|
flickerstreak@131
|
116 -- There's no secure way to do PetAutoCastToggle by actionID, so use
|
flickerstreak@131
|
117 -- a click-through proxy to the Blizzard pet buttons for right-click
|
flickerstreak@131
|
118 -- Note that technically this doesn't do PetStopAttack() when
|
flickerstreak@131
|
119 -- IsPetAttackActive() is true: however that's only true when using
|
flickerstreak@131
|
120 -- Eyes of the Beast and appears not to really do anything (at least
|
flickerstreak@131
|
121 -- I can't find any difference)
|
flickerstreak@130
|
122 f:SetAttribute("type","pet")
|
flickerstreak@130
|
123 f:SetAttribute("type2","click")
|
flickerstreak@130
|
124 f:SetAttribute("clickbutton2",_G["PetActionButton"..config.actionID])
|
flickerstreak@130
|
125 f:SetAttribute("action",config.actionID)
|
flickerstreak@130
|
126 f:SetAttribute("checkselfcast", true)
|
flickerstreak@130
|
127 f:SetAttribute("checkfocuscast", true)
|
flickerstreak@130
|
128
|
flickerstreak@130
|
129 -- non secure scripts
|
flickerstreak@130
|
130 f:SetScript("OnEvent", function(frame, ...) self:OnEvent(...) end)
|
flickerstreak@130
|
131 f:SetScript("OnEnter", function(frame) self:OnEnter() end)
|
flickerstreak@130
|
132 f:SetScript("OnLeave", function(frame) self:OnLeave() end)
|
flickerstreak@130
|
133 f:SetScript("OnAttributeChanged", function(frame, attr, value) self:OnAttributeChanged(attr, value) end)
|
flickerstreak@130
|
134 f:SetScript("PreClick", function(frame) self:PreClick() end)
|
flickerstreak@130
|
135 f:SetScript("OnDragStart", function(frame) self:OnDragStart() end)
|
flickerstreak@130
|
136 f:SetScript("OnReceiveDrag", function(frame) self:OnReceiveDrag() end)
|
flickerstreak@130
|
137
|
flickerstreak@130
|
138 -- secure handlers
|
flickerstreak@130
|
139 barFrame:WrapScript(f, "OnDragStart", _onDragStart)
|
flickerstreak@130
|
140 barFrame:WrapScript(f, "OnReceiveDrag", _onReceiveDrag)
|
flickerstreak@130
|
141
|
flickerstreak@130
|
142 -- event registration
|
flickerstreak@130
|
143 f:RegisterForDrag("LeftButton", "RightButton")
|
flickerstreak@130
|
144 for _, evt in pairs(eventList) do
|
flickerstreak@130
|
145 f:RegisterEvent(evt)
|
flickerstreak@130
|
146 end
|
flickerstreak@130
|
147
|
flickerstreak@130
|
148 -- attach to skinner
|
flickerstreak@130
|
149 bar:SkinButton(self,
|
flickerstreak@130
|
150 {
|
flickerstreak@130
|
151 AutoCast = f.autoCastShine,
|
flickerstreak@130
|
152 AutoCastable = f.autoCastTexture
|
flickerstreak@130
|
153 })
|
flickerstreak@130
|
154
|
flickerstreak@130
|
155 self:Refresh()
|
flickerstreak@130
|
156 f:Show()
|
flickerstreak@130
|
157
|
flickerstreak@130
|
158 return self
|
flickerstreak@130
|
159 end
|
flickerstreak@130
|
160
|
Flick@234
|
161 function Pet:SetupBar(bar)
|
Flick@234
|
162 Super.SetupBar(self,bar)
|
Flick@234
|
163
|
Flick@234
|
164 -- auto show/hide when pet exists
|
Flick@279
|
165 bar:RegisterUnitWatch("pet",not ReAction:GetConfigMode())
|
Flick@234
|
166
|
Flick@234
|
167 self:UpdateButtonLock(bar)
|
Flick@234
|
168 end
|
Flick@234
|
169
|
Flick@234
|
170 function Pet:UpdateButtonLock(bar)
|
Flick@234
|
171 local f = bar:GetFrame()
|
Flick@234
|
172 f:SetAttribute("lockbuttons",bar.config.lockButtons)
|
Flick@234
|
173 f:SetAttribute("lockbuttonscombat",bar.config.lockButtonsCombat)
|
Flick@234
|
174 f:Execute(
|
Flick@234
|
175 [[
|
Flick@234
|
176 lockButtons = self:GetAttribute("lockbuttons")
|
Flick@234
|
177 lockButtonsCombat = self:GetAttribute("lockbuttonscombat")
|
Flick@234
|
178 ]])
|
Flick@234
|
179 end
|
Flick@234
|
180
|
flickerstreak@130
|
181 function Pet:Refresh()
|
flickerstreak@130
|
182 Super.Refresh(self)
|
flickerstreak@130
|
183 self:Update()
|
flickerstreak@130
|
184 self:UpdateHotkey()
|
flickerstreak@130
|
185 end
|
flickerstreak@130
|
186
|
flickerstreak@130
|
187 function Pet:GetActionID()
|
flickerstreak@130
|
188 return self.config.actionID
|
flickerstreak@130
|
189 end
|
flickerstreak@130
|
190
|
flickerstreak@130
|
191 function Pet:SetActionID(id)
|
flickerstreak@130
|
192 if not InCombatLockdown() then
|
flickerstreak@130
|
193 if id < 0 or id > 10 then
|
flickerstreak@130
|
194 ReAction:UserError(L["Pet action ID range is 1-10"])
|
flickerstreak@130
|
195 return
|
flickerstreak@130
|
196 end
|
flickerstreak@130
|
197 self.config.actionID = id
|
flickerstreak@130
|
198 f:SetAttribute("clickbutton2",_G["PetActionButton"..id])
|
flickerstreak@130
|
199 f:SetAttribute("action",id)
|
flickerstreak@130
|
200 self:Update()
|
flickerstreak@130
|
201 self:UpdateHotkey()
|
flickerstreak@130
|
202 end
|
flickerstreak@130
|
203 end
|
flickerstreak@130
|
204
|
flickerstreak@130
|
205 function Pet:Update()
|
flickerstreak@130
|
206 local action = self.config.actionID
|
flickerstreak@130
|
207 local name, subtext, texture, isToken, isActive, autoCastAllowed, autoCastEnabled = GetPetActionInfo(action)
|
flickerstreak@130
|
208 local f = self:GetFrame()
|
flickerstreak@130
|
209 local icon = self.frames.icon
|
flickerstreak@130
|
210
|
flickerstreak@130
|
211 if isToken then
|
flickerstreak@130
|
212 icon:SetTexture(_G[texture])
|
flickerstreak@130
|
213 self.tooltipName = _G[name]
|
flickerstreak@130
|
214 else
|
flickerstreak@130
|
215 icon:SetTexture(texture)
|
flickerstreak@130
|
216 self.tooltipName = name
|
flickerstreak@130
|
217 end
|
flickerstreak@130
|
218
|
flickerstreak@130
|
219 self.isToken = isToken
|
flickerstreak@130
|
220 self.tooltipSubtext = subtext
|
flickerstreak@130
|
221 f:SetChecked( isActive and 1 or 0 )
|
flickerstreak@130
|
222
|
flickerstreak@130
|
223 if autoCastAllowed then
|
flickerstreak@130
|
224 f.autoCastTexture:Show()
|
flickerstreak@130
|
225 else
|
flickerstreak@130
|
226 f.autoCastTexture:Hide()
|
flickerstreak@130
|
227 end
|
flickerstreak@130
|
228
|
flickerstreak@130
|
229 if autoCastEnabled then
|
flickerstreak@130
|
230 AutoCastShine_AutoCastStart(f.autoCastShine)
|
flickerstreak@130
|
231 else
|
flickerstreak@130
|
232 AutoCastShine_AutoCastStop(f.autoCastShine)
|
flickerstreak@130
|
233 end
|
flickerstreak@130
|
234
|
flickerstreak@130
|
235 if texture then
|
flickerstreak@130
|
236 if GetPetActionSlotUsable(action) then
|
flickerstreak@130
|
237 SetDesaturation(icon,nil)
|
flickerstreak@130
|
238 else
|
flickerstreak@130
|
239 SetDesaturation(icon,1)
|
flickerstreak@130
|
240 end
|
flickerstreak@130
|
241 icon:Show()
|
flickerstreak@130
|
242 f:SetNormalTexture("Interface\\Buttons\\UI-Quickslot2")
|
flickerstreak@130
|
243 else
|
flickerstreak@130
|
244 icon:Hide()
|
flickerstreak@130
|
245 f:SetNormalTexture("Interface\\Buttons\\UI-Quickslot")
|
flickerstreak@130
|
246 end
|
flickerstreak@130
|
247
|
flickerstreak@130
|
248 self:UpdateCooldown()
|
flickerstreak@130
|
249 end
|
flickerstreak@130
|
250
|
flickerstreak@130
|
251 function Pet:UpdateCooldown()
|
flickerstreak@130
|
252 CooldownFrame_SetTimer(self.frames.cooldown, GetPetActionCooldown(self.config.actionID))
|
flickerstreak@130
|
253 end
|
flickerstreak@130
|
254
|
flickerstreak@130
|
255 function Pet:SetTooltip()
|
flickerstreak@130
|
256 if self.tooltipName then
|
flickerstreak@130
|
257 local f = self:GetFrame()
|
flickerstreak@130
|
258 local uber = GetCVar("UberTooltips")
|
flickerstreak@130
|
259 if self.isToken or (uber == "0") then
|
flickerstreak@130
|
260 if uber == "0" then
|
flickerstreak@130
|
261 GameTooltip:SetOwner(f, "ANCHOR_RIGHT")
|
flickerstreak@130
|
262 else
|
flickerstreak@130
|
263 GameTooltip_SetDefaultAnchor(GameTooltip, f)
|
flickerstreak@130
|
264 end
|
flickerstreak@130
|
265 GameTooltip:SetText(self.tooltipName)
|
flickerstreak@130
|
266 if self.tooltipSubtext then
|
flickerstreak@130
|
267 GameTooltip:AddLine(self.tooltipSubtext, "", 0.5, 0.5, 0.5)
|
flickerstreak@130
|
268 end
|
flickerstreak@130
|
269 GameTooltip:Show()
|
flickerstreak@130
|
270 else
|
flickerstreak@130
|
271 GameTooltip_SetDefaultAnchor(GameTooltip, f)
|
flickerstreak@130
|
272 GameTooltip:SetPetAction(self.config.actionID)
|
flickerstreak@130
|
273 end
|
flickerstreak@130
|
274 else
|
flickerstreak@130
|
275 GameTooltip:Hide()
|
flickerstreak@130
|
276 end
|
flickerstreak@130
|
277 end
|
flickerstreak@130
|
278
|
flickerstreak@130
|
279 function Pet:OnEvent(event, unit)
|
flickerstreak@130
|
280 if event =="PET_BAR_UPDATE_COOLDOWN" then
|
flickerstreak@130
|
281 self:UpdateCooldown()
|
flickerstreak@130
|
282 elseif event == "UPDATE_BINDINGS" then
|
flickerstreak@130
|
283 self:UpdateHotkey()
|
flickerstreak@130
|
284 elseif event == "UNIT_PET" then
|
flickerstreak@130
|
285 if unit == "player" then
|
flickerstreak@130
|
286 self:Update()
|
flickerstreak@130
|
287 end
|
flickerstreak@130
|
288 elseif event == "UNIT_FLAGS" or event == "UNIT_AURA" then
|
flickerstreak@130
|
289 if unit == "pet" then
|
flickerstreak@130
|
290 self:Update()
|
flickerstreak@130
|
291 end
|
flickerstreak@130
|
292 else
|
flickerstreak@130
|
293 self:Update()
|
flickerstreak@130
|
294 end
|
flickerstreak@130
|
295 end
|
flickerstreak@130
|
296
|
flickerstreak@130
|
297 function Pet:OnEnter()
|
flickerstreak@130
|
298 self:SetTooltip()
|
flickerstreak@130
|
299 end
|
flickerstreak@130
|
300
|
flickerstreak@130
|
301 function Pet:OnLeave()
|
flickerstreak@130
|
302 GameTooltip:Hide()
|
flickerstreak@130
|
303 end
|
flickerstreak@130
|
304
|
flickerstreak@130
|
305 function Pet:OnAttributeChanged(attr,value)
|
flickerstreak@130
|
306 self:Update()
|
flickerstreak@130
|
307 end
|
flickerstreak@130
|
308
|
flickerstreak@130
|
309 function Pet:PreClick()
|
flickerstreak@130
|
310 self:GetFrame():SetChecked(0)
|
flickerstreak@130
|
311 end
|
flickerstreak@130
|
312
|
flickerstreak@130
|
313 function Pet:OnDragStart()
|
flickerstreak@130
|
314 self:SetChecked(0)
|
flickerstreak@130
|
315 self:Update()
|
flickerstreak@130
|
316 end
|
flickerstreak@130
|
317
|
flickerstreak@130
|
318 function Pet:OnReceiveDrag()
|
flickerstreak@130
|
319 self:SetChecked(0)
|
flickerstreak@130
|
320 self:Update()
|
flickerstreak@130
|
321 end
|
flickerstreak@130
|
322
|