From c79fbb99aa66d1b42748f4300c29e7cba3b17d34 Mon Sep 17 00:00:00 2001 From: mmcgarvey Date: Thu, 23 Dec 2021 15:20:15 -0500 Subject: [PATCH] [Shared Tasks] Cross Zone Remove Fix (#1740) * [Shared Tasks] Cross Zone Remove Fix Why: The cross_zone_remove_task quest methods were not removing from shared_task_members database table and were not clearing shared task cache. This resulted in a situation where a character could not request other shared tasks. What: Shamelessly copied shared task logic from ClientTaskState::CancelTask into ClientTaskState::RemoveTaskByTaskID * What: Instead of copying code from CancelTask into RemoveTaskByTaskID, it is better for code maintenance to simply call CancelTask from RemoveTaskByTaskID. This is cleaner. Note: I chose to be explicit with the remove_from_db parameter, despite true being the default. I tend to do this to protect from the default value changing in the future. * [Shared Tasks] RemoveTaskByTaskID Cleanup Removed unused variables. Distinguished log messages for Shared Tasks from regular Tasks. --- zone/task_client_state.cpp | 44 ++++++-------------------------------- 1 file changed, 6 insertions(+), 38 deletions(-) diff --git a/zone/task_client_state.cpp b/zone/task_client_state.cpp index 8017a0fec..264ad2456 100644 --- a/zone/task_client_state.cpp +++ b/zone/task_client_state.cpp @@ -2196,58 +2196,26 @@ void ClientTaskState::RemoveTask(Client *client, int sequence_number, TaskType t void ClientTaskState::RemoveTaskByTaskID(Client *client, uint32 task_id) { - auto task_type = task_manager->GetTaskType(task_id); - int character_id = client->CharacterID(); - - CharacterActivitiesRepository::DeleteWhere( - database, - fmt::format("charid = {} AND taskid = {}", character_id, task_id) - ); - - CharacterTasksRepository::DeleteWhere( - database, - fmt::format("charid = {} AND taskid = {} AND type = {}", character_id, task_id, (int) task_type) - ); - - switch (task_type) { + switch (task_manager->GetTaskType(task_id)) { case TaskType::Task: { if (m_active_task.task_id == task_id) { - auto outapp = new EQApplicationPacket(OP_CancelTask, sizeof(CancelTask_Struct)); - CancelTask_Struct *cts = (CancelTask_Struct *) outapp->pBuffer; - cts->SequenceNumber = TASKSLOTTASK; - cts->type = static_cast(task_type); LogTasks("[UPDATE] RemoveTaskByTaskID found Task [{}]", task_id); - client->QueuePacket(outapp); - safe_delete(outapp); - m_active_task.task_id = TASKSLOTEMPTY; + CancelTask(client, TASKSLOTTASK, TaskType::Task, true); } break; } case TaskType::Shared: { if (m_active_shared_task.task_id == task_id) { - auto outapp = new EQApplicationPacket(OP_CancelTask, sizeof(CancelTask_Struct)); - CancelTask_Struct *cts = (CancelTask_Struct *) outapp->pBuffer; - cts->SequenceNumber = TASKSLOTSHAREDTASK; - cts->type = static_cast(task_type); - LogTasks("[UPDATE] RemoveTaskByTaskID found Task [{}]", task_id); - client->QueuePacket(outapp); - safe_delete(outapp); - m_active_shared_task.task_id = TASKSLOTEMPTY; + LogTasks("[UPDATE] RemoveTaskByTaskID found Shared Task [{}]", task_id); + CancelTask(client, TASKSLOTSHAREDTASK, TaskType::Shared, true); } break; } case TaskType::Quest: { for (int active_quest = 0; active_quest < MAXACTIVEQUESTS; active_quest++) { - if (m_active_quests[active_quest].task_id == task_id) { - auto outapp = new EQApplicationPacket(OP_CancelTask, sizeof(CancelTask_Struct)); - CancelTask_Struct *cts = (CancelTask_Struct *) outapp->pBuffer; - cts->SequenceNumber = active_quest; - cts->type = static_cast(task_type); + if (m_active_quests[active_quest].task_id == task_id) { LogTasks("[UPDATE] RemoveTaskByTaskID found Quest [{}] at index [{}]", task_id, active_quest); - m_active_quests[active_quest].task_id = TASKSLOTEMPTY; - m_active_task_count--; - client->QueuePacket(outapp); - safe_delete(outapp); + CancelTask(client, active_quest, TaskType::Quest, true); } } }