annotate Degaine.lua @ 33:b59da9bd1df7

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