annotate Degaine.lua @ 43:3fbe79addc87

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