From 43ec9dc815282bf441e23a143ddfb88eca524ad0 Mon Sep 17 00:00:00 2001 From: hg <4683435+hgtw@users.noreply.github.com> Date: Sat, 29 Oct 2022 20:46:00 -0400 Subject: [PATCH] [Tasks] Let task completion event block task rewards (#2511) Returning non-zero from EVENT_TASK_COMPLETE will prevent task rewards and completion emote. This is necessary for a DoN mission which scripts a mission failure but still gives the lockout. --- zone/task_client_state.cpp | 12 ++++++++---- zone/task_client_state.h | 2 +- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/zone/task_client_state.cpp b/zone/task_client_state.cpp index 339fc7e8b..9f9c06bf5 100644 --- a/zone/task_client_state.cpp +++ b/zone/task_client_state.cpp @@ -908,7 +908,7 @@ int ClientTaskState::IncrementDoneCount( AddReplayTimer(client, *info, *task_data); } - DispatchEventTaskComplete(client, *info, activity_id); + int event_res = DispatchEventTaskComplete(client, *info, activity_id); /* QS: PlayerLogTaskUpdates :: Complete */ if (RuleB(QueryServ, PlayerLogTaskUpdates)) { @@ -925,7 +925,11 @@ int ClientTaskState::IncrementDoneCount( client->SendTaskActivityComplete(info->task_id, 0, task_index, task_data->type, 0); // If Experience and/or cash rewards are set, reward them from the task even if reward_method is METHODQUEST - RewardTask(client, task_data, *info); + // do not reward client if EVENT_TASK_COMPLETE returns non-zero + if (event_res == 0) + { + RewardTask(client, task_data, *info); + } //RemoveTask(c, TaskIndex); // shared tasks linger at the completion step and do not get removed from the task window unlike quests/task @@ -951,7 +955,7 @@ int ClientTaskState::IncrementDoneCount( return count; } -void ClientTaskState::DispatchEventTaskComplete(Client* client, ClientTaskInformation& info, int activity_id) +int ClientTaskState::DispatchEventTaskComplete(Client* client, ClientTaskInformation& info, int activity_id) { std::string export_string = fmt::format( "{} {} {}", @@ -959,7 +963,7 @@ void ClientTaskState::DispatchEventTaskComplete(Client* client, ClientTaskInform info.activity[activity_id].activity_id, info.task_id ); - parse->EventPlayer(EVENT_TASK_COMPLETE, client, export_string, 0); + return parse->EventPlayer(EVENT_TASK_COMPLETE, client, export_string, 0); } void ClientTaskState::RewardTask(Client *c, const TaskInformation *ti, ClientTaskInformation& client_task) diff --git a/zone/task_client_state.h b/zone/task_client_state.h index 7937abe55..561b8f9cf 100644 --- a/zone/task_client_state.h +++ b/zone/task_client_state.h @@ -106,7 +106,7 @@ private: void AddReplayTimer(Client *client, ClientTaskInformation& client_task, const TaskInformation& task); bool CanUpdate(Client* client, const TaskUpdateFilter& filter, int task_id, const ActivityInformation& activity, const ClientActivityInformation& client_activity) const; - void DispatchEventTaskComplete(Client* client, ClientTaskInformation& client_task, int activity_id); + int DispatchEventTaskComplete(Client* client, ClientTaskInformation& client_task, int activity_id); std::pair FindTask(Client* client, const TaskUpdateFilter& filter) const; void RecordCompletedTask(uint32_t character_id, const TaskInformation& task, const ClientTaskInformation& client_task); void UpdateTasksOnKill(Client* client, Client* exp_client, NPC* npc);