contrebasse@0
|
1 local AddonName = ...
|
contrebasse@5
|
2 -- Draw your weapons automagically
|
contrebasse@0
|
3
|
contrebasse@12
|
4
|
contrebasse@12
|
5 ---------------------------------------------------------------
|
contrebasse@12
|
6 -- Known bugs
|
contrebasse@12
|
7 ---------------------------------------------------------------
|
contrebasse@10
|
8 -- If you stand up by jumping or walking it won't draw your weapon
|
contrebasse@10
|
9 -- (it's not possible to know if you were sitting or standing before)
|
contrebasse@0
|
10
|
contrebasse@5
|
11 --@debug@
|
contrebasse@28
|
12 local debug = false
|
contrebasse@5
|
13 --@end-debug@
|
contrebasse@0
|
14
|
contrebasse@12
|
15
|
contrebasse@5
|
16 ---------------------------------------------------------------
|
contrebasse@5
|
17 -- Globals to local
|
contrebasse@5
|
18 ---------------------------------------------------------------
|
contrebasse@21
|
19 -- These need to be globals :
|
contrebasse@6
|
20 -- GLOBALS: Degaine_ToggleAuto, Degaine_isAuto, BINDING_HEADER_DEGAINE
|
contrebasse@0
|
21
|
contrebasse@21
|
22 -- It doesn't matter if they are globals, rarely unsed :
|
contrebasse@14
|
23 -- GLOBALS: DEFAULT_CHAT_FRAME
|
contrebasse@5
|
24
|
contrebasse@5
|
25 -- Lua functions
|
contrebasse@0
|
26 local pairs = pairs;
|
contrebasse@0
|
27 local type = type;
|
contrebasse@0
|
28
|
contrebasse@5
|
29 -- Wow functions
|
contrebasse@14
|
30 local GetTime = GetTime
|
contrebasse@5
|
31 local InCombatLockdown = InCombatLockdown
|
contrebasse@5
|
32 local ToggleSheath = ToggleSheath
|
contrebasse@20
|
33 local UnitName = UnitName
|
contrebasse@24
|
34 local IsMounted = IsMounted
|
contrebasse@31
|
35 local GetNumCompanions, GetCompanionInfo = GetNumCompanions, GetCompanionInfo
|
contrebasse@33
|
36 local UnitCastingInfo = UnitCastingInfo
|
contrebasse@34
|
37 local select = select
|
contrebasse@0
|
38
|
contrebasse@0
|
39
|
contrebasse@5
|
40 ---------------------------------------------------------------
|
contrebasse@8
|
41 -- Local vars
|
contrebasse@8
|
42 ---------------------------------------------------------------
|
contrebasse@8
|
43 -- const
|
contrebasse@8
|
44 local DegaineFrame = CreateFrame("Frame")
|
contrebasse@8
|
45 local playername = UnitName("player")
|
contrebasse@24
|
46 local delay = 2 -- seconds
|
contrebasse@8
|
47
|
contrebasse@8
|
48 -- vars
|
contrebasse@8
|
49 local t_left = -1
|
contrebasse@14
|
50 local isGossipClosed = true
|
contrebasse@14
|
51 local wasGossipOpened = false
|
contrebasse@14
|
52 local t_lastGossipClosed = 0
|
contrebasse@34
|
53 --local wasMounted = IsMounted() -- handle mounts with UNIT_AURA
|
contrebasse@33
|
54 local isTradeSkill = false
|
contrebasse@8
|
55
|
contrebasse@12
|
56
|
contrebasse@8
|
57 ---------------------------------------------------------------
|
contrebasse@5
|
58 -- Some stuff...
|
contrebasse@5
|
59 ---------------------------------------------------------------
|
contrebasse@5
|
60 -- Bindings
|
contrebasse@5
|
61 BINDING_HEADER_DEGAINE = "Dégainer automatiquement"
|
contrebasse@5
|
62
|
contrebasse@5
|
63 -- Print status
|
contrebasse@5
|
64 local printState = function()
|
contrebasse@11
|
65 DEFAULT_CHAT_FRAME:AddMessage(Degaine_isAuto and "Dégainage automatique |cFF00FF00activé|r" or "Dégainage automatique |cFFFF0000désactivé|r")
|
contrebasse@5
|
66 end
|
contrebasse@5
|
67
|
contrebasse@5
|
68
|
contrebasse@5
|
69 ---------------------------------------------------------------
|
contrebasse@28
|
70 -- Launch drawing weapons
|
contrebasse@28
|
71 ---------------------------------------------------------------
|
contrebasse@28
|
72 -- Wait a few seconds before drawing, to be able to see the curren animation (and avoid bugs)
|
contrebasse@28
|
73 local Degaine_OnUpdate = function(self,t_elapsed)
|
contrebasse@28
|
74 t_left = t_left - t_elapsed;
|
contrebasse@28
|
75 if t_left<=0 then
|
contrebasse@28
|
76 ToggleSheath()
|
contrebasse@28
|
77 DegaineFrame:SetScript("OnUpdate", nil)
|
contrebasse@28
|
78 end
|
contrebasse@28
|
79 end
|
contrebasse@32
|
80 local start = function(arg_delay)
|
contrebasse@28
|
81 if Degaine_isAuto and not InCombatLockdown() then
|
contrebasse@32
|
82 t_left = arg_delay or delay
|
contrebasse@28
|
83 DegaineFrame:SetScript("OnUpdate", Degaine_OnUpdate)
|
contrebasse@28
|
84 end
|
contrebasse@28
|
85 end
|
contrebasse@28
|
86
|
contrebasse@28
|
87
|
contrebasse@28
|
88 ---------------------------------------------------------------
|
contrebasse@5
|
89 -- Events config
|
contrebasse@5
|
90 ---------------------------------------------------------------
|
contrebasse@5
|
91 -- Events to watch
|
contrebasse@5
|
92 local events = { -- no args to watch
|
contrebasse@14
|
93 GOSSIP_SHOW = function()
|
contrebasse@19
|
94 -- isGossipClosed :
|
contrebasse@19
|
95 -- if the gossip is already opened, no need to draw weapon
|
contrebasse@19
|
96 -- UnitName("npc")==UnitName("target") :
|
contrebasse@19
|
97 -- hack gossips again because there's no emote with non npc
|
contrebasse@19
|
98 -- you have to target the npc to interact with it
|
contrebasse@19
|
99 -- things such as boards can't be targeted and start no emote
|
contrebasse@17
|
100 local returnvalue = isGossipClosed and UnitName("npc")==UnitName("target")
|
contrebasse@14
|
101 isGossipClosed = false
|
contrebasse@14
|
102 return returnvalue
|
contrebasse@14
|
103 end,
|
contrebasse@14
|
104 MERCHANT_SHOW = function()
|
contrebasse@19
|
105 -- hack for the cases where the merchant's frame is opened from a gossip frame :
|
contrebasse@19
|
106 -- the gossip is closed and the merchant opened but the weapon is not stealthed
|
contrebasse@14
|
107 if (GetTime() - t_lastGossipClosed) < 0.5 then
|
contrebasse@14
|
108 return not wasGossipOpened
|
contrebasse@14
|
109 else
|
contrebasse@14
|
110 return isGossipClosed
|
contrebasse@14
|
111 end
|
contrebasse@14
|
112 end,
|
contrebasse@11
|
113 BANKFRAME_OPENED = true, --function() return GossipFrame:IsShown() end,
|
contrebasse@0
|
114 AUCTION_HOUSE_SHOW = true,
|
contrebasse@5
|
115 }
|
contrebasse@5
|
116 local events1player = { -- the first arg is "player"
|
contrebasse@5
|
117 UNIT_SPELLCAST_FAILED = true,
|
contrebasse@5
|
118 UNIT_SPELLCAST_INTERRUPTED = true,
|
contrebasse@5
|
119 UNIT_SPELLCAST_SUCCEEDED = true,
|
contrebasse@33
|
120 UNIT_SPELLCAST_START = true, -- to ckeck tradeskill
|
contrebasse@5
|
121 }
|
contrebasse@30
|
122 local SpellWhiteList = { -- Spells that do steath weapons (works with events1player)
|
contrebasse@33
|
123 -- True recipes are treated separately
|
contrebasse@28
|
124 [8690] = true, -- Heartstone
|
contrebasse@28
|
125 [818] = true, -- Basic Campfire
|
contrebasse@33
|
126 [13262] = true, -- Disenchant
|
contrebasse@33
|
127 [51005] = true, -- Milling
|
contrebasse@33
|
128
|
contrebasse@33
|
129 -- Critters (exceptions)
|
contrebasse@33
|
130 [55068] = true, -- Mr Chilly
|
contrebasse@33
|
131
|
contrebasse@33
|
132 -- Mounts (exceptions)
|
contrebasse@33
|
133 [48778] = true, -- Acherus Deathcharger
|
contrebasse@33
|
134
|
contrebasse@28
|
135 }
|
contrebasse@31
|
136
|
contrebasse@12
|
137 local SpellBlackList = { -- spells that don't stealth weapons (works with events1player)
|
contrebasse@33
|
138 -- All vanity pets and mount are added at PLAYER_LOGIN
|
contrebasse@33
|
139
|
contrebasse@33
|
140 --
|
contrebasse@12
|
141 [1784] = true, -- Stealth (Rogue)
|
contrebasse@12
|
142 [58984] = true, -- Shadowmeld (Nightelf stealth)
|
contrebasse@13
|
143
|
contrebasse@33
|
144 -- DK presences
|
contrebasse@33
|
145 [48263] = true, -- Blood
|
contrebasse@33
|
146 [48266] = true, -- Frost
|
contrebasse@33
|
147 [48265] = true, -- Unholy
|
contrebasse@33
|
148
|
contrebasse@33
|
149 [3714] = true, -- Path of Frost
|
contrebasse@33
|
150
|
contrebasse@33
|
151
|
contrebasse@13
|
152 -- Tradeskill spells
|
contrebasse@13
|
153 [2259] = true, -- Alchemy
|
contrebasse@13
|
154 [45357] = true, -- Inscription
|
contrebasse@13
|
155 [3908] = true, -- Tailoring
|
contrebasse@13
|
156 [7411] = true, -- Enchanting
|
contrebasse@13
|
157 [2018] = true, -- Blacksmithing
|
contrebasse@13
|
158 [4036] = true, -- Engineering
|
contrebasse@13
|
159 [25229] = true, -- Jewelcrafting
|
contrebasse@13
|
160 [2656] = true, -- Smelting
|
contrebasse@13
|
161 [2108] = true, -- Leatherworking
|
contrebasse@13
|
162 [2550] = true, -- Cooking
|
contrebasse@13
|
163 [3273] = true, -- First Aid
|
contrebasse@13
|
164 [53428] = true -- Runeforge
|
contrebasse@13
|
165 -- Archaeology ?
|
contrebasse@12
|
166 }
|
contrebasse@31
|
167
|
contrebasse@5
|
168 local events2playername = { -- the 2nd arg is playername
|
contrebasse@5
|
169 CHAT_MSG_SAY = true,
|
contrebasse@5
|
170 CHAT_MSG_YELL = true,
|
contrebasse@5
|
171 CHAT_MSG_TEXT_EMOTE = true,
|
contrebasse@5
|
172 }
|
contrebasse@0
|
173
|
contrebasse@0
|
174
|
contrebasse@5
|
175 ---------------------------------------------------------------
|
contrebasse@24
|
176 -- Handle mounts with OnUpdate
|
contrebasse@24
|
177 ---------------------------------------------------------------
|
contrebasse@24
|
178 -- works with GupPet but not with the default interface...
|
contrebasse@24
|
179 -- I guess that's because a specific /cancelaura or alike is done
|
contrebasse@24
|
180 -- hooksecurefunc("Dismount",start);
|
contrebasse@24
|
181
|
contrebasse@28
|
182 -- With OnUpdate
|
contrebasse@24
|
183 local handleMountsFrame = CreateFrame("frame")
|
contrebasse@24
|
184 local handleMountsOnUpdate
|
contrebasse@24
|
185 do
|
contrebasse@24
|
186 local IsMounted = IsMounted
|
contrebasse@24
|
187 local wasMounted = IsMounted()
|
contrebasse@24
|
188 function handleMountsOnUpdate(self,t_elapsed)
|
contrebasse@24
|
189 if IsMounted() then
|
contrebasse@24
|
190 wasMounted = true
|
contrebasse@24
|
191 else
|
contrebasse@24
|
192 if wasMounted then
|
contrebasse@34
|
193 start(0.5) -- no animation for unmounting
|
contrebasse@24
|
194 wasMounted = false
|
contrebasse@24
|
195 end
|
contrebasse@24
|
196 end
|
contrebasse@24
|
197 end
|
contrebasse@24
|
198 end
|
contrebasse@5
|
199
|
contrebasse@12
|
200
|
contrebasse@5
|
201 ---------------------------------------------------------------
|
contrebasse@5
|
202 -- Activation functions
|
contrebasse@5
|
203 ---------------------------------------------------------------
|
contrebasse@5
|
204 local activate = function()
|
contrebasse@5
|
205 if (not Degaine_isAuto) or InCombatLockdown() then return end
|
contrebasse@5
|
206
|
contrebasse@9
|
207 --DegaineFrame:SetScript("OnUpdate", Degaine_OnUpdate);
|
contrebasse@5
|
208 --@debug@
|
contrebasse@5
|
209 if debug then
|
contrebasse@11
|
210 DegaineFrame:RegisterAllEvents()
|
contrebasse@5
|
211 else
|
contrebasse@5
|
212 --@end-debug@
|
contrebasse@18
|
213 for k,_ in pairs(events) do DegaineFrame:RegisterEvent(k) end
|
contrebasse@18
|
214 for k,_ in pairs(events1player) do DegaineFrame:RegisterEvent(k) end
|
contrebasse@18
|
215 for k,_ in pairs(events2playername) do DegaineFrame:RegisterEvent(k) end
|
contrebasse@28
|
216 --DegaineFrame:RegisterEvent("UNIT_AURA")
|
contrebasse@28
|
217 handleMountsFrame:SetScript("OnUpdate",handleMountsOnUpdate)
|
contrebasse@5
|
218 --@end-debug@
|
contrebasse@5
|
219 end
|
contrebasse@5
|
220 --@end-debug@
|
contrebasse@0
|
221 end
|
contrebasse@5
|
222 local desactivate = function()
|
contrebasse@24
|
223 DegaineFrame:SetScript("OnUpdate", nil)
|
contrebasse@24
|
224 t_left = -1
|
contrebasse@18
|
225 for k,_ in pairs(events) do DegaineFrame:UnregisterEvent(k) end
|
contrebasse@18
|
226 for k,_ in pairs(events1player) do DegaineFrame:UnregisterEvent(k) end
|
contrebasse@18
|
227 for k,_ in pairs(events2playername) do DegaineFrame:UnregisterEvent(k) end
|
contrebasse@28
|
228 --DegaineFrame:UnregisterEvent("UNIT_AURA")
|
contrebasse@28
|
229 handleMountsFrame:SetScript("OnUpdate",nil)
|
contrebasse@0
|
230 end
|
contrebasse@6
|
231 Degaine_ToggleAuto = function()
|
contrebasse@5
|
232 if Degaine_isAuto then
|
contrebasse@5
|
233 Degaine_isAuto = false
|
contrebasse@5
|
234 desactivate()
|
contrebasse@5
|
235 else
|
contrebasse@5
|
236 Degaine_isAuto = true
|
contrebasse@5
|
237 activate()
|
contrebasse@5
|
238 end
|
contrebasse@5
|
239 printState()
|
contrebasse@5
|
240 end
|
contrebasse@0
|
241
|
contrebasse@5
|
242
|
contrebasse@24
|
243
|
contrebasse@5
|
244 ---------------------------------------------------------------
|
contrebasse@5
|
245 -- Event/hooks functions
|
contrebasse@5
|
246 ---------------------------------------------------------------
|
contrebasse@12
|
247 local Degaine_OnEvent = function(self,event, arg1, arg2, _, _, arg5, ...)
|
contrebasse@5
|
248 --@debug@
|
contrebasse@14
|
249 --if debug then
|
contrebasse@31
|
250 --DEFAULT_CHAT_FRAME:AddMessage(event)
|
contrebasse@14
|
251 --if arg1 then DEFAULT_CHAT_FRAME:AddMessage("arg1 = "..arg1) end
|
contrebasse@14
|
252 --if arg2 then DEFAULT_CHAT_FRAME:AddMessage("arg2 = "..arg2) end
|
contrebasse@14
|
253 --end
|
contrebasse@5
|
254 --@end-debug@
|
contrebasse@5
|
255
|
contrebasse@28
|
256 --[[ IsMounted() renvoie toujours false ici, on doit passer par OnUpdate
|
contrebasse@28
|
257 if event=="UNIT_AURA" then
|
contrebasse@28
|
258 if arg1=="player" then
|
contrebasse@28
|
259 DEFAULT_CHAT_FRAME:AddMessage("player")
|
contrebasse@28
|
260 if IsMounted() then
|
contrebasse@28
|
261 DEFAULT_CHAT_FRAME:AddMessage("ismounted")
|
contrebasse@28
|
262 wasMounted = true
|
contrebasse@28
|
263 else
|
contrebasse@28
|
264 DEFAULT_CHAT_FRAME:AddMessage("notmounted")
|
contrebasse@28
|
265 if wasMounted then
|
contrebasse@28
|
266 DEFAULT_CHAT_FRAME:AddMessage("wasmounted : start")
|
contrebasse@28
|
267 wasMounted = false
|
contrebasse@28
|
268 start()
|
contrebasse@28
|
269 end
|
contrebasse@28
|
270 end
|
contrebasse@28
|
271 end
|
contrebasse@28
|
272 else
|
contrebasse@28
|
273 --]]
|
contrebasse@12
|
274 if events[event] then
|
contrebasse@12
|
275 if type(events[event])~="function" or events[event]() then
|
contrebasse@12
|
276 start()
|
contrebasse@12
|
277 end
|
contrebasse@12
|
278 elseif events1player[event] then
|
contrebasse@12
|
279 if arg1=="player" then
|
contrebasse@33
|
280 if event == "UNIT_SPELLCAST_START" then
|
contrebasse@33
|
281 --name, nameSubtext, text, texture, startTime, endTime, isTradeSkill, castID, notInterruptible = UnitCastingInfo("unit")
|
contrebasse@33
|
282 isTradeSkill = select(7,UnitCastingInfo("player"))
|
contrebasse@33
|
283 --DEFAULT_CHAT_FRAME:AddMessage(name)
|
contrebasse@33
|
284 --DEFAULT_CHAT_FRAME:AddMessage(isTradeSkill and "True" or "False")
|
contrebasse@33
|
285 --if isTradeSkill then
|
contrebasse@33
|
286
|
contrebasse@33
|
287 --end
|
contrebasse@33
|
288 --elseif arg5 and not SpellBlackList[arg5] then -- arg5 is SpellID
|
contrebasse@33
|
289 elseif (arg5 and SpellWhiteList[arg5]) or isTradeSkill then -- arg5 is SpellID
|
contrebasse@33
|
290 isTradeSkill = false -- for next time
|
contrebasse@33
|
291 start(0.5)
|
contrebasse@12
|
292 end
|
contrebasse@12
|
293 end
|
contrebasse@12
|
294 elseif events2playername[event] then
|
contrebasse@12
|
295 if arg2==playername then
|
contrebasse@12
|
296 start()
|
contrebasse@12
|
297 end
|
contrebasse@14
|
298 elseif event == "GOSSIP_CLOSED" then
|
contrebasse@14
|
299 wasGossipOpened = not isGossipClosed
|
contrebasse@14
|
300 isGossipClosed = true
|
contrebasse@14
|
301 t_lastGossipClosed = GetTime()
|
contrebasse@5
|
302
|
contrebasse@0
|
303 elseif event == "PLAYER_REGEN_ENABLED" then
|
contrebasse@21
|
304 for k,_ in pairs(events1player) do DegaineFrame:UnregisterEvent(k) end
|
contrebasse@21
|
305 --desactivate()
|
contrebasse@0
|
306 elseif event == "PLAYER_REGEN_DISABLED" then
|
contrebasse@22
|
307 for k,_ in pairs(events1player) do DegaineFrame:RegisterEvent(k) end
|
contrebasse@22
|
308 --activate()
|
contrebasse@5
|
309
|
contrebasse@0
|
310 elseif event == "ADDON_LOADED" and arg1==AddonName then
|
contrebasse@5
|
311 if Degaine_isAuto==nil then
|
contrebasse@5
|
312 Degaine_isAuto = true
|
contrebasse@0
|
313 end
|
contrebasse@11
|
314 if Degaine_isAuto then activate() else desactivate() end
|
contrebasse@5
|
315 printState()
|
contrebasse@5
|
316
|
contrebasse@5
|
317 -- Not needed anymore
|
contrebasse@5
|
318 DegaineFrame:UnregisterEvent("ADDON_LOADED")
|
contrebasse@31
|
319
|
contrebasse@31
|
320 elseif event == "PLAYER_LOGIN" then
|
contrebasse@31
|
321 -- add some spell to the blacklist
|
contrebasse@31
|
322 for i=1,GetNumCompanions("CRITTER") do
|
contrebasse@31
|
323 -- creatureID, creatureName, creatureSpellID, icon, issummoned = GetCompanionInfo("CRITTER", i)
|
contrebasse@31
|
324 local _, _, creatureSpellID = GetCompanionInfo("CRITTER", i)
|
contrebasse@31
|
325 if creatureSpellID ~= 55068 then -- Mr Chilly stealth weapons...
|
contrebasse@31
|
326 SpellBlackList[creatureSpellID] = true
|
contrebasse@31
|
327 end
|
contrebasse@31
|
328 end
|
contrebasse@31
|
329
|
contrebasse@31
|
330 -- mount is important only if the invocation is cancelled
|
contrebasse@31
|
331 for i=1,GetNumCompanions("MOUNT") do
|
contrebasse@31
|
332 -- creatureID, creatureName, creatureSpellID, icon, issummoned = GetCompanionInfo("MOUNT", i)
|
contrebasse@31
|
333 local _, _, creatureSpellID = GetCompanionInfo("MOUNT", i)
|
contrebasse@31
|
334 if creatureSpellID ~= 48778 then -- Acherus Deathcharger stealth weapons...
|
contrebasse@31
|
335 SpellBlackList[creatureSpellID] = true
|
contrebasse@31
|
336 end
|
contrebasse@31
|
337 end
|
contrebasse@0
|
338 end
|
contrebasse@0
|
339 end
|
contrebasse@31
|
340
|
contrebasse@5
|
341 -- Hook when standing up
|
contrebasse@5
|
342 -- (Didn't work, see http://forums.wowace.com/showthread.php?p=310547#post310547)
|
contrebasse@8
|
343 hooksecurefunc("SitStandOrDescendStart",start);
|
contrebasse@0
|
344
|
contrebasse@0
|
345
|
contrebasse@6
|
346 ---------------------------------------------------------------
|
contrebasse@6
|
347 -- Commands
|
contrebasse@6
|
348 ---------------------------------------------------------------
|
contrebasse@6
|
349 -- Bindings
|
contrebasse@6
|
350 BINDING_HEADER_DEGAINE = "Dégainer automatiquement"
|
contrebasse@6
|
351
|
contrebasse@6
|
352 -- Slash command
|
contrebasse@7
|
353 -- GLOBALS: SLASH_DEGAINE1
|
contrebasse@7
|
354 SLASH_DEGAINE1 = "/degaine"
|
contrebasse@6
|
355 SlashCmdList["DEGAINE"] = Degaine_ToggleAuto
|
contrebasse@6
|
356
|
contrebasse@5
|
357
|
contrebasse@5
|
358 ---------------------------------------------------------------
|
contrebasse@5
|
359 -- Initialization
|
contrebasse@5
|
360 ---------------------------------------------------------------
|
contrebasse@5
|
361 DegaineFrame:SetScript("OnEvent",Degaine_OnEvent)
|
contrebasse@5
|
362
|
contrebasse@5
|
363 -- Global events
|
contrebasse@14
|
364 DegaineFrame:RegisterEvent("GOSSIP_CLOSED")
|
contrebasse@5
|
365 DegaineFrame:RegisterEvent("PLAYER_REGEN_ENABLED")
|
contrebasse@5
|
366 DegaineFrame:RegisterEvent("PLAYER_REGEN_DISABLED")
|
contrebasse@5
|
367 DegaineFrame:RegisterEvent("ADDON_LOADED")
|
contrebasse@31
|
368 DegaineFrame:RegisterEvent("PLAYER_LOGIN")
|
contrebasse@5
|
369 activate()
|
contrebasse@12
|
370
|