annotate Degaine.lua @ 63:3daeb57da1a9 tip

Automated merge with ssh://hg.wowace.com/wow/degaine/mainline
author contrebasse
date Wed, 01 Jun 2011 19:16:37 +0200
parents 16828b1f9f9d
children
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@56 12 local debug = false
contrebasse@52 13 local debugAll = false
contrebasse@5 14 --@end-debug@
contrebasse@0 15
contrebasse@12 16
contrebasse@5 17 ---------------------------------------------------------------
contrebasse@5 18 -- Globals to local
contrebasse@5 19 ---------------------------------------------------------------
contrebasse@21 20 -- These need to be globals :
contrebasse@54 21 -- GLOBALS: Degaine_ToggleAuto, Degaine_isAuto, BINDING_HEADER_DEGAINE, BINDING_NAME_DEGAINE_TOGGLE
contrebasse@0 22
contrebasse@21 23 -- It doesn't matter if they are globals, rarely unsed :
contrebasse@14 24 -- GLOBALS: DEFAULT_CHAT_FRAME
contrebasse@5 25
contrebasse@5 26 -- Lua functions
contrebasse@0 27 local pairs = pairs;
contrebasse@0 28 local type = type;
contrebasse@35 29 local select = select
contrebasse@53 30 local wipe = wipe
contrebasse@0 31
contrebasse@5 32 -- Wow functions
contrebasse@14 33 local GetTime = GetTime
contrebasse@5 34 local InCombatLockdown = InCombatLockdown
contrebasse@20 35 local UnitName = UnitName
contrebasse@24 36 local IsMounted = IsMounted
contrebasse@33 37 local UnitCastingInfo = UnitCastingInfo
contrebasse@35 38 local GetUnitSpeed = GetUnitSpeed
contrebasse@53 39 local UnitBuff = UnitBuff
contrebasse@56 40 -- The hook has to be done before registering the local reference
contrebasse@56 41 local t_lastDegaine = 0 -- Time of the last draw
contrebasse@56 42 hooksecurefunc("ToggleSheath",function()
contrebasse@56 43 t_lastDegaine = GetTime()
contrebasse@56 44 end);
contrebasse@56 45 local ToggleSheath = ToggleSheath
contrebasse@0 46
contrebasse@0 47
contrebasse@5 48 ---------------------------------------------------------------
contrebasse@8 49 -- Local vars
contrebasse@8 50 ---------------------------------------------------------------
contrebasse@8 51 -- const
contrebasse@8 52 local DegaineFrame = CreateFrame("Frame")
contrebasse@8 53 local playername = UnitName("player")
contrebasse@35 54 local delay = 2.5 -- seconds
contrebasse@35 55 local delay_short = 0.5 -- seconds
contrebasse@8 56
contrebasse@8 57 -- vars
contrebasse@8 58 local t_left = -1
contrebasse@14 59 local isGossipClosed = true
contrebasse@14 60 local wasGossipOpened = false
contrebasse@14 61 local t_lastGossipClosed = 0
contrebasse@34 62 --local wasMounted = IsMounted() -- handle mounts with UNIT_AURA
contrebasse@33 63 local isTradeSkill = false
contrebasse@8 64
contrebasse@12 65
contrebasse@8 66 ---------------------------------------------------------------
contrebasse@5 67 -- Some stuff...
contrebasse@5 68 ---------------------------------------------------------------
contrebasse@5 69 -- Print status
contrebasse@5 70 local printState = function()
contrebasse@49 71 DEFAULT_CHAT_FRAME:AddMessage(Degaine_isAuto and T.L["PRINT_ENABLED"] or T.L["PRINT_DISABLED"])
contrebasse@5 72 end
contrebasse@5 73
contrebasse@5 74
contrebasse@5 75 ---------------------------------------------------------------
contrebasse@28 76 -- Launch drawing weapons
contrebasse@28 77 ---------------------------------------------------------------
contrebasse@56 78
contrebasse@28 79 -- Wait a few seconds before drawing, to be able to see the curren animation (and avoid bugs)
contrebasse@28 80 local Degaine_OnUpdate = function(self,t_elapsed)
contrebasse@28 81 t_left = t_left - t_elapsed;
contrebasse@28 82 if t_left<=0 then
contrebasse@28 83 ToggleSheath()
contrebasse@28 84 DegaineFrame:SetScript("OnUpdate", nil)
contrebasse@28 85 end
contrebasse@28 86 end
contrebasse@32 87 local start = function(arg_delay)
contrebasse@43 88
contrebasse@43 89 --@debug@
contrebasse@43 90 --DEFAULT_CHAT_FRAME:AddMessage("Go !")
contrebasse@43 91 --@end-debug@
contrebasse@43 92
contrebasse@47 93 if Degaine_isAuto and (GetTime()-t_lastDegaine)>1 and not InCombatLockdown() then
contrebasse@32 94 t_left = arg_delay or delay
contrebasse@28 95 DegaineFrame:SetScript("OnUpdate", Degaine_OnUpdate)
contrebasse@28 96 end
contrebasse@28 97 end
contrebasse@28 98
contrebasse@28 99
contrebasse@28 100 ---------------------------------------------------------------
contrebasse@5 101 -- Events config
contrebasse@5 102 ---------------------------------------------------------------
contrebasse@5 103 -- Events to watch
contrebasse@5 104 local events = { -- no args to watch
contrebasse@14 105 GOSSIP_SHOW = function()
contrebasse@19 106 -- isGossipClosed :
contrebasse@19 107 -- if the gossip is already opened, no need to draw weapon
contrebasse@19 108 -- UnitName("npc")==UnitName("target") :
contrebasse@19 109 -- hack gossips again because there's no emote with non npc
contrebasse@19 110 -- you have to target the npc to interact with it
contrebasse@19 111 -- things such as boards can't be targeted and start no emote
contrebasse@17 112 local returnvalue = isGossipClosed and UnitName("npc")==UnitName("target")
contrebasse@14 113 isGossipClosed = false
contrebasse@14 114 return returnvalue
contrebasse@14 115 end,
contrebasse@14 116 MERCHANT_SHOW = function()
contrebasse@19 117 -- hack for the cases where the merchant's frame is opened from a gossip frame :
contrebasse@19 118 -- the gossip is closed and the merchant opened but the weapon is not stealthed
contrebasse@14 119 if (GetTime() - t_lastGossipClosed) < 0.5 then
contrebasse@14 120 return not wasGossipOpened
contrebasse@14 121 else
contrebasse@14 122 return isGossipClosed
contrebasse@14 123 end
contrebasse@14 124 end,
contrebasse@41 125 QUEST_PROGRESS = true,
contrebasse@11 126 BANKFRAME_OPENED = true, --function() return GossipFrame:IsShown() end,
contrebasse@0 127 AUCTION_HOUSE_SHOW = true,
contrebasse@5 128 }
contrebasse@5 129 local events1player = { -- the first arg is "player"
contrebasse@5 130 UNIT_SPELLCAST_FAILED = true,
contrebasse@5 131 UNIT_SPELLCAST_INTERRUPTED = true,
contrebasse@5 132 UNIT_SPELLCAST_SUCCEEDED = true,
contrebasse@33 133 UNIT_SPELLCAST_START = true, -- to ckeck tradeskill
contrebasse@5 134 }
contrebasse@31 135
contrebasse@43 136 --[[
contrebasse@43 137 -- Was used when moving prevented to play the emote when talking
contrebasse@43 138 -- Was needed for CHAT_MSG_SAY and CHAT_MSG_YELL
contrebasse@35 139 local function playerIsNotMoving()
contrebasse@35 140 return GetUnitSpeed("player") == 0
contrebasse@35 141 end
contrebasse@43 142 --]]
contrebasse@5 143 local events2playername = { -- the 2nd arg is playername
contrebasse@43 144 CHAT_MSG_SAY = true,
contrebasse@43 145 CHAT_MSG_YELL = true,
contrebasse@35 146 CHAT_MSG_TEXT_EMOTE = true, -- the emote is not shown, but the weapon is stealthed
contrebasse@5 147 }
contrebasse@0 148
contrebasse@0 149
contrebasse@5 150 ---------------------------------------------------------------
contrebasse@24 151 -- Handle mounts with OnUpdate
contrebasse@24 152 ---------------------------------------------------------------
contrebasse@24 153 -- works with GupPet but not with the default interface...
contrebasse@24 154 -- I guess that's because a specific /cancelaura or alike is done
contrebasse@24 155 -- hooksecurefunc("Dismount",start);
contrebasse@24 156
contrebasse@28 157 -- With OnUpdate
contrebasse@24 158 local handleMountsFrame = CreateFrame("frame")
contrebasse@24 159 local handleMountsOnUpdate
contrebasse@24 160 do
contrebasse@24 161 local IsMounted = IsMounted
contrebasse@24 162 local wasMounted = IsMounted()
contrebasse@53 163 local buffsIDs = {}
contrebasse@24 164 function handleMountsOnUpdate(self,t_elapsed)
contrebasse@24 165 if IsMounted() then
contrebasse@24 166 wasMounted = true
contrebasse@24 167 else
contrebasse@24 168 if wasMounted then
contrebasse@35 169 start(delay_short) -- no animation for unmounting
contrebasse@24 170 wasMounted = false
contrebasse@24 171 end
contrebasse@24 172 end
contrebasse@53 173
contrebasse@53 174 -- hack to watch auras too
contrebasse@53 175 -- Loop over all buffs
contrebasse@53 176 -- name, rank, icon, count, debuffType, duration, expirationTime, unitCaster, isStealable,
contrebasse@53 177 -- shouldConsolidate, spellId = UnitBuff("unit", index or ["name", "rank"][, "filter"])
contrebasse@53 178 local i = 1
contrebasse@53 179 -- list player's buffs
contrebasse@53 180 local buffID = select(11,UnitBuff("player", i)); -- spell id
contrebasse@53 181 while buffID do
contrebasse@53 182 buffsIDs[buffID] = true
contrebasse@53 183 i = i + 1;
contrebasse@53 184 buffID = select(11,UnitBuff("player", i));
contrebasse@53 185 end
contrebasse@53 186 --[[
contrebasse@53 187 for i=1,40 do
contrebasse@53 188 buffID = select(11,UnitBuff("player", i));
contrebasse@53 189 if buffID then
contrebasse@53 190 buffsIDs[buffID] = true
contrebasse@53 191 end
contrebasse@53 192 end
contrebasse@53 193 --]]
contrebasse@53 194 --@debug@
contrebasse@53 195 --if debug then
contrebasse@53 196 -- DEFAULT_CHAT_FRAME:AddMessage(""..i-1.."Buff(s) found")
contrebasse@53 197 --end
contrebasse@53 198 --@end-debug@
contrebasse@53 199
contrebasse@53 200 -- loop over watched buffs to check if it is present or not
contrebasse@53 201 -- we have to loop over T.LoseAura (and not buffsIDs) to be able to check for buff disappearance
contrebasse@53 202 for id,state in pairs(T.LoseAura) do
contrebasse@53 203 if buffsIDs[id] then
contrebasse@53 204 if not T.LoseAura[id] then
contrebasse@53 205 -- buff gained
contrebasse@53 206 --@debug@
contrebasse@53 207 if debug then
contrebasse@53 208 DEFAULT_CHAT_FRAME:AddMessage("Buff gained: "..id)
contrebasse@53 209 end
contrebasse@53 210 --@end-debug@
contrebasse@53 211 T.LoseAura[id] = true
contrebasse@53 212 end
contrebasse@53 213 else
contrebasse@53 214 if T.LoseAura[id] then
contrebasse@53 215 -- buff lost
contrebasse@53 216 --@debug@
contrebasse@53 217 if debug then
contrebasse@53 218 DEFAULT_CHAT_FRAME:AddMessage("Buff lost: "..id)
contrebasse@53 219 end
contrebasse@53 220 --@end-debug@
contrebasse@53 221 T.LoseAura[id] = false
contrebasse@53 222
contrebasse@53 223 -- draw weapon
contrebasse@53 224 start()
contrebasse@53 225 end
contrebasse@53 226 end
contrebasse@53 227 end
contrebasse@53 228
contrebasse@53 229 -- empty temporary table
contrebasse@53 230 wipe(buffsIDs)
contrebasse@24 231 end
contrebasse@24 232 end
contrebasse@5 233
contrebasse@12 234
contrebasse@5 235 ---------------------------------------------------------------
contrebasse@5 236 -- Activation functions
contrebasse@5 237 ---------------------------------------------------------------
contrebasse@5 238 local activate = function()
contrebasse@5 239 if (not Degaine_isAuto) or InCombatLockdown() then return end
contrebasse@5 240
contrebasse@9 241 --DegaineFrame:SetScript("OnUpdate", Degaine_OnUpdate);
contrebasse@5 242 --@debug@
contrebasse@52 243 if debugAll then
contrebasse@11 244 DegaineFrame:RegisterAllEvents()
contrebasse@5 245 else
contrebasse@5 246 --@end-debug@
contrebasse@18 247 for k,_ in pairs(events) do DegaineFrame:RegisterEvent(k) end
contrebasse@18 248 for k,_ in pairs(events1player) do DegaineFrame:RegisterEvent(k) end
contrebasse@18 249 for k,_ in pairs(events2playername) do DegaineFrame:RegisterEvent(k) end
contrebasse@28 250 --DegaineFrame:RegisterEvent("UNIT_AURA")
contrebasse@28 251 handleMountsFrame:SetScript("OnUpdate",handleMountsOnUpdate)
contrebasse@39 252 --@debug@
contrebasse@5 253 end
contrebasse@5 254 --@end-debug@
contrebasse@0 255 end
contrebasse@5 256 local desactivate = function()
contrebasse@24 257 DegaineFrame:SetScript("OnUpdate", nil)
contrebasse@24 258 t_left = -1
contrebasse@37 259 isTradeSkill = false
contrebasse@18 260 for k,_ in pairs(events) do DegaineFrame:UnregisterEvent(k) end
contrebasse@18 261 for k,_ in pairs(events1player) do DegaineFrame:UnregisterEvent(k) end
contrebasse@18 262 for k,_ in pairs(events2playername) do DegaineFrame:UnregisterEvent(k) end
contrebasse@28 263 --DegaineFrame:UnregisterEvent("UNIT_AURA")
contrebasse@28 264 handleMountsFrame:SetScript("OnUpdate",nil)
contrebasse@0 265 end
contrebasse@6 266 Degaine_ToggleAuto = function()
contrebasse@5 267 if Degaine_isAuto then
contrebasse@5 268 Degaine_isAuto = false
contrebasse@5 269 desactivate()
contrebasse@5 270 else
contrebasse@5 271 Degaine_isAuto = true
contrebasse@5 272 activate()
contrebasse@5 273 end
contrebasse@5 274 printState()
contrebasse@5 275 end
contrebasse@0 276
contrebasse@5 277
contrebasse@24 278
contrebasse@5 279 ---------------------------------------------------------------
contrebasse@5 280 -- Event/hooks functions
contrebasse@5 281 ---------------------------------------------------------------
contrebasse@12 282 local Degaine_OnEvent = function(self,event, arg1, arg2, _, _, arg5, ...)
contrebasse@5 283 --@debug@
contrebasse@41 284 if debug then
contrebasse@41 285 DEFAULT_CHAT_FRAME:AddMessage(event)
contrebasse@41 286 if arg1 then DEFAULT_CHAT_FRAME:AddMessage("arg1 = "..arg1) end
contrebasse@41 287 if arg2 then DEFAULT_CHAT_FRAME:AddMessage("arg2 = "..arg2) end
contrebasse@41 288 end
contrebasse@5 289 --@end-debug@
contrebasse@5 290
contrebasse@28 291 --[[ IsMounted() renvoie toujours false ici, on doit passer par OnUpdate
contrebasse@28 292 if event=="UNIT_AURA" then
contrebasse@28 293 if arg1=="player" then
contrebasse@28 294 DEFAULT_CHAT_FRAME:AddMessage("player")
contrebasse@28 295 if IsMounted() then
contrebasse@28 296 DEFAULT_CHAT_FRAME:AddMessage("ismounted")
contrebasse@28 297 wasMounted = true
contrebasse@28 298 else
contrebasse@28 299 DEFAULT_CHAT_FRAME:AddMessage("notmounted")
contrebasse@28 300 if wasMounted then
contrebasse@28 301 DEFAULT_CHAT_FRAME:AddMessage("wasmounted : start")
contrebasse@28 302 wasMounted = false
contrebasse@28 303 start()
contrebasse@28 304 end
contrebasse@28 305 end
contrebasse@28 306 end
contrebasse@28 307 else
contrebasse@28 308 --]]
contrebasse@12 309 if events[event] then
contrebasse@12 310 if type(events[event])~="function" or events[event]() then
contrebasse@12 311 start()
contrebasse@12 312 end
contrebasse@12 313 elseif events1player[event] then
contrebasse@12 314 if arg1=="player" then
contrebasse@33 315 if event == "UNIT_SPELLCAST_START" then
contrebasse@33 316 --name, nameSubtext, text, texture, startTime, endTime, isTradeSkill, castID, notInterruptible = UnitCastingInfo("unit")
contrebasse@33 317 isTradeSkill = select(7,UnitCastingInfo("player"))
contrebasse@33 318 --DEFAULT_CHAT_FRAME:AddMessage(name)
contrebasse@33 319 --DEFAULT_CHAT_FRAME:AddMessage(isTradeSkill and "True" or "False")
contrebasse@33 320 --if isTradeSkill then
contrebasse@33 321
contrebasse@33 322 --end
contrebasse@44 323 --elseif arg5 and not T.SpellBlackList[arg5] then -- arg5 is SpellID
contrebasse@44 324 elseif (arg5 and T.SpellWhiteList[arg5]) or isTradeSkill then -- arg5 is SpellID
contrebasse@33 325 isTradeSkill = false -- for next time
contrebasse@44 326 start(type(T.SpellWhiteList[arg5])=="number" and T.SpellWhiteList[arg5] or delay_short)
contrebasse@12 327 end
contrebasse@12 328 end
contrebasse@12 329 elseif events2playername[event] then
contrebasse@35 330 if arg2==playername and (type(events2playername[event])~="function" or events2playername[event]()) then
contrebasse@12 331 start()
contrebasse@12 332 end
contrebasse@14 333 elseif event == "GOSSIP_CLOSED" then
contrebasse@14 334 wasGossipOpened = not isGossipClosed
contrebasse@14 335 isGossipClosed = true
contrebasse@14 336 t_lastGossipClosed = GetTime()
contrebasse@5 337
contrebasse@0 338 elseif event == "PLAYER_REGEN_ENABLED" then
contrebasse@21 339 for k,_ in pairs(events1player) do DegaineFrame:UnregisterEvent(k) end
contrebasse@21 340 --desactivate()
contrebasse@0 341 elseif event == "PLAYER_REGEN_DISABLED" then
contrebasse@22 342 for k,_ in pairs(events1player) do DegaineFrame:RegisterEvent(k) end
contrebasse@22 343 --activate()
contrebasse@5 344
contrebasse@0 345 elseif event == "ADDON_LOADED" and arg1==AddonName then
contrebasse@5 346 if Degaine_isAuto==nil then
contrebasse@5 347 Degaine_isAuto = true
contrebasse@0 348 end
contrebasse@11 349 if Degaine_isAuto then activate() else desactivate() end
contrebasse@5 350 printState()
contrebasse@5 351
contrebasse@5 352 -- Not needed anymore
contrebasse@5 353 DegaineFrame:UnregisterEvent("ADDON_LOADED")
contrebasse@31 354
contrebasse@31 355 elseif event == "PLAYER_LOGIN" then
contrebasse@44 356 -- BLacklis alomst all Companions and mounts
contrebasse@44 357 T.DoBlackListCrittersAndMount()
contrebasse@0 358 end
contrebasse@0 359 end
contrebasse@31 360
contrebasse@5 361 -- Hook when standing up
contrebasse@5 362 -- (Didn't work, see http://forums.wowace.com/showthread.php?p=310547#post310547)
contrebasse@8 363 hooksecurefunc("SitStandOrDescendStart",start);
contrebasse@0 364
contrebasse@0 365
contrebasse@6 366 ---------------------------------------------------------------
contrebasse@6 367 -- Commands
contrebasse@6 368 ---------------------------------------------------------------
contrebasse@6 369 -- Bindings
contrebasse@49 370 BINDING_HEADER_DEGAINE = T.L["BINDING_HEADER"]
contrebasse@49 371 BINDING_NAME_DEGAINE_TOGGLE = T.L["BINDING_NAME_DEGAINE_TOGGLE"]
contrebasse@6 372
contrebasse@6 373 -- Slash command
contrebasse@7 374 -- GLOBALS: SLASH_DEGAINE1
contrebasse@7 375 SLASH_DEGAINE1 = "/degaine"
contrebasse@6 376 SlashCmdList["DEGAINE"] = Degaine_ToggleAuto
contrebasse@6 377
contrebasse@5 378
contrebasse@5 379 ---------------------------------------------------------------
contrebasse@5 380 -- Initialization
contrebasse@5 381 ---------------------------------------------------------------
contrebasse@5 382 DegaineFrame:SetScript("OnEvent",Degaine_OnEvent)
contrebasse@5 383
contrebasse@5 384 -- Global events
contrebasse@14 385 DegaineFrame:RegisterEvent("GOSSIP_CLOSED")
contrebasse@5 386 DegaineFrame:RegisterEvent("PLAYER_REGEN_ENABLED")
contrebasse@5 387 DegaineFrame:RegisterEvent("PLAYER_REGEN_DISABLED")
contrebasse@5 388 DegaineFrame:RegisterEvent("ADDON_LOADED")
contrebasse@31 389 DegaineFrame:RegisterEvent("PLAYER_LOGIN")
contrebasse@5 390 activate()