annotate Degaine.lua @ 26:dd1ef3996d7f v1.0beta4

Small change in UNIT_AURA
author contrebasse
date Fri, 10 Dec 2010 21:42:27 +0100
parents 3b1123f50be4 ddcb7021838b
children a91e7552c682
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@21 12 local debug = true
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@0 35
contrebasse@0 36
contrebasse@5 37 ---------------------------------------------------------------
contrebasse@8 38 -- Local vars
contrebasse@8 39 ---------------------------------------------------------------
contrebasse@8 40 -- const
contrebasse@8 41 local DegaineFrame = CreateFrame("Frame")
contrebasse@8 42 local playername = UnitName("player")
contrebasse@24 43 local delay = 2 -- seconds
contrebasse@8 44
contrebasse@8 45 -- vars
contrebasse@8 46 local t_left = -1
contrebasse@14 47 local isGossipClosed = true
contrebasse@14 48 local wasGossipOpened = false
contrebasse@14 49 local t_lastGossipClosed = 0
contrebasse@24 50 local wasMounted = IsMounted() -- handle mounts with UNIT_AURA
contrebasse@8 51
contrebasse@12 52
contrebasse@8 53 ---------------------------------------------------------------
contrebasse@5 54 -- Some stuff...
contrebasse@5 55 ---------------------------------------------------------------
contrebasse@5 56 -- Bindings
contrebasse@5 57 BINDING_HEADER_DEGAINE = "Dégainer automatiquement"
contrebasse@5 58
contrebasse@5 59 -- Print status
contrebasse@5 60 local printState = function()
contrebasse@11 61 DEFAULT_CHAT_FRAME:AddMessage(Degaine_isAuto and "Dégainage automatique |cFF00FF00activé|r" or "Dégainage automatique |cFFFF0000désactivé|r")
contrebasse@5 62 end
contrebasse@5 63
contrebasse@5 64
contrebasse@5 65 ---------------------------------------------------------------
contrebasse@5 66 -- Events config
contrebasse@5 67 ---------------------------------------------------------------
contrebasse@5 68 -- Events to watch
contrebasse@5 69 local events = { -- no args to watch
contrebasse@14 70 GOSSIP_SHOW = function()
contrebasse@19 71 -- isGossipClosed :
contrebasse@19 72 -- if the gossip is already opened, no need to draw weapon
contrebasse@19 73 -- UnitName("npc")==UnitName("target") :
contrebasse@19 74 -- hack gossips again because there's no emote with non npc
contrebasse@19 75 -- you have to target the npc to interact with it
contrebasse@19 76 -- things such as boards can't be targeted and start no emote
contrebasse@17 77 local returnvalue = isGossipClosed and UnitName("npc")==UnitName("target")
contrebasse@14 78 isGossipClosed = false
contrebasse@14 79 return returnvalue
contrebasse@14 80 end,
contrebasse@14 81 MERCHANT_SHOW = function()
contrebasse@19 82 -- hack for the cases where the merchant's frame is opened from a gossip frame :
contrebasse@19 83 -- the gossip is closed and the merchant opened but the weapon is not stealthed
contrebasse@14 84 if (GetTime() - t_lastGossipClosed) < 0.5 then
contrebasse@14 85 return not wasGossipOpened
contrebasse@14 86 else
contrebasse@14 87 return isGossipClosed
contrebasse@14 88 end
contrebasse@14 89 end,
contrebasse@11 90 BANKFRAME_OPENED = true, --function() return GossipFrame:IsShown() end,
contrebasse@0 91 AUCTION_HOUSE_SHOW = true,
contrebasse@5 92 }
contrebasse@5 93 local events1player = { -- the first arg is "player"
contrebasse@5 94 UNIT_SPELLCAST_FAILED = true,
contrebasse@5 95 UNIT_SPELLCAST_INTERRUPTED = true,
contrebasse@5 96 UNIT_SPELLCAST_SUCCEEDED = true,
contrebasse@24 97 UNIT_AURA = function()
contrebasse@24 98 if IsMounted() then
contrebasse@24 99 wasMounted = true
contrebasse@24 100 else
contrebasse@24 101 if wasMounted then
contrebasse@26 102 wasMounted = false
contrebasse@24 103 start()
contrebasse@24 104 end
contrebasse@24 105 end
contrebasse@24 106 end
contrebasse@5 107 }
contrebasse@12 108 local SpellBlackList = { -- spells that don't stealth weapons (works with events1player)
contrebasse@12 109 [1784] = true, -- Stealth (Rogue)
contrebasse@12 110 [58984] = true, -- Shadowmeld (Nightelf stealth)
contrebasse@13 111
contrebasse@13 112 -- Tradeskill spells
contrebasse@13 113 [2259] = true, -- Alchemy
contrebasse@13 114 [45357] = true, -- Inscription
contrebasse@13 115 [3908] = true, -- Tailoring
contrebasse@13 116 [7411] = true, -- Enchanting
contrebasse@13 117 [2018] = true, -- Blacksmithing
contrebasse@13 118 [4036] = true, -- Engineering
contrebasse@13 119 [25229] = true, -- Jewelcrafting
contrebasse@13 120 [2656] = true, -- Smelting
contrebasse@13 121 [2108] = true, -- Leatherworking
contrebasse@13 122 [2550] = true, -- Cooking
contrebasse@13 123 [3273] = true, -- First Aid
contrebasse@13 124 [53428] = true -- Runeforge
contrebasse@13 125 -- Archaeology ?
contrebasse@12 126 }
contrebasse@5 127 local events2playername = { -- the 2nd arg is playername
contrebasse@5 128 CHAT_MSG_SAY = true,
contrebasse@5 129 CHAT_MSG_YELL = true,
contrebasse@5 130 CHAT_MSG_TEXT_EMOTE = true,
contrebasse@5 131 }
contrebasse@0 132
contrebasse@0 133
contrebasse@5 134 ---------------------------------------------------------------
contrebasse@24 135 -- Handle mounts with OnUpdate
contrebasse@24 136 ---------------------------------------------------------------
contrebasse@24 137 -- works with GupPet but not with the default interface...
contrebasse@24 138 -- I guess that's because a specific /cancelaura or alike is done
contrebasse@24 139 -- hooksecurefunc("Dismount",start);
contrebasse@24 140
contrebasse@24 141 --[[ With OnUpdate
contrebasse@24 142 local handleMountsFrame = CreateFrame("frame")
contrebasse@24 143 local handleMountsOnUpdate
contrebasse@24 144 do
contrebasse@24 145 local IsMounted = IsMounted
contrebasse@24 146 local wasMounted = IsMounted()
contrebasse@24 147 function handleMountsOnUpdate(self,t_elapsed)
contrebasse@24 148 if IsMounted() then
contrebasse@24 149 wasMounted = true
contrebasse@24 150 else
contrebasse@24 151 if wasMounted then
contrebasse@24 152 start()
contrebasse@24 153 wasMounted = false
contrebasse@24 154 end
contrebasse@24 155 end
contrebasse@24 156 end
contrebasse@24 157 end
contrebasse@24 158 --]]
contrebasse@24 159
contrebasse@24 160
contrebasse@24 161 ---------------------------------------------------------------
contrebasse@8 162 -- Launch drawing weapons
contrebasse@5 163 ---------------------------------------------------------------
contrebasse@5 164 -- Wait a few seconds before drawing, to be able to see the curren animation (and avoid bugs)
contrebasse@5 165 local Degaine_OnUpdate = function(self,t_elapsed)
contrebasse@10 166 t_left = t_left - t_elapsed;
contrebasse@10 167 if t_left<=0 then
contrebasse@11 168 ToggleSheath()
contrebasse@11 169 DegaineFrame:SetScript("OnUpdate", nil)
contrebasse@0 170 end
contrebasse@0 171 end
contrebasse@8 172 local start = function()
contrebasse@8 173 if Degaine_isAuto and not InCombatLockdown() then
contrebasse@8 174 t_left = delay
contrebasse@11 175 DegaineFrame:SetScript("OnUpdate", Degaine_OnUpdate)
contrebasse@8 176 end
contrebasse@8 177 end
contrebasse@5 178
contrebasse@12 179
contrebasse@5 180 ---------------------------------------------------------------
contrebasse@5 181 -- Activation functions
contrebasse@5 182 ---------------------------------------------------------------
contrebasse@5 183 local activate = function()
contrebasse@5 184 if (not Degaine_isAuto) or InCombatLockdown() then return end
contrebasse@5 185
contrebasse@9 186 --DegaineFrame:SetScript("OnUpdate", Degaine_OnUpdate);
contrebasse@5 187 --@debug@
contrebasse@5 188 if debug then
contrebasse@11 189 DegaineFrame:RegisterAllEvents()
contrebasse@5 190 else
contrebasse@5 191 --@end-debug@
contrebasse@18 192 for k,_ in pairs(events) do DegaineFrame:RegisterEvent(k) end
contrebasse@18 193 for k,_ in pairs(events1player) do DegaineFrame:RegisterEvent(k) end
contrebasse@18 194 for k,_ in pairs(events2playername) do DegaineFrame:RegisterEvent(k) end
contrebasse@5 195 --@end-debug@
contrebasse@5 196 end
contrebasse@5 197 --@end-debug@
contrebasse@24 198 handleMountsFrame:SetScript("OnUpdate",handleMountsOnUpdate)
contrebasse@0 199 end
contrebasse@5 200 local desactivate = function()
contrebasse@24 201 DegaineFrame:SetScript("OnUpdate", nil)
contrebasse@24 202 handleMountsFrame:SetScript("OnUpdate",nil)
contrebasse@24 203 t_left = -1
contrebasse@18 204 for k,_ in pairs(events) do DegaineFrame:UnregisterEvent(k) end
contrebasse@18 205 for k,_ in pairs(events1player) do DegaineFrame:UnregisterEvent(k) end
contrebasse@18 206 for k,_ in pairs(events2playername) do DegaineFrame:UnregisterEvent(k) end
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@5 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@12 233 if events[event] then
contrebasse@12 234 if type(events[event])~="function" or events[event]() then
contrebasse@12 235 start()
contrebasse@12 236 end
contrebasse@12 237 elseif events1player[event] then
contrebasse@12 238 if arg1=="player" then
contrebasse@24 239 if arg5==nil or not SpellBlackList[arg5] then -- arg5 is SpellID
contrebasse@12 240 start()
contrebasse@12 241 end
contrebasse@12 242 end
contrebasse@12 243 elseif events2playername[event] then
contrebasse@12 244 if arg2==playername then
contrebasse@12 245 start()
contrebasse@12 246 end
contrebasse@14 247 elseif event == "GOSSIP_CLOSED" then
contrebasse@14 248 wasGossipOpened = not isGossipClosed
contrebasse@14 249 isGossipClosed = true
contrebasse@14 250 t_lastGossipClosed = GetTime()
contrebasse@5 251
contrebasse@0 252 elseif event == "PLAYER_REGEN_ENABLED" then
contrebasse@21 253 for k,_ in pairs(events1player) do DegaineFrame:UnregisterEvent(k) end
contrebasse@21 254 --desactivate()
contrebasse@0 255 elseif event == "PLAYER_REGEN_DISABLED" then
contrebasse@22 256 for k,_ in pairs(events1player) do DegaineFrame:RegisterEvent(k) end
contrebasse@22 257 --activate()
contrebasse@5 258
contrebasse@0 259 elseif event == "ADDON_LOADED" and arg1==AddonName then
contrebasse@5 260 if Degaine_isAuto==nil then
contrebasse@5 261 Degaine_isAuto = true
contrebasse@0 262 end
contrebasse@11 263 if Degaine_isAuto then activate() else desactivate() end
contrebasse@5 264 printState()
contrebasse@5 265
contrebasse@5 266 -- Not needed anymore
contrebasse@5 267 DegaineFrame:UnregisterEvent("ADDON_LOADED")
contrebasse@0 268 end
contrebasse@0 269 end
contrebasse@5 270 -- Hook when standing up
contrebasse@5 271 -- (Didn't work, see http://forums.wowace.com/showthread.php?p=310547#post310547)
contrebasse@8 272 hooksecurefunc("SitStandOrDescendStart",start);
contrebasse@0 273
contrebasse@0 274
contrebasse@6 275 ---------------------------------------------------------------
contrebasse@6 276 -- Commands
contrebasse@6 277 ---------------------------------------------------------------
contrebasse@6 278 -- Bindings
contrebasse@6 279 BINDING_HEADER_DEGAINE = "Dégainer automatiquement"
contrebasse@6 280
contrebasse@6 281 -- Slash command
contrebasse@7 282 -- GLOBALS: SLASH_DEGAINE1
contrebasse@7 283 SLASH_DEGAINE1 = "/degaine"
contrebasse@6 284 SlashCmdList["DEGAINE"] = Degaine_ToggleAuto
contrebasse@6 285
contrebasse@5 286
contrebasse@5 287 ---------------------------------------------------------------
contrebasse@5 288 -- Initialization
contrebasse@5 289 ---------------------------------------------------------------
contrebasse@5 290 DegaineFrame:SetScript("OnEvent",Degaine_OnEvent)
contrebasse@5 291
contrebasse@5 292 -- Global events
contrebasse@14 293 DegaineFrame:RegisterEvent("GOSSIP_CLOSED")
contrebasse@5 294 DegaineFrame:RegisterEvent("PLAYER_REGEN_ENABLED")
contrebasse@5 295 DegaineFrame:RegisterEvent("PLAYER_REGEN_DISABLED")
contrebasse@5 296 DegaineFrame:RegisterEvent("ADDON_LOADED")
contrebasse@5 297 activate()
contrebasse@12 298