/* * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2 of the License, or (at your * option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ #include "GameTime.h" #include "Timer.h" #include "Timezone.h" #include "Types.h" #include "Util.h" #include "WowTime.h" namespace GameTime { namespace { time_t GameTime; uint32 GameMSTime; SystemTimePoint GameTimeSystemPoint; TimePoint GameTimeSteadyPoint; tm DateTime; WowTime UtcWow; WowTime Wow; time_t const StartTime = [] { UpdateGameTimers(); return time(nullptr); }(); } time_t GetStartTime() { return StartTime; } time_t GetGameTime() { return GameTime; } uint32 GetGameTimeMS() { return GameMSTime; } SystemTimePoint GetSystemTime() { return GameTimeSystemPoint; } TimePoint Now() { return GameTimeSteadyPoint; } template typename Clock::time_point GetTime() { static_assert(Trinity::dependant_false_v, "Missing specialization for GetGameTimePoint"); return { }; } template<> SystemTimePoint GetTime() { return GetSystemTime(); } template<> TimePoint GetTime() { return Now(); } uint32 GetUptime() { return uint32(GameTime - StartTime); } tm const* GetDateAndTime() { return &DateTime; } WowTime const* GetUtcWowTime() { return &UtcWow; } WowTime const* GetWowTime() { return &Wow; } void UpdateGameTimers() { GameTime = time(nullptr); GameMSTime = getMSTime(); GameTimeSystemPoint = std::chrono::system_clock::now(); GameTimeSteadyPoint = std::chrono::steady_clock::now(); localtime_r(&GameTime, &DateTime); UtcWow.SetUtcTimeFromUnixTime(GameTime); Wow = UtcWow + Trinity::Timezone::GetSystemZoneOffsetAt(GameTimeSystemPoint); } }