From 1488c3685c565b5e143c30ce2be89ae828920f4a Mon Sep 17 00:00:00 2001 From: hg <4683435+hgtw@users.noreply.github.com> Date: Thu, 14 Jul 2022 03:19:27 -0400 Subject: [PATCH] [Tasks] Apply full duration mission replay timers (#2299) Shared task replay timers used to be based on the task start time (reducing the final lockout timer by elapsed task time). Live changed this in the 2022 April 20 patch: "Replay timers will now apply their full duration upon completion of their associated task/quest." Solo tasks and quests already did this This also fixes a small bug where request timers were being deleted when replacing replay timers for shared tasks --- world/shared_task_manager.cpp | 73 +++++++++++++++++------------------ 1 file changed, 35 insertions(+), 38 deletions(-) diff --git a/world/shared_task_manager.cpp b/world/shared_task_manager.cpp index 3ba26820d..5139b3d62 100644 --- a/world/shared_task_manager.cpp +++ b/world/shared_task_manager.cpp @@ -1685,49 +1685,46 @@ void SharedTaskManager::RecordSharedTaskCompletion(SharedTask *s) void SharedTaskManager::AddReplayTimers(SharedTask *s) { if (s->GetTaskData().replay_timer_seconds > 0) { - auto expire_time = s->GetDbSharedTask().accepted_time + s->GetTaskData().replay_timer_seconds; - auto seconds = expire_time - std::time(nullptr); - if (seconds > 0) // not already expired - { - std::vector task_timers; + auto seconds = s->GetTaskData().replay_timer_seconds; + auto expire_time = std::time(nullptr) + seconds; - // on live past members of the shared task also receive lockouts (use member history) - for (const auto &member_id : s->member_id_history) { - auto timer = CharacterTaskTimersRepository::NewEntity(); - timer.character_id = member_id; - timer.task_id = s->GetTaskData().id; - timer.timer_type = static_cast(TaskTimerType::Replay); - timer.expire_time = expire_time; + std::vector task_timers; - task_timers.emplace_back(timer); + // on live past members of the shared task also receive lockouts (use member history) + for (const auto &member_id : s->member_id_history) { + auto timer = CharacterTaskTimersRepository::NewEntity(); + timer.character_id = member_id; + timer.task_id = s->GetTaskData().id; + timer.timer_type = static_cast(TaskTimerType::Replay); + timer.expire_time = expire_time; - client_list.SendCharacterMessage( - member_id, - Chat::Yellow, - fmt::format( - SharedTaskMessage::GetEQStr(SharedTaskMessage::RECEIVED_REPLAY_TIMER), - s->GetTaskData().title, - fmt::format_int(seconds / 86400).c_str(), // days - fmt::format_int((seconds / 3600) % 24).c_str(), // hours - fmt::format_int((seconds / 60) % 60).c_str() // minutes - ) - ); - } + task_timers.emplace_back(timer); - if (!task_timers.empty()) { - // replay timers replace any existing timer (even if it expires sooner) - // this can occur if a player has a timer for being a past member of - // a shared task but joined another before the first was completed - CharacterTaskTimersRepository::DeleteWhere( - *m_database, - fmt::format( - "task_id = {} AND character_id IN ({})", - s->GetTaskData().id, fmt::join(s->member_id_history, ",") - ) - ); + client_list.SendCharacterMessage( + member_id, + Chat::Yellow, + fmt::format( + SharedTaskMessage::GetEQStr(SharedTaskMessage::RECEIVED_REPLAY_TIMER), + s->GetTaskData().title, + fmt::format_int(seconds / 86400).c_str(), // days + fmt::format_int((seconds / 3600) % 24).c_str(), // hours + fmt::format_int((seconds / 60) % 60).c_str() // minutes + ) + ); + } - CharacterTaskTimersRepository::InsertMany(*m_database, task_timers); - } + if (!task_timers.empty()) { + // replay timers replace any existing timer (even if it expires sooner) + // this can occur if a player has a timer for being a past member of + // a shared task but joined another before the first was completed + CharacterTaskTimersRepository::DeleteWhere(*m_database, fmt::format( + "task_id = {} AND timer_type = {} AND character_id IN ({})", + s->GetTaskData().id, + static_cast(TaskTimerType::Replay), + fmt::join(s->member_id_history, ",") + )); + + CharacterTaskTimersRepository::InsertMany(*m_database, task_timers); } } }