annotate Degaine.lua @ 52:d724fb112e7c

Remove Ghost Wolf (doesn't work like this) and modify debug option
author contrebasse
date Mon, 28 Feb 2011 00:20:19 +0100
parents 94566cb4534f
children 6da5658a3428
rev   line source
contrebasse@43 1 local AddonName, T = ...
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@52 12 local debug = true
contrebasse@52 13 local debugAll = false
contrebasse@5 14 --@end-debug@
contrebasse@0 15
contrebasse@12 16
contrebasse@5 17 ---------------------------------------------------------------
contrebasse@5 18 -- Globals to local
contrebasse@5 19 ---------------------------------------------------------------
contrebasse@21 20 -- These need to be globals :
contrebasse@6 21 -- GLOBALS: Degaine_ToggleAuto, Degaine_isAuto, BINDING_HEADER_DEGAINE
contrebasse@0 22
contrebasse@21 23 -- It doesn't matter if they are globals, rarely unsed :
contrebasse@14 24 -- GLOBALS: DEFAULT_CHAT_FRAME
contrebasse@5 25
contrebasse@5 26 -- Lua functions
contrebasse@0 27 local pairs = pairs;
contrebasse@0 28 local type = type;
contrebasse@35 29 local select = select
contrebasse@0 30
contrebasse@5 31 -- Wow functions
contrebasse@14 32 local GetTime = GetTime
contrebasse@5 33 local InCombatLockdown = InCombatLockdown
contrebasse@5 34 local ToggleSheath = ToggleSheath
contrebasse@20 35 local UnitName = UnitName
contrebasse@24 36 local IsMounted = IsMounted
contrebasse@33 37 local UnitCastingInfo = UnitCastingInfo
contrebasse@35 38 local GetUnitSpeed = GetUnitSpeed
contrebasse@0 39
contrebasse@0 40
contrebasse@5 41 ---------------------------------------------------------------
contrebasse@8 42 -- Local vars
contrebasse@8 43 ---------------------------------------------------------------
contrebasse@8 44 -- const
contrebasse@8 45 local DegaineFrame = CreateFrame("Frame")
contrebasse@8 46 local playername = UnitName("player")
contrebasse@35 47 local delay = 2.5 -- seconds
contrebasse@35 48 local delay_short = 0.5 -- seconds
contrebasse@8 49
contrebasse@8 50 -- vars
contrebasse@8 51 local t_left = -1
contrebasse@14 52 local isGossipClosed = true
contrebasse@14 53 local wasGossipOpened = false
contrebasse@14 54 local t_lastGossipClosed = 0
contrebasse@34 55 --local wasMounted = IsMounted() -- handle mounts with UNIT_AURA
contrebasse@33 56 local isTradeSkill = false
contrebasse@47 57 local t_lastDegaine = 0 -- Time of the last draw
contrebasse@8 58
contrebasse@12 59
contrebasse@8 60 ---------------------------------------------------------------
contrebasse@5 61 -- Some stuff...
contrebasse@5 62 ---------------------------------------------------------------
contrebasse@5 63 -- Print status
contrebasse@5 64 local printState = function()
contrebasse@49 65 DEFAULT_CHAT_FRAME:AddMessage(Degaine_isAuto and T.L["PRINT_ENABLED"] or T.L["PRINT_DISABLED"])
contrebasse@5 66 end
contrebasse@5 67
contrebasse@5 68
contrebasse@5 69 ---------------------------------------------------------------
contrebasse@28 70 -- Launch drawing weapons
contrebasse@28 71 ---------------------------------------------------------------
contrebasse@28 72 -- Wait a few seconds before drawing, to be able to see the curren animation (and avoid bugs)
contrebasse@28 73 local Degaine_OnUpdate = function(self,t_elapsed)
contrebasse@28 74 t_left = t_left - t_elapsed;
contrebasse@28 75 if t_left<=0 then
contrebasse@28 76 ToggleSheath()
contrebasse@28 77 DegaineFrame:SetScript("OnUpdate", nil)
contrebasse@47 78 t_lastDegaine = GetTime()
contrebasse@28 79 end
contrebasse@28 80 end
contrebasse@32 81 local start = function(arg_delay)
contrebasse@43 82
contrebasse@43 83 --@debug@
contrebasse@43 84 --DEFAULT_CHAT_FRAME:AddMessage("Go !")
contrebasse@43 85 --@end-debug@
contrebasse@43 86
contrebasse@47 87 if Degaine_isAuto and (GetTime()-t_lastDegaine)>1 and not InCombatLockdown() then
contrebasse@32 88 t_left = arg_delay or delay
contrebasse@28 89 DegaineFrame:SetScript("OnUpdate", Degaine_OnUpdate)
contrebasse@28 90 end
contrebasse@28 91 end
contrebasse@28 92
contrebasse@28 93
contrebasse@28 94 ---------------------------------------------------------------
contrebasse@5 95 -- Events config
contrebasse@5 96 ---------------------------------------------------------------
contrebasse@5 97 -- Events to watch
contrebasse@5 98 local events = { -- no args to watch
contrebasse@14 99 GOSSIP_SHOW = function()
contrebasse@19 100 -- isGossipClosed :
contrebasse@19 101 -- if the gossip is already opened, no need to draw weapon
contrebasse@19 102 -- UnitName("npc")==UnitName("target") :
contrebasse@19 103 -- hack gossips again because there's no emote with non npc
contrebasse@19 104 -- you have to target the npc to interact with it
contrebasse@19 105 -- things such as boards can't be targeted and start no emote
contrebasse@17 106 local returnvalue = isGossipClosed and UnitName("npc")==UnitName("target")
contrebasse@14 107 isGossipClosed = false
contrebasse@14 108 return returnvalue
contrebasse@14 109 end,
contrebasse@14 110 MERCHANT_SHOW = function()
contrebasse@19 111 -- hack for the cases where the merchant's frame is opened from a gossip frame :
contrebasse@19 112 -- the gossip is closed and the merchant opened but the weapon is not stealthed
contrebasse@14 113 if (GetTime() - t_lastGossipClosed) < 0.5 then
contrebasse@14 114 return not wasGossipOpened
contrebasse@14 115 else
contrebasse@14 116 return isGossipClosed
contrebasse@14 117 end
contrebasse@14 118 end,
contrebasse@41 119 QUEST_PROGRESS = true,
contrebasse@11 120 BANKFRAME_OPENED = true, --function() return GossipFrame:IsShown() end,
contrebasse@0 121 AUCTION_HOUSE_SHOW = true,
contrebasse@5 122 }
contrebasse@5 123 local events1player = { -- the first arg is "player"
contrebasse@5 124 UNIT_SPELLCAST_FAILED = true,
contrebasse@5 125 UNIT_SPELLCAST_INTERRUPTED = true,
contrebasse@5 126 UNIT_SPELLCAST_SUCCEEDED = true,
contrebasse@33 127 UNIT_SPELLCAST_START = true, -- to ckeck tradeskill
contrebasse@5 128 }
contrebasse@31 129
contrebasse@43 130 --[[
contrebasse@43 131 -- Was used when moving prevented to play the emote when talking
contrebasse@43 132 -- Was needed for CHAT_MSG_SAY and CHAT_MSG_YELL
contrebasse@35 133 local function playerIsNotMoving()
contrebasse@35 134 return GetUnitSpeed("player") == 0
contrebasse@35 135 end
contrebasse@43 136 --]]
contrebasse@5 137 local events2playername = { -- the 2nd arg is playername
contrebasse@43 138 CHAT_MSG_SAY = true,
contrebasse@43 139 CHAT_MSG_YELL = true,
contrebasse@35 140 CHAT_MSG_TEXT_EMOTE = true, -- the emote is not shown, but the weapon is stealthed
contrebasse@5 141 }
contrebasse@0 142
contrebasse@0 143
contrebasse@5 144 ---------------------------------------------------------------
contrebasse@24 145 -- Handle mounts with OnUpdate
contrebasse@24 146 ---------------------------------------------------------------
contrebasse@24 147 -- works with GupPet but not with the default interface...
contrebasse@24 148 -- I guess that's because a specific /cancelaura or alike is done
contrebasse@24 149 -- hooksecurefunc("Dismount",start);
contrebasse@24 150
contrebasse@28 151 -- With OnUpdate
contrebasse@24 152 local handleMountsFrame = CreateFrame("frame")
contrebasse@24 153 local handleMountsOnUpdate
contrebasse@24 154 do
contrebasse@24 155 local IsMounted = IsMounted
contrebasse@24 156 local wasMounted = IsMounted()
contrebasse@24 157 function handleMountsOnUpdate(self,t_elapsed)
contrebasse@24 158 if IsMounted() then
contrebasse@24 159 wasMounted = true
contrebasse@24 160 else
contrebasse@24 161 if wasMounted then
contrebasse@35 162 start(delay_short) -- no animation for unmounting
contrebasse@24 163 wasMounted = false
contrebasse@24 164 end
contrebasse@24 165 end
contrebasse@24 166 end
contrebasse@24 167 end
contrebasse@5 168
contrebasse@12 169
contrebasse@5 170 ---------------------------------------------------------------
contrebasse@5 171 -- Activation functions
contrebasse@5 172 ---------------------------------------------------------------
contrebasse@5 173 local activate = function()
contrebasse@5 174 if (not Degaine_isAuto) or InCombatLockdown() then return end
contrebasse@5 175
contrebasse@9 176 --DegaineFrame:SetScript("OnUpdate", Degaine_OnUpdate);
contrebasse@5 177 --@debug@
contrebasse@52 178 if debugAll then
contrebasse@11 179 DegaineFrame:RegisterAllEvents()
contrebasse@5 180 else
contrebasse@5 181 --@end-debug@
contrebasse@18 182 for k,_ in pairs(events) do DegaineFrame:RegisterEvent(k) end
contrebasse@18 183 for k,_ in pairs(events1player) do DegaineFrame:RegisterEvent(k) end
contrebasse@18 184 for k,_ in pairs(events2playername) do DegaineFrame:RegisterEvent(k) end
contrebasse@28 185 --DegaineFrame:RegisterEvent("UNIT_AURA")
contrebasse@28 186 handleMountsFrame:SetScript("OnUpdate",handleMountsOnUpdate)
contrebasse@39 187 --@debug@
contrebasse@5 188 end
contrebasse@5 189 --@end-debug@
contrebasse@0 190 end
contrebasse@5 191 local desactivate = function()
contrebasse@24 192 DegaineFrame:SetScript("OnUpdate", nil)
contrebasse@24 193 t_left = -1
contrebasse@37 194 isTradeSkill = false
contrebasse@18 195 for k,_ in pairs(events) do DegaineFrame:UnregisterEvent(k) end
contrebasse@18 196 for k,_ in pairs(events1player) do DegaineFrame:UnregisterEvent(k) end
contrebasse@18 197 for k,_ in pairs(events2playername) do DegaineFrame:UnregisterEvent(k) end
contrebasse@28 198 --DegaineFrame:UnregisterEvent("UNIT_AURA")
contrebasse@28 199 handleMountsFrame:SetScript("OnUpdate",nil)
contrebasse@0 200 end
contrebasse@6 201 Degaine_ToggleAuto = function()
contrebasse@5 202 if Degaine_isAuto then
contrebasse@5 203 Degaine_isAuto = false
contrebasse@5 204 desactivate()
contrebasse@5 205 else
contrebasse@5 206 Degaine_isAuto = true
contrebasse@5 207 activate()
contrebasse@5 208 end
contrebasse@5 209 printState()
contrebasse@5 210 end
contrebasse@0 211
contrebasse@5 212
contrebasse@24 213
contrebasse@5 214 ---------------------------------------------------------------
contrebasse@5 215 -- Event/hooks functions
contrebasse@5 216 ---------------------------------------------------------------
contrebasse@12 217 local Degaine_OnEvent = function(self,event, arg1, arg2, _, _, arg5, ...)
contrebasse@5 218 --@debug@
contrebasse@41 219 if debug then
contrebasse@41 220 DEFAULT_CHAT_FRAME:AddMessage(event)
contrebasse@41 221 if arg1 then DEFAULT_CHAT_FRAME:AddMessage("arg1 = "..arg1) end
contrebasse@41 222 if arg2 then DEFAULT_CHAT_FRAME:AddMessage("arg2 = "..arg2) end
contrebasse@41 223 end
contrebasse@5 224 --@end-debug@
contrebasse@5 225
contrebasse@28 226 --[[ IsMounted() renvoie toujours false ici, on doit passer par OnUpdate
contrebasse@28 227 if event=="UNIT_AURA" then
contrebasse@28 228 if arg1=="player" then
contrebasse@28 229 DEFAULT_CHAT_FRAME:AddMessage("player")
contrebasse@28 230 if IsMounted() then
contrebasse@28 231 DEFAULT_CHAT_FRAME:AddMessage("ismounted")
contrebasse@28 232 wasMounted = true
contrebasse@28 233 else
contrebasse@28 234 DEFAULT_CHAT_FRAME:AddMessage("notmounted")
contrebasse@28 235 if wasMounted then
contrebasse@28 236 DEFAULT_CHAT_FRAME:AddMessage("wasmounted : start")
contrebasse@28 237 wasMounted = false
contrebasse@28 238 start()
contrebasse@28 239 end
contrebasse@28 240 end
contrebasse@28 241 end
contrebasse@28 242 else
contrebasse@28 243 --]]
contrebasse@12 244 if events[event] then
contrebasse@12 245 if type(events[event])~="function" or events[event]() then
contrebasse@12 246 start()
contrebasse@12 247 end
contrebasse@12 248 elseif events1player[event] then
contrebasse@12 249 if arg1=="player" then
contrebasse@33 250 if event == "UNIT_SPELLCAST_START" then
contrebasse@33 251 --name, nameSubtext, text, texture, startTime, endTime, isTradeSkill, castID, notInterruptible = UnitCastingInfo("unit")
contrebasse@33 252 isTradeSkill = select(7,UnitCastingInfo("player"))
contrebasse@33 253 --DEFAULT_CHAT_FRAME:AddMessage(name)
contrebasse@33 254 --DEFAULT_CHAT_FRAME:AddMessage(isTradeSkill and "True" or "False")
contrebasse@33 255 --if isTradeSkill then
contrebasse@33 256
contrebasse@33 257 --end
contrebasse@44 258 --elseif arg5 and not T.SpellBlackList[arg5] then -- arg5 is SpellID
contrebasse@44 259 elseif (arg5 and T.SpellWhiteList[arg5]) or isTradeSkill then -- arg5 is SpellID
contrebasse@33 260 isTradeSkill = false -- for next time
contrebasse@44 261 start(type(T.SpellWhiteList[arg5])=="number" and T.SpellWhiteList[arg5] or delay_short)
contrebasse@12 262 end
contrebasse@12 263 end
contrebasse@12 264 elseif events2playername[event] then
contrebasse@35 265 if arg2==playername and (type(events2playername[event])~="function" or events2playername[event]()) then
contrebasse@12 266 start()
contrebasse@12 267 end
contrebasse@14 268 elseif event == "GOSSIP_CLOSED" then
contrebasse@14 269 wasGossipOpened = not isGossipClosed
contrebasse@14 270 isGossipClosed = true
contrebasse@14 271 t_lastGossipClosed = GetTime()
contrebasse@5 272
contrebasse@0 273 elseif event == "PLAYER_REGEN_ENABLED" then
contrebasse@21 274 for k,_ in pairs(events1player) do DegaineFrame:UnregisterEvent(k) end
contrebasse@21 275 --desactivate()
contrebasse@0 276 elseif event == "PLAYER_REGEN_DISABLED" then
contrebasse@22 277 for k,_ in pairs(events1player) do DegaineFrame:RegisterEvent(k) end
contrebasse@22 278 --activate()
contrebasse@5 279
contrebasse@0 280 elseif event == "ADDON_LOADED" and arg1==AddonName then
contrebasse@5 281 if Degaine_isAuto==nil then
contrebasse@5 282 Degaine_isAuto = true
contrebasse@0 283 end
contrebasse@11 284 if Degaine_isAuto then activate() else desactivate() end
contrebasse@5 285 printState()
contrebasse@5 286
contrebasse@5 287 -- Not needed anymore
contrebasse@5 288 DegaineFrame:UnregisterEvent("ADDON_LOADED")
contrebasse@31 289
contrebasse@31 290 elseif event == "PLAYER_LOGIN" then
contrebasse@44 291 -- BLacklis alomst all Companions and mounts
contrebasse@44 292 T.DoBlackListCrittersAndMount()
contrebasse@0 293 end
contrebasse@0 294 end
contrebasse@31 295
contrebasse@5 296 -- Hook when standing up
contrebasse@5 297 -- (Didn't work, see http://forums.wowace.com/showthread.php?p=310547#post310547)
contrebasse@8 298 hooksecurefunc("SitStandOrDescendStart",start);
contrebasse@0 299
contrebasse@0 300
contrebasse@6 301 ---------------------------------------------------------------
contrebasse@6 302 -- Commands
contrebasse@6 303 ---------------------------------------------------------------
contrebasse@6 304 -- Bindings
contrebasse@49 305 BINDING_HEADER_DEGAINE = T.L["BINDING_HEADER"]
contrebasse@49 306 BINDING_NAME_DEGAINE_TOGGLE = T.L["BINDING_NAME_DEGAINE_TOGGLE"]
contrebasse@6 307
contrebasse@6 308 -- Slash command
contrebasse@7 309 -- GLOBALS: SLASH_DEGAINE1
contrebasse@7 310 SLASH_DEGAINE1 = "/degaine"
contrebasse@6 311 SlashCmdList["DEGAINE"] = Degaine_ToggleAuto
contrebasse@6 312
contrebasse@5 313
contrebasse@5 314 ---------------------------------------------------------------
contrebasse@5 315 -- Initialization
contrebasse@5 316 ---------------------------------------------------------------
contrebasse@5 317 DegaineFrame:SetScript("OnEvent",Degaine_OnEvent)
contrebasse@5 318
contrebasse@5 319 -- Global events
contrebasse@14 320 DegaineFrame:RegisterEvent("GOSSIP_CLOSED")
contrebasse@5 321 DegaineFrame:RegisterEvent("PLAYER_REGEN_ENABLED")
contrebasse@5 322 DegaineFrame:RegisterEvent("PLAYER_REGEN_DISABLED")
contrebasse@5 323 DegaineFrame:RegisterEvent("ADDON_LOADED")
contrebasse@31 324 DegaineFrame:RegisterEvent("PLAYER_LOGIN")
contrebasse@5 325 activate()