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