view Degaine.lua @ 0:97422a3e11c9

Initial commit, woot !
author contrebasse
date Wed, 08 Dec 2010 21:29:27 +0100
parents
children 66640a8f1cbd
line wrap: on
line source
local AddonName = ...
-- Dégaine auto des armes

-- BUGS connus :
-- le camouflage du voleur ne rentre pas l'arme 
-- 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;

-- Fonctions globales en local
-- GLOBALS: ToggleAutoDegaine, isDegaineAuto, BINDING_HEADER_DEGAINE
local GossipFrame = GossipFrame;
local DEFAULT_CHAT_FRAME = DEFAULT_CHAT_FRAME;
local InCombatLockdown = InCombatLockdown;
local ToggleSheath = ToggleSheath;

local pairs = pairs;
local type = type;

-- Pour les raccourcis
-- Cf Bindings.xml pour les raccourcis eux-mêmes
BINDING_HEADER_DEGAINE = "Dégainer automatiquement";

-- Variables locales
local DegaineFrame = CreateFrame("Frame");
local playername = UnitName("player");
local done = true;
local t_restant = -1;

-- Configuration des events à regarder
local events = { -- events sans arguments à voir
	GOSSIP_SHOW = true,
	MERCHANT_SHOW = function() return GossipFrame:IsShown(); end,
	BANKFRAME_OPENED = true; --function() return GossipFrame:IsShown(); end,
	AUCTION_HOUSE_SHOW = true,
};
local events1player = { -- events dont le 1er argument doit être le joueur
	UNIT_SPELLCAST_FAILED = true;
	UNIT_SPELLCAST_INTERRUPTED = true;
	UNIT_SPELLCAST_SUCCEEDED = true;
};
local events2playername = { -- events dont le 2e argument doit être le joueur
	CHAT_MSG_SAY = true;
	CHAT_MSG_YELL = true;
	CHAT_MSG_TEXT_EMOTE = true;
};

-- Fonctions d'activation/désactivation des events
local registerEvents = function()
	--if debug then
		-- DEBUG
	--	DegaineFrame:RegisterAllEvents();
	--else
		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
end -- function
local unregisterEvents = function()
	if not debug then
		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
	end
end -- function

-- Fonction de timer
-- On attend un petit délai avant de dégainer, pour voir l'animation et éviter que ça bug
local OnUpdate = function(self,t_ecoule)
	if not done then
		t_restant = t_restant - t_ecoule;
		if t_restant<=0 then
			done = true;
			ToggleSheath();
		end
	end
end

-- Fonctions d'activation/désactivation
local activer = function()
	if (not isDegaineAuto) or InCombatLockdown() then return end
	
	DegaineFrame:SetScript("OnUpdate", OnUpdate);
	registerEvents();
end
local desactiver = function()
	-- Désactivation
	unregisterEvents();
	DegaineFrame:SetScript("OnUpdate", nil);
	done = true;
end

-- Fonctions
local printState = function()
	DEFAULT_CHAT_FRAME:AddMessage(isDegaineAuto and "Dégainage automatique |cFF00FF00activé|r" or "Dégainage automatique |cFFFF0000désactivé|r");
end
local OnEvent = function(self,event, arg1, arg2, ...)	
	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
	
	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_restant = 2;
		done = false;
	elseif event == "PLAYER_REGEN_ENABLED" then
		desactiver();
	elseif event == "PLAYER_REGEN_DISABLED" then
		activer();
	elseif event == "ADDON_LOADED" and arg1==AddonName then
		if isDegaineAuto==nil then
			isDegaineAuto = true;
		end
		if isDegaineAuto then
			activer();
		else
			desactiver();
		end
		printState();
	end
end

-- Pour mettre le dégainage auto on/off TODO
ToggleAutoDegaine = function()
	if isDegaineAuto then
		isDegaineAuto = false;
		desactiver();
	else
		isDegaineAuto = true;
		activer();
	end
	printState();
end

-- Enregistrement des events et activation
DegaineFrame:RegisterEvent("PLAYER_REGEN_ENABLED");
DegaineFrame:RegisterEvent("PLAYER_REGEN_DISABLED");
DegaineFrame:RegisterEvent("ADDON_LOADED");
DegaineFrame:SetScript("OnEvent",OnEvent);
-- ça ne marche pas... question posée sur http://forums.wowace.com/showthread.php?p=310547#post310547
hooksecurefunc("SitStandOrDescendStart",function() if isDegaineAuto and not InCombatLockdown() then t_restant = 2; done = false; end; end);
activer();