📄 ankhcooldowntimer.lua
字号:
--
-- 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 + -