annotate Degaine.lua @ 20:4da97c12564f

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