contrebasse@43: local AddonName, T = ... 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@56: local debug = false contrebasse@52: local debugAll = 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@54: -- GLOBALS: Degaine_ToggleAuto, Degaine_isAuto, BINDING_HEADER_DEGAINE, BINDING_NAME_DEGAINE_TOGGLE 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@35: local select = select contrebasse@53: local wipe = wipe contrebasse@0: contrebasse@5: -- Wow functions contrebasse@14: local GetTime = GetTime contrebasse@5: local InCombatLockdown = InCombatLockdown contrebasse@20: local UnitName = UnitName contrebasse@24: local IsMounted = IsMounted contrebasse@33: local UnitCastingInfo = UnitCastingInfo contrebasse@35: local GetUnitSpeed = GetUnitSpeed contrebasse@53: local UnitBuff = UnitBuff contrebasse@56: -- The hook has to be done before registering the local reference contrebasse@56: local t_lastDegaine = 0 -- Time of the last draw contrebasse@56: hooksecurefunc("ToggleSheath",function() contrebasse@56: t_lastDegaine = GetTime() contrebasse@56: end); contrebasse@56: local ToggleSheath = ToggleSheath 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@35: local delay = 2.5 -- seconds contrebasse@35: local delay_short = 0.5 -- 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@34: --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: -- Print status contrebasse@5: local printState = function() contrebasse@49: DEFAULT_CHAT_FRAME:AddMessage(Degaine_isAuto and T.L["PRINT_ENABLED"] or T.L["PRINT_DISABLED"]) contrebasse@5: end contrebasse@5: contrebasse@5: contrebasse@5: --------------------------------------------------------------- contrebasse@28: -- Launch drawing weapons contrebasse@28: --------------------------------------------------------------- contrebasse@56: 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@43: contrebasse@43: --@debug@ contrebasse@43: --DEFAULT_CHAT_FRAME:AddMessage("Go !") contrebasse@43: --@end-debug@ contrebasse@43: contrebasse@47: if Degaine_isAuto and (GetTime()-t_lastDegaine)>1 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@41: QUEST_PROGRESS = true, 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@31: contrebasse@43: --[[ contrebasse@43: -- Was used when moving prevented to play the emote when talking contrebasse@43: -- Was needed for CHAT_MSG_SAY and CHAT_MSG_YELL contrebasse@35: local function playerIsNotMoving() contrebasse@35: return GetUnitSpeed("player") == 0 contrebasse@35: end contrebasse@43: --]] contrebasse@5: local events2playername = { -- the 2nd arg is playername contrebasse@43: CHAT_MSG_SAY = true, contrebasse@43: CHAT_MSG_YELL = true, contrebasse@35: CHAT_MSG_TEXT_EMOTE = true, -- the emote is not shown, but the weapon is stealthed 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@53: local buffsIDs = {} 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@35: start(delay_short) -- no animation for unmounting contrebasse@24: wasMounted = false contrebasse@24: end contrebasse@24: end contrebasse@53: contrebasse@53: -- hack to watch auras too contrebasse@53: -- Loop over all buffs contrebasse@53: -- name, rank, icon, count, debuffType, duration, expirationTime, unitCaster, isStealable, contrebasse@53: -- shouldConsolidate, spellId = UnitBuff("unit", index or ["name", "rank"][, "filter"]) contrebasse@53: local i = 1 contrebasse@53: -- list player's buffs contrebasse@53: local buffID = select(11,UnitBuff("player", i)); -- spell id contrebasse@53: while buffID do contrebasse@53: buffsIDs[buffID] = true contrebasse@53: i = i + 1; contrebasse@53: buffID = select(11,UnitBuff("player", i)); contrebasse@53: end contrebasse@53: --[[ contrebasse@53: for i=1,40 do contrebasse@53: buffID = select(11,UnitBuff("player", i)); contrebasse@53: if buffID then contrebasse@53: buffsIDs[buffID] = true contrebasse@53: end contrebasse@53: end contrebasse@53: --]] contrebasse@53: --@debug@ contrebasse@53: --if debug then contrebasse@53: -- DEFAULT_CHAT_FRAME:AddMessage(""..i-1.."Buff(s) found") contrebasse@53: --end contrebasse@53: --@end-debug@ contrebasse@53: contrebasse@53: -- loop over watched buffs to check if it is present or not contrebasse@53: -- we have to loop over T.LoseAura (and not buffsIDs) to be able to check for buff disappearance contrebasse@53: for id,state in pairs(T.LoseAura) do contrebasse@53: if buffsIDs[id] then contrebasse@53: if not T.LoseAura[id] then contrebasse@53: -- buff gained contrebasse@53: --@debug@ contrebasse@53: if debug then contrebasse@53: DEFAULT_CHAT_FRAME:AddMessage("Buff gained: "..id) contrebasse@53: end contrebasse@53: --@end-debug@ contrebasse@53: T.LoseAura[id] = true contrebasse@53: end contrebasse@53: else contrebasse@53: if T.LoseAura[id] then contrebasse@53: -- buff lost contrebasse@53: --@debug@ contrebasse@53: if debug then contrebasse@53: DEFAULT_CHAT_FRAME:AddMessage("Buff lost: "..id) contrebasse@53: end contrebasse@53: --@end-debug@ contrebasse@53: T.LoseAura[id] = false contrebasse@53: contrebasse@53: -- draw weapon contrebasse@53: start() contrebasse@53: end contrebasse@53: end contrebasse@53: end contrebasse@53: contrebasse@53: -- empty temporary table contrebasse@53: wipe(buffsIDs) 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@52: if debugAll 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@39: --@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@37: isTradeSkill = false 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@41: if debug then contrebasse@41: DEFAULT_CHAT_FRAME:AddMessage(event) contrebasse@41: if arg1 then DEFAULT_CHAT_FRAME:AddMessage("arg1 = "..arg1) end contrebasse@41: if arg2 then DEFAULT_CHAT_FRAME:AddMessage("arg2 = "..arg2) end contrebasse@41: 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@44: --elseif arg5 and not T.SpellBlackList[arg5] then -- arg5 is SpellID contrebasse@44: elseif (arg5 and T.SpellWhiteList[arg5]) or isTradeSkill then -- arg5 is SpellID contrebasse@33: isTradeSkill = false -- for next time contrebasse@44: start(type(T.SpellWhiteList[arg5])=="number" and T.SpellWhiteList[arg5] or delay_short) contrebasse@12: end contrebasse@12: end contrebasse@12: elseif events2playername[event] then contrebasse@35: if arg2==playername and (type(events2playername[event])~="function" or events2playername[event]()) 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@44: -- BLacklis alomst all Companions and mounts contrebasse@44: T.DoBlackListCrittersAndMount() 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@49: BINDING_HEADER_DEGAINE = T.L["BINDING_HEADER"] contrebasse@49: BINDING_NAME_DEGAINE_TOGGLE = T.L["BINDING_NAME_DEGAINE_TOGGLE"] 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()