annotate Degaine.lua @ 31:37d2dcb3688d

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