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