GAMETIME_AM = true;
GAMETIME_PM = false;
local GAMETIME_DAWN = ( 5 * 60) + 30; -- 5:30 AM
local GAMETIME_DUSK = (21 * 60) + 0; -- 9:00 PM
local date = date;
local format = format;
local GetCVarBool = GetCVarBool;
local CalendarGetDate = CalendarGetDate;
local max = max;
local tonumber = tonumber;
local PI = PI;
local TWOPI = PI * 2.0;
local cos = math.cos;
local INVITE_PULSE_SEC = 1.0 / (2.0*1.0); -- mul by 2 so the pulse constant counts for half a flash
-- general GameTime functions
function GameTime_GetFormattedTime(hour, minute, wantAMPM)
if ( GetCVarBool("timeMgrUseMilitaryTime") ) then
return format(TIMEMANAGER_TICKER_24HOUR, hour, minute);
else
if ( wantAMPM ) then
local timeFormat = TIME_TWELVEHOURAM;
if ( hour == 0 ) then
hour = 12;
elseif ( hour == 12 ) then
timeFormat = TIME_TWELVEHOURPM;
elseif ( hour > 12 ) then
timeFormat = TIME_TWELVEHOURPM;
hour = hour - 12;
end
return format(timeFormat, hour, minute);
else
if ( hour == 0 ) then
hour = 12;
elseif ( hour > 12 ) then
hour = hour - 12;
end
return format(TIMEMANAGER_TICKER_12HOUR, hour, minute);
end
end
end
function GameTime_ComputeMinutes(hour, minute, militaryTime, am)
local minutes;
if ( militaryTime ) then
minutes = minute + hour*60;
else
local h = hour;
if ( am ) then
if ( h == 12 ) then
h = 0;
end
else
if ( h ~= 12 ) then
h = h + 12;
end
end
minutes = minute + h*60;
end
return minutes;
end
-- GameTime_ComputeStandardTime assumes the given time is military (24 hour)
function GameTime_ComputeStandardTime(hour)
if ( hour > 12 ) then
return hour - 12, GAMETIME_PM;
elseif ( hour == 0 ) then
return 12, GAMETIME_AM;
else
return hour, GAMETIME_AM;
end
end
-- GameTime_ComputeMilitaryTime assumes the given time is standard (12 hour)
function GameTime_ComputeMilitaryTime(hour, am)
if ( am and hour == 12 ) then
return 0;
elseif ( not am and hour < 12 ) then
return hour + 12;
else
return hour;
end
end
function GameTime_GetLocalTime(wantAMPM)
local hour, minute = tonumber(date("%H")), tonumber(date("%M"));
return GameTime_GetFormattedTime(hour, minute, wantAMPM), hour, minute;
end
function GameTime_GetGameTime(wantAMPM)
local hour, minute = GetGameTime();
return GameTime_GetFormattedTime(hour, minute, wantAMPM), hour, minute;
end
function GameTime_GetTime(showAMPM)
if ( GetCVarBool("timeMgrUseLocalTime") ) then
return GameTime_GetLocalTime(showAMPM);
else
return GameTime_GetGameTime(showAMPM);
end
end
function GameTime_UpdateTooltip()
-- title
GameTooltip:AddLine(TIMEMANAGER_TOOLTIP_TITLE, HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b);
-- realm time
GameTooltip:AddDoubleLine(
TIMEMANAGER_TOOLTIP_REALMTIME,
GameTime_GetGameTime(true),
NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b,
HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b);
-- local time
GameTooltip:AddDoubleLine(
TIMEMANAGER_TOOLTIP_LOCALTIME,
GameTime_GetLocalTime(true),
NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b,
HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b);
end
-- GameTimeFrame functions
function GameTimeFrame_OnLoad(self)
self:RegisterEvent("PLAYER_ENTERING_WORLD");
self:RegisterEvent("CALENDAR_UPDATE_PENDING_INVITES");
self:RegisterEvent("CALENDAR_EVENT_ALARM");
self:RegisterForClicks("AnyUp");
-- adjust button texture layers to not interfere with overlaid textures
local tex;
tex = self:GetNormalTexture();
tex:SetDrawLayer("BACKGROUND");
tex = self:GetPushedTexture();
tex:SetDrawLayer("BACKGROUND");
self:GetFontString():SetDrawLayer("BACKGROUND");
self.timeOfDay = 0;
self:SetFrameLevel(self:GetFrameLevel() + 2);
self.pendingCalendarInvites = 0;
self.hour = 0;
self.flashTimer = 0.0;
GameTimeFrame_OnUpdate(self);
end
function GameTimeFrame_OnEnter(self)
GameTooltip:SetOwner(self, "ANCHOR_BOTTOMLEFT");
end
function GameTimeFrame_OnEvent(self, event, ...)
if ( event == "CALENDAR_UPDATE_PENDING_INVITES" or event == "PLAYER_ENTERING_WORLD" ) then
local pendingCalendarInvites = CalendarGetNumPendingInvites();
if ( pendingCalendarInvites > self.pendingCalendarInvites ) then
if ( not CalendarFrame or (CalendarFrame and not CalendarFrame:IsShown()) ) then
GameTimeCalendarInvitesTexture:Show();
GameTimeCalendarInvitesGlow:Show();
GameTimeFrame.flashInvite = true;
self.pendingCalendarInvites = pendingCalendarInvites;
end
elseif ( pendingCalendarInvites == 0 ) then
GameTimeCalendarInvitesTexture:Hide();
GameTimeCalendarInvitesGlow:Hide();
GameTimeFrame.flashInvite = false;
self.pendingCalendarInvites = 0;
end
GameTimeFrame_SetDate();
elseif ( event == "CALENDAR_EVENT_ALARM" ) then
local title, hour, minute = ...;
local info = ChatTypeInfo["SYSTEM"];
DEFAULT_CHAT_FRAME:AddMessage(format(CALENDAR_EVENT_ALARM_MESSAGE, title), info.r, info.g, info.b, info.id);
--UIFrameFlash(GameTimeCalendarEventAlarmTexture, 1.0, 1.0, 6);
end
end
function GameTimeFrame_OnUpdate(self, elapsed)
local hour, minute = GetGameTime();
local time = (hour * 60) + minute;
if ( time ~= self.timeOfDay ) then
self.timeOfDay = time;
local minx = 0;
local maxx = 50/128;
local miny = 0;
local maxy = 50/64;
if(time < GAMETIME_DAWN or time >= GAMETIME_DUSK) then
minx = minx + 0.5;
maxx = maxx + 0.5;
end
if ( hour ~= self.hour ) then
self.hour = hour;
GameTimeFrame_SetDate();
end
GameTimeTexture:SetTexCoord(minx, maxx, miny, maxy);
end
if ( GameTooltip:IsOwned(self) ) then
GameTooltip:ClearLines();
if ( GameTimeCalendarInvitesTexture:IsShown() ) then
GameTooltip:AddLine(GAMETIME_TOOLTIP_CALENDAR_INVITES);
if ( CalendarFrame and not CalendarFrame:IsShown() ) then
GameTooltip:AddLine(" ");
GameTooltip:AddLine(GAMETIME_TOOLTIP_TOGGLE_CALENDAR);
end
else
if ( not TimeManagerClockButton or not TimeManagerClockButton:IsVisible() or TimeManager_IsAlarmFiring() ) then
GameTooltip:AddLine(GameTime_GetGameTime(true), HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b);
GameTooltip:AddLine(" ");
end
GameTooltip:AddLine(GAMETIME_TOOLTIP_TOGGLE_CALENDAR);
end
GameTooltip:Show();
end
-- Flashing stuff
if ( elapsed and GameTimeFrame.flashInvite ) then
local flashIndex = TWOPI * self.flashTimer * INVITE_PULSE_SEC;
local flashValue = max(0.0, 0.5 + 0.5*cos(flashIndex));
if ( flashIndex >= TWOPI ) then
self.flashTimer = 0.0;
else
self.flashTimer = self.flashTimer + elapsed;
end
GameTimeCalendarInvitesTexture:SetAlpha(flashValue);
GameTimeCalendarInvitesGlow:SetAlpha(flashValue);
end
end
function GameTimeFrame_OnClick(self)
if ( GameTimeCalendarInvitesTexture:IsShown() ) then
Calendar_LoadUI();
if ( Calendar_Show ) then
Calendar_Show();
end
GameTimeCalendarInvitesTexture:Hide();
GameTimeCalendarInvitesGlow:Hide();
self.pendingCalendarInvites = 0;
GameTimeFrame.flashInvite = false;
else
ToggleCalendar();
end
end
function GameTimeFrame_SetDate()
local _, _, day = CalendarGetDate();
GameTimeFrame:SetText(day);
end