From a0ef23618fe37797e17e14f9c1920ec09becf0c4 Mon Sep 17 00:00:00 2001 From: Kinglykrab Date: Fri, 20 Jun 2025 14:06:30 -0400 Subject: [PATCH] Push --- zone/client.cpp | 15 +++++++++++++++ zone/client.h | 1 + zone/embparser_api.cpp | 4 ++-- zone/gm_commands/task.cpp | 11 +---------- zone/lua_client.cpp | 13 +++++++++++++ zone/lua_client.h | 2 ++ zone/lua_general.cpp | 4 ++-- zone/perl_client.cpp | 12 ++++++++++++ zone/questmgr.cpp | 16 ++++++---------- zone/questmgr.h | 2 +- zone/task_client_state.cpp | 10 ++++++++++ zone/task_client_state.h | 1 + 12 files changed, 66 insertions(+), 25 deletions(-) diff --git a/zone/client.cpp b/zone/client.cpp index 48441a4d3..fbedbaab0 100644 --- a/zone/client.cpp +++ b/zone/client.cpp @@ -68,6 +68,7 @@ extern volatile bool RunLoops; #include "../common/repositories/character_disciplines_repository.h" #include "../common/repositories/character_data_repository.h" #include "../common/repositories/character_pet_name_repository.h" +#include "../common/repositories/completed_tasks_repository.h" #include "../common/repositories/discovered_items_repository.h" #include "../common/repositories/inventory_repository.h" #include "../common/repositories/keyring_repository.h" @@ -13253,3 +13254,17 @@ void Client::CheckItemDiscoverability(uint32 item_id) DiscoverItem(item_id); } + +bool Client::UncompleteTask(int task_id) +{ + CompletedTasksRepository::DeleteWhere( + database, + fmt::format( + "charid = {} AND taskid = {}", + CharacterID(), + task_id + ) + ); + + return task_state->UncompleteTask(task_id); +} diff --git a/zone/client.h b/zone/client.h index 9f96ba235..ffae88eb5 100644 --- a/zone/client.h +++ b/zone/client.h @@ -1501,6 +1501,7 @@ public: { return task_state ? task_state->CompleteTask(this, task_id) : false; } + bool UncompleteTask(int task_id); inline void FailTask(int task_id) { if (task_state) { task_state->FailTask(this, task_id); }} inline int TaskTimeLeft(int task_id) { return (task_state ? task_state->TaskTimeLeft(task_id) : 0); } inline int EnabledTaskCount(int task_set_id) diff --git a/zone/embparser_api.cpp b/zone/embparser_api.cpp index 9885d9d77..ac81ad4cd 100644 --- a/zone/embparser_api.cpp +++ b/zone/embparser_api.cpp @@ -1271,9 +1271,9 @@ void Perl__failtask(int task_id) quest_manager.failtask(task_id); } -void Perl__uncompletetask(int task_id) +bool Perl__uncompletetask(int task_id) { - quest_manager.uncompletetask(task_id); + return quest_manager.uncompletetask(task_id); } int Perl__tasktimeleft(int task_id) diff --git a/zone/gm_commands/task.cpp b/zone/gm_commands/task.cpp index bd28c2518..7beaac84e 100755 --- a/zone/gm_commands/task.cpp +++ b/zone/gm_commands/task.cpp @@ -304,16 +304,7 @@ void command_task(Client *c, const Seperator *sep) return; } - if ( - CompletedTasksRepository::DeleteWhere( - database, - fmt::format( - "charid = {} AND taskid = {}", - t->CharacterID(), - task_id - ) - ) - ) { + if (t->UncompleteTask(task_id)) { c->Message( Chat::White, fmt::format( diff --git a/zone/lua_client.cpp b/zone/lua_client.cpp index 1def6b30a..d6b141298 100644 --- a/zone/lua_client.cpp +++ b/zone/lua_client.cpp @@ -3584,6 +3584,18 @@ bool Lua_Client::KeyRingRemove(uint32 item_id) return self->KeyRingRemove(item_id); } +bool Lua_Client::CompleteTask(int task_id) +{ + Lua_Safe_Call_Bool(); + return self->CompleteTask(task_id); +} + +bool Lua_Client::UncompleteTask(int task_id) +{ + Lua_Safe_Call_Bool(); + return self->UncompleteTask(task_id); +} + luabind::scope lua_register_client() { return luabind::class_("Client") .def(luabind::constructor<>()) @@ -4156,6 +4168,7 @@ luabind::scope lua_register_client() { .def("TrainDisc", (void(Lua_Client::*)(int))&Lua_Client::TrainDisc) .def("TrainDiscBySpellID", (void(Lua_Client::*)(int32))&Lua_Client::TrainDiscBySpellID) .def("UnFreeze", (void(Lua_Client::*)(void))&Lua_Client::UnFreeze) + .def("UncompleteTask", (bool(Lua_Client::*)(int))&Lua_Client::UncompleteTask) .def("Undye", (void(Lua_Client::*)(void))&Lua_Client::Undye) .def("UnmemSpell", (void(Lua_Client::*)(int))&Lua_Client::UnmemSpell) .def("UnmemSpell", (void(Lua_Client::*)(int,bool))&Lua_Client::UnmemSpell) diff --git a/zone/lua_client.h b/zone/lua_client.h index 0e197f013..c9207d4d6 100644 --- a/zone/lua_client.h +++ b/zone/lua_client.h @@ -521,6 +521,8 @@ public: bool KeyRingClear(); void KeyRingList(); bool KeyRingRemove(uint32 item_id); + bool CompleteTask(int task_id); + bool UncompleteTask(int task_id); // account data buckets void SetAccountBucket(std::string bucket_name, std::string bucket_value); diff --git a/zone/lua_general.cpp b/zone/lua_general.cpp index 91aa77722..1b8023713 100644 --- a/zone/lua_general.cpp +++ b/zone/lua_general.cpp @@ -722,8 +722,8 @@ void lua_fail_task(int task_id) { quest_manager.failtask(task_id); } -void lua_uncomplete_task(int task_id) { - quest_manager.uncompletetask(task_id); +bool lua_uncomplete_task(int task_id) { + return quest_manager.uncompletetask(task_id); } int lua_task_time_left(int task_id) { diff --git a/zone/perl_client.cpp b/zone/perl_client.cpp index 6ef4eaa45..0c55253c7 100644 --- a/zone/perl_client.cpp +++ b/zone/perl_client.cpp @@ -3336,6 +3336,16 @@ bool Perl_Client_KeyRingRemove(Client* self, uint32 item_id) return self->KeyRingRemove(item_id); } +bool Perl_Client_CompleteTask(Client* self, int task_id) +{ + return self->CompleteTask(task_id); +} + +bool Perl_Client_UncompleteTask(Client* self, int task_id) +{ + return self->UncompleteTask(task_id); +} + void perl_register_client() { perl::interpreter perl(PERL_GET_THX); @@ -3418,6 +3428,7 @@ void perl_register_client() package.add("ClearPEQZoneFlag", &Perl_Client_ClearPEQZoneFlag); package.add("ClearXTargets", &Perl_Client_ClearXTargets); package.add("ClearZoneFlag", &Perl_Client_ClearZoneFlag); + package.add("CompleteTask", &Perl_Client_CompleteTask); package.add("Connected", &Perl_Client_Connected); package.add("CountAugmentEquippedByID", &Perl_Client_CountAugmentEquippedByID); package.add("CountItem", &Perl_Client_CountItem); @@ -3909,6 +3920,7 @@ void perl_register_client() package.add("Thirsty", &Perl_Client_Thirsty); package.add("TrainDiscBySpellID", &Perl_Client_TrainDiscBySpellID); package.add("UnFreeze", &Perl_Client_UnFreeze); + package.add("UncompleteTask", &Perl_Client_UncompleteTask); package.add("Undye", &Perl_Client_Undye); package.add("UnmemSpell", (void(*)(Client*, int))&Perl_Client_UnmemSpell); package.add("UnmemSpell", (void(*)(Client*, int, bool))&Perl_Client_UnmemSpell); diff --git a/zone/questmgr.cpp b/zone/questmgr.cpp index db74610e8..bb829f91e 100644 --- a/zone/questmgr.cpp +++ b/zone/questmgr.cpp @@ -2959,19 +2959,15 @@ void QuestManager::failtask(int taskid) { initiator->FailTask(taskid); } -void QuestManager::uncompletetask(int task_id) { +bool QuestManager::uncompletetask(int task_id) { QuestManagerCurrentQuestVars(); - if (RuleB(TaskSystem, EnableTaskSystem) && initiator) { - CompletedTasksRepository::DeleteWhere( - database, - fmt::format( - "charid = {} AND taskid = {}", - initiator->CharacterID(), - task_id - ) - ); + if (!RuleB(TaskSystem, EnableTaskSystem) || !initiator) { + return false; + } + + return initiator->UncompleteTask(task_id); } int QuestManager::tasktimeleft(int taskid) { diff --git a/zone/questmgr.h b/zone/questmgr.h index e94d4bf34..ad8845541 100644 --- a/zone/questmgr.h +++ b/zone/questmgr.h @@ -224,7 +224,7 @@ public: void resettaskactivity(int task, int activity); void assigntask(int taskid, bool enforce_level_requirement = false); void failtask(int taskid); - void uncompletetask(int task_id); + bool uncompletetask(int task_id); int tasktimeleft(int taskid); bool istaskcompleted(int task_id); bool aretaskscompleted(const std::vector& task_ids); diff --git a/zone/task_client_state.cpp b/zone/task_client_state.cpp index 1bd633ddf..a0e453e77 100644 --- a/zone/task_client_state.cpp +++ b/zone/task_client_state.cpp @@ -1406,6 +1406,16 @@ bool ClientTaskState::CompleteTask(Client *c, uint32 task_id) return true; } +bool ClientTaskState::UncompleteTask(int task_id) +{ + return std::erase_if( + m_completed_tasks, + [&](const CompletedTaskInformation& task) { + return task.task_id == task_id; + } + ); +} + void ClientTaskState::ShowClientTaskInfoMessage(ClientTaskInformation *task, Client *c) { const auto task_data = task_manager->GetTaskData(task->task_id); diff --git a/zone/task_client_state.h b/zone/task_client_state.h index c43329734..30c5dd69c 100644 --- a/zone/task_client_state.h +++ b/zone/task_client_state.h @@ -86,6 +86,7 @@ public: bool HasExploreTask(Client* client) const; void EndSharedTask(Client* client, bool send_fail); bool CompleteTask(Client *c, uint32 task_id); + bool UncompleteTask(int task_id); inline bool HasFreeTaskSlot() { return m_active_task.task_id == TASKSLOTEMPTY; }