-- Lets you set timers with labels, especially useful for MC mob respawn timing
-- 5/10/05
-- I ripped my code from RaidMeter and IBRezTimer. Please don't hurt me.
----------------------------------------------------------------------------------------------------------------------
--- ON LOAD
----------------------------------------------------------------------------------------------------------------------
local ProTimers_out;
local ProTimers_elapsed = 0;
local ProTimers_CORE_HOUNDS_COLLAPSED = 0;
local ProTimers_CORE_HOUNDS_COLLAPSED_TIME = 0;
function ProTimers_initialize()
SlashCmdList["PTIM"] = ProTimers_SlashHandler;
SLASH_PTIM1 = "/pt";
SLASH_PTIM2 = "/protimers";
this:RegisterEvent("ON_UPDATE");
this:RegisterEvent("VARIABLES_LOADED");
this:RegisterEvent("CHAT_MSG_COMBAT_HOSTILE_DEATH");
this:RegisterEvent("CHAT_MSG_MONSTER_EMOTE");
-- 5 minute moving average by default
ProTimers_window = 300;
ProTimersFrame:Show();
end
-----------------------------------------------------------------------------------------------------------------------
--- CHAT FUNCTIONS
-----------------------------------------------------------------------------------------------------------------------
function ProTimers_SlashHandler(word)
local msg = word;
local _, _, command, args = string.find(msg, "(%w*)%s*(.*)");
command = string.lower(command);
--DEFAULT_CHAT_FRAME:AddMessage("command: " .. command .. " args: " .. args);
if((command == "set") or (command == "time")) then
local _, _, arg1, arg2, arg3 = string.find(args, "(%d*):?(%d*)%s*(.*)");
if((arg2 == "") or (arg2 == nil))then
arg2 = "0";
end
if((arg1 == "") or (arg1 == nil)) then
DEFAULT_CHAT_FRAME:AddMessage("|cff00ff00ProTimers: |cffffffffInvalid argument")
else
local time = tonumber(arg1)*60 + tonumber(arg2);
ProTimers_AddTimer(arg3, time, 0);
end
elseif((command == "bg") or (command == "background")) then
ProTimers_BG(args);
elseif(command == "clear") then
ProTimers_clear(args);
elseif(command == "print") then
ProTimers_print(args);
elseif(command == "alert") then
ProTimers_alert(args);
elseif(command == "announce") then
ProTimers_announce(args);
elseif(command == "preannounce") then
ProTimers_preannounce(args);
elseif(command == "mob") then
ProTimers_mob(args);
elseif(command == "hook") then
ProTimers_hook(args);
elseif(command == "repeat") then
local _, _, arg1, arg2, arg3 = string.find(args, "(%d*):?(%d*)%s*(.*)");
if((arg2 == "") or (arg2 == nil))then
arg2 = "0";
end
if((arg1 == "") or (arg1 == nil)) then
DEFAULT_CHAT_FRAME:AddMessage("|cff00ff00ProTimers: |cffffffffInvalid argument")
else
local time = tonumber(arg1)*60 + tonumber(arg2);
ProTimers_AddTimer(arg3, time, time);
end
else
DEFAULT_CHAT_FRAME:AddMessage("|cff00ff00ProTimers Commands:");
DEFAULT_CHAT_FRAME:AddMessage(" |cffffffffset ................ |cff00ff00sets a timer");
DEFAULT_CHAT_FRAME:AddMessage(" |cffffffffset ................ |cff00ff00sets a repeating timer");
DEFAULT_CHAT_FRAME:AddMessage(" |cffffffffmob .............. |cff00ff00sets a timer based on mobname");
DEFAULT_CHAT_FRAME:AddMessage(" |cffffffffbg ................. |cff00ff00toggles the frame background");
DEFAULT_CHAT_FRAME:AddMessage(" |cffffffffalert .............. |cff00ff00toggles expired timers announced to you");
DEFAULT_CHAT_FRAME:AddMessage(" |cffffffffannounce ...... |cff00ff00toggles nearly expired timers announced to raid");
DEFAULT_CHAT_FRAME:AddMessage(" |cffffffffpreannounce .... |cff00ff00toggles expired timers announced to raid");
DEFAULT_CHAT_FRAME:AddMessage(" |cffffffffhook ............. |cff00ff00allows you to hook mobdeaths to start timers");
DEFAULT_CHAT_FRAME:AddMessage(" |cffffffffprint .............. |cff00ff00prints your timers");
end
end
function ProTimers_clear(args)
args = string.lower(args);
if((args == "") or (args =="all")) then
ProTimers_names = {"nil", "nil", "nil", "nil", "nil", "nil", "nil", "nil", "nil"};
ProTimers_times = {-50, -50, -50, -50, -50, -50, -50, -50, -50, -50};
ProTimers_bank = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
ProTimers_repeat = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
else
local slot = tonumber(args);
ProTimers_bank[slot] = -1;
end
end
function ProTimers_print(args)
local r;
if (GetNumRaidMembers()>0) then
r = "raid";
elseif(GetNumPartyMembers()>0) then
r = "party";
else
r = "yell";
end
args = string.lower(args);
if((args == "") or (args =="all")) then
for i=1, 10, 1 do
if ProTimers_bank[i] ~= -1 then
SendChatMessage("ProTimers: " .. ProTimers_names[i] .. " - " .. date("%M:%S", ProTimers_times[i]) .. " remaining", r);
end
end
else
local num = tonumber(args);
if ProTimers_bank[num] ~= -1 then
SendChatMessage("ProTimers: " .. ProTimers_names[num] .. " - " .. date("%M:%S", ProTimers_times[num]) .. " remaining", r);
end
end
end
function ProTimers_BG(args)
if((args == "on") or (args == "show")) then
ProTimersFrame:SetBackdropColor(0, 0, 0, 1);
ProTimersFrame:SetBackdropBorderColor(1, 1, 1, 1);
ProTimers_CONFIG.bgvis = 1;
ProTimersFrame:EnableMouse(1);
elseif((args == "off") or (args == "hide")) then
ProTimersFrame:SetBackdropColor(0, 0, 0, 0);
ProTimersFrame:SetBackdropBorderColor(0, 0, 0, .0);
ProTimers_CONFIG.bgvis = 0;
ProTimersFrame:EnableMouse(nil);
else
if(ProTimers_CONFIG.bgvis == 0) then
ProTimersFrame:SetBackdropColor(0, 0, 0, 1);
ProTimersFrame:SetBackdropBorderColor(1, 1, 1, 1);
ProTimers_CONFIG.bgvis = 1;
ProTimersFrame:EnableMouse(1);
else
ProTimersFrame:SetBackdropColor(0, 0, 0, 0);
ProTimersFrame:SetBackdropBorderColor(0, 0, 0, .0);
ProTimers_CONFIG.bgvis = 0;
ProTimersFrame:EnableMouse(nil);
end
end
DEFAULT_CHAT_FRAME:AddMessage("|cff00ff00ProTimers: |cffffffffBackground status set to " .. ProTimers_CONFIG.bgvis)
end
function ProTimers_alert(args)
if((args == "on") or (args == "show")) then
ProTimers_CONFIG.alert = 1;
elseif((args == "off") or (args == "hide")) then
ProTimers_CONFIG.alert = 0;
else
if(ProTimers_CONFIG.alert == 0) then
ProTimers_CONFIG.alert = 1;
else
ProTimers_CONFIG.alert = 0;
end
end
DEFAULT_CHAT_FRAME:AddMessage("|cff00ff00ProTimers: |cffffffffAlert status set to " .. ProTimers_CONFIG.alert);
end
function ProTimers_announce(args)
if((args == "on") or (args == "show")) then
ProTimers_CONFIG.announce = 1;
elseif((args == "off") or (args == "hide")) then
ProTimers_CONFIG.announce = 0;
else
if(ProTimers_CONFIG.announce == 0) then
ProTimers_CONFIG.announce = 1;
else
ProTimers_CONFIG.announce = 0;
end
end
DEFAULT_CHAT_FRAME:AddMessage("|cff00ff00ProTimers: |cffffffffAnnounce status set to " .. ProTimers_CONFIG.announce);
end
function ProTimers_preannounce(args)
if((args == "on") or (args == "show")) then
ProTimers_CONFIG.preannounce = 1;
elseif((args == "off") or (args == "hide")) then
ProTimers_CONFIG.preannounce = 0;
else
if(ProTimers_CONFIG.preannounce == 0) then
ProTimers_CONFIG.preannounce = 1;
else
ProTimers_CONFIG.preannounce = 0;
end
end
DEFAULT_CHAT_FRAME:AddMessage("|cff00ff00ProTimers: |cffffffffPre-announce status set to " .. ProTimers_CONFIG.announce);
end
function ProTimers_mob(args)
if(not (args)) then
args = "";
end
args = string.lower(args);
if((args == "ach") or (args == "ancient core hound")) then
ProTimers_AddTimer("Ancient Core Hound", 18*60, 0);
elseif (args == "firelord") then
ProTimers_AddTimer("Firelord", 120*60, 0);
elseif (args == "lava annihilator") then
ProTimers_AddTimer("Lava Annihilator", 120*60, 0);
elseif (args == "lava surger") then
ProTimers_AddTimer("Lava Surger", 28*60, 0);
elseif (args == "imps") then
ProTimers_AddTimer("Imp Pack", 7*60, 0);
elseif ((args == "chp") or (args == "core hound pack")) then
ProTimers_AddTimer("Core Hound Pack", 60*60, 0);
elseif ((args == "lp") or (args == "lava pack")) then
ProTimers_AddTimer("Lava Pack", 120*60, 0);
end
end
function ProTimers_hook(args)
local _, _, arg1, arg2 = string.find(args, "(%w*)%s*(.*)");
local switch = 0;
if string.lower(arg1) == "on" then
switch = 1;
elseif string.lower(arg1) == "off" then
switch = -1;
else
if arg2 ~= nil and arg2 ~= "" then
arg2 = arg1 .. " " .. arg2;
else
arg2 = arg1;
end
end
arg2 = string.lower(arg2);
if((arg2 == "ach") or (arg2 == "ancient core hound")) then
if switch == 1 then
ProTimers_CONFIG.hooks["Ancient Core Hound"] = 1;
elseif switch == -1 then
ProTimers_CONFIG.hooks["Ancient Core Hound"] = 0;
else
if ProTimers_CONFIG.hooks["Ancient Core Hound"] == 0 then
ProTimers_CONFIG.hooks["Ancient Core Hound"] = 1;
else
ProTimers_CONFIG.hooks["Ancient Core Hound"] = 0;
end
end
DEFAULT_CHAT_FRAME:AddMessage("|cff00ff00ProTimers: |cffffffffHooks - Ancient Core Hound set to " .. ProTimers_CONFIG.hooks["Ancient Core Hound"]);
elseif (arg2 == "lava surger") then
if switch == 1 then
ProTimers_CONFIG.hooks["Lava Surger"] = 1;
elseif switch == -1 then
ProTimers_CONFIG.hooks["Lava Surger"] = 0;
else
if ProTimers_CONFIG.hooks["Lava Surger"] == 0 then
ProTimers_CONFIG.hooks["Lava Surger"] = 1;
else
ProTimers_CONFIG.hooks["Lava Surger"] = 0;
end
end
DEFAULT_CHAT_FRAME:AddMessage("|cff00ff00ProTimers: |cffffffffHooks - Lava Surger set to " .. ProTimers_CONFIG.hooks["Lava Surger"]);
elseif ((arg2 == "chp") or (arg2 == "core hound pack")) then
if switch == 1 then
ProTimers_CONFIG.hooks["Core Hound Pack"] = 1;
elseif switch == -1 then
ProTimers_CONFIG.hooks["Core Hound Pack"] = 0;
else
if ProTimers_CONFIG.hooks["Core Hound Pack"] == 0 then
ProTimers_CONFIG.hooks["Core Hound Pack"] = 1;
else
ProTimers_CONFIG.hooks["Core Hound Pack"] = 0;
end
end
DEFAULT_CHAT_FRAME:AddMessage("|cff00ff00ProTimers: |cffffffffHooks - Core Hound Pack set to " .. ProTimers_CONFIG.hooks["Core Hound Pack"]);
end
end
-----------------------------------------------------------------------------------------------------------------------
--- HELPERS
-----------------------------------------------------------------------------------------------------------------------
function ProTimers_AddTimer(name, time, rep)
local found = 0;
for i=1, 10, 1 do
if (ProTimers_bank[i] == -1) then
found = i;
break;
end
end
if (found == 0) then
DEFAULT_CHAT_FRAME:AddMessage("|cff00ff00ProTimers: |cffffffffToo many timers");
else
ProTimers_times[found] = time;
ProTimers_names[found] = name;
ProTimers_bank[found] = 1;
ProTimers_repeat[found] = rep;
end
end
function ProTimers_onalert(num)
if(ProTimers_CONFIG.alert == 1) then
UIErrorsFrame:AddMessage("ProTimers: " .. ProTimers_names[num] .. " expired", 1.0, .82, 0, 1.0, UIERRORS_HOLD_TIME);
end
end
function ProTimers_onprealert(num)
if(ProTimers_CONFIG.alert == 1) then
UIErrorsFrame:AddMessage("ProTimers: " .. ProTimers_names[num] .. " - 2:00 remaining", 1.0, .82, 0, 1.0, UIERRORS_HOLD_TIME);
end
end
function ProTimers_onannounce(num)
if(ProTimers_CONFIG.announce == 1) then
local r;
if (GetNumRaidMembers()>0) then
r = "raid";
elseif(GetNumPartyMembers()>0) then
r = "party";
else
r = "yell";
end
SendChatMessage("ProTimers: " .. ProTimers_names[num] .. " expired", r);
end
end
function ProTimers_onpreannounce(num)
if(ProTimers_CONFIG.preannounce == 1) then
local r;
if (GetNumRaidMembers()>0) then
r = "raid";
elseif(GetNumPartyMembers()>0) then
r = "party";
else
r = "yell";
end
SendChatMessage("ProTimers: " .. ProTimers_names[num] .. " - 2:00 remaining", r);
end
end
----------------------------------------------------------------------------------------------------------------------
--- ON EVENT
----------------------------------------------------------------------------------------------------------------------
function ProTimers_OnEvent(event)
if(event == "VARIABLES_LOADED") then
if(not (ProTimers_CONFIG)) then
ProTimers_CONFIG = {};
end
if(not (ProTimers_CONFIG.announce)) then
ProTimers_CONFIG.announce = 0;
end
if(not (ProTimers_CONFIG.preannounce)) then
ProTimers_CONFIG.preannounce = 0;
end
if(not (ProTimers_CONFIG.alert)) then
ProTimers_CONFIG.alert = 0;
end
if(not (ProTimers_CONFIG.bgvis)) then
ProTimers_CONFIG.bgvis = 1;
end
if (not (ProTimers_CONFIG.hooks)) then
ProTimers_CONFIG.hooks = {["Ancient Core Hound"] = 0, ["Lava Surger"] = 0, ["Core Hound Pack"] = 0};
end
if (not (ProTimers_names)) then
ProTimers_names = {"nil", "nil", "nil", "nil", "nil", "nil", "nil", "nil", "nil"};
end
if (not (ProTimers_times)) then
ProTimers_times = {-50, -50, -50, -50, -50, -50, -50, -50, -50, -50};
end
if (not (ProTimers_bank)) then
ProTimers_bank = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
end
if (not (ProTimers_repeat)) then
ProTimers_repeat = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
end
DEFAULT_CHAT_FRAME:AddMessage("|cff00ff00ProTimers loaded");
if(ProTimers_CONFIG.bgvis == 1) then
ProTimersFrame:SetBackdropColor(0, 0, 0, 1);
ProTimersFrame:SetBackdropBorderColor(1, 1, 1, 1);
else
ProTimersFrame:SetBackdropColor(0, 0, 0, 0);
ProTimersFrame:SetBackdropBorderColor(0, 0, 0, .0);
end
elseif (event == "CHAT_MSG_COMBAT_HOSTILE_DEATH") then
if string.find(arg1, "Ancient Core Hound") ~= nil and ProTimers_CONFIG.hooks["Ancient Core Hound"] == 1 then
ProTimers_AddTimer("Ancient Core Hound", 18*60, 0);
--elseif string.find(arg1, "Core Hound") ~= nil and ProTimers_CONFIG.hooks["Core Hound Pack"] == 1 then
-- local toshow = 1;
-- for i=1, 10, 1 do
-- if ProTimers_bank[i] ~= -1 and ProTimers_names[i] == "Core Hound Pack" and ProTimers_times[i] > 59*60 then
-- toshow = 0;
-- end
-- end
-- if toshow == 1 then
-- ProTimers_AddTimer("Core Hound Pack", 60*60, 0);
-- end
elseif string.find(arg1, "Lava Surger") ~= nil and ProTimers_CONFIG.hooks["Lava Surger"] == 1 then
ProTimers_AddTimer("Lava Surger", 28*60, 0);
elseif string.find(arg1, "Magmadar") ~= nil then
ProTimers_CONFIG.hooks["Ancient Core Hound"] = 0;
DEFAULT_CHAT_FRAME:AddMessage("|cff00ff00ProTimers: |cffffffffHooks - Ancient Core Hound set to 0");
elseif string.find(arg1, "Garr") ~= nil then
ProTimers_CONFIG.hooks["Lava Surger"] = 0;
DEFAULT_CHAT_FRAME:AddMessage("|cff00ff00ProTimers: |cffffffffHooks - Lava Surger set to 0");
end
elseif (event == "CHAT_MSG_MONSTER_EMOTE") then
--DEFAULT_CHAT_FRAME:AddMessage(arg1 .. arg2);
if string.find(arg1, "collapse") ~= nil and string.find(arg1, "smolder") ~= nil and ProTimers_CONFIG.hooks["Core Hound Pack"] == 1 then
if ProTimers_CORE_HOUNDS_COLLAPSED == 0 then
ProTimers_CORE_HOUNDS_COLLAPSED = 1;
ProTimers_CORE_HOUNDS_COLLAPSED_TIME = 0;
elseif ProTimers_CORE_HOUNDS_COLLAPSED == 4 and ProTimers_CORE_HOUNDS_COLLAPSED_TIME <= 10 then
ProTimers_CORE_HOUNDS_COLLAPSED = 0;
ProTimers_AddTimer("Core Hound Pack", 60*60, 0);
else
ProTimers_CORE_HOUNDS_COLLAPSED = ProTimers_CORE_HOUNDS_COLLAPSED + 1;
end
--DEFAULT_CHAT_FRAME:AddMessage(ProTimers_CORE_HOUNDS_COLLAPSED .. " down in " .. ProTimers_CORE_HOUNDS_COLLAPSED_TIME);
end
end
end
function ProTimers_OnUpdate(elapsed)
ProTimers_elapsed = ProTimers_elapsed + elapsed;
ProTimers_CORE_HOUNDS_COLLAPSED_TIME = ProTimers_CORE_HOUNDS_COLLAPSED_TIME + elapsed;
if ProTimers_CORE_HOUNDS_COLLAPSED_TIME > 12 then
ProTimers_CORE_HOUNDS_COLLAPSED = 0;
end
--DEFAULT_CHAT_FRAME:AddMessage(ProTimers_elapsed);
if ProTimers_elapsed > 1 then
for i = 1, 10, 1 do
if (ProTimers_bank[i] ~= -1) then
ProTimers_times[i] = ProTimers_times[i] - 1;
end
if (ProTimers_times[i] ~= nil) then
if (ProTimers_times[i] < -15) then
ProTimers_bank[i] = -1;
end
end
end
for j=1, 10, 1 do
local found = 0;
local done = 0;
for i=1, 10, 1 do
if (ProTimers_bank[i] == -1 and found == 0) then
found = i;
end
if (ProTimers_bank[i] ~= -1 and found ~= 0 and done == 0) then
ProTimers_bank[i] = -1;
ProTimers_bank[found] = 1;
ProTimers_names[found] = ProTimers_names[i];
ProTimers_times[found] = ProTimers_times[i];
ProTimers_repeat[found] = ProTimers_repeat[i];
done = 1;
end
end
end
local found;
for i=1, 10, 1 do
if (ProTimers_bank[i] == -1) then
found = i;
break;
end
end
for i = 1, 10, 1 do
local row = getglobal("ProTimersItem"..i);
local where = getglobal("ProTimersItem"..i.."Name");
local rate = getglobal("ProTimersItem"..i.."Rate");
if (i > found-1) then
row:Hide();
else
row:Show();
where:Show();
rate:Show();
where:SetText(ProTimers_names[i]);
if (ProTimers_times[i] > 3600) then
rate:SetText(math.floor(ProTimers_times[i]/3600) .. ":" .. date("%M:%S", ProTimers_times[i]));
else
rate:SetText(date("%M:%S", ProTimers_times[i]));
end
if (ProTimers_times[i] ~= nil) then
if (ProTimers_times[i] < 15) then
local tester = math.ceil(ProTimers_times[i]);
if ((tester == -1) or (tester == -3) or (tester == -5) or (tester == -7) or (tester == -9) or (tester == -11) or (tester == -13) or (tester == -15) or (tester == 1) or (tester == 3) or (tester == 5) or (tester == 7) or (tester == 9) or (tester == 11) or (tester == 13) or (tester == 15)) then
where:SetTextColor(1,0,0);
rate:SetTextColor(1,0,0);
else
where:SetTextColor(1.0, 0.82, 0.0);
rate:SetTextColor(1.0, 0.82, 0.0);
end
else
where:SetTextColor(1.0, 0.82, 0.0);
rate:SetTextColor(1, 1, 1);
end
if (ProTimers_times[i] < 0) then
rate:SetText(date("%M:%S", 0));
end
if ((math.ceil(ProTimers_times[i]) == 0)) then
ProTimers_times[i] = -1;
ProTimers_onalert(i);
ProTimers_onannounce(i);
if ProTimers_repeat[i] > 0 then
ProTimers_AddTimer(ProTimers_names[i], ProTimers_repeat[i], ProTimers_repeat[i]);
end
end
if ((math.ceil(ProTimers_times[i]) == 120)) then
ProTimers_onprealert(i);
ProTimers_onpreannounce(i);
end
end
end
end
ProTimers_elapsed = ProTimers_elapsed - 1;
end
end