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@0
|
35
|
contrebasse@0
|
36
|
contrebasse@5
|
37 ---------------------------------------------------------------
|
contrebasse@8
|
38 -- Local vars
|
contrebasse@8
|
39 ---------------------------------------------------------------
|
contrebasse@8
|
40 -- const
|
contrebasse@8
|
41 local DegaineFrame = CreateFrame("Frame")
|
contrebasse@8
|
42 local playername = UnitName("player")
|
contrebasse@24
|
43 local delay = 2 -- seconds
|
contrebasse@8
|
44
|
contrebasse@8
|
45 -- vars
|
contrebasse@8
|
46 local t_left = -1
|
contrebasse@14
|
47 local isGossipClosed = true
|
contrebasse@14
|
48 local wasGossipOpened = false
|
contrebasse@14
|
49 local t_lastGossipClosed = 0
|
contrebasse@24
|
50 local wasMounted = IsMounted() -- handle mounts with UNIT_AURA
|
contrebasse@8
|
51
|
contrebasse@12
|
52
|
contrebasse@8
|
53 ---------------------------------------------------------------
|
contrebasse@5
|
54 -- Some stuff...
|
contrebasse@5
|
55 ---------------------------------------------------------------
|
contrebasse@5
|
56 -- Bindings
|
contrebasse@5
|
57 BINDING_HEADER_DEGAINE = "Dégainer automatiquement"
|
contrebasse@5
|
58
|
contrebasse@5
|
59 -- Print status
|
contrebasse@5
|
60 local printState = function()
|
contrebasse@11
|
61 DEFAULT_CHAT_FRAME:AddMessage(Degaine_isAuto and "Dégainage automatique |cFF00FF00activé|r" or "Dégainage automatique |cFFFF0000désactivé|r")
|
contrebasse@5
|
62 end
|
contrebasse@5
|
63
|
contrebasse@5
|
64
|
contrebasse@5
|
65 ---------------------------------------------------------------
|
contrebasse@28
|
66 -- Launch drawing weapons
|
contrebasse@28
|
67 ---------------------------------------------------------------
|
contrebasse@28
|
68 -- Wait a few seconds before drawing, to be able to see the curren animation (and avoid bugs)
|
contrebasse@28
|
69 local Degaine_OnUpdate = function(self,t_elapsed)
|
contrebasse@28
|
70 t_left = t_left - t_elapsed;
|
contrebasse@28
|
71 if t_left<=0 then
|
contrebasse@28
|
72 ToggleSheath()
|
contrebasse@28
|
73 DegaineFrame:SetScript("OnUpdate", nil)
|
contrebasse@28
|
74 end
|
contrebasse@28
|
75 end
|
contrebasse@28
|
76 local start = function()
|
contrebasse@28
|
77 if Degaine_isAuto and not InCombatLockdown() then
|
contrebasse@28
|
78 t_left = delay
|
contrebasse@28
|
79 DegaineFrame:SetScript("OnUpdate", Degaine_OnUpdate)
|
contrebasse@28
|
80 end
|
contrebasse@28
|
81 end
|
contrebasse@28
|
82
|
contrebasse@28
|
83
|
contrebasse@28
|
84 ---------------------------------------------------------------
|
contrebasse@5
|
85 -- Events config
|
contrebasse@5
|
86 ---------------------------------------------------------------
|
contrebasse@5
|
87 -- Events to watch
|
contrebasse@5
|
88 local events = { -- no args to watch
|
contrebasse@14
|
89 GOSSIP_SHOW = function()
|
contrebasse@19
|
90 -- isGossipClosed :
|
contrebasse@19
|
91 -- if the gossip is already opened, no need to draw weapon
|
contrebasse@19
|
92 -- UnitName("npc")==UnitName("target") :
|
contrebasse@19
|
93 -- hack gossips again because there's no emote with non npc
|
contrebasse@19
|
94 -- you have to target the npc to interact with it
|
contrebasse@19
|
95 -- things such as boards can't be targeted and start no emote
|
contrebasse@17
|
96 local returnvalue = isGossipClosed and UnitName("npc")==UnitName("target")
|
contrebasse@14
|
97 isGossipClosed = false
|
contrebasse@14
|
98 return returnvalue
|
contrebasse@14
|
99 end,
|
contrebasse@14
|
100 MERCHANT_SHOW = function()
|
contrebasse@19
|
101 -- hack for the cases where the merchant's frame is opened from a gossip frame :
|
contrebasse@19
|
102 -- the gossip is closed and the merchant opened but the weapon is not stealthed
|
contrebasse@14
|
103 if (GetTime() - t_lastGossipClosed) < 0.5 then
|
contrebasse@14
|
104 return not wasGossipOpened
|
contrebasse@14
|
105 else
|
contrebasse@14
|
106 return isGossipClosed
|
contrebasse@14
|
107 end
|
contrebasse@14
|
108 end,
|
contrebasse@11
|
109 BANKFRAME_OPENED = true, --function() return GossipFrame:IsShown() end,
|
contrebasse@0
|
110 AUCTION_HOUSE_SHOW = true,
|
contrebasse@5
|
111 }
|
contrebasse@5
|
112 local events1player = { -- the first arg is "player"
|
contrebasse@5
|
113 UNIT_SPELLCAST_FAILED = true,
|
contrebasse@5
|
114 UNIT_SPELLCAST_INTERRUPTED = true,
|
contrebasse@5
|
115 UNIT_SPELLCAST_SUCCEEDED = true,
|
contrebasse@5
|
116 }
|
contrebasse@28
|
117 local SpellWhiteList = {
|
contrebasse@28
|
118 [8690] = true, -- Heartstone
|
contrebasse@28
|
119 [818] = true, -- Basic Campfire
|
contrebasse@28
|
120 }
|
contrebasse@28
|
121 --[[
|
contrebasse@12
|
122 local SpellBlackList = { -- spells that don't stealth weapons (works with events1player)
|
contrebasse@12
|
123 [1784] = true, -- Stealth (Rogue)
|
contrebasse@12
|
124 [58984] = true, -- Shadowmeld (Nightelf stealth)
|
contrebasse@13
|
125
|
contrebasse@13
|
126 -- Tradeskill spells
|
contrebasse@13
|
127 [2259] = true, -- Alchemy
|
contrebasse@13
|
128 [45357] = true, -- Inscription
|
contrebasse@13
|
129 [3908] = true, -- Tailoring
|
contrebasse@13
|
130 [7411] = true, -- Enchanting
|
contrebasse@13
|
131 [2018] = true, -- Blacksmithing
|
contrebasse@13
|
132 [4036] = true, -- Engineering
|
contrebasse@13
|
133 [25229] = true, -- Jewelcrafting
|
contrebasse@13
|
134 [2656] = true, -- Smelting
|
contrebasse@13
|
135 [2108] = true, -- Leatherworking
|
contrebasse@13
|
136 [2550] = true, -- Cooking
|
contrebasse@13
|
137 [3273] = true, -- First Aid
|
contrebasse@13
|
138 [53428] = true -- Runeforge
|
contrebasse@13
|
139 -- Archaeology ?
|
contrebasse@12
|
140 }
|
contrebasse@28
|
141 --]]
|
contrebasse@5
|
142 local events2playername = { -- the 2nd arg is playername
|
contrebasse@5
|
143 CHAT_MSG_SAY = true,
|
contrebasse@5
|
144 CHAT_MSG_YELL = true,
|
contrebasse@5
|
145 CHAT_MSG_TEXT_EMOTE = true,
|
contrebasse@5
|
146 }
|
contrebasse@0
|
147
|
contrebasse@0
|
148
|
contrebasse@5
|
149 ---------------------------------------------------------------
|
contrebasse@24
|
150 -- Handle mounts with OnUpdate
|
contrebasse@24
|
151 ---------------------------------------------------------------
|
contrebasse@24
|
152 -- works with GupPet but not with the default interface...
|
contrebasse@24
|
153 -- I guess that's because a specific /cancelaura or alike is done
|
contrebasse@24
|
154 -- hooksecurefunc("Dismount",start);
|
contrebasse@24
|
155
|
contrebasse@28
|
156 -- With OnUpdate
|
contrebasse@24
|
157 local handleMountsFrame = CreateFrame("frame")
|
contrebasse@24
|
158 local handleMountsOnUpdate
|
contrebasse@24
|
159 do
|
contrebasse@24
|
160 local IsMounted = IsMounted
|
contrebasse@24
|
161 local wasMounted = IsMounted()
|
contrebasse@24
|
162 function handleMountsOnUpdate(self,t_elapsed)
|
contrebasse@24
|
163 if IsMounted() then
|
contrebasse@24
|
164 wasMounted = true
|
contrebasse@24
|
165 else
|
contrebasse@24
|
166 if wasMounted then
|
contrebasse@24
|
167 start()
|
contrebasse@24
|
168 wasMounted = false
|
contrebasse@24
|
169 end
|
contrebasse@24
|
170 end
|
contrebasse@24
|
171 end
|
contrebasse@24
|
172 end
|
contrebasse@5
|
173
|
contrebasse@12
|
174
|
contrebasse@5
|
175 ---------------------------------------------------------------
|
contrebasse@5
|
176 -- Activation functions
|
contrebasse@5
|
177 ---------------------------------------------------------------
|
contrebasse@5
|
178 local activate = function()
|
contrebasse@5
|
179 if (not Degaine_isAuto) or InCombatLockdown() then return end
|
contrebasse@5
|
180
|
contrebasse@9
|
181 --DegaineFrame:SetScript("OnUpdate", Degaine_OnUpdate);
|
contrebasse@5
|
182 --@debug@
|
contrebasse@5
|
183 if debug then
|
contrebasse@11
|
184 DegaineFrame:RegisterAllEvents()
|
contrebasse@5
|
185 else
|
contrebasse@5
|
186 --@end-debug@
|
contrebasse@18
|
187 for k,_ in pairs(events) do DegaineFrame:RegisterEvent(k) end
|
contrebasse@18
|
188 for k,_ in pairs(events1player) do DegaineFrame:RegisterEvent(k) end
|
contrebasse@18
|
189 for k,_ in pairs(events2playername) do DegaineFrame:RegisterEvent(k) end
|
contrebasse@28
|
190 --DegaineFrame:RegisterEvent("UNIT_AURA")
|
contrebasse@28
|
191 handleMountsFrame:SetScript("OnUpdate",handleMountsOnUpdate)
|
contrebasse@5
|
192 --@end-debug@
|
contrebasse@5
|
193 end
|
contrebasse@5
|
194 --@end-debug@
|
contrebasse@0
|
195 end
|
contrebasse@5
|
196 local desactivate = function()
|
contrebasse@24
|
197 DegaineFrame:SetScript("OnUpdate", nil)
|
contrebasse@24
|
198 t_left = -1
|
contrebasse@18
|
199 for k,_ in pairs(events) do DegaineFrame:UnregisterEvent(k) end
|
contrebasse@18
|
200 for k,_ in pairs(events1player) do DegaineFrame:UnregisterEvent(k) end
|
contrebasse@18
|
201 for k,_ in pairs(events2playername) do DegaineFrame:UnregisterEvent(k) end
|
contrebasse@28
|
202 --DegaineFrame:UnregisterEvent("UNIT_AURA")
|
contrebasse@28
|
203 handleMountsFrame:SetScript("OnUpdate",nil)
|
contrebasse@0
|
204 end
|
contrebasse@6
|
205 Degaine_ToggleAuto = function()
|
contrebasse@5
|
206 if Degaine_isAuto then
|
contrebasse@5
|
207 Degaine_isAuto = false
|
contrebasse@5
|
208 desactivate()
|
contrebasse@5
|
209 else
|
contrebasse@5
|
210 Degaine_isAuto = true
|
contrebasse@5
|
211 activate()
|
contrebasse@5
|
212 end
|
contrebasse@5
|
213 printState()
|
contrebasse@5
|
214 end
|
contrebasse@0
|
215
|
contrebasse@5
|
216
|
contrebasse@24
|
217
|
contrebasse@5
|
218 ---------------------------------------------------------------
|
contrebasse@5
|
219 -- Event/hooks functions
|
contrebasse@5
|
220 ---------------------------------------------------------------
|
contrebasse@12
|
221 local Degaine_OnEvent = function(self,event, arg1, arg2, _, _, arg5, ...)
|
contrebasse@5
|
222 --@debug@
|
contrebasse@14
|
223 --if debug then
|
contrebasse@5
|
224 DEFAULT_CHAT_FRAME:AddMessage(event)
|
contrebasse@14
|
225 --if arg1 then DEFAULT_CHAT_FRAME:AddMessage("arg1 = "..arg1) end
|
contrebasse@14
|
226 --if arg2 then DEFAULT_CHAT_FRAME:AddMessage("arg2 = "..arg2) end
|
contrebasse@14
|
227 --end
|
contrebasse@5
|
228 --@end-debug@
|
contrebasse@5
|
229
|
contrebasse@28
|
230 --[[ IsMounted() renvoie toujours false ici, on doit passer par OnUpdate
|
contrebasse@28
|
231 if event=="UNIT_AURA" then
|
contrebasse@28
|
232 if arg1=="player" then
|
contrebasse@28
|
233 DEFAULT_CHAT_FRAME:AddMessage("player")
|
contrebasse@28
|
234 if IsMounted() then
|
contrebasse@28
|
235 DEFAULT_CHAT_FRAME:AddMessage("ismounted")
|
contrebasse@28
|
236 wasMounted = true
|
contrebasse@28
|
237 else
|
contrebasse@28
|
238 DEFAULT_CHAT_FRAME:AddMessage("notmounted")
|
contrebasse@28
|
239 if wasMounted then
|
contrebasse@28
|
240 DEFAULT_CHAT_FRAME:AddMessage("wasmounted : start")
|
contrebasse@28
|
241 wasMounted = false
|
contrebasse@28
|
242 start()
|
contrebasse@28
|
243 end
|
contrebasse@28
|
244 end
|
contrebasse@28
|
245 end
|
contrebasse@28
|
246 else
|
contrebasse@28
|
247 --]]
|
contrebasse@12
|
248 if events[event] then
|
contrebasse@12
|
249 if type(events[event])~="function" or events[event]() then
|
contrebasse@12
|
250 start()
|
contrebasse@12
|
251 end
|
contrebasse@12
|
252 elseif events1player[event] then
|
contrebasse@12
|
253 if arg1=="player" then
|
contrebasse@28
|
254 if arg5==nil or SpellWhiteList[arg5] then -- arg5 is SpellID
|
contrebasse@12
|
255 start()
|
contrebasse@12
|
256 end
|
contrebasse@12
|
257 end
|
contrebasse@12
|
258 elseif events2playername[event] then
|
contrebasse@12
|
259 if arg2==playername then
|
contrebasse@12
|
260 start()
|
contrebasse@12
|
261 end
|
contrebasse@14
|
262 elseif event == "GOSSIP_CLOSED" then
|
contrebasse@14
|
263 wasGossipOpened = not isGossipClosed
|
contrebasse@14
|
264 isGossipClosed = true
|
contrebasse@14
|
265 t_lastGossipClosed = GetTime()
|
contrebasse@5
|
266
|
contrebasse@0
|
267 elseif event == "PLAYER_REGEN_ENABLED" then
|
contrebasse@21
|
268 for k,_ in pairs(events1player) do DegaineFrame:UnregisterEvent(k) end
|
contrebasse@21
|
269 --desactivate()
|
contrebasse@0
|
270 elseif event == "PLAYER_REGEN_DISABLED" then
|
contrebasse@22
|
271 for k,_ in pairs(events1player) do DegaineFrame:RegisterEvent(k) end
|
contrebasse@22
|
272 --activate()
|
contrebasse@5
|
273
|
contrebasse@0
|
274 elseif event == "ADDON_LOADED" and arg1==AddonName then
|
contrebasse@5
|
275 if Degaine_isAuto==nil then
|
contrebasse@5
|
276 Degaine_isAuto = true
|
contrebasse@0
|
277 end
|
contrebasse@11
|
278 if Degaine_isAuto then activate() else desactivate() end
|
contrebasse@5
|
279 printState()
|
contrebasse@5
|
280
|
contrebasse@5
|
281 -- Not needed anymore
|
contrebasse@5
|
282 DegaineFrame:UnregisterEvent("ADDON_LOADED")
|
contrebasse@0
|
283 end
|
contrebasse@0
|
284 end
|
contrebasse@5
|
285 -- Hook when standing up
|
contrebasse@5
|
286 -- (Didn't work, see http://forums.wowace.com/showthread.php?p=310547#post310547)
|
contrebasse@8
|
287 hooksecurefunc("SitStandOrDescendStart",start);
|
contrebasse@0
|
288
|
contrebasse@0
|
289
|
contrebasse@6
|
290 ---------------------------------------------------------------
|
contrebasse@6
|
291 -- Commands
|
contrebasse@6
|
292 ---------------------------------------------------------------
|
contrebasse@6
|
293 -- Bindings
|
contrebasse@6
|
294 BINDING_HEADER_DEGAINE = "Dégainer automatiquement"
|
contrebasse@6
|
295
|
contrebasse@6
|
296 -- Slash command
|
contrebasse@7
|
297 -- GLOBALS: SLASH_DEGAINE1
|
contrebasse@7
|
298 SLASH_DEGAINE1 = "/degaine"
|
contrebasse@6
|
299 SlashCmdList["DEGAINE"] = Degaine_ToggleAuto
|
contrebasse@6
|
300
|
contrebasse@5
|
301
|
contrebasse@5
|
302 ---------------------------------------------------------------
|
contrebasse@5
|
303 -- Initialization
|
contrebasse@5
|
304 ---------------------------------------------------------------
|
contrebasse@5
|
305 DegaineFrame:SetScript("OnEvent",Degaine_OnEvent)
|
contrebasse@5
|
306
|
contrebasse@5
|
307 -- Global events
|
contrebasse@14
|
308 DegaineFrame:RegisterEvent("GOSSIP_CLOSED")
|
contrebasse@5
|
309 DegaineFrame:RegisterEvent("PLAYER_REGEN_ENABLED")
|
contrebasse@5
|
310 DegaineFrame:RegisterEvent("PLAYER_REGEN_DISABLED")
|
contrebasse@5
|
311 DegaineFrame:RegisterEvent("ADDON_LOADED")
|
contrebasse@5
|
312 activate()
|
contrebasse@12
|
313
|