annotate Degaine.lua @ 14:c627cef1c6d6 v1.0beta2

Lots of hacks for merchants and gossips
author contrebasse
date Fri, 10 Dec 2010 18:22:56 +0100
parents 7b1f3a9cba48
children c83103057b7a
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@14 68 local returnvalue = isGossipClosed
contrebasse@14 69 isGossipClosed = false
contrebasse@14 70 return returnvalue
contrebasse@14 71 end,
contrebasse@14 72 MERCHANT_SHOW = function()
contrebasse@14 73 -- hack for the cases where the merchant's frame is opened from a gossip frame
contrebasse@14 74 if (GetTime() - t_lastGossipClosed) < 0.5 then
contrebasse@14 75 return not wasGossipOpened
contrebasse@14 76 else
contrebasse@14 77 return isGossipClosed
contrebasse@14 78 end
contrebasse@14 79 end,
contrebasse@11 80 BANKFRAME_OPENED = true, --function() return GossipFrame:IsShown() end,
contrebasse@0 81 AUCTION_HOUSE_SHOW = true,
contrebasse@5 82 }
contrebasse@5 83 local events1player = { -- the first arg is "player"
contrebasse@5 84 UNIT_SPELLCAST_FAILED = true,
contrebasse@5 85 UNIT_SPELLCAST_INTERRUPTED = true,
contrebasse@5 86 UNIT_SPELLCAST_SUCCEEDED = true,
contrebasse@5 87 }
contrebasse@12 88 local SpellBlackList = { -- spells that don't stealth weapons (works with events1player)
contrebasse@12 89 [1784] = true, -- Stealth (Rogue)
contrebasse@12 90 [58984] = true, -- Shadowmeld (Nightelf stealth)
contrebasse@13 91
contrebasse@13 92 -- Tradeskill spells
contrebasse@13 93 [2259] = true, -- Alchemy
contrebasse@13 94 [45357] = true, -- Inscription
contrebasse@13 95 [3908] = true, -- Tailoring
contrebasse@13 96 [7411] = true, -- Enchanting
contrebasse@13 97 [2018] = true, -- Blacksmithing
contrebasse@13 98 [4036] = true, -- Engineering
contrebasse@13 99 [25229] = true, -- Jewelcrafting
contrebasse@13 100 [2656] = true, -- Smelting
contrebasse@13 101 [2108] = true, -- Leatherworking
contrebasse@13 102 [2550] = true, -- Cooking
contrebasse@13 103 [3273] = true, -- First Aid
contrebasse@13 104 [53428] = true -- Runeforge
contrebasse@13 105 -- Archaeology ?
contrebasse@12 106 }
contrebasse@5 107 local events2playername = { -- the 2nd arg is playername
contrebasse@5 108 CHAT_MSG_SAY = true,
contrebasse@5 109 CHAT_MSG_YELL = true,
contrebasse@5 110 CHAT_MSG_TEXT_EMOTE = true,
contrebasse@5 111 }
contrebasse@0 112
contrebasse@0 113
contrebasse@5 114 ---------------------------------------------------------------
contrebasse@8 115 -- Launch drawing weapons
contrebasse@5 116 ---------------------------------------------------------------
contrebasse@5 117 -- Wait a few seconds before drawing, to be able to see the curren animation (and avoid bugs)
contrebasse@5 118 local Degaine_OnUpdate = function(self,t_elapsed)
contrebasse@10 119 t_left = t_left - t_elapsed;
contrebasse@10 120 if t_left<=0 then
contrebasse@11 121 ToggleSheath()
contrebasse@11 122 DegaineFrame:SetScript("OnUpdate", nil)
contrebasse@0 123 end
contrebasse@0 124 end
contrebasse@8 125 local start = function()
contrebasse@8 126 if Degaine_isAuto and not InCombatLockdown() then
contrebasse@8 127 t_left = delay
contrebasse@11 128 DegaineFrame:SetScript("OnUpdate", Degaine_OnUpdate)
contrebasse@8 129 end
contrebasse@8 130 end
contrebasse@5 131
contrebasse@12 132
contrebasse@5 133 ---------------------------------------------------------------
contrebasse@5 134 -- Activation functions
contrebasse@5 135 ---------------------------------------------------------------
contrebasse@5 136 local activate = function()
contrebasse@5 137 if (not Degaine_isAuto) or InCombatLockdown() then return end
contrebasse@5 138
contrebasse@9 139 --DegaineFrame:SetScript("OnUpdate", Degaine_OnUpdate);
contrebasse@5 140 --@debug@
contrebasse@5 141 if debug then
contrebasse@11 142 DegaineFrame:RegisterAllEvents()
contrebasse@5 143 else
contrebasse@5 144 --@end-debug@
contrebasse@11 145 for k,v in pairs(events) do DegaineFrame:RegisterEvent(k) end
contrebasse@11 146 for k,v in pairs(events1player) do DegaineFrame:RegisterEvent(k) end
contrebasse@11 147 for k,v in pairs(events2playername) do DegaineFrame:RegisterEvent(k) end
contrebasse@5 148 --@end-debug@
contrebasse@5 149 end
contrebasse@5 150 --@end-debug@
contrebasse@0 151 end
contrebasse@5 152 local desactivate = function()
contrebasse@11 153 for k,v in pairs(events) do DegaineFrame:UnregisterEvent(k) end
contrebasse@11 154 for k,v in pairs(events1player) do DegaineFrame:UnregisterEvent(k) end
contrebasse@11 155 for k,v in pairs(events2playername) do DegaineFrame:UnregisterEvent(k) end
contrebasse@11 156 DegaineFrame:SetScript("OnUpdate", nil)
contrebasse@0 157 end
contrebasse@6 158 Degaine_ToggleAuto = function()
contrebasse@5 159 if Degaine_isAuto then
contrebasse@5 160 Degaine_isAuto = false
contrebasse@5 161 desactivate()
contrebasse@5 162 else
contrebasse@5 163 Degaine_isAuto = true
contrebasse@5 164 activate()
contrebasse@5 165 end
contrebasse@5 166 printState()
contrebasse@5 167 end
contrebasse@0 168
contrebasse@5 169
contrebasse@5 170 ---------------------------------------------------------------
contrebasse@5 171 -- Event/hooks functions
contrebasse@5 172 ---------------------------------------------------------------
contrebasse@12 173 local Degaine_OnEvent = function(self,event, arg1, arg2, _, _, arg5, ...)
contrebasse@5 174 --@debug@
contrebasse@14 175 --if debug then
contrebasse@5 176 DEFAULT_CHAT_FRAME:AddMessage(event)
contrebasse@14 177 --if arg1 then DEFAULT_CHAT_FRAME:AddMessage("arg1 = "..arg1) end
contrebasse@14 178 --if arg2 then DEFAULT_CHAT_FRAME:AddMessage("arg2 = "..arg2) end
contrebasse@14 179 --end
contrebasse@5 180 --@end-debug@
contrebasse@5 181
contrebasse@12 182 if events[event] then
contrebasse@12 183 if type(events[event])~="function" or events[event]() then
contrebasse@12 184 start()
contrebasse@12 185 end
contrebasse@12 186 elseif events1player[event] then
contrebasse@12 187 if arg1=="player" then
contrebasse@12 188 if not SpellBlackList[arg5] then -- arg5 is SpellID
contrebasse@12 189 start()
contrebasse@12 190 end
contrebasse@12 191 end
contrebasse@12 192 elseif events2playername[event] then
contrebasse@12 193 if arg2==playername then
contrebasse@12 194 start()
contrebasse@12 195 end
contrebasse@14 196 elseif event == "GOSSIP_CLOSED" then
contrebasse@14 197 wasGossipOpened = not isGossipClosed
contrebasse@14 198 isGossipClosed = true
contrebasse@14 199 t_lastGossipClosed = GetTime()
contrebasse@5 200
contrebasse@0 201 elseif event == "PLAYER_REGEN_ENABLED" then
contrebasse@5 202 desactivate()
contrebasse@0 203 elseif event == "PLAYER_REGEN_DISABLED" then
contrebasse@5 204 activate()
contrebasse@5 205
contrebasse@0 206 elseif event == "ADDON_LOADED" and arg1==AddonName then
contrebasse@5 207 if Degaine_isAuto==nil then
contrebasse@5 208 Degaine_isAuto = true
contrebasse@0 209 end
contrebasse@11 210 if Degaine_isAuto then activate() else desactivate() end
contrebasse@5 211 printState()
contrebasse@5 212
contrebasse@5 213 -- Not needed anymore
contrebasse@5 214 DegaineFrame:UnregisterEvent("ADDON_LOADED")
contrebasse@0 215 end
contrebasse@0 216 end
contrebasse@5 217 -- Hook when standing up
contrebasse@5 218 -- (Didn't work, see http://forums.wowace.com/showthread.php?p=310547#post310547)
contrebasse@8 219 hooksecurefunc("SitStandOrDescendStart",start);
contrebasse@0 220
contrebasse@0 221
contrebasse@6 222 ---------------------------------------------------------------
contrebasse@6 223 -- Commands
contrebasse@6 224 ---------------------------------------------------------------
contrebasse@6 225 -- Bindings
contrebasse@6 226 BINDING_HEADER_DEGAINE = "Dégainer automatiquement"
contrebasse@6 227
contrebasse@6 228 -- Slash command
contrebasse@7 229 -- GLOBALS: SLASH_DEGAINE1
contrebasse@7 230 SLASH_DEGAINE1 = "/degaine"
contrebasse@6 231 SlashCmdList["DEGAINE"] = Degaine_ToggleAuto
contrebasse@6 232
contrebasse@5 233
contrebasse@5 234 ---------------------------------------------------------------
contrebasse@5 235 -- Initialization
contrebasse@5 236 ---------------------------------------------------------------
contrebasse@5 237 DegaineFrame:SetScript("OnEvent",Degaine_OnEvent)
contrebasse@5 238
contrebasse@5 239 -- Global events
contrebasse@14 240 DegaineFrame:RegisterEvent("GOSSIP_CLOSED")
contrebasse@5 241 DegaineFrame:RegisterEvent("PLAYER_REGEN_ENABLED")
contrebasse@5 242 DegaineFrame:RegisterEvent("PLAYER_REGEN_DISABLED")
contrebasse@5 243 DegaineFrame:RegisterEvent("ADDON_LOADED")
contrebasse@5 244 activate()
contrebasse@12 245