Mercurial > wow > degaine
view Degaine.lua @ 41:a478b8a44b9e v1.0beta9
Add QUEST_PROGRESS event
author | contrebasse |
---|---|
date | Sun, 16 Jan 2011 00:17:23 +0100 |
parents | 2f955a56c2ca |
children | 3fbe79addc87 |
line wrap: on
line source
local AddonName = ... -- Draw your weapons automagically --------------------------------------------------------------- -- Known bugs --------------------------------------------------------------- -- If you stand up by jumping or walking it won't draw your weapon -- (it's not possible to know if you were sitting or standing before) --@debug@ local debug = false --@end-debug@ --------------------------------------------------------------- -- Globals to local --------------------------------------------------------------- -- These need to be globals : -- GLOBALS: Degaine_ToggleAuto, Degaine_isAuto, BINDING_HEADER_DEGAINE -- It doesn't matter if they are globals, rarely unsed : -- GLOBALS: DEFAULT_CHAT_FRAME -- Lua functions local pairs = pairs; local type = type; local select = select -- Wow functions local GetTime = GetTime local InCombatLockdown = InCombatLockdown local ToggleSheath = ToggleSheath local UnitName = UnitName local IsMounted = IsMounted local GetNumCompanions, GetCompanionInfo = GetNumCompanions, GetCompanionInfo local UnitCastingInfo = UnitCastingInfo local GetUnitSpeed = GetUnitSpeed --------------------------------------------------------------- -- Local vars --------------------------------------------------------------- -- const local DegaineFrame = CreateFrame("Frame") local playername = UnitName("player") local delay = 2.5 -- seconds local delay_short = 0.5 -- seconds -- vars local t_left = -1 local isGossipClosed = true local wasGossipOpened = false local t_lastGossipClosed = 0 --local wasMounted = IsMounted() -- handle mounts with UNIT_AURA local isTradeSkill = false --------------------------------------------------------------- -- Some stuff... --------------------------------------------------------------- -- Bindings BINDING_HEADER_DEGAINE = "Dégainer automatiquement" -- Print status local printState = function() DEFAULT_CHAT_FRAME:AddMessage(Degaine_isAuto and "Dégainage automatique |cFF00FF00activé|r" or "Dégainage automatique |cFFFF0000désactivé|r") end --------------------------------------------------------------- -- Launch drawing weapons --------------------------------------------------------------- -- Wait a few seconds before drawing, to be able to see the curren animation (and avoid bugs) local Degaine_OnUpdate = function(self,t_elapsed) t_left = t_left - t_elapsed; if t_left<=0 then ToggleSheath() DegaineFrame:SetScript("OnUpdate", nil) end end local start = function(arg_delay) if Degaine_isAuto and not InCombatLockdown() then t_left = arg_delay or delay DegaineFrame:SetScript("OnUpdate", Degaine_OnUpdate) end end --------------------------------------------------------------- -- Events config --------------------------------------------------------------- -- Events to watch local events = { -- no args to watch GOSSIP_SHOW = function() -- isGossipClosed : -- if the gossip is already opened, no need to draw weapon -- UnitName("npc")==UnitName("target") : -- hack gossips again because there's no emote with non npc -- you have to target the npc to interact with it -- things such as boards can't be targeted and start no emote local returnvalue = isGossipClosed and UnitName("npc")==UnitName("target") isGossipClosed = false return returnvalue end, MERCHANT_SHOW = function() -- hack for the cases where the merchant's frame is opened from a gossip frame : -- the gossip is closed and the merchant opened but the weapon is not stealthed if (GetTime() - t_lastGossipClosed) < 0.5 then return not wasGossipOpened else return isGossipClosed end end, QUEST_PROGRESS = true, BANKFRAME_OPENED = true, --function() return GossipFrame:IsShown() end, AUCTION_HOUSE_SHOW = true, } local events1player = { -- the first arg is "player" UNIT_SPELLCAST_FAILED = true, UNIT_SPELLCAST_INTERRUPTED = true, UNIT_SPELLCAST_SUCCEEDED = true, UNIT_SPELLCAST_START = true, -- to ckeck tradeskill } local SpellWhiteList = { -- Spells that do steath weapons (works with events1player) -- True recipes are treated separately [8690] = true, -- Heartstone [818] = true, -- Basic Campfire [13262] = true, -- Disenchant [51005] = true, -- Milling -- Critters (exceptions) [55068] = true, -- Mr Chilly -- Mounts (exceptions) [48778] = true, -- Acherus Deathcharger } local SpellBlackList = { -- spells that don't stealth weapons (works with events1player) -- All vanity pets and mount are added at PLAYER_LOGIN -- [1784] = true, -- Stealth (Rogue) [58984] = true, -- Shadowmeld (Nightelf stealth) -- DK presences [48263] = true, -- Blood [48266] = true, -- Frost [48265] = true, -- Unholy [3714] = true, -- Path of Frost -- Tradeskill spells [2259] = true, -- Alchemy [45357] = true, -- Inscription [3908] = true, -- Tailoring [7411] = true, -- Enchanting [2018] = true, -- Blacksmithing [4036] = true, -- Engineering [25229] = true, -- Jewelcrafting [2656] = true, -- Smelting [2108] = true, -- Leatherworking [2550] = true, -- Cooking [3273] = true, -- First Aid [53428] = true -- Runeforge -- Archaeology ? } local function playerIsNotMoving() return GetUnitSpeed("player") == 0 end local events2playername = { -- the 2nd arg is playername CHAT_MSG_SAY = playerIsNotMoving, CHAT_MSG_YELL = playerIsNotMoving, CHAT_MSG_TEXT_EMOTE = true, -- the emote is not shown, but the weapon is stealthed } --------------------------------------------------------------- -- Handle mounts with OnUpdate --------------------------------------------------------------- -- works with GupPet but not with the default interface... -- I guess that's because a specific /cancelaura or alike is done -- hooksecurefunc("Dismount",start); -- With OnUpdate local handleMountsFrame = CreateFrame("frame") local handleMountsOnUpdate do local IsMounted = IsMounted local wasMounted = IsMounted() function handleMountsOnUpdate(self,t_elapsed) if IsMounted() then wasMounted = true else if wasMounted then start(delay_short) -- no animation for unmounting wasMounted = false end end end end --------------------------------------------------------------- -- Activation functions --------------------------------------------------------------- local activate = function() if (not Degaine_isAuto) or InCombatLockdown() then return end --DegaineFrame:SetScript("OnUpdate", Degaine_OnUpdate); --@debug@ if debug then DegaineFrame:RegisterAllEvents() else --@end-debug@ for k,_ in pairs(events) do DegaineFrame:RegisterEvent(k) end for k,_ in pairs(events1player) do DegaineFrame:RegisterEvent(k) end for k,_ in pairs(events2playername) do DegaineFrame:RegisterEvent(k) end --DegaineFrame:RegisterEvent("UNIT_AURA") handleMountsFrame:SetScript("OnUpdate",handleMountsOnUpdate) --@debug@ end --@end-debug@ end local desactivate = function() DegaineFrame:SetScript("OnUpdate", nil) t_left = -1 isTradeSkill = false for k,_ in pairs(events) do DegaineFrame:UnregisterEvent(k) end for k,_ in pairs(events1player) do DegaineFrame:UnregisterEvent(k) end for k,_ in pairs(events2playername) do DegaineFrame:UnregisterEvent(k) end --DegaineFrame:UnregisterEvent("UNIT_AURA") handleMountsFrame:SetScript("OnUpdate",nil) end Degaine_ToggleAuto = function() if Degaine_isAuto then Degaine_isAuto = false desactivate() else Degaine_isAuto = true activate() end printState() end --------------------------------------------------------------- -- Event/hooks functions --------------------------------------------------------------- local Degaine_OnEvent = function(self,event, arg1, arg2, _, _, arg5, ...) --@debug@ if debug then DEFAULT_CHAT_FRAME:AddMessage(event) if arg1 then DEFAULT_CHAT_FRAME:AddMessage("arg1 = "..arg1) end if arg2 then DEFAULT_CHAT_FRAME:AddMessage("arg2 = "..arg2) end end --@end-debug@ --[[ IsMounted() renvoie toujours false ici, on doit passer par OnUpdate if event=="UNIT_AURA" then if arg1=="player" then DEFAULT_CHAT_FRAME:AddMessage("player") if IsMounted() then DEFAULT_CHAT_FRAME:AddMessage("ismounted") wasMounted = true else DEFAULT_CHAT_FRAME:AddMessage("notmounted") if wasMounted then DEFAULT_CHAT_FRAME:AddMessage("wasmounted : start") wasMounted = false start() end end end else --]] if events[event] then if type(events[event])~="function" or events[event]() then start() end elseif events1player[event] then if arg1=="player" then if event == "UNIT_SPELLCAST_START" then --name, nameSubtext, text, texture, startTime, endTime, isTradeSkill, castID, notInterruptible = UnitCastingInfo("unit") isTradeSkill = select(7,UnitCastingInfo("player")) --DEFAULT_CHAT_FRAME:AddMessage(name) --DEFAULT_CHAT_FRAME:AddMessage(isTradeSkill and "True" or "False") --if isTradeSkill then --end --elseif arg5 and not SpellBlackList[arg5] then -- arg5 is SpellID elseif (arg5 and SpellWhiteList[arg5]) or isTradeSkill then -- arg5 is SpellID isTradeSkill = false -- for next time start(delay_short) end end elseif events2playername[event] then if arg2==playername and (type(events2playername[event])~="function" or events2playername[event]()) then start() end elseif event == "GOSSIP_CLOSED" then wasGossipOpened = not isGossipClosed isGossipClosed = true t_lastGossipClosed = GetTime() elseif event == "PLAYER_REGEN_ENABLED" then for k,_ in pairs(events1player) do DegaineFrame:UnregisterEvent(k) end --desactivate() elseif event == "PLAYER_REGEN_DISABLED" then for k,_ in pairs(events1player) do DegaineFrame:RegisterEvent(k) end --activate() elseif event == "ADDON_LOADED" and arg1==AddonName then if Degaine_isAuto==nil then Degaine_isAuto = true end if Degaine_isAuto then activate() else desactivate() end printState() -- Not needed anymore DegaineFrame:UnregisterEvent("ADDON_LOADED") elseif event == "PLAYER_LOGIN" then -- add some spell to the blacklist for i=1,GetNumCompanions("CRITTER") do -- creatureID, creatureName, creatureSpellID, icon, issummoned = GetCompanionInfo("CRITTER", i) local _, _, creatureSpellID = GetCompanionInfo("CRITTER", i) if creatureSpellID ~= 55068 then -- Mr Chilly stealth weapons... SpellBlackList[creatureSpellID] = true end end -- mount is important only if the invocation is cancelled for i=1,GetNumCompanions("MOUNT") do -- creatureID, creatureName, creatureSpellID, icon, issummoned = GetCompanionInfo("MOUNT", i) local _, _, creatureSpellID = GetCompanionInfo("MOUNT", i) if creatureSpellID ~= 48778 then -- Acherus Deathcharger stealth weapons... SpellBlackList[creatureSpellID] = true end end end end -- Hook when standing up -- (Didn't work, see http://forums.wowace.com/showthread.php?p=310547#post310547) hooksecurefunc("SitStandOrDescendStart",start); --------------------------------------------------------------- -- Commands --------------------------------------------------------------- -- Bindings BINDING_HEADER_DEGAINE = "Dégainer automatiquement" -- Slash command -- GLOBALS: SLASH_DEGAINE1 SLASH_DEGAINE1 = "/degaine" SlashCmdList["DEGAINE"] = Degaine_ToggleAuto --------------------------------------------------------------- -- Initialization --------------------------------------------------------------- DegaineFrame:SetScript("OnEvent",Degaine_OnEvent) -- Global events DegaineFrame:RegisterEvent("GOSSIP_CLOSED") DegaineFrame:RegisterEvent("PLAYER_REGEN_ENABLED") DegaineFrame:RegisterEvent("PLAYER_REGEN_DISABLED") DegaineFrame:RegisterEvent("ADDON_LOADED") DegaineFrame:RegisterEvent("PLAYER_LOGIN") activate()