comparison Degaine.lua @ 63:3daeb57da1a9 tip

Automated merge with ssh://hg.wowace.com/wow/degaine/mainline
author contrebasse
date Wed, 01 Jun 2011 19:16:37 +0200
parents 16828b1f9f9d
children
comparison
equal deleted inserted replaced
61:60dfeef23620 63:3daeb57da1a9
1 local AddonName, T = ...
2 -- Draw your weapons automagically
3
4
5 ---------------------------------------------------------------
6 -- Known bugs
7 ---------------------------------------------------------------
8 -- If you stand up by jumping or walking it won't draw your weapon
9 -- (it's not possible to know if you were sitting or standing before)
10
11 --@debug@
12 local debug = false
13 local debugAll = false
14 --@end-debug@
15
16
17 ---------------------------------------------------------------
18 -- Globals to local
19 ---------------------------------------------------------------
20 -- These need to be globals :
21 -- GLOBALS: Degaine_ToggleAuto, Degaine_isAuto, BINDING_HEADER_DEGAINE, BINDING_NAME_DEGAINE_TOGGLE
22
23 -- It doesn't matter if they are globals, rarely unsed :
24 -- GLOBALS: DEFAULT_CHAT_FRAME
25
26 -- Lua functions
27 local pairs = pairs;
28 local type = type;
29 local select = select
30 local wipe = wipe
31
32 -- Wow functions
33 local GetTime = GetTime
34 local InCombatLockdown = InCombatLockdown
35 local UnitName = UnitName
36 local IsMounted = IsMounted
37 local UnitCastingInfo = UnitCastingInfo
38 local GetUnitSpeed = GetUnitSpeed
39 local UnitBuff = UnitBuff
40 -- The hook has to be done before registering the local reference
41 local t_lastDegaine = 0 -- Time of the last draw
42 hooksecurefunc("ToggleSheath",function()
43 t_lastDegaine = GetTime()
44 end);
45 local ToggleSheath = ToggleSheath
46
47
48 ---------------------------------------------------------------
49 -- Local vars
50 ---------------------------------------------------------------
51 -- const
52 local DegaineFrame = CreateFrame("Frame")
53 local playername = UnitName("player")
54 local delay = 2.5 -- seconds
55 local delay_short = 0.5 -- seconds
56
57 -- vars
58 local t_left = -1
59 local isGossipClosed = true
60 local wasGossipOpened = false
61 local t_lastGossipClosed = 0
62 --local wasMounted = IsMounted() -- handle mounts with UNIT_AURA
63 local isTradeSkill = false
64
65
66 ---------------------------------------------------------------
67 -- Some stuff...
68 ---------------------------------------------------------------
69 -- Print status
70 local printState = function()
71 DEFAULT_CHAT_FRAME:AddMessage(Degaine_isAuto and T.L["PRINT_ENABLED"] or T.L["PRINT_DISABLED"])
72 end
73
74
75 ---------------------------------------------------------------
76 -- Launch drawing weapons
77 ---------------------------------------------------------------
78
79 -- Wait a few seconds before drawing, to be able to see the curren animation (and avoid bugs)
80 local Degaine_OnUpdate = function(self,t_elapsed)
81 t_left = t_left - t_elapsed;
82 if t_left<=0 then
83 ToggleSheath()
84 DegaineFrame:SetScript("OnUpdate", nil)
85 end
86 end
87 local start = function(arg_delay)
88
89 --@debug@
90 --DEFAULT_CHAT_FRAME:AddMessage("Go !")
91 --@end-debug@
92
93 if Degaine_isAuto and (GetTime()-t_lastDegaine)>1 and not InCombatLockdown() then
94 t_left = arg_delay or delay
95 DegaineFrame:SetScript("OnUpdate", Degaine_OnUpdate)
96 end
97 end
98
99
100 ---------------------------------------------------------------
101 -- Events config
102 ---------------------------------------------------------------
103 -- Events to watch
104 local events = { -- no args to watch
105 GOSSIP_SHOW = function()
106 -- isGossipClosed :
107 -- if the gossip is already opened, no need to draw weapon
108 -- UnitName("npc")==UnitName("target") :
109 -- hack gossips again because there's no emote with non npc
110 -- you have to target the npc to interact with it
111 -- things such as boards can't be targeted and start no emote
112 local returnvalue = isGossipClosed and UnitName("npc")==UnitName("target")
113 isGossipClosed = false
114 return returnvalue
115 end,
116 MERCHANT_SHOW = function()
117 -- hack for the cases where the merchant's frame is opened from a gossip frame :
118 -- the gossip is closed and the merchant opened but the weapon is not stealthed
119 if (GetTime() - t_lastGossipClosed) < 0.5 then
120 return not wasGossipOpened
121 else
122 return isGossipClosed
123 end
124 end,
125 QUEST_PROGRESS = true,
126 BANKFRAME_OPENED = true, --function() return GossipFrame:IsShown() end,
127 AUCTION_HOUSE_SHOW = true,
128 }
129 local events1player = { -- the first arg is "player"
130 UNIT_SPELLCAST_FAILED = true,
131 UNIT_SPELLCAST_INTERRUPTED = true,
132 UNIT_SPELLCAST_SUCCEEDED = true,
133 UNIT_SPELLCAST_START = true, -- to ckeck tradeskill
134 }
135
136 --[[
137 -- Was used when moving prevented to play the emote when talking
138 -- Was needed for CHAT_MSG_SAY and CHAT_MSG_YELL
139 local function playerIsNotMoving()
140 return GetUnitSpeed("player") == 0
141 end
142 --]]
143 local events2playername = { -- the 2nd arg is playername
144 CHAT_MSG_SAY = true,
145 CHAT_MSG_YELL = true,
146 CHAT_MSG_TEXT_EMOTE = true, -- the emote is not shown, but the weapon is stealthed
147 }
148
149
150 ---------------------------------------------------------------
151 -- Handle mounts with OnUpdate
152 ---------------------------------------------------------------
153 -- works with GupPet but not with the default interface...
154 -- I guess that's because a specific /cancelaura or alike is done
155 -- hooksecurefunc("Dismount",start);
156
157 -- With OnUpdate
158 local handleMountsFrame = CreateFrame("frame")
159 local handleMountsOnUpdate
160 do
161 local IsMounted = IsMounted
162 local wasMounted = IsMounted()
163 local buffsIDs = {}
164 function handleMountsOnUpdate(self,t_elapsed)
165 if IsMounted() then
166 wasMounted = true
167 else
168 if wasMounted then
169 start(delay_short) -- no animation for unmounting
170 wasMounted = false
171 end
172 end
173
174 -- hack to watch auras too
175 -- Loop over all buffs
176 -- name, rank, icon, count, debuffType, duration, expirationTime, unitCaster, isStealable,
177 -- shouldConsolidate, spellId = UnitBuff("unit", index or ["name", "rank"][, "filter"])
178 local i = 1
179 -- list player's buffs
180 local buffID = select(11,UnitBuff("player", i)); -- spell id
181 while buffID do
182 buffsIDs[buffID] = true
183 i = i + 1;
184 buffID = select(11,UnitBuff("player", i));
185 end
186 --[[
187 for i=1,40 do
188 buffID = select(11,UnitBuff("player", i));
189 if buffID then
190 buffsIDs[buffID] = true
191 end
192 end
193 --]]
194 --@debug@
195 --if debug then
196 -- DEFAULT_CHAT_FRAME:AddMessage(""..i-1.."Buff(s) found")
197 --end
198 --@end-debug@
199
200 -- loop over watched buffs to check if it is present or not
201 -- we have to loop over T.LoseAura (and not buffsIDs) to be able to check for buff disappearance
202 for id,state in pairs(T.LoseAura) do
203 if buffsIDs[id] then
204 if not T.LoseAura[id] then
205 -- buff gained
206 --@debug@
207 if debug then
208 DEFAULT_CHAT_FRAME:AddMessage("Buff gained: "..id)
209 end
210 --@end-debug@
211 T.LoseAura[id] = true
212 end
213 else
214 if T.LoseAura[id] then
215 -- buff lost
216 --@debug@
217 if debug then
218 DEFAULT_CHAT_FRAME:AddMessage("Buff lost: "..id)
219 end
220 --@end-debug@
221 T.LoseAura[id] = false
222
223 -- draw weapon
224 start()
225 end
226 end
227 end
228
229 -- empty temporary table
230 wipe(buffsIDs)
231 end
232 end
233
234
235 ---------------------------------------------------------------
236 -- Activation functions
237 ---------------------------------------------------------------
238 local activate = function()
239 if (not Degaine_isAuto) or InCombatLockdown() then return end
240
241 --DegaineFrame:SetScript("OnUpdate", Degaine_OnUpdate);
242 --@debug@
243 if debugAll then
244 DegaineFrame:RegisterAllEvents()
245 else
246 --@end-debug@
247 for k,_ in pairs(events) do DegaineFrame:RegisterEvent(k) end
248 for k,_ in pairs(events1player) do DegaineFrame:RegisterEvent(k) end
249 for k,_ in pairs(events2playername) do DegaineFrame:RegisterEvent(k) end
250 --DegaineFrame:RegisterEvent("UNIT_AURA")
251 handleMountsFrame:SetScript("OnUpdate",handleMountsOnUpdate)
252 --@debug@
253 end
254 --@end-debug@
255 end
256 local desactivate = function()
257 DegaineFrame:SetScript("OnUpdate", nil)
258 t_left = -1
259 isTradeSkill = false
260 for k,_ in pairs(events) do DegaineFrame:UnregisterEvent(k) end
261 for k,_ in pairs(events1player) do DegaineFrame:UnregisterEvent(k) end
262 for k,_ in pairs(events2playername) do DegaineFrame:UnregisterEvent(k) end
263 --DegaineFrame:UnregisterEvent("UNIT_AURA")
264 handleMountsFrame:SetScript("OnUpdate",nil)
265 end
266 Degaine_ToggleAuto = function()
267 if Degaine_isAuto then
268 Degaine_isAuto = false
269 desactivate()
270 else
271 Degaine_isAuto = true
272 activate()
273 end
274 printState()
275 end
276
277
278
279 ---------------------------------------------------------------
280 -- Event/hooks functions
281 ---------------------------------------------------------------
282 local Degaine_OnEvent = function(self,event, arg1, arg2, _, _, arg5, ...)
283 --@debug@
284 if debug then
285 DEFAULT_CHAT_FRAME:AddMessage(event)
286 if arg1 then DEFAULT_CHAT_FRAME:AddMessage("arg1 = "..arg1) end
287 if arg2 then DEFAULT_CHAT_FRAME:AddMessage("arg2 = "..arg2) end
288 end
289 --@end-debug@
290
291 --[[ IsMounted() renvoie toujours false ici, on doit passer par OnUpdate
292 if event=="UNIT_AURA" then
293 if arg1=="player" then
294 DEFAULT_CHAT_FRAME:AddMessage("player")
295 if IsMounted() then
296 DEFAULT_CHAT_FRAME:AddMessage("ismounted")
297 wasMounted = true
298 else
299 DEFAULT_CHAT_FRAME:AddMessage("notmounted")
300 if wasMounted then
301 DEFAULT_CHAT_FRAME:AddMessage("wasmounted : start")
302 wasMounted = false
303 start()
304 end
305 end
306 end
307 else
308 --]]
309 if events[event] then
310 if type(events[event])~="function" or events[event]() then
311 start()
312 end
313 elseif events1player[event] then
314 if arg1=="player" then
315 if event == "UNIT_SPELLCAST_START" then
316 --name, nameSubtext, text, texture, startTime, endTime, isTradeSkill, castID, notInterruptible = UnitCastingInfo("unit")
317 isTradeSkill = select(7,UnitCastingInfo("player"))
318 --DEFAULT_CHAT_FRAME:AddMessage(name)
319 --DEFAULT_CHAT_FRAME:AddMessage(isTradeSkill and "True" or "False")
320 --if isTradeSkill then
321
322 --end
323 --elseif arg5 and not T.SpellBlackList[arg5] then -- arg5 is SpellID
324 elseif (arg5 and T.SpellWhiteList[arg5]) or isTradeSkill then -- arg5 is SpellID
325 isTradeSkill = false -- for next time
326 start(type(T.SpellWhiteList[arg5])=="number" and T.SpellWhiteList[arg5] or delay_short)
327 end
328 end
329 elseif events2playername[event] then
330 if arg2==playername and (type(events2playername[event])~="function" or events2playername[event]()) then
331 start()
332 end
333 elseif event == "GOSSIP_CLOSED" then
334 wasGossipOpened = not isGossipClosed
335 isGossipClosed = true
336 t_lastGossipClosed = GetTime()
337
338 elseif event == "PLAYER_REGEN_ENABLED" then
339 for k,_ in pairs(events1player) do DegaineFrame:UnregisterEvent(k) end
340 --desactivate()
341 elseif event == "PLAYER_REGEN_DISABLED" then
342 for k,_ in pairs(events1player) do DegaineFrame:RegisterEvent(k) end
343 --activate()
344
345 elseif event == "ADDON_LOADED" and arg1==AddonName then
346 if Degaine_isAuto==nil then
347 Degaine_isAuto = true
348 end
349 if Degaine_isAuto then activate() else desactivate() end
350 printState()
351
352 -- Not needed anymore
353 DegaineFrame:UnregisterEvent("ADDON_LOADED")
354
355 elseif event == "PLAYER_LOGIN" then
356 -- BLacklis alomst all Companions and mounts
357 T.DoBlackListCrittersAndMount()
358 end
359 end
360
361 -- Hook when standing up
362 -- (Didn't work, see http://forums.wowace.com/showthread.php?p=310547#post310547)
363 hooksecurefunc("SitStandOrDescendStart",start);
364
365
366 ---------------------------------------------------------------
367 -- Commands
368 ---------------------------------------------------------------
369 -- Bindings
370 BINDING_HEADER_DEGAINE = T.L["BINDING_HEADER"]
371 BINDING_NAME_DEGAINE_TOGGLE = T.L["BINDING_NAME_DEGAINE_TOGGLE"]
372
373 -- Slash command
374 -- GLOBALS: SLASH_DEGAINE1
375 SLASH_DEGAINE1 = "/degaine"
376 SlashCmdList["DEGAINE"] = Degaine_ToggleAuto
377
378
379 ---------------------------------------------------------------
380 -- Initialization
381 ---------------------------------------------------------------
382 DegaineFrame:SetScript("OnEvent",Degaine_OnEvent)
383
384 -- Global events
385 DegaineFrame:RegisterEvent("GOSSIP_CLOSED")
386 DegaineFrame:RegisterEvent("PLAYER_REGEN_ENABLED")
387 DegaineFrame:RegisterEvent("PLAYER_REGEN_DISABLED")
388 DegaineFrame:RegisterEvent("ADDON_LOADED")
389 DegaineFrame:RegisterEvent("PLAYER_LOGIN")
390 activate()