view Degaine.lua @ 5:66640a8f1cbd

Started reworking code ordering in files, comments and vars are in english
author contrebasse
date Fri, 10 Dec 2010 16:04:55 +0100
parents 97422a3e11c9
children 120f29645e34
line wrap: on
line source
local AddonName = ...
-- Draw your weapons automagically

-- Known bugs :
-- si on se lève en sautant ça ne sort pas l'arme (impossible de savoir si on était assis avant)

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

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

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

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

-- Wow functions
local InCombatLockdown = InCombatLockdown
local ToggleSheath = ToggleSheath


---------------------------------------------------------------
-- 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


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

-- vars
local done = true
local t_left = -1

---------------------------------------------------------------
-- Events config
---------------------------------------------------------------
-- Events to watch
local events = { -- no args to watch
	GOSSIP_SHOW = true,
	MERCHANT_SHOW = function() return GossipFrame:IsShown(); end,
	BANKFRAME_OPENED = true, --function() return GossipFrame:IsShown(); end,
	AUCTION_HOUSE_SHOW = true,
}
local SpellBlacklist = {
	[1784] = true,  -- Stealth (Rogue)
	[58984] = true, -- Shadowmeld (Nightelf stealth)
}
local events1player = { -- the first arg is "player"
	UNIT_SPELLCAST_FAILED = true,
	UNIT_SPELLCAST_INTERRUPTED = true,
	UNIT_SPELLCAST_SUCCEEDED = true,
}
local events2playername = { -- the 2nd arg is playername
	CHAT_MSG_SAY = true,
	CHAT_MSG_YELL = true,
	CHAT_MSG_TEXT_EMOTE = true,
}


---------------------------------------------------------------
-- Events registering
---------------------------------------------------------------


---------------------------------------------------------------
-- Timer
---------------------------------------------------------------
-- Wait a few seconds before drawing, to be able to see the curren animation (and avoid bugs)
local Degaine_OnUpdate = function(self,t_elapsed)
	if not done then
		t_left = t_left - t_elapsed;
		if t_left<=0 then
			done = true;
			ToggleSheath();
		end
	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,v in pairs(events) do DegaineFrame:RegisterEvent(k); end
		for k,v in pairs(events1player) do DegaineFrame:RegisterEvent(k); end
		for k,v in pairs(events2playername) do DegaineFrame:RegisterEvent(k); end
	--@end-debug@
	end
	--@end-debug@
end
local desactivate = function()
	for k,v in pairs(events) do DegaineFrame:UnregisterEvent(k); end
	for k,v in pairs(events1player) do DegaineFrame:UnregisterEvent(k); end
	for k,v in pairs(events2playername) do DegaineFrame:UnregisterEvent(k); end
	DegaineFrame:SetScript("OnUpdate", nil);
	done = true;
end
ToggleAutoDegaine = 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, ...)
	--@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] and (type(events[event])~="function" or events[event]()))
			or (events1player[event] and arg1=="player")
			or (events2playername[event] and arg2==playername)) then
		t_left = 2
		done = false

	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",function()
	if Degaine_isAuto and not InCombatLockdown() then
		t_left = 2
		done = false
	end
end)



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

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