Mercurial > wow > degaine
view Degaine.lua @ 23:44e8394d6982
Revert to disable everything in combat, as spells would mess with everything else
author | contrebasse |
---|---|
date | Fri, 10 Dec 2010 20:37:09 +0100 |
parents | 4da97c12564f |
children | 3b1123f50be4 |
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 = true --@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; -- Wow functions local GetTime = GetTime local InCombatLockdown = InCombatLockdown local ToggleSheath = ToggleSheath local UnitName = UnitName --------------------------------------------------------------- -- Local vars --------------------------------------------------------------- -- const local DegaineFrame = CreateFrame("Frame") local playername = UnitName("player") -- vars local t_left = -1 local delay = 2 -- seconds local isGossipClosed = true local wasGossipOpened = false local t_lastGossipClosed = 0 --------------------------------------------------------------- -- 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 --------------------------------------------------------------- -- 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, 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, } local SpellBlackList = { -- spells that don't stealth weapons (works with events1player) [1784] = true, -- Stealth (Rogue) [58984] = true, -- Shadowmeld (Nightelf stealth) -- 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 events2playername = { -- the 2nd arg is playername CHAT_MSG_SAY = true, CHAT_MSG_YELL = true, CHAT_MSG_TEXT_EMOTE = true, } --------------------------------------------------------------- -- 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() if Degaine_isAuto and not InCombatLockdown() then t_left = delay DegaineFrame:SetScript("OnUpdate", Degaine_OnUpdate) 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 --@end-debug@ end --@end-debug@ end local desactivate = function() 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: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@ if events[event] then if type(events[event])~="function" or events[event]() then start() end elseif events1player[event] then if arg1=="player" then if not SpellBlackList[arg5] then -- arg5 is SpellID start() end end elseif events2playername[event] then if arg2==playername 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") end end -- Hook when standing up -- (Didn't work, see http://forums.wowace.com/showthread.php?p=310547#post310547) hooksecurefunc("SitStandOrDescendStart",start); hooksecurefunc("Dismount",start); -- works with GupPet but not with the default interface... --------------------------------------------------------------- -- 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") activate()