view 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
line wrap: on
line source
local AddonName = ...
-- Draw your weapons automagically


---------------------------------------------------------------
-- Known bugs
---------------------------------------------------------------
-- If you stand up by jumping or walking it won't draw your weapon
--     (it's not possible to know if you were sitting or standing before)

--@debug@
local debug = false
--@end-debug@


---------------------------------------------------------------
-- Globals to local
---------------------------------------------------------------
-- These need to be globals
-- GLOBALS: Degaine_ToggleAuto, Degaine_isAuto, BINDING_HEADER_DEGAINE

-- It doesn't matter if they are globals
-- GLOBALS: DEFAULT_CHAT_FRAME

-- Lua functions
local pairs = pairs;
local type = type;

-- Wow functions
local GetTime = GetTime
local InCombatLockdown = InCombatLockdown
local ToggleSheath = ToggleSheath
local UnitName = UnitName


---------------------------------------------------------------
-- Local vars
---------------------------------------------------------------
-- const
local DegaineFrame = CreateFrame("Frame")
local playername = UnitName("player")

-- vars
local t_left = -1
local delay = 2 -- seconds
local isGossipClosed = true
local wasGossipOpened = false
local t_lastGossipClosed = 0


---------------------------------------------------------------
-- Some stuff...
---------------------------------------------------------------
-- Bindings
BINDING_HEADER_DEGAINE = "Dégainer automatiquement"

-- Print status
local printState = function()
	DEFAULT_CHAT_FRAME:AddMessage(Degaine_isAuto and "Dégainage automatique |cFF00FF00activé|r" or "Dégainage automatique |cFFFF0000désactivé|r")
end


---------------------------------------------------------------
-- Events config
---------------------------------------------------------------
-- Events to watch
local events = { -- no args to watch
	GOSSIP_SHOW = function()
		-- isGossipClosed :
		-- if the gossip is already opened, no need to draw weapon
		-- UnitName("npc")==UnitName("target") :
		-- hack gossips again because there's no emote with non npc
		-- you have to target the npc to interact with it
		-- things such as boards can't be targeted and start no emote
		local returnvalue = isGossipClosed and UnitName("npc")==UnitName("target")
		isGossipClosed = false
		return returnvalue
	end,
	MERCHANT_SHOW = function()
		-- hack for the cases where the merchant's frame is opened from a gossip frame :
		--  the gossip is closed and the merchant opened but the weapon is not stealthed
		if (GetTime() - t_lastGossipClosed) < 0.5 then
			return not wasGossipOpened
		else
			return isGossipClosed
		end
	end,
	BANKFRAME_OPENED = true, --function() return GossipFrame:IsShown() end,
	AUCTION_HOUSE_SHOW = true,
}
local events1player = { -- the first arg is "player"
	UNIT_SPELLCAST_FAILED = true,
	UNIT_SPELLCAST_INTERRUPTED = true,
	UNIT_SPELLCAST_SUCCEEDED = true,
}
local SpellBlackList = { -- spells that don't stealth weapons (works with events1player)
	[1784] = true,  -- Stealth (Rogue)
	[58984] = true, -- Shadowmeld (Nightelf stealth)

	-- Tradeskill spells
	[2259] = true,  -- Alchemy
	[45357] = true, -- Inscription
	[3908] = true,  -- Tailoring
	[7411] = true,  -- Enchanting
	[2018] = true,  -- Blacksmithing
	[4036] = true,  -- Engineering
	[25229] = true, -- Jewelcrafting
	[2656] = true,  -- Smelting
	[2108] = true,  -- Leatherworking
	[2550] = true,  -- Cooking
	[3273] = true,  -- First Aid
	[53428] = true  -- Runeforge
	-- Archaeology ?
}
local events2playername = { -- the 2nd arg is playername
	CHAT_MSG_SAY = true,
	CHAT_MSG_YELL = true,
	CHAT_MSG_TEXT_EMOTE = true,
}


---------------------------------------------------------------
-- Launch drawing weapons
---------------------------------------------------------------
-- Wait a few seconds before drawing, to be able to see the curren animation (and avoid bugs)
local Degaine_OnUpdate = function(self,t_elapsed)
	t_left = t_left - t_elapsed;
	if t_left<=0 then
		ToggleSheath()
		DegaineFrame:SetScript("OnUpdate", nil)
	end
end
local start = function()
	if Degaine_isAuto and not InCombatLockdown() then
		t_left = delay
		DegaineFrame:SetScript("OnUpdate", Degaine_OnUpdate)
	end
end


---------------------------------------------------------------
-- Activation functions
---------------------------------------------------------------
local activate = function()
	if (not Degaine_isAuto) or InCombatLockdown() then return end

	--DegaineFrame:SetScript("OnUpdate", Degaine_OnUpdate);
	--@debug@
	if debug then
		DegaineFrame:RegisterAllEvents()
	else
	--@end-debug@
		for k,_ in pairs(events) do DegaineFrame:RegisterEvent(k) end
		for k,_ in pairs(events1player) do DegaineFrame:RegisterEvent(k) end
		for k,_ in pairs(events2playername) do DegaineFrame:RegisterEvent(k) end
	--@end-debug@
	end
	--@end-debug@
end
local desactivate = function()
	for k,_ in pairs(events) do DegaineFrame:UnregisterEvent(k) end
	for k,_ in pairs(events1player) do DegaineFrame:UnregisterEvent(k) end
	for k,_ in pairs(events2playername) do DegaineFrame:UnregisterEvent(k) end
	DegaineFrame:SetScript("OnUpdate", nil)
end
Degaine_ToggleAuto = function()
	if Degaine_isAuto then
		Degaine_isAuto = false
		desactivate()
	else
		Degaine_isAuto = true
		activate()
	end
	printState()
end


---------------------------------------------------------------
-- Event/hooks functions
---------------------------------------------------------------
local Degaine_OnEvent = function(self,event, arg1, arg2, _, _, arg5, ...)
	--@debug@
	--if debug then
		DEFAULT_CHAT_FRAME:AddMessage(event)
		--if arg1 then DEFAULT_CHAT_FRAME:AddMessage("arg1 = "..arg1) end
		--if arg2 then DEFAULT_CHAT_FRAME:AddMessage("arg2 = "..arg2) end
	--end
	--@end-debug@

	if events[event] then
		if type(events[event])~="function" or events[event]() then
			start()
		end
	elseif events1player[event] then
		if arg1=="player" then
			if not SpellBlackList[arg5] then -- arg5 is SpellID
				start()
			end
		end
	elseif events2playername[event] then
		if arg2==playername then
			start()
		end
	elseif event == "GOSSIP_CLOSED" then
		wasGossipOpened = not isGossipClosed
		isGossipClosed = true
		t_lastGossipClosed = GetTime()

	elseif event == "PLAYER_REGEN_ENABLED" then
		desactivate()
	elseif event == "PLAYER_REGEN_DISABLED" then
		activate()

	elseif event == "ADDON_LOADED" and arg1==AddonName then
		if Degaine_isAuto==nil then
			Degaine_isAuto = true
		end
		if Degaine_isAuto then activate() else desactivate() end
		printState()

		-- Not needed anymore
		DegaineFrame:UnregisterEvent("ADDON_LOADED")
	end
end
-- Hook when standing up
-- (Didn't work, see http://forums.wowace.com/showthread.php?p=310547#post310547)
hooksecurefunc("SitStandOrDescendStart",start);


---------------------------------------------------------------
-- Commands
---------------------------------------------------------------
-- Bindings
BINDING_HEADER_DEGAINE = "Dégainer automatiquement"

-- Slash command
-- GLOBALS: SLASH_DEGAINE1
SLASH_DEGAINE1 = "/degaine"
SlashCmdList["DEGAINE"] = Degaine_ToggleAuto


---------------------------------------------------------------
-- Initialization
---------------------------------------------------------------
DegaineFrame:SetScript("OnEvent",Degaine_OnEvent)

-- Global events
DegaineFrame:RegisterEvent("GOSSIP_CLOSED")
DegaineFrame:RegisterEvent("PLAYER_REGEN_ENABLED")
DegaineFrame:RegisterEvent("PLAYER_REGEN_DISABLED")
DegaineFrame:RegisterEvent("ADDON_LOADED")
activate()