Store expedition duration and times as chrono

This simplifies comparisons and reduces conversions
This commit is contained in:
hg 2020-06-14 08:31:14 -04:00
parent 006f7bf9e9
commit ea0b37b7fc
6 changed files with 34 additions and 33 deletions

View File

@ -39,10 +39,10 @@ Expedition::Expedition(
m_expedition_id(expedition_id), m_expedition_id(expedition_id),
m_dz_instance_id(instance_id), m_dz_instance_id(instance_id),
m_dz_zone_id(dz_zone_id), m_dz_zone_id(dz_zone_id),
m_start_time(start_time), m_start_time(std::chrono::system_clock::from_time_t(start_time)),
m_duration(duration) m_duration(duration)
{ {
m_expire_time = std::chrono::system_clock::from_time_t(m_start_time + m_duration); m_expire_time = m_start_time + m_duration;
} }
void Expedition::SendZonesExpeditionDeleted() void Expedition::SendZonesExpeditionDeleted()
@ -60,7 +60,7 @@ void Expedition::SendZonesDurationUpdate()
auto pack = std::unique_ptr<ServerPacket>(new ServerPacket(ServerOP_ExpeditionDzDuration, packsize)); auto pack = std::unique_ptr<ServerPacket>(new ServerPacket(ServerOP_ExpeditionDzDuration, packsize));
auto packbuf = reinterpret_cast<ServerExpeditionUpdateDuration_Struct*>(pack->pBuffer); auto packbuf = reinterpret_cast<ServerExpeditionUpdateDuration_Struct*>(pack->pBuffer);
packbuf->expedition_id = GetID(); packbuf->expedition_id = GetID();
packbuf->new_duration_seconds = m_duration; packbuf->new_duration_seconds = static_cast<uint32_t>(m_duration.count());
zoneserver_list.SendPacket(pack.get()); zoneserver_list.SendPacket(pack.get());
} }
@ -78,12 +78,10 @@ void Expedition::UpdateDzSecondsRemaining(uint32_t seconds_remaining)
); );
// preserve original start time and adjust duration instead // preserve original start time and adjust duration instead
auto new_expire_time = now + update_time; m_expire_time = now + update_time;
auto new_duration = std::chrono::system_clock::to_time_t(new_expire_time) - m_start_time; m_duration = std::chrono::duration_cast<std::chrono::seconds>(m_expire_time - m_start_time);
m_duration = static_cast<uint32_t>(new_duration);
m_expire_time = std::chrono::system_clock::from_time_t(m_start_time + m_duration);
ExpeditionDatabase::UpdateDzDuration(GetInstanceID(), m_duration); ExpeditionDatabase::UpdateDzDuration(GetInstanceID(), static_cast<uint32_t>(m_duration.count()));
// update zone level caches and update the actual dz instance's timer // update zone level caches and update the actual dz instance's timer
SendZonesDurationUpdate(); SendZonesDurationUpdate();

View File

@ -93,10 +93,10 @@ private:
uint32_t m_expedition_id = 0; uint32_t m_expedition_id = 0;
uint32_t m_dz_instance_id = 0; uint32_t m_dz_instance_id = 0;
uint32_t m_dz_zone_id = 0; uint32_t m_dz_zone_id = 0;
uint32_t m_start_time = 0;
uint32_t m_duration = 0;
bool m_pending_delete = false; bool m_pending_delete = false;
std::unordered_set<uint32_t> m_member_ids; std::unordered_set<uint32_t> m_member_ids;
std::chrono::seconds m_duration;
std::chrono::time_point<std::chrono::system_clock> m_start_time;
std::chrono::time_point<std::chrono::system_clock> m_expire_time; std::chrono::time_point<std::chrono::system_clock> m_expire_time;
}; };

View File

@ -119,14 +119,15 @@ uint32_t DynamicZone::CreateInstance()
return 0; return 0;
} }
auto start_time = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()); m_start_time = std::chrono::system_clock::now();
auto start_time = std::chrono::system_clock::to_time_t(m_start_time);
std::string query = fmt::format(SQL( std::string query = fmt::format(SQL(
INSERT INTO instance_list INSERT INTO instance_list
(id, zone, version, start_time, duration) (id, zone, version, start_time, duration)
VALUES VALUES
({}, {}, {}, {}, {}) ({}, {}, {}, {}, {})
), instance_id, m_zone_id, m_version, start_time, m_duration); ), instance_id, m_zone_id, m_version, start_time, m_duration.count());
auto results = database.QueryDatabase(query); auto results = database.QueryDatabase(query);
if (!results.Success()) if (!results.Success())
@ -136,9 +137,8 @@ uint32_t DynamicZone::CreateInstance()
} }
m_instance_id = instance_id; m_instance_id = instance_id;
m_start_time = static_cast<uint32_t>(start_time);
m_never_expires = false; m_never_expires = false;
m_expire_time = std::chrono::system_clock::from_time_t(m_start_time + m_duration); m_expire_time = m_start_time + m_duration;
return m_instance_id; return m_instance_id;
} }
@ -178,11 +178,11 @@ void DynamicZone::LoadDatabaseResult(MySQLRequestRow& row)
m_instance_id = strtoul(row[0], nullptr, 10); m_instance_id = strtoul(row[0], nullptr, 10);
m_zone_id = strtoul(row[1], nullptr, 10); m_zone_id = strtoul(row[1], nullptr, 10);
m_version = strtoul(row[2], nullptr, 10); m_version = strtoul(row[2], nullptr, 10);
m_start_time = strtoul(row[3], nullptr, 10); m_start_time = std::chrono::system_clock::from_time_t(strtoul(row[3], nullptr, 10));
m_duration = strtoul(row[4], nullptr, 10); m_duration = std::chrono::seconds(strtoul(row[4], nullptr, 10));
m_expire_time = m_start_time + m_duration;
m_never_expires = (strtoul(row[5], nullptr, 10) != 0); m_never_expires = (strtoul(row[5], nullptr, 10) != 0);
m_type = static_cast<DynamicZoneType>(strtoul(row[6], nullptr, 10)); m_type = static_cast<DynamicZoneType>(strtoul(row[6], nullptr, 10));
m_expire_time = std::chrono::system_clock::from_time_t(m_start_time + m_duration);
m_compass.zone_id = strtoul(row[7], nullptr, 10); m_compass.zone_id = strtoul(row[7], nullptr, 10);
m_compass.x = strtof(row[8], nullptr); m_compass.x = strtof(row[8], nullptr);
m_compass.y = strtof(row[9], nullptr); m_compass.y = strtof(row[9], nullptr);
@ -530,8 +530,8 @@ uint32_t DynamicZone::GetSecondsRemaining() const
void DynamicZone::SetUpdatedDuration(uint32_t new_duration) void DynamicZone::SetUpdatedDuration(uint32_t new_duration)
{ {
// preserves original start time, just modifies duration and expire time // preserves original start time, just modifies duration and expire time
m_duration = new_duration; m_duration = std::chrono::seconds(new_duration);
m_expire_time = std::chrono::system_clock::from_time_t(m_start_time + m_duration); m_expire_time = m_start_time + m_duration;
if (zone && IsCurrentZoneDzInstance()) if (zone && IsCurrentZoneDzInstance())
{ {

View File

@ -110,14 +110,14 @@ private:
uint32_t m_zone_id = 0; uint32_t m_zone_id = 0;
uint32_t m_instance_id = 0; uint32_t m_instance_id = 0;
uint32_t m_version = 0; uint32_t m_version = 0;
uint32_t m_start_time = 0;
uint32_t m_duration = 0;
bool m_never_expires = false; bool m_never_expires = false;
bool m_has_zonein = false; bool m_has_zonein = false;
DynamicZoneType m_type = DynamicZoneType::None; DynamicZoneType m_type = DynamicZoneType::None;
DynamicZoneLocation m_compass; DynamicZoneLocation m_compass;
DynamicZoneLocation m_safereturn; DynamicZoneLocation m_safereturn;
DynamicZoneLocation m_zonein; DynamicZoneLocation m_zonein;
std::chrono::seconds m_duration;
std::chrono::time_point<std::chrono::system_clock> m_start_time;
std::chrono::time_point<std::chrono::system_clock> m_expire_time; std::chrono::time_point<std::chrono::system_clock> m_expire_time;
}; };

View File

@ -26,11 +26,12 @@
const char* const DZ_REPLAY_TIMER_NAME = "Replay Timer"; // see December 14, 2016 patch notes const char* const DZ_REPLAY_TIMER_NAME = "Replay Timer"; // see December 14, 2016 patch notes
ExpeditionLockoutTimer::ExpeditionLockoutTimer( ExpeditionLockoutTimer::ExpeditionLockoutTimer(
std::string expedition_name, std::string event_name, uint64_t expire_time, uint32_t duration, bool inherited std::string expedition_name, std::string event_name,
uint64_t expire_time, uint32_t duration, bool inherited
) : ) :
m_expedition_name(expedition_name), m_expedition_name(expedition_name),
m_event_name(event_name), m_event_name(event_name),
m_expire_time(expire_time), m_expire_time(std::chrono::system_clock::from_time_t(expire_time)),
m_duration(duration), m_duration(duration),
m_is_inherited(inherited) m_is_inherited(inherited)
{ {
@ -43,11 +44,10 @@ ExpeditionLockoutTimer::ExpeditionLockoutTimer(
uint32_t ExpeditionLockoutTimer::GetSecondsRemaining() const uint32_t ExpeditionLockoutTimer::GetSecondsRemaining() const
{ {
auto now = std::chrono::system_clock::now(); auto now = std::chrono::system_clock::now();
auto expire_time = std::chrono::system_clock::from_time_t(m_expire_time); if (m_expire_time > now)
if (expire_time > now)
{ {
auto time_remaining = std::chrono::duration_cast<std::chrono::seconds>(expire_time - now).count(); auto remaining = m_expire_time - now;
return static_cast<uint32_t>(time_remaining); return static_cast<uint32_t>(std::chrono::duration_cast<std::chrono::seconds>(remaining).count());
} }
return 0; return 0;
} }

View File

@ -21,6 +21,7 @@
#ifndef EXPEDITION_LOCKOUT_TIMER_H #ifndef EXPEDITION_LOCKOUT_TIMER_H
#define EXPEDITION_LOCKOUT_TIMER_H #define EXPEDITION_LOCKOUT_TIMER_H
#include <chrono>
#include <string> #include <string>
extern const char* const DZ_REPLAY_TIMER_NAME; extern const char* const DZ_REPLAY_TIMER_NAME;
@ -29,7 +30,9 @@ class ExpeditionLockoutTimer
{ {
public: public:
ExpeditionLockoutTimer() {} ExpeditionLockoutTimer() {}
ExpeditionLockoutTimer(std::string expedition_name, std::string event_name, uint64_t expire_time, uint32_t duration, bool inherited = false); ExpeditionLockoutTimer(
std::string expedition_name, std::string event_name,
uint64_t expire_time, uint32_t duration, bool inherited = false);
struct DaysHoursMinutes struct DaysHoursMinutes
{ {
@ -38,13 +41,13 @@ public:
std::string mins; std::string mins;
}; };
uint32_t GetDuration() const { return m_duration; } uint32_t GetDuration() const { return static_cast<uint32_t>(m_duration.count()); }
uint64_t GetExpireTime() const { return m_expire_time; } uint64_t GetExpireTime() const { return std::chrono::system_clock::to_time_t(m_expire_time); }
uint32_t GetSecondsRemaining() const; uint32_t GetSecondsRemaining() const;
DaysHoursMinutes GetDaysHoursMinutesRemaining() const; DaysHoursMinutes GetDaysHoursMinutesRemaining() const;
const std::string& GetExpeditionName() const { return m_expedition_name; } const std::string& GetExpeditionName() const { return m_expedition_name; }
const std::string& GetEventName() const { return m_event_name; } const std::string& GetEventName() const { return m_event_name; }
void SetExpireTime(uint64_t expire_time) { m_expire_time = expire_time; } void SetExpireTime(uint64_t expire_time) { m_expire_time = std::chrono::system_clock::from_time_t(expire_time); }
void SetInherited(bool is_inherited) { m_is_inherited = is_inherited; } void SetInherited(bool is_inherited) { m_is_inherited = is_inherited; }
bool IsExpired() const { return GetSecondsRemaining() == 0; } bool IsExpired() const { return GetSecondsRemaining() == 0; }
bool IsInherited() const { return m_is_inherited; } bool IsInherited() const { return m_is_inherited; }
@ -55,10 +58,10 @@ public:
private: private:
std::string m_expedition_name; std::string m_expedition_name;
std::string m_event_name; std::string m_event_name;
uint64_t m_expire_time = 0;
uint32_t m_duration = 0;
bool m_is_inherited = false; // inherited from expedition leader bool m_is_inherited = false; // inherited from expedition leader
bool m_is_replay_timer = false; bool m_is_replay_timer = false;
std::chrono::seconds m_duration;
std::chrono::time_point<std::chrono::system_clock> m_expire_time;
}; };
#endif #endif