annotate Degaine.lua @ 9:571dcc76d801

Launch OnUpdate only when needed
author contrebasse
date Fri, 10 Dec 2010 16:44:07 +0100
parents 47f9e596ef5a
children 37ac0d31cf0e
rev   line source
contrebasse@0 1 local AddonName = ...
contrebasse@5 2 -- Draw your weapons automagically
contrebasse@0 3
contrebasse@5 4 -- Known bugs :
contrebasse@0 5 -- si on se lève en sautant ça ne sort pas l'arme (impossible de savoir si on était assis avant)
contrebasse@0 6
contrebasse@5 7 --@debug@
contrebasse@0 8 local debug = false;
contrebasse@5 9 --@end-debug@
contrebasse@0 10
contrebasse@5 11 ---------------------------------------------------------------
contrebasse@5 12 -- Globals to local
contrebasse@5 13 ---------------------------------------------------------------
contrebasse@5 14 -- These need to be globals
contrebasse@6 15 -- GLOBALS: Degaine_ToggleAuto, Degaine_isAuto, BINDING_HEADER_DEGAINE
contrebasse@0 16
contrebasse@5 17 -- It doesn't matter if they are globals
contrebasse@5 18 -- GLOBALS: DEFAULT_CHAT_FRAME, GossipFrame
contrebasse@5 19
contrebasse@5 20 -- Lua functions
contrebasse@0 21 local pairs = pairs;
contrebasse@0 22 local type = type;
contrebasse@0 23
contrebasse@5 24 -- Wow functions
contrebasse@5 25 local InCombatLockdown = InCombatLockdown
contrebasse@5 26 local ToggleSheath = ToggleSheath
contrebasse@0 27
contrebasse@0 28
contrebasse@5 29 ---------------------------------------------------------------
contrebasse@8 30 -- Local vars
contrebasse@8 31 ---------------------------------------------------------------
contrebasse@8 32 -- const
contrebasse@8 33 local DegaineFrame = CreateFrame("Frame")
contrebasse@8 34 local playername = UnitName("player")
contrebasse@8 35
contrebasse@8 36 -- vars
contrebasse@8 37 local done = true
contrebasse@8 38 local t_left = -1
contrebasse@8 39 local delay = 2 -- seconds
contrebasse@8 40
contrebasse@8 41 ---------------------------------------------------------------
contrebasse@5 42 -- Some stuff...
contrebasse@5 43 ---------------------------------------------------------------
contrebasse@5 44 -- Bindings
contrebasse@5 45 BINDING_HEADER_DEGAINE = "Dégainer automatiquement"
contrebasse@5 46
contrebasse@5 47 -- Print status
contrebasse@5 48 local printState = function()
contrebasse@5 49 DEFAULT_CHAT_FRAME:AddMessage(Degaine_isAuto and "Dégainage automatique |cFF00FF00activé|r" or "Dégainage automatique |cFFFF0000désactivé|r");
contrebasse@5 50 end
contrebasse@5 51
contrebasse@5 52
contrebasse@5 53 ---------------------------------------------------------------
contrebasse@5 54 -- Events config
contrebasse@5 55 ---------------------------------------------------------------
contrebasse@5 56 -- Events to watch
contrebasse@5 57 local events = { -- no args to watch
contrebasse@0 58 GOSSIP_SHOW = true,
contrebasse@0 59 MERCHANT_SHOW = function() return GossipFrame:IsShown(); end,
contrebasse@5 60 BANKFRAME_OPENED = true, --function() return GossipFrame:IsShown(); end,
contrebasse@0 61 AUCTION_HOUSE_SHOW = true,
contrebasse@5 62 }
contrebasse@5 63 local SpellBlacklist = {
contrebasse@5 64 [1784] = true, -- Stealth (Rogue)
contrebasse@5 65 [58984] = true, -- Shadowmeld (Nightelf stealth)
contrebasse@5 66 }
contrebasse@5 67 local events1player = { -- the first arg is "player"
contrebasse@5 68 UNIT_SPELLCAST_FAILED = true,
contrebasse@5 69 UNIT_SPELLCAST_INTERRUPTED = true,
contrebasse@5 70 UNIT_SPELLCAST_SUCCEEDED = true,
contrebasse@5 71 }
contrebasse@5 72 local events2playername = { -- the 2nd arg is playername
contrebasse@5 73 CHAT_MSG_SAY = true,
contrebasse@5 74 CHAT_MSG_YELL = true,
contrebasse@5 75 CHAT_MSG_TEXT_EMOTE = true,
contrebasse@5 76 }
contrebasse@0 77
contrebasse@0 78
contrebasse@5 79 ---------------------------------------------------------------
contrebasse@8 80 -- Launch drawing weapons
contrebasse@5 81 ---------------------------------------------------------------
contrebasse@5 82 -- Wait a few seconds before drawing, to be able to see the curren animation (and avoid bugs)
contrebasse@5 83 local Degaine_OnUpdate = function(self,t_elapsed)
contrebasse@0 84 if not done then
contrebasse@5 85 t_left = t_left - t_elapsed;
contrebasse@5 86 if t_left<=0 then
contrebasse@0 87 done = true;
contrebasse@0 88 ToggleSheath();
contrebasse@8 89 DegaineFrame:SetScript("OnUpdate", nil);
contrebasse@0 90 end
contrebasse@0 91 end
contrebasse@0 92 end
contrebasse@8 93 local start = function()
contrebasse@8 94 if Degaine_isAuto and not InCombatLockdown() then
contrebasse@8 95 t_left = delay
contrebasse@8 96 done = false
contrebasse@8 97 DegaineFrame:SetScript("OnUpdate", Degaine_OnUpdate);
contrebasse@8 98 end
contrebasse@8 99 end
contrebasse@5 100
contrebasse@5 101 ---------------------------------------------------------------
contrebasse@5 102 -- Activation functions
contrebasse@5 103 ---------------------------------------------------------------
contrebasse@5 104 local activate = function()
contrebasse@5 105 if (not Degaine_isAuto) or InCombatLockdown() then return end
contrebasse@5 106
contrebasse@9 107 --DegaineFrame:SetScript("OnUpdate", Degaine_OnUpdate);
contrebasse@5 108 --@debug@
contrebasse@5 109 if debug then
contrebasse@5 110 DegaineFrame:RegisterAllEvents();
contrebasse@5 111 else
contrebasse@5 112 --@end-debug@
contrebasse@5 113 for k,v in pairs(events) do DegaineFrame:RegisterEvent(k); end
contrebasse@5 114 for k,v in pairs(events1player) do DegaineFrame:RegisterEvent(k); end
contrebasse@5 115 for k,v in pairs(events2playername) do DegaineFrame:RegisterEvent(k); end
contrebasse@5 116 --@end-debug@
contrebasse@5 117 end
contrebasse@5 118 --@end-debug@
contrebasse@0 119 end
contrebasse@5 120 local desactivate = function()
contrebasse@5 121 for k,v in pairs(events) do DegaineFrame:UnregisterEvent(k); end
contrebasse@5 122 for k,v in pairs(events1player) do DegaineFrame:UnregisterEvent(k); end
contrebasse@5 123 for k,v in pairs(events2playername) do DegaineFrame:UnregisterEvent(k); end
contrebasse@0 124 DegaineFrame:SetScript("OnUpdate", nil);
contrebasse@0 125 done = true;
contrebasse@0 126 end
contrebasse@6 127 Degaine_ToggleAuto = function()
contrebasse@5 128 if Degaine_isAuto then
contrebasse@5 129 Degaine_isAuto = false
contrebasse@5 130 desactivate()
contrebasse@5 131 else
contrebasse@5 132 Degaine_isAuto = true
contrebasse@5 133 activate()
contrebasse@5 134 end
contrebasse@5 135 printState()
contrebasse@5 136 end
contrebasse@0 137
contrebasse@5 138
contrebasse@5 139 ---------------------------------------------------------------
contrebasse@5 140 -- Event/hooks functions
contrebasse@5 141 ---------------------------------------------------------------
contrebasse@5 142 local Degaine_OnEvent = function(self,event, arg1, arg2, ...)
contrebasse@5 143 --@debug@
contrebasse@0 144 if debug then
contrebasse@5 145 DEFAULT_CHAT_FRAME:AddMessage(event)
contrebasse@0 146 if arg1 then DEFAULT_CHAT_FRAME:AddMessage("arg1 = "..arg1); end
contrebasse@0 147 if arg2 then DEFAULT_CHAT_FRAME:AddMessage("arg2 = "..arg2); end
contrebasse@0 148 end
contrebasse@5 149 --@end-debug@
contrebasse@5 150
contrebasse@0 151 if ((events[event] and (type(events[event])~="function" or events[event]()))
contrebasse@0 152 or (events1player[event] and arg1=="player")
contrebasse@0 153 or (events2playername[event] and arg2==playername)) then
contrebasse@8 154 start()
contrebasse@5 155
contrebasse@0 156 elseif event == "PLAYER_REGEN_ENABLED" then
contrebasse@5 157 desactivate()
contrebasse@0 158 elseif event == "PLAYER_REGEN_DISABLED" then
contrebasse@5 159 activate()
contrebasse@5 160
contrebasse@0 161 elseif event == "ADDON_LOADED" and arg1==AddonName then
contrebasse@5 162 if Degaine_isAuto==nil then
contrebasse@5 163 Degaine_isAuto = true
contrebasse@0 164 end
contrebasse@8 165 if Degaine_isAuto then activate(); else desactivate(); end
contrebasse@5 166 printState()
contrebasse@5 167
contrebasse@5 168 -- Not needed anymore
contrebasse@5 169 DegaineFrame:UnregisterEvent("ADDON_LOADED")
contrebasse@0 170 end
contrebasse@0 171 end
contrebasse@5 172 -- Hook when standing up
contrebasse@5 173 -- (Didn't work, see http://forums.wowace.com/showthread.php?p=310547#post310547)
contrebasse@8 174 hooksecurefunc("SitStandOrDescendStart",start);
contrebasse@0 175
contrebasse@0 176
contrebasse@6 177 ---------------------------------------------------------------
contrebasse@6 178 -- Commands
contrebasse@6 179 ---------------------------------------------------------------
contrebasse@6 180 -- Bindings
contrebasse@6 181 BINDING_HEADER_DEGAINE = "Dégainer automatiquement"
contrebasse@6 182
contrebasse@6 183 -- Slash command
contrebasse@7 184 -- GLOBALS: SLASH_DEGAINE1
contrebasse@7 185 SLASH_DEGAINE1 = "/degaine"
contrebasse@6 186 SlashCmdList["DEGAINE"] = Degaine_ToggleAuto
contrebasse@6 187
contrebasse@5 188
contrebasse@5 189 ---------------------------------------------------------------
contrebasse@5 190 -- Initialization
contrebasse@5 191 ---------------------------------------------------------------
contrebasse@5 192 DegaineFrame:SetScript("OnEvent",Degaine_OnEvent)
contrebasse@5 193
contrebasse@5 194 -- Global events
contrebasse@5 195 DegaineFrame:RegisterEvent("PLAYER_REGEN_ENABLED")
contrebasse@5 196 DegaineFrame:RegisterEvent("PLAYER_REGEN_DISABLED")
contrebasse@5 197 DegaineFrame:RegisterEvent("ADDON_LOADED")
contrebasse@5 198 activate()