[Shared Tasks] Implement task timer groups (#2340)

This adds task replay and request timer groups (an arbitrary id) which
allows for different tasks to share lockouts
This commit is contained in:
hg
2022-07-30 21:18:19 -04:00
committed by GitHub
parent f64d072af7
commit 8a962e09f6
10 changed files with 116 additions and 35 deletions
+21 -5
View File
@@ -2327,8 +2327,19 @@ void ClientTaskState::AcceptNewTask(
if (task->type != TaskType::Shared)
{
auto task_timers = CharacterTaskTimersRepository::GetWhere(database, fmt::format(
"character_id = {} AND task_id = {} AND expire_time > NOW() ORDER BY timer_type ASC LIMIT 1",
client->CharacterID(), task_id
SQL(
character_id = {}
AND (task_id = {}
OR (timer_group > 0 AND timer_type = {} AND timer_group = {})
OR (timer_group > 0 AND timer_type = {} AND timer_group = {}))
AND expire_time > NOW() ORDER BY timer_type ASC LIMIT 1
),
client->CharacterID(),
task_id,
static_cast<int>(TaskTimerType::Replay),
task->replay_timer_group,
static_cast<int>(TaskTimerType::Request),
task->request_timer_group
));
if (!task_timers.empty())
@@ -2426,6 +2437,7 @@ void ClientTaskState::AcceptNewTask(
timer.character_id = client->CharacterID();
timer.task_id = task_id;
timer.timer_type = static_cast<int>(TaskTimerType::Request);
timer.timer_group = task->request_timer_group;
timer.expire_time = expire_time;
CharacterTaskTimersRepository::InsertOne(database, timer);
@@ -2639,13 +2651,17 @@ void ClientTaskState::AddReplayTimer(Client* client, ClientTaskInformation& clie
auto timer = CharacterTaskTimersRepository::NewEntity();
timer.character_id = client->CharacterID();
timer.task_id = client_task.task_id;
timer.expire_time = expire_time;
timer.timer_type = static_cast<int>(TaskTimerType::Replay);
timer.timer_group = task.replay_timer_group;
timer.expire_time = expire_time;
// replace any existing replay timer
CharacterTaskTimersRepository::DeleteWhere(database, fmt::format(
"task_id = {} AND timer_type = {} AND character_id = {}",
client_task.task_id, static_cast<int>(TaskTimerType::Replay), client->CharacterID()));
"(task_id = {} OR (timer_group > 0 AND timer_group = {})) AND timer_type = {} AND character_id = {}",
client_task.task_id,
task.replay_timer_group,
static_cast<int>(TaskTimerType::Replay),
client->CharacterID()));
CharacterTaskTimersRepository::InsertOne(database, timer);
+5 -1
View File
@@ -115,7 +115,9 @@ bool TaskManager::LoadTasks(int single_task)
m_task_data[task_id]->max_players = task.max_players;
m_task_data[task_id]->repeatable = task.repeatable;
m_task_data[task_id]->completion_emote = task.completion_emote;
m_task_data[task_id]->replay_timer_group = task.replay_timer_group;
m_task_data[task_id]->replay_timer_seconds = task.replay_timer_seconds;
m_task_data[task_id]->request_timer_group = task.request_timer_group;
m_task_data[task_id]->request_timer_seconds = task.request_timer_seconds;
m_task_data[task_id]->activity_count = 0;
m_task_data[task_id]->sequence_mode = ActivitiesSequential;
@@ -125,7 +127,7 @@ bool TaskManager::LoadTasks(int single_task)
"[LoadTasks] (Task) task_id [{}] type [{}] () duration [{}] duration_code [{}] title [{}] description [{}] "
" reward [{}] rewardid [{}] cashreward [{}] xpreward [{}] rewardmethod [{}] faction_reward [{}] minlevel [{}] "
" maxlevel [{}] level_spread [{}] min_players [{}] max_players [{}] repeatable [{}] completion_emote [{}]",
" replay_timer_seconds [{}] request_timer_seconds [{}]",
" replay_group [{}] replay_timer_seconds [{}] request_group [{}] request_timer_seconds [{}]",
task.id,
task.type,
task.duration,
@@ -145,7 +147,9 @@ bool TaskManager::LoadTasks(int single_task)
task.max_players,
task.repeatable,
task.completion_emote,
task.replay_timer_group,
task.replay_timer_seconds,
task.request_timer_group,
task.request_timer_seconds
);
}