annotate Degaine.lua @ 39:2f955a56c2ca v1.0beta8

Debug the debug tag...
author contrebasse
date Sat, 15 Jan 2011 23:23:38 +0100
parents 2bca68b42a69
children a478b8a44b9e
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@11 115 BANKFRAME_OPENED = true, --function() return GossipFrame:IsShown() end,
contrebasse@0 116 AUCTION_HOUSE_SHOW = true,
contrebasse@5 117 }
contrebasse@5 118 local events1player = { -- the first arg is "player"
contrebasse@5 119 UNIT_SPELLCAST_FAILED = true,
contrebasse@5 120 UNIT_SPELLCAST_INTERRUPTED = true,
contrebasse@5 121 UNIT_SPELLCAST_SUCCEEDED = true,
contrebasse@33 122 UNIT_SPELLCAST_START = true, -- to ckeck tradeskill
contrebasse@5 123 }
contrebasse@30 124 local SpellWhiteList = { -- Spells that do steath weapons (works with events1player)
contrebasse@33 125 -- True recipes are treated separately
contrebasse@28 126 [8690] = true, -- Heartstone
contrebasse@28 127 [818] = true, -- Basic Campfire
contrebasse@33 128 [13262] = true, -- Disenchant
contrebasse@33 129 [51005] = true, -- Milling
contrebasse@33 130
contrebasse@33 131 -- Critters (exceptions)
contrebasse@33 132 [55068] = true, -- Mr Chilly
contrebasse@33 133
contrebasse@33 134 -- Mounts (exceptions)
contrebasse@33 135 [48778] = true, -- Acherus Deathcharger
contrebasse@33 136
contrebasse@28 137 }
contrebasse@31 138
contrebasse@12 139 local SpellBlackList = { -- spells that don't stealth weapons (works with events1player)
contrebasse@33 140 -- All vanity pets and mount are added at PLAYER_LOGIN
contrebasse@33 141
contrebasse@33 142 --
contrebasse@12 143 [1784] = true, -- Stealth (Rogue)
contrebasse@12 144 [58984] = true, -- Shadowmeld (Nightelf stealth)
contrebasse@13 145
contrebasse@33 146 -- DK presences
contrebasse@33 147 [48263] = true, -- Blood
contrebasse@33 148 [48266] = true, -- Frost
contrebasse@33 149 [48265] = true, -- Unholy
contrebasse@33 150
contrebasse@33 151 [3714] = true, -- Path of Frost
contrebasse@33 152
contrebasse@33 153
contrebasse@13 154 -- Tradeskill spells
contrebasse@13 155 [2259] = true, -- Alchemy
contrebasse@13 156 [45357] = true, -- Inscription
contrebasse@13 157 [3908] = true, -- Tailoring
contrebasse@13 158 [7411] = true, -- Enchanting
contrebasse@13 159 [2018] = true, -- Blacksmithing
contrebasse@13 160 [4036] = true, -- Engineering
contrebasse@13 161 [25229] = true, -- Jewelcrafting
contrebasse@13 162 [2656] = true, -- Smelting
contrebasse@13 163 [2108] = true, -- Leatherworking
contrebasse@13 164 [2550] = true, -- Cooking
contrebasse@13 165 [3273] = true, -- First Aid
contrebasse@13 166 [53428] = true -- Runeforge
contrebasse@13 167 -- Archaeology ?
contrebasse@12 168 }
contrebasse@31 169
contrebasse@35 170 local function playerIsNotMoving()
contrebasse@35 171 return GetUnitSpeed("player") == 0
contrebasse@35 172 end
contrebasse@5 173 local events2playername = { -- the 2nd arg is playername
contrebasse@35 174 CHAT_MSG_SAY = playerIsNotMoving,
contrebasse@35 175 CHAT_MSG_YELL = playerIsNotMoving,
contrebasse@35 176 CHAT_MSG_TEXT_EMOTE = true, -- the emote is not shown, but the weapon is stealthed
contrebasse@5 177 }
contrebasse@0 178
contrebasse@0 179
contrebasse@5 180 ---------------------------------------------------------------
contrebasse@24 181 -- Handle mounts with OnUpdate
contrebasse@24 182 ---------------------------------------------------------------
contrebasse@24 183 -- works with GupPet but not with the default interface...
contrebasse@24 184 -- I guess that's because a specific /cancelaura or alike is done
contrebasse@24 185 -- hooksecurefunc("Dismount",start);
contrebasse@24 186
contrebasse@28 187 -- With OnUpdate
contrebasse@24 188 local handleMountsFrame = CreateFrame("frame")
contrebasse@24 189 local handleMountsOnUpdate
contrebasse@24 190 do
contrebasse@24 191 local IsMounted = IsMounted
contrebasse@24 192 local wasMounted = IsMounted()
contrebasse@24 193 function handleMountsOnUpdate(self,t_elapsed)
contrebasse@24 194 if IsMounted() then
contrebasse@24 195 wasMounted = true
contrebasse@24 196 else
contrebasse@24 197 if wasMounted then
contrebasse@35 198 start(delay_short) -- no animation for unmounting
contrebasse@24 199 wasMounted = false
contrebasse@24 200 end
contrebasse@24 201 end
contrebasse@24 202 end
contrebasse@24 203 end
contrebasse@5 204
contrebasse@12 205
contrebasse@5 206 ---------------------------------------------------------------
contrebasse@5 207 -- Activation functions
contrebasse@5 208 ---------------------------------------------------------------
contrebasse@5 209 local activate = function()
contrebasse@5 210 if (not Degaine_isAuto) or InCombatLockdown() then return end
contrebasse@5 211
contrebasse@9 212 --DegaineFrame:SetScript("OnUpdate", Degaine_OnUpdate);
contrebasse@5 213 --@debug@
contrebasse@5 214 if debug then
contrebasse@11 215 DegaineFrame:RegisterAllEvents()
contrebasse@5 216 else
contrebasse@5 217 --@end-debug@
contrebasse@18 218 for k,_ in pairs(events) do DegaineFrame:RegisterEvent(k) end
contrebasse@18 219 for k,_ in pairs(events1player) do DegaineFrame:RegisterEvent(k) end
contrebasse@18 220 for k,_ in pairs(events2playername) do DegaineFrame:RegisterEvent(k) end
contrebasse@28 221 --DegaineFrame:RegisterEvent("UNIT_AURA")
contrebasse@28 222 handleMountsFrame:SetScript("OnUpdate",handleMountsOnUpdate)
contrebasse@39 223 --@debug@
contrebasse@5 224 end
contrebasse@5 225 --@end-debug@
contrebasse@0 226 end
contrebasse@5 227 local desactivate = function()
contrebasse@24 228 DegaineFrame:SetScript("OnUpdate", nil)
contrebasse@24 229 t_left = -1
contrebasse@37 230 isTradeSkill = false
contrebasse@18 231 for k,_ in pairs(events) do DegaineFrame:UnregisterEvent(k) end
contrebasse@18 232 for k,_ in pairs(events1player) do DegaineFrame:UnregisterEvent(k) end
contrebasse@18 233 for k,_ in pairs(events2playername) do DegaineFrame:UnregisterEvent(k) end
contrebasse@28 234 --DegaineFrame:UnregisterEvent("UNIT_AURA")
contrebasse@28 235 handleMountsFrame:SetScript("OnUpdate",nil)
contrebasse@0 236 end
contrebasse@6 237 Degaine_ToggleAuto = function()
contrebasse@5 238 if Degaine_isAuto then
contrebasse@5 239 Degaine_isAuto = false
contrebasse@5 240 desactivate()
contrebasse@5 241 else
contrebasse@5 242 Degaine_isAuto = true
contrebasse@5 243 activate()
contrebasse@5 244 end
contrebasse@5 245 printState()
contrebasse@5 246 end
contrebasse@0 247
contrebasse@5 248
contrebasse@24 249
contrebasse@5 250 ---------------------------------------------------------------
contrebasse@5 251 -- Event/hooks functions
contrebasse@5 252 ---------------------------------------------------------------
contrebasse@12 253 local Degaine_OnEvent = function(self,event, arg1, arg2, _, _, arg5, ...)
contrebasse@5 254 --@debug@
contrebasse@14 255 --if debug then
contrebasse@31 256 --DEFAULT_CHAT_FRAME:AddMessage(event)
contrebasse@14 257 --if arg1 then DEFAULT_CHAT_FRAME:AddMessage("arg1 = "..arg1) end
contrebasse@14 258 --if arg2 then DEFAULT_CHAT_FRAME:AddMessage("arg2 = "..arg2) end
contrebasse@14 259 --end
contrebasse@5 260 --@end-debug@
contrebasse@5 261
contrebasse@28 262 --[[ IsMounted() renvoie toujours false ici, on doit passer par OnUpdate
contrebasse@28 263 if event=="UNIT_AURA" then
contrebasse@28 264 if arg1=="player" then
contrebasse@28 265 DEFAULT_CHAT_FRAME:AddMessage("player")
contrebasse@28 266 if IsMounted() then
contrebasse@28 267 DEFAULT_CHAT_FRAME:AddMessage("ismounted")
contrebasse@28 268 wasMounted = true
contrebasse@28 269 else
contrebasse@28 270 DEFAULT_CHAT_FRAME:AddMessage("notmounted")
contrebasse@28 271 if wasMounted then
contrebasse@28 272 DEFAULT_CHAT_FRAME:AddMessage("wasmounted : start")
contrebasse@28 273 wasMounted = false
contrebasse@28 274 start()
contrebasse@28 275 end
contrebasse@28 276 end
contrebasse@28 277 end
contrebasse@28 278 else
contrebasse@28 279 --]]
contrebasse@12 280 if events[event] then
contrebasse@12 281 if type(events[event])~="function" or events[event]() then
contrebasse@12 282 start()
contrebasse@12 283 end
contrebasse@12 284 elseif events1player[event] then
contrebasse@12 285 if arg1=="player" then
contrebasse@33 286 if event == "UNIT_SPELLCAST_START" then
contrebasse@33 287 --name, nameSubtext, text, texture, startTime, endTime, isTradeSkill, castID, notInterruptible = UnitCastingInfo("unit")
contrebasse@33 288 isTradeSkill = select(7,UnitCastingInfo("player"))
contrebasse@33 289 --DEFAULT_CHAT_FRAME:AddMessage(name)
contrebasse@33 290 --DEFAULT_CHAT_FRAME:AddMessage(isTradeSkill and "True" or "False")
contrebasse@33 291 --if isTradeSkill then
contrebasse@33 292
contrebasse@33 293 --end
contrebasse@33 294 --elseif arg5 and not SpellBlackList[arg5] then -- arg5 is SpellID
contrebasse@33 295 elseif (arg5 and SpellWhiteList[arg5]) or isTradeSkill then -- arg5 is SpellID
contrebasse@33 296 isTradeSkill = false -- for next time
contrebasse@35 297 start(delay_short)
contrebasse@12 298 end
contrebasse@12 299 end
contrebasse@12 300 elseif events2playername[event] then
contrebasse@35 301 if arg2==playername and (type(events2playername[event])~="function" or events2playername[event]()) then
contrebasse@12 302 start()
contrebasse@12 303 end
contrebasse@14 304 elseif event == "GOSSIP_CLOSED" then
contrebasse@14 305 wasGossipOpened = not isGossipClosed
contrebasse@14 306 isGossipClosed = true
contrebasse@14 307 t_lastGossipClosed = GetTime()
contrebasse@5 308
contrebasse@0 309 elseif event == "PLAYER_REGEN_ENABLED" then
contrebasse@21 310 for k,_ in pairs(events1player) do DegaineFrame:UnregisterEvent(k) end
contrebasse@21 311 --desactivate()
contrebasse@0 312 elseif event == "PLAYER_REGEN_DISABLED" then
contrebasse@22 313 for k,_ in pairs(events1player) do DegaineFrame:RegisterEvent(k) end
contrebasse@22 314 --activate()
contrebasse@5 315
contrebasse@0 316 elseif event == "ADDON_LOADED" and arg1==AddonName then
contrebasse@5 317 if Degaine_isAuto==nil then
contrebasse@5 318 Degaine_isAuto = true
contrebasse@0 319 end
contrebasse@11 320 if Degaine_isAuto then activate() else desactivate() end
contrebasse@5 321 printState()
contrebasse@5 322
contrebasse@5 323 -- Not needed anymore
contrebasse@5 324 DegaineFrame:UnregisterEvent("ADDON_LOADED")
contrebasse@31 325
contrebasse@31 326 elseif event == "PLAYER_LOGIN" then
contrebasse@31 327 -- add some spell to the blacklist
contrebasse@31 328 for i=1,GetNumCompanions("CRITTER") do
contrebasse@31 329 -- creatureID, creatureName, creatureSpellID, icon, issummoned = GetCompanionInfo("CRITTER", i)
contrebasse@31 330 local _, _, creatureSpellID = GetCompanionInfo("CRITTER", i)
contrebasse@31 331 if creatureSpellID ~= 55068 then -- Mr Chilly stealth weapons...
contrebasse@31 332 SpellBlackList[creatureSpellID] = true
contrebasse@31 333 end
contrebasse@31 334 end
contrebasse@31 335
contrebasse@31 336 -- mount is important only if the invocation is cancelled
contrebasse@31 337 for i=1,GetNumCompanions("MOUNT") do
contrebasse@31 338 -- creatureID, creatureName, creatureSpellID, icon, issummoned = GetCompanionInfo("MOUNT", i)
contrebasse@31 339 local _, _, creatureSpellID = GetCompanionInfo("MOUNT", i)
contrebasse@31 340 if creatureSpellID ~= 48778 then -- Acherus Deathcharger stealth weapons...
contrebasse@31 341 SpellBlackList[creatureSpellID] = true
contrebasse@31 342 end
contrebasse@31 343 end
contrebasse@0 344 end
contrebasse@0 345 end
contrebasse@31 346
contrebasse@5 347 -- Hook when standing up
contrebasse@5 348 -- (Didn't work, see http://forums.wowace.com/showthread.php?p=310547#post310547)
contrebasse@8 349 hooksecurefunc("SitStandOrDescendStart",start);
contrebasse@0 350
contrebasse@0 351
contrebasse@6 352 ---------------------------------------------------------------
contrebasse@6 353 -- Commands
contrebasse@6 354 ---------------------------------------------------------------
contrebasse@6 355 -- Bindings
contrebasse@6 356 BINDING_HEADER_DEGAINE = "Dégainer automatiquement"
contrebasse@6 357
contrebasse@6 358 -- Slash command
contrebasse@7 359 -- GLOBALS: SLASH_DEGAINE1
contrebasse@7 360 SLASH_DEGAINE1 = "/degaine"
contrebasse@6 361 SlashCmdList["DEGAINE"] = Degaine_ToggleAuto
contrebasse@6 362
contrebasse@5 363
contrebasse@5 364 ---------------------------------------------------------------
contrebasse@5 365 -- Initialization
contrebasse@5 366 ---------------------------------------------------------------
contrebasse@5 367 DegaineFrame:SetScript("OnEvent",Degaine_OnEvent)
contrebasse@5 368
contrebasse@5 369 -- Global events
contrebasse@14 370 DegaineFrame:RegisterEvent("GOSSIP_CLOSED")
contrebasse@5 371 DegaineFrame:RegisterEvent("PLAYER_REGEN_ENABLED")
contrebasse@5 372 DegaineFrame:RegisterEvent("PLAYER_REGEN_DISABLED")
contrebasse@5 373 DegaineFrame:RegisterEvent("ADDON_LOADED")
contrebasse@31 374 DegaineFrame:RegisterEvent("PLAYER_LOGIN")
contrebasse@5 375 activate()
contrebasse@12 376