⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ankhcooldowntimer.lua

📁 时间太紧了
💻 LUA
📖 第 1 页 / 共 2 页
字号:
--
--	AnkhCooldowTimer by Starforce (starforce@playmate.se)
--		
--	Gives shamans a timer for their reincarnation ability
--	
--	    Currently playing on Shattered Hands (EU)
--	Greets fly out to: Kroon, Imothep, Enochia, Evilution
--			   and everyone in the Aesir guild

--------------------------------------------------------------------------------------------------
-- GLOBALS
--------------------------------------------------------------------------------------------------

AnkhCT_Userdata = nil				-- persisted config data
AnkhCT_Config = nil				-- persisted character data
AnkhCT_TalentCooldown = 0
AnkhCT_PlayerName = nil
AnkhCT_CurrentServer = nil
AnkhCT_AddonEnabled = 1
AnkhCT_DebugLevel = 1
AnkhCT_TitanFound = 0
AnkhCT_TimerUpdate = nil
AnkhCT_ReincarnationTime = nil

AnkhCT_TESTINTERVAL = 5
AnkhCT_TIMERINTERVAL = 0.30
AnkhCT_VERSION = "1.2"
AnkhCT_TITANID = "AnkhCT"
AnkhCT_LOADED = 0



--------------------------------------------------------------------------------------------------
-- LOAD and INIT functions
--------------------------------------------------------------------------------------------------
function AnkhCT_OnLoad()
		
	if (AnkhCT_LOADED == 1) then
		return
	end
		
	AnkhCT_RegEvents()
	
	SlashCmdList["AnkhCTCOMMAND"] = AnkhCT_ChatCommandHandler
	SLASH_AnkhCTCOMMAND1 = "/act"
	SLASH_AnkhCTCOMMAND2 = "/AnkhCT"

	-- make sure we have the Print() function in case cosmos isn't installed
	if (not Print) then
		setglobal("Print", function(msg, r, g, b, frame, id)
			if (not r) then r = 1.0 end
			if (not g) then g = 1.0 end
			if (not b) then b = 1.0 end
			if (not frame) then frame = DEFAULT_CHAT_FRAME end
			if (frame) then
				if (not id) then
					frame:AddMessage(msg,r,g,b)
				else
					frame:AddMessage(msg,r,g,b,id)
				end
			end
		end)
	end
	
	if( DEFAULT_CHAT_FRAME ) then
		--DEFAULT_CHAT_FRAME:AddMessage("AnkhCooldowTimer v" .. AnkhCT_VERSION .. " by Starforce 已载入! ");
	end
	--UIErrorsFrame:AddMessage("AnkhCooldowTimer v" .. AnkhCT_VERSION .. " by Starforce 已载入! ", 1.0, 1.0, 1.0, 1.0, UIERRORS_HOLD_TIME);
	
	AnkhCT_LOADED = 1
end


--------------------------------------------------------------------------------------------------
-- CHECK COOLDOWN TIME FOR REINCARNATE TALANT
--------------------------------------------------------------------------------------------------

function AnkhCT_UpdateTalentCooldown()

	-- scan for talent points in Restoration --> Improved Self-Reincarnation

	local talentPoints = 0;
	
	for talent = 1, GetNumTalentTabs(), 1 do
		for talentIdx  = 1, GetNumTalents(talent), 1 do
			nameTalent, icon, iconx, icony, currRank, maxRank = GetTalentInfo(talent, talentIdx);
			
			if (nameTalent) then
				if (nameTalent == IMPROVED_REINC) then
					talentPoints = currRank					
				end
			end
		end
	end
	
	AnkhCT_TalentCooldown = 3600 - (600 * talentPoints)
end



--------------------------------------------------------------------------------------------------
-- REGISTER/UNREGISTER EVENTS
--------------------------------------------------------------------------------------------------

function AnkhCT_RegEvents()
	this:RegisterEvent("VARIABLES_LOADED");
	this:RegisterEvent("ON_UPDATE")
	this:RegisterEvent("ON_EVENT")
    
    -- events for PLAYERNAME
	this:RegisterEvent("PLAYER_ENTERING_WORLD");
	this:RegisterEvent("UNIT_NAME_UPDATE");
	
    -- hook events for ANKH change/detection    
	this:RegisterEvent("BAG_UPDATE");
	this:RegisterEvent("UNIT_INVENTORY_CHANGED");

    -- ADD EVENTS FOR TALENT CHANGE 
	this:RegisterEvent("SPELLS_CHANGED");
	this:RegisterEvent("LEARNED_SPELL_IN_TAB");
    
    -- EVENTS FOR DEAD/ALIVE.
    	this:RegisterEvent("PLAYER_ALIVE");
	this:RegisterEvent("PLAYER_DEAD");
end

function AnkhCT_UnRegEvents()
	this:UnregisterEvent("VARIABLES_LOADED");
	this:UnregisterEvent("ON_UPDATE")
	this:UnregisterEvent("ON_EVENT")
    
    -- events for NAME
	this:UnregisterEvent("PLAYER_ENTERING_WORLD");
	this:UnregisterEvent("UNIT_NAME_UPDATE");
				
    -- hook events for ANKH change/detection    
	this:UnregisterEvent("BAG_UPDATE");
	this:UnregisterEvent("UNIT_INVENTORY_CHANGED");

    -- ADD EVENTS FOR TALENT CHANGE 
	this:UnregisterEvent("SPELLS_CHANGED");
	this:UnregisterEvent("LEARNED_SPELL_IN_TAB");
    
    -- EVENTS FOR DEAD/ALIVE. Is this all of em?
	this:UnregisterEvent("PLAYER_ALIVE");
	this:UnregisterEvent("PLAYER_DEAD");
end


--------------------------------------------------------------------------------------------------
-- INITIALIZE VARIABLES
--------------------------------------------------------------------------------------------------

function AnkhCT_InitializeVariables()


	AnkhCT_CurrentServer = GetCVar("realmName")
	AnkhCT_PlayerName = UnitName("player")

	if (not AnkhCT_CurrentServer) then
		return
	elseif (not AnkhCT_PlayerName) then
		return
	elseif (AnkhCT_PlayerName == "未知目标") then
		AnkhCT_PlayerName = nil
		return
	end
	
	-- Config vars (persistent)
	if (not AnkhCT_Config) then
		AnkhCT_Config = {}
	end
	if (not AnkhCT_Config.Enabled) then
		AnkhCT_Config.Enabled = 1
	end
	if (not AnkhCT_Config.Debug) then
		AnkhCT_Config.Debug = 1
	end
	
	-- Userdata vars (persistent)		
	if (not AnkhCT_Userdata) then
		AnkhCT_Userdata = {}
	end
	
	-- PER SERVER DATA
	if (not AnkhCT_Userdata[AnkhCT_CurrentServer]) then
		AnkhCT_Userdata[AnkhCT_CurrentServer] = {}
	end
	
	-- PER CHAR DATA
	if (not AnkhCT_Userdata[AnkhCT_CurrentServer][AnkhCT_PlayerName]) then
		AnkhCT_Userdata[AnkhCT_CurrentServer][AnkhCT_PlayerName] = {}
	end
	
	-- check and init the values
	if (not AnkhCT_Userdata[AnkhCT_CurrentServer][AnkhCT_PlayerName].LastUsed) then
		AnkhCT_SetLastUsed(0)
	end
	if (not AnkhCT_Userdata[AnkhCT_CurrentServer][AnkhCT_PlayerName].Enabled) then
		AnkhCT_Userdata[AnkhCT_CurrentServer][AnkhCT_PlayerName].Enabled = 1
	end
	if (not AnkhCT_Userdata[AnkhCT_CurrentServer][AnkhCT_PlayerName].Gui) then
		AnkhCT_Userdata[AnkhCT_CurrentServer][AnkhCT_PlayerName].Gui = 1
	end	
	if (not AnkhCT_Userdata[AnkhCT_CurrentServer][AnkhCT_PlayerName].Ankhs) then
		AnkhCT_Userdata[AnkhCT_CurrentServer][AnkhCT_PlayerName].Ankhs = 0
	end
	if (not AnkhCT_Userdata[AnkhCT_CurrentServer][AnkhCT_PlayerName].Alive) then
		AnkhCT_Userdata[AnkhCT_CurrentServer][AnkhCT_PlayerName].Alive = 1
	end
	
	-- get alive/dead status
	AnkhCT_Userdata[AnkhCT_CurrentServer][AnkhCT_PlayerName].Alive = AnkhCT_IsAlive()

	-- Make sure this is a shaman playing, otherwise disable the addon
	if (UnitClass("player") ~= CLASSNAME_SHAMAN) then
		AnkhCT_Userdata[AnkhCT_CurrentServer][AnkhCT_PlayerName].Enabled = 0
		AnkhCT_Frame:Hide()
		AnkhCT_UnRegEvents()
		return
	end

	-- get num ankhs
	AnkhCT_UpdateAnkhs()

	-- update max cooldown time		
	AnkhCT_UpdateTalentCooldown()
end


--------------------------------------------------------------------------------------------------
-- COUNT THE NUMBER OF ANHKS IN THE PLAYRS BAGS
--------------------------------------------------------------------------------------------------


function AnkhCT_GetAnkhs()

	local ankhs = 0
	for bag = 4, 0, -1 do
		
		local size = GetContainerNumSlots(bag);
		
		if (size > 0) then
			for slot=1, size, 1 do
				local texture, itemCount = GetContainerItemInfo(bag, slot);
				
				if (itemCount) then
					local itemName = AnkhCT_NameFromLink(GetContainerItemLink(bag, slot));
                    			
                    			-- if the item has a name
					if  ((itemName) and (itemName ~= "")) then
						
						-- if the item is an ankh, increase the count
						if (itemName == ANKHNAME) then
							ankhs  = ankhs + itemCount;
						end
					end
				end
			end            
		end
	end	
	
	return ankhs
end

function AnkhCT_UpdateAnkhs()
	AnkhCT_Userdata[AnkhCT_CurrentServer][AnkhCT_PlayerName].Ankhs = AnkhCT_GetAnkhs()
end


function AnkhCT_NameFromLink(link)
	local name
	if (link) then
		for name in string.gfind(link, "|c%x+|Hitem:%d+:%d+:%d+:%d+|h%[(.-)%]|h|r") do
			return name
		end
	end
end 



--------------------------------------------------------------------------------------------------
-- Function that handles various events
--------------------------------------------------------------------------------------------------

function AnkhCT_OnEvent(event)	
	local eventTime = GetTime()
	local myEvent = event

	
	if (AnkhCT_AddonEnabled == 1) then
	
		-- If this is the first event (that is when the cooldown is 0) initialize variables
		if (event == "VARIABLES_LOADED") then
			AnkhCT_Frame:SetBackdropColor(0, 0.1, 0.9, 0.25);
			AnkhCT_Frame:SetBackdropBorderColor(1, 1, 1, 0.5);
			
			
			if (AnkhCT_TalentCooldown == 0) then
				AnkhCT_InitializeVariables()
			end
			return
		end

		if (AnkhCT_TalentCooldown ~= 0) then
		
			-- if an event occurs that would affect the number of ankhs
			if (event == "BAG_UPDATE" or event == "PLAYER_ENTERING_WORLD") then			
				
				-- Check for reincarnation
				AnkhCT_ReincTest(eventTime)	
				
				return
			end
			
			if (myEvent == "UNIT_INVENTORY_CHANGED") then
				if (arg1 == "player") then
					-- Check for reincarnation
					AnkhCT_ReincTest(eventTime)
				end
				return
			end
			
			if (myEvent == "PLAYER_ALIVE") then
				ConsoleMsg("PLAYER_ALIVE", 2)
				AnkhCT_IsAlive(eventTime)
				return
			end
			
			if (myEvent == "PLAYER_DEAD") then
				ConsoleMsg("PLAYER_DEAD", 2)
				AnkhCT_Userdata[AnkhCT_CurrentServer][AnkhCT_PlayerName].Alive = 0
				return
			end	
			
			-- if we learned new spells (or talents), update the rez capability
			if (myEvent == "LEARNED_SPELL_IN_TAB" or myEvent == "SPELLS_CHANGED") then
				AnkhCT_UpdateTalentCooldown()
				return
			end
		end
    end    
end


--------------------------------------------------------------------------------------------------
-- Function that answers update calls from the game
--------------------------------------------------------------------------------------------------

function AnkhCT_OnUpdate(arg1)

	-- Make sure the script doesn't start counting anything before 
	-- All variables have initialized.. PlayerName is always the last
	-- to initialize...
	if (not AnkhCT_PlayerName) then
		AnkhCT_InitializeVariables()
		
		return
	end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -