annotate Degaine.lua @ 41:a478b8a44b9e v1.0beta9

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