annotate Degaine.lua @ 19:03f50393cd9c

Add notes to .toc
author contrebasse
date Fri, 10 Dec 2010 19:31:02 +0100
parents 57e83c900a08
children 4da97c12564f
rev   line source
contrebasse@0 1 local AddonName = ...
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@14 12 local debug = false
contrebasse@5 13 --@end-debug@
contrebasse@0 14
contrebasse@12 15
contrebasse@5 16 ---------------------------------------------------------------
contrebasse@5 17 -- Globals to local
contrebasse@5 18 ---------------------------------------------------------------
contrebasse@5 19 -- These need to be globals
contrebasse@6 20 -- GLOBALS: Degaine_ToggleAuto, Degaine_isAuto, BINDING_HEADER_DEGAINE
contrebasse@0 21
contrebasse@5 22 -- It doesn't matter if they are globals
contrebasse@14 23 -- GLOBALS: DEFAULT_CHAT_FRAME
contrebasse@5 24
contrebasse@5 25 -- Lua functions
contrebasse@0 26 local pairs = pairs;
contrebasse@0 27 local type = type;
contrebasse@0 28
contrebasse@5 29 -- Wow functions
contrebasse@14 30 local GetTime = GetTime
contrebasse@5 31 local InCombatLockdown = InCombatLockdown
contrebasse@5 32 local ToggleSheath = ToggleSheath
contrebasse@0 33
contrebasse@0 34
contrebasse@5 35 ---------------------------------------------------------------
contrebasse@8 36 -- Local vars
contrebasse@8 37 ---------------------------------------------------------------
contrebasse@8 38 -- const
contrebasse@8 39 local DegaineFrame = CreateFrame("Frame")
contrebasse@8 40 local playername = UnitName("player")
contrebasse@8 41
contrebasse@8 42 -- vars
contrebasse@8 43 local t_left = -1
contrebasse@8 44 local delay = 2 -- seconds
contrebasse@14 45 local isGossipClosed = true
contrebasse@14 46 local wasGossipOpened = false
contrebasse@14 47 local t_lastGossipClosed = 0
contrebasse@8 48
contrebasse@12 49
contrebasse@8 50 ---------------------------------------------------------------
contrebasse@5 51 -- Some stuff...
contrebasse@5 52 ---------------------------------------------------------------
contrebasse@5 53 -- Bindings
contrebasse@5 54 BINDING_HEADER_DEGAINE = "Dégainer automatiquement"
contrebasse@5 55
contrebasse@5 56 -- Print status
contrebasse@5 57 local printState = function()
contrebasse@11 58 DEFAULT_CHAT_FRAME:AddMessage(Degaine_isAuto and "Dégainage automatique |cFF00FF00activé|r" or "Dégainage automatique |cFFFF0000désactivé|r")
contrebasse@5 59 end
contrebasse@5 60
contrebasse@5 61
contrebasse@5 62 ---------------------------------------------------------------
contrebasse@5 63 -- Events config
contrebasse@5 64 ---------------------------------------------------------------
contrebasse@5 65 -- Events to watch
contrebasse@5 66 local events = { -- no args to watch
contrebasse@14 67 GOSSIP_SHOW = function()
contrebasse@19 68 -- isGossipClosed :
contrebasse@19 69 -- if the gossip is already opened, no need to draw weapon
contrebasse@19 70 -- UnitName("npc")==UnitName("target") :
contrebasse@19 71 -- hack gossips again because there's no emote with non npc
contrebasse@19 72 -- you have to target the npc to interact with it
contrebasse@19 73 -- things such as boards can't be targeted and start no emote
contrebasse@17 74 local returnvalue = isGossipClosed and UnitName("npc")==UnitName("target")
contrebasse@14 75 isGossipClosed = false
contrebasse@14 76 return returnvalue
contrebasse@14 77 end,
contrebasse@14 78 MERCHANT_SHOW = function()
contrebasse@19 79 -- hack for the cases where the merchant's frame is opened from a gossip frame :
contrebasse@19 80 -- the gossip is closed and the merchant opened but the weapon is not stealthed
contrebasse@14 81 if (GetTime() - t_lastGossipClosed) < 0.5 then
contrebasse@14 82 return not wasGossipOpened
contrebasse@14 83 else
contrebasse@14 84 return isGossipClosed
contrebasse@14 85 end
contrebasse@14 86 end,
contrebasse@11 87 BANKFRAME_OPENED = true, --function() return GossipFrame:IsShown() end,
contrebasse@0 88 AUCTION_HOUSE_SHOW = true,
contrebasse@5 89 }
contrebasse@5 90 local events1player = { -- the first arg is "player"
contrebasse@5 91 UNIT_SPELLCAST_FAILED = true,
contrebasse@5 92 UNIT_SPELLCAST_INTERRUPTED = true,
contrebasse@5 93 UNIT_SPELLCAST_SUCCEEDED = true,
contrebasse@5 94 }
contrebasse@12 95 local SpellBlackList = { -- spells that don't stealth weapons (works with events1player)
contrebasse@12 96 [1784] = true, -- Stealth (Rogue)
contrebasse@12 97 [58984] = true, -- Shadowmeld (Nightelf stealth)
contrebasse@13 98
contrebasse@13 99 -- Tradeskill spells
contrebasse@13 100 [2259] = true, -- Alchemy
contrebasse@13 101 [45357] = true, -- Inscription
contrebasse@13 102 [3908] = true, -- Tailoring
contrebasse@13 103 [7411] = true, -- Enchanting
contrebasse@13 104 [2018] = true, -- Blacksmithing
contrebasse@13 105 [4036] = true, -- Engineering
contrebasse@13 106 [25229] = true, -- Jewelcrafting
contrebasse@13 107 [2656] = true, -- Smelting
contrebasse@13 108 [2108] = true, -- Leatherworking
contrebasse@13 109 [2550] = true, -- Cooking
contrebasse@13 110 [3273] = true, -- First Aid
contrebasse@13 111 [53428] = true -- Runeforge
contrebasse@13 112 -- Archaeology ?
contrebasse@12 113 }
contrebasse@5 114 local events2playername = { -- the 2nd arg is playername
contrebasse@5 115 CHAT_MSG_SAY = true,
contrebasse@5 116 CHAT_MSG_YELL = true,
contrebasse@5 117 CHAT_MSG_TEXT_EMOTE = true,
contrebasse@5 118 }
contrebasse@0 119
contrebasse@0 120
contrebasse@5 121 ---------------------------------------------------------------
contrebasse@8 122 -- Launch drawing weapons
contrebasse@5 123 ---------------------------------------------------------------
contrebasse@5 124 -- Wait a few seconds before drawing, to be able to see the curren animation (and avoid bugs)
contrebasse@5 125 local Degaine_OnUpdate = function(self,t_elapsed)
contrebasse@10 126 t_left = t_left - t_elapsed;
contrebasse@10 127 if t_left<=0 then
contrebasse@11 128 ToggleSheath()
contrebasse@11 129 DegaineFrame:SetScript("OnUpdate", nil)
contrebasse@0 130 end
contrebasse@0 131 end
contrebasse@8 132 local start = function()
contrebasse@8 133 if Degaine_isAuto and not InCombatLockdown() then
contrebasse@8 134 t_left = delay
contrebasse@11 135 DegaineFrame:SetScript("OnUpdate", Degaine_OnUpdate)
contrebasse@8 136 end
contrebasse@8 137 end
contrebasse@5 138
contrebasse@12 139
contrebasse@5 140 ---------------------------------------------------------------
contrebasse@5 141 -- Activation functions
contrebasse@5 142 ---------------------------------------------------------------
contrebasse@5 143 local activate = function()
contrebasse@5 144 if (not Degaine_isAuto) or InCombatLockdown() then return end
contrebasse@5 145
contrebasse@9 146 --DegaineFrame:SetScript("OnUpdate", Degaine_OnUpdate);
contrebasse@5 147 --@debug@
contrebasse@5 148 if debug then
contrebasse@11 149 DegaineFrame:RegisterAllEvents()
contrebasse@5 150 else
contrebasse@5 151 --@end-debug@
contrebasse@18 152 for k,_ in pairs(events) do DegaineFrame:RegisterEvent(k) end
contrebasse@18 153 for k,_ in pairs(events1player) do DegaineFrame:RegisterEvent(k) end
contrebasse@18 154 for k,_ in pairs(events2playername) do DegaineFrame:RegisterEvent(k) end
contrebasse@5 155 --@end-debug@
contrebasse@5 156 end
contrebasse@5 157 --@end-debug@
contrebasse@0 158 end
contrebasse@5 159 local desactivate = function()
contrebasse@18 160 for k,_ in pairs(events) do DegaineFrame:UnregisterEvent(k) end
contrebasse@18 161 for k,_ in pairs(events1player) do DegaineFrame:UnregisterEvent(k) end
contrebasse@18 162 for k,_ in pairs(events2playername) do DegaineFrame:UnregisterEvent(k) end
contrebasse@11 163 DegaineFrame:SetScript("OnUpdate", nil)
contrebasse@0 164 end
contrebasse@6 165 Degaine_ToggleAuto = function()
contrebasse@5 166 if Degaine_isAuto then
contrebasse@5 167 Degaine_isAuto = false
contrebasse@5 168 desactivate()
contrebasse@5 169 else
contrebasse@5 170 Degaine_isAuto = true
contrebasse@5 171 activate()
contrebasse@5 172 end
contrebasse@5 173 printState()
contrebasse@5 174 end
contrebasse@0 175
contrebasse@5 176
contrebasse@5 177 ---------------------------------------------------------------
contrebasse@5 178 -- Event/hooks functions
contrebasse@5 179 ---------------------------------------------------------------
contrebasse@12 180 local Degaine_OnEvent = function(self,event, arg1, arg2, _, _, arg5, ...)
contrebasse@5 181 --@debug@
contrebasse@14 182 --if debug then
contrebasse@5 183 DEFAULT_CHAT_FRAME:AddMessage(event)
contrebasse@14 184 --if arg1 then DEFAULT_CHAT_FRAME:AddMessage("arg1 = "..arg1) end
contrebasse@14 185 --if arg2 then DEFAULT_CHAT_FRAME:AddMessage("arg2 = "..arg2) end
contrebasse@14 186 --end
contrebasse@5 187 --@end-debug@
contrebasse@5 188
contrebasse@12 189 if events[event] then
contrebasse@12 190 if type(events[event])~="function" or events[event]() then
contrebasse@12 191 start()
contrebasse@12 192 end
contrebasse@12 193 elseif events1player[event] then
contrebasse@12 194 if arg1=="player" then
contrebasse@12 195 if not SpellBlackList[arg5] then -- arg5 is SpellID
contrebasse@12 196 start()
contrebasse@12 197 end
contrebasse@12 198 end
contrebasse@12 199 elseif events2playername[event] then
contrebasse@12 200 if arg2==playername then
contrebasse@12 201 start()
contrebasse@12 202 end
contrebasse@14 203 elseif event == "GOSSIP_CLOSED" then
contrebasse@14 204 wasGossipOpened = not isGossipClosed
contrebasse@14 205 isGossipClosed = true
contrebasse@14 206 t_lastGossipClosed = GetTime()
contrebasse@5 207
contrebasse@0 208 elseif event == "PLAYER_REGEN_ENABLED" then
contrebasse@5 209 desactivate()
contrebasse@0 210 elseif event == "PLAYER_REGEN_DISABLED" then
contrebasse@5 211 activate()
contrebasse@5 212
contrebasse@0 213 elseif event == "ADDON_LOADED" and arg1==AddonName then
contrebasse@5 214 if Degaine_isAuto==nil then
contrebasse@5 215 Degaine_isAuto = true
contrebasse@0 216 end
contrebasse@11 217 if Degaine_isAuto then activate() else desactivate() end
contrebasse@5 218 printState()
contrebasse@5 219
contrebasse@5 220 -- Not needed anymore
contrebasse@5 221 DegaineFrame:UnregisterEvent("ADDON_LOADED")
contrebasse@0 222 end
contrebasse@0 223 end
contrebasse@5 224 -- Hook when standing up
contrebasse@5 225 -- (Didn't work, see http://forums.wowace.com/showthread.php?p=310547#post310547)
contrebasse@8 226 hooksecurefunc("SitStandOrDescendStart",start);
contrebasse@0 227
contrebasse@0 228
contrebasse@6 229 ---------------------------------------------------------------
contrebasse@6 230 -- Commands
contrebasse@6 231 ---------------------------------------------------------------
contrebasse@6 232 -- Bindings
contrebasse@6 233 BINDING_HEADER_DEGAINE = "Dégainer automatiquement"
contrebasse@6 234
contrebasse@6 235 -- Slash command
contrebasse@7 236 -- GLOBALS: SLASH_DEGAINE1
contrebasse@7 237 SLASH_DEGAINE1 = "/degaine"
contrebasse@6 238 SlashCmdList["DEGAINE"] = Degaine_ToggleAuto
contrebasse@6 239
contrebasse@5 240
contrebasse@5 241 ---------------------------------------------------------------
contrebasse@5 242 -- Initialization
contrebasse@5 243 ---------------------------------------------------------------
contrebasse@5 244 DegaineFrame:SetScript("OnEvent",Degaine_OnEvent)
contrebasse@5 245
contrebasse@5 246 -- Global events
contrebasse@14 247 DegaineFrame:RegisterEvent("GOSSIP_CLOSED")
contrebasse@5 248 DegaineFrame:RegisterEvent("PLAYER_REGEN_ENABLED")
contrebasse@5 249 DegaineFrame:RegisterEvent("PLAYER_REGEN_DISABLED")
contrebasse@5 250 DegaineFrame:RegisterEvent("ADDON_LOADED")
contrebasse@5 251 activate()
contrebasse@12 252